diff --git a/src/browser.c b/src/browser.c
index 74b80c2667d643cd40a470406d391269a695fdfe..1684851c05776e84da5160c29db48f6325f4592b 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -61,11 +61,6 @@ int cmp(struct dir *x, struct dir *y) {
   struct dir *a, *b;
   int r = 0;
 
-  if(y->flags & FF_PAR)
-    return(1);
-  if(x->flags & FF_PAR)
-    return(-1);
-
   if(bflags & BF_DESC) {
     a = y; b = x;
   } else {
@@ -150,7 +145,7 @@ char *graph(off_t max, off_t size) {
   ) { i--; continue; }
 
 void drawBrowser(int change) {
-  struct dir *n;
+  struct dir *n, ref;
   char tmp[PATH_MAX], ct, dt, *size;
   int selected, i, o;
   off_t max = 1;
@@ -189,6 +184,16 @@ void drawBrowser(int change) {
     bflags |= BF_SORT;
   }
 
+ /* add reference to parent dir */
+  memset(&ref, 0, sizeof(struct dir));
+  if(bcur->parent->parent) {
+    ref.flags |= FF_PAR;
+    ref.name = "..";
+    ref.next = bcur;
+    ref.parent = bcur->parent;
+    bcur = &ref;
+  }
+
  /* get maximum size and selected item */
   for(n = bcur, selected = i = 0; n != NULL; n = n->next, i++) {
     exlhid(n)
@@ -295,6 +300,10 @@ void drawBrowser(int change) {
     if(i == selected)
       attroff(A_REVERSE);
   }
+
+ /* remove reference to parent dir */
+  if(bcur == &ref)
+    bcur = ref.next;
 }
 
 struct dir * selected(void) {
@@ -303,6 +312,8 @@ struct dir * selected(void) {
     if(n->flags & FF_BSEL)
       return n;
   } while((n = n->next) != NULL);
+  if(bcur->parent->parent)
+    return(bcur->parent);
   return NULL;
 }
 
@@ -380,7 +391,7 @@ void showBrowser(void) {
       case 10:
       case KEY_RIGHT:
         n = selected();
-        if(n->flags & FF_PAR)
+        if(n == bcur->parent)
           bcur = bcur->parent->parent->sub;
         else if(n->sub != NULL)
           bcur = n->sub;
@@ -416,17 +427,6 @@ void showBrowser(void) {
             t->items += bcur->items;
           }
 
-         /* add reference to parent dir */
-          if(bcur->parent) {
-            t = calloc(sizeof(struct dir), 1);
-            t->name = malloc(3);
-            t->flags |= FF_PAR;
-            strcpy(t->name, "..");
-            t->parent = bcur;
-            t->next = bcur->sub;
-            bcur->sub = t;
-          }
-
           bcur = bcur->sub;
           free(n->name);
           free(n);
@@ -445,7 +445,7 @@ void showBrowser(void) {
         break;
       case 'i':
         n = selected();
-        if(!(n->flags & FF_PAR)) {
+        if(n != bcur->parent) {
           drawInfo(n);
           while(getch() == KEY_RESIZE) {
             drawBrowser(0);
@@ -455,7 +455,7 @@ void showBrowser(void) {
         break;
       case 'd':
         n = selected();
-        if(!(n->flags & FF_PAR))
+        if(n != bcur->parent)
           bcur = showDelete(n);
         if(bcur && bcur->parent)
           bcur = bcur->parent->sub;
diff --git a/src/calc.c b/src/calc.c
index ed32423c2ab266a9bbf80abe310e8cf89026fa5d..607371b6f55e79ed6109b29f540c95dd433f69b3 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -345,17 +345,8 @@ int calcDir(struct dir *dest, char *path) {
   }
 
   if(dest->sub) {
-   /* add reference to parent dir */
-    d = calloc(sizeof(struct dir), 1);
-    d->flags |= FF_PAR;
-    d->name = malloc(3);
-    strcpy(d->name, "..");
-    d->next = dest->sub;
-    d->parent = dest;
-    dest->sub = d;
-
    /* calculate subdirectories */
-    while((d = d->next) != NULL)
+    for(d = dest->sub; d != NULL; d = d->next)
       if(d->flags & FF_DIR && !(d->flags & FF_EXL || d->flags & FF_OTHFS)) {
         strcpy(tmp, path);
         strcat(tmp, d->name);
@@ -406,12 +397,6 @@ struct dir *showCalc(char *path) {
     freedir(parent);
     return(NULL);
   }
- 
- /* remove reference to parent dir if we are in the parent dir */
-  t = parent->sub;
-  parent->sub = t->next;
-  free(t->name);
-  free(t);
 
   return(parent);
 }
diff --git a/src/delete.c b/src/delete.c
index de9e81579717a3be156b49e5a8d528debc2c0a0a..f8b85e9d89cb2794e323a1acb74e1d05dcfaeb6d 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -149,15 +149,13 @@ struct dir *deleteDir(struct dir *dr) {
       while(nxt != NULL) {
         cur = nxt;
         nxt = cur->next;
-        if(cur->flags & FF_PAR)
-          continue;
         if(deleteDir(cur) == NULL)
           return(NULL);
       }
     }
     ch = rmdir(file);
   } else
-    ch = unlink(file); 
+    ch = unlink(file);
 
  /* error occured, ask user what to do */
   if(ch == -1 && !(sflags & SF_IGNE)) {
diff --git a/src/export.c b/src/export.c
index 5d6545c8f2ba7b0ff111bc70a7677703aa323700..303e3b7dc5e7bbe928a23a5871dd235427fb5f27 100644
--- a/src/export.c
+++ b/src/export.c
@@ -69,8 +69,6 @@ void _writeInt(FILE *wr, unsigned char *word, int storage, int size) {
 long calcItems(struct dir *dr) {
   int count = 0;
   do {
-    if(dr->flags & FF_PAR)
-      continue;
     if(dr->sub)
       count += calcItems(dr->sub);
     count++;
@@ -84,9 +82,6 @@ void writeDirs(FILE *wr, struct dir *dr) {
   unsigned char f;
   
   do {
-    if(dr->flags & FF_PAR)
-      continue;
-  
    /* flags - the slow but portable way */
     f = 0;
     if(dr->flags & FF_DIR)   f += EF_DIR;
@@ -202,17 +197,7 @@ struct dir *importFile(char *filename) {
     if(!prev)
       parent = cur;
     else if(curlev > level) {
-     /* create a reference to the parent dir... meh, stupid hack */
-      if(curlev > 1) {
-        tmp = calloc(sizeof(struct dir), 1);
-        tmp->name = malloc(3);
-        strcpy(tmp->name, "..");
-        tmp->flags |= FF_PAR;
-        prev->sub = tmp;
-        tmp->next = cur;
-        tmp->parent = prev;
-      } else
-        prev->sub = cur;
+      prev->sub = cur;
       cur->parent = prev;
     } else if(curlev == level) {
       prev->next = cur;
diff --git a/src/ncdu.h b/src/ncdu.h
index ef122eef7d6076a6d00f5af8b643e9da9fa1a515..b410ededc5c5f862db3590d472b4484229a88c35 100644
--- a/src/ncdu.h
+++ b/src/ncdu.h
@@ -94,7 +94,7 @@ static unsigned int endian_test = 1;
 #define FF_EXL    0x10 /* excluded using exlude patterns */
 #define FF_SERR   0x20 /* error in subdirectory */
 #define FF_BSEL   0x40 /* selected */
-#define FF_PAR    0x80 /* reference to parent directory (hack) */
+#define FF_PAR    0x80 /* reference to parent directory (hack - only used in browser.c) */
 
 /* Settings Flags (int sflags) */
 #define SF_SMFS   0x01 /* same filesystem */
diff --git a/src/util.c b/src/util.c
index e825bad163ae358ea63d4a3343db2aa492dea9bb..77363de1b167bb29b054f916d20ce361573448f3 100644
--- a/src/util.c
+++ b/src/util.c
@@ -134,6 +134,7 @@ struct dir *freedir(struct dir *dr) {
   tmp = dr;
   while((tmp = tmp->parent) != NULL) {
     tmp->size -= dr->size;
+    tmp->asize -= dr->asize;
     tmp->items -= dr->items+1;
   }
 
@@ -155,6 +156,9 @@ struct dir *freedir(struct dir *dr) {
           tmp->next = dr->next;
           cur = tmp;
         }
+   /* no previous item, refer to parent dir */
+    if(cur == NULL && dr->parent->parent)
+      cur = dr->parent;
   }
   if(cur != NULL)
     cur->flags |= FF_BSEL;