  
 Index: src/lib/util.c
 ===================================================================
---- src/lib/util.c	(revision 8163)
+--- src/lib/util.c	(revision 8203)
 +++ src/lib/util.c	(working copy)
 @@ -361,6 +361,9 @@
     case JT_COPY:

Index: src/dird/ua_output.c
===================================================================
--- src/dird/ua_output.c	(revision 8163)
+++ src/dird/ua_output.c	(working copy)
@@ -454,6 +454,15 @@
             }
          }
          list_nextvol(ua, n);
+      } else if (strcasecmp(ua->argk[i], NT_("copies")) == 0) {
+         for (j=i+1; j<ua->argc; j++) {
+            if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) {
+               jr.JobId = str_to_int64(ua->argv[j]);
+            } else if (strcasecmp(ua->argk[j], NT_("limit")) == 0 && ua->argv[j]) {
+               jr.limit = atoi(ua->argv[j]);
+            } 
+         }
+         db_list_copies_records(ua->jcr, ua->db, &jr, prtit, ua, llist);
       } else if (strcasecmp(ua->argk[i], NT_("limit")) == 0
                  || strcasecmp(ua->argk[i], NT_("days")) == 0) {
          /* Ignore it */
Index: src/dird/migrate.c
===================================================================
--- src/dird/migrate.c	(revision 8179)
+++ src/dird/migrate.c	(working copy)
@@ -1158,13 +1158,17 @@
       /*

  { NT_("messages"),   messagescmd,   _("messages"),                                   false},
Index: src/cats/protos.h
===================================================================
--- src/cats/protos.h	(revision 8203)
+++ src/cats/protos.h	(working copy)
@@ -124,6 +124,7 @@
 void db_list_joblog_records(JCR *jcr, B_DB *mdb, JobId_t JobId, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
 int  db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, e_list_type type);
 void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
+void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *jobids, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
 
 /* sql_update.c */
 bool db_update_job_start_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
Index: src/cats/sql_cmds.c
===================================================================
--- src/cats/sql_cmds.c	(revision 8203)
+++ src/cats/sql_cmds.c	(working copy)
@@ -286,7 +286,7 @@
    "FROM Client,Job,JobMedia,Media,FileSet WHERE Client.ClientId=%s "
    "AND Job.ClientId=%s "
    "AND Job.StartTime<'%s' "
-   "AND Level='F' AND JobStatus='T' AND Type='B' "
+   "AND Level='F' AND JobStatus='T' "
    "AND JobMedia.JobId=Job.JobId "
    "AND Media.Enabled=1 "
    "AND JobMedia.MediaId=Media.MediaId "
@@ -297,13 +297,14 @@
 
 const char *uar_full =
    "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,"
-   "Job.ClientId,Job.Level,Job.JobFiles,Job.JobBytes,"
-   "StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime "
-   "FROM temp1,Job,JobMedia,Media WHERE temp1.JobId=Job.JobId "
-   "AND Level='F' AND JobStatus='T' AND Type='B' "
-   "AND Media.Enabled=1 "
-   "AND JobMedia.JobId=Job.JobId "
-   "AND JobMedia.MediaId=Media.MediaId";
+     "Job.ClientId,Job.Level,Job.JobFiles,Job.JobBytes,"
+     "StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime "
+    "FROM temp1,Job,JobMedia,Media "
+   "WHERE temp1.JobId=Job.JobId "
+     "AND Level='F' AND JobStatus='T' "
+     "AND Media.Enabled=1 "
+     "AND JobMedia.JobId=Job.JobId "
+     "AND JobMedia.MediaId=Media.MediaId";
 
 const char *uar_dif =
    "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
@@ -316,7 +317,7 @@
    "AND JobMedia.JobId=Job.JobId "
    "AND Media.Enabled=1 "
    "AND JobMedia.MediaId=Media.MediaId "
-   "AND Job.Level='D' AND JobStatus='T' AND Type='B' "
+   "AND Job.Level='D' AND JobStatus='T' "
    "AND Job.FileSetId=FileSet.FileSetId "
    "AND FileSet.FileSet='%s' "
    "%s"
@@ -333,7 +334,7 @@
    "AND Media.Enabled=1 "
    "AND JobMedia.JobId=Job.JobId "
    "AND JobMedia.MediaId=Media.MediaId "
-   "AND Job.Level='I' AND JobStatus='T' AND Type='B' "
+   "AND Job.Level='I' AND JobStatus='T' "
    "AND Job.FileSetId=FileSet.FileSetId "
    "AND FileSet.FileSet='%s' "
    "%s";
Index: src/cats/sql_list.c
===================================================================
--- src/cats/sql_list.c	(revision 8203)
+++ src/cats/sql_list.c	(working copy)
@@ -242,6 +242,43 @@
 }
 
 
+void db_list_copies_records(JCR *jcr, B_DB *mdb, uint32_t limit, char *JobIds,
+                            DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
+{
+   POOL_MEM str_limit(PM_MESSAGE);
+   POOL_MEM str_jobids(PM_MESSAGE);
+
+   if (limit > 0) {
+      Mmsg(str_limit, " LIMIT %d", limit);
+   }
+
+   if (JobIds && JobIds[0]) {
+      Mmsg(str_jobids, " AND (C.PriorJobId IN (%s) OR C.JobId IN (%s)) ", 
+           JobIds, JobIds);      
+   }
+
+   db_lock(mdb);
+   Mmsg(mdb->cmd, 
+   "SELECT DISTINCT C.PriorJobId AS JobId, C.Job, "
+                   "C.JobId AS CopyJobId, M.MediaType "
+     "FROM Job AS C " 
+     "JOIN JobMedia    USING (JobId) "
+     "JOIN Media AS M  USING (MediaId) "
+    "WHERE C.Type = '%c' %s ORDER BY C.PriorJobId DESC %s",
+        (char) JT_JOB_COPY, str_jobids.c_str(), str_limit.c_str());
+
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
+      goto bail_out;
