diff --git a/ChangeLog b/ChangeLog
index 8c71264bdcb47342e64ac55c11e8295037f1e921..85d628b464d917d24baab8bf1c50715fe7e6c072 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,7 @@ git - ?
 	- Properly display MiB units instead of MB (IEEE 1541 - bug #2831412)
 	- Link to ncursesw when available
 	- Improved support for non-ASCII characters
+	- VIM keybindings for browsing through the tree (#2788249, #1880622)
 
 1.5 - 2009-05-02
 	- Fixed incorrect apparent size on directory refresh
diff --git a/doc/ncdu.1 b/doc/ncdu.1
index 03bf3dc4f1ae533338f8100dfddb197a4f1008d5..8a3d91c79b4a600964758c2d5c7f1285ae897ffe 100644
--- a/doc/ncdu.1
+++ b/doc/ncdu.1
@@ -43,13 +43,13 @@ should be seperated by a newline.
 \fB?\fP
 Show help + keys + about screen
 .TP
-\fBup/down\fP
+\fBup, down j, k\fP
 Cycle through the items
 .TP
-\fBright/enter\fP
+\fBright, enter, l\fP
 Open selected directory
 .TP
-\fBleft\fP
+\fBleft, <, h\fP
 Go to parent directory
 .TP
 \fBn\fP
@@ -74,7 +74,7 @@ Toggle between showing percentage, graph, both, or none. Percentage
 is relative to the size of the current directory, graph is relative
 to the largest item in the current directory.
 .TP
-\fBh\fP
+\fBe\fP
 Show/hide 'hidden' or 'excluded' files and directories. Please note that
 even though you can't see the hidden files and directories, they are still
 there and they are still included in the directory sizes. If you suspect
diff --git a/src/browser.c b/src/browser.c
index e30e19b12985cdeffcaac842bb1d9bf9325e4e58..1cf6423560d22cfceb64bfb65db9f7416c954343 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -347,9 +347,11 @@ int browse_key(int ch) {
   switch(ch) {
     /* selecting items */
     case KEY_UP:
+    case 'k':
       browse_key_sel(-1);
       break;
     case KEY_DOWN:
+    case 'j':
       browse_key_sel(1);
       break;
     case KEY_HOME:
@@ -383,7 +385,7 @@ int browse_key(int ch) {
       sort++;
       nonfo++;
       break;
-    case 'h':
+    case 'e':
       toggle(flags, BF_HIDE);
       browse_key_sel(0);
       nonfo++;
@@ -401,6 +403,7 @@ int browse_key(int ch) {
     /* browsing */
     case 10:
     case KEY_RIGHT:
+    case 'l':
       for(n=browse_dir; n!=NULL; n=n->next)
         if(n->flags & FF_BSEL)
           break;
@@ -416,6 +419,8 @@ int browse_key(int ch) {
       nonfo++;
       break;
     case KEY_LEFT:
+    case 'h':
+    case '<':
       if(browse_dir != NULL && browse_dir->parent->parent != NULL) {
         browse_dir = browse_dir->parent->parent->sub;
         sort++;
diff --git a/src/delete.c b/src/delete.c
index 3cd2de369e0e307ac7dd254d8c9fd50de29c7772..3da1795bec7d9645a7d1287f4a0db1bfb07f5071 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -112,10 +112,12 @@ int delete_key(int ch) {
   if(state == DS_CONFIRM)
     switch(ch) {
       case KEY_LEFT:
+      case 'h':
         if(--seloption < 0)
           seloption = 0;
         break;
       case KEY_RIGHT:
+      case 'l':
         if(++seloption > 2)
           seloption = 2;
         break;
@@ -139,10 +141,12 @@ int delete_key(int ch) {
   else if(state == DS_FAILED)
     switch(ch) {
       case KEY_LEFT:
+      case 'h':
         if(--seloption < 0)
           seloption = 0;
         break;
       case KEY_RIGHT:
+      case 'l':
         if(++seloption > 2)
           seloption = 2;
         break;
diff --git a/src/help.c b/src/help.c
index fdfa6d7595a6c147a1c42b234b6c9af317d497c7..b4495da3f23d41bdbe85e42eebfc8efdc1373bda 100644
--- a/src/help.c
+++ b/src/help.c
@@ -32,19 +32,20 @@
 int page, start;
 
 
-#define KEYS 13
+#define KEYS 14
 char *keys[KEYS*2] = {
 /*|----key----|  |----------------description----------------|*/
-      "up/down", "Cycle through the items",
-  "right/enter", "Open directory",
-         "left", "Previous directory",
+        "up, k", "Move cursor up",
+      "down, j", "Move cursor down",
+  "right/enter", "Open selected directory",
+   "left, <, h", "Open parent directory",
             "n", "Sort by name (ascending/descending)",
             "s", "Sort by size (ascending/descending)",
             "d", "Delete selected file or directory",
             "t", "Toggle dirs before files when sorting",
             "g", "Show percentage and/or graph",
             "a", "Toggle between apparent size and disk usage",
-            "h", "Show/hide hidden or excluded files",
+            "e", "Show/hide hidden or excluded files",
             "i", "Show information about selected item",
             "r", "Recalculate the current directory",
             "q", "Quit ncdu"
@@ -166,22 +167,26 @@ int help_key(int ch) {
       break;
     case KEY_RIGHT:
     case KEY_NPAGE:
+    case 'l':
       if(++page > 3)
         page = 3;
       start = 0;
       break;
     case KEY_LEFT:
     case KEY_PPAGE:
+    case 'h':
       if(--page < 1)
         page = 1;
       start = 0;
       break;
     case KEY_DOWN:
     case ' ':
+    case 'j':
       if(start < KEYS-10)
         start++;
       break;
     case KEY_UP:
+    case 'k':
       if(start > 0)
         start--;
       break;