diff --git a/src/cli/main.c b/src/cli/main.c
index 102d87c..8daeaee 100644
--- a/src/cli/main.c
+++ b/src/cli/main.c
@@ -36,6 +36,7 @@
 #include "common/imageio_module.h"
 #include "common/exif.h"
 #include "common/history.h"
+#include "develop/develop.h"
 
 #include <sys/time.h>
 #include <unistd.h>
@@ -54,8 +55,6 @@ int main(int argc, char *arg[])
   bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
   textdomain (GETTEXT_PACKAGE);
 
-  gtk_init (&argc, &arg);
-
   // parse command line arguments
   char *image_filename = NULL;
   char *xmp_filename = NULL;
@@ -82,22 +81,46 @@ int main(int argc, char *arg[])
       else if(!strcmp(arg[k], "--width"))
       {
         k++;
+        if(k>=argc)
+        {
+          fprintf(stderr, _("error: width parameter value missing"));
+          fprintf(stderr, "\n");
+          exit(1);
+        }
         width = MAX(atoi(arg[k]), 0);
       }
       else if(!strcmp(arg[k], "--height"))
       {
         k++;
+        if(k>=argc)
+        {
+          fprintf(stderr, _("error: height parameter value missing"));
+          fprintf(stderr, "\n");
+          exit(1);
+        }
         height = MAX(atoi(arg[k]), 0);
       }
       else if(!strcmp(arg[k], "--bpp"))
       {
         k++;
+        if(k>=argc)
+        {
+          fprintf(stderr, _("error: bpp parameter value missing"));
+          fprintf(stderr, "\n");
+          exit(1);
+        }
         bpp = MAX(atoi(arg[k]), 0);
         fprintf(stderr, "%s %d\n", _("TODO: sorry, due to API restrictions we currently cannot set the BPP to"), bpp);
       }
       else if(!strcmp(arg[k], "--hq"))
       {
         k++;
+        if(k>=argc)
+        {
+          fprintf(stderr, _("error: hq parameter value missing"));
+          fprintf(stderr, "\n");
+          exit(1);
+        }
         gchar *str = g_ascii_strup(arg[k], -1);
         if(!g_strcmp0(str, "0") || !g_strcmp0(str, "FALSE"))
           high_quality = FALSE;
@@ -274,6 +297,8 @@ int main(int argc, char *arg[])
   }
   //TODO: add a callback to set the bpp without going through the config
 
+  darktable.develop = malloc(sizeof(dt_develop_t));
+  dt_dev_init(darktable.develop, 0);
   storage->store(storage,sdata, id, format, fdata, 1, 1, high_quality);
 
   // cleanup time
diff --git a/src/common/darktable.c b/src/common/darktable.c
index 5391581..e8ee43c 100644
--- a/src/common/darktable.c
+++ b/src/common/darktable.c
@@ -764,10 +764,11 @@ int dt_init(int argc, char *argv[], const int init_gui)
 
   darktable.view_manager = (dt_view_manager_t *)malloc(sizeof(dt_view_manager_t));
   memset(darktable.view_manager, 0, sizeof(dt_view_manager_t));
-  dt_view_manager_init(darktable.view_manager);
+  if(init_gui)
+    dt_view_manager_init(darktable.view_manager);
 
   // load the darkroom mode plugins once:
-  dt_iop_load_modules_so();
+  dt_iop_load_modules_so(init_gui);
 
   if(init_gui)
   {
@@ -779,7 +780,7 @@ int dt_init(int argc, char *argv[], const int init_gui)
   }
   darktable.imageio = (dt_imageio_t *)malloc(sizeof(dt_imageio_t));
   memset(darktable.imageio, 0, sizeof(dt_imageio_t));
-  dt_imageio_init(darktable.imageio);
+  dt_imageio_init(init_gui, darktable.imageio);
 
   if(init_gui)
   {
diff --git a/src/common/imageio_module.c b/src/common/imageio_module.c
index db67f67..b7b05aa 100644
--- a/src/common/imageio_module.c
+++ b/src/common/imageio_module.c
@@ -120,7 +120,7 @@ error:
 
 
 static int
-dt_imageio_load_modules_format(dt_imageio_t *iio)
+dt_imageio_load_modules_format(const int init_gui, dt_imageio_t *iio)
 {
   iio->plugins_format = NULL;
   GList *res = NULL;
@@ -147,9 +147,12 @@ dt_imageio_load_modules_format(dt_imageio_t *iio)
       free(module);
       continue;
     }
-    module->gui_data = NULL;
-    module->gui_init(module);
-    if(module->widget) g_object_ref(module->widget);
+    if (init_gui)
+    {
+      module->gui_data = NULL;
+      module->gui_init(module);
+      if(module->widget) g_object_ref(module->widget);
+    }
     g_free(libname);
     res = g_list_insert_sorted(res, module, dt_imageio_sort_modules_format);
   }
@@ -226,7 +229,7 @@ error:
 }
 
 static int
-dt_imageio_load_modules_storage (dt_imageio_t *iio)
+dt_imageio_load_modules_storage (const int init_gui, dt_imageio_t *iio)
 {
   iio->plugins_storage = NULL;
   dt_imageio_module_storage_t *module;
@@ -252,9 +255,12 @@ dt_imageio_load_modules_storage (dt_imageio_t *iio)
       free(module);
       continue;
     }
