Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 30552)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 30553)
@@ -337,4 +337,15 @@
 };
 
+
+#define PREP_ARGS0()
+#define PREP_ARGS1(a1)                       a1
+#define PREP_ARGS2(a1,a2)                    a2, a2
+#define PREP_ARGS3(a1,a2,a3)                 a1, a2, a3
+#define PREP_ARGS4(a1,a2,a3,a4)              a1, a2, a3, a4
+#define PREP_ARGS5(a1,a2,a3,a4,a5)           a1, a2, a3, a4, a5
+#define PREP_ARGS6(a1,a2,a3,a4,a5,a6)        a1, a2, a3, a4, a5, a6
+#define PREP_ARGS7(a1,a2,a3,a4,a5,a6,a7)     a1, a2, a3, a4, a5, a6, a7
+#define PREP_ARGS8(a1,a2,a3,a4,a5,a6,a7,a8)  a1, a2, a3, a4, a5, a6, a7, a8
+
 #ifdef RT_OS_WINDOWS
 
@@ -342,5 +353,5 @@
  * Macro used to prepare for COM event firing, note CComObjectRootEx locking.
  */
-#define CONSOLE_EVENTS_START(name,count)        \
+#define CONSOLE_COM_EVENTS_START(name,count)    \
    {                                            \
       ComEventDesc evDesc;                      \
@@ -356,5 +367,5 @@
  * must be synchronized with CComObjectRootEx Lock()/Unlock() methods.
  */
-#define CONSOLE_EVENTS_END()                                    \
+#define CONSOLE_COM_EVENTS_END()                                \
     for (int i=0; i<nConnections; i++)                          \
     {                                                           \
@@ -376,31 +387,30 @@
  * member template add(), and every add() here could be, ofc, different function.
  */
-#define PREP_ARGS0()
-#define PREP_ARGS1(a1)                      if (nConnections) evDesc.add(a1)
-#define PREP_ARGS2(a1,a2)                   if (nConnections) evDesc.add(a1).add(a2)
-#define PREP_ARGS3(a1,a2,a3)                if (nConnections) evDesc.add(a1).add(a2).add(a3)
-#define PREP_ARGS4(a1,a2,a3,a4)             if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4)
-#define PREP_ARGS5(a1,a2,a3,a4,a5)          if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5)
-#define PREP_ARGS6(a1,a2,a3,a4,a5,a6)       if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6)
-#define PREP_ARGS7(a1,a2,a3,a4,a5,a6,a7)    if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7)
-#define PREP_ARGS8(a1,a2,a3,a4,a5,a6,a7,a8) if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8)
+#define PREP_COM_ARGS0()
+#define PREP_COM_ARGS1(a1)                      if (nConnections) evDesc.add(a1)
+#define PREP_COM_ARGS2(a1,a2)                   if (nConnections) evDesc.add(a1).add(a2)
+#define PREP_COM_ARGS3(a1,a2,a3)                if (nConnections) evDesc.add(a1).add(a2).add(a3)
+#define PREP_COM_ARGS4(a1,a2,a3,a4)             if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4)
+#define PREP_COM_ARGS5(a1,a2,a3,a4,a5)          if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5)
+#define PREP_COM_ARGS6(a1,a2,a3,a4,a5,a6)       if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6)
+#define PREP_COM_ARGS7(a1,a2,a3,a4,a5,a6,a7)    if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7)
+#define PREP_COM_ARGS8(a1,a2,a3,a4,a5,a6,a7,a8) if (nConnections) evDesc.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8)
 
 #else
 
 /**
- * No events for XPCOM targets now. In the future it looks natural to implmenet generic events mechanism
- * for all platforms and get rid of callbacks.
+ * No COM events for XPCOM targets ofc.
  */
-#define CONSOLE_EVENTS_START(name,count)
-#define CONSOLE_EVENTS_END()
-#define PREP_ARGS0()
-#define PREP_ARGS1(a1)
-#define PREP_ARGS2(a1,a2)
-#define PREP_ARGS3(a1,a2,a3)
-#define PREP_ARGS4(a1,a2,a3,a4)
-#define PREP_ARGS5(a1,a2,a3,a4,a5)
-#define PREP_ARGS6(a1,a2,a3,a4,a5,a6)
-#define PREP_ARGS7(a1,a2,a3,a4,a5,a6,a7)
-#define PREP_ARGS8(a1,a2,a3,a4,a5,a6,a7,a8)
+#define CONSOLE_COM_EVENTS_START(name,count)
+#define CONSOLE_COM_EVENTS_END()
+#define PREP_COM_ARGS0()
+#define PREP_COM_ARGS1(a1)
+#define PREP_COM_ARGS2(a1,a2)
+#define PREP_COM_ARGS3(a1,a2,a3)
+#define PREP_COM_ARGS4(a1,a2,a3,a4)
+#define PREP_COM_ARGS5(a1,a2,a3,a4,a5)
+#define PREP_COM_ARGS6(a1,a2,a3,a4,a5,a6)
+#define PREP_COM_ARGS7(a1,a2,a3,a4,a5,a6,a7)
+#define PREP_COM_ARGS8(a1,a2,a3,a4,a5,a6,a7,a8)
 
 #endif
@@ -424,10 +434,13 @@
  * @param   Args                Number of callback arguments
  */
-#define CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, InvokeCb, PrepEvent, Args) \
+#define CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, Argc, Args, PrepComArgs, MaybeComma) \
     do \
     { \
-        CONSOLE_EVENTS_START(CallbackMethod,Args);   \
-        PrepEvent; \
-        CONSOLE_EVENTS_END();  \
+        CONSOLE_COM_EVENTS_START(CallbackMethod,Argc);   \
+        PrepComArgs; \
+        CONSOLE_COM_EVENTS_END();  \
+        VBoxEventDesc evDesc; \
+        evDesc.init(mEventSource, VBoxEventType_##CallbackMethod MaybeComma Args);     \
+        evDesc.fire(/* don't wait for delivery */ 0); \
         CallbackList::iterator it = this->mCallbacks.begin(); \
         while (it != this->mCallbacks.end()) \
@@ -435,5 +448,5 @@
             if (it->isWanted(ConsoleCallbackRegistration::k ## CallbackMethod)) \
             { \
-                HRESULT hrc = InvokeCb;                   \
+                HRESULT hrc = it->ptrICb-> CallbackMethod (Args);                   \
                 hrc = it->handleResult(ConsoleCallbackRegistration::k ## CallbackMethod, hrc); \
                 if (FAILED_DEAD_INTERFACE(hrc)) \
@@ -447,19 +460,21 @@
     } while (0)
 
-/* Actual invocation macro for different number of parameters */
+#define COMMA ,
+#define NO_COMMA
+/* Actual invocation macroses for different number of parameters */
 #define CONSOLE_DO_CALLBACKS0(CallbackMethod)                           \
-     CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (), PREP_ARGS0(), 0)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod,  0, PREP_ARGS0(), PREP_COM_ARGS0(), NO_COMMA)
 #define CONSOLE_DO_CALLBACKS1(CallbackMethod,Arg1)                      \
-    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (Arg1), PREP_ARGS1(Arg1), 1)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, 1, PREP_ARGS1(Arg1), PREP_COM_ARGS1(Arg1), COMMA)
 #define CONSOLE_DO_CALLBACKS2(CallbackMethod,Arg1,Arg2)                 \
-    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (Arg1,Arg2), PREP_ARGS2(Arg1,Arg2), 2)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, 2, PREP_ARGS2(Arg1,Arg2),PREP_COM_ARGS2(Arg1,Arg2), COMMA)
 #define CONSOLE_DO_CALLBACKS3(CallbackMethod,Arg1,Arg2,Arg3)            \
-    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (Arg1,Arg2,Arg3), PREP_ARGS3(Arg1,Arg2,Arg3), 3)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, 3, PREP_ARGS3(Arg1,Arg2,Arg3), PREP_COM_ARGS3(Arg1,Arg2,Arg3), COMMA)
 #define CONSOLE_DO_CALLBACKS4(CallbackMethod,Arg1,Arg2,Arg3,Arg4)       \
