Hi Sergiu,
 First let me say this is cool! :)
 Some minor comments below.
 On Mar 4, 2008, at 10:55 PM, sdumitriu (SVN) wrote:
  Author: sdumitriu
 Date: 2008-03-04 22:55:30 +0100 (Tue, 04 Mar 2008)
 New Revision: 8200
 Modified:
  xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
 XWiki.java
  xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
 web/XWikiAction.java
 Log:
 XWIKI-1522: Rewrite the notification mechanism
 Notifications are sent
 Modified: xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/
 xwiki/XWiki.java
 ===================================================================
 --- xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
 XWiki.java     2008-03-04 18:33:04 UTC (rev 8199)
 +++ xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
 XWiki.java     2008-03-04 21:55:30 UTC (rev 8200)
 @@ -76,6 +76,11 @@
 import org.exoplatform.container.RootContainer;
 import org.hibernate.HibernateException;
 import org.securityfilter.filter.URLPatternMatcher;
 +import org.xwiki.observation.ObservationManager;
 +import org.xwiki.observation.event.ActionExecutionEvent;
 +import org.xwiki.observation.event.DocumentDeleteEvent;
 +import org.xwiki.observation.event.DocumentSaveEvent;
 +import org.xwiki.observation.event.DocumentUpdateEvent;
 import com.xpn.xwiki.api.Api;
 import com.xpn.xwiki.api.Document;
 @@ -1070,14 +1075,37 @@
            XWikiDocument originalDocument = doc.getOriginalDocument();
            // Notify listeners about the document change
 -            getNotificationManager().preverify(doc, originalDocument,
 -                XWikiDocChangeNotificationInterface.EVENT_CHANGE,
 context);
 +            if (originalDocument == null ||
 originalDocument.isNew()) {
 +                getNotificationManager().preverify(doc,
 originalDocument,
 +                    XWikiDocChangeNotificationInterface.EVENT_NEW,
 context);
 +            } else {
 +                getNotificationManager().preverify(doc,
 originalDocument,
 +
 XWikiDocChangeNotificationInterface.EVENT_CHANGE, context);
 +            }
            getStore().saveXWikiDoc(doc, context);
 -            // Notify listeners about the document change
 -            getNotificationManager().verify(doc, originalDocument,
 -                XWikiDocChangeNotificationInterface.EVENT_CHANGE,
 context);
 +            try {
 +                ObservationManager om =
 +                    (ObservationManager)
 Utils.getComponent(ObservationManager.ROLE, null,
 +                        context);
 +                // Notify listeners about the document change
 +                if (originalDocument == null ||
 originalDocument.isNew()) {
 +                    getNotificationManager().verify(doc,
 originalDocument,
 +
 XWikiDocChangeNotificationInterface.EVENT_NEW, context);
 +                    if (om != null) {
 +                        om.notify(new
 DocumentSaveEvent(doc.getFullName()), doc, context);
 +                    } 
 It seems you're using both notification mechanisms, which is fine but
 I think this warrants some javadoc explanations.
  +                } else {
 +                    getNotificationManager().verify(doc,
 originalDocument,
 +
 XWikiDocChangeNotificationInterface.EVENT_CHANGE, context);
 +                    if (om != null) {
 +                        om.notify(new
 DocumentUpdateEvent(doc.getFullName()), doc, context);
 +                    }
 +                }
 +            } catch (Exception ex) {
 +                LOG.warn("Failed to send document notifications",
 ex); 
 Our rule is: no stack trace printing for warnings. Only for errors. I
 would consider this an error. Also I would put more information in the
 text like for what document it failed.
  +            }
        } finally {
            if ((server != null) && (database != null)) {
                context.setDatabase(database);
 @@ -3406,8 +3434,16 @@
                true);
        }
        getStore().deleteXWikiDoc(doc, context);
 -        getNotificationManager().verify(new
 XWikiDocument(doc.getSpace(), doc.getName()), doc,
 -            XWikiDocChangeNotificationInterface.EVENT_CHANGE,
 context);
 +        try {
 +            getNotificationManager().verify(new
 XWikiDocument(doc.getSpace(), doc.getName()), doc,
 +                XWikiDocChangeNotificationInterface.EVENT_DELETE,
 context);
 +            ObservationManager om =
 +                (ObservationManager)
 Utils.getComponent(ObservationManager.ROLE, null,
 +                    context);
 +            om.notify(new DocumentDeleteEvent(doc.getFullName()),
 doc, context);
 +        } catch (Exception ex) {
 +            LOG.warn("Failed to send document notifications", ex);
 +        } 
 Same comments here.
     }
    public String getDatabase()
 Modified: xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/
 xwiki/web/XWikiAction.java
 ===================================================================
 --- xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
 web/XWikiAction.java   2008-03-04 18:33:04 UTC (rev 8199)
 +++ xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
 web/XWikiAction.java   2008-03-04 21:55:30 UTC (rev 8200)
 @@ -35,6 +35,8 @@
 import org.apache.struts.action.ActionForward;
 import org.apache.struts.action.ActionMapping;
 import org.apache.velocity.VelocityContext;
 +import org.xwiki.observation.ObservationManager;
 +import org.xwiki.observation.event.ActionExecutionEvent;
 import com.xpn.xwiki.XWiki;
 import com.xpn.xwiki.XWikiContext;
 @@ -284,6 +286,14 @@
                } catch (Throwable e) {
                    e.printStackTrace();
                }
 +                try {
 +                    ObservationManager om =
 +                        (ObservationManager)
 Utils.getComponent(ObservationManager.ROLE, null,
 +                            context);
 +                    om.notify(new
 ActionExecutionEvent(mapping.getName()), context.getDoc(), context);
 +                } catch (Throwable ex) {
 +                    LOG.warn("Cannot send notifications", ex); 
 Same here too.
  +                }
                if (monitor != null) {
                    monitor.endTimer("notify"); 
 Thanks
 -Vincent