Index: subversion/libsvn_ra/wrapper_template.h
===================================================================
--- subversion/libsvn_ra/wrapper_template.h	(revision 16478)
+++ subversion/libsvn_ra/wrapper_template.h	(working copy)
@@ -37,6 +37,7 @@
 #error Missing define for RA compatibility wrapper.
 #endif
 
+
 static svn_error_t *compat_open (void **session_baton,
                                  const char *repos_URL,
                                  const svn_ra_callbacks_t *callbacks,
@@ -128,8 +129,15 @@
                                               void *callback_baton,
                                               apr_pool_t *pool)
 {
+  svn_commit_callback2_t callback2 = NULL;
+  void *callback2_baton = NULL;
+
+  svn_compat_wrap_commit_callback (callback, callback_baton,
+                                   &callback2, &callback2_baton,
+                                   pool);
   return VTBL.get_commit_editor (session_baton, editor, edit_baton, log_msg,
-                                 callback, callback_baton, NULL, TRUE, pool);
+                                 callback2, callback2_baton,
+                                 NULL, TRUE, pool);
 }
 
 static svn_error_t *compat_get_file (void *session_baton,
Index: subversion/libsvn_ra/ra_loader.c
===================================================================
--- subversion/libsvn_ra/ra_loader.c	(revision 16478)
+++ subversion/libsvn_ra/ra_loader.c	(working copy)
@@ -28,6 +28,7 @@
 #include <apr_dso.h>
 
 #include "svn_version.h"
+#include "svn_types.h"
 #include "svn_error.h"
 #include "svn_pools.h"
 #include "svn_ra.h"
@@ -220,7 +221,6 @@
 
   return SVN_NO_ERROR;
 }
-
 /* -------------------------------------------------------------- */
 
 /*** Public Interfaces ***/
@@ -362,6 +362,21 @@
   return session->vtable->rev_prop (session, rev, name, value, pool);
 }
 
+svn_error_t *svn_ra_get_commit_editor2 (svn_ra_session_t *session,
+                                        const svn_delta_editor_t **editor,
+                                        void **edit_baton,
+                                        const char *log_msg,
+                                        svn_commit_callback2_t callback,
+                                        void *callback_baton,
+                                        apr_hash_t *lock_tokens,
+                                        svn_boolean_t keep_locks,
+                                        apr_pool_t *pool)
+{
+  return session->vtable->get_commit_editor (session, editor, edit_baton,
+                                             log_msg, callback, callback_baton,
+                                             lock_tokens, keep_locks, pool);
+}
+
 svn_error_t *svn_ra_get_commit_editor (svn_ra_session_t *session,
                                        const svn_delta_editor_t **editor,
                                        void **edit_baton,
@@ -372,9 +387,17 @@
                                        svn_boolean_t keep_locks,
                                        apr_pool_t *pool)
 {
-  return session->vtable->get_commit_editor (session, editor, edit_baton,
-                                             log_msg, callback, callback_baton,
-                                             lock_tokens, keep_locks, pool);
+  svn_commit_callback2_t callback2 = NULL;
+  void *callback2_baton = NULL;
+
+  svn_compat_wrap_commit_callback (callback, callback_baton,
+                                   &callback2, &callback2_baton,
+                                   pool);
+
+  return svn_ra_get_commit_editor2 (session, editor, edit_baton,
+                                    log_msg, callback2,
+                                    callback2_baton, lock_tokens,
+                                    keep_locks, pool);
 }
 
 svn_error_t *svn_ra_get_file (svn_ra_session_t *session,
Index: subversion/libsvn_ra/ra_loader.h
===================================================================
--- subversion/libsvn_ra/ra_loader.h	(revision 16478)
+++ subversion/libsvn_ra/ra_loader.h	(working copy)
@@ -80,7 +80,7 @@
                                      const svn_delta_editor_t **editor,
                                      void **edit_baton,
                                      const char *log_msg,
-                                     svn_commit_callback_t callback,
+                                     svn_commit_callback2_t callback,
                                      void *callback_baton,
                                      apr_hash_t *lock_tokens,
                                      svn_boolean_t keep_locks,
Index: subversion/include/svn_repos.h
===================================================================
--- subversion/include/svn_repos.h	(revision 16478)
+++ subversion/include/svn_repos.h	(working copy)
@@ -667,9 +667,30 @@
  * NULL).  Callers who supply their own transactions are responsible
  * for cleaning them up (either by committing them, or aborting them).
  *