-    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (Arg1,Arg2,Args3,Arg4), PREP_ARGS4(Arg1,Arg2,Arg3,Arg4), 4)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, 4, PREP_ARGS4(Arg1,Arg2,Arg3,Arg4), PREP_COM_ARGS4(Arg1,Arg2,Arg3,Arg4), COMMA)
 #define CONSOLE_DO_CALLBACKS7(CallbackMethod,Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7) \
-    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7), PREP_ARGS7(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7), 7)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, 7, PREP_ARGS7(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7), PREP_COM_ARGS7(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7), COMMA)
 #define CONSOLE_DO_CALLBACKS8(CallbackMethod,Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8) \
-    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, it->ptrICb-> CallbackMethod (Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8), PREP_ARGS8(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8), 8)
+    CONSOLE_DO_CALLBACKS_GEN(CallbackMethod, 8, PREP_ARGS8(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8), PREP_COM_ARGS8(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7, Arg8), COMMA)
 
 // constructor / destructor
@@ -4938,4 +4953,6 @@
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     CallbackList::iterator it = mCallbacks.begin();
+    VBoxEventDesc evDesc;
+
     if (aCheck)
     {
@@ -4958,5 +4975,30 @@
             ++it;
         }
-        *aCanShow = TRUE;
+        evDesc.init(mEventSource, VBoxEventType_OnCanShowWindow);
+        BOOL fDelivered = evDesc.fire(10000); /* Wait up to 10 secs for delivery */
+        Assert(fDelivered);
+        if (fDelivered)
+        {
+            ComPtr<IEvent> aEvent;
+            evDesc.getEvent(aEvent.asOutParam());
+            // bit clumsy
+            ComPtr<ICanShowWindowEvent> aCanShowEvent = aEvent;
+            if (aCanShowEvent)
+            {
+                BOOL fVetoed = FALSE;
+                aCanShowEvent->IsVetoed(&fVetoed);
+                *aCanShow = !fVetoed;
+            }
+            else
+            {
+                Assert(FALSE);
+                *aCanShow = TRUE;
+            }
+        }
+        else
+        {
+            Assert(FALSE);
+            *aCanShow = TRUE;
+        }
     }
     else
