diff --git a/README.md b/README.md
index 09be352..7e4c973 100644
--- a/README.md
+++ b/README.md
@@ -122,19 +122,19 @@ log:
   path: ./dive.log
   level: info
 
-# note: you can specify multiple bindings by separating values with a comma.
-# note: UI hinting is derived from the first binding
+# Note: you can specify multiple bindings by separating values with a comma.
+# Note: UI hinting is derived from the first binding
 keybinding:
-  # global bindings
+  # Global bindings
   quit: ctrl+c
   toggle-view: tab, ctrl+space
   filter-files: ctrl+f, ctrl+slash
 
-  # layer view specific bindings  
+  # Layer view specific bindings  
   compare-all: ctrl+a
   compare-layer: ctrl+l
 
-  # file view specific bindings
+  # File view specific bindings
   toggle-collapse-dir: space
   toggle-added-files: ctrl+a
   toggle-removed-files: ctrl+r
@@ -142,6 +142,19 @@ keybinding:
   toggle-unmodified-files: ctrl+u
   page-up: pgup
   page-down: pgdn
+  
+diff:
+  # You can change the default files show in the filetree (right pane). All diff types are shown by default. 
+  hide:
+    - added
+    - removed
+    - changed
+    - unchanged
+
+layer:
+  # Enable showing all changes from this layer and ever previous layer
+  show-aggregated-changes: false
+
 ```
 
 dive will search for configs in the following locations:
diff --git a/cmd/root.go b/cmd/root.go
index a53eebf..1447951 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -80,14 +80,14 @@ func initConfig() {
 	viper.SetDefault("log.level", log.InfoLevel.String())
 	viper.SetDefault("log.path", "./dive.log")
 	viper.SetDefault("log.enabled", true)
-	// status view / global
+	// keybindings: status view / global
 	viper.SetDefault("keybinding.quit", "ctrl+c")
 	viper.SetDefault("keybinding.toggle-view", "tab, ctrl+space")
 	viper.SetDefault("keybinding.filter-files", "ctrl+f, ctrl+slash")
-	// layer view
+	// keybindings: layer view
 	viper.SetDefault("keybinding.compare-all", "ctrl+a")
 	viper.SetDefault("keybinding.compare-layer", "ctrl+l")
-	// filetree view
+	// keybindings: filetree view
 	viper.SetDefault("keybinding.toggle-collapse-dir", "space")
 	viper.SetDefault("keybinding.toggle-added-files", "ctrl+a")
 	viper.SetDefault("keybinding.toggle-removed-files", "ctrl+r")
@@ -96,6 +96,9 @@ func initConfig() {
 	viper.SetDefault("keybinding.page-up", "pgup")
 	viper.SetDefault("keybinding.page-down", "pgdn")
 
+	viper.SetDefault("diff.hide", "")
+	viper.SetDefault("layer.show-aggregated-changes", false)
+
 	viper.AutomaticEnv() // read in environment variables that match
 
 	// If a config file is found, read it in.
diff --git a/ui/filetreeview.go b/ui/filetreeview.go
index c304555..6312ef7 100644
--- a/ui/filetreeview.go
+++ b/ui/filetreeview.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
+	"github.com/wagoodman/dive/utils"
 	"regexp"
 	"strings"
 
@@ -55,6 +56,22 @@ func NewFileTreeView(name string, gui *gocui.Gui, tree *filetree.FileTree, refTr
 	treeView.RefTrees = refTrees
 	treeView.HiddenDiffTypes = make([]bool, 4)
 
+	hiddenTypes := viper.GetStringSlice("diff.hide")
+	for _, hType := range hiddenTypes {
+		switch t := strings.ToLower(hType); t {
+		case "added":
+			treeView.HiddenDiffTypes[filetree.Added] = true
+		case "removed":
+			treeView.HiddenDiffTypes[filetree.Removed] = true
+		case "changed":
+			treeView.HiddenDiffTypes[filetree.Changed] = true
+		case "unchanged":
+			treeView.HiddenDiffTypes[filetree.Unchanged] = true
+		default:
+			utils.PrintAndExit(fmt.Sprintf("unknown diff.hide value: %s", t))
+		}
+	}
+
 	treeView.keybindingToggleCollapse = getKeybindings(viper.GetString("keybinding.toggle-collapse-dir"))
 	treeView.keybindingToggleAdded = getKeybindings(viper.GetString("keybinding.toggle-added-files"))
 	treeView.keybindingToggleRemoved = getKeybindings(viper.GetString("keybinding.toggle-removed-files"))
diff --git a/ui/layerview.go b/ui/layerview.go
index cf8a8a6..d856f01 100644
--- a/ui/layerview.go
+++ b/ui/layerview.go
@@ -3,6 +3,7 @@ package ui
 import (
 	"fmt"
 	"github.com/spf13/viper"
+	"github.com/wagoodman/dive/utils"
 
 	"github.com/dustin/go-humanize"
 	"github.com/jroimartin/gocui"
@@ -35,7 +36,15 @@ func NewLayerView(name string, gui *gocui.Gui, layers []*image.Layer) (layerView
 	layerView.Name = name
 	layerView.gui = gui
 	layerView.Layers = layers
-	layerView.CompareMode = CompareLayer
+
+	switch mode := viper.GetBool("layer.show-aggregated-changes"); mode {
+	case true:
+		layerView.CompareMode = CompareAll
+	case false:
+		layerView.CompareMode = CompareLayer
+	default:
+		utils.PrintAndExit(fmt.Sprintf("unknown layer.show-aggregated-changes value: %s", mode))
+	}
 
 	layerView.keybindingCompareAll = getKeybindings(viper.GetString("keybinding.compare-all"))
 	layerView.keybindingCompareLayer = getKeybindings(viper.GetString("keybinding.compare-layer"))
diff --git a/ui/ui.go b/ui/ui.go
index a55c197..13fb299 100644
--- a/ui/ui.go
+++ b/ui/ui.go
@@ -8,6 +8,7 @@ import (
 	"github.com/spf13/viper"
 	"github.com/wagoodman/dive/filetree"
 	"github.com/wagoodman/dive/image"
+	"github.com/wagoodman/dive/utils"
 	"log"
 )
 
@@ -313,6 +314,7 @@ func Run(layers []*image.Layer, refTrees []*filetree.FileTree, efficiency float6
 	if err != nil {
 		log.Panicln(err)
 	}
+	utils.SetUi(g)
 	defer g.Close()
 
 	Views.lookup = make(map[string]View)
@@ -347,4 +349,5 @@ func Run(layers []*image.Layer, refTrees []*filetree.FileTree, efficiency float6
 	if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
 		log.Panicln(err)
 	}
+	utils.Exit(0)
 }
diff --git a/utils/exit.go b/utils/exit.go
index 2f71a7e..df2abe3 100644
--- a/utils/exit.go
+++ b/utils/exit.go
@@ -1,10 +1,26 @@
 package utils
 
 import (
+	"fmt"
+	"github.com/jroimartin/gocui"
 	"github.com/k0kubun/go-ansi"
+	"github.com/sirupsen/logrus"
 	"os"
 )
 
+var ui *gocui.Gui
+
+func SetUi(g *gocui.Gui) {
+	ui = g
+}
+
+func PrintAndExit(args ...interface{}) {
+	logrus.Println(args...)
+	Cleanup()
+	fmt.Println(args...)
+	os.Exit(1)
+}
+
 // Note: this should only be used when exiting from non-gocui code
 func Exit(rc int) {
 	Cleanup()
@@ -12,5 +28,8 @@ func Exit(rc int) {
 }
 
 func Cleanup() {
+	if ui != nil {
+		ui.Close()
+	}
 	ansi.CursorShow()
 }