" The following options are supported here:\n"
     "\n"
     "\ttags    A list (separated by ';') of the tags that will be\n"
-    "\t        added to all messages incorporated by \"notmuch new\".\n";
+    "\t        added to all messages incorporated by \"notmuch new\".\n"
+    "\n"
+    "\tignore  A list (separated by ';') of file and directory names\n"
+    "\t        that will not be searched for messages by \"notmuch new\".\n";
 
 static const char user_config_comment[] =
     " User configuration\n"
     size_t user_other_email_length;
     const char **new_tags;
     size_t new_tags_length;
+    const char **new_ignore;
+    size_t new_ignore_length;
     notmuch_bool_t maildir_synchronize_flags;
     const char **search_exclude_tags;
     size_t search_exclude_tags_length;
     config->user_other_email_length = 0;
     config->new_tags = NULL;
     config->new_tags_length = 0;
+    config->new_ignore = NULL;
+    config->new_ignore_length = 0;
     config->maildir_synchronize_flags = TRUE;
     config->search_exclude_tags = NULL;
     config->search_exclude_tags_length = 0;
        notmuch_config_set_new_tags (config, tags, 2);
     }
 
+    if (notmuch_config_get_new_ignore (config, &tmp) == NULL) {
+       notmuch_config_set_new_ignore (config, NULL, 0);
+    }
+
     if (notmuch_config_get_search_exclude_tags (config, &tmp) == NULL) {
        if (is_new) {
            const char *tags[] = { "deleted", "spam" };
                             &(config->new_tags_length), length);
 }
 
+const char **
+notmuch_config_get_new_ignore (notmuch_config_t *config, size_t *length)
+{
+    return _config_get_list (config, "new", "ignore",
+                            &(config->new_ignore),
+                            &(config->new_ignore_length), length);
+}
+
 void
 notmuch_config_set_user_other_email (notmuch_config_t *config,
                                     const char *list[],
                     &(config->new_tags));
 }
 
+void
+notmuch_config_set_new_ignore (notmuch_config_t *config,
+                              const char *list[],
+                              size_t length)
+{
+    _config_set_list (config, "new", "ignore", list, length,
+                    &(config->new_ignore));
+}
+
 const char **
 notmuch_config_get_search_exclude_tags (notmuch_config_t *config, size_t *length)
 {
 
     int verbose;
     const char **new_tags;
     size_t new_tags_length;
+    const char **new_ignore;
+    size_t new_ignore_length;
 
     int total_files;
     int processed_files;
     return 0;
 }
 
+/* Test if the file/directory is to be ignored.
+ */
+static notmuch_bool_t
+_entry_in_ignore_list (const char *entry, add_files_state_t *state)
+{
+    size_t i;
+
+    for (i = 0; i < state->new_ignore_length; i++)
+       if (strcmp (entry, state->new_ignore[i]) == 0)
+           return TRUE;
+
+    return FALSE;
+}
+
 /* Examine 'path' recursively as follows:
  *
  *   o Ask the filesystem for the mtime of 'path' (fs_mtime)
        }
 
        /* Ignore special directories to avoid infinite recursion.
-        * Also ignore the .notmuch directory and any "tmp" directory
-        * that appears within a maildir.
+        * Also ignore the .notmuch directory, any "tmp" directory
+        * that appears within a maildir and files/directories
+        * the user has configured to be ignored.
         */
-       /* XXX: Eventually we'll want more sophistication to let the
-        * user specify files to be ignored. */
        if (strcmp (entry->d_name, ".") == 0 ||
            strcmp (entry->d_name, "..") == 0 ||
            (is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
-           strcmp (entry->d_name, ".notmuch") ==0)
+           strcmp (entry->d_name, ".notmuch") == 0 ||
+           _entry_in_ignore_list (entry->d_name, state))
        {
            continue;
        }
 
         entry = fs_entries[i];
 
+       /* Ignore files & directories user has configured to be ignored */
+       if (_entry_in_ignore_list (entry->d_name, state))
+           continue;
+
        /* Check if we've walked past any names in db_files or
         * db_subdirs. If so, these have been deleted. */
        while (notmuch_filenames_valid (db_files) &&
  * initialized to zero by the top-level caller before calling
  * count_files). */
 static void
-count_files (const char *path, int *count)
+count_files (const char *path, int *count, add_files_state_t *state)
 {
     struct dirent *entry = NULL;
     char *next;
         entry = fs_entries[i++];
 
        /* Ignore special directories to avoid infinite recursion.
-        * Also ignore the .notmuch directory.
+        * Also ignore the .notmuch directory and files/directories
+        * the user has configured to be ignored.
         */
-       /* XXX: Eventually we'll want more sophistication to let the
-        * user specify files to be ignored. */
        if (strcmp (entry->d_name, ".") == 0 ||
            strcmp (entry->d_name, "..") == 0 ||
-           strcmp (entry->d_name, ".notmuch") == 0)
+           strcmp (entry->d_name, ".notmuch") == 0 ||
+           _entry_in_ignore_list (entry->d_name, state))
        {
            continue;
        }
                fflush (stdout);
            }
        } else if (S_ISDIR (st.st_mode)) {
-           count_files (next, count);
+           count_files (next, count, state);
        }
 
        free (next);
        return 1;
 
     add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);
+    add_files_state.new_ignore = notmuch_config_get_new_ignore (config, &add_files_state.new_ignore_length);
     add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
     db_path = notmuch_config_get_database_path (config);
 
        int count;
 
        count = 0;
-       count_files (db_path, &count);
+       count_files (db_path, &count, &add_files_state);
        if (interrupted)
            return 1;