Index: bacula/src/dird/fd_cmds.c
===================================================================
--- bacula/src/dird/fd_cmds.c	(revision 6375)
+++ bacula/src/dird/fd_cmds.c	(working copy)
@@ -161,6 +161,8 @@
 void get_level_since_time(JCR *jcr, char *since, int since_len)
 {
    int JobLevel;
+   bool FullOk;
+   utime_t now, LastFull;
 
    since[0] = 0;
    if (jcr->cloned) {
@@ -182,8 +184,15 @@
    case L_INCREMENTAL:
       /* Look up start time of last job */
       jcr->jr.JobId = 0;     /* flag for db_find_job_start time */
-      if (!db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime)) {
-         /* No job found, so upgrade this one to Full */
+      FullOk = db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime);
+      /* If there was a successful job, make sure it is recent enough */
+      if (FullOk && jcr->job->MaxFullAge > 0) {
+         now = btime_to_utime(get_current_btime());
+         LastFull = str_to_utime(jcr->stime);
+         FullOk = ((now - LastFull) < jcr->job->MaxFullAge);
+      }
+      if (!FullOk) {
+         /* No recent job found, so upgrade this one to Full */
          Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db));
          Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing FULL backup.\n"));
          bsnprintf(since, since_len, _(" (upgraded from %s)"),
Index: bacula/src/dird/dird_conf.c
===================================================================
--- bacula/src/dird/dird_conf.c	(revision 6375)
+++ bacula/src/dird/dird_conf.c	(working copy)
@@ -293,6 +293,7 @@
    {"differentialmaxwaittime",  store_time, ITEM(res_job.DiffMaxWaitTime), 0, 0, 0},
    {"maxwaittime",  store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0},
    {"maxstartdelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0},
+   {"maxfullage",  store_time, ITEM(res_job.MaxFullAge), 0, 0, 0},
    {"jobretention", store_time, ITEM(res_job.JobRetention),  0, 0, 0},
    {"prefixlinks", store_bool, ITEM(res_job.PrefixLinks), 0, ITEM_DEFAULT, false},
    {"prunejobs",   store_bool, ITEM(res_job.PruneJobs), 0, ITEM_DEFAULT, false},
Index: bacula/src/dird/dird_conf.h
===================================================================
--- bacula/src/dird/dird_conf.h	(revision 6375)
+++ bacula/src/dird/dird_conf.h	(working copy)
@@ -385,6 +385,7 @@
    utime_t MaxStartDelay;             /* max start delay in seconds */
    utime_t RescheduleInterval;        /* Reschedule interval */
    utime_t JobRetention;              /* job retention period in seconds */
+   utime_t MaxFullAge;                /* Max age of full to avoid upgrade */
    uint32_t MaxConcurrentJobs;        /* Maximum concurrent jobs */
    int64_t spool_size;                /* Size of spool file for this job */
    int RescheduleTimes;               /* Number of times to reschedule job */
Index: docs/manuals/en/install/dirdconf.tex
===================================================================
--- docs/manuals/en/install/dirdconf.tex	(revision 6375)
+++ docs/manuals/en/install/dirdconf.tex	(working copy)
@@ -456,6 +456,7 @@
    different FileSet.  
 \item The Job was a Full, Differential, or Incremental backup.  
 \item The Job terminated normally (i.e. did not fail or was not  canceled).  
+\item The Job started no longer ago than {\bf Max Full Age}.
 \end{itemize}
 
    If all the above conditions do not hold, the Director will upgrade  the
@@ -515,6 +516,7 @@
    different FileSet.  
 \item The Job was a FULL backup.  
 \item The Job terminated normally (i.e. did not fail or was not  canceled).  
+\item The Job started no longer ago than {\bf Max Full Age}.
 \end{itemize}
 
    If all the above conditions do not hold, the Director will  upgrade the
@@ -872,6 +874,17 @@
    the same as when the job was scheduled).  Please note that if there is a
    {\bf Max Wait Time} it may also be applied to the job.
 
+\item [Max Full Age = \lt{}time\gt{}]
+\index[dir]{Max Full Age}
+\index[dir]{Directive!Max Full Age}
+   The time specifies the maximum allowed age (counting from start time) of
+   the most recent successful Full backup that is required in order to run
+   Incremental or Differential backup jobs. If the most recent Full backup
+   is older than this interval, Incremental and Differential backups will be
+   upgraded to Full backups automatically. If this directive is not present,
+   or specified as 0, then the age of the previous Full backup is not
+   considered.
+
 \label{PreferMountedVolumes}
 \item [Prefer Mounted Volumes = \lt{}yes|no\gt{}]
 \index[dir]{Prefer Mounted Volumes}
