Index: src/info.c
==================================================================
--- src/info.c
+++ src/info.c
@@ -360,11 +360,11 @@
       if( fossil_strcmp(zOld, zNew)!=0 ){
         @ <p>Modified %z(href("%R/finfo?name=%T",zName))%h(zName)</a>
         @ from %z(href("%R/artifact/%s",zOld))[%S(zOld)]</a>
         @ to %z(href("%R/artifact/%s",zNew))[%S(zNew)].</a>
       }else if( zOldName!=0 && fossil_strcmp(zName,zOldName)!=0 ){
-        @ <p>Name change from
+        @ <p>Name change
         @ from %z(href("%R/finfo?name=%T",zOldName))%h(zOldName)</a>
         @ to %z(href("%R/finfo?name=%T",zName))%h(zName)</a>.
       }else{
         @ <p>Execute permission %s(( mperm==PERM_EXE )?"set":"cleared") for
         @ %z(href("%R/finfo?name=%T",zName))%h(zName)</a>
@@ -700,12 +700,14 @@
        "       (SELECT uuid FROM blob WHERE rid=mlink.pid),"
        "       (SELECT uuid FROM blob WHERE rid=mlink.fid),"
        "       (SELECT name FROM filename WHERE filename.fnid=mlink.pfnid)"
        "  FROM mlink JOIN filename ON filename.fnid=mlink.fnid"
        " WHERE mlink.mid=%d"
+       "   AND (mlink.fid>0"
+              " OR mlink.fnid NOT IN (SELECT pfnid FROM mlink WHERE mid=%d))"
        " ORDER BY name /*sort*/",
-       rid
+       rid, rid
     );
     diffFlags = construct_diff_flags(showDiff, sideBySide);
     while( db_step(&q)==SQLITE_ROW ){
       const char *zName = db_column_text(&q,0);
       int mperm = db_column_int(&q, 1);

Index: src/manifest.c
==================================================================
--- src/manifest.c
+++ src/manifest.c
@@ -1983,5 +1983,23 @@
     manifest_destroy(p);
   }
   assert( blob_is_reset(pContent) );
   return 1;
 }
+
+/*
+** COMMAND: test-crosslink
+**
+** Usage:  %fossil test-crosslink RECORDID
+**
+** Run the manifest_crosslink() routine on the artifact with the given
+** record ID.  This is typically done in the debugger.
+*/
+void test_crosslink_cmd(void){
+  int rid;
+  Blob content;
+  db_find_and_open_repository(0, 0);
+  if( g.argc!=3 ) usage("RECORDID");
+  rid = name_to_rid(g.argv[2]);
+  content_get(rid, &content);
+  manifest_crosslink(rid, &content);
+}

Index: src/timeline.c
==================================================================
--- src/timeline.c
+++ src/timeline.c
@@ -426,10 +426,12 @@
           "       (SELECT uuid FROM blob WHERE rid=fid),"
           "       (SELECT uuid FROM blob WHERE rid=pid),"
           "       (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
           "  FROM mlink"
           " WHERE mid=:mid AND (pid!=fid OR pfnid>0)"
+          "   AND (fid>0 OR"
+               "   fnid NOT IN (SELECT pfnid FROM mlink WHERE mid=:mid))"
           " ORDER BY 3 /*sort*/"
         );
         fchngQueryInit = 1;
       }
       db_bind_int(&fchngQuery, ":mid", rid);