diff -x '*.po' -d -urpN libreport.5/src/gui-wizard-gtk/main.c libreport.6/src/gui-wizard-gtk/main.c
--- libreport.5/src/gui-wizard-gtk/main.c	2012-04-04 11:45:44.000000000 +0200
+++ libreport.6/src/gui-wizard-gtk/main.c	2012-04-09 19:51:28.418626699 +0200
@@ -26,6 +26,7 @@
 char *g_glade_file = NULL;
 char *g_dump_dir_name = NULL;
 char *g_events = NULL;
+GList *g_auto_event_list = NULL;
 int g_report_only = false;
 problem_data_t *g_cd;
 
@@ -114,15 +115,17 @@ int main(int argc, char **argv)
         OPT_p = 1 << 2,
         OPT_o = 1 << 3, // report only
         OPT_d = 1 << 4,
+        OPT_e = 1 << 5,
     };
     /* Keep enum above and order of options below in sync! */
     struct options program_options[] = {
         OPT__VERBOSE(&g_verbose),
-        OPT_STRING('g', NULL, &g_glade_file, "FILE"  , _("Alternate GUI file")),
-        OPT_BOOL(  'p', NULL, NULL                   , _("Add program names to log")),
+        OPT_STRING('g', NULL, &g_glade_file, "FILE",          _("Alternate GUI file")),
+        OPT_BOOL(  'p', NULL, NULL,                           _("Add program names to log")),
         /* for use from 3rd party apps to show just a reporter selector */
-        OPT_BOOL(  'o', "report-only", &g_report_only, _("Skip analyze steps, go through report steps only")),
-        OPT_BOOL(  'd', "delete", NULL,                _("Remove DIR after reporting")),
+        OPT_BOOL(  'o', "report-only", &g_report_only,        _("Skip analyze steps, go through report steps only")),
+        OPT_BOOL(  'd', "delete", NULL,                       _("Remove DIR after reporting")),
+        OPT_LIST(  'e', "event", &g_auto_event_list, "EVENT", _("Run only this event")),
         OPT_END()
     };
     unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
diff -x '*.po' -d -urpN libreport.5/src/gui-wizard-gtk/wizard.c libreport.6/src/gui-wizard-gtk/wizard.c
--- libreport.5/src/gui-wizard-gtk/wizard.c	2012-04-20 11:26:21.743984430 +0200
+++ libreport.6/src/gui-wizard-gtk/wizard.c	2012-04-20 11:26:27.663976226 +0200
@@ -38,10 +38,6 @@ typedef struct event_gui_data_t
 } event_gui_data_t;
 
 
-static GList *g_auto_event_list;
-
-static GtkAssistant *g_assistant;
-
 static char *g_analyze_event_selected;
 ////static unsigned g_collect_events_selected_count = 0;
 ////static char *g_reporter_events_selected;
@@ -50,6 +46,10 @@ static unsigned g_black_event_count = 0;
 
 static pid_t g_event_child_pid = 0;
 
+static bool g_expert_mode;
+
+static GtkAssistant *g_assistant;
+
 static GtkBox *g_box_analyzers;
 /* List of event_gui_data's */
 static GList *g_list_analyzers;
@@ -834,11 +834,11 @@ static event_gui_data_t *add_event_butto
 
         /* Form a pretty text representation of event */
         /* By default, use event name, just strip "foo_" prefix if it exists: */
-        const char *event_screen_name = strchr(event_name, '_');
-        if (event_screen_name)
-            event_screen_name++;
-        else
-            event_screen_name = event_name;
+        const char *event_screen_name = event_name; ///strchr(event_name, '_');
+///        if (event_screen_name)
+///            event_screen_name++;
+///        else
+///            event_screen_name = event_name;
 
         const char *event_description = NULL;
         char *tmp_description = NULL;
@@ -2092,8 +2092,7 @@ static void on_page_prepare(GtkAssistant
 
             if (g_auto_event_list)
             {
-                free(g_auto_event_list->data);
-                g_auto_event_list = g_list_delete_link(g_auto_event_list, g_auto_event_list);
+                g_auto_event_list = g_auto_event_list->next;
             }
         }
     }
