diff --git a/doc/ncdu.pod b/doc/ncdu.pod
index c499a40eb6b2a14d42b487c84f841ebd5ea0dd2c..eaa0ddc83643834a2c2258e5c71c45c24278c1c6 100644
--- a/doc/ncdu.pod
+++ b/doc/ncdu.pod
@@ -172,6 +172,11 @@ displayed, but not their content, and they are not counted towards the disk
 usage statistics.
 See http://www.brynosaurus.com/cachedir/
 
+=item -L,--follow-symlinks
+
+Follow symlinks (except to directories) 00and count the size of the file
+they point to. Symlink loops and directories will be ignored.
+
 =back
 
 
diff --git a/src/dir_scan.c b/src/dir_scan.c
index f226114365f1b0514901dda0222651566ccce401..3ec508c68d0c143b33a56ead21de1e9c1950c2aa 100644
--- a/src/dir_scan.c
+++ b/src/dir_scan.c
@@ -207,6 +207,12 @@ static int dir_scan_item(const char *name) {
   if(!(buf_dir->flags & (FF_ERR|FF_EXL)))
     stat_to_dir(&st);
 
+  if (!(buf_dir->flags & (FF_ERR|FF_EXL)) && follow_symlinks && S_ISLNK(st.st_mode))
+    if (!stat(name, &st)) {
+      if (!S_ISDIR(st.st_mode))
+        stat_to_dir(&st);
+    }
+
   if(cachedir_tags && (buf_dir->flags & FF_DIR) && !(buf_dir->flags & (FF_ERR|FF_EXL|FF_OTHFS)))
     if(has_cachedir_tag(buf_dir->name)) {
       buf_dir->flags |= FF_EXL;
diff --git a/src/global.h b/src/global.h
index effd86f0538356588c112b1e3e02546384efef9e..4404bf48800e9439335a1875c8b20750f9e11743 100644
--- a/src/global.h
+++ b/src/global.h
@@ -103,6 +103,8 @@ extern int cachedir_tags;
 extern int confirm_quit;
 /* flag whether we want to enable use of struct dir_ext */
 extern int extended_info;
+/* flag whether we want to follow symlinks */
+extern int follow_symlinks;
 
 /* handle input from keyboard and update display */
 int input_handle(int);
diff --git a/src/main.c b/src/main.c
index c71afc24f4fc27ee2a229c72bf89366612ab1286..6d8967b679f43befb60cf36572d791a3c5cda6e7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -41,6 +41,7 @@ int read_only = 0;
 long update_delay = 100;
 int cachedir_tags = 0;
 int extended_info = 0;
+int follow_symlinks = 0;
 
 static int min_rows = 17, min_cols = 60;
 static int ncurses_init = 0;
@@ -132,6 +133,7 @@ static void argv_parse(int argc, char **argv) {
     { '2', 0, "-2" },
     {  1,  1, "--exclude" },
     { 'X', 1, "-X,--exclude-from" },
+    { 'L', 0, "-L,--follow-symlinks" },
     { 'C', 0, "--exclude-caches" },
     { 's', 0, "--si" },
     { 'Q', 0, "--confirm-quit" },
@@ -160,6 +162,7 @@ static void argv_parse(int argc, char **argv) {
       printf("  --si                       Use base 10 (SI) prefixes instead of base 2\n");
       printf("  --exclude PATTERN          Exclude files that match PATTERN\n");
       printf("  -X, --exclude-from FILE    Exclude files that match any pattern in FILE\n");
+      printf("  -L, --follow-symlinks      Follow symbolic links (excluding directories)\n");
       printf("  --exclude-caches           Exclude directories containing CACHEDIR.TAG\n");
       printf("  --confirm-quit             Confirm quitting ncdu\n");
       printf("  --color SCHEME             Set color scheme\n");
@@ -185,6 +188,7 @@ static void argv_parse(int argc, char **argv) {
         exit(1);
       }
       break;
+    case 'L': follow_symlinks = 1; break;
     case 'C':
       cachedir_tags = 1;
       break;