diff --git a/nuxeo-core-facade/src/main/java/org/nuxeo/ecm/core/version/ejb/VersioningServiceBean.java b/nuxeo-core-facade/src/main/java/org/nuxeo/ecm/core/version/ejb/VersioningServiceBean.java
--- a/nuxeo-core-facade/src/main/java/org/nuxeo/ecm/core/version/ejb/VersioningServiceBean.java
+++ b/nuxeo-core-facade/src/main/java/org/nuxeo/ecm/core/version/ejb/VersioningServiceBean.java
@@ -68,10 +68,10 @@
     }
 
     @Override
-    public void doPostSave(Document doc, VersioningOption option,
+    public Document doPostSave(Document doc, VersioningOption option,
             String checkinComment, Map<String, Serializable> options)
             throws DocumentException {
-        service.doPostSave(doc, option, checkinComment, options);
+        return service.doPostSave(doc, option, checkinComment, options);
     }
 
     @Override
diff --git a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/api/AbstractSession.java b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/api/AbstractSession.java
--- a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/api/AbstractSession.java
+++ b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/api/AbstractSession.java
@@ -18,6 +18,24 @@
 
 package org.nuxeo.ecm.core.api;
 
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.ADD_CHILDREN;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.BROWSE;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_CHILDREN;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_LIFE_CYCLE;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_PROPERTIES;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_SECURITY;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_VERSION;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.REMOVE;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.REMOVE_CHILDREN;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.SYSTEM_USERNAME;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.UNLOCK;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_LIFE_CYCLE;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_PROPERTIES;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_SECURITY;
+import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_VERSION;
+
 import java.io.InputStream;
 import java.io.Serializable;
 import java.security.Principal;
@@ -97,24 +115,6 @@
 import org.nuxeo.runtime.services.streaming.InputStreamSource;
 import org.nuxeo.runtime.services.streaming.StreamManager;
 
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.ADD_CHILDREN;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.BROWSE;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_CHILDREN;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_LIFE_CYCLE;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_PROPERTIES;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_SECURITY;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.READ_VERSION;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.REMOVE;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.REMOVE_CHILDREN;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.SYSTEM_USERNAME;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.UNLOCK;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_LIFE_CYCLE;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_PROPERTIES;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_SECURITY;
-import static org.nuxeo.ecm.core.api.security.SecurityConstants.WRITE_VERSION;
-
 /**
  * Abstract implementation of the client interface.
  * <p>
@@ -1881,15 +1881,22 @@
 
             // actual save
             docModel = writeModel(doc, docModel);
+            Document checkedInDoc = null;
 
             if (!docModel.isImmutable()) {
                 // post-save versioning
-                getVersioningService().doPostSave(doc, versioningOption,
-                        checkinComment, options);
+                checkedInDoc = getVersioningService().doPostSave(doc,
+                        versioningOption, checkinComment, options);
             }
 
-            // post-save event
+            // post-save events
             docModel = readModel(doc);
+            if (checkedInDoc != null) {
+                DocumentRef checkedInVersionRef = new IdRef(
+                        checkedInDoc.getUUID());
+                notifyCheckedInVersion(docModel, checkedInVersionRef, options,
+                        checkinComment);
+            }
             notifyEvent(DocumentEventTypes.DOCUMENT_UPDATED, docModel, options,
                     null, null, true, false);
 
@@ -2214,14 +2221,9 @@
                     options, null, null, true, false);
 
             docModel = readModel(doc);
-            String label = getVersioningService().getVersionLabel(docModel);
-            options.put("versionLabel", label);
-            options.put("checkInComment", checkinComment);
-            String comment = checkinComment == null ? label : label + ' '
-                    + checkinComment;
-            options.put("comment", comment); // compat, used in audit
-            notifyEvent(DocumentEventTypes.DOCUMENT_CHECKEDIN, docModel,
-                    options, null, null, true, false);
+            DocumentRef checkedInVersionRef = versionModel.getRef();
+            notifyCheckedInVersion(docModel, checkedInVersionRef, options,
+                    checkinComment);
             writeModel(doc, docModel);
 
             return versionModel.getRef();
@@ -2231,6 +2233,34 @@
         }
     }
 
+    /**
+     * Send a core event for the creation of a new check in version. The source
+     * document is the live document model used as the source for the checkin,
+     * not the archived version it-self.
+     *
+     * @param docModel work document that has been checked-in as a version
+     * @param checkedInVersionRef document ref of the new checked-in version
+     * @param options initial option map, or null
+     * @param checkinComment
+     * @throws ClientException
+     */
+    protected void notifyCheckedInVersion(DocumentModel docModel,
+            DocumentRef checkedInVersionRef, Map<String, Serializable> options,
+            String checkinComment) throws ClientException {
+        String label = getVersioningService().getVersionLabel(docModel);
+        if (options == null) {
+            options = new HashMap<String, Serializable>();
+        }
+        options.put("versionLabel", label);
+        options.put("checkInComment", checkinComment);
+        options.put("checkedInVersionRef", checkedInVersionRef);
+        String comment = checkinComment == null ? label : label + ' '
+                + checkinComment;
+        options.put("comment", comment); // compat, used in audit
+        notifyEvent(DocumentEventTypes.DOCUMENT_CHECKEDIN, docModel, options,
+                null, null, true, false);
+    }
+
     @Override
     public void checkOut(DocumentRef docRef) throws ClientException {
         try {
diff --git a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/CompatVersioningService.java b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/CompatVersioningService.java
--- a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/CompatVersioningService.java
+++ b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/CompatVersioningService.java
@@ -75,15 +75,16 @@
     }
 
     @Override
-    public void doPostSave(Document doc, VersioningOption option,
+    public Document doPostSave(Document doc, VersioningOption option,
             String checkinComment, Map<String, Serializable> options)
             throws DocumentException {
         if (!doc.isCheckedOut()) {
-            return;
+            return null;
         }
         // option = validateOption(doc, option);
         incrementByOption(doc, option);
         followTransitionByOption(doc, option);
+        return null;
     }
 
     @Override
diff --git a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/StandardVersioningService.java b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/StandardVersioningService.java
--- a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/StandardVersioningService.java
+++ b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/StandardVersioningService.java
@@ -152,8 +152,7 @@
     }
 
     @Override
-    public void doPostCreate(Document doc, Map<String, Serializable> options)
-            throws DocumentException {
+    public void doPostCreate(Document doc, Map<String, Serializable> options) {
         if (doc.isVersion() || doc.isProxy()) {
             return;
         }
@@ -284,15 +283,16 @@
     }
 
     @Override
-    public void doPostSave(Document doc, VersioningOption option,
+    public Document doPostSave(Document doc, VersioningOption option,
             String checkinComment, Map<String, Serializable> options)
             throws DocumentException {
         // option = validateOption(doc, option); // validated before
         boolean increment = option != NONE;
         if (doc.isCheckedOut() && increment) {
             incrementByOption(doc, option);
-            doc.checkIn(null, checkinComment); // auto-label
+            return doc.checkIn(null, checkinComment); // auto-label
         }
+        return null;
     }
 
     @Override
@@ -325,11 +325,11 @@
     public void setVersioningRules(
             Map<String, VersioningRuleDescriptor> versioningRules) {
         this.versioningRules = versioningRules;
-
     }
 
     @Override
-    public void setDefaultVersioningRule(DefaultVersioningRuleDescriptor defaultVersioningRule) {
+    public void setDefaultVersioningRule(
+            DefaultVersioningRuleDescriptor defaultVersioningRule) {
         this.defaultVersioningRule = defaultVersioningRule;
     }
 
diff --git a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningComponent.java b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningComponent.java
--- a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningComponent.java
+++ b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningComponent.java
@@ -205,15 +205,14 @@
     public VersioningOption doPreSave(Document doc, boolean isDirty,
             VersioningOption option, String checkinComment,
             Map<String, Serializable> options) throws DocumentException {
-        return getService().doPreSave(doc, isDirty, option, checkinComment,
-                options);
+        return getService().doPreSave(doc, isDirty, option, checkinComment, options);
     }
 
     @Override
-    public void doPostSave(Document doc, VersioningOption option,
+    public Document doPostSave(Document doc, VersioningOption option,
             String checkinComment, Map<String, Serializable> options)
             throws DocumentException {
-        getService().doPostSave(doc, option, checkinComment, options);
+        return getService().doPostSave(doc, option, checkinComment, options);
     }
 
     @Override
diff --git a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningService.java b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningService.java
--- a/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningService.java
+++ b/nuxeo-core/src/main/java/org/nuxeo/ecm/core/versioning/VersioningService.java
@@ -101,14 +101,17 @@
             Map<String, Serializable> options) throws DocumentException;
 
     /**
-     * Applies versioning options after document save.
+     * Applies versioning options after document save. If a new version is
+     * checked in during the operation, the document for this version is
+     * returned to the caller.
      *
      * @param doc the document
      * @param option an option chosen by the user or framework
      * @param checkinComment a checkin comment
      * @param context map event info
+     * @return checkedInDocument or null
      */
-    void doPostSave(Document doc, VersioningOption option,
+    Document doPostSave(Document doc, VersioningOption option,
             String checkinComment, Map<String, Serializable> options)
             throws DocumentException;
 
