* Author: Carl Worth <cworth@cworth.org>
  */
 
+#include <getopt.h>
+
 #include "notmuch-client.h"
 
 int
     notmuch_config_t *config;
     notmuch_database_t *notmuch;
     notmuch_bool_t synchronize_flags;
-    FILE *input;
+    notmuch_bool_t accumulate = FALSE;
+    FILE *input = stdin;
     char *line = NULL;
     size_t line_size;
     ssize_t line_len;
 
     synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
 
-    argc--; argv++; /* skip subcommand argument */
+    struct option options[] = {
+       { "accumulate",   no_argument,       0, 'a' },
+       { 0, 0, 0, 0}
+    };
+
+    int opt;
+    do {
+       opt = getopt_long (argc, argv, "", options, NULL);
+
+       switch (opt) {
+       case 'a':
+           accumulate = 1;
+           break;
+       case '?':
+           return 1;
+           break;
+       }
+
+    } while (opt != -1);
 
-    if (argc) {
-       input = fopen (argv[0], "r");
+    if (optind < argc) {
+       input = fopen (argv[optind], "r");
        if (input == NULL) {
            fprintf (stderr, "Error opening %s for reading: %s\n",
-                    argv[0], strerror (errno));
+                    argv[optind], strerror (errno));
            return 1;
        }
-    } else {
-       printf ("No filename given. Reading dump from stdin.\n");
-       input = stdin;
+       optind++;
     }
 
     /* Dump output is one line per message. We match a sequence of
            goto NEXT_LINE;
        }
 
+       /* In order to detect missing messages, this check/optimization is
+        * intentionally done *after* first finding the message.  */
+       if (accumulate && (file_tags == NULL || *file_tags == '\0'))
+       {
+           goto NEXT_LINE;
+       }
+
        db_tags_str = NULL;
        for (db_tags = notmuch_message_get_tags (message);
             notmuch_tags_valid (db_tags);
        }
 
        notmuch_message_freeze (message);
-       notmuch_message_remove_all_tags (message);
+
+       if (!accumulate)
+           notmuch_message_remove_all_tags (message);
 
        next = file_tags;
        while (next) {
 
   notmuch dump > clear.actual &&
   test_cmp clear.expected clear.actual'
 
-test_subtest_known_broken      # missing --accumuluate
 test_expect_success 'Accumulate original tags' \
   'notmuch tag +ABC +DEF -- from:cworth &&
   notmuch restore --accumulate < dump.expected &&
   notmuch dump > dump.actual &&
   test_cmp dump.expected dump.actual'
 
-test_subtest_known_broken      # missing --accumuluate
 test_expect_success 'Restore with nothing to do, II' \
   'notmuch restore --accumulate dump.expected &&
   notmuch dump > dump.actual &&
   test_cmp dump.expected dump.actual'
 
-test_subtest_known_broken      # missing --accumuluate
 test_expect_success 'Restore with nothing to do, III' \
   'notmuch restore --accumulate < clear.expected &&
   notmuch dump > dump.actual &&