@@ -4985,4 +5027,29 @@
             ++it;
         }
+#if 1
+        evDesc.init(mEventSource, VBoxEventType_OnShowWindow);
+        ComPtr<IEvent> aEvent;
+        evDesc.getEvent(aEvent.asOutParam());
+        ComPtr<IShowWindowEvent> aShowEvent = aEvent;
+        if (aShowEvent)
+            aShowEvent->COMSETTER(WinId)(0);
+        
+        BOOL fDelivered = evDesc.fire(10000); /* Wait up to 10 secs for delivery */
+        Assert(fDelivered);
+        if (fDelivered)
+        {
+            ULONG64 aEvWinId = 0;
+            if (aShowEvent)
+            {
+                aShowEvent->COMGETTER(WinId)(&aEvWinId);
+                if (aEvWinId != 0)
+                    *aWinId = aEvWinId;
+            }
+            else
+                Assert(FALSE);
+        }
+        else
+            Assert(FALSE);
+ #endif
     }
 
Index: /trunk/src/VBox/Main/EventImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/EventImpl.cpp	(revision 30552)
+++ /trunk/src/VBox/Main/EventImpl.cpp	(revision 30553)
@@ -99,8 +99,4 @@
 void VBoxEvent::uninit()
 {
-    AutoUninitSpan autoUninitSpan(this);
-    if (autoUninitSpan.uninitDone())
-        return;
-
     if (!m)
         return;
@@ -258,8 +254,4 @@
 void VBoxVetoEvent::uninit()
 {
-    AutoUninitSpan autoUninitSpan(this);
-    if (autoUninitSpan.uninitDone())
-        return;
-
     VBoxEvent::uninit();
     if (!m)
@@ -717,5 +709,8 @@
         uint32_t cListeners = listeners.size();
         if (cListeners == 0)
+        {
+            aEvent->SetProcessed();
             break; // just leave the lock and update event object state
+        }
 
         PendingEventsMap::iterator pit;
@@ -892,4 +887,6 @@
 NS_DECL_CLASSINFO(VBoxEvent)
 NS_IMPL_THREADSAFE_ISUPPORTS1_CI(VBoxEvent, IEvent)
+NS_DECL_CLASSINFO(VBoxVetoEvent)
+NS_IMPL_ISUPPORTS_INHERITED1(VBoxVetoEvent, VBoxEvent, IVetoEvent)
 #endif
 
Index: /trunk/src/VBox/Main/VirtualBoxImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/VirtualBoxImpl.cpp	(revision 30552)
+++ /trunk/src/VBox/Main/VirtualBoxImpl.cpp	(revision 30553)
@@ -2749,4 +2749,29 @@
         ++it;
     }
+
+    VBoxEventDesc evDesc;
+    evDesc.init(m->pEventSource, VBoxEventType_OnExtraDataCanChange, id.raw(), aKey, aValue);
+    BOOL fDelivered = evDesc.fire(10000); /* Wait up to 10 secs for delivery */
+    Assert(fDelivered);
+    if (fDelivered)
+    {
+        ComPtr<IEvent> aEvent;
+        evDesc.getEvent(aEvent.asOutParam());
+        ComPtr<IExtraDataCanChangeEvent> aCanChangeEvent = aEvent;
+        Assert(aCanChangeEvent);
+        BOOL fVetoed = FALSE;
+        aCanChangeEvent->IsVetoed(&fVetoed);
+        allowChange = !fVetoed;
+
+        if (!allowChange)
+        {
+            SafeArray<BSTR> aVetos;
+            aCanChangeEvent->GetVetos(ComSafeArrayAsOutParam(aVetos));
+            if (aVetos.size() > 0)
+                aError = aVetos[0];
+        }
+    }
+    else
+        allowChange = TRUE;
 
     LogFlowThisFunc(("allowChange=%RTbool\n", allowChange));
@@ -4688,17 +4713,10 @@
 #endif
 
-#if 1
-    // We disable generic events firing for now to not harm performance, but it is already functional
     {
         VBoxEventDesc evDesc;
         prepareEventDesc(mVirtualBox->m->pEventSource, evDesc);
-        ComPtr<IEvent> aEvent;
-        BOOL fDelivered;
-
-        evDesc.getEvent(aEvent.asOutParam());
-        if (aEvent && mVirtualBox && mVirtualBox->m->pEventSource)
-            mVirtualBox->m->pEventSource->FireEvent(aEvent, /* don't wait for delivery */ 0, &fDelivered);
-    }
-#endif
+
+        evDesc.fire(/* don't wait for delivery */0);
+    }
 
     for (CallbackList::const_iterator it = callbacks.begin();
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 30552)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 30553)
@@ -15608,7 +15608,7 @@
 
   <interface
