diff --git a/configure.in b/configure.in
index 4be58fd188c3cbd473ce6d2ca458548d01272291..bc7f2a39151f99afa3036e2d7d9244a1dbdb6169 100644
--- a/configure.in
+++ b/configure.in
@@ -12,7 +12,6 @@ AC_PROG_RANLIB
 # Checks for libraries.
 AC_CHECK_LIB(ncurses, initscr)
 AC_CHECK_LIB(form, new_form)
-AC_CHECK_LIB(menu, new_menu)
 
 # Checks for header files.
 AC_HEADER_DIRENT
diff --git a/src/Makefile.am b/src/Makefile.am
index 5fc43386893a8300f8c18ff8eed01e08280c7429..5f180c726e1b6eb03d371003f588cc8dff10d967 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,5 @@
 bin_PROGRAMS = ncdu
 
-ncdu_SOURCES = browser.c calc.c main.c settings.c util.c exclude.c
+ncdu_SOURCES = browser.c calc.c main.c settings.c util.c exclude.c help.c delete.c
 
 noinst_HEADERS = ncdu.h
diff --git a/src/browser.c b/src/browser.c
index 8be5d412ee030557b776aa293bc74f798b426e15..2cca4b280b741e1f34285fb08f12bcfc1a85979a 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -29,129 +29,19 @@ struct dir *bcur;
 int helpwin;
 
 