- * @since New in 1.3.
+ * @since New in 1.4
  */
 svn_error_t *
+svn_repos_get_commit_editor4 (const svn_delta_editor_t **editor,
+                              void **edit_baton,
+                              svn_repos_t *repos,
+                              svn_fs_txn_t *txn,
+                              const char *repos_url,
+                              const char *base_path,
+                              const char *user,
+                              const char *log_msg,
+                              svn_commit_callback2_t callback,
+                              void *callback_baton,
+                              svn_repos_authz_callback_t authz_callback,
+                              void *authz_baton,
+                              apr_pool_t *pool);
+
+/**
+ * Similar to svn_repos_get_commit_editor4(), but
+ * uses the svn_commit_callback_t.
+ *
+ * @deprecated Provided for backward compatibility with the 1.3 API.
+ */
+svn_error_t *
 svn_repos_get_commit_editor3 (const svn_delta_editor_t **editor,
                               void **edit_baton,
                               svn_repos_t *repos,
Index: subversion/include/svn_types.h
===================================================================
--- subversion/include/svn_types.h	(revision 16478)
+++ subversion/include/svn_types.h	(working copy)
@@ -339,6 +339,25 @@
 svn_create_commit_info (apr_pool_t *pool);
 
 
+/**
+ * Perform a deep copy of the @c svn_commit_info_t structure
+ * from @a src_commit_info to @a dst_commit_info.
+ *
+ * @note Bothe @a src_commit_info and @a dst_commit_info are
+ * to be pre-allocated. But the internal memory requirements
+ * are handled from the @a pool.
+ *
+ * This is to provide for extending the svn_commit_info_t in
+ * the future.
+ *
+ * @since New in 1.4
+ */
+void
+svn_dup_commit_info (const svn_commit_info_t *src_commit_info,
+                     svn_commit_info_t **dst_commit_info,
+                     apr_pool_t *pool);
+
+
 /** A structure to represent a path that changed for a log entry. */
 typedef struct svn_log_changed_path_t
 {
@@ -407,7 +426,19 @@
  * When a commit succeeds, an instance of this is invoked on the @a
  * new_revision, @a date, and @a author of the commit, along with the
  * @a baton closure.
+ *
+ * @since New in 1.4
  */
+typedef svn_error_t * (*svn_commit_callback2_t) (
+    const svn_commit_info_t *commit_info,
+    void *baton);
+
+
+/** Same as svn_commit_callback2_t, but uses individual
+ * data elements instead of the svn_commit_info_t structure
+ *
+ * @deprecated Provided for backward compatibility with the 1.3 API.
+ */
 typedef svn_error_t * (*svn_commit_callback_t) (
     svn_revnum_t new_revision,
     const char *date,
@@ -415,6 +446,14 @@
     void *baton);
 
 
+/* for compatibility with svn_commit_callback_t */
+void *svn_compat_wrap_commit_callback (svn_commit_callback_t callback,
+                                       void *callback_baton,
+                                       svn_commit_callback2_t *callback2,
+                                       void **callback2_baton,
+                                       apr_pool_t *pool);
+
+
 /** The maximum amount we (ideally) hold in memory at a time when
  * processing a stream of data.
  *
Index: subversion/include/svn_ra.h
===================================================================
--- subversion/include/svn_ra.h	(revision 16478)
+++ subversion/include/svn_ra.h	(working copy)
@@ -576,8 +576,23 @@
  * 
  * Use @a pool for memory allocation.
  *
- * @since New in 1.2.
+ * @since New in 1.4
  */
+svn_error_t *svn_ra_get_commit_editor2 (svn_ra_session_t *session,
+                                        const svn_delta_editor_t **editor,
+                                        void **edit_baton,
+                                        const char *log_msg,
+                                        svn_commit_callback2_t callback,
+                                        void *callback_baton,
+                                        apr_hash_t *lock_tokens,
+                                        svn_boolean_t keep_locks,
+                                        apr_pool_t *pool);
+
+/**
+ * Same as svn_ra_get_commit_editor2, but uses svn_commit_callback_t.
+ *
+ * @deprecated Provided for backward compatibility with the 1.3 API.
+ */ 
 svn_error_t *svn_ra_get_commit_editor (svn_ra_session_t *session,
                                        const svn_delta_editor_t **editor,
                                        void **edit_baton,
Index: subversion/libsvn_subr/constructors.c
===================================================================
--- subversion/libsvn_subr/constructors.c	(revision 16478)
+++ subversion/libsvn_subr/constructors.c	(working copy)
@@ -34,6 +34,23 @@
   return commit_info;
 }
 
+void
+svn_dup_commit_info (const svn_commit_info_t *src_commit_info,
+                     svn_commit_info_t **dst_commit_info,
+                     apr_pool_t *pool)
+{
+  if (src_commit_info)
+    {
+      *dst_commit_info = svn_create_commit_info (pool);
+
+      (*dst_commit_info)->date = src_commit_info->date ?
+                         apr_pstrdup (pool, src_commit_info->date) : NULL;
+      (*dst_commit_info)->author = src_commit_info->author ?
+                         apr_pstrdup (pool, src_commit_info->author) : NULL;
+      (*dst_commit_info)->revision = src_commit_info->revision;
+    }
+}
+
 svn_log_changed_path_t *
 svn_log_changed_path_dup (const svn_log_changed_path_t *changed_path,
                           apr_pool_t *pool)
Index: subversion/libsvn_subr/compat.c
===================================================================
--- subversion/libsvn_subr/compat.c	(revision 0)
+++ subversion/libsvn_subr/compat.c	(revision 0)
@@ -0,0 +1,62 @@
+/*
+ * compat.c :  Wrappers and callbacks for compatibility.
+ *
+ * ====================================================================
+ * Copyright (c) 2005 CollabNet.  All rights reserved.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at http://subversion.tigris.org/license-1.html.
+ * If newer versions of this license are posted there, you may use a
+ * newer version instead, at your option.
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals.  For exact contribution history, see the revision
+ * history and logs, available at http://subversion.tigris.org/.
+ * ====================================================================
+ */
+
+#include <apr_pools.h>
+#include <apr_strings.h>
+
+#include "svn_types.h"
+#include "svn_error.h"
+
+
+struct commit_wrapper_baton {
+  void *baton;
+  svn_commit_callback_t callback;
+};
+
+svn_error_t *commit_wrapper_callback (const svn_commit_info_t *commit_info,
+                                      void *baton)
+{
+  struct commit_wrapper_baton *cwb = baton;
+
+  if (cwb->callback)
+    return cwb->callback (commit_info->revision,
+                          commit_info->date,
+                          commit_info->author,
+                          cwb->baton);
+
+  return SVN_NO_ERROR;
+}
+
+void *svn_compat_wrap_commit_callback (svn_commit_callback_t callback,
+                                       void *callback_baton,
+                                       svn_commit_callback2_t *callback2,
+                                       void **callback2_baton,
+                                       apr_pool_t *pool)
+{
+  struct commit_wrapper_baton *cwb = apr_pcalloc (pool, sizeof (*cwb));
+
+  /* Set the user provided old format callback in the baton */
+  cwb->baton = callback_baton;
+  cwb->callback = callback;
+
+  *callback2_baton = (void *) cwb;
+  *callback2 = commit_wrapper_callback;
+
+  return;
+}
+
Index: subversion/libsvn_ra_local/ra_plugin.c
===================================================================
--- subversion/libsvn_ra_local/ra_plugin.c	(revision 16478)
+++ subversion/libsvn_ra_local/ra_plugin.c	(working copy)
@@ -408,7 +408,7 @@
   const char *fs_path;             /* fs-path part of split session URL */
   apr_hash_t *lock_tokens;         /* tokens to unlock, if any */
   apr_pool_t *pool;                /* pool for scratch work */
-  svn_commit_callback_t callback;  /* the original callback */
+  svn_commit_callback2_t callback;  /* the original callback */
   void *callback_baton;            /* the original callback's baton */
 };
 
@@ -417,9 +417,7 @@
    possibly unlocks committed paths.
    BATON is 'struct deltify_etc_baton *'. */
 static svn_error_t * 
-deltify_etc (svn_revnum_t new_revision,
-             const char *date,
-             const char *author,
+deltify_etc (const svn_commit_info_t *commit_info,
              void *baton)
 {
   struct deltify_etc_baton *db = baton;
@@ -430,7 +428,7 @@
   /* Invoke the original callback first, in case someone's waiting to
      know the revision number so they can go off and annotate an
      issue or something. */
-  err1 = (*db->callback) (new_revision, date, author, db->callback_baton);
+  err1 = (*db->callback) (commit_info, db->callback_baton);
 
   /* Maybe unlock the paths. */
   if (db->lock_tokens)
@@ -459,7 +457,7 @@
   /* But, deltification shouldn't be stopped just because someone's
      random callback failed, so proceed unconditionally on to
      deltification. */
-  err2 = svn_fs_deltify_revision (db->fs, new_revision, db->pool);
+  err2 = svn_fs_deltify_revision (db->fs, commit_info->revision, db->pool);
 
   /* It's more interesting if the original callback failed, so let
      that one dominate. */
@@ -478,7 +476,7 @@
                                  const svn_delta_editor_t **editor,
                                  void **edit_baton,
                                  const char *log_msg,
-                                 svn_commit_callback_t callback,
+                                 svn_commit_callback2_t callback,
                                  void *callback_baton,
                                  apr_hash_t *lock_tokens,
                                  svn_boolean_t keep_locks,
@@ -525,7 +523,7 @@
     }
               
   /* Get the repos commit-editor */     
-  SVN_ERR (svn_repos_get_commit_editor3
+  SVN_ERR (svn_repos_get_commit_editor4
            (editor, edit_baton, sess_baton->repos, NULL,
             svn_path_uri_decode (sess_baton->repos_url, pool),
             sess_baton->fs_path,
Index: subversion/libsvn_client/delete.c
===================================================================
--- subversion/libsvn_client/delete.c	(revision 16478)
+++ subversion/libsvn_client/delete.c	(working copy)
@@ -185,11 +185,11 @@
 
   /* Fetch RA commit editor */
   SVN_ERR (svn_client__commit_get_baton (&commit_baton, commit_info_p, pool));
-  SVN_ERR (svn_ra_get_commit_editor (ra_session, &editor, &edit_baton,
-                                     log_msg, svn_client__commit_callback,
-                                     commit_baton,
-                                     NULL, TRUE, /* No lock tokens */
-                                     pool));
+  SVN_ERR (svn_ra_get_commit_editor2 (ra_session, &editor, &edit_baton,
+                                      log_msg, svn_client__commit_callback,
+                                      commit_baton,
+                                      NULL, TRUE, /* No lock tokens */
+                                      pool));
 
   /* Call the path-based editor driver. */
   err = svn_delta_path_driver (editor, edit_baton, SVN_INVALID_REVNUM, 
Index: subversion/libsvn_client/client.h
===================================================================
--- subversion/libsvn_client/client.h	(revision 16478)
+++ subversion/libsvn_client/client.h	(working copy)
@@ -259,9 +259,7 @@
    pointed by commit_baton. If the commit_info supplied by get_baton
    points to NULL after close_edit, it means the commit is a no-op.
 */
-svn_error_t *svn_client__commit_callback (svn_revnum_t revision,
-                                          const char *date,
-                                          const char *author,
+svn_error_t *svn_client__commit_callback (const svn_commit_info_t *commit_info,
                                           void *baton);
 
 /* ---------------------------------------------------------------- */
Index: subversion/libsvn_client/copy.c
===================================================================
--- subversion/libsvn_client/copy.c	(revision 16478)
+++ subversion/libsvn_client/copy.c	(working copy)
@@ -449,11 +449,11 @@
 
   /* Fetch RA commit editor. */
   SVN_ERR (svn_client__commit_get_baton (&commit_baton, commit_info_p, pool));
-  SVN_ERR (svn_ra_get_commit_editor (ra_session, &editor, &edit_baton, message,
-                                     svn_client__commit_callback,
-                                     commit_baton, 
-                                     NULL, TRUE, /* No lock tokens */
-                                     pool));
+  SVN_ERR (svn_ra_get_commit_editor2 (ra_session, &editor, &edit_baton, message,
+                                      svn_client__commit_callback,
+                                      commit_baton, 
+                                      NULL, TRUE, /* No lock tokens */
+                                      pool));
 
   /* Setup our PATHS for the path-based editor drive. */
   APR_ARRAY_PUSH (paths, const char *) = dst_rel;
@@ -705,12 +705,12 @@
 
   /* Fetch RA commit editor. */
   SVN_ERR (svn_client__commit_get_baton (&commit_baton, commit_info_p, pool));
-  if ((cmt_err = svn_ra_get_commit_editor (ra_session, &editor, &edit_baton, 
-                                           message,
-                                           svn_client__commit_callback,
-                                           commit_baton, 
-                                           NULL, TRUE, /* No lock tokens */
-                                           pool)))
+  if ((cmt_err = svn_ra_get_commit_editor2 (ra_session, &editor, &edit_baton, 
+                                            message,
+                                            svn_client__commit_callback,
+                                            commit_baton, 
+                                            NULL, TRUE, /* No lock tokens */
+                                            pool)))
     goto cleanup;
 
   /* Make a note that we have a commit-in-progress. */
Index: subversion/libsvn_client/commit_util.c
===================================================================
--- subversion/libsvn_client/commit_util.c	(revision 16478)
+++ subversion/libsvn_client/commit_util.c	(working copy)
@@ -1337,18 +1337,12 @@
   return SVN_NO_ERROR;
 }
 
-svn_error_t *svn_client__commit_callback (svn_revnum_t revision,
-                                          const char *date,
-                                          const char *author,
+svn_error_t *svn_client__commit_callback (const svn_commit_info_t *commit_info,
                                           void *baton)
 {
   struct commit_baton *cb = baton;
-  svn_commit_info_t **info = cb->info;
 
-  *info = svn_create_commit_info (cb->pool);
-  (*info)->date = date ? apr_pstrdup (cb->pool, date) : NULL;
-  (*info)->author = author ? apr_pstrdup (cb->pool, author) : NULL;
-  (*info)->revision = revision;
+  svn_dup_commit_info (commit_info, cb->info, cb->pool);
 
   return SVN_NO_ERROR;
 }
Index: subversion/libsvn_client/add.c
===================================================================
--- subversion/libsvn_client/add.c	(revision 16478)
+++ subversion/libsvn_client/add.c	(working copy)
@@ -589,11 +589,11 @@
 
   /* Fetch RA commit editor */
   SVN_ERR (svn_client__commit_get_baton (&commit_baton, commit_info_p, pool));
-  SVN_ERR (svn_ra_get_commit_editor (ra_session, &editor, &edit_baton,
-                                     log_msg, svn_client__commit_callback,
-                                     commit_baton, 
-                                       NULL, TRUE, /* No lock tokens */
-                                     pool));
+  SVN_ERR (svn_ra_get_commit_editor2 (ra_session, &editor, &edit_baton,
+                                      log_msg, svn_client__commit_callback,
+                                      commit_baton, 
+                                      NULL, TRUE, /* No lock tokens */
+                                      pool));
   
   /* Call the path-based editor driver. */
   err = svn_delta_path_driver (editor, edit_baton, SVN_INVALID_REVNUM, 
Index: subversion/libsvn_client/commit.c
===================================================================
--- subversion/libsvn_client/commit.c	(revision 16478)
+++ subversion/libsvn_client/commit.c	(working copy)
@@ -623,10 +623,10 @@
   
   /* Fetch RA commit editor. */
   SVN_ERR (svn_client__commit_get_baton (&commit_baton, commit_info_p, pool));
-  return svn_ra_get_commit_editor (*ra_session, editor, edit_baton, log_msg,
-                                   svn_client__commit_callback,
-                                   commit_baton, lock_tokens, keep_locks,
-                                   pool);
+  return svn_ra_get_commit_editor2 (*ra_session, editor, edit_baton, log_msg,
+                                    svn_client__commit_callback,
+                                    commit_baton, lock_tokens, keep_locks,
+                                    pool);
 }
 
 
Index: subversion/tests/libsvn_repos/repos-test.c
===================================================================
--- subversion/tests/libsvn_repos/repos-test.c	(revision 16478)
+++ subversion/tests/libsvn_repos/repos-test.c	(working copy)
@@ -1415,7 +1415,7 @@
 
   /* Create a new commit editor in which we're going to play with
      authz */
-  SVN_ERR (svn_repos_get_commit_editor3 (&editor, &edit_baton, repos,
+  SVN_ERR (svn_repos_get_commit_editor4 (&editor, &edit_baton, repos,
                                          NULL, "file://test", "/",
                                          "plato", "test commit", NULL,
                                          NULL, commit_authz_cb, authz_file,
Index: subversion/libsvn_repos/commit.c
===================================================================
--- subversion/libsvn_repos/commit.c	(revision 16478)
+++ subversion/libsvn_repos/commit.c	(working copy)
@@ -50,7 +50,7 @@
   const char *log_msg;
 
   /* Callback to run when the commit is done. */
-  svn_commit_callback_t commit_callback;
+  svn_commit_callback2_t commit_callback;
   void *commit_callback_baton;
 
   /* Callback to check authorizations on paths. */
@@ -716,6 +716,7 @@
   {
     svn_string_t *date, *author;
     svn_error_t *err2;
+    svn_commit_info_t *commit_info = NULL;
 
     /* Even if there was a post-commit hook failure, it's more serious
        if one of the calls here fails, so we explicitly check for errors
@@ -730,16 +731,21 @@
                                     eb->pool);
 
     if (! err2)
-      err2 = (*eb->commit_callback) (new_revision, 
-                              date ? date->data : NULL, 
-                              author ? author->data : NULL,
-                              eb->commit_callback_baton);
-    if (err2)
       {
-        svn_error_clear (err);
-        return err2;
+        commit_info = svn_create_commit_info (eb->pool);
+
+        /* fill up the svn_commit_info structure */
+        commit_info->revision = new_revision;
+        commit_info->date = date ? date->data : NULL;
+        commit_info->author = author ? author->data : NULL;
+        err2 = (*eb->commit_callback) (commit_info, 
+                                eb->commit_callback_baton);
+        if (err2)
+          {
+            svn_error_clear (err);
+            return err2;
+          }
       }
-
   }
 
   return err;
@@ -757,12 +763,11 @@
 }
 
 
-
 
 /*** Public interfaces. ***/
 
 svn_error_t *
-svn_repos_get_commit_editor3 (const svn_delta_editor_t **editor,
+svn_repos_get_commit_editor4 (const svn_delta_editor_t **editor,
                               void **edit_baton,
                               svn_repos_t *repos,
                               svn_fs_txn_t *txn,
@@ -770,7 +775,7 @@
                               const char *base_path,
                               const char *user,
                               const char *log_msg,
-                              svn_commit_callback_t callback,
+                              svn_commit_callback2_t callback,
                               void *callback_baton,
                               svn_repos_authz_callback_t authz_callback,
                               void *authz_baton,
@@ -834,7 +839,36 @@
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_repos_get_commit_editor3 (const svn_delta_editor_t **editor,
+                              void **edit_baton,
+                              svn_repos_t *repos,
+                              svn_fs_txn_t *txn,
+                              const char *repos_url,
+                              const char *base_path,
+                              const char *user,
+                              const char *log_msg,
+                              svn_commit_callback_t callback,
+                              void *callback_baton,
+                              svn_repos_authz_callback_t authz_callback,
+                              void *authz_baton,
+                              apr_pool_t *pool)
+{
+  svn_commit_callback2_t callback2 = NULL;
+  void *callback2_baton = NULL;
 
+  svn_compat_wrap_commit_callback (callback, callback_baton,
+                                   &callback2, &callback2_baton,
+                                   pool);
+
+  return svn_repos_get_commit_editor4 (editor, edit_baton, repos, txn,
+                                       repos_url, base_path, user,
+                                       log_msg, callback2,
+                                       callback2_baton, authz_callback,
+                                       authz_baton, pool);
+}
+
+
 svn_error_t *
 svn_repos_get_commit_editor2 (const svn_delta_editor_t **editor,
                               void **edit_baton,
@@ -850,8 +884,8 @@
 {
   return svn_repos_get_commit_editor3 (editor, edit_baton, repos, txn,
                                        repos_url, base_path, user,
-                                       log_msg, callback, callback_baton,
-                                       NULL, NULL, pool);
+                                       log_msg, callback,
+                                       callback_baton, NULL, NULL, pool);
 }
 
 
@@ -867,8 +901,8 @@
                              void *callback_baton,
                              apr_pool_t *pool)
 {
-  return svn_repos_get_commit_editor3 (editor, edit_baton, repos, NULL,
+  return svn_repos_get_commit_editor2 (editor, edit_baton, repos, NULL,
                                        repos_url, base_path, user,
-                                       log_msg,  callback, callback_baton,
-                                       NULL, NULL, pool);
+                                       log_msg, callback,
+                                       callback_baton, pool);
 }
Index: subversion/libsvn_ra_svn/client.c
===================================================================
--- subversion/libsvn_ra_svn/client.c	(revision 16478)
+++ subversion/libsvn_ra_svn/client.c	(working copy)
@@ -56,7 +56,7 @@
   ra_svn_session_baton_t *sess_baton;
   apr_pool_t *pool;
   svn_revnum_t *new_rev;
-  svn_commit_callback_t callback;
+  svn_commit_callback2_t callback;
   void *callback_baton;
 } ra_svn_commit_callback_baton_t;
 
@@ -802,18 +802,15 @@
 static svn_error_t *ra_svn_end_commit(void *baton)
 {
   ra_svn_commit_callback_baton_t *ccb = baton;
-  svn_revnum_t new_rev;
-  const char *committed_date;
-  const char *committed_author;
+  svn_commit_info_t *commit_info = svn_create_commit_info (ccb->pool);
 
   SVN_ERR(handle_auth_request(ccb->sess_baton, ccb->pool));
   SVN_ERR(svn_ra_svn_read_tuple(ccb->sess_baton->conn, ccb->pool, "r(?c)(?c)",
-                                &new_rev,
-                                &committed_date,
-                                &committed_author));
+                                &(commit_info->revision),
+                                &(commit_info->date),
+                                &(commit_info->author)));
 
-  return ccb->callback(new_rev, committed_date, committed_author,
-                       ccb->callback_baton);
+  return ccb->callback(commit_info, ccb->callback_baton);
 
 }
 
@@ -821,7 +818,7 @@
                                   const svn_delta_editor_t **editor,
                                   void **edit_baton,
                                    const char *log_msg,
-                                  svn_commit_callback_t callback,
+                                  svn_commit_callback2_t callback,
                                   void *callback_baton,
                                   apr_hash_t *lock_tokens,
                                   svn_boolean_t keep_locks,
Index: subversion/libsvn_ra_dav/ra_dav.h
===================================================================
--- subversion/libsvn_ra_dav/ra_dav.h	(revision 16478)
+++ subversion/libsvn_ra_dav/ra_dav.h	(working copy)
@@ -221,7 +221,7 @@
   const svn_delta_editor_t **editor,
   void **edit_baton,
   const char *log_msg,
-  svn_commit_callback_t callback,
+  svn_commit_callback2_t callback,
   void *callback_baton,
   apr_hash_t *lock_tokens,
   svn_boolean_t keep_locks,
Index: subversion/libsvn_ra_dav/commit.c
===================================================================
--- subversion/libsvn_ra_dav/commit.c	(revision 16478)
+++ subversion/libsvn_ra_dav/commit.c	(working copy)
@@ -114,7 +114,7 @@
   const char *log_msg;
 
   /* The commit callback and baton */
-  svn_commit_callback_t callback;
+  svn_commit_callback2_t callback;
   void *callback_baton;
 
   /* The hash of lock-tokens owned by the working copy. */
@@ -1460,13 +1460,14 @@
                                        apr_pool_t *pool)
 {
   commit_ctx_t *cc = edit_baton;
-  svn_revnum_t new_rev;
-  const char *committed_date;
-  const char *committed_author;
+  svn_revnum_t new_rev; 
+  svn_commit_info_t *commit_info = NULL;
 
-  SVN_ERR( svn_ra_dav__merge_activity(&new_rev,
-                                      &committed_date,
-                                      &committed_author,
+  commit_info = svn_create_commit_info (pool);
+
+  SVN_ERR( svn_ra_dav__merge_activity(&(commit_info->revision),
+                                      &(commit_info->date),
+                                      &(commit_info->author),
                                       cc->ras,
                                       cc->ras->root.path,
                                       cc->activity_url,
@@ -1479,8 +1480,7 @@
   SVN_ERR( svn_ra_dav__maybe_store_auth_info(cc->ras) );
 
   if (new_rev != SVN_INVALID_REVNUM)
-    SVN_ERR( cc->callback (new_rev, committed_date, committed_author,
-                           cc->callback_baton));
+    SVN_ERR( cc->callback (commit_info, cc->callback_baton));
 
   return SVN_NO_ERROR;
 }
@@ -1573,7 +1573,7 @@
                                             const svn_delta_editor_t **editor,
                                             void **edit_baton,
                                             const char *log_msg,
-                                            svn_commit_callback_t callback,
+                                            svn_commit_callback2_t callback,
                                             void *callback_baton,
                                             apr_hash_t *lock_tokens,
                                             svn_boolean_t keep_locks,
Index: subversion/svnserve/serve.c
===================================================================
--- subversion/svnserve/serve.c	(revision 16478)
+++ subversion/svnserve/serve.c	(working copy)
@@ -765,14 +765,14 @@
   return SVN_NO_ERROR;
 }
 
-static svn_error_t *commit_done(svn_revnum_t new_rev, const char *date,
-                                const char *author, void *baton)
+static svn_error_t *commit_done(const svn_commit_info_t *commit_info,
+                                void *baton)
 {
   commit_callback_baton_t *ccb = baton;
 
-  *ccb->new_rev = new_rev;
-  *ccb->date = date;
-  *ccb->author = author;
+  *ccb->new_rev = commit_info->revision;
+  *ccb->date = commit_info->date;
+  *ccb->author = commit_info->author;
   return SVN_NO_ERROR;
 }
 
@@ -913,7 +913,7 @@
   ccb.date = &date;
   ccb.author = &author;
   /* ### Note that svn_repos_get_commit_editor actually wants a decoded URL. */
-  SVN_CMD_ERR(svn_repos_get_commit_editor3
+  SVN_CMD_ERR(svn_repos_get_commit_editor4
               (&editor, &edit_baton, b->repos, NULL,
                svn_path_uri_decode(b->repos_url, pool),
                b->fs_path, b->user,
