diff --git a/src/browser.c b/src/browser.c
index f3941c747d4a0521f6a367b261625e0f66a64060..2e7be85049fa5cb3f64beb8b6b021c2b7770d1e0 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -222,7 +222,7 @@ void browse_draw_item(struct dir *n, int row, off_t max, int ispar) {
 }
 
 
-int browse_draw() {
+void browse_draw() {
   struct dir *n, ref, *cur, *sel = NULL;
   char tmp[PATH_MAX], *tmp2;
   int selected, i;
@@ -254,7 +254,7 @@ int browse_draw() {
   }
 
   if(!cur)
-    return 0;
+    return;
 
   /* add reference to parent dir */
   memset(&ref, 0, sizeof(struct dir));
@@ -302,7 +302,6 @@ int browse_draw() {
 
   /* move cursor to selected row for accessibility */
   move(selected+2, 0);
-  return 0;
 }
 
 
diff --git a/src/browser.h b/src/browser.h
index fcea9001468f946c3ae3774d117aa90be89b9c7b..f823947c25843e7444f44c8925c50f206f318863 100644
--- a/src/browser.h
+++ b/src/browser.h
@@ -29,7 +29,7 @@
 #include "ncdu.h"
 
 int  browse_key(int);
-int  browse_draw(void);
+void browse_draw(void);
 void browse_init(struct dir *);
 
 
diff --git a/src/calc.c b/src/calc.c
index 30df0c0cf6dba1fa6cd2790e0cdd2f0d50840cd6..df8a38ff7b29def752d11d31b8795f74c981b6c5 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -37,7 +37,6 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/time.h>
 #include <dirent.h>
 
 
@@ -48,7 +47,6 @@
 
 
 /* external vars */
-int  calc_delay = 100;
 char calc_smfs  = 0;
 
 /* global vars for internal use */
@@ -59,7 +57,6 @@ char errmsg[128];        /* error message, when failed=1 */
 struct dir *root;        /* root directory struct we're calculating */
 struct dir *orig;        /* original directory, when recalculating */
 dev_t curdev;            /* current device we're calculating on */
-long lastupdate;         /* time of the last screen update */
 int anpos;               /* position of the animation string */
 int curpathl = 0, lasterrl = 0;
 
@@ -246,7 +243,7 @@ void calc_draw_progress() {
   }
 
   /* animation - but only if the screen refreshes more than or once every second */
-  if(calc_delay <= 1000) {
+  if(update_delay <= 1000) {
     if(++anpos == 28)
        anpos = 0;
     strcpy(ani, "              ");
@@ -275,25 +272,12 @@ void calc_draw_error(char *cur, char *msg) {
 }
 
 
-int calc_draw() {
-  struct timeval tv;
-
-  if(failed) {
-    browse_draw();
+void calc_draw() {
+  browse_draw();
+  if(failed)
     calc_draw_error(curpath, errmsg);
-    return 0;
-  }
-
-  /* should we really draw the screen again? */
-  gettimeofday(&tv, (void *)NULL);
-  tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / calc_delay;
-  if(lastupdate != tv.tv_usec) {
-    browse_draw();
+  else
     calc_draw_progress();
-    lastupdate = tv.tv_usec;
-    return 0;
-  }
-  return 1;
 }
 
 
@@ -408,7 +392,6 @@ calc_fail:
 
 void calc_init(char *dir, struct dir *org) {
   failed = anpos = 0;
-  lastupdate = 999;
   orig = org;
   if(curpathl == 0) {
     curpathl = strlen(dir);
diff --git a/src/calc.h b/src/calc.h
index 1c08c5521ee9482c5878448424ada93fbb420018..da75060eb6a24703018978b200ae9498eefb3eae 100644
--- a/src/calc.h
+++ b/src/calc.h
@@ -28,12 +28,11 @@
 
 #include "ncdu.h"
 
-extern int  calc_delay; /* minimum screen update interval when calculating, in ms */
 extern char calc_smfs;  /* stay on the same filesystem */
 
 void calc_process(void);
 int  calc_key(int);
-int  calc_draw(void);
+void calc_draw(void);
 void calc_init(char *, struct dir *);
 
 
diff --git a/src/delete.c b/src/delete.c
index 71930213b4eaebbf5d6b16c4436d7ca81d418f66..cfd51bf7f81cdb5c199bfcf5a10e53426896d532 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -32,7 +32,6 @@
 #include <string.h>
 #include <errno.h>
 #include <unistd.h>
-#include <sys/time.h>
 
 
 #define DS_CONFIRM  0
@@ -40,9 +39,6 @@
 #define DS_FAILED   2
 
 
-int delete_delay = 100;
-
-long lastupdate;
 struct dir *root, *nextsel, *curdir;
 char noconfirm = 0,
      ignoreerr = 0,
@@ -104,30 +100,13 @@ void delete_draw_error() {
 }
 
 
-int delete_draw() {
-  struct timeval tv;
-
+void delete_draw() {
+  browse_draw();
   switch(state) {
-    case DS_CONFIRM:
-      browse_draw();
-      delete_draw_confirm();
-      return 0;
-    case DS_PROGRESS:
-      gettimeofday(&tv, (void *)NULL);
-      tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / delete_delay;
-      if(lastupdate != tv.tv_usec) {
-        browse_draw();
-        delete_draw_progress();
-        lastupdate = tv.tv_usec;
-        return 0;
-      }
-      return 1;
-    case DS_FAILED:
-      browse_draw();
-      delete_draw_error();
-      return 0;
+    case DS_CONFIRM:  delete_draw_confirm();  break;
+    case DS_PROGRESS: delete_draw_progress(); break;
+    case DS_FAILED:   delete_draw_error();    break;
   }
-  return 1;
 }
 
 
@@ -239,7 +218,6 @@ void delete_process() {
       return browse_init(root);
 
   /* delete */
-  lastupdate = 999;
   seloption = 0;
   if(delete_dir(root))
     browse_init(root);
diff --git a/src/delete.h b/src/delete.h
index a5ecc0d7a1737276b1c5b3b612561e69c53f655b..55991b79ea0d07ecd3291454119e26827d621d35 100644
--- a/src/delete.h
+++ b/src/delete.h
@@ -28,11 +28,9 @@
 
 #include "ncdu.h"
 
-extern int delete_delay;
-
 void delete_process(void);
 int  delete_key(int);
-int  delete_draw(void);
+void delete_draw(void);
 void delete_init(struct dir *, struct dir *);
 
 
diff --git a/src/help.c b/src/help.c
index 0d5c34c6d6d3f7894366ed7c7d79089cb6b30426..79d5bb77ae2b32a746452686a4070215fd0e0d99 100644
--- a/src/help.c
+++ b/src/help.c
@@ -55,7 +55,7 @@ char *keys[KEYS*2] = {
 };
 
 
-int help_draw() {
+void help_draw() {
   int i, line;
 
   browse_draw();
@@ -155,7 +155,6 @@ int help_draw() {
       ncaddstr(10, 16, "http://dev.yorhel.nl/ncdu/");
       break;
   }
-  return 0;
 }
 
 
diff --git a/src/help.h b/src/help.h
index 6d21042dd858bc9514dbfa8fd98fd31187d6d0a8..96d8c8e97ce56430e007143f50b277b0151299d4 100644
--- a/src/help.h
+++ b/src/help.h
@@ -29,7 +29,7 @@
 #include "ncdu.h"
 
 int  help_key(int);
-int  help_draw(void);
+void help_draw(void);
 void help_init();
 
 
diff --git a/src/main.c b/src/main.c
index 43e4ab6b412ea4f6b426cb64e05b93ab62d6904f..b13b55db37998a6ff1ab9430766a69a16755faf5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -37,30 +37,46 @@
 #include <errno.h>
 
 #include <unistd.h>
+#include <sys/time.h>
 
 int pstate;
 
 int min_rows = 17,
     min_cols = 60;
+long update_delay = 100,
+     lastupdate = 999;
+
 
 void screen_draw() {
-  int n = 1;
   switch(pstate) {
-    case ST_CALC:   n = calc_draw();   break;
-    case ST_BROWSE: n = browse_draw(); break;
-    case ST_HELP:   n = help_draw();   break;
-    case ST_DEL:    n = delete_draw(); break;
+    case ST_CALC:   calc_draw();   break;
+    case ST_BROWSE: browse_draw(); break;
+    case ST_HELP:   help_draw();   break;
+    case ST_DEL:    delete_draw(); break;
   }
-  if(!n)
-    refresh();
 }
 
 
+/* wait:
+ *  -1: non-blocking, always draw screen
+ *   0: blocking wait for input and always draw screen
+ *   1: non-blocking, draw screen only if a configured delay has passed or after keypress
+ */
 int input_handle(int wait) {
   int ch;
+  struct timeval tv;
 
-  nodelay(stdscr, wait);
-  screen_draw();
+  nodelay(stdscr, wait?1:0);
+  if(wait != 1)
+    screen_draw();
+  else {
+    gettimeofday(&tv, (void *)NULL);
+    tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / update_delay;
+    if(lastupdate != tv.tv_usec) {
+      screen_draw();
+      lastupdate = tv.tv_usec;
+    }
+  }
   while((ch = getch()) != ERR) {
     if(ch == KEY_RESIZE) {
       if(ncresize(min_rows, min_cols))
@@ -108,7 +124,7 @@ char *argv_parse(int argc, char **argv) {
       for(j=1; j<len; j++)
         switch(argv[i][j]) {
           case 'x': calc_smfs = 1; break;
-          case 'q': calc_delay = delete_delay = 2000;     break;
+          case 'q': update_delay = 2000;     break;
           case '?':
           case 'h':
             printf("ncdu [-hqvx] [--exclude PATTERN] [-X FILE] directory\n\n");
diff --git a/src/ncdu.h b/src/ncdu.h
index 5493ec3dbddcdffec3eb1e545f3b0f3712fcf2e7..26a509501fb43870879b765a41a40fabfe51bbdd 100644
--- a/src/ncdu.h
+++ b/src/ncdu.h
@@ -77,6 +77,8 @@ struct dir {
 
 /* program state */
 extern int pstate;
+/* minimum screen update interval when calculating, in ms */
+extern long update_delay;
 
 /* handle input from keyboard and update display */
 int input_handle(int);