Index: subversion/include/svn_wc.h
===================================================================
--- subversion/include/svn_wc.h	(revision 16270)
+++ subversion/include/svn_wc.h	(working copy)
@@ -1547,6 +1547,39 @@
   /** The entry's lock in the repository, if any. */
   svn_lock_t *repos_lock;
 
+  /** Out of Date Info.
+   *
+   * If the working copy item is out of date compared to the repository
+   * the following five fields represent the HEAD state of the item in
+   * the repository.  If not out of date, the items are set as described
+   * below.
+   */
+  
+  /** If not out of date set to SVN_INVALID_REVNUM.
+   * @since New in 1.3
+   */
+  svn_revnum_t ood_last_cmt_rev;
+
+  /** If not out of date set to 0.
+   * @since New in 1.3
+   */
+  apr_time_t ood_last_cmt_date;
+
+  /** If not out of date set to svn_wc_status_none.
+   * @since New in 1.3
+   */
+  svn_node_kind_t ood_kind;
+
+  /** If not out of date set to NULL.
+   * @since New in 1.3
+   */
+  const char *ood_url;
+
+  /** If not out of date set to NULL.
+   * @since New in 1.3
+   */
+  const char *ood_last_cmt_author;
+
 } svn_wc_status2_t;
 
 
Index: subversion/libsvn_wc/status.c
===================================================================
--- subversion/libsvn_wc/status.c	(revision 16270)
+++ subversion/libsvn_wc/status.c	(working copy)
@@ -33,6 +33,7 @@
 #include "svn_io.h"
 #include "svn_wc.h"
 #include "svn_config.h"
+#include "svn_time.h"
 #include "svn_private_config.h"
 
 #include "wc.h"
@@ -132,6 +133,13 @@
 
   /* The pool in which this baton itself is allocated. */
   apr_pool_t *pool;
+
+  /* Out of Date info corresponding to ood_* fields in svn_wc_status2_t. */
+  svn_revnum_t ood_last_cmt_rev;
+  apr_time_t ood_last_cmt_date;
+  svn_node_kind_t ood_kind;
+  const char *ood_url;
+  const char *ood_last_cmt_author;
 };
 
 
@@ -166,6 +174,12 @@
      the code that syncs up the adm dir and working copy. */
   svn_boolean_t prop_changed;
 
+  /* Out of Date info corresponding to ood_* fields in svn_wc_status2_t. */
+  svn_revnum_t ood_last_cmt_rev;
+  apr_time_t ood_last_cmt_date;
+  svn_node_kind_t ood_kind;
+  const char *ood_url;
+  const char *ood_last_cmt_author;
 };
 
 
@@ -282,6 +296,11 @@
         }
 
       stat->repos_lock = repos_lock;
+      stat->ood_last_cmt_rev = SVN_INVALID_REVNUM;
+      stat->ood_last_cmt_date = 0;
+      stat->ood_kind = svn_wc_status_none;
+      stat->ood_url = NULL;
+      stat->ood_last_cmt_author = NULL;
 
       *status = stat;
       return SVN_NO_ERROR;
@@ -466,6 +485,11 @@
   stat->switched = switched_p;
   stat->copied = entry->copied;
   stat->repos_lock = repos_lock;
+  stat->ood_last_cmt_rev = SVN_INVALID_REVNUM;
+  stat->ood_last_cmt_date = 0;
+  stat->ood_kind = svn_wc_status_none;
+  stat->ood_url = NULL;
+  stat->ood_last_cmt_author = NULL;
 
   *status = stat;
 
@@ -952,14 +976,16 @@
 }
 
 
-/* Look up the key PATH in STATUSHASH.  If the value doesn't yet
-   exist, and the REPOS_TEXT_STATUS indicates that this is an
+/* Look up the key PATH in BATON->STATII.  IS_DIR_BATON indicates whether
+   baton is a struct *dir_baton or struct *file_baton.  If the value doesn't
+   yet exist, and the REPOS_TEXT_STATUS indicates that this is an
    addition, create a new status struct using the hash's pool.  Merge
    REPOS_TEXT_STATUS and REPOS_PROP_STATUS into the status structure's
    "network" fields.
    If a new struct was added, set the repos_lock to REPOS_LOCK. */
 static svn_error_t *
