diff --git a/data/menu_background.png b/data/menu_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9012fac45a84bcc23cb27b780c7b350bf2a01af
GIT binary patch
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index d5da647..636d39c 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -1724,9 +1724,9 @@ void CClient::Run()
 
 	// init graphics
 	{
-		if(g_Config.m_GfxThreaded)
+		/*if(g_Config.m_GfxThreaded)
 			m_pGraphics = CreateEngineGraphicsThreaded();
-		else
+		else*/
 			m_pGraphics = CreateEngineGraphics();
 
 		bool RegisterFail = false;
diff --git a/src/engine/client/graphics.cpp b/src/engine/client/graphics.cpp
index 2111703..2167d34 100644
--- a/src/engine/client/graphics.cpp
+++ b/src/engine/client/graphics.cpp
@@ -108,7 +108,7 @@ unsigned char CGraphics_OpenGL::Sample(int w, int h, const unsigned char *pData,
 	for(int x = 0; x < ScaleW; x++)
 		for(int y = 0; y < ScaleH; y++)
 			Value += pData[((v+y)*w+(u+x))*Bpp+Offset];
-	return Value/(ScaleW*ScaleH);
+	return clamp(Value/(ScaleW*ScaleH), 0, 255);
 }
 
 unsigned char *CGraphics_OpenGL::Rescale(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData)
@@ -131,7 +131,58 @@ unsigned char *CGraphics_OpenGL::Rescale(int Width, int Height, int NewWidth, in
 			pTmpData[c*Bpp+1] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 1, ScaleW, ScaleH, Bpp);
 			pTmpData[c*Bpp+2] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 2, ScaleW, ScaleH, Bpp);
 			if(Bpp == 4)
-				pTmpData[c*Bpp+3] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 3, ScaleW, ScaleH, Bpp);
+				pTmpData[c*Bpp+3] = 0;
+		}
+
+	return pTmpData;
+}
+
+unsigned char *CGraphics_OpenGL::Enscale(int Width, int Height, int Scale, int Format, const unsigned char *pData)
+{
+	unsigned char *pTmpData;
+	int ScaleWidth = Width/Scale;
+	int ScaleHeight = Height/Scale;
+
+	int Bpp = 3;
+	if(Format == CImageInfo::FORMAT_RGBA)
+		Bpp = 4;
+
+	pTmpData = (unsigned char *)mem_alloc(Width*Height*Bpp, 1);
+	
+	int Count = Scale*Scale;
+	for(int y = 0; y < ScaleHeight; y++)
+		for(int x = 0; x < ScaleWidth; x++)
+		{
+			int v0 = 0;
+			int v1 = 0;
+			int v2 = 0;
+			int v4 = 0;
+			for(int ys = 0; ys < Scale; ys++)
+				for(int xs = 0; xs < Scale; xs++)
+				{
+					int k = (y*Scale+ys)*Width+x*Scale+xs;
+					v0 += pData[k*Bpp];
+					v1 += pData[k*Bpp+1];
+					v2 += pData[k*Bpp+2];
+					if(Bpp == 4)
+						v4 += pData[k*Bpp+3];
+				}
+
+			v0 = ((v0/Count) >> 5)*0x24; 
+			v1 = ((v1/Count) >> 6)*0x48;
+			v2 = ((v2/Count) >> 5)*0x24;
+			v4 /= Count;
+
+			for(int ys = 0; ys < Scale; ys++)
+				for(int xs = 0; xs < Scale; xs++)
+				{
+					int k = (y*Scale+ys)*Width+x*Scale+xs;
+					pTmpData[k*Bpp] = v0;
+					pTmpData[k*Bpp+1] = v1;
+					pTmpData[k*Bpp+2] = v2;
+					if(Bpp == 4)
+						pTmpData[k*Bpp+3] = v4;
+				}
 		}
 
 	return pTmpData;
@@ -255,12 +306,18 @@ void CGraphics_OpenGL::LinesDraw(const CLineItem *pArray, int Num)
 	for(int i = 0; i < Num; ++i)
 	{
 		m_aVertices[m_NumVertices + 2*i].m_Pos.x = pArray[i].m_X0;
-		m_aVertices[m_NumVertices + 2*i].m_Pos.y = pArray[i].m_Y0;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 2*i].m_Pos.y = pArray[i].m_Y1;
+		else
+			m_aVertices[m_NumVertices + 2*i].m_Pos.y = pArray[i].m_Y0;
 		m_aVertices[m_NumVertices + 2*i].m_Tex = m_aTexture[0];
 		m_aVertices[m_NumVertices + 2*i].m_Color = m_aColor[0];
 
 		m_aVertices[m_NumVertices + 2*i + 1].m_Pos.x = pArray[i].m_X1;
-		m_aVertices[m_NumVertices + 2*i + 1].m_Pos.y = pArray[i].m_Y1;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 2*i + 1].m_Pos.y = pArray[i].m_Y0;
+		else
+			m_aVertices[m_NumVertices + 2*i + 1].m_Pos.y = pArray[i].m_Y1;
 		m_aVertices[m_NumVertices + 2*i + 1].m_Tex = m_aTexture[1];
 		m_aVertices[m_NumVertices + 2*i + 1].m_Color = m_aColor[1];
 	}
@@ -333,6 +390,11 @@ int CGraphics_OpenGL::LoadTextureRaw(int Width, int Height, int Format, const vo
 			Width /= 2;
 			Height /= 2;
 		}
+		else
+		{
+			pTmpData = Enscale(Width, Height, 8, Format, pTexData);
+			pTexData = pTmpData;
+		}
 	}
 
 	Oglformat = GL_RGBA;
@@ -565,9 +627,9 @@ void CGraphics_OpenGL::SetColorVertex(const CColorVertex *pArray, int Num)
 
 	for(int i = 0; i < Num; ++i)
 	{
-		m_aColor[pArray[i].m_Index].r = pArray[i].m_R;
-		m_aColor[pArray[i].m_Index].g = pArray[i].m_G;
-		m_aColor[pArray[i].m_Index].b = pArray[i].m_B;
+		m_aColor[pArray[i].m_Index].r = pArray[i].m_R/32*0x24;
+		m_aColor[pArray[i].m_Index].g = pArray[i].m_G/64*0x48;
+		m_aColor[pArray[i].m_Index].b = pArray[i].m_B/32*0x24;
 		m_aColor[pArray[i].m_Index].a = pArray[i].m_A;
 	}
 }