-      name="ICanExtraDataChangeEvent" extends="IVetoEvent"
+      name="IExtraDataCanChangeEvent" extends="IVetoEvent"
       uuid="245d88bd-800a-40f8-87a6-170d02249a55"
-      wsmap="managed" id="OnExtraDataCanChange"
+      wsmap="managed" autogen="VBoxEvent" id="OnExtraDataCanChange"
       waitable="true"
       >
@@ -15639,5 +15639,5 @@
       name="ICanShowWindowEvent" extends="IVetoEvent"
       uuid="adf292b0-92c9-4a77-9d35-e058b39fe0b9"
-      wsmap="managed" id="OnCanShowWindow"
+      wsmap="managed" autogen="VBoxEvent" id="OnCanShowWindow"
       waitable="true"
       >
Index: /trunk/src/VBox/Main/idl/comimpl.xsl
===================================================================
--- /trunk/src/VBox/Main/idl/comimpl.xsl	(revision 30552)
+++ /trunk/src/VBox/Main/idl/comimpl.xsl	(revision 30553)
@@ -366,5 +366,5 @@
       <xsl:value-of select="       '    }&#10;'" />
     </xsl:if>
-   
+
     <xsl:value-of select="       '    // purely internal setter&#10;'" />
     <xsl:value-of select="concat('    int set_', @name,'(',$pTypeNameIn, ') {&#10;')" />
