Index: subversion/libsvn_wc/adm_ops.c
===================================================================
--- subversion/libsvn_wc/adm_ops.c	(revision 6356)
+++ subversion/libsvn_wc/adm_ops.c	(working copy)
@@ -23,6 +23,7 @@
 
 
 
+#include <assert.h>
 #include <string.h>
 
 #include <apr_pools.h>
@@ -1114,7 +1115,71 @@
   return SVN_NO_ERROR;
 }
 
+/* Putback the entry that was not checked out with checkout -N */
 
+svn_error_t *
+svn_wc_putback_dir (const char *path,
+		    const char *putback_root,
+		    const char *putback_url,
+		    svn_revnum_t rev,
+		    apr_pool_t *pool)
+{
+  const char *children;
+  apr_array_header_t *paths;
+  char *wc_dir = (char *) putback_root, *wc_url = (char *) putback_url;
+  svn_wc_adm_access_t *adm_access, *parent_access = NULL;
+  apr_pool_t *subpool = svn_pool_create (pool);
+  int i;
+
+  assert (strncmp (path, putback_root, strlen(putback_root)) == 0);
+
+  children = path + strlen (putback_root);
+  paths = svn_path_decompose (children, pool);
+
+  SVN_ERR (svn_wc_adm_open (&adm_access, parent_access, wc_dir,
+			    TRUE, TRUE, subpool));
+  for (i = 1; i < paths->nelts; i++)
+    {
+      const char *elt = APR_ARRAY_IDX (paths, i, const char *);
+      svn_wc_entry_t *entry;
+      apr_uint32_t modify;
+      apr_hash_t *atts = apr_hash_make (subpool), *entries;
+
+      /* the adm_access and its parent needs to share the same pool,
+	 so don't clear here */
+
+      /* Add the child entry to parent. */
+      apr_hash_set (atts, SVN_WC__ENTRY_ATTR_NAME, APR_HASH_KEY_STRING, elt);
+      apr_hash_set (atts, SVN_WC__ENTRY_ATTR_KIND, APR_HASH_KEY_STRING, SVN_WC__ENTRIES_ATTR_DIR_STR);
+
+      SVN_ERR (svn_wc__atts_to_entry (&entry, &modify, atts, subpool));
+      SVN_ERR (svn_wc__entry_modify (adm_access, elt, entry, modify, TRUE, subpool));
+
+      wc_dir = svn_path_join (wc_dir, elt, subpool);
+      wc_url = svn_path_join (wc_url, elt, subpool);
+
+      parent_access = adm_access;
+
+      /* Add the child's this-dir. */
+      if (i != paths->nelts - 1)
+        {
+	  SVN_ERR (svn_io_make_dir_recursively (wc_dir, subpool));          
+	  SVN_ERR (svn_wc_ensure_adm (wc_dir, wc_url, rev, subpool));
+
+	  SVN_ERR (svn_wc_adm_open (&adm_access, parent_access, wc_dir,
+				    TRUE, TRUE, subpool));
+	  modify |= SVN_WC__ENTRY_MODIFY_FORCE|SVN_WC__ENTRY_MODIFY_INCOMPLETE;
+	  SVN_ERR (svn_wc__entry_modify (adm_access, NULL, entry, 
+					 modify, TRUE, subpool));
+	}
+    }
+
+  /* cleanup the adm locks */
+  svn_pool_destroy (subpool);
+
+  return SVN_NO_ERROR;
+}
+
 /* Thoughts on Reversion. 
 
     What does is mean to revert a given PATH in a tree?  We'll
Index: subversion/libsvn_wc/adm_ops.h
===================================================================
--- subversion/libsvn_wc/adm_ops.h	(revision 6356)
+++ subversion/libsvn_wc/adm_ops.h	(working copy)
@@ -64,6 +64,11 @@
                                         svn_boolean_t remove_missing_dirs,
                                         apr_pool_t *pool);
 
+svn_error_t *svn_wc_putback_dir (const char *path,
+				 const char *putback_root,
+				 const char *putback_url,
+				 svn_revnum_t rev,
+				 apr_pool_t *pool);
 
 #ifdef __cplusplus
 }
Index: subversion/libsvn_client/checkout.c
===================================================================
--- subversion/libsvn_client/checkout.c	(revision 6356)
+++ subversion/libsvn_client/checkout.c	(working copy)
@@ -39,6 +39,52 @@
 
 
 
+
+/* Check if the checkout url and target have the common checkout
+   url point */
+
+svn_error_t *
+_check_for_putback(const char **putback_root, const char **putback_url, const char *path, const char *url, apr_pool_t *pool)
+{
+  const char *pathdir, *pathbase, *urldir = url, *urlbase;
+  const svn_wc_entry_t *entry;
+  svn_wc_adm_access_t *adm_access;
+  svn_node_kind_t kind;
+  int wc_format;
+
+  SVN_ERR (svn_path_get_absolute (&pathdir, path, pool));
+
+  do
+    {
+      svn_path_split (pathdir, &pathdir, &pathbase, pool);
+      svn_path_split (urldir, &urldir, &urlbase, pool);
+
+      SVN_ERR (svn_io_check_path (pathdir, &kind, pool));
+      if (kind == svn_node_dir)
+	{
+	  SVN_ERR (svn_wc_check_wc (pathdir, &wc_format, pool));
+	  if (wc_format)
+	    {
+	      SVN_ERR (svn_wc_adm_open (&adm_access, NULL, pathdir,
+					FALSE, FALSE, pool));
+	      SVN_ERR (svn_wc_entry (&entry, pathdir, adm_access, FALSE, pool));
+	      SVN_ERR (svn_wc_adm_close (adm_access));
+	      if (entry->url && (strcmp (entry->url, urldir) == 0))
+		{
+		  *putback_root = apr_pstrdup(pool, pathdir);
+		  *putback_url = apr_pstrdup(pool, urldir);
+		  return SVN_NO_ERROR;
+		}
+	    }
+	}
+    }
+  while (*urlbase && (strcmp(urlbase, pathbase) == 0));
+
+  *putback_root = *putback_url = "";
+
+  return SVN_NO_ERROR;
+}
+
 /*** Public Interfaces. ***/
 
 