-    module->gui_data = NULL;
-    module->gui_init(module);
-    if(module->widget) g_object_ref(module->widget);
+    if (init_gui)
+    {
+      module->gui_data = NULL;
+      module->gui_init(module);
+      if(module->widget) g_object_ref(module->widget);
+    }
     g_free(libname);
     dt_imageio_insert_storage(module);
   }
@@ -263,13 +269,13 @@ dt_imageio_load_modules_storage (dt_imageio_t *iio)
 }
 
 void
-dt_imageio_init (dt_imageio_t *iio)
+dt_imageio_init (const int init_gui, dt_imageio_t *iio)
 {
   iio->plugins_format  = NULL;
   iio->plugins_storage = NULL;
 
-  dt_imageio_load_modules_format (iio);
-  dt_imageio_load_modules_storage(iio);
+  dt_imageio_load_modules_format (init_gui, iio);
+  dt_imageio_load_modules_storage(init_gui, iio);
 }
 
 void
diff --git a/src/common/imageio_module.h b/src/common/imageio_module.h
index 7b5ae0f..e231fc8 100644
--- a/src/common/imageio_module.h
+++ b/src/common/imageio_module.h
@@ -173,7 +173,7 @@ typedef struct dt_imageio_t
 dt_imageio_t;
 
 /* load all modules */
-void dt_imageio_init   (dt_imageio_t *iio);
+void dt_imageio_init   (const int init_gui, dt_imageio_t *iio);
 /* cleanup */
 void dt_imageio_cleanup(dt_imageio_t *iio);
 
diff --git a/src/develop/imageop.c b/src/develop/imageop.c
index 8588036..335936b 100644
--- a/src/develop/imageop.c
+++ b/src/develop/imageop.c
@@ -1114,7 +1114,7 @@ static void init_key_accels(dt_iop_module_so_t *module)
   sqlite3_finalize(stmt);
 }
 
-void dt_iop_load_modules_so()
+void dt_iop_load_modules_so(const int init_gui)
 {
   GList *res = NULL;
   dt_iop_module_so_t *module;
@@ -1145,14 +1145,15 @@ void dt_iop_load_modules_so()
     g_free(libname);
     res = g_list_append(res, module);
     init_presets(module);
-    // Calling the accelerator initialization callback, if present
-    init_key_accels(module);
+   // Calling the accelerator initialization callback, if present
+    if (init_gui)
+      init_key_accels(module);
 
-    if (module->flags()&IOP_FLAGS_SUPPORTS_BLENDING)
+    if (init_gui & module->flags()&IOP_FLAGS_SUPPORTS_BLENDING)
     {
       dt_accel_register_slider_iop(module, FALSE, NC_("accel", "fusion"));
     }
-    if(!(module->flags() & IOP_FLAGS_DEPRECATED))
+    if(init_gui && !(module->flags() & IOP_FLAGS_DEPRECATED))
     {
       // Adding the optional show accelerator to the table (blank)
       dt_accel_register_iop(module, FALSE, NC_("accel", "show module"), 0, 0);
diff --git a/src/imageio/storage/disk.c b/src/imageio/storage/disk.c
index 25a59b4..061e206 100644
--- a/src/imageio/storage/disk.c
+++ b/src/imageio/storage/disk.c
@@ -158,11 +158,15 @@ int
 store (dt_imageio_module_storage_t *self, dt_imageio_module_data_t *sdata, const int imgid, dt_imageio_module_format_t *format, dt_imageio_module_data_t *fdata,
        const int num, const int total, const gboolean high_quality)
 {
-  disk_t *g = (disk_t *)self->gui_data;
+  disk_t *g = NULL;
+  // dirty hack to make the cli work
+  if (self->gui_data)
+    g = (disk_t *)self->gui_data;
   dt_imageio_disk_t *d = (dt_imageio_disk_t *)sdata;
 
   // since we're potentially called in parallel, we should uncheck button as early as possible
-  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->overwrite_btn), FALSE);
+  if (g)
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->overwrite_btn), FALSE);
 
   char filename[DT_MAX_PATH_LEN]= {0};
   char dirname[DT_MAX_PATH_LEN]= {0};
@@ -284,13 +288,20 @@ get_params(dt_imageio_module_storage_t *self)
 {
   dt_imageio_disk_t *d = (dt_imageio_disk_t *)malloc(sizeof(dt_imageio_disk_t));
   memset(d, 0, sizeof(dt_imageio_disk_t));
-  disk_t *g = (disk_t *)self->gui_data;
   d->vp = NULL;
   dt_variables_params_init(&d->vp);
-  const char *text = gtk_entry_get_text(GTK_ENTRY(g->entry));
-  g_strlcpy(d->filename, text, DT_MAX_PATH_LEN);
-  dt_conf_set_string("plugins/imageio/storage/disk/file_directory", d->filename);
-  d->overwrite = gtk_toggle_button_get_active(g->overwrite_btn);
+  gchar *dir = dt_conf_get_string("plugins/imageio/storage/disk/file_directory");
+
+  if (!*dir)
+  {
+    fprintf(stderr, _("error: no output directory specified"));
+    fprintf(stderr, "\n");
+    exit(1);
+  }
+
+  g_strlcpy(d->filename, dir, DT_MAX_PATH_LEN);
+  g_free(dir);
+  d->overwrite = 0;
   return d;
 }
 
@@ -302,6 +313,7 @@ free_params(dt_imageio_module_storage_t *self, dt_imageio_module_data_t *params)
   free(params);
 }
 
+// appears to be unused!?
 int
 set_params(dt_imageio_module_storage_t *self, const void *params, const int size)
 {
