fputs (format->message_set_end, stdout);
 }
 
-int
-notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
+/* Support for --format=raw */
+static int
+do_show_raw (unused(void *ctx), notmuch_query_t *query)
 {
-    notmuch_config_t *config;
-    notmuch_database_t *notmuch;
-    notmuch_query_t *query;
-    notmuch_threads_t *threads;
-    notmuch_thread_t *thread;
     notmuch_messages_t *messages;
-    char *query_string;
-    char *opt;
-    const show_format_t *format = &format_text;
-    int entire_thread = 0;
-    int i;
-    int first_toplevel = 1;
+    notmuch_message_t *message;
+    const char *filename;
+    FILE *file;
+    size_t size;
+    char buf[4096];
 
-    for (i = 0; i < argc && argv[i][0] == '-'; i++) {
-       if (strcmp (argv[i], "--") == 0) {
-           i++;
-           break;
-       }
-       if (STRNCMP_LITERAL (argv[i], "--format=") == 0) {
-           opt = argv[i] + sizeof ("--format=") - 1;
-           if (strcmp (opt, "text") == 0) {
-               format = &format_text;
-           } else if (strcmp (opt, "json") == 0) {
-               format = &format_json;
-               entire_thread = 1;
-           } else if (strcmp (opt, "mbox") == 0) {
-               format = &format_mbox;
-           } else {
-               fprintf (stderr, "Invalid value for --format: %s\n", opt);
-               return 1;
-           }
-       } else if (STRNCMP_LITERAL (argv[i], "--entire-thread") == 0) {
-           entire_thread = 1;
-       } else {
-           fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
-           return 1;
-       }
+    if (notmuch_query_count_messages (query) != 1) {
+       fprintf (stderr, "Error: search term did not match precisely one message.\n");
+       return 1;
     }
 
-    argc -= i;
-    argv += i;
-
-    config = notmuch_config_open (ctx, NULL, NULL);
-    if (config == NULL)
-       return 1;
+    messages = notmuch_query_search_messages (query);
+    message = notmuch_messages_get (messages);
 
-    query_string = query_string_from_args (ctx, argc, argv);
-    if (query_string == NULL) {
-       fprintf (stderr, "Out of memory\n");
+    if (message == NULL) {
+       fprintf (stderr, "Error: Cannot find matching message.\n");
        return 1;
     }
 
-    if (*query_string == '\0') {
-       fprintf (stderr, "Error: notmuch show requires at least one search term.\n");
+    filename = notmuch_message_get_filename (message);
+    if (filename == NULL) {
+       fprintf (stderr, "Error: Cannot message filename.\n");
        return 1;
     }
 
-    notmuch = notmuch_database_open (notmuch_config_get_database_path (config),
-                                    NOTMUCH_DATABASE_MODE_READ_ONLY);
-    if (notmuch == NULL)
+    file = fopen (filename, "r");
+    if (file == NULL) {
+       fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno));
        return 1;
+    }
 
-    query = notmuch_query_create (notmuch, query_string);
-    if (query == NULL) {
-       fprintf (stderr, "Out of memory\n");
-       return 1;
+    while (!feof (file)) {
+       size = fread (buf, 1, sizeof (buf), file);
+       fwrite (buf, size, 1, stdout);
     }
 
+    fclose (file);
+
+    return 0;
+}
+
+/* Support for --format=text|json|mbox */
+static int
+do_show (void *ctx,
+        notmuch_query_t *query,
+        const show_format_t *format,
+        int entire_thread)
+{
+    notmuch_threads_t *threads;
+    notmuch_thread_t *thread;
+    notmuch_messages_t *messages;
+    int first_toplevel = 1;
+
     fputs (format->message_set_start, stdout);
 
     for (threads = notmuch_query_search_threads (query);
 
     fputs (format->message_set_end, stdout);
 
-    notmuch_query_destroy (query);
-    notmuch_database_close (notmuch);
-
     return 0;
 }
 
 int
-notmuch_cat_command (void *ctx, unused (int argc), unused (char *argv[]))
+notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
 {
     notmuch_config_t *config;
     notmuch_database_t *notmuch;
     notmuch_query_t *query;
-    notmuch_messages_t *messages;
-    notmuch_message_t *message;
     char *query_string;
+    char *opt;
+    const show_format_t *format = &format_text;
+    int entire_thread = 0;
     int i;
-    const char *filename;
-    FILE *file;
-    size_t size;
-    char buf[4096];
+    int raw = 0;
 
     for (i = 0; i < argc && argv[i][0] == '-'; i++) {
-       fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
-       return 1;
+       if (strcmp (argv[i], "--") == 0) {
+           i++;
+           break;
+       }
+       if (STRNCMP_LITERAL (argv[i], "--format=") == 0) {
+           opt = argv[i] + sizeof ("--format=") - 1;
+           if (strcmp (opt, "text") == 0) {
+               format = &format_text;
+           } else if (strcmp (opt, "json") == 0) {
+               format = &format_json;
+               entire_thread = 1;
+           } else if (strcmp (opt, "mbox") == 0) {
+               format = &format_mbox;
+           } else if (strcmp (opt, "raw") == 0) {
+               raw = 1;
+           } else {
+               fprintf (stderr, "Invalid value for --format: %s\n", opt);
+               return 1;
+           }
+       } else if (STRNCMP_LITERAL (argv[i], "--entire-thread") == 0) {
+           entire_thread = 1;
+       } else {
+           fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
+           return 1;
+       }
     }
 
+    argc -= i;
+    argv += i;
+
     config = notmuch_config_open (ctx, NULL, NULL);
     if (config == NULL)
        return 1;
     }
 
     if (*query_string == '\0') {
-       fprintf (stderr, "Error: notmuch cat requires at least one search term.\n");
+       fprintf (stderr, "Error: notmuch show requires at least one search term.\n");
        return 1;
     }
 
 
     query = notmuch_query_create (notmuch, query_string);
     if (query == NULL) {
-       fprintf (stderr, "Error: Out of memory\n");
-       return 1;
-    }
-
-    if (notmuch_query_count_messages (query) != 1) {
-       fprintf (stderr, "Error: search term did not match precisely one message.\n");
-       return 1;
-    }
-
-    messages = notmuch_query_search_messages (query);
-    message = notmuch_messages_get (messages);
-
-    if (message == NULL) {
-       fprintf (stderr, "Error: Cannot find matching message.\n");
-       return 1;
-    }
-
-    filename = notmuch_message_get_filename (message);
-    if (filename == NULL) {
-       fprintf (stderr, "Error: Cannot message filename.\n");
-       return 1;
-    }
-
-    file = fopen (filename, "r");
-    if (file == NULL) {
-       fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno));
+       fprintf (stderr, "Out of memory\n");
        return 1;
     }
 
-    while (!feof (file)) {
-       size = fread (buf, 1, sizeof (buf), file);
-       fwrite (buf, size, 1, stdout);
-    }
+    if (raw)
+       return do_show_raw (ctx, query);
+    else
+       return do_show (ctx, query, format, entire_thread);
 
-    fclose (file);
     notmuch_query_destroy (query);
     notmuch_database_close (notmuch);
 
 
+++ /dev/null
-#!/bin/bash
-
-test_description='notmuch cat'
-. ./test-lib.sh
-
-test_begin_subtest "Generate some messages"
-generate_message
-generate_message
-output=$(NOTMUCH_NEW)
-test_expect_equal "$output" "Added 2 new messages to the database."
-
-test_begin_subtest "Without arguments"
-output=$(notmuch cat 2>&1)
-test_expect_equal "$output" "Error: notmuch cat requires at least one search term."
-
-test_begin_subtest "Attempt to cat multiple messages"
-output=$(notmuch cat "*" 2>&1)
-test_expect_equal "$output" "Error: search term did not match precisely one message."
-
-test_begin_subtest "Cat a message"
-output=$(notmuch cat id:msg-001@notmuch-test-suite)
-test_expect_equal "$output" "From: Notmuch Test Suite <test_suite@notmuchmail.org>
-To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Message-Id: <msg-001@notmuch-test-suite>
-Subject: Test message #1
-Date: Tue, 05 Jan 2001 15:43:57 -0000
-
-This is just a test message (#1)"
-
-test_begin_subtest "Cat another message"
-output=$(notmuch cat id:msg-002@notmuch-test-suite)
-test_expect_equal "$output" "From: Notmuch Test Suite <test_suite@notmuchmail.org>
-To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Message-Id: <msg-002@notmuch-test-suite>
-Subject: Test message #2
-Date: Tue, 05 Jan 2001 15:43:57 -0000
-
-This is just a test message (#2)"
-
-test_done