diff --git a/src/cli/main.c b/src/cli/main.c
index 102d87c..c86a29f 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>
@@ -45,7 +46,7 @@
 static void
 usage(const char* progname)
 {
-  fprintf(stderr, "usage: %s <input file> [<xmp file>] <output file> [--width <max width>,--height <max height>,--bpp <bpp>,--hq <0|1|true|false>,--verbose] [--core <darktable options>]\n", progname);
+  fprintf(stderr, "usage: %s <input file> [<xmp file>] <output file> [--width <max width>,--height <max height>,--bpp <bpp>,--hq <0|1|true|false>,--verbose,--overwrite] [--core <darktable options>]\n", progname);
 }
 
 int main(int argc, char *arg[])
@@ -54,15 +55,13 @@ 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;
   char *output_filename = NULL;
   int file_counter = 0;
   int width = 0, height = 0, bpp = 0;
-  gboolean verbose = FALSE, high_quality = TRUE;
+  gboolean verbose = FALSE, high_quality = TRUE, overwrite = FALSE;
 
   int k;
   for(k=1; k<argc; k++)
@@ -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;
@@ -111,6 +134,10 @@ int main(int argc, char *arg[])
         }
         g_free(str);
       }
+      else if(!strcmp(arg[k], "--overwrite"))
+      {
+        overwrite = TRUE;
+      }
       else if(!strcmp(arg[k], "-v") || !strcmp(arg[k], "--verbose"))
       {
         verbose = TRUE;
@@ -158,7 +185,10 @@ int main(int argc, char *arg[])
   // the output file already exists, so there will be a sequence number added
   if(g_file_test(output_filename, G_FILE_TEST_EXISTS))
   {
-    fprintf(stderr, "%s\n", _("output file already exists, it will get renamed"));
+    if(overwrite)
+      fprintf(stderr, "%s\n", _("output file already exists but overwrite specified so it will get overwritten"));
+    else
+      fprintf(stderr, "%s\n", _("output file already exists, it will get renamed"));
   }
 
   // init dt without gui:
@@ -230,6 +260,7 @@ int main(int argc, char *arg[])
     fprintf(stderr, "%s\n", _("failed to get parameters from storage module, aborting export ..."));
     exit(1);
   }
+  ((dt_imageio_disk_t*) sdata)->overwrite = overwrite;
 
   // and now for the really ugly hacks. don't tell your children about this one or they won't sleep at night any longer ...
   g_strlcpy((char*)sdata, output_filename, DT_MAX_PATH_LEN);
@@ -274,6 +305,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..c8a74b2 100644
--- a/src/common/imageio_module.h
+++ b/src/common/imageio_module.h
@@ -22,6 +22,7 @@
 #include <gtk/gtk.h>
 #include <inttypes.h>
 #include <common/darktable.h>
+#include <common/variables.h>
 #ifdef USE_LUA
 #include "lua/types.h"
 #include "lua/modules.h"
@@ -54,6 +55,15 @@ typedef struct dt_imageio_module_data_t
 }
 dt_imageio_module_data_t;
 
+// saved params
+typedef struct dt_imageio_disk_t
+{
+  char filename[DT_MAX_PATH_LEN];
+  dt_variables_params_t *vp;
+  gboolean overwrite;
+}
+dt_imageio_disk_t;
+
 struct dt_imageio_module_format_t;
 /* responsible for image encoding, such as jpg,png,etc */
 typedef struct dt_imageio_module_format_t
@@ -173,7 +183,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/common/imageio_storage.h b/src/common/imageio_storage.h
index 9af5aea..544d35f 100644
--- a/src/common/imageio_storage.h
+++ b/src/common/imageio_storage.h
@@ -30,6 +30,7 @@ extern "C"
 	int store(struct dt_imageio_module_storage_t *self,struct dt_imageio_module_data_t *self_data, 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);
 	size_t params_size   (struct dt_imageio_module_storage_t *self);
 	void* get_params   (struct dt_imageio_module_storage_t *self);
+	void* get_params_cli (struct dt_imageio_module_storage_t *self, const int overwrite);
 	void  free_params  (struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data);
 	void finalize_store (struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data);
 	int   set_params   (struct dt_imageio_module_storage_t *self, const void *params, const int size);
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..d59bb6f 100644
--- a/src/imageio/storage/disk.c
+++ b/src/imageio/storage/disk.c
@@ -46,16 +46,6 @@ typedef struct disk_t
 }
 disk_t;
 
-// saved params
-typedef struct dt_imageio_disk_t
-{
-  char filename[DT_MAX_PATH_LEN];
-  dt_variables_params_t *vp;
-  gboolean overwrite;
-}
-dt_imageio_disk_t;
-
-
 const char*
 name (const struct dt_imageio_module_storage_t *self)
 {
@@ -158,11 +148,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 +278,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 +303,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)
 {