-tweak_statushash (apr_hash_t *statushash,
+tweak_statushash (void *baton,
+                  svn_boolean_t is_dir_baton,
                   svn_wc_adm_access_t *adm_access,
                   const char *path,
                   svn_boolean_t is_dir,
@@ -968,8 +994,15 @@
                   svn_lock_t *repos_lock)
 {
   svn_wc_status2_t *statstruct;
-  apr_pool_t *pool = apr_hash_pool_get (statushash);
+  apr_pool_t *pool;
+  apr_hash_t *statushash;
 
+  if (is_dir_baton)
+    statushash = ((struct dir_baton *) baton)->statii;
+  else
+    statushash = ((struct file_baton *) baton)->dir_baton->statii;
+  pool = apr_hash_pool_get (statushash);
+
   /* Is PATH already a hash-key? */
   statstruct = apr_hash_get (statushash, path, APR_HASH_KEY_STRING);
 
@@ -1008,6 +1041,30 @@
   if (repos_prop_status)
     statstruct->repos_prop_status = repos_prop_status;
   
+  /* Copy out of date info. */
+  if (is_dir_baton)
+    {
+      struct dir_baton *b = baton;
+      statstruct->ood_kind = b->ood_kind;
+      statstruct->ood_url  = b->ood_url;
+      /* The last committed rev, date, and author for out of
+         date deleted items isn't available. */
+      if (statstruct->repos_text_status != svn_wc_status_deleted)
+        {
+          statstruct->ood_last_cmt_rev    = b->ood_last_cmt_rev;
+          statstruct->ood_last_cmt_date   = b->ood_last_cmt_date;
+          statstruct->ood_last_cmt_author = b->ood_last_cmt_author;
+        }
+    }
+  else
+    {
+      struct file_baton *b = baton;
+      statstruct->ood_last_cmt_rev    = b->ood_last_cmt_rev;
+      statstruct->ood_last_cmt_date   = b->ood_last_cmt_date;
+      statstruct->ood_kind            = b->ood_kind;
+      statstruct->ood_url             = b->ood_url;
+      statstruct->ood_last_cmt_author = b->ood_last_cmt_author;
+    }
   return SVN_NO_ERROR;
 }
 
@@ -1038,12 +1095,17 @@
     full_path = apr_pstrdup (pool, eb->anchor);
 
   /* Finish populating the baton members. */
-  d->path         = full_path;
-  d->name         = path ? (svn_path_basename (path, pool)) : NULL;
-  d->edit_baton   = edit_baton;
-  d->parent_baton = parent_baton;
-  d->pool         = pool;
-  d->statii       = apr_hash_make (pool);
+  d->path                = full_path;
+  d->name                = path ? (svn_path_basename (path, pool)) : NULL;
+  d->edit_baton          = edit_baton;
+  d->parent_baton        = parent_baton;
+  d->pool                = pool;
+  d->statii              = apr_hash_make (pool);
+  d->ood_last_cmt_rev    = SVN_INVALID_REVNUM;
+  d->ood_last_cmt_date   = 0;
+  d->ood_kind            = svn_wc_status_none;
+  d->ood_url             = NULL;
+  d->ood_last_cmt_author = NULL;
 
   /* Get the status for this path's children.  Of course, we only want
      to do this if the path is versioned as a directory. */
@@ -1098,12 +1160,16 @@
     full_path = apr_pstrdup (pool, eb->anchor);
 
   /* Finish populating the baton members. */
-  f->path       = full_path;
-  f->name       = svn_path_basename (path, pool);
-  f->pool       = pool;
-  f->dir_baton  = pb;
-  f->edit_baton = eb;
-
+  f->path                = full_path;
+  f->name                = svn_path_basename (path, pool);
+  f->pool                = pool;
+  f->dir_baton           = pb;
+  f->edit_baton          = eb;
+  f->ood_last_cmt_rev    = SVN_INVALID_REVNUM;
+  f->ood_last_cmt_date   = 0;
+  f->ood_kind            = svn_wc_status_none;
+  f->ood_url             = NULL;
+  f->ood_last_cmt_author = NULL;
   return f;
 }
 
