Index: src/attach.c
==================================================================
--- src/attach.c
+++ src/attach.c
@@ -71,10 +71,11 @@
     const char *zFilename = db_column_text(&q, 3);
     const char *zComment = db_column_text(&q, 4);
     const char *zUser = db_column_text(&q, 5);
     const char *zUuid = db_column_text(&q, 6);
     int attachid = db_column_int(&q, 7);
+    const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
     int i;
     char *zUrlTail;
     for(i=0; zFilename[i]; i++){
       if( zFilename[i]=='/' && zFilename[i+1]!=0 ){ 
         zFilename = &zFilename[i+1];
@@ -115,11 +116,11 @@
         @ Deleted
       }else {
         @ Added
       }
     }
-    @ by %h(zUser) on
+    @ by %h(zDispUser) on
     hyperlink_to_date(zDate, ".");
     free(zUrlTail);
   }
   db_finalize(&q);
   @ </ol>
@@ -557,17 +558,18 @@
     const char *zDate = db_column_text(&q, 0);
     const char *zFile = db_column_text(&q, 1);
     const char *zUser = db_column_text(&q, 2);
     const char *zUuid = db_column_text(&q, 3);
     const char *zSrc = db_column_text(&q, 4);
+    const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
     if( cnt==0 ){
       @ %s(zHeader)
     }
     cnt++;
     @ <li>
     @ %z(href("%R/artifact/%s",zSrc))%h(zFile)</a>
-    @ added by %h(zUser) on
+    @ added by %h(zDispUser) on
     hyperlink_to_date(zDate, ".");
     @ [%z(href("%R/ainfo/%s",zUuid))details</a>]
     @ </li>
   }
   if( cnt ){

Index: src/timeline.c
==================================================================
--- src/timeline.c
+++ src/timeline.c
@@ -85,10 +85,11 @@
 ** Generate a hyperlink to a user.  This will link to a timeline showing
 ** events by that user.  If the date+time is specified, then the timeline
 ** is centered on that date+time.
 */
 void hyperlink_to_user(const char *zU, const char *zD, const char *zSuf){
+  if( zU==0 || zU[0]==0 ) zU = "anonymous";
   if( zSuf==0 ) zSuf = "";
   if( g.perm.Hyperlink ){
     if( zD && zD[0] ){
       @ %z(href("%R/timeline?c=%T&u=%T",zD,zU))%h(zU)</a>%s(zSuf)
     }else{
@@ -237,10 +238,11 @@
     const char *zDate = db_column_text(pQuery, 2);
     const char *zType = db_column_text(pQuery, 7);
     const char *zUser = db_column_text(pQuery, 4);
     const char *zTagList = db_column_text(pQuery, 8);
     int tagid = db_column_int(pQuery, 9);
+    const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
     const char *zBr = 0;      /* Branch */
     int commentColumn = 3;    /* Column containing comment text */
     int modPending;           /* Pending moderation */
     char zTime[8];
 
@@ -372,15 +374,15 @@
 
     /* Generate the "user: USERNAME" at the end of the comment, together
     ** with a hyperlink to another timeline for that user.
     */
     if( zTagList && zTagList[0]==0 ) zTagList = 0;
-    if( g.perm.Hyperlink && fossil_strcmp(zUser, zThisUser)!=0 ){
-      char *zLink = mprintf("%R/timeline?u=%h&c=%t&nd", zUser, zDate);
-      @ (user: %z(href("%z",zLink))%h(zUser)</a>%s(zTagList?",":"\051")
+    if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
+      char *zLink = mprintf("%R/timeline?u=%h&c=%t&nd", zDispUser, zDate);
+      @ (user: %z(href("%z",zLink))%h(zDispUser)</a>%s(zTagList?",":"\051")
     }else{
-      @ (user: %h(zUser)%s(zTagList?",":"\051")
+      @ (user: %h(zDispUser)%s(zTagList?",":"\051")
     }
 
     /* Generate a "detail" link for tags. */
     if( (zType[0]=='g' || zType[0]=='w' || zType[0]=='t') && g.perm.Hyperlink ){
       @ [%z(href("%R/info/%S",zUuid))details</a>]