diff --git a/gtags/gtags.c b/gtags/gtags.c
index c25ae77..c9adb16 100644
--- a/gtags/gtags.c
+++ b/gtags/gtags.c
@@ -69,29 +69,30 @@ void updatetags(const char *, const char *, IDSET *, STRBUF *);
 void createtags(const char *, const char *);
 int printconf(const char *);
 
-int cflag;					/**< compact format */
-int iflag;					/**< incremental update */
-int Iflag;					/**< make  idutils index */
-int Oflag;					/**< use objdir */
-int qflag;					/**< quiet mode */
-int wflag;					/**< warning message */
-int vflag;					/**< verbose mode */
-int show_version;
-int show_help;
-int show_config;
-char *gtagsconf;
-char *gtagslabel;
-int debug;
-const char *config_name;
-const char *file_list;
-const char *dump_target;
-char *single_update;
+int cflag = 0;					/**< compact format */
+int iflag = 0;					/**< incremental update */
+int Iflag = 0;					/**< make  idutils index */
+int Oflag = 0;					/**< use objdir */
+int qflag = 0;					/**< quiet mode */
+int wflag = 0;					/**< warning message */
+int vflag = 0;					/**< verbose mode */
+int Dflag = 0;					/**< Delta update */
+int show_version = 0;
+int show_help = 0;
+int show_config = 0;
+char *gtagsconf = NULL;
+char *gtagslabel = NULL;
+int debug = 0;
+const char *config_name = NULL;
+const char *file_list = NULL;
+const char *dump_target = NULL;
+char *single_update = NULL;
 int statistics = STATISTICS_STYLE_NONE;
 
 #define GTAGSFILES "gtags.files"
 
-int extractmethod;
-int total;
+int extractmethod = 0;
+int total = 0;
 
 static void
 usage(void)
@@ -121,6 +122,7 @@ static struct option const long_options[] = {
 	{"file", required_argument, NULL, 'f'},
 	{"idutils", no_argument, NULL, 'I'},
 	{"incremental", no_argument, NULL, 'i'},
+	{"delta", no_argument, NULL, 'D'},
 	{"max-args", required_argument, NULL, 'n'},
 	{"omit-gsyms", no_argument, NULL, 'o'},		/* removed */
 	{"objdir", no_argument, NULL, 'O'},
@@ -206,7 +208,7 @@ main(int argc, char **argv)
 			argv = prepend_options(&argc, argv, env);
 	}
 	logging_arguments(argc, argv);
-	while ((optchar = getopt_long(argc, argv, "cd:f:iIn:oOqvwse", long_options, &option_index)) != EOF) {
+	while ((optchar = getopt_long(argc, argv, "cd:f:iIn:oOqvwseD", long_options, &option_index)) != EOF) {
 		switch (optchar) {
 		case 0:
 			/* already flags set */
@@ -251,6 +253,9 @@ main(int argc, char **argv)
 		case 'O':
 			Oflag++;
 			break;
+		case 'D':
+			Dflag++;
+			break;
 		case 'q':
 			qflag++;
 			setquiet();
@@ -633,32 +638,35 @@ incremental(const char *dbpath, const char *root)
 			}
 		}
 		find_close();
+
 		/*
 		 * make delete list.
 		 */
-		limit = gpath_nextkey();
-		for (id = 1; id < limit; id++) {
-			char fid[MAXFIDLEN];
-			int type;
+		if (!Dflag) {
+			limit = gpath_nextkey();
+			for (id = 1; id < limit; id++) {
+				char fid[MAXFIDLEN];
+				int type;
 
-			snprintf(fid, sizeof(fid), "%d", id);
-			/*
-			 * This is a hole of GPATH. The hole increases if the deletion
-			 * and the addition are repeated.
-			 */
-			if ((path = gpath_fid2path(fid, &type)) == NULL)
-				continue;
-			/*
-			 * The file which does not exist in the findset is treated
-			 * assuming that it does not exist in the file system.
-			 */
-			if (type == GPATH_OTHER) {
-				if (!idset_contains(findset, id) || !test("f", path) || test("b", path))
-					strbuf_puts0(deletelist, path);
-			} else {
-				if (!idset_contains(findset, id) || !test("f", path)) {
-					strbuf_puts0(deletelist, path);
-					idset_add(deleteset, id);
+				snprintf(fid, sizeof(fid), "%d", id);
+				/*
+				 * This is a hole of GPATH. The hole increases if the deletion
+				 * and the addition are repeated.
+				 */
+				if ((path = gpath_fid2path(fid, &type)) == NULL)
+					continue;
+				/*
+				 * The file which does not exist in the findset is treated
+				 * assuming that it does not exist in the file system.
+				 */
+				if (type == GPATH_OTHER) {
+					if (!idset_contains(findset, id) || !test("f", path) || test("b", path))
+						strbuf_puts0(deletelist, path);
+				} else {
+					if (!idset_contains(findset, id) || !test("f", path)) {
+						strbuf_puts0(deletelist, path);
+						idset_add(deleteset, id);
+					}
 				}
 			}
 		}
diff --git a/gtags/manual.in b/gtags/manual.in
index 5735108..8863b80 100644
--- a/gtags/manual.in
+++ b/gtags/manual.in
@@ -61,6 +61,9 @@
 		The argument @arg{file} can be set to @val{-} to accept a list of
 		files from the standard input.
 		File names must be separated by newline.
+	@item{@option{-D}, @option{--delta}}
+		Batch update tag files incrementally for files specified in option '-f'.
+		Use in conjunction with incremental update.
 	@item{@option{--gtagsconf} @arg{file}}
 		Set environment variable @var{GTAGSCONF} to @arg{file}.
 	@item{@option{--gtagslabel} @arg{label}}
