Index: /trunk/include/VBox/log.h
===================================================================
--- /trunk/include/VBox/log.h	(revision 69001)
+++ /trunk/include/VBox/log.h	(revision 69002)
@@ -570,4 +570,10 @@
     /** Main group, IProgress. */
     LOG_GROUP_MAIN_PROGRESS,
+    /** Main group, IProgressEvent. */
+    LOG_GROUP_MAIN_PROGRESSEVENT,
+    /** Main group, IProgressPercentageChangedEvent. */
+    LOG_GROUP_MAIN_PROGRESSPERCENTAGECHANGEDEVENT,
+    /** Main group, IProgressTaskCompletedEvent. */
+    LOG_GROUP_MAIN_PROGRESSTASKCOMPLETEDEVENT,
     /** Main group, IReusableEvent. */
     LOG_GROUP_MAIN_REUSABLEEVENT,
@@ -1076,4 +1082,7 @@
     "MAIN_PROCESS", \
     "MAIN_PROGRESS", \
+    "MAIN_PROGRESSEVENT", \
+    "MAIN_PROGRESSPERCENTAGECHANGEDEVENT", \
+    "MAIN_PROGRESSTASKCOMPLETEDEVENT", \
     "MAIN_REUSABLEEVENT", \
     "MAIN_RUNTIMEERROREVENT", \
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 69001)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 69002)
@@ -13973,5 +13973,5 @@
   <interface
     name="IProgress" extends="$unknown"
-    uuid="77faf1c0-489d-b123-274c-5a95e77ab286"
+    uuid="e0026dc0-0c55-47b1-aa64-d340a396b418"
     wsmap="managed"
     reservedMethods="1" reservedAttributes="2"
@@ -14109,4 +14109,6 @@
       </desc>
     </attribute>
+
+    <attribute name="eventSource" type="IEventSource" readonly="yes"/>
 
     <method name="setCurrentOperationProgress">
@@ -22256,6 +22258,16 @@
       </desc>
     </const>
+    <const name="OnProgressPercentageChanged" value="98">
+      <desc>
+        See <link to="IProgressPercentageChangedEvent">IProgressPercentageChangedEvent</link>.
+      </desc>
+    </const>
+    <const name="OnProgressTaskCompleted" value="99">
+      <desc>
+        See <link to="IProgressTaskCompletedEvent">IProgressTaskCompletedEvent</link>.
+      </desc>
+    </const>
     <!-- Last event marker -->
-    <const name="Last" value="98">
+    <const name="Last" value="100">
       <desc>
         Must be last event, used for iterations and structures relying on numerical event values.
@@ -24299,4 +24311,35 @@
   </interface>
 
+  <interface
+    name="IProgressEvent" extends="IEvent"
+    uuid="daaf9016-1f04-4191-aa2f-1fac9646ae4c"
+    wsmap="managed" id="ProgressEvent">
+    <desc>Base abstract interface for all progress events.</desc>
+
+    <attribute name="progressId" readonly="yes" type="uuid" mod="string">
+      <desc>GUID of the progress this event relates to.</desc>
+    </attribute>
+
+  </interface>
+
+  <interface
+    name="IProgressPercentageChangedEvent" extends="IProgressEvent"
+    uuid="f05d7e60-1bcf-4218-9807-04e036cc70f1"
+    wsmap="managed" autogen="VBoxEvent" id="OnProgressPercentageChanged">
+    <desc>Progress state change event.</desc>
+
+    <attribute name="percent" readonly="yes" type="long">
+      <desc>New percent</desc>
+    </attribute>
+  </interface>
+
+  <interface
+    name="IProgressTaskCompletedEvent" extends="IProgressEvent"
+    uuid="a5bbdb7d-8ce7-469f-a4c2-6476f581ff72"
+    wsmap="managed" autogen="VBoxEvent" id="OnProgressTaskCompleted">
+    <desc>Progress task completion event.</desc>
+    <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+  </interface>
+
   <module name="VBoxSVC" context="LocalServer">
     <class name="VirtualBox" uuid="B1A7A4F2-47B9-4A1E-82B2-07CCD5323C3F"
Index: /trunk/src/VBox/Main/include/ProgressImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ProgressImpl.h	(revision 69001)
+++ /trunk/src/VBox/Main/include/ProgressImpl.h	(revision 69002)
@@ -22,4 +22,5 @@
 #include "ProgressWrap.h"
 #include "VirtualBoxBase.h"
+#include "EventImpl.h"
 
 #include <iprt/semaphore.h>
@@ -151,5 +152,5 @@
     VirtualBox * const      mParent;
 #endif
-
+    const ComObjPtr<EventSource> pEventSource;
     const ComPtr<IUnknown>  mInitiator;
 
@@ -203,4 +204,5 @@
     HRESULT getTimeout(ULONG *aTimeout);
     HRESULT setTimeout(ULONG aTimeout);
+    HRESULT getEventSource(ComPtr<IEventSource> &aEventSource);
 
     // wrapped IProgress methods
Index: /trunk/src/VBox/Main/src-all/ProgressImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-all/ProgressImpl.cpp	(revision 69001)
+++ /trunk/src/VBox/Main/src-all/ProgressImpl.cpp	(revision 69002)
@@ -42,4 +42,5 @@
 #include "AutoCaller.h"
 
+#include "VBoxEvents.h"
 
 Progress::Progress()
@@ -168,4 +169,9 @@
 
     HRESULT rc = S_OK;
+    rc = unconst(pEventSource).createObject();
+    if (FAILED(rc)) throw rc;
+
+    rc = pEventSource->init();
+    if (FAILED(rc)) throw rc;
 
 //    rc = Progress::init(
@@ -475,4 +481,6 @@
         RTSemEventMultiSignal(mCompletedSem);
 
+    fireProgressTaskCompletedEvent(pEventSource, mId.toUtf16().raw());
+
     return S_OK;
 }
@@ -563,4 +571,7 @@
             vrc = VERR_CANCELLED;
         }
+        ULONG actualPercent = 0;
+        pThis->getPercent(&actualPercent);
+        fireProgressPercentageChangedEvent(pThis->pEventSource, pThis->mId.toUtf16().raw(), actualPercent);
     }
     /* else ignored */
@@ -813,4 +824,8 @@
     m_ulOperationPercent = aPercent;
 
+    ULONG actualPercent = 0;
+    getPercent(&actualPercent);
+    fireProgressPercentageChangedEvent(pEventSource, mId.toUtf16().raw(), actualPercent);
+
     return S_OK;
 }
@@ -847,4 +862,8 @@
     if (mWaitersCount > 0)
         RTSemEventMultiSignal(mCompletedSem);
+
+    ULONG actualPercent = 0;
+    getPercent(&actualPercent);
+    fireProgressPercentageChangedEvent(pEventSource, mId.toUtf16().raw(), actualPercent);
 
     return S_OK;
@@ -1075,4 +1094,10 @@
 }
 
+HRESULT Progress::getEventSource(ComPtr<IEventSource> &aEventSource)
+{
+    /* event source is const, no need to lock */
+    pEventSource.queryInterfaceTo(aEventSource.asOutParam());
+    return S_OK;
+}
 
 // private internal helpers