@@ -2126,14 +2125,15 @@ static gint select_next_page_no(gint cur
 #endif
 
     case PAGENO_SUMMARY + 1:
-        if (!g_auto_event_list)
+        if (g_expert_mode)
             break;
+        VERB2 log("option -e EVENT:'%s'", (char*)g_auto_event_list->data);
         free(g_analyze_event_selected);
+        g_analyze_event_selected = xstrdup((char*)g_auto_event_list->data);
         /*
          * We don't remove the list element, because GTK calls select_next_page_no()
          * spuriously (for example, it calls it twice for first page).
          */
-        g_analyze_event_selected = xstrdup((char*)g_auto_event_list->data);
         current_page_no = PAGENO_ANALYZE_SELECTOR + 1;
         /* fall through as if event was selected by user */
 
@@ -2145,7 +2145,7 @@ static gint select_next_page_no(gint cur
             goto again;
         }
         event_config_t *cfg = get_event_config(g_analyze_event_selected);
-        if (cfg->ec_skip_review)
+        if (cfg && cfg->ec_skip_review)
         {
             current_page_no = PAGENO_REPORT_PROGRESS-1;
             goto again;
@@ -2155,21 +2155,17 @@ static gint select_next_page_no(gint cur
         break;
 
     case PAGENO_REPORT_DONE:
-////        if (g_last_event_was_analyzer)
-////        {
-            if (g_auto_event_list)
-            {
-//in fact it's the same const! :)
-                current_page_no = PAGENO_SUMMARY;
-                goto again;
-            }
+        if (g_auto_event_list)
+        {
             /* Go back to selectors */
-            current_page_no = PAGENO_ANALYZE_SELECTOR-1;
+            current_page_no = PAGENO_SUMMARY;
             goto again;
-////        }
-////        break;
+        }
+        goto again;
 
     case PAGENO_NOT_SHOWN:
+        if (!g_expert_mode)
+            exit(0);
         /* No! this would SEGV (infinitely recurse into select_next_page_no) */
         /*gtk_assistant_commit(g_assistant);*/
         current_page_no = PAGENO_ANALYZE_SELECTOR-1;
@@ -2664,16 +2660,7 @@ static void create_details_treeview(void
 
 void create_assistant(void)
 {
-    FILE *fp = fopen("auto_event_list.conf", "r");
-    if (fp)
-    {
-        char *line;
-        while ((line = xmalloc_fgetline(fp)) != NULL)
-        {
-            g_auto_event_list = g_list_append(g_auto_event_list, line);
-        }
-        fclose(fp);
-    }
+    g_expert_mode = !g_auto_event_list;
 
     init_pages();
     monospace_font = pango_font_description_from_string("monospace");
diff -x '*.po' -d -urpN libreport.5/src/gui-wizard-gtk/wizard.h libreport.6/src/gui-wizard-gtk/wizard.h
--- libreport.5/src/gui-wizard-gtk/wizard.h	2012-04-04 11:43:00.000000000 +0200
+++ libreport.6/src/gui-wizard-gtk/wizard.h	2012-04-09 19:51:28.419626662 +0200
@@ -29,6 +29,7 @@ void show_error_as_msgbox(const char *ms
 extern char *g_glade_file;
 extern char *g_dump_dir_name;
 extern char *g_events;
+extern GList *g_auto_event_list;
 extern problem_data_t *g_cd;
 extern int g_report_only;
 void reload_problem_data_from_dump_dir(void);
diff -x '*.po' -d -urpN libreport.5/src/include/report.h libreport.6/src/include/report.h
--- libreport.5/src/include/report.h	2012-01-13 16:41:45.000000000 +0100
+++ libreport.6/src/include/report.h	2012-04-09 19:51:28.420626625 +0200
@@ -27,14 +27,14 @@ extern "C" {
 
 enum {
     LIBREPORT_NOWAIT      = 0,
-    LIBREPORT_WAIT        = (1 << 0), /* wait for report to finish and reload the problem data */
+    LIBREPORT_WAIT        = (1 << 0), /* wait for report to finish */
     LIBREPORT_GETPID      = (1 << 1), /* return pid of child. Use with LIBREPORT_NOWAIT. */
                                       /* Note: without LIBREPORT_GETPID, child will be detached */
                                       /* (reparented to init) */
     LIBREPORT_ANALYZE     = (1 << 2), /* run analyzers? */
                                       /* ("run reporters" is always on, has no flag (for now?)) */
     LIBREPORT_RELOAD_DATA = (1 << 5), /* reload problem data after run (needs WAIT) */
-    LIBREPORT_DEL_DIR     = (1 << 6), /* delete directory after reporting */
+    LIBREPORT_DEL_DIR     = (1 << 6), /* delete directory after reporting (passes --delete to child) */
     LIBREPORT_RUN_CLI     = (1 << 7), /* run 'cli' instead of 'gui' */
     LIBREPORT_RUN_NEWT    = (1 << 8), /* run 'report-newt' */
 };
diff -x '*.po' -d -urpN libreport.5/src/lib/report.c libreport.6/src/lib/report.c
--- libreport.5/src/lib/report.c	2012-01-13 16:41:45.000000000 +0100
+++ libreport.6/src/lib/report.c	2012-04-20 11:27:46.590877949 +0200
@@ -23,19 +23,21 @@ int report_problem_in_dir(const char *di
 {
     fflush(NULL);
 
-    pid_t pid = vfork();
+    pid_t pid = fork();
     if (pid < 0) /* error */
     {
-        perror_msg("vfork");
+        perror_msg("fork");
         return -1;
     }
 
     if (pid == 0) /* child */
     {
+        const char *event_name;
         const char *path, *path1, *path2;
         char *args[6], **pp;
 
         /* Graphical tool */
+        event_name = "report-gui";
         path1 = BIN_DIR"/report-gtk";
         path2 = "report-gtk";
         pp = args;
@@ -53,9 +55,10 @@ int report_problem_in_dir(const char *di
             xsetenv("LIBREPORT_PRGNAME", g_get_prgname());
         }
 
-        if(flags & LIBREPORT_RUN_NEWT)
+        if (flags & LIBREPORT_RUN_NEWT)
         {
             /* we want to run newt first */
+            event_name = "report-cli";
             path1 = BIN_DIR"/report-newt";
             path2 = "report-newt";
             pp = args;
@@ -67,9 +70,10 @@ int report_problem_in_dir(const char *di
             *pp++ = (char *)dirname;
             *pp = NULL;
         }
-        else if(!getenv("DISPLAY") || (flags & LIBREPORT_RUN_CLI))
+        else if (!getenv("DISPLAY") || (flags & LIBREPORT_RUN_CLI))
         {
             /* GUI won't work, use command line tool instead */
+            event_name = "report-cli";
             path1 = BIN_DIR"/report-cli";
             path2 = "report-cli";
             pp = args;
@@ -101,15 +105,12 @@ int report_problem_in_dir(const char *di
              * This reparents grandchild to init, and makes waitpid
              * in parent detect our exit and return almost immediately.
              */
-            pid_t pid = vfork();
+            pid_t pid = fork();
             if (pid < 0) /* error */
-                perror_msg_and_die("vfork");
+                perror_msg_and_die("fork");
             if (pid != 0) /* not grandching */
             {
-                /* Use of vfork above is ok: grandchild will exec or exit at once,
-                 * (see code below) and therefore will unblock us at once.
-                 * And now we exit:
-                 */
+                /* And now we exit: */
                 exit(0);
             }
             /* There's an alternative approach to achieve this,
@@ -128,6 +129,17 @@ int report_problem_in_dir(const char *di
              */
         }
 
+        struct run_event_state *run_state = new_run_event_state();
+        int r = run_event_on_dir_name(run_state, dirname, event_name);
+        int no_such_event = (r == 0 && run_state->children_count == 0);
+        free_run_event_state(run_state);
+        if (!no_such_event)
+        {
+///FIXME: handle --delete
+            exit(r);
+        }
+        /* No "report-cli/gui" event found, do it old-style */
+
         path = path1;
         VERB1 log("Executing: %s", path);
         execv(path, args);