@@ -575,6 +637,9 @@ void CGraphics_OpenGL::SetColorVertex(const CColorVertex *pArray, int Num)
 void CGraphics_OpenGL::SetColor(float r, float g, float b, float a)
 {
 	dbg_assert(m_Drawing != 0, "called Graphics()->SetColor without begin");
+	r = r/32*0x24;
+	g = g/64*0x48;
+	b = b/32*0x24;
 	CColorVertex Array[4] = {
 		CColorVertex(0, r, g, b, a),
 		CColorVertex(1, r, g, b, a),
@@ -625,22 +690,34 @@ void CGraphics_OpenGL::QuadsDrawTL(const CQuadItem *pArray, int Num)
 	for(int i = 0; i < Num; ++i)
 	{
 		m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X;
-		m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height;
+		else
+			m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y;
 		m_aVertices[m_NumVertices + 4*i].m_Tex = m_aTexture[0];
 		m_aVertices[m_NumVertices + 4*i].m_Color = m_aColor[0];
 
 		m_aVertices[m_NumVertices + 4*i + 1].m_Pos.x = pArray[i].m_X + pArray[i].m_Width;
-		m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height;
+		else
+			m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y;
 		m_aVertices[m_NumVertices + 4*i + 1].m_Tex = m_aTexture[1];
 		m_aVertices[m_NumVertices + 4*i + 1].m_Color = m_aColor[1];
 
 		m_aVertices[m_NumVertices + 4*i + 2].m_Pos.x = pArray[i].m_X + pArray[i].m_Width;
-		m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y;
+		else
+			m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height;
 		m_aVertices[m_NumVertices + 4*i + 2].m_Tex = m_aTexture[2];
 		m_aVertices[m_NumVertices + 4*i + 2].m_Color = m_aColor[2];
 
 		m_aVertices[m_NumVertices + 4*i + 3].m_Pos.x = pArray[i].m_X;
-		m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y;
+		else
+			m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height;
 		m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[3];
 		m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[3];
 
@@ -663,22 +740,34 @@ void CGraphics_OpenGL::QuadsDrawFreeform(const CFreeformItem *pArray, int Num)
 	for(int i = 0; i < Num; ++i)
 	{
 		m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X0;
-		m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y0;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y2;
+		else
+			m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y0;
 		m_aVertices[m_NumVertices + 4*i].m_Tex = m_aTexture[0];
 		m_aVertices[m_NumVertices + 4*i].m_Color = m_aColor[0];
 
 		m_aVertices[m_NumVertices + 4*i + 1].m_Pos.x = pArray[i].m_X1;
-		m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y1;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y3;
+		else
+			m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y1;
 		m_aVertices[m_NumVertices + 4*i + 1].m_Tex = m_aTexture[1];
 		m_aVertices[m_NumVertices + 4*i + 1].m_Color = m_aColor[1];
 
 		m_aVertices[m_NumVertices + 4*i + 2].m_Pos.x = pArray[i].m_X3;
-		m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y3;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y1;
+		else
+			m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y3;
 		m_aVertices[m_NumVertices + 4*i + 2].m_Tex = m_aTexture[3];
 		m_aVertices[m_NumVertices + 4*i + 2].m_Color = m_aColor[3];
 
 		m_aVertices[m_NumVertices + 4*i + 3].m_Pos.x = pArray[i].m_X2;
-		m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y2;
+		if(g_Config.m_ClEditor)
+			m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y0;
+		else
+			m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y2;
 		m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[2];
 		m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[2];
 	}
diff --git a/src/engine/client/graphics.h b/src/engine/client/graphics.h
index fdd83aa..3ae5972 100644
--- a/src/engine/client/graphics.h
+++ b/src/engine/client/graphics.h
@@ -68,6 +68,7 @@ protected:
 
 	static unsigned char Sample(int w, int h, const unsigned char *pData, int u, int v, int Offset, int ScaleW, int ScaleH, int Bpp);
 	static unsigned char *Rescale(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData);
+	static unsigned char *Enscale(int Width, int Height, int Scale, int Format, const unsigned char *pData);
 public:
 	CGraphics_OpenGL();
 
diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp
index af06fc1..6bfaa40 100644
--- a/src/engine/client/text.cpp
+++ b/src/engine/client/text.cpp
@@ -20,7 +20,7 @@ enum
 };
 
 
-static int aFontSizes[] = {8,9,10,11,12,13,14,15,16,17,18,19,20,36,64};
+static int aFontSizes[] = {1,1,1,1,1,1,1,1,2,2,2,2,2,4,8};
 #define NUM_FONT_SIZES (sizeof(aFontSizes)/sizeof(int))
 
 struct CFontChar
diff --git a/src/game/client/components/console.cpp b/src/game/client/components/console.cpp
index d16d56c..f63dd27 100644
--- a/src/game/client/components/console.cpp
+++ b/src/game/client/components/console.cpp
@@ -366,12 +366,15 @@ void CGameConsole::OnRender()
 	// do background
 	Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CONSOLE_BG].m_Id);
 	Graphics()->QuadsBegin();
-	Graphics()->SetColor(0.2f, 0.2f, 0.2f,0.9f);
-	if(m_ConsoleType == CONSOLETYPE_REMOTE)
-		Graphics()->SetColor(0.4f, 0.2f, 0.2f,0.9f);
+	Graphics()->SetColor(0.365f, 0.318f, 1.0f,1.0f);
 	Graphics()->QuadsSetSubset(0,-ConsoleHeight*0.075f,Screen.w*0.075f*0.5f,0);
 	QuadItem = IGraphics::CQuadItem(0, 0, Screen.w, ConsoleHeight);
 	Graphics()->QuadsDrawTL(&QuadItem, 1);
+
+	Graphics()->SetColor(0.125f, 0.094f, 0.682f,1.0f);
+	Graphics()->QuadsSetSubset(0,-ConsoleHeight*0.075f,Screen.w*0.075f*0.5f,0);
+	QuadItem = IGraphics::CQuadItem(20, 20, Screen.w-40, ConsoleHeight-50);
+	Graphics()->QuadsDrawTL(&QuadItem, 1);
 	Graphics()->QuadsEnd();
 
 	// do small bar shadow
@@ -389,7 +392,10 @@ void CGameConsole::OnRender()
 	// do the lower bar
 	Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CONSOLE_BAR].m_Id);
 	Graphics()->QuadsBegin();
-	Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.9f);
+	if(m_ConsoleType == CONSOLETYPE_REMOTE)
+		Graphics()->SetColor(1.0f, 0.5f, 0.5f, 0.9f);
+	else
+		Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.9f);
 	Graphics()->QuadsSetSubset(0,0.1f,Screen.w*0.015f,1-0.1f);
 	QuadItem = IGraphics::CQuadItem(0,ConsoleHeight-10.0f,Screen.w,10.0f);
 	Graphics()->QuadsDrawTL(&QuadItem, 1);
