diff --git a/src/browser.c b/src/browser.c
index e9ac8ad3f4535ec741320d51a50b2de1ac798d98..5907f08c42afe5755ec8b2da2271adbfd56a9436 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -407,10 +407,7 @@ int browse_key(int ch) {
    /* refresh */
     case 'r':
       hideinfo;
-      stcalc.sterr = ST_BROWSE;
-      stcalc.orig = stbrowse.cur->parent;
-      strcpy(stcalc.cur, getpath(stbrowse.cur, tmp));
-      pstate = ST_CALC;
+      calc_init(getpath(stbrowse.cur, tmp), stbrowse.cur->parent);
       break;
 
     /* and other stuff */
diff --git a/src/calc.c b/src/calc.c
index 5aa4063a47e0e6fe5090be39c74075e7a86d8750..a8d929a35f3c649ba86f8e2f57cce7fb9f2caac1 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -39,8 +39,18 @@
 #include <sys/time.h>
 #include <dirent.h>
 
-struct state_calc stcalc;
 
+struct {
+  char err;                /* 1/0, error or not */
+  char cur[PATH_MAX];      /* current dir/item */
+  char lasterr[PATH_MAX];  /* last unreadable dir/item */
+  char errmsg[128];        /* error message, when err=1 */
+  struct dir *parent;      /* parent directory for the calculation */
+  struct dir *orig;        /* original directory, when recalculating */
+  dev_t curdev;            /* current device we're calculating on */
+  suseconds_t lastupdate;  /* time of the last screen update */
+  int anpos;               /* position of the animation string */
+} stcalc;
 
 
 /* My own implementation of realpath()
@@ -288,7 +298,7 @@ void calc_draw_progress() {
   char ani[15];
   int i;
 
-  nccreate(10, 60, stcalc.sterr == ST_QUIT ? "Calculating..." : "Recalculating...");
+  nccreate(10, 60, stcalc.orig ? "Calculating..." : "Recalculating...");
 
   ncprint(2, 2, "Total items: %-8d size: %s",
     stcalc.parent->items, formatsize(stcalc.parent->size, sflags & SF_SI));
@@ -368,12 +378,6 @@ void calc_process() {
   struct stat fs;
   struct dir *t;
 
-  /* init/reset global vars */
-  stcalc.err = 0;
-  stcalc.lastupdate = 999;
-  stcalc.lasterr[0] = 0;
-  stcalc.anpos = 0;
-
   /* check root directory */
   if(rpath(stcalc.cur, tmp) == NULL || lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) {
     stcalc.err = 1;
@@ -421,7 +425,18 @@ void calc_process() {
 fail:
   while(stcalc.err && !input_handle(0))
     ;
-  pstate = stcalc.sterr;
+  pstate = stcalc.orig ? ST_BROWSE : ST_QUIT;
   return;
 }
 
+
+void calc_init(char *dir, struct dir *orig) {
+  stcalc.err = 0;
+  stcalc.lastupdate = 999;
+  stcalc.lasterr[0] = 0;
+  stcalc.anpos = 0;
+  stcalc.orig = orig;
+  strcpy(stcalc.cur, dir);
+  pstate = ST_CALC;
+}
+
diff --git a/src/calc.h b/src/calc.h
index fa8f0f0c79ad7f7593d5484a5103e1b32708ecff..fc28dafe8655a6bd4d3e4c8c9e0feb9fb69726fb 100644
--- a/src/calc.h
+++ b/src/calc.h
@@ -28,24 +28,10 @@
 
 #include "ncdu.h"
 
-struct state_calc {
-  char err;                /* 1/0, error or not */
-  char cur[PATH_MAX];      /* current dir/item */
-  char lasterr[PATH_MAX];  /* last unreadable dir/item */
-  char errmsg[128];        /* error message, when err=1 */
-  struct dir *parent;      /* parent directory for the calculation */
-  struct dir *orig;        /* original directory, when recalculating */
-  dev_t curdev;            /* current device we're calculating on */
-  suseconds_t lastupdate;  /* time of the last screen update */
-  int anpos;               /* position of the animation string */
-  int sterr;               /* state to go to on error (ST_BROWSE/ST_QUIT) */
-};
-extern struct state_calc stcalc;
-
-
 void calc_process(void);
 int  calc_key(int);
 int  calc_draw(void);
+void calc_init(char *, struct dir *);
 
 
 #endif
diff --git a/src/main.c b/src/main.c
index f40dffe8e85ce7787445d3991811a9e7f1a065d7..dd6eb99bfcc144ec003e87ebb0fd5d6b4bf12b4d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -137,11 +137,10 @@ void argv_parse(int argc, char **argv, char *dir) {
 
 /* main program */
 int main(int argc, char **argv) {
-  argv_parse(argc, argv, stcalc.cur);
+  char dir[PATH_MAX];
+  argv_parse(argc, argv, dir);
 
-  pstate = ST_CALC;
-  stcalc.sterr = ST_QUIT;
-  stcalc.orig = NULL;
+  calc_init(dir, NULL);
   stbrowse.flags = BF_SIZE | BF_DESC;
   stbrowse.graph = 0;