@@ -1369,7 +1435,7 @@
 
   SVN_ERR (svn_wc_entries_read (&entries, adm_access, FALSE, pool));
   if (apr_hash_get (entries, hash_key, APR_HASH_KEY_STRING))
-    SVN_ERR (tweak_statushash (db->statii, eb->adm_access,
+    SVN_ERR (tweak_statushash (db, TRUE, eb->adm_access,
                                full_path, kind == svn_node_dir,
                                svn_wc_status_deleted, 0, NULL));
 
@@ -1377,7 +1443,7 @@
      is the root node and we're not supposed to report on the root
      node).  */
   if (db->parent_baton && (! *eb->target))
-    SVN_ERR (tweak_statushash (db->parent_baton->statii, eb->adm_access,
+    SVN_ERR (tweak_statushash (db->parent_baton, TRUE, eb->adm_access,
                                db->path, kind == svn_node_dir,
                                svn_wc_status_modified, 0, NULL));
 
@@ -1431,6 +1497,26 @@
   struct dir_baton *db = dir_baton;
   if (svn_wc_is_normal_prop (name))    
     db->prop_changed = TRUE;
+
+  /* Store out of date info. */
+  db->ood_kind = svn_node_dir;
+  if (!db->ood_url)
+    db->ood_url = apr_pstrdup (db->pool, find_dir_url (db, pool));
+  if ( strcmp (name, SVN_PROP_ENTRY_COMMITTED_REV) == 0)
+    db->ood_last_cmt_rev = SVN_STR_TO_REV(value->data);
+  else if ( strcmp (name, SVN_PROP_ENTRY_LAST_AUTHOR) == 0)
+    {
+      db->ood_last_cmt_author = apr_pstrdup (db->pool, value->data);
+    }
+  else if ( strcmp (name, SVN_PROP_ENTRY_COMMITTED_DATE) == 0)
+    {
+      const char *time_str;
+      apr_time_t time;
+      SVN_ERR (svn_time_from_cstring (&time, value->data, db->pool));
+      time_str = svn_time_to_cstring (time, db->pool);
+      db->ood_last_cmt_date = time;
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -1469,7 +1555,7 @@
       if (pb)
         /* NOTE: When we add directory locking, we need to find a directory
            lock here. */
-        SVN_ERR (tweak_statushash (pb->statii,
+        SVN_ERR (tweak_statushash (pb, TRUE,
                                    eb->adm_access,
                                    db->path, TRUE,
                                    repos_text_status,
@@ -1608,6 +1694,34 @@
   struct file_baton *fb = file_baton;
   if (svn_wc_is_normal_prop (name))
     fb->prop_changed = TRUE;
+
+  /* Store out of date info. */
+  fb->ood_kind = svn_node_file;
+  if (!fb->ood_url)
+    {
+      const char *url
+        = svn_path_url_add_component (find_dir_url (fb->dir_baton, pool),
+                                      svn_path_basename (fb->path, pool),
+                                      pool);
+
+      /* Copy into file_baton with a safe pool. */ 
+      fb->ood_url = apr_pstrdup(fb->dir_baton->pool, url);
+    }
+  if ( strcmp (name, SVN_PROP_ENTRY_COMMITTED_REV) == 0)
+    fb->ood_last_cmt_rev = SVN_STR_TO_REV(value->data);
+  else if ( strcmp (name, SVN_PROP_ENTRY_LAST_AUTHOR) == 0)
+    {
+      fb->ood_last_cmt_author = apr_pstrdup (fb->dir_baton->pool,
+                                             value->data);
+    }
+  else if ( strcmp (name, SVN_PROP_ENTRY_COMMITTED_DATE) == 0)
+    {
+      apr_time_t time;
+      SVN_ERR (svn_time_from_cstring (&time, value->data,
+                                      fb->dir_baton->pool));
+      fb->ood_last_cmt_date = time;
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -1653,7 +1767,7 @@
       repos_prop_status = fb->prop_changed ? svn_wc_status_modified : 0;
     }
 
-  SVN_ERR (tweak_statushash (fb->dir_baton->statii,
+  SVN_ERR (tweak_statushash (fb, FALSE,
                              fb->edit_baton->adm_access,
                              fb->path, FALSE,
                              repos_text_status,