@@ -400,4 +400,5 @@
 <xsl:template name="genEventImpl">
   <xsl:param name="implName" />
+  <xsl:param name="isVeto" />
 
   <xsl:value-of select="concat('class ATL_NO_VTABLE ',$implName,
@@ -424,34 +425,62 @@
     STDMETHOD(COMGETTER(Type)) (VBoxEventType_T *aType)
     {
-        return mEvent->COMGETTER(Type) (aType);
+        return ((VBoxEvent*)mEvent)->COMGETTER(Type) (aType);
     }
     STDMETHOD(COMGETTER(Source)) (IEventSource * *aSource)
     {
-        return mEvent->COMGETTER(Source) (aSource);
+        return ((VBoxEvent*)mEvent)->COMGETTER(Source) (aSource);
     }
     STDMETHOD(COMGETTER(Waitable)) (BOOL *aWaitable)
     {
-        return mEvent->COMGETTER(Waitable) (aWaitable);
+        return ((VBoxEvent*)mEvent)->COMGETTER(Waitable) (aWaitable);
     }
     STDMETHOD(SetProcessed)()
     {
-       return mEvent->SetProcessed();
+       return ((VBoxEvent*)mEvent)->SetProcessed();
     }
     STDMETHOD(WaitProcessed)(LONG aTimeout, BOOL *aResult)
     {
-        return mEvent->WaitProcessed(aTimeout, aResult);
-    }
+        return ((VBoxEvent*)mEvent)->WaitProcessed(aTimeout, aResult);
+    }
+    void uninit()
+    {
+        mEvent->uninit();
+    }
+]]></xsl:text>
+  <xsl:choose>
+    <xsl:when test="$isVeto">
+<xsl:text><![CDATA[
+    HRESULT init (IEventSource* aSource, VBoxEventType_T aType, BOOL aWaitable = TRUE)
+    {
+        NOREF(aWaitable);
+        return mEvent->init(aSource, aType);
+    }
+    STDMETHOD(AddVeto)(IN_BSTR aVeto)
+    {
+        return mEvent->AddVeto(aVeto);
+    }
+    STDMETHOD(IsVetoed)(BOOL *aResult)
+    {
+       return mEvent->IsVetoed(aResult);
+    }
+    STDMETHOD(GetVetos)(ComSafeArrayOut(BSTR, aVetos))
+    {
+       return mEvent->GetVetos(ComSafeArrayOutArg(aVetos));
+    }
+private:
+]]></xsl:text>
+      <xsl:value-of select="       '    ComObjPtr&lt;VBoxVetoEvent&gt;      mEvent;&#10;'" />
+    </xsl:when>
+    <xsl:otherwise>
+<xsl:text><![CDATA[
     HRESULT init (IEventSource* aSource, VBoxEventType_T aType, BOOL aWaitable)
     {
         return mEvent->init(aSource, aType, aWaitable);
     }
-    void uninit()
-    {
-        mEvent->uninit();
-    }
+private:
 ]]></xsl:text>
