Index: trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 36168)
+++ trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 36178)
@@ -619,7 +619,8 @@
                                                            ComSafeArrayOut(BSTR, aFlags));
 
-    bool enabledGuestPropertiesVRDP(void);
-    void updateGuestPropertiesVRDPLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain);
-    void updateGuestPropertiesVRDPDisconnect(uint32_t u32ClientId);
+    void guestPropertiesHandleVMReset(void);
+    bool guestPropertiesVRDPEnabled(void);
+    void guestPropertiesVRDPUpdateLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain);
+    void guestPropertiesVRDPUpdateDisconnect(uint32_t u32ClientId);
 #endif
 
Index: trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 36168)
+++ trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 36178)
@@ -673,25 +673,54 @@
 #ifdef VBOX_WITH_GUEST_PROPS
 
-bool Console::enabledGuestPropertiesVRDP(void)
+/**
+ * Handles guest properties on a VM reset.
+ * At the moment we only delete properties which have the flag
+ * "TRARESET".
+ */
+void Console::guestPropertiesHandleVMReset(void)
+{
+    com::SafeArray<BSTR>   arrNames;
+    com::SafeArray<BSTR>   arrValues;
+    com::SafeArray<LONG64> arrTimestamps;
+    com::SafeArray<BSTR>   arrFlags;
+    HRESULT hrc = enumerateGuestProperties(Bstr("*").raw(),
+                                           ComSafeArrayAsOutParam(arrNames),
+                                           ComSafeArrayAsOutParam(arrValues),
+                                           ComSafeArrayAsOutParam(arrTimestamps),
+                                           ComSafeArrayAsOutParam(arrFlags));
+    if (SUCCEEDED(hrc))
+    {
+        for (size_t i = 0; i < arrFlags.size(); i++)
+        {
+            /* Delete all properties which have the flag "TRARESET". */
+            if (Utf8Str(arrFlags[i]).contains("TRANSIENT_RESET", Utf8Str::CaseInsensitive))
+            {
+                hrc = mMachine->SetGuestProperty(arrNames[i], Bstr("").raw() /* Value */,
+                                                 Bstr("").raw() /* Flags */);
+                if (FAILED(hrc))
+                    LogRel(("RESET: Could not delete transient property \"%ls\", rc=%Rhrc\n",
+                            arrNames[i], hrc));
+            }
+        }
+    }
+    else
+        LogRel(("RESET: Unable to enumerate guest properties, rc=%Rhrc\n", hrc));
+}
+
+bool Console::guestPropertiesVRDPEnabled(void)
 {
     Bstr value;
     HRESULT hrc = mMachine->GetExtraData(Bstr("VBoxInternal2/EnableGuestPropertiesVRDP").raw(),
                                          value.asOutParam());
-    if (hrc == S_OK)
-    {
-        if (value == "1")
-        {
-            return true;
-        }
-    }
+    if (   hrc   == S_OK
+        && value == "1")
+        return true;
     return false;
 }
 
-void Console::updateGuestPropertiesVRDPLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain)
-{
-    if (!enabledGuestPropertiesVRDP())
-    {
+void Console::guestPropertiesVRDPUpdateLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain)
+{
+    if (!guestPropertiesVRDPEnabled())
         return;
-    }
 
     char szPropNm[256];
@@ -725,7 +754,7 @@
 }
 
-void Console::updateGuestPropertiesVRDPDisconnect(uint32_t u32ClientId)
-{
-    if (!enabledGuestPropertiesVRDP())
+void Console::guestPropertiesVRDPUpdateDisconnect(uint32_t u32ClientId)
+{
+    if (!guestPropertiesVRDPEnabled())
         return;
 
@@ -961,5 +990,5 @@
 
 #ifdef VBOX_WITH_GUEST_PROPS
-    updateGuestPropertiesVRDPLogon(u32ClientId, pszUser, pszDomain);
+    guestPropertiesVRDPUpdateLogon(u32ClientId, pszUser, pszDomain);
 #endif /* VBOX_WITH_GUEST_PROPS */
 
@@ -1096,5 +1125,5 @@
 
 #ifdef VBOX_WITH_GUEST_PROPS
-    updateGuestPropertiesVRDPDisconnect(u32ClientId);
+    guestPropertiesVRDPUpdateDisconnect(u32ClientId);
 #endif /* VBOX_WITH_GUEST_PROPS */
 
@@ -6768,4 +6797,13 @@
                     break;
             }
+            break;
+        }
+
+        case VMSTATE_RESETTING:
+        {
+    #ifdef VBOX_WITH_GUEST_PROPS
+            /* Do not take any read/write locks here! */
+            that->guestPropertiesHandleVMReset();
+    #endif
             break;
         }
Index: trunk/src/VBox/Main/src-server/MachineImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 36168)
+++ trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 36178)
@@ -5009,5 +5009,6 @@
                       /** @todo Fix when adding DeleteGuestProperty(),
                                    see defect. */
-                      *aValue ? aValue : NULL, aFlags, true /* isSetter */,
+                      *aValue ? aValue : NULL, *aFlags ? aFlags : NULL,
+                      true /* isSetter */,
                       &dummy, &dummy64, &dummy);
     }
@@ -8652,5 +8653,6 @@
                     || mData->mMachineState == MachineState_Aborted
                     || mData->mMachineState == MachineState_Teleported)
-                && property.mFlags & guestProp::TRANSIENT)
+                && (   property.mFlags & guestProp::TRANSIENT
+                    || property.mFlags & guestProp::TRANSIENT_RESET))
                 continue;
             settings::GuestProperty prop;
@@ -12217,5 +12219,6 @@
             for (it = mHWData->mGuestProperties.begin();
                  it != mHWData->mGuestProperties.end(); ++it)
-                if (it->mFlags & guestProp::TRANSIENT)
+                if (   (it->mFlags & guestProp::TRANSIENT)
+                    || (it->mFlags & guestProp::TRANSIENT_RESET))
                 {
                     fNeedsSaving = true;
