diff --git a/src/calc.c b/src/calc.c
index 97f1c48117727d0094ec5bcfcc6b89c82c0642d8..23f142a55591e24e4b4d8c477030dd35c01850ef 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -300,7 +300,7 @@ int calc_key(int ch) {
 }
 
 
-void calc_process() {
+int calc_process() {
   char *path, *name;
   struct stat fs;
   struct dir *t;
@@ -414,7 +414,7 @@ void calc_process() {
 
     link_del(root);
     browse_init(root->sub);
-    return;
+    return 0;
   }
 
   /* something went wrong... */
@@ -422,8 +422,12 @@ void calc_process() {
 calc_fail:
   while(failed && !input_handle(0))
     ;
-  pstate = orig ? ST_BROWSE : ST_QUIT;
-  return;
+  if(orig == NULL)
+    return 1;
+  else {
+    browse_init(NULL);
+    return 0;
+  }
 }
 
 
diff --git a/src/calc.h b/src/calc.h
index e2f11adffe9be6e4f40a73177a996a7c223f2fc8..b3d4cb62790ec656670e3184e1e2d3c91957f641 100644
--- a/src/calc.h
+++ b/src/calc.h
@@ -30,7 +30,7 @@
 
 extern char calc_smfs;  /* stay on the same filesystem */
 
-void calc_process(void);
+int  calc_process(void);
 int  calc_key(int);
 void calc_draw(void);
 void calc_init(char *, struct dir *);
diff --git a/src/global.h b/src/global.h
index 43bbb3ffbe14e0c8350584e031e959f3390dfa71..3d5295fe87581cab97c50b75e9d310979bedc87b 100644
--- a/src/global.h
+++ b/src/global.h
@@ -47,7 +47,6 @@
 #define ST_BROWSE 1
 #define ST_DEL    2
 #define ST_HELP   3
-#define ST_QUIT   4
 
 
 /* structure representing a file or directory */
diff --git a/src/main.c b/src/main.c
index cc735c8d745ebbdd4638c9672123dfe1118082d3..d3f22d697b21dd9164bbcf55b5a04f6b3be448d3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -159,9 +159,9 @@ int main(int argc, char **argv) {
   if(ncresize(min_rows, min_cols))
     min_rows = min_cols = 0;
 
-  while(pstate != ST_QUIT) {
-    if(pstate == ST_CALC)
-      calc_process();
+  while(1) {
+    if(pstate == ST_CALC && calc_process())
+      break;
     else if(pstate == ST_DEL)
       delete_process();
     else if(input_handle(0))