-  <xsl:value-of select="       'private:&#10;'" />
-  <xsl:value-of select="       '    ComObjPtr&lt;VBoxEvent&gt;      mEvent;&#10;'" />
-
+      <xsl:value-of select="       '    ComObjPtr&lt;VBoxEvent&gt;      mEvent;&#10;'" />
+    </xsl:otherwise>
+  </xsl:choose>
   <xsl:call-template name="genAttrCode">
     <xsl:with-param name="name" select="@name" />
@@ -486,5 +515,5 @@
   <xsl:value-of select="concat('              ComObjPtr&lt;', $implName, '&gt; obj;&#10;')"/>
   <xsl:value-of select="       '              obj.createObject();&#10;'"/>
-  <xsl:value-of select="concat('              obj->init(source, aType, ', $waitable, ');&#10;')"/>
+  <xsl:value-of select="concat('              obj->init(aSource, aType, ', $waitable, ');&#10;')"/>
   <xsl:call-template name="genAttrInitCode">
     <xsl:with-param name="name" select="@name" />
@@ -498,7 +527,9 @@
 <xsl:template name="genCommonEventCode">
   <xsl:text><![CDATA[
-HRESULT VBoxEventDesc::init(IEventSource* source, VBoxEventType_T aType, ...)
+HRESULT VBoxEventDesc::init(IEventSource* aSource, VBoxEventType_T aType, ...)
 {
     va_list args;
+
+    mEventSource = aSource;
     va_start(args, aType);
     switch (aType)
@@ -548,6 +579,10 @@
     <xsl:choose>
       <xsl:when test="$G_kind='VBoxEvent'">
+        <xsl:variable name="isVeto">
+          <xsl:value-of select="@extends='IVetoEvent'" />
+        </xsl:variable>
         <xsl:call-template name="genEventImpl">
           <xsl:with-param name="implName" select="$implName" />
+          <xsl:with-param name="isVeto" select="$isVeto" />
         </xsl:call-template>
       </xsl:when>
Index: /trunk/src/VBox/Main/include/EventImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/EventImpl.h	(revision 30552)
+++ /trunk/src/VBox/Main/include/EventImpl.h	(revision 30553)
@@ -95,4 +95,28 @@
     HRESULT init (IEventSource *aSource, VBoxEventType_T aType);
     void uninit();
+
+    // IEvent properties
+    STDMETHOD(COMGETTER(Type)) (VBoxEventType_T *aType)
+    {
+        return VBoxEvent::COMGETTER(Type)(aType);
+    }
+    STDMETHOD(COMGETTER(Source)) (IEventSource * *aSource)
+    {
+        return VBoxEvent::COMGETTER(Source)(aSource);
+    }
+    STDMETHOD(COMGETTER(Waitable)) (BOOL *aWaitable)
+    {
+        return VBoxEvent::COMGETTER(Waitable)(aWaitable);
+    }
+
+    // IEvent methods
+    STDMETHOD(SetProcessed)()
+    {
+        return VBoxEvent::SetProcessed();
+    }
+    STDMETHOD(WaitProcessed)(LONG aTimeout, BOOL *aResult)
+    {
+        return VBoxEvent::WaitProcessed(aTimeout, aResult);
+    }
 
      // IVetoEvent methods
@@ -186,6 +210,19 @@
  }
 
-private:
- ComPtr<IEvent>  mEvent;
+ BOOL fire(LONG aTimeout)
+ {
+     if (mEventSource && mEvent)
+     {
+         BOOL fDelivered = FALSE;
+         int rc = mEventSource->FireEvent(mEvent, aTimeout, &fDelivered);
+         AssertRCReturn(rc, FALSE);
+         return fDelivered;
+     }
+     return FALSE;
+ }
+
+private:
+ ComPtr<IEvent>        mEvent;
+ ComPtr<IEventSource>  mEventSource;
 };
 
