free_pool_memory(query);
            return 0;
         }
-        fsr.FileSetId = 0;
-        strcpy(fsr.FileSet, fileset_name);
+        fsr.FileSetId = atoi(fileset_name);  /* Id is first part of name */
         if (!db_get_fileset_record(ua->db, &fsr)) {
             bsendmsg(ua, "Error getting FileSet record: %s\n", db_strerror(ua->db));
             bsendmsg(ua, _("This probably means you modified the FileSet.\n"
                            "Continuing anyway.\n"));
         }
 
+        /* Find JobId of last Full backup for this client, fileset */
         Mmsg(&query, uar_last_full, ji->client->hdr.name, fsr.FileSetId);
-        /* Find JobId of full Backup of system */
         if (!db_sql_query(ua->db, query, NULL, NULL)) {
             bsendmsg(ua, "%s\n", db_strerror(ua->db));
         }
  */
 static int fileset_handler(void *ctx, int num_fields, char **row)
 {
-   add_prompt((UAContext *)ctx, row[1]);
+   char prompt[MAX_NAME_LENGTH+200];
+
+   snprintf(prompt, sizeof(prompt), "%s  %s  %s", row[0], row[1], row[2]);
+   add_prompt((UAContext *)ctx, prompt);
    return 0;
 }
 
 
 
    jcr->buf_size = sd->msglen;            
    /* Adjust for compression so that output buffer is
-    * 12 bytes + 0.1% larger than input buffer plus 2 bytes.
+    * 12 bytes + 0.1% larger than input buffer plus 18 bytes.
+    * This gives a bit extra plus room for the sparse addr if any.
     * Note, we adjust the read size to be smaller so that the
     * same output buffer can be used without growing it.
     */
-   jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 14;
+   jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30;
    jcr->compress_buf = get_memory(jcr->compress_buf_size);
 
    Dmsg1(100, "set_find_options ff=%p\n", jcr->ff);
     *
     */
    if (ff_pkt->fid >= 0) {
+      uint64_t fileAddr = 0;         /* file address */
+      char *rbuf, *wbuf;
+      int rsize = jcr->buf_size;      /* read buffer size */
+
+      msgsave = sd->msg;
+      rbuf = sd->msg;                /* read buffer */             
+      wbuf = sd->msg;                /* write buffer */
 
       Dmsg1(100, "Saving data, type=%d\n", ff_pkt->type);
-      /*
-       * Send Data header to Storage daemon
-       *    <file-index> <stream> <info>
-       */
 
       if (ff_pkt->flags & FO_SPARSE) {
         stream = STREAM_SPARSE_DATA;
       }
 
 #ifdef HAVE_LIBZ
-      uLong compress_len;   
+      uLong compress_len, max_compress_len = 0;
       const Bytef *cbuf = NULL;
 
       if (ff_pkt->flags & FO_GZIP) {
 
         if (ff_pkt->flags & FO_SPARSE) {
            cbuf = (Bytef *)jcr->compress_buf + SPARSE_FADDR_SIZE;
-           compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
+           max_compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
         } else {
            cbuf = (Bytef *)jcr->compress_buf;
-           compress_len = jcr->compress_buf_size; /* set max length */
+           max_compress_len = jcr->compress_buf_size; /* set max length */
         }
+        wbuf = jcr->compress_buf;    /* compressed output here */
       }
 #endif
 
 #ifndef NO_FD_SEND_TEST
+      /*
+       * Send Data header to Storage daemon
+       *    <file-index> <stream> <info>
+       */
       if (!bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, stream)) {
         close(ff_pkt->fid);
         return 0;
         MD5Init(&md5c);
       }
 
-      msgsave = sd->msg;
-      uint64_t fileAddr = 0;         /* file address */
-      char *rbuf = sd->msg;          /* read buffer */             
-      int rsize = jcr->buf_size;      /* read size */
-
-      /* Make space at beginning of buffer for fileAddr */
+      /*
+       * Make space at beginning of buffer for fileAddr because this
+       *   same buffer will be used for writing if compression if off. 
+       */
       if (ff_pkt->flags & FO_SPARSE) {
         rbuf += SPARSE_FADDR_SIZE;
         rsize -= SPARSE_FADDR_SIZE;
               sparseBlock = is_buf_zero(rbuf, rsize);
            }
               
-           ser_begin(sd->msg, SPARSE_FADDR_SIZE);
+           ser_begin(wbuf, SPARSE_FADDR_SIZE);
            ser_uint64(fileAddr);     /* store fileAddr in begin of buffer */
         } 
 
 #ifdef HAVE_LIBZ
         /* Do compression if turned on */
         if (!sparseBlock && ff_pkt->flags & FO_GZIP) {
-           if (compress2((Bytef *)cbuf, &compress_len, 
+           int zstat;
+           compress_len = max_compress_len;
+            Dmsg4(400, "cbuf=0x%x len=%u rbuf=0x%x len=%u\n", cbuf, compress_len,
+              rbuf, sd->msglen);
+           /* NOTE! This call modifies compress_len !!! */
+           if ((zstat=compress2((Bytef *)cbuf, &compress_len, 
                  (const Bytef *)rbuf, (uLong)sd->msglen,
-                 ff_pkt->GZIP_level)  != Z_OK) {
-               Jmsg(jcr, M_FATAL, 0, _("Compression error\n"));
+                 ff_pkt->GZIP_level)) != Z_OK) {
+               Jmsg(jcr, M_FATAL, 0, _("Compression error: %d\n"), zstat);
               sd->msg = msgsave;
               sd->msglen = 0;
               close(ff_pkt->fid);
               return 0;
            }
-            Dmsg2(100, "compressed len=%d uncompressed len=%d\n", 
+            Dmsg2(400, "compressed len=%d uncompressed len=%d\n", 
               compress_len, sd->msglen);
 
-           sd->msg = jcr->compress_buf; /* write compressed buffer */
-           sd->msglen = compress_len;
+           sd->msglen = compress_len;   /* set compressed length */
         }
 #endif
 
            if (ff_pkt->flags & FO_SPARSE) {
               sd->msglen += SPARSE_FADDR_SIZE; /* include fileAddr in size */
            }
+           sd->msg = wbuf;           /* set correct write buffer */
            if (!bnet_send(sd)) {
               sd->msg = msgsave;     /* restore read buffer */
               sd->msglen = 0;
 
       } else if (stream == STREAM_GZIP_DATA || stream == STREAM_SPARSE_GZIP_DATA) {
 #ifdef HAVE_LIBZ
         if (extract) {
+           ser_declare;
            uLong compress_len;
+           uint64_t faddr;
+           char ec1[50];
            int stat;
 
            if (stream == STREAM_SPARSE_GZIP_DATA) {
               wbuf = sd->msg + SPARSE_FADDR_SIZE;
               wsize = sd->msglen - SPARSE_FADDR_SIZE;
-              if (fileAddr != *((uint64_t *)sd->msg)) {
-                 fileAddr = *((uint64_t *)sd->msg);
+              ser_begin(sd->msg, SPARSE_FADDR_SIZE);
+              unser_uint64(faddr);
+              if (fileAddr != faddr) {
+                 fileAddr = faddr;
                  if (lseek(ofd, (off_t)fileAddr, SEEK_SET) < 0) {
-                     Jmsg2(jcr, M_ERROR, 0, "Seek error on %s: %s\n", ofile, strerror(errno));
+                     Jmsg3(jcr, M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"),
+                        edit_uint64(fileAddr, ec1), ofile, strerror(errno));
                     goto bail_out;
                  }
               }