Index: subversion/libsvn_client/blame.c
===================================================================
--- subversion/libsvn_client/blame.c	(revision 37375)
+++ subversion/libsvn_client/blame.c	(working copy)
@@ -526,18 +526,18 @@
       assert(walk->start == walk_merged->start);
 
       if (walk->next->start < walk_merged->next->start)
-        {
-          struct blame *tmp = blame_create(chain_merged, walk_merged->next->rev,
+        { /* split walk_merged in two so start points the same */
+          struct blame *tmp = blame_create(chain_merged, walk_merged->rev,
                                            walk->next->start);
-          tmp->next = walk_merged->next->next;
+          tmp->next = walk_merged->next;
           walk_merged->next = tmp;
         }
 
       if (walk->next->start > walk_merged->next->start)
-        {
-          struct blame *tmp = blame_create(chain, walk->next->rev,
+        { /* split walk in two so start points the same */
+			struct blame *tmp = blame_create(chain, walk->rev,
                                            walk_merged->next->start);
-          tmp->next = walk->next->next;
+          tmp->next = walk->next;
           walk->next = tmp;
         }
     }
@@ -551,8 +551,8 @@
       /* Make new walk_merged chunks as needed at the end of the list so that
          the length matches that of walk. */
       while (walk->next != NULL)
-        {
-          struct blame *tmp = blame_create(chain_merged, walk_merged->rev,
+        { /* create new chunks with NULL revision information as past end */
+          struct blame *tmp = blame_create(chain_merged, NULL,
                                            walk->next->start);
           walk_merged->next = tmp;
           walk_merged = walk_merged->next;
@@ -564,8 +564,8 @@
     {
       /* Same as above, only create walk chunks as needed. */
       while (walk_merged->next != NULL)
-        {
-          struct blame *tmp = blame_create(chain, walk->rev,
+        { /* create new chunks with NULL revision information as past end */
+          struct blame *tmp = blame_create(chain, NULL,
                                            walk_merged->next->start);
           walk->next = tmp;
           walk = walk->next;
@@ -781,7 +781,7 @@
                                  sb->data, FALSE, iterpool));
               else
                 SVN_ERR(receiver(receiver_baton, line_no, SVN_INVALID_REVNUM,
-                                 NULL, SVN_INVALID_REVNUM, NULL, NULL,
+                                 NULL, merged_rev, merged_rev_props, merged_path,
                                  sb->data, TRUE, iterpool));
             }
           if (eof) break;
Index: subversion/svn/blame-cmd.c
===================================================================
--- subversion/svn/blame-cmd.c	(revision 37375)
+++ subversion/svn/blame-cmd.c	(working copy)
@@ -178,8 +178,9 @@
          revision which put the line in its current state, so we use the
          earliest revision.  If we ever switch to a backward blame algorithm,
          we may need to adjust this. */
-      if (merged_revision < revision)
-        {
+      if (SVN_IS_VALID_REVNUM(merged_revision) &&
+		  (!SVN_IS_VALID_REVNUM(revision) || merged_revision < revision))
+		{
           svn_stream_printf(out, pool, "G ");
           use_merged = TRUE;
         }
