Index: /trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h	(revision 41379)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h	(revision 41380)
@@ -90,4 +90,5 @@
     GLboolean bVisible;      /*guest window is visible*/
     GLboolean bUseFBO;       /*redirect to FBO instead of real host window*/
+    GLboolean bFbDraw;       /*GL_FRONT buffer is drawn to directly*/
 
     GLint       cVisibleRects;    /*count of visible rects*/
Index: /trunk/src/VBox/GuestHost/OpenGL/include/cr_version.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/cr_version.h	(revision 41379)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/cr_version.h	(revision 41380)
@@ -8,6 +8,7 @@
 #define CR_VERSION_H
 
-#define SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS 28
-#define SHCROGL_SSM_VERSION 29
+#define SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS       28
+#define SHCROGL_SSM_VERSION_BEFORE_FRONT_DRAW_TRACKING 29
+#define SHCROGL_SSM_VERSION                            30
 
 /* These define the Chromium release number.
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c	(revision 41379)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c	(revision 41380)
@@ -195,4 +195,6 @@
 {
   CRMuralInfo *mural;
+  CRContext *ctx;
+
 #ifdef VBOXCR_LOGFPS
   static VBOXCRFPS Fps;
@@ -424,4 +426,10 @@
 		window = 0;
 
+	ctx = crStateGetCurrent();
+
+    if (ctx->framebufferobject.drawFB
+            || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
+        cr_server.curClient->currentMural->bFbDraw = GL_FALSE;
+
     if (crServerIsRedirectedToFBO())
     {
@@ -437,10 +445,21 @@
 crServerDispatchFlush(void)
 {
+    CRContext *ctx = crStateGetCurrent();
     cr_server.head_spu->dispatch_table.Flush();
 
-    if (crServerIsRedirectedToFBO())
-    {
+    if (!cr_server.curClient->currentMural) /* <- on window destroy this will be zero */
+        return;
+
+    if (cr_server.curClient->currentMural->bFbDraw && crServerIsRedirectedToFBO())
+    {
+#ifdef DEBUG_misha
+        CRASSERT(0);
+#endif
         crServerPresentFBO(cr_server.curClient->currentMural);
     }
+
+    if (ctx->framebufferobject.drawFB
+            || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
+        cr_server.curClient->currentMural->bFbDraw = GL_FALSE;
 }
 
