Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 13164)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 13165)
@@ -1001,4 +1001,24 @@
     return VINF_SUCCESS;
 }
+
+#ifdef VBOX_WITH_GUEST_PROPS
+// static
+DECLCALLBACK(void)
+Console::doGuestPropNotification (PVBOXHGCMCALLBACKHDR pHeader)
+{
+    /* No locking, as this is purely a notification which does not make any
+     * changes to the object state. */
+    guestProp::PHOSTCALLBACKDATA pCBData
+        = reinterpret_cast<guestProp::PHOSTCALLBACKDATA>(pHeader);
+    AssertReturnVoid(VBOXHGCMCALLBACKMAGIC == pCBData->hdr.u32Magic);
+    AssertReturnVoid(sizeof(guestProp::HOSTCALLBACKDATA) == pCBData->hdr.cbStruct);
+    ComObjPtr <Console> pConsole = reinterpret_cast <Console *> (pCBData->hdr.pvData);
+    pConsole->mControl->PushGuestProperty(Bstr(pCBData->pcszName),
+                                          Bstr(pCBData->pcszValue),
+                                          pCBData->u64Timestamp,
+                                          Bstr(pCBData->pcszFlags));
+}
+#endif
+
 
 // IConsole properties
Index: /trunk/src/VBox/Main/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 13164)
+++ /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 13165)
@@ -1810,4 +1810,11 @@
             pConsole->mVMMDev->hgcmHostCall ("VBoxGuestPropSvc", guestProp::SET_CFGM_NODE, 3, &parms[0]);
 
+            /* Register the host notification callback */
+            parms[0].type = VBOX_HGCM_SVC_PARM_CALLBACK;
+            parms[0].u.callback.pFunction = Console::doGuestPropNotification;
+            parms[0].u.callback.pvData = pvConsole;
+
+            pConsole->mVMMDev->hgcmHostCall ("VBoxGuestPropSvc", guestProp::REGISTER_CALLBACK, 1, &parms[0]);
+
             Log(("Set VBoxGuestPropSvc property store\n"));
         }
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 13164)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 13165)
@@ -8926,4 +8926,5 @@
     LogFlowThisFunc (("\n"));
 
+#ifdef VBOX_WITH_GUEST_PROPS
     AutoCaller autoCaller (this);
     AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
@@ -8957,4 +8958,7 @@
     mHWData->mPropertyServiceActive = true;
     return S_OK;
+#else
+    return VERR_NOT_IMPLEMENTED;
+#endif
 }
 
@@ -8965,4 +8969,6 @@
 {
     LogFlowThisFunc (("\n"));
+
+#ifdef VBOX_WITH_GUEST_PROPS
     AutoCaller autoCaller (this);
     AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
@@ -9006,4 +9012,50 @@
     mData->mRegistered = TRUE;
     return S_OK;
+#else
+    return VERR_NOT_IMPLEMENTED;
+#endif
+}
+
+STDMETHODIMP SessionMachine::PushGuestProperty (INPTR BSTR aName, INPTR BSTR aValue,
+                                                ULONG64 aTimestamp, INPTR BSTR aFlags)
+{
+    LogFlowThisFunc (("\n"));
+
+#ifdef VBOX_WITH_GUEST_PROPS
+    if (!VALID_PTR(aName))
+        return E_INVALIDARG;
+    if ((aValue != NULL) && (!VALID_PTR(aValue) || !VALID_PTR(aFlags)))
+        return E_INVALIDARG;  /* aValue can be NULL to indicate deletion */
+
+    AutoCaller autoCaller (this);
+    CheckComRCReturnRC (autoCaller.rc());
+
+    AutoWriteLock alock (this);
+
+    HRESULT rc = checkStateDependency (MutableStateDep);
+    CheckComRCReturnRC (rc);
+
+    mHWData.backup();
+    for (HWData::GuestPropertyList::iterator iter = mHWData->mGuestProperties.begin();
+         iter != mHWData->mGuestProperties.end(); ++iter)
+        if (aName == iter->mName)
+        {
+            mHWData->mGuestProperties.erase(iter);
+            break;
+        }
+    if (aValue != NULL)
+    {
+        HWData::GuestProperty property = { aName, aValue, aTimestamp, aFlags };
+        mHWData->mGuestProperties.push_back(property);
+    }
+
+    /* send a callback notification if appropriate */
+    alock.leave();
+    // doGuestPropertyCallback(aName, aValue, aFlags);
+
+    return S_OK;
+#else
+    return VERR_NOT_IMPLEMENTED;
+#endif
 }
 
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 13164)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 13165)
@@ -2251,5 +2251,5 @@
   <interface
      name="IInternalMachineControl" extends="$unknown"
-     uuid="de04566a-7125-444b-949e-34e9f3ec3676"
+     uuid="4042ddf2-93d3-4749-8517-dde3f17ea630"
      internal="yes"
      wsmap="suppress"
@@ -2527,10 +2527,10 @@
       <param name="name" type="wstring" dir="in" safearray="yes">
         <desc>
-          The names of the properties returned.
+          The names of the properties.
         </desc>
       </param>
       <param name="value" type="wstring" dir="in" safearray="yes">
         <desc>
-          The values of the properties returned.  The array entries match the
+          The values of the properties.  The array entries match the
           corresponding entries in the @a name array.
         </desc>
@@ -2538,5 +2538,5 @@
       <param name="timestamp" type="unsigned long long" dir="in" safearray="yes">
         <desc>
-          The timestamps of the properties returned.  The array entries match
+          The timestamps of the properties.  The array entries match
           the corresponding entries in the @a name array.
         </desc>
@@ -2544,6 +2544,31 @@
       <param name="flags" type="wstring" dir="in" safearray="yes">
         <desc>
-          The flags of the properties returned.  The array entries match the
+          The flags of the properties.  The array entries match the
           corresponding entries in the @a name array.
+        </desc>
+      </param>
+    </method>
+    <method name="pushGuestProperty">
+      <desc>
+        Update a single guest property in IMachine.
+      </desc>
+      <param name="name" type="wstring" dir="in">
+        <desc>
+          The name of the property to be updated.
+        </desc>
+      </param>
+      <param name="value" type="wstring" dir="in">
+        <desc>
+          The value of the property.
+        </desc>
+      </param>
+      <param name="timestamp" type="unsigned long long" dir="in">
+        <desc>
+          The timestamp of the property.
+        </desc>
+      </param>
+      <param name="flags" type="wstring" dir="in">
+        <desc>
+          The flags of the property.
         </desc>
       </param>
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 13164)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 13165)
@@ -41,4 +41,7 @@
 #include <VBox/vrdpapi.h>
 #include <VBox/pdmdrv.h>
+#ifdef VBOX_WITH_GUEST_PROPS
+# include <VBox/HostServices/GuestPropertySvc.h>  /* For the property notification callback */
+#endif
 
 struct VUSBIRHCONFIG;
@@ -485,4 +488,8 @@
     static DECLCALLBACK(int)    loadStateFileExec (PSSMHANDLE pSSM, void *pvUser, uint32_t u32Version);
 
+#ifdef VBOX_WITH_GUEST_PROPS
+    static DECLCALLBACK(void)   doGuestPropNotification (PVBOXHGCMCALLBACKHDR pHeader);
+#endif
+
     bool mSavedStateDataLoaded : 1;
 
Index: /trunk/src/VBox/Main/include/MachineImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MachineImpl.h	(revision 13164)
+++ /trunk/src/VBox/Main/include/MachineImpl.h	(revision 13165)
@@ -845,4 +845,6 @@
     STDMETHOD(PushGuestProperties) (ComSafeArrayIn(INPTR BSTR, aNames), ComSafeArrayIn(INPTR BSTR, aValues),
               ComSafeArrayIn(ULONG64, aTimestamps), ComSafeArrayIn(INPTR BSTR, aFlags));
+    STDMETHOD(PushGuestProperty) (INPTR BSTR aName, INPTR BSTR aValue,
+                                  ULONG64 aTimestamp, INPTR BSTR aFlags);
 
     // public methods only for internal purposes
