diff --git a/README.md b/README.md
index a09fb8c..b2acb08 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,18 @@
 
 **Litter is a pretty printer library for Go data structures to aid in debugging and testing.**
 
-It's named for the fact that it outputs *literals*, which you *litter* your output with. As a side benefit, all Litter output is compilable Go. You can use Litter to emit data during debug, and it's also really nice for "snapshot data" in unit tests, since it produces consistent, sorted output.
+---
 
-Litter was inspired by [Spew](https://github.com/davecgh/go-spew), but focuses on terseness and readability.
+Litter is provided by
+
+<a href="https://www.sanity.io/?utm_source=GitHub&utm_campaign=litter" rel="nofollow" target="_blank">
+	<img src="https://www.sanity.io/static/images/logo_red.svg?v=2" width="300"><br />
+	Sanity: The Headless CMS Construction Kit
+</a>
+
+---
+
+Litter named for the fact that it outputs *literals*, which you *litter* your output with. As a side benefit, all Litter output is syntactically correct Go. You can use Litter to emit data during debug, and it's also really nice for "snapshot data" in unit tests, since it produces consistent, sorted output. Litter was inspired by [Spew](https://github.com/davecgh/go-spew), but focuses on terseness and readability.
 
 ### Basic example
 
@@ -14,18 +23,18 @@ This:
 
 ```go
 type Person struct {
-  Name   string
-  Age    int
-  Parent *Person
+	Name   string
+	Age    int
+	Parent *Person
 }
 
 litter.Dump(Person{
-  Name:   "Bob",
-  Age:    20,
-  Parent: &Person{
-    Name: "Jane",
-    Age:  50,
-  },
+	Name:   "Bob",
+	Age:    20,
+	Parent: &Person{
+		Name: "Jane",
+		Age:  50,
+	},
 })
 ```
 
@@ -33,12 +42,12 @@ will output:
 
 ```
 Person{
-  Name: "Bob",
-  Age: 20,
-  Parent: &Person{
-    Name: "Jane",
-    Age: 50,
-  },
+	Name: "Bob",
+	Age: 20,
+	Parent: &Person{
+		Name: "Jane",
+		Age: 50,
+	},
 }
 ```
 
@@ -48,21 +57,21 @@ Litter is a great alternative to JSON or YAML for providing "snapshots" or examp
 
 ```go
 func TestSearch(t *testing.T) {
-  result := DoSearch()
+	result := DoSearch()
 
-  actual := litterOpts.Sdump(result)
-  expected, err := ioutil.ReadFile("testdata.txt")
-  if err != nil {
-    // First run, write test data since it doesn't exist
+	actual := litterOpts.Sdump(result)
+	expected, err := ioutil.ReadFile("testdata.txt")
+	if err != nil {
+		// First run, write test data since it doesn't exist
 		if !os.IsNotExist(err) {
-      t.Error(err)
-    }
-    ioutil.Write("testdata.txt", actual, 0644)
-    actual = expected
-  }
-  if expected != actual {
-    t.Errorf("Expected %s, got %s", expected, actual)
-  }
+			t.Error(err)
+		}
+		ioutil.Write("testdata.txt", actual, 0644)
+		actual = expected
+	}
+	if expected != actual {
+		t.Errorf("Expected %s, got %s", expected, actual)
+	}
 }
 ```
 
@@ -74,7 +83,7 @@ Litter detects circular references or aliasing, and will replace additional refe
 
 ```go
 type Circular struct {
-  Self: *Circular
+	Self *Circular
 }
 
 selfref := Circular{}
@@ -87,7 +96,7 @@ will output:
 
 ```
 Circular { // p0
-  Self: p0,
+	Self: p0,
 }
 ```
 
@@ -131,6 +140,9 @@ litter.Config.StripPackageNames = true
 // Hide private struct fields from dumped structs
 litter.Config.HidePrivateFields = true
 
+// Hide fields matched with given regexp if it is not nil. It is set up to hide fields generate with protoc-gen-go
+litter.Config.FieldExclusions = regexp.MustCompile(`^(XXX_.*)$`)
+
 // Sets a "home" package. The package name will be stripped from all its types
 litter.Config.HomePackage = "mypackage"
 
@@ -146,13 +158,13 @@ litter.Config.Compact = true
 Allows you to configure a local configuration of litter to allow for proper compartmentalization of state at the expense of some comfort:
 
 ``` go
-  sq := litter.Options {
-    HidePrivateFields: true,
-    HomePackage: "thispack",
-    Separator: " ",
-  }
+	sq := litter.Options {
+		HidePrivateFields: true,
+		HomePackage: "thispack",
+		Separator: " ",
+	}
 
-  sq.Dump("dumped", "with", "local", "settings")
+	sq.Dump("dumped", "with", "local", "settings")
 ```
 
 ## Custom dumpers
@@ -161,7 +173,7 @@ Implement the interface Dumper on your types to take control of how your type is
 
 ``` go
 type Dumper interface {
-  LitterDump(w io.Writer)
+	LitterDump(w io.Writer)
 }
 ```
 
@@ -175,12 +187,12 @@ A couple of examples from the test suite:
 type CustomMultiLineDumper struct {}
 
 func (cmld *CustomMultiLineDumper) LitterDump(w io.Writer) {
-  w.Write([]byte("{\n  multi\n  line\n}"))
+	w.Write([]byte("{\n  multi\n  line\n}"))
 }
 
 type CustomSingleLineDumper int
 
 func (csld CustomSingleLineDumper) LitterDump(w io.Writer) {
-  w.Write([]byte("<custom>"))
+	w.Write([]byte("<custom>"))
 }
 ````
diff --git a/debian/changelog b/debian/changelog
index 754f1f6..0f4cf75 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+golang-github-sanity-io-litter (1.1.0+git20190603.89eabd1-1) UNRELEASED; urgency=medium
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 23 Jun 2019 05:20:35 +0000
+
 golang-github-sanity-io-litter (1.1.0+git20171129.f8fd6a5-1) unstable; urgency=medium
 
   * Initial release (Closes: #894682)
diff --git a/dump.go b/dump.go
index 5fcc5b8..edd5f99 100644
--- a/dump.go
+++ b/dump.go
@@ -7,13 +7,14 @@ import (
 	"os"
 	"reflect"
 	"regexp"
+	"runtime"
 	"sort"
 	"strconv"
 	"strings"
 )
 
 var packageNameStripperRegexp = regexp.MustCompile("\\b[a-zA-Z_]+[a-zA-Z_0-9]+\\.")
-var compactTypeRegexp = regexp.MustCompile(`\s*([{};])\s*`)
+var compactTypeRegexp = regexp.MustCompile(`\s*([,;{}()])\s*`)
 
 // Dumper is the interface for implementing custom dumper for your types.
 type Dumper interface {
@@ -25,6 +26,8 @@ type Options struct {
 	Compact           bool
 	StripPackageNames bool
 	HidePrivateFields bool
+	FieldExclusions   *regexp.Regexp
+	FieldFilter       func(reflect.StructField, reflect.Value) bool
 	HomePackage       string
 	Separator         string
 }
@@ -33,6 +36,7 @@ type Options struct {
 var Config = Options{
 	StripPackageNames: false,
 	HidePrivateFields: true,
+	FieldExclusions:   regexp.MustCompile(`^(XXX_.*)$`), // XXX_ is a prefix of fields generated by protoc-gen-go
 	Separator:         " ",
 }
 
@@ -119,7 +123,10 @@ func (s *dumpState) dumpStruct(v reflect.Value) {
 	numFields := v.NumField()
 	for i := 0; i < numFields; i++ {
 		vtf := vt.Field(i)
-		if s.config.HidePrivateFields && vtf.PkgPath != "" {
+		if s.config.HidePrivateFields && vtf.PkgPath != "" || s.config.FieldExclusions != nil && s.config.FieldExclusions.MatchString(vtf.Name) {
+			continue
+		}
+		if s.config.FieldFilter != nil && !s.config.FieldFilter(vtf, v.Field(i)) {
 			continue
 		}
 		if !preambleDumped {
@@ -180,6 +187,26 @@ func (s *dumpState) dumpMap(v reflect.Value) {
 	s.w.Write([]byte("}"))
 }
 
+func (s *dumpState) dumpFunc(v reflect.Value) {
+	parts := strings.Split(runtime.FuncForPC(v.Pointer()).Name(), "/")
+	name := parts[len(parts)-1]
+
+	// Anonymous function
+	if strings.Count(name, ".") > 1 {
+		s.dumpType(v)
+	} else {
+		if s.config.StripPackageNames {
+			name = packageNameStripperRegexp.ReplaceAllLiteralString(name, "")
+		} else if s.homePackageRegexp != nil {
+			name = s.homePackageRegexp.ReplaceAllLiteralString(name, "")
+		}
+		if s.config.Compact {
+			name = compactTypeRegexp.ReplaceAllString(name, "$1")
+		}
+		s.w.Write([]byte(name))
+	}
+}
+
 func (s *dumpState) dumpCustom(v reflect.Value) {
 	// Run the custom dumper buffering the output
 	buf := new(bytes.Buffer)
@@ -326,6 +353,9 @@ func (s *dumpState) dumpVal(value reflect.Value) {
 	case reflect.Struct:
 		s.dumpStruct(v)
 
+	case reflect.Func:
+		s.dumpFunc(v)
+
 	default:
 		if v.CanInterface() {
 			fmt.Fprintf(s.w, "%v", v.Interface())
diff --git a/dump_test.go b/dump_test.go
index 73263e8..99eaedf 100644
--- a/dump_test.go
+++ b/dump_test.go
@@ -6,6 +6,7 @@ import (
 	"io/ioutil"
 	"os"
 	"os/exec"
+	"reflect"
 	"testing"
 
 	"github.com/sanity-io/litter"
@@ -13,6 +14,10 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+func Function(arg1 string, arg2 int) (string, error) {
+	return "", nil
+}
+
 type BlankStruct struct{}
 
 type BasicStruct struct {
@@ -66,6 +71,8 @@ func TestSdump_primitives(t *testing.T) {
 		BlankStruct{},
 		&BlankStruct{},
 		BasicStruct{1, 2},
+		Function,
+		func(arg string) (bool, error) { return false, nil },
 		nil,
 		interface{}(nil),
 	})
@@ -113,10 +120,35 @@ func TestSdump_nilIntefacesInStructs(t *testing.T) {
 	})
 }
 
+type testingOptions struct {
+	Compact           bool
+	StripPackageNames bool
+	HidePrivateFields bool
+	HomePackage       string
+	Separator         string
+}
+
 func TestSdump_config(t *testing.T) {
+	type options struct {
+		Compact           bool
+		StripPackageNames bool
+		HidePrivateFields bool
+		HomePackage       string
+		Separator         string
+	}
+
+	opts := options{
+		StripPackageNames: false,
+		HidePrivateFields: true,
+		Separator:         " ",
+	}
+
 	data := []interface{}{
-		litter.Config,
+		opts,
 		&BasicStruct{1, 2},
+		Function,
+		litter.Dump,
+		func(s string, i int) (bool, error) { return false, nil },
 	}
 	runTestWithCfg(t, "config_Compact", &litter.Options{
 		Compact: true,
@@ -130,6 +162,11 @@ func TestSdump_config(t *testing.T) {
 	runTestWithCfg(t, "config_HomePackage", &litter.Options{
 		HomePackage: "litter_test",
 	}, data)
+	runTestWithCfg(t, "config_FieldFilter", &litter.Options{
+		FieldFilter: func(f reflect.StructField, v reflect.Value) bool {
+			return f.Type.Kind() == reflect.String
+		},
+	}, data)
 }
 
 func TestSdump_multipleArgs(t *testing.T) {
diff --git a/testdata/config_Compact.dump b/testdata/config_Compact.dump
index cb82ffb..8d3e0b6 100644
--- a/testdata/config_Compact.dump
+++ b/testdata/config_Compact.dump
@@ -1 +1 @@
-[]interface{}{litter.Options{Compact:false,StripPackageNames:false,HidePrivateFields:true,HomePackage:"",Separator:" "},&litter_test.BasicStruct{Public:1,private:2}}
\ No newline at end of file
+[]interface{}{litter_test.options{Compact:false,StripPackageNames:false,HidePrivateFields:true,HomePackage:"",Separator:" "},&litter_test.BasicStruct{Public:1,private:2},litter_test.Function,litter.Dump,func(string,int)(bool,error)}
\ No newline at end of file
diff --git a/testdata/config_FieldFilter.dump b/testdata/config_FieldFilter.dump
new file mode 100644
index 0000000..0876af1
--- /dev/null
+++ b/testdata/config_FieldFilter.dump
@@ -0,0 +1,10 @@
+[]interface {}{
+  litter_test.options{
+    HomePackage: "",
+    Separator: " ",
+  },
+  &litter_test.BasicStruct{},
+  litter_test.Function,
+  litter.Dump,
+  func(string, int) (bool, error),
+}
\ No newline at end of file
diff --git a/testdata/config_HidePrivateFields.dump b/testdata/config_HidePrivateFields.dump
index f66c8a5..7d049e5 100644
--- a/testdata/config_HidePrivateFields.dump
+++ b/testdata/config_HidePrivateFields.dump
@@ -1,5 +1,5 @@
 []interface {}{
-  litter.Options{
+  litter_test.options{
     Compact: false,
     StripPackageNames: false,
     HidePrivateFields: true,
@@ -9,4 +9,7 @@
   &litter_test.BasicStruct{
     Public: 1,
   },
+  litter_test.Function,
+  litter.Dump,
+  func(string, int) (bool, error),
 }
\ No newline at end of file
diff --git a/testdata/config_HomePackage.dump b/testdata/config_HomePackage.dump
index af95a4f..0e6a246 100644
--- a/testdata/config_HomePackage.dump
+++ b/testdata/config_HomePackage.dump
@@ -1,5 +1,5 @@
 []interface {}{
-  litter.Options{
+  options{
     Compact: false,
     StripPackageNames: false,
     HidePrivateFields: true,
@@ -10,4 +10,7 @@
     Public: 1,
     private: 2,
   },
+  Function,
+  litter.Dump,
+  func(string, int) (bool, error),
 }
\ No newline at end of file
diff --git a/testdata/config_StripPackageNames.dump b/testdata/config_StripPackageNames.dump
index 0fb6fd3..7cea5b6 100644
--- a/testdata/config_StripPackageNames.dump
+++ b/testdata/config_StripPackageNames.dump
@@ -1,5 +1,5 @@
 []interface {}{
-  Options{
+  options{
     Compact: false,
     StripPackageNames: false,
     HidePrivateFields: true,
@@ -10,4 +10,7 @@
     Public: 1,
     private: 2,
   },
+  Function,
+  Dump,
+  func(string, int) (bool, error),
 }
\ No newline at end of file
diff --git a/testdata/primitives.dump b/testdata/primitives.dump
index 055b967..9a5fcdf 100644
--- a/testdata/primitives.dump
+++ b/testdata/primitives.dump
@@ -28,6 +28,8 @@
     Public: 1,
     private: 2,
   },
+  litter_test.Function,
+  func(string) (bool, error),
   nil,
   nil,
 }
\ No newline at end of file
diff --git a/util.go b/util.go
index e0db8c9..38c274b 100644
--- a/util.go
+++ b/util.go
@@ -1,6 +1,8 @@
 package litter
 
-import "reflect"
+import (
+	"reflect"
+)
 
 // deInterface returns values inside of non-nil interfaces when possible.
 // This is useful for data types like structs, arrays, slices, and maps which