@@ -448,9 +467,18 @@
 crServerDispatchFinish(void)
 {
+    CRContext *ctx = crStateGetCurrent();
+
     cr_server.head_spu->dispatch_table.Finish();
 
-    if (crServerIsRedirectedToFBO())
-    {
+    if (cr_server.curClient->currentMural->bFbDraw && crServerIsRedirectedToFBO())
+    {
+#ifdef DEBUG_misha
+        CRASSERT(0);
+#endif
         crServerPresentFBO(cr_server.curClient->currentMural);
     }
-}
+
+    if (ctx->framebufferobject.drawFB
+            || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
+        cr_server.curClient->currentMural->bFbDraw = GL_FALSE;
+}
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c	(revision 41379)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c	(revision 41380)
@@ -389,4 +389,8 @@
     crStateSwichPostprocess(oldCtx, cr_server.bUseMultipleContexts, mural->bUseFBO && crServerSupportRedirMuralFBO() ? mural->idFBO : 0);
 
+    if (!ctx->framebufferobject.drawFB
+            && (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT))
+        cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
+
     if (!mural->bUseFBO)
     {
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_framebuffer.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_framebuffer.c	(revision 41379)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_framebuffer.c	(revision 41380)
@@ -64,13 +64,66 @@
 void SERVER_DISPATCH_APIENTRY crServerDispatchBindFramebufferEXT(GLenum target, GLuint framebuffer)
 {
+#ifdef DEBUG_misha
+    GLint rfb = 0, dfb = 0;
+#endif
 	crStateBindFramebufferEXT(target, framebuffer);
+
+    if (0==framebuffer)
+    {
+        CRContext *ctx = crStateGetCurrent();
+        if (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT)
+            cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
+    }
 
     if (0==framebuffer && crServerIsRedirectedToFBO())
     {
         cr_server.head_spu->dispatch_table.BindFramebufferEXT(target, cr_server.curClient->currentMural->idFBO);
+#ifdef DEBUG_misha
+        Assert(0);
+        cr_server.head_spu->dispatch_table.GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
+        cr_server.head_spu->dispatch_table.GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
+        if (GL_FRAMEBUFFER_EXT == target)
+        {
+            Assert(rfb == cr_server.curClient->currentMural->idFBO);
+            Assert(dfb == cr_server.curClient->currentMural->idFBO);
+        }
+        else if (GL_READ_FRAMEBUFFER_EXT == target)
+        {
+            Assert(rfb == cr_server.curClient->currentMural->idFBO);
+        }
+        else if (GL_DRAW_FRAMEBUFFER_EXT == target)
+        {
+            Assert(dfb == cr_server.curClient->currentMural->idFBO);
+        }
+        else
+        {
+            Assert(0);
+        }
+#endif
     }
     else
     {
         cr_server.head_spu->dispatch_table.BindFramebufferEXT(target, crStateGetFramebufferHWID(framebuffer));
+#ifdef DEBUG_misha
+        cr_server.head_spu->dispatch_table.GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
+        cr_server.head_spu->dispatch_table.GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
+        if (GL_FRAMEBUFFER_EXT == target)
+        {
+            Assert(rfb == crStateGetFramebufferHWID(framebuffer));
+            Assert(dfb == crStateGetFramebufferHWID(framebuffer));
+        }
+        else if (GL_READ_FRAMEBUFFER_EXT == target)
+        {
+            Assert(rfb == crStateGetFramebufferHWID(framebuffer));
+        }
+        else if (GL_DRAW_FRAMEBUFFER_EXT == target)
+        {
+            Assert(dfb == crStateGetFramebufferHWID(framebuffer));
+        }
+        else
+        {
+            Assert(0);
+        }
+#endif
     }
 }
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c	(revision 41379)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c	(revision 41380)
@@ -1035,4 +1035,7 @@
         AssertRCReturn(rc, rc);
 
+        if (version <= SHCROGL_SSM_VERSION_BEFORE_FRONT_DRAW_TRACKING)
+            muralInfo.bFbDraw = GL_TRUE;
+
         if (muralInfo.pVisibleRects)
         {
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c	(revision 41379)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c	(revision 41380)
@@ -872,22 +872,27 @@
     crStateDrawBuffer( mode );
 
-    if (cr_server.curClient->currentMural->bUseFBO && crServerIsRedirectedToFBO()
-            && cr_server.curClient->currentMural->idFBO
-            && !crStateGetCurrent()->framebufferobject.drawFB)
+    if (!crStateGetCurrent()->framebufferobject.drawFB)
     {
-        switch (mode)
-        {
-            case GL_BACK:
-            case GL_BACK_LEFT:
-                mode = GL_COLOR_ATTACHMENT0;
-                break;
-            case GL_FRONT:
-            case GL_FRONT_LEFT:
-                crWarning("GL_FRONT not supported for FBO mode! (0x%x)", mode);
-                mode = GL_COLOR_ATTACHMENT0;
-                break;
-            default:
-                crWarning("unexpected mode! 0x%x", mode);
-                break;
+        if (mode == GL_FRONT || mode == GL_FRONT_LEFT)
+            cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
+
+        if (cr_server.curClient->currentMural->bUseFBO && crServerIsRedirectedToFBO()
+                && cr_server.curClient->currentMural->idFBO)
+        {
+            switch (mode)
+            {
+                case GL_BACK:
+                case GL_BACK_LEFT:
+                    mode = GL_COLOR_ATTACHMENT0;
+                    break;
+                case GL_FRONT:
+                case GL_FRONT_LEFT:
+                    crDebug("Setting GL_FRONT with FBO mode! (0x%x)", mode);
+                    mode = GL_COLOR_ATTACHMENT0;
+                    break;
+                default:
+                    crWarning("unexpected mode! 0x%x", mode);
+                    break;
+            }
         }
     }
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c	(revision 41379)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c	(revision 41380)
@@ -276,6 +276,7 @@
 
     /* Work-around Intel driver bug */
-    CRASSERT(cr_server.curClient->currentMural == mural);
-    if (cr_server.curClient->currentMural == mural)
+    CRASSERT(!cr_server.curClient
+            || cr_server.curClient->currentMural == mural);
+    if (cr_server.curClient && cr_server.curClient->currentMural == mural)
     {
         CRContextInfo * ctxInfo = cr_server.currentCtxInfo;