@@ -90,19 +136,31 @@
       SVN_ERR (svn_client__get_revision_number
                (&revnum, ra_lib, session, revision, path, pool));
 
-      
       SVN_ERR (svn_io_check_path (path, &kind, pool));
 
       if (kind == svn_node_none)
         {
-          /* Bootstrap: create an incomplete working-copy root dir.  Its
-             entries file should only have an entry for THIS_DIR with a
-             URL, revnum, and an 'incomplete' flag.  */
-          SVN_ERR (svn_io_make_dir_recursively (path, pool));          
-          SVN_ERR (svn_wc_ensure_adm (path, URL, revnum, pool));
-          
+	  const char *putback_root, *putback_url;
+	  SVN_ERR (_check_for_putback (&putback_root, &putback_url, path, URL, pool));
+	  if (*putback_root)
+	    {
+	      const char *fullpath;
+	      SVN_ERR (svn_path_get_absolute (&fullpath, path, pool));
+	      svn_wc_putback_dir (fullpath, putback_root, putback_url, revnum,
+				  pool);
+	    }
+	  else
+	    {
+	      /* Bootstrap: create an incomplete working-copy root dir.  Its
+		 entries file should only have an entry for THIS_DIR with a
+		 URL, revnum, and an 'incomplete' flag.  */
+
+	      SVN_ERR (svn_io_make_dir_recursively (path, pool));          
+	      SVN_ERR (svn_wc_ensure_adm (path, URL, revnum, pool));
+	    }
+
           /* Have update fix the incompleteness. */
-          err = svn_client_update (path, revision, recurse, ctx, pool);
+	  err = svn_client_update (*putback_root ? putback_root : path, revision, recurse, ctx, pool);
         }
       else if (kind == svn_node_dir)
         {


