/* Forward referenced subroutines */
 
-static void store_backup(LEX *lc, struct res_items *item, int index, int pass);
-static void store_restore(LEX *lc, struct res_items *item, int index, int pass);
 static void store_jobtype(LEX *lc, struct res_items *item, int index, int pass);
 static void store_level(LEX *lc, struct res_items *item, int index, int pass);
 static void store_replace(LEX *lc, struct res_items *item, int index, int pass);
  *   name         handler     value                 code flags    default_value
  */
 static struct res_items job_items[] = {
-   {"name",     store_name,    ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0},
-   {"description", store_str,  ITEM(res_job.hdr.desc), 0, 0, 0},
-   {"backup",   store_backup,  ITEM(res_job),          JT_BACKUP, 0, 0},
-   {"verify",   store_backup,  ITEM(res_job),          JT_VERIFY, 0, 0},
-   {"restore",  store_restore, ITEM(res_job),          JT_RESTORE, 0, 0},
-   {"schedule", store_res,     ITEM(res_job.schedule), R_SCHEDULE, 0, 0},
-   {"type",     store_jobtype, ITEM(res_job),          0, 0, 0},
-   {"level",    store_level,   ITEM(res_job),          0, 0, 0},
-   {"messages", store_res,     ITEM(res_job.messages), R_MSGS, 0, 0},
-   {"storage",  store_res,     ITEM(res_job.storage),  R_STORAGE, 0, 0},
-   {"pool",     store_res,     ITEM(res_job.pool),     R_POOL, 0, 0},
-   {"client",   store_res,     ITEM(res_job.client),   R_CLIENT, 0, 0},
-   {"fileset",  store_res,     ITEM(res_job.fileset),  R_FILESET, 0, 0},
-   {"jobdefs",  store_defs,    ITEM(res_job),          R_JOB, 0, 0},
-   {"verifyjob",  store_res,   ITEM(res_job.verify_job), R_JOB, 0, 0},
-   {"where",    store_dir,     ITEM(res_job.RestoreWhere), 0, 0, 0},
-   {"replace",  store_replace, ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS},
-   {"bootstrap",store_dir,     ITEM(res_job.RestoreBootstrap), 0, 0, 0},
-   {"maxruntime", store_time,  ITEM(res_job.MaxRunTime), 0, 0, 0},
-   {"maxwaittime", store_time,  ITEM(res_job.MaxWaitTime), 0, 0, 0},
-   {"maxstartdelay", store_time,ITEM(res_job.MaxStartDelay), 0, 0, 0},
+   {"name",      store_name,    ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0},
+   {"description", store_str,   ITEM(res_job.hdr.desc), 0, 0, 0},
+   {"type",      store_jobtype, ITEM(res_job),          0, 0, 0},
+   {"level",     store_level,   ITEM(res_job),          0, 0, 0},
+   {"messages",  store_res,     ITEM(res_job.messages), R_MSGS, 0, 0},
+   {"storage",   store_res,     ITEM(res_job.storage),  R_STORAGE, 0, 0},
+   {"pool",      store_res,     ITEM(res_job.pool),     R_POOL, 0, 0},
+   {"client",    store_res,     ITEM(res_job.client),   R_CLIENT, 0, 0},
+   {"fileset",   store_res,     ITEM(res_job.fileset),  R_FILESET, 0, 0},
+   {"schedule",  store_res,     ITEM(res_job.schedule), R_SCHEDULE, 0, 0},
+   {"verifyjob", store_res,     ITEM(res_job.verify_job), R_JOB, 0, 0},
+   {"jobdefs",   store_res,     ITEM(res_job.jobdefs),  R_JOBDEFS, 0, 0},
+   {"where",    store_dir,      ITEM(res_job.RestoreWhere), 0, 0, 0},
+   {"bootstrap",store_dir,      ITEM(res_job.RestoreBootstrap), 0, 0, 0},
+   {"writebootstrap",store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0},
+   {"replace",  store_replace,  ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS},
+   {"maxruntime",   store_time, ITEM(res_job.MaxRunTime), 0, 0, 0},
+   {"maxwaittime",  store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0},
+   {"maxstartdelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0},
+   {"jobretention", store_time, ITEM(res_job.JobRetention),  0, 0, 0},
    {"prefixlinks", store_yesno, ITEM(res_job.PrefixLinks), 1, ITEM_DEFAULT, 0},
    {"prunejobs",   store_yesno, ITEM(res_job.PruneJobs), 1, ITEM_DEFAULT, 0},
    {"prunefiles",  store_yesno, ITEM(res_job.PruneFiles), 1, ITEM_DEFAULT, 0},
-   {"prunevolumes", store_yesno, ITEM(res_job.PruneVolumes), 1, ITEM_DEFAULT, 0},
+   {"prunevolumes",store_yesno, ITEM(res_job.PruneVolumes), 1, ITEM_DEFAULT, 0},
+   {"spoolattributes",store_yesno, ITEM(res_job.SpoolAttributes), 1, ITEM_DEFAULT, 0},
    {"runbeforejob", store_str,  ITEM(res_job.RunBeforeJob), 0, 0, 0},
    {"runafterjob",  store_str,  ITEM(res_job.RunAfterJob),  0, 0, 0},
    {"runafterfailedjob",  store_str,  ITEM(res_job.RunAfterFailedJob),  0, 0, 0},
    {"clientrunbeforejob", store_str,  ITEM(res_job.ClientRunBeforeJob), 0, 0, 0},
    {"clientrunafterjob",  store_str,  ITEM(res_job.ClientRunAfterJob),  0, 0, 0},
-   {"spoolattributes", store_yesno, ITEM(res_job.SpoolAttributes), 1, ITEM_DEFAULT, 0},
-   {"writebootstrap", store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0},
    {"maximumconcurrentjobs", store_pint, ITEM(res_job.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1},
    {"rescheduleonerror", store_yesno, ITEM(res_job.RescheduleOnError), 1, ITEM_DEFAULT, 0},
    {"rescheduleinterval", store_time, ITEM(res_job.RescheduleInterval), 0, ITEM_DEFAULT, 60 * 30},
    {"rescheduletimes", store_pint, ITEM(res_job.RescheduleTimes), 0, 0, 0},
    {"priority",   store_pint, ITEM(res_job.Priority), 0, ITEM_DEFAULT, 10},
-   {"jobretention",  store_time,  ITEM(res_job.JobRetention),  0, 0, 0},
    {NULL, NULL, NULL, 0, 0, 0} 
 };
 
    {"director",      dir_items,   R_DIRECTOR,  NULL},
    {"client",        cli_items,   R_CLIENT,    NULL},
    {"job",           job_items,   R_JOB,       NULL},
-   {"jobdefs",       job_items,   R_JOBDEFS,   NULL},
    {"storage",       store_items, R_STORAGE,   NULL},
    {"catalog",       cat_items,   R_CATALOG,   NULL},
    {"schedule",      sch_items,   R_SCHEDULE,  NULL},
    {"messages",      msgs_items,  R_MSGS,      NULL},
    {"counter",       counter_items, R_COUNTER, NULL},
    {"console",       con_items,   R_CONSOLE,   NULL},
+   {"jobdefs",       job_items,   R_JOBDEFS,   NULL},
    {NULL,           NULL,        0,           NULL}
 };
 
    {NULL,           0}
 };
 