@@ -400,10 +406,10 @@ void CGameConsole::OnRender()
 	CInstance *pConsole = CurrentConsole();
 
 	{
-		float FontSize = 10.0f;
+		float FontSize = 16.0f;
 		float RowHeight = FontSize*1.25f;
-		float x = 3;
-		float y = ConsoleHeight - RowHeight - 5.0f;
+		float x = 23;
+		float y = ConsoleHeight - RowHeight - 12.0f;
 
 		CRenderInfo Info;
 		Info.m_pSelf = this;
@@ -416,6 +422,7 @@ void CGameConsole::OnRender()
 
 		// render prompt
 		CTextCursor Cursor;
+		TextRender()->TextColor(0.365f, 0.318f, 1.0f,1.0f);
 		TextRender()->SetCursor(&Cursor, x, y, FontSize, TEXTFLAG_RENDER);
 		const char *pPrompt = "> ";
 		if(m_ConsoleType == CONSOLETYPE_REMOTE)
@@ -435,10 +442,10 @@ void CGameConsole::OnRender()
 		x = Cursor.m_X;
 
 		// render console input (wrap line)
-		int Lines = TextRender()->TextLineCount(0, FontSize, pConsole->m_Input.GetString(), Screen.w - 10.0f - x);
+		int Lines = TextRender()->TextLineCount(0, FontSize, pConsole->m_Input.GetString(), Screen.w - 20.0f - x);
 		y -= (Lines - 1) * FontSize;
 		TextRender()->SetCursor(&Cursor, x, y, FontSize, TEXTFLAG_RENDER);
-		Cursor.m_LineWidth = Screen.w - 10.0f - x;
+		Cursor.m_LineWidth = Screen.w - 20.0f - x;
 
 		//hide rcon password
 		char aInputString[256];
@@ -479,7 +486,7 @@ void CGameConsole::OnRender()
 				}
 			}
 		}
-		TextRender()->TextColor(1,1,1,1);
+		TextRender()->TextColor(0.365f, 0.318f, 1.0f,1.0f);
 
 		//	render log (actual page, wrap lines)
 		CInstance::CBacklogEntry *pEntry = pConsole->m_Backlog.Last();
@@ -490,9 +497,9 @@ void CGameConsole::OnRender()
 			while(pEntry)
 			{
 				// get y offset (calculate it if we haven't yet)
-				if(pEntry->m_YOffset < 0.0f)
+				if(pEntry->m_YOffset < 40.0f)
 				{
-					TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, FontSize, 0);
+					TextRender()->SetCursor(&Cursor, x, 0.0f, FontSize, 0);
 					Cursor.m_LineWidth = Screen.w-10;
 					TextRender()->TextEx(&Cursor, pEntry->m_aText, -1);
 					pEntry->m_YOffset = Cursor.m_Y+Cursor.m_FontSize+LineOffset;
@@ -500,13 +507,13 @@ void CGameConsole::OnRender()
 				OffsetY += pEntry->m_YOffset;
 
 				//	next page when lines reach the top
-				if(y-OffsetY <= RowHeight)
+				if(y-OffsetY <= 40.0f+RowHeight)
 					break;
 
 				//	just render output from actual backlog page (render bottom up)
 				if(Page == pConsole->m_BacklogActPage)
 				{
-					TextRender()->SetCursor(&Cursor, 0.0f, y-OffsetY, FontSize, TEXTFLAG_RENDER);
+					TextRender()->SetCursor(&Cursor, x, y-OffsetY, FontSize, TEXTFLAG_RENDER);
 					Cursor.m_LineWidth = Screen.w-10.0f;
 					TextRender()->TextEx(&Cursor, pEntry->m_aText, -1);
 				}
@@ -518,9 +525,9 @@ void CGameConsole::OnRender()
 			{
 				pConsole->m_BacklogActPage = Page;
 				pEntry = pConsole->m_Backlog.First();
-				while(OffsetY > 0.0f && pEntry)
+				while(OffsetY > 40.0f && pEntry)
 				{
-					TextRender()->SetCursor(&Cursor, 0.0f, y-OffsetY, FontSize, TEXTFLAG_RENDER);
+					TextRender()->SetCursor(&Cursor, x, y-OffsetY, FontSize, TEXTFLAG_RENDER);
 					Cursor.m_LineWidth = Screen.w-10.0f;
 					TextRender()->TextEx(&Cursor, pEntry->m_aText, -1);
 					OffsetY -= pEntry->m_YOffset;
@@ -530,15 +537,15 @@ void CGameConsole::OnRender()
 			}
 		}
 
-		// render page
+		// render top
 		char aBuf[128];
-		str_format(aBuf, sizeof(aBuf), Localize("-Page %d-"), pConsole->m_BacklogActPage+1);
-		TextRender()->Text(0, 10.0f, 0.0f, FontSize, aBuf, -1);
-
-		// render version
-		str_format(aBuf, sizeof(aBuf), "v%s", GAME_VERSION);
+		str_format(aBuf, sizeof(aBuf), Localize("***  TEEWORLDS 2012 V1.0 PAGE %d  ***"), pConsole->m_BacklogActPage+1);
 		float Width = TextRender()->TextWidth(0, FontSize, aBuf, -1);
-		TextRender()->Text(0, Screen.w-Width-10.0f, 0.0f, FontSize, aBuf, -1);
+		TextRender()->Text(0, (Screen.w-Width-40.0f)/2, 20.0f, FontSize, aBuf, -1);
+		str_format(aBuf, sizeof(aBuf), Localize("64K RAM CONSOLE SYSTEM   38911 BASIC LINES FREE"), pConsole->m_BacklogActPage+1);
+		Width = TextRender()->TextWidth(0, FontSize, aBuf, -1);
+		TextRender()->Text(0, (Screen.w-Width-40.0f)/2, 40.0f, FontSize, aBuf, -1);
+		TextRender()->TextColor(1,1,1,1);
 	}
 }
 
diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp
index d27307f..5931714 100644
--- a/src/game/client/components/menus.cpp
+++ b/src/game/client/components/menus.cpp
@@ -50,7 +50,7 @@ int CMenus::m_NumInputEvents;
 CMenus::CMenus()
 {
 	m_Popup = POPUP_NONE;
-	m_ActivePage = PAGE_INTERNET;
+	m_ActivePage = PAGE_START;
 	m_GamePage = PAGE_GAME;
 
 	m_NeedRestartGraphics = false;
@@ -70,6 +70,14 @@ CMenus::CMenus()
 	m_aCallvoteReason[0] = 0;
 
 	m_FriendlistSelectedIndex = -1;
+
+	m_BlaCounter = 0;
+}
+
+void CMenus::IncreaseBlaCounter()
+{
+	if(++m_BlaCounter%10 == 0)
+		m_Popup = POPUP_VALIDATION;
 }
 
 vec4 CMenus::ButtonColorMul(const void *pID)
@@ -519,7 +527,7 @@ int CMenus::RenderMenubar(CUIRect r)
 	CUIRect Box = r;
 	CUIRect Button;
 
-	m_ActivePage = g_Config.m_UiPage;
+	//m_ActivePage = g_Config.m_UiPage;
 	int NewPage = -1;
 
 	if(Client()->State() != IClient::STATE_OFFLINE)
@@ -538,39 +546,43 @@ int CMenus::RenderMenubar(CUIRect r)
 		}
 
 		Box.VSplitLeft(100.0f, &Button, &Box);
-		static int s_InternetButton=0;
-		if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage==PAGE_INTERNET, &Button, CUI::CORNER_TL))
+		static int s_BackButton=0;
+		if(DoButton_MenuTab(&s_BackButton, Localize("Back"), 0, &Button, CUI::CORNER_T))
 		{
-			ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
-			NewPage = PAGE_INTERNET;
+			NewPage = PAGE_START;
 		}
 
-		//Box.VSplitLeft(4.0f, 0, &Box);
-		Box.VSplitLeft(80.0f, &Button, &Box);
-		static int s_LanButton=0;
-		if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage==PAGE_LAN, &Button, 0))
-		{
-			ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
-			NewPage = PAGE_LAN;
-		}
+		Box.VSplitLeft(100.0f, &Button, &Box);
 
-		//box.VSplitLeft(4.0f, 0, &box);
-		Box.VSplitLeft(110.0f, &Button, &Box);
-		static int s_FavoritesButton=0;
-		if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage==PAGE_FAVORITES, &Button, CUI::CORNER_TR))
+		if(m_ActivePage >= PAGE_INTERNET && m_ActivePage <= PAGE_FAVORITES)
 		{
-			ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
-			NewPage = PAGE_FAVORITES;
-		}
+			Box.VSplitLeft(100.0f, &Button, &Box);
+			static int s_InternetButton=0;
+			if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage==PAGE_INTERNET, &Button, CUI::CORNER_TL))
+			{
+				ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
+				NewPage = PAGE_INTERNET;
+			}
 
-		Box.VSplitLeft(4.0f*5, 0, &Box);
-		Box.VSplitLeft(100.0f, &Button, &Box);
-		static int s_DemosButton=0;
-		if(DoButton_MenuTab(&s_DemosButton, Localize("Demos"), m_ActivePage==PAGE_DEMOS, &Button, CUI::CORNER_T))
-		{
-			DemolistPopulate();
-			NewPage = PAGE_DEMOS;
+			//Box.VSplitLeft(4.0f, 0, &Box);
+			Box.VSplitLeft(80.0f, &Button, &Box);
+			static int s_LanButton=0;
+			if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage==PAGE_LAN, &Button, 0))
+			{
+				ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
+				NewPage = PAGE_LAN;
+			}
+
+			//box.VSplitLeft(4.0f, 0, &box);
+			Box.VSplitLeft(110.0f, &Button, &Box);
+			static int s_FavoritesButton=0;
+			if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage==PAGE_FAVORITES, &Button, CUI::CORNER_TR))
+			{
+				ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
+				NewPage = PAGE_FAVORITES;
+			}
 		}
+		
 	}
 	else
 	{
@@ -594,32 +606,35 @@ int CMenus::RenderMenubar(CUIRect r)
 		static int s_CallVoteButton=0;
 		if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), m_ActivePage==PAGE_CALLVOTE, &Button, CUI::CORNER_TR))
 			NewPage = PAGE_CALLVOTE;
-	}
-
-	/*
-	box.VSplitRight(110.0f, &box, &button);
-	static int system_button=0;
-	if (UI()->DoButton(&system_button, "System", g_Config.m_UiPage==PAGE_SYSTEM, &button))
-		g_Config.m_UiPage = PAGE_SYSTEM;
-
-	box.VSplitRight(30.0f, &box, 0);
-	*/
 
-	Box.VSplitRight(90.0f, &Box, &Button);
-	static int s_QuitButton=0;
-	if(DoButton_MenuTab(&s_QuitButton, Localize("Quit"), 0, &Button, CUI::CORNER_T))
-		m_Popup = POPUP_QUIT;
-
-	Box.VSplitRight(10.0f, &Box, &Button);
-	Box.VSplitRight(130.0f, &Box, &Button);
-	static int s_SettingsButton=0;
-	if(DoButton_MenuTab(&s_SettingsButton, Localize("Settings"), m_ActivePage==PAGE_SETTINGS, &Button, CUI::CORNER_T))
-		NewPage = PAGE_SETTINGS;
+		/*
+		box.VSplitRight(110.0f, &box, &button);
+		static int system_button=0;
+		if (UI()->DoButton(&system_button, "System", g_Config.m_UiPage==PAGE_SYSTEM, &button))
+			g_Config.m_UiPage = PAGE_SYSTEM;
+
+		box.VSplitRight(30.0f, &box, 0);
+		*/
+
+		Box.VSplitRight(90.0f, &Box, &Button);
+		static int s_QuitButton=0;
+		if(DoButton_MenuTab(&s_QuitButton, Localize("Quit"), 0, &Button, CUI::CORNER_T))
+			m_Popup = POPUP_QUIT;
+
+		Box.VSplitRight(10.0f, &Box, &Button);
+		Box.VSplitRight(130.0f, &Box, &Button);
+		static int s_SettingsButton=0;
+		if(DoButton_MenuTab(&s_SettingsButton, Localize("Settings"), m_ActivePage==PAGE_SETTINGS, &Button, CUI::CORNER_T))
+			NewPage = PAGE_SETTINGS;
+	}
 
 	if(NewPage != -1)
 	{
 		if(Client()->State() == IClient::STATE_OFFLINE)
-			g_Config.m_UiPage = NewPage;
+		{
+			m_ActivePage = NewPage;
+			IncreaseBlaCounter();
+		}
 		else
 			m_GamePage = NewPage;
 	}
@@ -687,6 +702,152 @@ void CMenus::RenderNews(CUIRect MainView)
 	RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
 }
 
