Handle the case Get() returns either map[interface{}]interface{} or map[string]interface{}
diff --git a/viper.go b/viper.go
index 4a5b1eb..389a58e 100644
--- a/viper.go
+++ b/viper.go
@@ -526,13 +526,14 @@
 // Returns new Viper instance representing a sub tree of this instance
 func Sub(key string) *Viper { return v.Sub(key) }
 func (v *Viper) Sub(key string) *Viper {
-	data, ok := v.Get(key).(map[string]interface{})
-	if !ok {
+	subv := New()
+	data := v.Get(key)
+	if reflect.TypeOf(data).Kind() == reflect.Map {
+		subv.config = cast.ToStringMap(data)
+		return subv
+	} else {
 		return nil
 	}
-	subv := New()
-	subv.config = data
-	return subv
 }
 
 // Returns the value associated with the key as a string
diff --git a/viper_test.go b/viper_test.go
index e9bb3f4..fcb9c4e 100644
--- a/viper_test.go
+++ b/viper_test.go
@@ -730,7 +730,10 @@
 	v.SetConfigType("yaml")
 	v.ReadConfig(bytes.NewBuffer(yamlExample))
 
-	subv := v.Sub("clothing.pants")
+	subv := v.Sub("clothing")
+	assert.Equal(t, v.Get("clothing.pants.size"), subv.Get("pants.size"))
+
+	subv = v.Sub("clothing.pants")
 	assert.Equal(t, v.Get("clothing.pants.size"), subv.Get("size"))
 
 	subv = v.Sub("clothing.pants.size")