Index: /trunk/src/VBox/Devices/Graphics/DevVGASavedState.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGASavedState.h	(revision 51630)
+++ /trunk/src/VBox/Devices/Graphics/DevVGASavedState.h	(revision 51631)
@@ -23,5 +23,6 @@
 #define Graphics_DevVGASavedState_h
 
-#define VGA_SAVEDSTATE_VERSION              13
+#define VGA_SAVEDSTATE_VERSION              14
+#define VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA 14
 #define VGA_SAVEDSTATE_VERSION_3D           13
 #define VGA_SAVEDSTATE_VERSION_HGSMIMA      12 /* HGSMI memory allocator. */
Index: /trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp	(revision 51630)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp	(revision 51631)
@@ -1478,6 +1478,8 @@
     {
         case VBOXVBVASAVEDSTATE_VHWAAVAILABLE_MAGIC:
+            pData->ab2DOn[iDisplay] = true;
             return true;
         case VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC:
+            pData->ab2DOn[iDisplay] = false;
             return false;
         default:
@@ -1655,4 +1657,7 @@
         }
     }
+
+    /* no pending commands */
+    SSMR3PutU32(pSSM, 0);
 #endif
     return rc;
@@ -1830,15 +1835,59 @@
                     vbvaVHWAHHCommandRelease(pCmd);
                     AssertRCReturn(rc, rc);
-
-                    rc = vbvaVHWACommandLoadPending(pVGAState, pSSM, u32Version);
+                    bool fLoadCommands = false;
+
+                    if (u32Version < VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA)
+                    {
+                        /* prev versions have a bug that does not allow to distinguish between the sate made with VHWA not available (on solaris box)
+                         * and VHWA disabled */
+
+                        for (uint32_t i = 0; i < pVGAState->cMonitors; ++i)
+                        {
+                            if (VhwaData.ab2DOn[i])
+                            {
+                                fLoadCommands = true;
+                                break;
+                            }
+                        }
+                    }
+                    else
+                        fLoadCommands = true;
+
+                    if (fLoadCommands)
+                    {
+                        rc = vbvaVHWACommandLoadPending(pVGAState, pSSM, u32Version);
+                        AssertRCReturn(rc, rc);
+                    }
+                }
+                else
+                {
+                    rc = VERR_OUT_OF_RESOURCES;
+                }
+#else
+                uint32_t u32;
+
+                for (uint32_t i = 0; i < pVGAState->cMonitors; ++i)
+                {
+                    rc = SSMR3PGetU32(pSSM, &u32);
                     AssertRCReturn(rc, rc);
-                }
-                else
-                {
-                    rc = VERR_OUT_OF_RESOURCES;
-                }
-#else
-                rc = SSMR3SkipToEndOfUnit(pSSM);
-                AssertRCReturn(rc, rc);
+
+                    if (u32 != VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC)
+                    {
+                        LogRel(("2D data while 2D is not supported\n"));
+                        return VERR_NOT_SUPPORTED;
+                    }
+                }
+
+                if (u32Version >= VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA)
+                {
+                    rc = SSMR3GetU32(pSSM, &u32);
+                    AssertRCReturn(rc, rc);
+                }
+
+                if (u32)
+                {
+                    LogRel(("2D pending command while 2D is not supported\n"));
+                    return VERR_NOT_SUPPORTED;
+                }
 #endif
             }