+void CMenus::RenderStart(CUIRect MainView)
+{
+	CUIRect Top, Bottom;
+	MainView.VSplitLeft(MainView.w/3, 0, &MainView);
+	MainView.VSplitLeft(MainView.w/2, &Bottom, &MainView);
+	Bottom.HSplitTop(150.0f, 0, &Bottom);
+
+	// buttons
+	Bottom.HSplitTop(25.0f, &Top, &Bottom);
+	static int s_PlayButton=0;
+	if(DoButton_Menu(&s_PlayButton, Localize("Play"), 0, &Top))
+		m_ActivePage = PAGE_INTERNET;
+
+	Bottom.HSplitTop(10.0f, 0, &Bottom);
+	Bottom.HSplitTop(25.0f, &Top, &Bottom);
+	static int s_AccountButton=0;
+	if(DoButton_Menu(&s_AccountButton, Localize("Account"), 0, &Top))
+		m_ActivePage = PAGE_ACCOUNT;
+
+	Bottom.HSplitTop(20.0f, 0, &Bottom);
+	Bottom.HSplitTop(25.0f, &Top, &Bottom);
+	static int s_DemosButton=0;
+	if(DoButton_Menu(&s_DemosButton, Localize("Demos"), 0, &Top))
+		m_ActivePage = PAGE_DEMOS;
+
+	Bottom.HSplitTop(10.0f, 0, &Bottom);
+	Bottom.HSplitTop(25.0f, &Top, &Bottom);
+	static int s_EditorButton=0;
+	if(DoButton_Menu(&s_EditorButton, Localize("Editor"), 0, &Top))
+		g_Config.m_ClEditor = 1;
+
+	Bottom.HSplitTop(10.0f, 0, &Bottom);
+	Bottom.HSplitTop(25.0f, &Top, &Bottom);
+	static int s_SettingsButton=0;
+	if(DoButton_Menu(&s_SettingsButton, Localize("Settings"), 0, &Top))
+		m_ActivePage = PAGE_SETTINGS;
+
+	Bottom.HSplitTop(20.0f, 0, &Bottom);
+	Bottom.HSplitTop(25.0f, &Top, &Bottom);
+	static int s_QuitButton=0;
+	if(DoButton_Menu(&s_QuitButton, Localize("Quit"), 0, &Top))
+		m_Popup = POPUP_QUIT;
+
+	Bottom.HSplitBottom(25.0f, 0, &Bottom);
+	UI()->DoLabel(&Bottom, Localize("Version: 1.0"), 16.0f, 0);
+
+	MainView.HSplitBottom(25.0f, 0, &Bottom);
+	UI()->DoLabel(&Bottom, Localize("bla - copy protection"), 16.0f, 1);
+}
+
+void CMenus::RenderSelfDestruct(CUIRect MainView)
+{
+	int64 Now = time_get();
+	if(m_SDTimer+10*time_freq() < Now)
+	{
+		float sw = 300*Graphics()->ScreenAspect();
+		float sh = 300;
+		Graphics()->MapScreen(0, 0, sw, sh);
+
+		// render background
+		Graphics()->TextureSet(-1);
+		Graphics()->QuadsBegin();
+			Graphics()->SetColor(0.0f,0.0f,0.0f,1.0f);
+			IGraphics::CQuadItem QuadItem = IGraphics::CQuadItem(0, 0, sw, sh);
+			Graphics()->QuadsDrawTL(&QuadItem, 1);
+		Graphics()->QuadsEnd();
+
+		// restore screen
+		{CUIRect Screen = *UI()->Screen();
+		Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h);}
+	}
+	else
+	{
+		CUIRect Label;
+		MainView.HSplitTop(MainView.h/3, 0, &MainView);
+		MainView.HSplitTop(30.0f, &Label, &MainView);
+		UI()->DoLabel(&Label, Localize("Self destruction sequence initialised"), 26.0f, 0);
+		char aBuf[32];
+		str_format(aBuf, sizeof(aBuf), "%i", 10-(Now-m_SDTimer)/time_freq());
+		MainView.HSplitTop(30.0f, &Label, &MainView);
+		UI()->DoLabel(&Label, aBuf, 26.0f, 0);
+	}
+}
+
+void CMenus::RenderAccount(CUIRect MainView)
+{
+	CUIRect Box, Button, Label, All;
+	All = MainView;
+	RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
+	MainView.HSplitTop(35.0f, &Box, &MainView);
+
+	Box.VSplitLeft(Box.w/3, &Button, &Box);
+	static int s_ProfileButton=0;
+	DoButton_MenuTab(&s_ProfileButton, Localize("Profile"), true, &Button, CUI::CORNER_TL);
+	
+	Box.VSplitLeft(Box.w/2, &Button, &Box);
+	static int s_StatsButton=0;
+	DoButton_MenuTab(&s_StatsButton, Localize("Stats"), false, &Button, 0);
+
+	static int s_RankingButton=0;
+	DoButton_MenuTab(&s_RankingButton, Localize("Ranking"), false, &Box, CUI::CORNER_TR);
+
+	MainView.Margin(20.0f, &MainView);
+	MainView.HSplitTop(20.0f, &Button, &MainView);
+	Button.VSplitLeft(40.0f, &Label, 0);
+	char aBuf[128];
+	str_format(aBuf, sizeof(aBuf), "%s:", Localize("Name"));
+	UI()->DoLabelScaled(&Label, aBuf, 14.0, -1);
+	
+	MainView.HSplitTop(5.0f, 0, &MainView);
+	MainView.HSplitTop(20.0f, &Button, &MainView);
+	Button.VSplitLeft(40.0f, &Label, 0);
+	str_format(aBuf, sizeof(aBuf), "%s:", Localize("Clan"));
+	UI()->DoLabelScaled(&Label, aBuf, 14.0, -1);
+	
+	MainView.HSplitTop(5.0f, 0, &MainView);
+	MainView.HSplitTop(20.0f, &Button, &MainView);
+	Button.VSplitLeft(40.0f, &Label, 0);
+	str_format(aBuf, sizeof(aBuf), "%s:", Localize("Country"));
+	UI()->DoLabelScaled(&Label, aBuf, 14.0, -1);
+
+	MainView.HSplitTop(15.0f, 0, &MainView);
+	MainView.HSplitTop(20.0f, &Button, &MainView);
+	Button.VSplitLeft(40.0f, &Label, 0);
+	str_format(aBuf, sizeof(aBuf), "%s:", Localize("E-mail"));
+	UI()->DoLabelScaled(&Label, aBuf, 14.0, -1);
+
+
+	MainView.HSplitTop(5.0f, 0, &MainView);
+	MainView.HSplitTop(20.0f, &Button, &MainView);
+	Button.VSplitLeft(40.0f, &Label, 0);
+	str_format(aBuf, sizeof(aBuf), "%s:", Localize("ID"));
+	UI()->DoLabelScaled(&Label, aBuf, 14.0, -1);
+
+	MainView.HSplitTop(5.0f, 0, &MainView);
+	MainView.HSplitTop(20.0f, &Button, &MainView);
+	Button.VSplitLeft(40.0f, &Label, 0);
+	str_format(aBuf, sizeof(aBuf), "%s", Localize("Status: offline"));
+	UI()->DoLabelScaled(&Label, aBuf, 14.0, -1);
+
+	RenderTools()->DrawUIRect(&All, vec4(0.0f, 0.0f, 0.0f, 0.7f), CUI::CORNER_ALL, 10.0f);
+
+	All.HSplitTop(All.h/2-20.0f, 0, &Label);
+	UI()->DoLabelScaled(&Label, "Disabled till 04.02.2012 00:00", 14.0, 0);
+}
+
 void CMenus::OnInit()
 {
 
@@ -767,13 +928,13 @@ int CMenus::Render()
 	Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h);
 
 	static bool s_First = true;
