Index: subversion/libsvn_ra_svn/client.c
===================================================================
--- subversion/libsvn_ra_svn/client.c	(revision 22325)
+++ subversion/libsvn_ra_svn/client.c	(working copy)
@@ -519,6 +519,7 @@
   sess->tunnel_argv = tunnel_argv;
   sess->callbacks = callbacks;
   sess->callbacks_baton = callbacks_baton;
+  sess->bytes_read = sess->bytes_written = 0;
 
   if (tunnel_argv)
     SVN_ERR(make_tunnel(tunnel_argv, &conn, pool));
Index: subversion/libsvn_ra_svn/marshal.c
===================================================================
--- subversion/libsvn_ra_svn/marshal.c	(revision 22325)
+++ subversion/libsvn_ra_svn/marshal.c	(working copy)
@@ -158,6 +158,16 @@
           SVN_ERR(conn->block_handler(conn, subpool, conn->block_baton));
         }
       data += count;
+
+      if (session)
+        {
+          const svn_ra_callbacks2_t *cb = session->callbacks;
+          session->bytes_written += count;
+
+          if (cb && cb->progress_func)
+            (cb->progress_func)(session->bytes_written + session->bytes_read,
+                                -1, cb->progress_baton, subpool);
+        }
     }
 
   if (subpool)
@@ -227,7 +237,7 @@
 
 /* Read data from socket or input file as appropriate. */
 static svn_error_t *readbuf_input(svn_ra_svn_conn_t *conn, char *data,
-                                  apr_size_t *len)
+                                  apr_size_t *len, apr_pool_t *pool)
 {
   svn_ra_svn__session_baton_t *session = conn->session;
 
@@ -240,6 +250,17 @@
   if (*len == 0)
     return svn_error_create(SVN_ERR_RA_SVN_CONNECTION_CLOSED, NULL,
                             _("Connection closed unexpectedly"));
+
+  if (session)
+    {
+      const svn_ra_callbacks2_t *cb = session->callbacks;
+      session->bytes_read += *len;
+
+      if (cb && cb->progress_func)
+        (cb->progress_func)(session->bytes_read + session->bytes_written,
+                            -1, cb->progress_baton, pool);
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -251,7 +272,7 @@
   assert(conn->read_ptr == conn->read_end);
   SVN_ERR(writebuf_flush(conn, pool));
   len = sizeof(conn->read_buf);
-  SVN_ERR(readbuf_input(conn, conn->read_buf, &len));
+  SVN_ERR(readbuf_input(conn, conn->read_buf, &len, pool));
   conn->read_ptr = conn->read_buf;
   conn->read_end = conn->read_buf + len;
   return SVN_NO_ERROR;
@@ -290,7 +311,7 @@
     {
       SVN_ERR(writebuf_flush(conn, pool));
       count = end - data;
-      SVN_ERR(readbuf_input(conn, data, &count));
+      SVN_ERR(readbuf_input(conn, data, &count, pool));
       data += count;
     }
 
@@ -305,7 +326,8 @@
   return SVN_NO_ERROR;
 }
 
-static svn_error_t *readbuf_skip_leading_garbage(svn_ra_svn_conn_t *conn)
+static svn_error_t *readbuf_skip_leading_garbage(svn_ra_svn_conn_t *conn,
+                                                 apr_pool_t *pool)
 {
   char buf[256];  /* Must be smaller than sizeof(conn->read_buf) - 1. */
   const char *p, *end;
@@ -317,7 +339,7 @@
     {
       /* Read some data directly from the connection input source. */
       len = sizeof(buf);
-      SVN_ERR(readbuf_input(conn, buf, &len));
+      SVN_ERR(readbuf_input(conn, buf, &len, pool));
       end = buf + len;
 
       /* Scan the data for '(' WS with a very simple state machine. */
@@ -605,7 +627,7 @@
 svn_error_t *svn_ra_svn_skip_leading_garbage(svn_ra_svn_conn_t *conn,
                                              apr_pool_t *pool)
 {
-  return readbuf_skip_leading_garbage(conn);
+  return readbuf_skip_leading_garbage(conn, pool);
 }
 
 /* --- READING AND PARSING TUPLES --- */
Index: subversion/libsvn_ra_svn/ra_svn.h
===================================================================
--- subversion/libsvn_ra_svn/ra_svn.h	(revision 22325)
+++ subversion/libsvn_ra_svn/ra_svn.h	(working copy)
@@ -92,6 +92,7 @@
   const char **tunnel_argv;
   const svn_ra_callbacks2_t *callbacks;
   void *callbacks_baton;
+  int bytes_read, bytes_written;
 };
 
 /* Set a callback for blocked writes on conn.  This handler may