+#ifdef old_deprecated_code
 
 /* Keywords (RHS) permitted in Backup and Verify records */
 static struct s_kw BakVerFields[] = {
    {"bootstrap",     'B'},            /* bootstrap file */
    {NULL,             0}
 };
+#endif
 
 /* Options permitted in Restore replace= */
 struct s_kw ReplaceOptions[] = {
 }
 
 /* 
- * Free memory of resource.  
+ * Free memory of resource -- called when daemon terminates.
  * NB, we don't need to worry about freeing any references
  * to other resources as they will be freed when that 
  * resource chain is traversed.  Mainly we worry about freeing
    int i, size;
    int error = 0;
    
+   if (type == R_JOBDEFS) {
+      return;                        /* nothing required */
+   }
    /* 
     * Ensure that all required items are present
     */
       }
    }
 
-   /* During pass 2 in each "store" routine, we looked up pointers 
+   /*
+    * During pass 2 in each "store" routine, we looked up pointers 
     * to all the resources referrenced in the current resource, now we
     * must copy their addresses from the static record to the allocated
     * record.
         res->res_dir.messages = res_all.res_dir.messages;
         break;
       case R_JOB:
+      case R_JOBDEFS:
         if ((res = (URES *)GetResWithName(type, res_all.res_dir.hdr.name)) == NULL) {
             Emsg1(M_ERROR_TERM, 0, "Cannot find Job resource %s\n", 
                  res_all.res_dir.hdr.name);
         res->res_job.storage    = res_all.res_job.storage;
         res->res_job.pool       = res_all.res_job.pool;
         res->res_job.verify_job = res_all.res_job.verify_job;
-        if (res->res_job.JobType == 0) {
-            Emsg1(M_ERROR_TERM, 0, "Job Type not defined for Job resource %s\n", res_all.res_dir.hdr.name);
-        }
-        if (res->res_job.level != 0) {
-           int i;
-           for (i=0; joblevels[i].level_name; i++) {
-              if (joblevels[i].level == res->res_job.level &&
-                  joblevels[i].job_type == res->res_job.JobType) {
-                 i = 0;
-                 break;
-              }
+        res->res_job.jobdefs    = res_all.res_job.jobdefs;
+        if (type == R_JOB) {
+           if (res->res_job.JobType == 0) {
+               Emsg1(M_ERROR_TERM, 0, "Job Type not defined for Job resource %s\n", res_all.res_dir.hdr.name);
            }
-           if (i != 0) {
-               Emsg1(M_ERROR_TERM, 0, "Inappropriate level specified in Job resource %s\n", 
-                 res_all.res_dir.hdr.name);
+           if (res->res_job.level != 0) {
+              int i;
+              for (i=0; joblevels[i].level_name; i++) {
+                 if (joblevels[i].level == res->res_job.level &&
+                     joblevels[i].job_type == res->res_job.JobType) {
+                    i = 0;
+                    break;
+                 }
+              }
+              if (i != 0) {
+                  Emsg1(M_ERROR_TERM, 0, "Inappropriate level specified in Job resource %s\n", 
+                    res_all.res_dir.hdr.name);
+              }
            }
         }
         break;
         res->res_client.catalog = res_all.res_client.catalog;
         break;
       case R_SCHEDULE:
-        /* Schedule is a bit different in that it contains a RUN record
+        /*
+         * Schedule is a bit different in that it contains a RUN record
           * chain which isn't a "named" resource. This chain was linked
          * in by run_conf.c during pass 2, so here we jam the pointer 
          * into the Schedule resource.                         
    }
    /* Common */
    if (!error) {
+      if (type == R_JOBDEFS) {
+         Dmsg0(200, "Storing JobDefs definition.\n");
+      }
       res = (URES *)malloc(size);
       memcpy(res, &res_all, size);
       if (!resources[rindex].res_head) {
    set_bit(index, res_all.hdr.item_present);
 }
 
+#ifdef old_deprecated_code
 /* 
  * Store backup/verify info for Job record 
  *
    lc->options = options;            /* reset original options */
    set_bit(index, res_all.hdr.item_present);
 }