-	if(s_First)
+	if(s_First && m_ActivePage >= PAGE_INTERNET && m_ActivePage <= PAGE_FAVORITES)
 	{
-		if(g_Config.m_UiPage == PAGE_INTERNET)
+		if(m_ActivePage == PAGE_INTERNET)
 			ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
-		else if(g_Config.m_UiPage == PAGE_LAN)
+		else if(m_ActivePage == PAGE_LAN)
 			ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
-		else if(g_Config.m_UiPage == PAGE_FAVORITES)
+		else if(m_ActivePage == PAGE_FAVORITES)
 			ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
 		m_pClient->m_pSounds->Enqueue(CSounds::CHN_MUSIC, SOUND_MENU);
 		s_First = false;
@@ -808,15 +969,20 @@ int CMenus::Render()
 	if(m_Popup == POPUP_NONE)
 	{
 		// do tab bar
-		Screen.HSplitTop(24.0f, &TabBar, &MainView);
-		TabBar.VMargin(20.0f, &TabBar);
-		RenderMenubar(TabBar);
+		if(m_ActivePage != PAGE_START && m_ActivePage != PAGE_SELFDESTRUCT)
+		{
+			Screen.HSplitTop(24.0f, &TabBar, &MainView);
+			TabBar.VMargin(20.0f, &TabBar);
+			RenderMenubar(TabBar);
+		}
+		else
+			MainView = Screen;
 
 		// news is not implemented yet
-		if(g_Config.m_UiPage <= PAGE_NEWS || g_Config.m_UiPage > PAGE_SETTINGS || (Client()->State() == IClient::STATE_OFFLINE && g_Config.m_UiPage >= PAGE_GAME && g_Config.m_UiPage <= PAGE_CALLVOTE))
+		if(m_ActivePage <= PAGE_NEWS || m_ActivePage > PAGE_SETTINGS || (Client()->State() == IClient::STATE_OFFLINE && m_ActivePage >= PAGE_GAME && m_ActivePage <= PAGE_CALLVOTE))
 		{
 			ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
-			g_Config.m_UiPage = PAGE_INTERNET;
+			m_ActivePage = PAGE_INTERNET;
 		}
 
 		// render current page
@@ -833,17 +999,23 @@ int CMenus::Render()
 			else if(m_GamePage == PAGE_SETTINGS)
 				RenderSettings(MainView);
 		}
-		else if(g_Config.m_UiPage == PAGE_NEWS)
+		else if(m_ActivePage == PAGE_NEWS)
 			RenderNews(MainView);
-		else if(g_Config.m_UiPage == PAGE_INTERNET)
+		else if(m_ActivePage == PAGE_START)
+			RenderStart(MainView);
+		else if(m_ActivePage == PAGE_ACCOUNT)
+			RenderAccount(MainView);
+		else if(m_ActivePage == PAGE_SELFDESTRUCT)
+			RenderSelfDestruct(MainView);
+		else if(m_ActivePage == PAGE_INTERNET)
 			RenderServerbrowser(MainView);
-		else if(g_Config.m_UiPage == PAGE_LAN)
+		else if(m_ActivePage == PAGE_LAN)
 			RenderServerbrowser(MainView);
-		else if(g_Config.m_UiPage == PAGE_DEMOS)
+		else if(m_ActivePage == PAGE_DEMOS)
 			RenderDemoList(MainView);
-		else if(g_Config.m_UiPage == PAGE_FAVORITES)
+		else if(m_ActivePage == PAGE_FAVORITES)
 			RenderServerbrowser(MainView);
-		else if(g_Config.m_UiPage == PAGE_SETTINGS)
+		else if(m_ActivePage == PAGE_SETTINGS)
 			RenderSettings(MainView);
 	}
 	else
@@ -888,6 +1060,12 @@ int CMenus::Render()
 			pButtonText = Localize("Ok");
 			ExtraAlign = -1;
 		}
+		else if(m_Popup == POPUP_VALIDATION)
+		{
+			pTitle = Localize("Game Validation");
+			pExtraText = "";
+			ExtraAlign = -1;
+		}
 		else if(m_Popup == POPUP_DELETE_DEMO)
 		{
 			pTitle = Localize("Delete demo");
@@ -1084,6 +1262,53 @@ int CMenus::Render()
 				RenderTools()->DrawUIRect(&Part, vec4(1.0f, 1.0f, 1.0f, 0.5f), CUI::CORNER_ALL, 5.0f);
 			}
 		}
+		else if(m_Popup == POPUP_VALIDATION)
+		{
+			CUIRect Label, TextBox, TryAgain, Abort;
+
+			Box.HSplitBottom(20.f, &Box, &Part);
+			Box.HSplitBottom(24.f, &Box, &Part);
+			Part.VMargin(80.0f, &Part);
+
+			Part.VSplitMid(&Abort, &TryAgain);
+
+			TryAgain.VMargin(20.0f, &TryAgain);
+			Abort.VMargin(20.0f, &Abort);
+
+			static char s_aWord[64] = {0};
+
+			static int s_ButtonTryAgain = 0;
+			if(DoButton_Menu(&s_ButtonTryAgain, Localize("Ok"), 0, &TryAgain) || m_EnterPressed)
+			{
+				if(str_comp(s_aWord, "bla") == 0)
+				{
+					s_aWord[0] = 0;
+					m_Popup = POPUP_NONE;
+				}
+				else
+				{
+					m_ActivePage = PAGE_SELFDESTRUCT;
+					m_SDTimer = time_get();
+					s_aWord[0] = 0;
+					m_Popup = POPUP_NONE;
+				}
+			}
+
+			Box.HSplitTop(60.f, &Part, &Box);
+			Part.Margin(10.0f, &Part);
+			char aBuf[128];
+			str_format(aBuf, sizeof(aBuf), Localize("Please enter word number %i in line %i on page %i of your teeworlds manual to verify that you use a legal version:"), m_BlaCounter*123%16, m_BlaCounter*1234%32, m_BlaCounter*12345%128);
+			UI()->DoLabel(&Part, aBuf, 18.0f, -1, Part.w);
+
+			Box.HSplitTop(30.f, 0, &Box);
+			Box.HSplitTop(24.f, &Part, &Box);
+
+			Part.VSplitLeft(60.0f, 0, &TextBox);
+			TextBox.VSplitRight(60.0f, &TextBox, 0);
+			
+			static float Offset = 0.0f;
+			DoEditBox(&g_Config.m_Password, &TextBox, s_aWord, sizeof(s_aWord), 12.0f, &Offset, true);
+		}
 		else if(m_Popup == POPUP_LANGUAGE)
 		{
 			Box = Screen;
@@ -1521,12 +1746,15 @@ void CMenus::OnRender()
 		Render();
 
 	// render cursor
-	Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id);
-	Graphics()->QuadsBegin();
-	Graphics()->SetColor(1,1,1,1);
-	IGraphics::CQuadItem QuadItem(mx, my, 24, 24);
-	Graphics()->QuadsDrawTL(&QuadItem, 1);
-	Graphics()->QuadsEnd();
+	if(m_ActivePage != PAGE_SELFDESTRUCT)
+	{
+		Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id);
+		Graphics()->QuadsBegin();
+		Graphics()->SetColor(1,1,1,1);
+		IGraphics::CQuadItem QuadItem(mx, my, 24, 24);
+		Graphics()->QuadsDrawTL(&QuadItem, 1);
+		Graphics()->QuadsEnd();
+	}
 
 	// render debug information
 	if(g_Config.m_Debug)
@@ -1548,55 +1776,41 @@ void CMenus::OnRender()
 }
 
 static int gs_TextureBlob = -1;
+static int gs_TextureBack = -1;
+static int gs_TextureLogo= -1;
 
 void CMenus::RenderBackground()
 {
 	//Graphics()->Clear(1,1,1);
 	//render_sunrays(0,0);
-	if(gs_TextureBlob == -1)
-		gs_TextureBlob = Graphics()->LoadTexture("blob.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0);
-
+	/*if(gs_TextureBlob == -1)
+		gs_TextureBlob = Graphics()->LoadTexture("blob.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0);*/
+	if(gs_TextureBack == -1)
+		gs_TextureBack = Graphics()->LoadTexture("menu_background.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0);
+	if(gs_TextureLogo == -1)
+		gs_TextureLogo = Graphics()->LoadTexture("gui_logo.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0);
 
 	float sw = 300*Graphics()->ScreenAspect();
 	float sh = 300;
 	Graphics()->MapScreen(0, 0, sw, sh);
 
-	// render background color
+	// render background
 	Graphics()->TextureSet(-1);
 	Graphics()->QuadsBegin();
-		//vec4 bottom(gui_color.r*0.3f, gui_color.g*0.3f, gui_color.b*0.3f, 1.0f);
-		//vec4 bottom(0, 0, 0, 1.0f);
-		vec4 Bottom(ms_GuiColor.r, ms_GuiColor.g, ms_GuiColor.b, 1.0f);
-		vec4 Top(ms_GuiColor.r, ms_GuiColor.g, ms_GuiColor.b, 1.0f);
-		IGraphics::CColorVertex Array[4] = {
-			IGraphics::CColorVertex(0, Top.r, Top.g, Top.b, Top.a),
-			IGraphics::CColorVertex(1, Top.r, Top.g, Top.b, Top.a),
-			IGraphics::CColorVertex(2, Bottom.r, Bottom.g, Bottom.b, Bottom.a),
-			IGraphics::CColorVertex(3, Bottom.r, Bottom.g, Bottom.b, Bottom.a)};
-		Graphics()->SetColorVertex(Array, 4);
-		IGraphics::CQuadItem QuadItem(0, 0, sw, sh);
+		Graphics()->SetColor(0.65f,0.78f,0.9f,1.0f);
+		IGraphics::CQuadItem QuadItem = IGraphics::CQuadItem(-100, -100, sw+200, sh+200);
 		Graphics()->QuadsDrawTL(&QuadItem, 1);
 	Graphics()->QuadsEnd();
 
-	// render the tiles
-	Graphics()->TextureSet(-1);
+	Graphics()->TextureSet(gs_TextureLogo);
 	Graphics()->QuadsBegin();
-		float Size = 15.0f;
-		float OffsetTime = fmod(Client()->LocalTime()*0.15f, 2.0f);
-		for(int y = -2; y < (int)(sw/Size); y++)
-			for(int x = -2; x < (int)(sh/Size); x++)
-			{
-				Graphics()->SetColor(0,0,0,0.045f);
-				IGraphics::CQuadItem QuadItem((x-OffsetTime)*Size*2+(y&1)*Size, (y+OffsetTime)*Size, Size, Size);
-				Graphics()->QuadsDrawTL(&QuadItem, 1);
-			}
+		QuadItem = IGraphics::CQuadItem(20, 0, sw-40, 80);
+		Graphics()->QuadsDrawTL(&QuadItem, 1);
 	Graphics()->QuadsEnd();
 
-	// render border fade
-	Graphics()->TextureSet(gs_TextureBlob);
+	Graphics()->TextureSet(gs_TextureBack);
 	Graphics()->QuadsBegin();
-		Graphics()->SetColor(0,0,0,0.5f);
-		QuadItem = IGraphics::CQuadItem(-100, -100, sw+200, sh+200);
+		QuadItem = IGraphics::CQuadItem(0, 80, sw, sh-70);
 		Graphics()->QuadsDrawTL(&QuadItem, 1);
 	Graphics()->QuadsEnd();
 
diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h
index 0125278..7d692d2 100644
--- a/src/game/client/components/menus.h
+++ b/src/game/client/components/menus.h
@@ -102,6 +102,7 @@ class CMenus : public CComponent
 		POPUP_PURE,
 		POPUP_LANGUAGE,
 		POPUP_COUNTRY,
+		POPUP_VALIDATION,
 		POPUP_DELETE_DEMO,
 		POPUP_RENAME_DEMO,
 		POPUP_REMOVE_FRIEND,
@@ -117,6 +118,9 @@ class CMenus : public CComponent
 		PAGE_PLAYERS,
 		PAGE_SERVER_INFO,
 		PAGE_CALLVOTE,
+		PAGE_START,
+		PAGE_ACCOUNT,
+		PAGE_SELFDESTRUCT,
 		PAGE_INTERNET,
 		PAGE_LAN,
 		PAGE_FAVORITES,
@@ -238,6 +242,13 @@ class CMenus : public CComponent
 	//void render_loading(float percent);
 	int RenderMenubar(CUIRect r);
 	void RenderNews(CUIRect MainView);
+	void RenderStart(CUIRect MainView);
+	void RenderSelfDestruct(CUIRect MainView);
+	void RenderAccount(CUIRect MainView);
+
+	void IncreaseBlaCounter();
+	int m_BlaCounter;
+	int64 m_SDTimer;
 
 	// found in menus_demo.cpp
 	void RenderDemoPlayer(CUIRect MainView);
diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp
index a9c434b..e027d36 100644
--- a/src/game/client/components/menus_browser.cpp
+++ b/src/game/client/components/menus_browser.cpp
@@ -1012,12 +1012,13 @@ void CMenus::RenderServerbrowser(CUIRect MainView)
 		static int s_RefreshButton = 0;
 		if(DoButton_Menu(&s_RefreshButton, Localize("Refresh"), 0, &Button))
 		{
-			if(g_Config.m_UiPage == PAGE_INTERNET)
+			if(m_ActivePage == PAGE_INTERNET)
 				ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
-			else if(g_Config.m_UiPage == PAGE_LAN)
+			else if(m_ActivePage == PAGE_LAN)
 				ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
-			else if(g_Config.m_UiPage == PAGE_FAVORITES)
+			else if(m_ActivePage == PAGE_FAVORITES)
 				ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
+			IncreaseBlaCounter();
 		}
 
 		ButtonArea.HSplitTop(5.0f, 0, &ButtonArea);
diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp
index 2eddd8a..795abd4 100644
--- a/src/game/client/components/players.cpp
+++ b/src/game/client/components/players.cpp
@@ -470,6 +470,68 @@ void CPlayers::RenderPlayer(
 
 	}
 
+	{
+		Graphics()->TextureSet(-1);
+		Graphics()->QuadsBegin();
+
+		vec2 Dir = mix(vec2(pPrevChar->m_VelX/256, pPrevChar->m_VelY/256), vec2(pPlayerChar->m_VelX/256, pPlayerChar->m_VelY/256), Client()->IntraGameTick());
+		int Length = length(Dir)*7;
+		Dir = normalize(Dir*vec2(-1, -1));
+		vec2 Out = vec2(Dir.y, -Dir.x)*2;
+		
+		vec2 Pos = Position+Dir*Length-Out*4;
+		vec2 From = Position-Out*4;
+		Graphics()->SetColor(1.0f,0.0f,0.0f,1.0f);
+		IGraphics::CFreeformItem Freeform(
+			From.x-Out.x, From.y-Out.y,
+			From.x+Out.x, From.y+Out.y,
+			Pos.x-Out.x, Pos.y-Out.y,
+			Pos.x+Out.x, Pos.y+Out.y);
+		Graphics()->QuadsDrawFreeform(&Freeform, 1);
+
+		Pos = Position+Dir*Length-Out*2;
+		From = Position-Out*2;
+		Graphics()->SetColor(1.0f,1.0f,0.0f,1.0f);
+		Freeform = IGraphics::CFreeformItem(
+			From.x-Out.x, From.y-Out.y,
+			From.x+Out.x, From.y+Out.y,
+			Pos.x-Out.x, Pos.y-Out.y,
+			Pos.x+Out.x, Pos.y+Out.y);
+		Graphics()->QuadsDrawFreeform(&Freeform, 1);
+
+		Pos = Position+Dir*Length;
+		From = Position;
+		Graphics()->SetColor(0.0f,1.0f,0.0f,1.0f);
+		Freeform = IGraphics::CFreeformItem(
+			From.x-Out.x, From.y-Out.y,
+			From.x+Out.x, From.y+Out.y,
+			Pos.x-Out.x, Pos.y-Out.y,
+			Pos.x+Out.x, Pos.y+Out.y);
+		Graphics()->QuadsDrawFreeform(&Freeform, 1);
+
+		Pos = Position+Dir*Length+Out*2;
+		From = Position+Out*2;
+		Graphics()->SetColor(0.0f,1.0f,1.0f,1.0f);
+		Freeform = IGraphics::CFreeformItem(
+			From.x-Out.x, From.y-Out.y,
+			From.x+Out.x, From.y+Out.y,
+			Pos.x-Out.x, Pos.y-Out.y,
+			Pos.x+Out.x, Pos.y+Out.y);
+		Graphics()->QuadsDrawFreeform(&Freeform, 1);
+
+		Pos = Position+Dir*Length+Out*4;
+		From = Position+Out*4;
+		Graphics()->SetColor(0.0f,0.0f,1.0f,1.0f);
+		Freeform = IGraphics::CFreeformItem(
+			From.x-Out.x, From.y-Out.y,
+			From.x+Out.x, From.y+Out.y,
+			Pos.x-Out.x, Pos.y-Out.y,
+			Pos.x+Out.x, Pos.y+Out.y);
+		Graphics()->QuadsDrawFreeform(&Freeform, 1);
+
+		Graphics()->QuadsEnd();
+	}
+
 	// render the "shadow" tee
 	if(pInfo.m_Local && g_Config.m_Debug)
 	{
diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp
index fa1024e..28563cc 100644
--- a/src/game/editor/editor.cpp
+++ b/src/game/editor/editor.cpp
@@ -592,7 +592,7 @@ void CEditor::RenderBackground(CUIRect View, int Texture, float Size, float Brig
 	Graphics()->TextureSet(Texture);
 	Graphics()->BlendNormal();
 	Graphics()->QuadsBegin();
-	Graphics()->SetColor(Brightness, Brightness, Brightness, 1.0f);
+	Graphics()->SetColor(Brightness, 0.0f, Brightness, 1.0f);
 	Graphics()->QuadsSetSubset(0,0, View.w/Size, View.h/Size);
 	IGraphics::CQuadItem QuadItem(View.x, View.y, View.w, View.h);
 	Graphics()->QuadsDrawTL(&QuadItem, 1);
