Fix gometalinter complaints
diff --git a/benchmark_test.go b/benchmark_test.go
index b2019e1..62c7cc5 100644
--- a/benchmark_test.go
+++ b/benchmark_test.go
@@ -17,6 +17,8 @@
 	}
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
-		Load([]byte(input), ISO_8859_1)
+		if _, err := Load([]byte(input), ISO_8859_1); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
diff --git a/decode.go b/decode.go
index 1461c0a..0a961bb 100644
--- a/decode.go
+++ b/decode.go
@@ -158,16 +158,16 @@
 	// keydef returns the property key and the default value based on the
 	// name of the struct field and the options in the tag.
 	keydef := func(f reflect.StructField) (string, *string, map[string]string) {
-		key, opts := parseTag(f.Tag.Get("properties"))
+		_key, _opts := parseTag(f.Tag.Get("properties"))
 
-		var def *string
-		if d, ok := opts["default"]; ok {
-			def = &d
+		var _def *string
+		if d, ok := _opts["default"]; ok {
+			_def = &d
 		}
-		if key != "" {
-			return key, def, opts
+		if _key != "" {
+			return _key, _def, _opts
 		}
-		return f.Name, def, opts
+		return f.Name, _def, _opts
 	}
 
 	switch {
@@ -223,7 +223,7 @@
 	case isMap(t):
 		valT := t.Elem()
 		m := reflect.MakeMap(t)
-		for postfix, _ := range p.FilterStripPrefix(key + ".").m {
+		for postfix := range p.FilterStripPrefix(key + ".").m {
 			pp := strings.SplitN(postfix, ".", 2)
 			mk, mv := pp[0], reflect.New(valT)
 			if err := dec(p, key+"."+mk, nil, nil, mv); err != nil {
@@ -274,7 +274,6 @@
 func isBool(t reflect.Type) bool     { return t.Kind() == reflect.Bool }
 func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) }
 func isMap(t reflect.Type) bool      { return t.Kind() == reflect.Map }
-func isNumeric(t reflect.Type) bool  { return isInt(t) || isUint(t) || isFloat(t) }
 func isPtr(t reflect.Type) bool      { return t.Kind() == reflect.Ptr }
 func isString(t reflect.Type) bool   { return t.Kind() == reflect.String }
 func isStruct(t reflect.Type) bool   { return t.Kind() == reflect.Struct }
diff --git a/integrate_test.go b/integrate_test.go
index b8fcf0e..cbee181 100644
--- a/integrate_test.go
+++ b/integrate_test.go
@@ -17,8 +17,8 @@
 	gotI := f.Int("i", -1, "int flag")
 
 	p := NewProperties()
-	p.Set("s", "t")
-	p.Set("i", "9")
+	p.MustSet("s", "t")
+	p.MustSet("i", "9")
 	p.MustFlag(f)
 
 	if want := "t"; *gotS != want {
@@ -36,11 +36,13 @@
 	gotB := f.Int("b", 2, "customized")
 	gotC := f.Int("c", 3, "overridden")
 
-	f.Parse([]string{"-c", "4"})
+	if err := f.Parse([]string{"-c", "4"}); err != nil {
+		t.Fatal(err)
+	}
 
 	p := NewProperties()
-	p.Set("b", "5")
-	p.Set("c", "6")
+	p.MustSet("b", "5")
+	p.MustSet("c", "6")
 	p.MustFlag(f)
 
 	if want := 1; *gotA != want {
@@ -63,8 +65,8 @@
 	fmt.Printf("flagged as x=%d, y=%d\n", *x, *y)
 
 	p := NewProperties()
-	p.Set("x", "7")
-	p.Set("y", "42") // note discard
+	p.MustSet("x", "7")
+	p.MustSet("y", "42") // note discard
 	p.MustFlag(flag.CommandLine)
 	fmt.Printf("configured to x=%d, y=%d\n", *x, *y)
 
diff --git a/lex.go b/lex.go
index 6ad94f3..a3cba03 100644
--- a/lex.go
+++ b/lex.go
@@ -72,7 +72,7 @@
 
 // next returns the next rune in the input.
 func (l *lexer) next() rune {
-	if int(l.pos) >= len(l.input) {
+	if l.pos >= len(l.input) {
 		l.width = 0
 		return eof
 	}
@@ -96,8 +96,8 @@
 
 // emit passes an item back to the client.
 func (l *lexer) emit(t itemType) {
-	item := item{t, l.start, string(l.runes)}
-	l.items <- item
+	i := item{t, l.start, string(l.runes)}
+	l.items <- i
 	l.start = l.pos
 	l.runes = l.runes[:0]
 }
@@ -114,7 +114,7 @@
 
 // accept consumes the next rune if it's from the valid set.
 func (l *lexer) accept(valid string) bool {
-	if strings.IndexRune(valid, l.next()) >= 0 {
+	if strings.ContainsRune(valid, l.next()) {
 		return true
 	}
 	l.backup()
@@ -123,7 +123,7 @@
 
 // acceptRun consumes a run of runes from the valid set.
 func (l *lexer) acceptRun(valid string) {
-	for strings.IndexRune(valid, l.next()) >= 0 {
+	for strings.ContainsRune(valid, l.next()) {
 	}
 	l.backup()
 }
@@ -156,9 +156,9 @@
 
 // nextItem returns the next item from the input.
 func (l *lexer) nextItem() item {
-	item := <-l.items
-	l.lastPos = item.pos
-	return item
+	i := <-l.items
+	l.lastPos = i.pos
+	return i
 }
 
 // lex creates a new scanner for the input string.
@@ -279,8 +279,7 @@
 	for {
 		switch r := l.next(); {
 		case isEscape(r):
-			r := l.peek()
-			if isEOL(r) {
+			if isEOL(l.peek()) {
 				l.next()
 				l.acceptRun(whitespace)
 			} else {
diff --git a/load.go b/load.go
index 41f353d..701a86d 100644
--- a/load.go
+++ b/load.go
@@ -98,7 +98,7 @@
 	return must(LoadURL(url))
 }
 
-// MustLoadFiles reads the content of multiple URLs in the given order into a
+// MustLoadURLs reads the content of multiple URLs in the given order into a
 // Properties struct and panics on error. If 'ignoreMissing' is true then a 404
 // status code will not be reported as error.
 func MustLoadURLs(urls []string, ignoreMissing bool) *Properties {
@@ -172,10 +172,12 @@
 		return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode)
 	}
 	body, err := ioutil.ReadAll(resp.Body)
-	resp.Body.Close()
 	if err != nil {
 		return nil, fmt.Errorf("properties: %s error reading response. %s", url, err)
 	}
+	if err = resp.Body.Close(); err != nil {
+		return nil, fmt.Errorf("properties: %s error reading response. %s", url, err)
+	}
 
 	ct := resp.Header.Get("Content-Type")
 	var enc Encoding
diff --git a/load_test.go b/load_test.go
index 8b3137e..c46339d 100644
--- a/load_test.go
+++ b/load_test.go
@@ -66,7 +66,9 @@
 	tf := make(tempFiles, 0)
 	defer tf.removeAll()
 
-	os.Setenv("_VARX", "some-value")
+	if err := os.Setenv("_VARX", "some-value"); err != nil {
+		t.Fatal(err)
+	}
 	filename := tf.makeFilePrefix(os.Getenv("_VARX"), "key=value")
 	filename = strings.Replace(filename, os.Getenv("_VARX"), "${_VARX}", -1)
 	p := MustLoadFile(filename, ISO_8859_1)
@@ -189,7 +191,9 @@
 	return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		send := func(data []byte, contentType string) {
 			w.Header().Set("Content-Type", contentType)
-			w.Write(data)
+			if _, err := w.Write(data); err != nil {
+				panic(err)
+			}
 		}
 
 		utf8 := []byte("key=äöü")
diff --git a/properties.go b/properties.go
index d41343d..80360c9 100644
--- a/properties.go
+++ b/properties.go
@@ -28,8 +28,10 @@
 // functions. The default is LogFatalHandler.
 var ErrorHandler ErrorHandlerFunc = LogFatalHandler
 
+// LogHandlerFunc defines the function prototype for logging errors.
 type LogHandlerFunc func(fmt string, args ...interface{})
 
+// LogPrintf defines a log handler which uses log.Printf.
 var LogPrintf LogHandlerFunc = log.Printf
 
 // LogFatalHandler handles the error by logging a fatal error and exiting.
@@ -444,6 +446,8 @@
 	pp := NewProperties()
 	for _, k := range p.k {
 		if re.MatchString(k) {
+			// TODO(fs): we are ignoring the error which flags a circular reference.
+			// TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed)
 			pp.Set(k, p.m[k])
 		}
 	}
@@ -456,6 +460,8 @@
 	pp := NewProperties()
 	for _, k := range p.k {
 		if strings.HasPrefix(k, prefix) {
+			// TODO(fs): we are ignoring the error which flags a circular reference.
+			// TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed)
 			pp.Set(k, p.m[k])
 		}
 	}
@@ -469,6 +475,9 @@
 	n := len(prefix)
 	for _, k := range p.k {
 		if len(k) > len(prefix) && strings.HasPrefix(k, prefix) {
+			// TODO(fs): we are ignoring the error which flags a circular reference.
+			// TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference
+			// TODO(fs): this function should probably return an error but the signature is fixed
 			pp.Set(k[n:], p.m[k])
 		}
 	}
@@ -483,9 +492,7 @@
 // Keys returns all keys in the same order as in the input.
 func (p *Properties) Keys() []string {
 	keys := make([]string, len(p.k))
-	for i, k := range p.k {
-		keys[i] = k
-	}
+	copy(keys, p.k)
 	return keys
 }
 
diff --git a/properties_test.go b/properties_test.go
index bf5aa0d..a63a560 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -452,8 +452,8 @@
 	assert.Equal(t, p.MustGet("key2"), "${key}")
 
 	// with expansion disabled we can introduce circular references
-	p.Set("keyA", "${keyB}")
-	p.Set("keyB", "${keyA}")
+	p.MustSet("keyA", "${keyB}")
+	p.MustSet("keyB", "${keyA}")
 	assert.Equal(t, p.MustGet("keyA"), "${keyB}")
 	assert.Equal(t, p.MustGet("keyB"), "${keyA}")
 }
@@ -676,6 +676,22 @@
 	}
 }
 
+func TestFilterStripPrefix(t *testing.T) {
+	for _, test := range filterStripPrefixTests {
+		p := mustParse(t, test.input)
+		pp := p.FilterPrefix(test.prefix)
+		assert.Equal(t, pp != nil, true, "want properties")
+		assert.Equal(t, pp.Len(), len(test.keys))
+		for _, key := range test.keys {
+			v1, ok1 := p.Get(key)
+			v2, ok2 := pp.Get(key)
+			assert.Equal(t, ok1, true)
+			assert.Equal(t, ok2, true)
+			assert.Equal(t, v1, v2)
+		}
+	}
+}
+
 func TestKeys(t *testing.T) {
 	for _, test := range keysTests {
 		p := mustParse(t, test.input)