-/* somewhat lazy form of removing a file/directory
-   BUG: does not handle terminal resizing          */
-WINDOW *rm_win;
-char rm_main[PATH_MAX];
-struct dir *rm_dr;
-
-struct dir *removedir(struct dir *dr) {
-  struct dir *nxt, *cur;
-  char cd[PATH_MAX], fl[PATH_MAX], par = 0;
-  int ch;
-
-  getpath(dr, cd);
-  strcpy(fl, cd);
-  strcat(fl, "/");
-  strcat(fl, dr->name);
-
-  if(rm_win == NULL) {
-    par = 1;
-    strcpy(rm_main, fl);
-    rm_dr = dr;
-    rm_win = newwin(6, 60, winrows/2 - 3, wincols/2 - 30);
-    keypad(rm_win, TRUE);
-    box(rm_win, 0, 0);
-    if(sflags & SF_NOCFM)
-      goto doit;
-
-    wattron(rm_win, A_BOLD);
-    mvwaddstr(rm_win, 0, 4, "Confirm...");
-    wattroff(rm_win, A_BOLD);
-    mvwprintw(rm_win, 2, 2, "Are you sure you want to delete the selected %s?", dr->flags & FF_DIR ? "directory" : "file");
-/*    mvwaddstr(rm_win, 3, 3, cropdir(fl, 56));*/
-    wattron(rm_win, A_BOLD);
-    mvwaddstr(rm_win, 4, 8, "y:");
-    mvwaddstr(rm_win, 4,20, "n:");
-    mvwaddstr(rm_win, 4,31, "a:");
-    wattroff(rm_win, A_BOLD);
-    mvwaddstr(rm_win, 4,11, "yes");
-    mvwaddstr(rm_win, 4,23, "no");
-    mvwaddstr(rm_win, 4,34, "don't ask me again");
-    wrefresh(rm_win);
-    ch = wgetch(rm_win);
-    if(ch != 'y' && ch != 'a') {
-      delwin(rm_win);
-      rm_win = NULL;
-      return(dr);
-    }
-    if(ch == 'a')
-      sflags |= SF_NOCFM;
-
-    doit:
-    werase(rm_win);
-    box(rm_win, 0, 0);
-    wattron(rm_win, A_BOLD);
-    mvwaddstr(rm_win, 0, 4, "Deleting...");
-    wattroff(rm_win, A_BOLD);
-    mvwprintw(rm_win, 2, 2, "Deleting %s...", cropdir(rm_main, 44));
-    wrefresh(rm_win);
-  }
-
-  if(dr->flags & FF_DIR) {
-    if(dr->sub != NULL) {
-      nxt = dr->sub;
-      while(nxt->prev != NULL)
-        nxt = nxt->prev;
-      while(nxt != NULL) {
-        cur = nxt;
-        nxt = cur->next;
-        if(removedir(cur) == rm_dr) {
-          if(rm_dr == dr)
-            break;
-          if(rm_win != NULL)
-            delwin(rm_win);
-          rm_win = NULL;
-          return(rm_dr);
-        }
-      }
-    }
-    ch = rmdir(fl);
-  } else
-    ch = unlink(fl);
-
-  if(ch == -1 && !(sflags & SF_IGNE)) {
-    mvwaddstr(rm_win, 2, 2, "                                                ");
-    mvwprintw(rm_win, 1, 2, "Error deleting %s", cropdir(fl, 42));
-    mvwaddstr(rm_win, 2, 3, cropdir(strerror(errno), 55));
-    wattron(rm_win, A_BOLD);
-    mvwaddstr(rm_win, 4, 8, "a:");
-    mvwaddstr(rm_win, 4,21, "i:");
-    mvwaddstr(rm_win, 4,35, "I:");
-    wattroff(rm_win, A_BOLD);
-    mvwaddstr(rm_win, 4,11, "abort");
-    mvwaddstr(rm_win, 4,24, "ignore");
-    mvwaddstr(rm_win, 4,38, "ignore all");
-    wrefresh(rm_win);
-    ch = wgetch(rm_win);
-    if((ch != 'i' && ch != 'I') || dr == rm_dr) {
-      delwin(rm_win);
-      rm_win = NULL;
-      return(rm_dr);
-    }
-    if(ch == 'I')
-      sflags |= SF_IGNE;
-    
-    mvwaddstr(rm_win, 1, 2, "                                                         ");
-    mvwaddstr(rm_win, 2, 2, "                                                         ");
-    mvwaddstr(rm_win, 4, 2, "                                                         ");
-    mvwprintw(rm_win, 2, 2, "Deleting %s...", cropdir(rm_main, 44));
-    wrefresh(rm_win);
-    return(dr);
-  }
-
-  if(par == 1) {
-    delwin(rm_win);
-    rm_win = NULL;
-  }
-  return(freedir(dr));
+struct dir * removedir(struct dir *dr) {
+  return(dr);
 }
 
-
-
 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 {
@@ -219,160 +109,6 @@ struct dir *sortFiles(struct dir *list) {
   }
 }
 
-int helpScreen(void) {
-  WINDOW *hlp;
-  int ch=0, x, y;
-
-  hlp = newwin(15, 60, winrows/2-7, wincols/2-30);
-  curs_set(0);
-  if(!helpwin) helpwin = 1;
-  do {
-    if(ch == ERR)
-      continue;
-    if(ch && ch != '1' && ch != '2' && ch != '3' && ch != '4')
-      break;
-    if(ch)
-      helpwin = ch - 48;
-
-    werase(hlp);
-    box(hlp, 0, 0);
-    wattron(hlp, A_BOLD);
-    mvwaddstr(hlp, 0, 4, "ncdu help");
-    wattroff(hlp, A_BOLD);
-    mvwaddstr(hlp, 13, 32, "Press any key to continue");
-    switch(helpwin) {
-      case 1:
-        wattron(hlp, A_BOLD);
-        mvwaddstr(hlp, 1, 30, "1:Keys");
-        wattroff(hlp, A_BOLD);
-        mvwaddstr(hlp, 1, 39, "2:Format");
-        mvwaddstr(hlp, 1, 50, "3:About");
-        wattron(hlp, A_BOLD);
-        mvwaddstr(hlp, 3,  7, "up/down");
-        mvwaddstr(hlp, 4,  3, "right/enter");
-        mvwaddstr(hlp, 5, 10, "left");
-        mvwaddstr(hlp, 6, 11, "n/s");
-        mvwaddch( hlp, 7, 13, 'd');
-        mvwaddch( hlp, 8, 13, 't');
-        mvwaddch( hlp, 9, 13, 'g');
-        mvwaddch( hlp,10, 13, 'p');
-        mvwaddch( hlp,11, 13, 'h');
-        mvwaddch( hlp,12, 13, 'q');
-        wattroff(hlp, A_BOLD);
-        mvwaddstr(hlp, 3, 16, "Cycle through the items");
-        mvwaddstr(hlp, 4, 16, "Open directory");
-        mvwaddstr(hlp, 5, 16, "Previous directory");
-        mvwaddstr(hlp, 6, 16, "Sort by name or size (asc/desc)");
-        mvwaddstr(hlp, 7, 16, "Delete selected file or directory");
-        mvwaddstr(hlp, 8, 16, "Toggle dirs before files when sorting");
-        mvwaddstr(hlp, 9, 16, "Show percentage and/or graph");
-        mvwaddstr(hlp,10, 16, "Toggle between powers of 1000 and 1024");
-        mvwaddstr(hlp,11, 16, "Show/hide hidden files");
-        mvwaddstr(hlp,12, 16, "Quit ncdu");
-        break;
-      case 2:
-        mvwaddstr(hlp, 1, 30, "1:Keys");
-        wattron(hlp, A_BOLD);
-        mvwaddstr(hlp, 1, 39, "2:Format");
-        wattroff(hlp, A_BOLD);
-        mvwaddstr(hlp, 1, 50, "3:About");
-        wattron(hlp, A_BOLD);
-        mvwaddstr(hlp, 3, 3, "X  [size]  [file or directory]");
-        wattroff(hlp, A_BOLD);
-        mvwaddstr(hlp, 5, 4, "The X is only present in the following cases:");
-        wattron(hlp, A_BOLD);
-        mvwaddch(hlp, 6, 4, '!');
-        mvwaddch(hlp, 7, 4, '.');
-        mvwaddch(hlp, 8, 4, '>');
-        mvwaddch(hlp, 9, 4, '<');
-        mvwaddch(hlp,10, 4, '@');
-        mvwaddch(hlp,11, 4, 'e');
-        wattroff(hlp, A_BOLD);
-        mvwaddstr(hlp, 6, 7, "An error occured while reading this directory");
-        mvwaddstr(hlp, 7, 7, "An error occured while reading a subdirectory");
-        mvwaddstr(hlp, 8, 7, "File or directory is excluded from the statistics");
-        mvwaddstr(hlp, 9, 7, "Directory was on an other filesystem");
-        mvwaddstr(hlp,10, 7, "This is not a file nor a dir (symlink, socket, ...)");
-        mvwaddstr(hlp,11, 7, "Empty directory");
-        break;
-      case 3:
-        /* Indeed, too much spare time */
-        mvwaddstr(hlp, 1, 30, "1:Keys");
-        mvwaddstr(hlp, 1, 39, "2:Format");
-        wattron(hlp, A_BOLD);
-        mvwaddstr(hlp, 1, 50, "3:About");
-        wattroff(hlp, A_BOLD);
-        wattron(hlp, A_REVERSE);
-        x=12;y=4;
-        /* N */
-        mvwaddstr(hlp, y+0, x+0, "      ");
-        mvwaddstr(hlp, y+1, x+0, "  ");
-        mvwaddstr(hlp, y+2, x+0, "  ");
-        mvwaddstr(hlp, y+3, x+0, "  ");
-        mvwaddstr(hlp, y+4, x+0, "  ");
-        mvwaddstr(hlp, y+1, x+4, "  ");
-        mvwaddstr(hlp, y+2, x+4, "  ");
-        mvwaddstr(hlp, y+3, x+4, "  ");
-        mvwaddstr(hlp, y+4, x+4, "  ");
-        /* C */
-        mvwaddstr(hlp, y+0, x+8, "     ");
-        mvwaddstr(hlp, y+1, x+8, "  ");
-        mvwaddstr(hlp, y+2, x+8, "  ");
-        mvwaddstr(hlp, y+3, x+8, "  ");
-        mvwaddstr(hlp, y+4, x+8, "     ");
-        /* D */
-        mvwaddstr(hlp, y+0, x+19, "  ");
-        mvwaddstr(hlp, y+1, x+19, "  ");
-        mvwaddstr(hlp, y+2, x+15, "      ");
-        mvwaddstr(hlp, y+3, x+15, "  ");
-        mvwaddstr(hlp, y+3, x+19, "  ");
-        mvwaddstr(hlp, y+4, x+15, "      ");
-        /* U */
-        mvwaddstr(hlp, y+0, x+23, "  ");
-        mvwaddstr(hlp, y+1, x+23, "  ");
-        mvwaddstr(hlp, y+2, x+23, "  ");
-        mvwaddstr(hlp, y+3, x+23, "  ");
-        mvwaddstr(hlp, y+0, x+27, "  ");
-        mvwaddstr(hlp, y+1, x+27, "  ");
-        mvwaddstr(hlp, y+2, x+27, "  ");
-        mvwaddstr(hlp, y+3, x+27, "  ");
-        mvwaddstr(hlp, y+4, x+23, "      ");
-        wattroff(hlp, A_REVERSE);
-        mvwaddstr(hlp, y+0, x+30, "NCurses");
-        mvwaddstr(hlp, y+1, x+30, "Disk");
-        mvwaddstr(hlp, y+2, x+30, "Usage");
-        mvwprintw(hlp, y+4, x+30, "%s", PACKAGE_VERSION);
-
-        mvwaddstr(hlp,10,  7, "Written by Yoran Heling <projects@yorhel.nl>");
-        mvwaddstr(hlp,11, 16, "http://dev.yorhel.nl/ncdu/");
-        break;
-      case 4:
-        mvwaddstr(hlp, 1, 30, "1:Keys"); 
-        mvwaddstr(hlp, 1, 39, "2:Format");
-        mvwaddstr(hlp, 1, 50, "3:About");
-        mvwaddstr(hlp, 3, 3, "There is no fourth window, baka~~");
-    }
-    wrefresh(hlp);
-  } while((ch = getch()));
-  delwin(hlp);
-  touchwin(stdscr);
-  refresh();
-  if(ch == KEY_RESIZE) {
-    ncresize();
-    return(1);
-  }
-  helpwin = 0;
-  return(0);
-}
-
-#define toggle(x,y) if(x & y) x -=y; else x |= y
-
-/* bgraph:
-    0 -> none
-    1 -> graph
-    2 -> percentage
-    3 -> percentage + graph
-*/
 
 char graphdat[11];
 char *graph(off_t max, off_t size) {
@@ -384,14 +120,17 @@ char *graph(off_t max, off_t size) {
 }
 
 
-void browseDir(void) {
-  ITEM **items;
-  char **itrows, tmp[PATH_MAX], tmp2[PATH_MAX], ct;
-  MENU *menu;
-  struct dir *d;
+#define exlhid(x) if(bflags & BF_HIDE && !(x->flags & FF_PAR) && x->name[0] == '.') { i--; continue; }
+
+void drawBrowser(int change) {
+  struct dir *n;
+  char tmp[PATH_MAX], ct, dt;
+  int selected, i, o;
   off_t max;
-  int i, fls, ch, bf, s;
 
+  erase();
+
+ /* exit if there are no items to display */
   if(bcur->parent == NULL) {
     if(bcur->sub == NULL) {
       erase();
@@ -402,220 +141,239 @@ void browseDir(void) {
     } else
       bcur = bcur->sub;
   }
-  
 
-  erase();
+ /* create header and status bar */
   attron(A_REVERSE);
-  for(i=0; i<wincols;i++) {
-    mvaddch(0, i, ' ');
-    mvaddch(winrows-1, i, ' ');
-  }
+  mvhline(0, 0, ' ', wincols);
+  mvhline(winrows-1, 0, ' ', wincols);
   mvprintw(0,0,"%s %s ~ Use the arrow keys to navigate, press ? for help", PACKAGE_NAME, PACKAGE_VERSION);
+  
   mvprintw(winrows-1, 0, " Total size: %s   Files: %-6d   Dirs: %-6d",
       cropsize(bcur->parent->size), bcur->parent->files, bcur->parent->dirs);
   attroff(A_REVERSE);
-  for(i=wincols; i>=0; i--)
-    mvaddch(1,i,'-');
 
+  mvhline(1, 0, '-', wincols);
+  mvaddstr(1, 3, cropdir(getpath(bcur, tmp), wincols-5));
+
+ /* make sure we have the first item, and the items are in correct order */
   bcur = sortFiles(bcur);
-  fls = 1; d = bcur; max = 0;
-  while(d != NULL) {
-    if(!(bflags & BF_HIDE) || d->name[0] != '.') {
-      if(d->size > max)
-        max = d->size;
-      fls++;
-    }
-    d = d->next;
+  while(bcur->prev != NULL)
+    bcur = bcur->prev;
+
+ /* get maximum size and selected item */
+  for(n = bcur, selected = i = 0; n != NULL; n = n->next, i++) {
+    exlhid(n)
+    if(n->flags & FF_BSEL)
+      selected = i;
+    if(n->size > max)
+      max = n->size;
   }
 
-  mvaddstr(1, 3, cropdir(getpath(bcur, tmp), wincols-5));
-
-  items = calloc(fls+2, sizeof(ITEM *));
-  itrows = malloc((fls+1) * sizeof(char *));
-  itrows[0] = malloc((fls+1) * wincols * sizeof(char));
-  for(i=1; i<fls; i++)
-    itrows[i] = itrows[0] + i*wincols;
+  if(selected+change < 0)
+    change -= selected+change;
+  if(selected+change > --i)
+    change -= (selected+change)-i;
+  for(n = bcur, i = 0; n != NULL; n = n->next, i++) {
+    exlhid(n)
+    if(i == selected && n->flags & FF_BSEL)
+      n->flags -= FF_BSEL;
+    if(i == selected+change)
+      n->flags |= FF_BSEL;
+  }
+  selected += change;
 
-  s = 0;
+ /* determine the listing format */
   switch(bgraph) {
     case 0:
       sprintf(tmp, "%%c %%7s  %%c%%-%ds", wincols-12);
-      s = 0;
       break;
     case 1:
-      s = 12;
       sprintf(tmp, "%%c %%7s [%%10s] %%c%%-%ds", wincols-24);
       break;
     case 2:
-      s = 7;
       sprintf(tmp, "%%c %%7s [%%4.1f%%%%] %%c%%-%ds", wincols-19);
       break;
     case 3:
-      s = 18;
       sprintf(tmp, "%%c %%7s [%%4.1f%%%% %%10s] %%c%%-%ds", wincols-30);
   }
 
-  if(bcur->parent->parent != NULL) {
-    s += 11;
-    for(i=0; i<s; i++)
-      tmp2[i] = ' ';
-    tmp2[i++] = '\0';
-    strcat(tmp2, "/..");
-    items[0] = new_item(tmp2, 0);
-    set_item_userptr(items[0], NULL);
-    i = 1;
-  } else
-    i = 0;
-  
-  d = bcur; s=-1;
-  while(d != NULL) {
-    if(bflags & BF_HIDE && d->name[0] == '.') {
-      d = d->next;
+ /* determine start position */
+  for(n = bcur, i = 0; n != NULL; n = n->next, i++) {
+    exlhid(n)
+    if(i == (selected / (winrows-3)) * (winrows-3))
+      break;
+  }
+  selected -= i;
+
+ /* print the list to the screen */
+  for(i=0; n != NULL && i < winrows-3; n = n->next, i++) {
+    exlhid(n)
+    if(i == selected)
+      attron(A_REVERSE);
+
+   /* reference to parent dir has a different format */
+    if(n->flags & FF_PAR) {
+      mvhline(i+2, 0, ' ', wincols);
+      o = bgraph == 0 ? 11 :
+          bgraph == 1 ? 23 :
+          bgraph == 2 ? 18 :
+                        29 ;
+      mvaddstr(i+2, o, "/..");
+      if(i == selected)
+        attroff(A_REVERSE);
       continue;
     }
-    ct =  d->flags & FF_ERR ? '!' :
-         d->flags & FF_SERR ? '.' :
-        d->flags & FF_OTHFS ? '>' :
-          d->flags & FF_EXL ? '<' :
-        d->flags & FF_OTHER ? '@' :
-          d->flags & FF_DIR
-          && d->sub == NULL ? 'e' :
+
+   /* determine indication character */
+    ct =  n->flags & FF_EXL ? '<' :
+          n->flags & FF_ERR ? '!' :
+         n->flags & FF_SERR ? '.' :
+        n->flags & FF_OTHFS ? '>' :
+        n->flags & FF_OTHER ? '@' :
+          n->flags & FF_DIR
+          && n->sub == NULL ? 'e' :
                               ' ' ;
+    dt = n->flags & FF_DIR ? '/' : ' ';
+
+   /* format and add item to the list */
     switch(bgraph) {
       case 0:
-        sprintf(itrows[i], tmp, ct, cropsize(d->size),
-          d->flags & FF_DIR ? '/' : ' ', cropdir(d->name, wincols-12));
+        mvprintw(i+2, 0, tmp, ct, cropsize(n->size),
+          dt, cropdir(n->name, wincols-12)
+        );
         break;
       case 1:
-        sprintf(itrows[i], tmp, ct, cropsize(d->size), graph(max, d->size),
-          d->flags & FF_DIR ? '/' : ' ', cropdir(d->name, wincols-24));
+        mvprintw(i+2, 0, tmp, ct, cropsize(n->size),
+          graph(max, n->size),
+          dt, cropdir(n->name, wincols-24)
+        );
         break;
       case 2:
-        sprintf(itrows[i], tmp, ct, cropsize(d->size), ((float) d->size / (float) d->parent->size) * 100.0f,
-          d->flags & FF_DIR ? '/' : ' ', cropdir(d->name, wincols-19));
+        mvprintw(i+2, 0, tmp, ct, cropsize(n->size),
+          ((float) n->size / (float) n->parent->size) * 100.0f,
+          dt, cropdir(n->name, wincols-19)
+        );
         break;
       case 3:
-        sprintf(itrows[i], tmp, ct, cropsize(d->size), ((float) d->size / (float) d->parent->size) * 100.0f, graph(max, d->size),
-          d->flags & FF_DIR ? '/' : ' ', cropdir(d->name, wincols-30));
+        mvprintw(i+2, 0, tmp, ct, cropsize(n->size),
+          ((float) n->size / (float) n->parent->size) * 100.0f, graph(max, n->size),
+          dt, cropdir(n->name, wincols-30)
+        );
     }
-
-    items[i] = new_item(itrows[i], 0);
-    set_item_userptr(items[i], d);
-    if(d->flags & FF_BSEL) {
-      s = i;
-      d->flags -= FF_BSEL;
-    }
-    d = d->next;
-    i++;
+    
+    if(i == selected)
+      attroff(A_REVERSE);
   }
-  items[i] = NULL;
-  menu = new_menu(items);
-  set_menu_format(menu, winrows-3, 1);
-  set_menu_sub(menu, derwin(stdscr, winrows-3, wincols, 2, 0));
-  set_menu_mark(menu, "");
-  post_menu(menu);
-  if(s >= 0)
-    for(i=0; i<s; i++)
-      menu_driver(menu, REQ_DOWN_ITEM);
+}
+
+struct dir * selected(void) {
+  struct dir *n = bcur;
+  do {
+    if(n->flags & FF_BSEL)
+      return n;
+  } while((n = n->next) != NULL);
+}
+
+
+#define toggle(x,y) if(x & y) x -=y; else x |= y
+
+void showBrowser(void) {
+  int ch, change;
+  struct dir *n;
   
-  d = bcur; bf = bflags;
+  bcur = dat.sub;
+  bgraph = 1;
+  nodelay(stdscr, 0);
+  bflags = BF_SIZE;
+
+  drawBrowser(0);
   refresh();
-  
-  if(helpwin > 0 && helpScreen() == 1) goto endbrowse;
+
   while((ch = getch())) {
+    change = 0;
     switch(ch) {
-      case KEY_UP:    menu_driver(menu, REQ_UP_ITEM);    break;
-      case KEY_DOWN:  menu_driver(menu, REQ_DOWN_ITEM);  break;
-      case KEY_HOME:  menu_driver(menu, REQ_FIRST_ITEM); break;
-      case KEY_LL: 
-      case KEY_END:   menu_driver(menu, REQ_LAST_ITEM);  break;
-      case KEY_PPAGE: menu_driver(menu, REQ_SCR_UPAGE);  break;
-      case KEY_NPAGE: menu_driver(menu, REQ_SCR_DPAGE);  break;
-      case '?':
-        if(helpScreen() == 1)
-          goto endbrowse;
+     /* selecting items */
+      case KEY_UP:
+        change = -1;
         break;
-      case 'q':
-        bcur = NULL;
-        goto endbrowse;
-      case 10: case KEY_RIGHT:
-        bcur = item_userptr(current_item(menu));
-        if(bcur == NULL) {
-          bcur = d->parent;
-          goto endbrowse;
-        } else if(bcur->sub != NULL) { 
-          bcur->flags |= FF_BSEL;
-          bcur = bcur->sub;
-          goto endbrowse;
-        } else
-          bcur = d;
+      case KEY_DOWN:
+        change =  1;
         break;
-      case KEY_RESIZE:
-        ncresize();
-        goto endbrowse;
-      case KEY_LEFT:
-        if(bcur->parent->parent != NULL)
-          bcur = bcur->parent;
-        else
-          bcur = d;
-        goto endbrowse;
+      case KEY_HOME:
+        change = -16777216;
+        break;
+      case KEY_LL:
+      case KEY_END:
+        change = 16777216;
+        break;
+      case KEY_PPAGE:
+        change = -1*(winrows-3);
+        break;
+      case KEY_NPAGE:
+        change = winrows-3;
+        break;
+
+     /* sorting items */
       case 'n':
         if(bflags & BF_NAME)
           toggle(bflags, BF_DESC);
         else
           bflags = (bflags & BF_HIDE) + (bflags & BF_NDIRF) + BF_NAME;
-        goto endbrowse;
+        break;
       case 's':
         if(bflags & BF_SIZE)
           toggle(bflags, BF_DESC);
         else
           bflags = (bflags & BF_HIDE) + (bflags & BF_NDIRF) + BF_SIZE;
-        goto endbrowse;
+        break;
       case 'p':
         toggle(sflags, SF_SI);
-        goto endbrowse;
+        break;
       case 'h':
         toggle(bflags, BF_HIDE);
-        goto endbrowse;
+        break;
       case 't':
         toggle(bflags, BF_NDIRF);
-        goto endbrowse;
+        break;
+
+     /* browsing */
+      case 10:
+      case KEY_RIGHT:
+        n = selected();
+        if(n->flags & FF_PAR)
+          bcur = bcur->parent;
+        else if(n->sub != NULL)
+          bcur = n->sub;
+        break;
+      case KEY_LEFT:
+        if(bcur->parent->parent != NULL) {
+          bcur = bcur->parent;
+        }
+        break;
+
+     /* and other stuff */
+      case KEY_RESIZE:
+        ncresize();
+        break;
       case 'g':
         if(++bgraph > 3) bgraph = 0;
-        goto endbrowse;
+        break;
+      case '?':
+        showHelp();
+        break;
       case 'd':
-        bcur = item_userptr(current_item(menu));
-        if(bcur == NULL) {
-          bcur = d;
-          break;
-        }
-        set_item_userptr(current_item(menu), NULL);
-        bcur->flags |= FF_BSEL;
-        bcur = removedir(bcur);
-        goto endbrowse;
+        n = selected();
+        if(!(n->flags & FF_PAR))
+          bcur = showDelete(n);
+        break;
+      case 'q':
+        goto endloop;
     }
+    drawBrowser(change);
     refresh();
   }
-  endbrowse:
-  if(bcur == d && (d = item_userptr(current_item(menu))) != NULL)
-    d->flags |= FF_BSEL;
-  unpost_menu(menu);
-  for(i=fls-3;i>=0;i--)
-    free_item(items[i]);
-  free(items);
-  free(itrows[0]);
-  free(itrows);
+  endloop:
   erase();
 }
 
-void showBrowser(void) {
-  bcur = dat.sub;
-  bgraph = 1;
-  helpwin = 0;
-  while(bcur != NULL)
-    browseDir();
-}
-
-
-
 
diff --git a/src/calc.c b/src/calc.c
index dcdd8a06b81d31a5b40432bb1d68f7444eaca1d1..8bcd6d8df4f9efc1f8bd3028e050c4ffbb56c7bb 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -147,14 +147,9 @@ int calcUsage() {
   struct dirent *dr;
   struct stat fs;
   struct dir *d, *dirs[512]; /* 512 recursive directories should be enough for everyone! */
-#ifdef HAVE_GETTIMEOFDAY
   struct timeval tv; suseconds_t l;
   gettimeofday(&tv, (void *)NULL);
   l = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / sdelay - 1;
-#else
-  time_t tv; time_t l;
-  l = time(NULL) - 1;
-#endif
 
   calc = calcWin();
   wrefresh(calc);
@@ -222,7 +217,9 @@ int calcUsage() {
     errno = 0;
     while((dr = readdir(dir)) != NULL) {
       f = dr->d_name;
-      if(f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0')))
+      if(f[0] == '.' && f[1] == '\0')
+        continue;
+      if(f[0] == '.' && f[1] == '.' && f[2] == '\0' && level == 1)
         continue;
       namelen = strlen(f);
       if(cdir1len+namelen+1 >= PATH_MAX) {
@@ -238,12 +235,12 @@ int calcUsage() {
       d->parent = dirs[level-1];
       dirs[level-1]->sub = d;
       dirs[level] = d;
-      sprintf(tmp, "%s/%s", cdir1, d->name);
-     /* check if file/dir is excluded */
-      if(matchExclude(tmp)) {
-        d->flags = FF_EXL;
+     /* reference to parent directory, no need to stat */
+      if(f[0] == '.' && f[1] == '.' && f[2] == '\0') {
+        d->flags = FF_PAR;
         continue;
       }
+      sprintf(tmp, "%s/%s", cdir1, d->name);
      /* stat */
       if(lstat(tmp, &fs)) {
         staterr = 1;
@@ -251,19 +248,26 @@ int calcUsage() {
         errno = 0;
         continue;
       }
+     /* check if file/dir is excluded */
+      if(matchExclude(tmp))
+        d->flags = FF_EXL;
      /* check filetype */
       if(sflags & SF_SMFS && dev != fs.st_dev)
         d->flags |= FF_OTHFS;
       if(S_ISREG(fs.st_mode)) {
         d->flags |= FF_FILE;
-        for(i=level; i-->0;)
-          dirs[i]->files++;
+        if(!(d->flags & FF_EXL))
+          for(i=level; i-->0;)
+            dirs[i]->files++;
       } else if(S_ISDIR(fs.st_mode)) {
         d->flags |= FF_DIR;
-        for(i=level; i-->0;) 
-          dirs[i]->dirs++;
+        if(!(d->flags & FF_EXL))
+          for(i=level; i-->0;) 
+            dirs[i]->dirs++;
       } else
         d->flags |= FF_OTHER;
+      if(d->flags & FF_EXL)
+        continue;
      /* count size */
       if(sflags & SF_AS)
         d->size = fs.st_size;
@@ -274,6 +278,14 @@ int calcUsage() {
         dirs[i]->size += d->size;
       errno = 0;
     }
+   /* empty dir - remove the reference to the parent dir */
+    if(dirs[level]->next == NULL && dirs[level]->prev == NULL) {
+      dirs[level]->parent->sub = NULL;
+      free(dirs[level]->name);
+      free(dirs[level]);
+      dirs[level] = NULL;
+    }
+   /* check for errors */
     if(errno)
       direrr = 1;
     closedir(dir);
@@ -285,14 +297,9 @@ int calcUsage() {
 
    /* show progress status */
     showstatus:
-#ifdef HAVE_GETTIMEOFDAY
     gettimeofday(&tv, (void *)NULL);
     tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / sdelay;
     if(l == tv.tv_usec) goto newdir;
-#else
-    time(&tv);
-    if(l == tv) goto newdir;
-#endif
     mvwprintw(calc, 3, 15, "%-43s", cropdir(cdir, 43));
     mvwprintw(calc, 2, 15, "%d", dat.files);
     mvwprintw(calc, 2, 30, "%d", dat.dirs);
@@ -323,11 +330,7 @@ int calcUsage() {
 
 
     newdir:
-#ifdef HAVE_GETTIMEOFDAY
     l = tv.tv_usec;
-#else
-    l = tv;
-#endif
    /* select new directory */
     while(dirs[level] == NULL || !(dirs[level]->flags & FF_DIR) || dirs[level]->flags & FF_OTHFS || dirs[level]->flags & FF_EXL) {
       if(dirs[level] != NULL && dirs[level]->prev != NULL)
diff --git a/src/delete.c b/src/delete.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce62951faf08b33ab39f491d8f9b27a2df92eb8f
--- /dev/null
+++ b/src/delete.c
@@ -0,0 +1,242 @@
+/* ncdu - NCurses Disk Usage 
+  
+  Copyright (c) 2007 Yoran Heling
+
+  Permission is hereby granted, free of charge, to any person obtaining
+  a copy of this software and associated documentation files (the
+  "Software"), to deal in the Software without restriction, including
+  without limitation the rights to use, copy, modify, merge, publish,
+  distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to
+  the following conditions:
+  
+  The above copyright notice and this permission notice shall be included
+  in all copies or substantial portions of the Software.
+  
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "ncdu.h"
+
+suseconds_t lastupdate;
+
+
+void drawConfirm(struct dir *del, int sel) {
+  WINDOW *cfm;
+
+  cfm = newwin(6, 60, winrows/2-3, wincols/2-30);
+  box(cfm, 0, 0);
+  wattron(cfm, A_BOLD);
+  mvwaddstr(cfm, 0, 4, "Confirm delete");
+  wattroff(cfm, A_BOLD);
+
+  mvwprintw(cfm, 1, 2, "Are you sure you want to delete \"%s\"%c",
+    cropdir(del->name, 21), del->flags & FF_DIR ? ' ' : '?');
+  if(del->flags & FF_DIR) 
+    mvwprintw(cfm, 2, 18, "and all of its contents?");
+
+  if(sel == 0)
+    wattron(cfm, A_REVERSE);
+  mvwaddstr(cfm, 4, 15, "yes");
+  wattroff(cfm, A_REVERSE);
+  if(sel == 1)
+    wattron(cfm, A_REVERSE);
+  mvwaddstr(cfm, 4, 24, "no");
+  wattroff(cfm, A_REVERSE);
+  if(sel == 2)
+    wattron(cfm, A_REVERSE);
+  mvwaddstr(cfm, 4, 31, "don't ask me again");
+  wattroff(cfm, A_REVERSE);
+
+  wrefresh(cfm);
+  delwin(cfm);
+}
+
+
+/* show progress */
+void drawProgress(char *file) {
+  WINDOW *prg;
+
+  prg = newwin(6, 60, winrows/2-3, wincols/2-30);
+  nodelay(prg, 1);
+  box(prg, 0, 0);
+  wattron(prg, A_BOLD);
+  mvwaddstr(prg, 0, 4, "Deleting...");
+  wattroff(prg, A_BOLD); 
+
+  mvwaddstr(prg, 1, 2, cropdir(file, 47));
+  mvwaddstr(prg, 5, 41, "Press q to abort");
+
+  wrefresh(prg);
+  delwin(prg);
+}
+
+
+/* show error dialog */
+void drawError(int sel, char *file) {
+  WINDOW *err;
+
+  err = newwin(6, 60, winrows/2-3, wincols/2-30);
+  box(err, 0, 0);
+  wattron(err, A_BOLD);
+  mvwaddstr(err, 0, 4, "Error!");
+  wattroff(err, A_BOLD);
+
+  mvwprintw(err, 1, 2, "Can't delete %s:", cropdir(file, 42));
+  mvwaddstr(err, 2, 4, strerror(errno));
+
+  if(sel == 0)
+    wattron(err, A_REVERSE);
+  mvwaddstr(err, 4, 14, "abort");
+  wattroff(err, A_REVERSE);
+  if(sel == 1)
+    wattron(err, A_REVERSE);
+  mvwaddstr(err, 4, 23, "ignore");
+  wattroff(err, A_REVERSE);
+  if(sel == 2)
+    wattron(err, A_REVERSE);
+  mvwaddstr(err, 4, 33, "ignore all");
+  wattroff(err, A_REVERSE);
+
+  wrefresh(err);
+  delwin(err); 
+}
+
+
+struct dir *deleteDir(struct dir *dr) {
+  struct dir *nxt, *cur;
+  int ch, sel = 0;
+  char file[PATH_MAX];
+  struct timeval tv;
+
+  getpath(dr, file);
+  strcat(file, "/");
+  strcat(file, dr->name);
+
+ /* check for input or screen resizes */
+  nodelay(stdscr, 1);
+  while((ch = getch()) != ERR) {
+    if(ch == 'q')
+      return(NULL);
+    if(ch == KEY_RESIZE) {
+      ncresize();
+      drawBrowser(0);
+      drawProgress(file);
+    }
+  }
+  nodelay(stdscr, 0);
+
+ /* don't update the screen with shorter intervals than sdelay */
+  gettimeofday(&tv, (void *)NULL);
+  tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / sdelay;
+  if(lastupdate != tv.tv_usec) {
+    drawProgress(file);
+    lastupdate = tv.tv_usec;
+  }
+
+ /* do the actual deleting */
+  if(dr->flags & FF_DIR) {
+    if(dr->sub != NULL) {
+      nxt = dr->sub;
+      while(nxt->prev != NULL)
+        nxt = nxt->prev;
+      while(nxt != NULL) {
+        cur = nxt;
+        nxt = cur->next;
+        if(cur->flags & FF_PAR) {
+          freedir(cur);
+          continue;
+        }
+        if(deleteDir(cur) == NULL)
+          return(NULL);
+      }
+    }
+    ch = rmdir(file);
+  } else
+    ch = unlink(file); 
+
+ /* error occured, ask user what to do */
+  if(ch == -1 && !(sflags & SF_IGNE)) {
+    drawError(sel, file);
+    while((ch = getch())) {
+      switch(ch) {
+        case KEY_LEFT:
+          if(--sel < 0)
+            sel = 0;
+          break;
+        case KEY_RIGHT:
+          if(++sel > 2)
+            sel = 2;
+          break;
+        case 10:
+          if(sel == 0)
+            return(NULL);
+          if(sel == 2)
+            sflags |= SF_IGNE;
+          goto ignore;
+        case 'q':
+          return(NULL);
+        case KEY_RESIZE:
+          ncresize();
+          drawBrowser(0);
+          break;
+      }
+      drawError(sel, file);
+    }
+  };
+  ignore: 
+
+  return(freedir(dr));
+}
+
+
+struct dir *showDelete(struct dir *dr) {
+  int ch, sel = 1;
+  struct dir *ret;
+
+ /* confirm */
+  if(sflags & SF_NOCFM)
+    goto doit;
+  
+  drawConfirm(dr, sel);
+  while((ch = getch())) {
+    switch(ch) {
+      case KEY_LEFT:
+        if(--sel < 0)
+          sel = 0;
+        break;
+      case KEY_RIGHT:
+        if(++sel > 2)
+          sel = 2;
+        break;
+      case 10:
+        if(sel == 1)
+          return(dr);
+        if(sel == 2)
+          sflags |= SF_NOCFM;
+        goto doit;
+      case 'q':
+        return(dr);
+      case KEY_RESIZE:
+        ncresize();
+        drawBrowser(0);
+        break;
+    }
+    drawConfirm(dr, sel);
+  }
+
+  doit:
+  lastupdate = 999; /* just some random high value as initialisation */
+
+  ret = deleteDir(dr);
+
+  return(ret == NULL ? dr : ret);
+}
+
diff --git a/src/help.c b/src/help.c
new file mode 100644
index 0000000000000000000000000000000000000000..98331f0164d2867c843e6fb9e2db4c7db5d1f7f1
--- /dev/null
+++ b/src/help.c
@@ -0,0 +1,193 @@
+/* ncdu - NCurses Disk Usage 
+  
+  Copyright (c) 2007 Yoran Heling
+
+  Permission is hereby granted, free of charge, to any person obtaining
+  a copy of this software and associated documentation files (the
+  "Software"), to deal in the Software without restriction, including
+  without limitation the rights to use, copy, modify, merge, publish,
+  distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to
+  the following conditions:
+  
+  The above copyright notice and this permission notice shall be included
+  in all copies or substantial portions of the Software.
+  
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "ncdu.h"
+
+
+void drawHelp(int page) {
+  WINDOW *hlp;
+
+  hlp = newwin(15, 60, winrows/2-7, wincols/2-30);
+  box(hlp, 0, 0);
+  wattron(hlp, A_BOLD);
+  mvwaddstr(hlp, 0, 4, "ncdu help");
+  wattroff(hlp, A_BOLD);
+  mvwaddstr(hlp, 13, 32, "Press any key to continue");
+
+  switch(page) {
+    case 1:
+      wattron(hlp, A_BOLD);
+      mvwaddstr(hlp, 1, 30, "1:Keys");
+      wattroff(hlp, A_BOLD);
+      mvwaddstr(hlp, 1, 39, "2:Format");
+      mvwaddstr(hlp, 1, 50, "3:About");
+      wattron(hlp, A_BOLD);
+      mvwaddstr(hlp, 3,  7, "up/down");
+      mvwaddstr(hlp, 4,  3, "right/enter");
+      mvwaddstr(hlp, 5, 10, "left");
+      mvwaddstr(hlp, 6, 11, "n/s");
+      mvwaddch( hlp, 7, 13, 'd');
+      mvwaddch( hlp, 8, 13, 't');
+      mvwaddch( hlp, 9, 13, 'g');
+      mvwaddch( hlp,10, 13, 'p');
+      mvwaddch( hlp,11, 13, 'h');
+      mvwaddch( hlp,12, 13, 'q');
+      wattroff(hlp, A_BOLD);
+      mvwaddstr(hlp, 3, 16, "Cycle through the items");
+      mvwaddstr(hlp, 4, 16, "Open directory");
+      mvwaddstr(hlp, 5, 16, "Previous directory");
+      mvwaddstr(hlp, 6, 16, "Sort by name or size (asc/desc)");
+      mvwaddstr(hlp, 7, 16, "Delete selected file or directory");
+      mvwaddstr(hlp, 8, 16, "Toggle dirs before files when sorting");
+      mvwaddstr(hlp, 9, 16, "Show percentage and/or graph");
+      mvwaddstr(hlp,10, 16, "Toggle between powers of 1000 and 1024");
+      mvwaddstr(hlp,11, 16, "Show/hide hidden files");
+      mvwaddstr(hlp,12, 16, "Quit ncdu");
+      break;
+    case 2:
+      mvwaddstr(hlp, 1, 30, "1:Keys");
+      wattron(hlp, A_BOLD);
+      mvwaddstr(hlp, 1, 39, "2:Format");
+      wattroff(hlp, A_BOLD);
+      mvwaddstr(hlp, 1, 50, "3:About");
+      wattron(hlp, A_BOLD);
+      mvwaddstr(hlp, 3, 3, "X  [size]  [file or directory]");
+      wattroff(hlp, A_BOLD);
+      mvwaddstr(hlp, 5, 4, "The X is only present in the following cases:");
+      wattron(hlp, A_BOLD);
+      mvwaddch(hlp, 6, 4, '!');
+      mvwaddch(hlp, 7, 4, '.');
+      mvwaddch(hlp, 8, 4, '>');
+      mvwaddch(hlp, 9, 4, '<');
+      mvwaddch(hlp,10, 4, '@');
+      mvwaddch(hlp,11, 4, 'e');
+      wattroff(hlp, A_BOLD);
+      mvwaddstr(hlp, 6, 7, "An error occured while reading this directory");
+      mvwaddstr(hlp, 7, 7, "An error occured while reading a subdirectory");
+      mvwaddstr(hlp, 8, 7, "File or directory is excluded from the statistics");
+      mvwaddstr(hlp, 9, 7, "Directory was on an other filesystem");
+      mvwaddstr(hlp,10, 7, "This is not a file nor a dir (symlink, socket, ...)");
+      mvwaddstr(hlp,11, 7, "Empty directory");
+      break;
+    case 3:
+      /* Indeed, too much spare time */
+      mvwaddstr(hlp, 1, 30, "1:Keys");
+      mvwaddstr(hlp, 1, 39, "2:Format");
+      wattron(hlp, A_BOLD);
+      mvwaddstr(hlp, 1, 50, "3:About");
+      wattroff(hlp, A_BOLD);
+      wattron(hlp, A_REVERSE);
+#define x 12
+#define y 4
+      /* N */
+      mvwaddstr(hlp, y+0, x+0, "      ");
+      mvwaddstr(hlp, y+1, x+0, "  ");
+      mvwaddstr(hlp, y+2, x+0, "  ");
+      mvwaddstr(hlp, y+3, x+0, "  ");
+      mvwaddstr(hlp, y+4, x+0, "  ");
+      mvwaddstr(hlp, y+1, x+4, "  ");
+      mvwaddstr(hlp, y+2, x+4, "  ");
+      mvwaddstr(hlp, y+3, x+4, "  ");
+      mvwaddstr(hlp, y+4, x+4, "  ");
+      /* C */
+      mvwaddstr(hlp, y+0, x+8, "     ");
+      mvwaddstr(hlp, y+1, x+8, "  ");
+      mvwaddstr(hlp, y+2, x+8, "  ");
+      mvwaddstr(hlp, y+3, x+8, "  ");
+      mvwaddstr(hlp, y+4, x+8, "     ");
+      /* D */
+      mvwaddstr(hlp, y+0, x+19, "  ");
+      mvwaddstr(hlp, y+1, x+19, "  ");
+      mvwaddstr(hlp, y+2, x+15, "      ");
+      mvwaddstr(hlp, y+3, x+15, "  ");
+      mvwaddstr(hlp, y+3, x+19, "  ");
+      mvwaddstr(hlp, y+4, x+15, "      ");
+      /* U */
+      mvwaddstr(hlp, y+0, x+23, "  ");
+      mvwaddstr(hlp, y+1, x+23, "  ");
+      mvwaddstr(hlp, y+2, x+23, "  ");
+      mvwaddstr(hlp, y+3, x+23, "  ");
+      mvwaddstr(hlp, y+0, x+27, "  ");
+      mvwaddstr(hlp, y+1, x+27, "  ");
+      mvwaddstr(hlp, y+2, x+27, "  ");
+      mvwaddstr(hlp, y+3, x+27, "  ");
+      mvwaddstr(hlp, y+4, x+23, "      ");
+      wattroff(hlp, A_REVERSE);
+      mvwaddstr(hlp, y+0, x+30, "NCurses");
+      mvwaddstr(hlp, y+1, x+30, "Disk");
+      mvwaddstr(hlp, y+2, x+30, "Usage");
+      mvwprintw(hlp, y+4, x+30, "%s", PACKAGE_VERSION);
+      mvwaddstr(hlp,10,  7, "Written by Yoran Heling <projects@yorhel.nl>");
+      mvwaddstr(hlp,11, 16, "http://dev.yorhel.nl/ncdu/");
+      break;
+    case 4:
+      mvwaddstr(hlp, 1, 30, "1:Keys"); 
+      mvwaddstr(hlp, 1, 39, "2:Format");
+      mvwaddstr(hlp, 1, 50, "3:About");
+      mvwaddstr(hlp, 3, 3, "There is no fourth window, baka~~");
+  }
+  wrefresh(hlp);
+  delwin(hlp); /* no need to use it anymore - free it */
+}
+
+
+void showHelp(void) {
+  int p = 1, ch;
+
+  drawHelp(p);
+  while((ch = getch())) {
+    switch(ch) {
+      case '1':
+        p = 1;
+        break;
+      case '2':
+        p = 2;
+        break;
+      case '3':
+        p = 3;
+        break;
+      case '4':
+        p = 4;
+        break;
+      case KEY_RIGHT:
+        if(++p > 4)
+          p = 4;
+        break;
+      case KEY_LEFT:
+        if(--p < 1)
+          p = 1;
+        break;
+      case KEY_RESIZE:
+        ncresize();
+        drawBrowser(0);
+        break;
+      default:
+        return;
+    }
+    drawHelp(p);
+  }
+}
+
+
diff --git a/src/main.c b/src/main.c
index 6ed98b7d74f2a8e601a0a51d238b3cdeffa7787f..0bf11bbad97bc3a669e29fc0952ede001ea7dc20 100644
--- a/src/main.c
+++ b/src/main.c
@@ -42,7 +42,6 @@ int main(int argc, char **argv) {
   keypad(stdscr, TRUE);
   ncresize();
   
-  bgraph = 0;
   if(gd && settingsWin()) goto mainend;
   while((r = calcUsage()) != 0) {
     if(r == 1 && settingsWin()) goto mainend;
@@ -57,3 +56,4 @@ int main(int argc, char **argv) {
 
   return(0);
 }
+
diff --git a/src/ncdu.h b/src/ncdu.h
index f4ccbed580f7df640a4b343b89e0cd69f9970aba..f1ad29d95b4c9aff4b4580dc69b9240de8b05bb4 100644
--- a/src/ncdu.h
+++ b/src/ncdu.h
@@ -41,11 +41,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#if defined(HAVE_SYS_TIME_H) && defined(HAVE_GETTIMEOFDAY)
-# include <sys/time.h>
-#else
-# include <time.h>
-#endif
+#include <sys/time.h>
 #include <dirent.h>
 
 /* PATH_MAX 260 on Cygwin is too small for /proc/registry */
@@ -92,6 +88,7 @@
 #define FF_SERR  32 /* error in subdirectory */
 #define FF_BSEL  64 /* selected */
 #define FF_EXL  128 /* excluded using exlude patterns */
+#define FF_PAR  256 /* reference to parent directory (hack) */
 
 /* Settings Flags (int sflags) */
 #define SF_SMFS   1 /* same filesystem */
@@ -107,7 +104,7 @@
 #define BF_FILES  4
 #define BF_NDIRF 32 /* Normally, dirs before files, setting this disables it */
 #define BF_DESC  64
-#define BF_HIDE 128 /* don't show hidden files... doesn't have anything to do with sorting though */
+#define BF_HIDE 128 /* don't show hidden files... */
 
 
 /*
@@ -118,7 +115,7 @@ struct dir {
   char *name;
   off_t size;
   unsigned int files, dirs;
-  unsigned char flags;
+  unsigned short flags;
 };
 
 
@@ -151,7 +148,12 @@ extern int settingsWin(void);
 /* calc.c */
 extern int calcUsage();
 /* browser.c */
+extern void drawBrowser(int);
 extern void showBrowser(void);
+/* help.c */
+extern void showHelp(void);
+/* delete.c */
+extern struct dir *showDelete(struct dir *);
 /* exclude.c */
 extern void addExclude(char *);
 extern int addExcludeFile(char *);