+#endif
 
 {
    STORE *store, **unique_store;
    CLIENT *client, **unique_client;
-   int i, j, found;
+   int i, j;
+   bool found;
 
    do_director_status(ua, cmd);
 
    /* Count Storage items */
    LockRes();
-   store = NULL;
-   for (i=0; (store = (STORE *)GetNextRes(R_STORAGE, (RES *)store)); i++)
-      { }
+   i = 0;
+   foreach_res(store, R_STORAGE) {
+      i++;
+   }
    unique_store = (STORE **) malloc(i * sizeof(STORE));
    /* Find Unique Storage address/port */        
-   store = (STORE *)GetNextRes(R_STORAGE, NULL);
    i = 0;
-   unique_store[i++] = store;
-   while ((store = (STORE *)GetNextRes(R_STORAGE, (RES *)store))) {
-      found = 0;
+   foreach_res(store, R_STORAGE) {
+      found = false;
       for (j=0; j<i; j++) {
         if (strcmp(unique_store[j]->address, store->address) == 0 &&
             unique_store[j]->SDport == store->SDport) {
-           found = 1;
+           found = true;
            break;
         }
       }
 
    /* Count Client items */
    LockRes();
-   client = NULL;
-   for (i=0; (client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client)); i++)
-      { }
+   i = 0;
+   foreach_res(client, R_CLIENT) {
+      i++;
+   }
    unique_client = (CLIENT **)malloc(i * sizeof(CLIENT));
    /* Find Unique Client address/port */        
-   client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
    i = 0;
-   unique_client[i++] = client;
-   while ((client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client))) {
-      found = 0;
+   foreach_res(client, R_CLIENT) {
+      found = false;
       for (j=0; j<i; j++) {
         if (strcmp(unique_client[j]->address, client->address) == 0 &&
             unique_client[j]->FDport == client->FDport) {
-           found = 1;
+           found = true;
            break;
         }
       }
 
    bsendmsg(ua, "%s Version: " VERSION " (" BDATE ") %s %s %s\n", my_name,
            HOST_OS, DISTNAME, DISTVER);
-   bstrftime(dt, sizeof(dt), daemon_start_time);
-   strcpy(dt+7, dt+9);    /* cut century */
+   bstrftime_nc(dt, sizeof(dt), daemon_start_time);
    bsendmsg(ua, _("Daemon started %s, %d Job%s run.\n"), dt, last_job.NumJobs,
         last_job.NumJobs == 1 ? "" : "s");
    /*
          bstrncpy(mr.VolumeName, "*unknown*", sizeof(mr.VolumeName));
       }
    }
-   bstrftime(dt, sizeof(dt), runtime);
-   strcpy(dt+7, dt+9);    /* cut century */
+   bstrftime_nc(dt, sizeof(dt), runtime);
    switch (job->JobType) {
    case JT_ADMIN:
    case JT_RESTORE:
 
    /* Loop through all jobs */
    LockRes();
-   for (job=NULL; (job=(JOB *)GetNextRes(R_JOB, (RES *)job)); ) {
+   foreach_res(job, R_JOB) {
       for (run=NULL; (run = find_next_run(run, job, runtime)); ) {
         level = job->level;   
         if (run->level) {
          * jobs in the status output.
          */
         if (jcr->JobType == JT_CONSOLE) {
-           bstrftime(dt, sizeof(dt), jcr->start_time);
-           strcpy(dt+7, dt+9);  /* cut century */
+           bstrftime_nc(dt, sizeof(dt), jcr->start_time);
             bsendmsg(ua, _("Console connected at %s\n"), dt);
         }
         njobs--;
       char JobName[MAX_NAME_LENGTH];
       char *termstat;
 
-      bstrftime(dt, sizeof(dt), je->end_time);
-      strcpy(dt+7, dt+9);     /* cut century */
+      bstrftime_nc(dt, sizeof(dt), je->end_time);
       switch (je->JobType) {
       case JT_ADMIN:
       case JT_RESTORE: