59 - add properties file support to viper
diff --git a/util.go b/util.go
index 2f974d8..7c5d21a 100644
--- a/util.go
+++ b/util.go
@@ -22,6 +22,7 @@
 	"unicode"
 
 	"github.com/BurntSushi/toml"
+	"github.com/magiconair/properties"
 	"github.com/spf13/cast"
 	jww "github.com/spf13/jwalterweatherman"
 	"gopkg.in/yaml.v2"
@@ -137,6 +138,17 @@
 		if _, err := toml.Decode(buf.String(), &c); err != nil {
 			jww.ERROR.Fatalf("Error parsing config: %s", err)
 		}
+
+	case "properties", "props", "prop":
+		var p *properties.Properties
+		var err error
+		if p, err = properties.Load(buf.Bytes(), properties.UTF8); err != nil {
+			jww.ERROR.Fatalf("Error parsing config: %s", err)
+		}
+		for _, key := range p.Keys() {
+			value, _ := p.Get(key)
+			c[key] = value
+		}
 	}
 
 	insensitiviseMap(c)
diff --git a/viper.go b/viper.go
index 6c249fe..b23d837 100644
--- a/viper.go
+++ b/viper.go
@@ -174,7 +174,7 @@
 }
 
 // Universally supported extensions.
-var SupportedExts []string = []string{"json", "toml", "yaml", "yml"}
+var SupportedExts []string = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop"}
 
 // Universally supported remote providers.
 var SupportedRemoteProviders []string = []string{"etcd", "consul"}
diff --git a/viper_test.go b/viper_test.go
index 4d049b6..334773d 100644
--- a/viper_test.go
+++ b/viper_test.go
@@ -55,6 +55,14 @@
     }
 }`)
 
+var propertiesExample = []byte(`
+p_id: 0001
+p_type: donut
+p_name: Cake
+p_ppu: 0.55
+p_batters.batter.type: Regular
+`)
+
 var remoteExample = []byte(`{
 "id":"0002",
 "type":"cronut",
@@ -71,6 +79,10 @@
 	r = bytes.NewReader(jsonExample)
 	marshalReader(r, v.config)
 
+	SetConfigType("properties")
+	r = bytes.NewReader(propertiesExample)
+	marshalReader(r, v.config)
+
 	SetConfigType("toml")
 	r = bytes.NewReader(tomlExample)
 	marshalReader(r, v.config)
@@ -96,6 +108,14 @@
 	marshalReader(r, v.config)
 }
 
+func initProperties() {
+	Reset()
+	SetConfigType("properties")
+	r := bytes.NewReader(propertiesExample)
+
+	marshalReader(r, v.config)
+}
+
 func initTOML() {
 	Reset()
 	SetConfigType("toml")
@@ -185,6 +205,11 @@
 	assert.Equal(t, "0001", Get("id"))
 }
 
+func TestProperties(t *testing.T) {
+	initProperties()
+	assert.Equal(t, "0001", Get("p_id"))
+}
+
 func TestTOML(t *testing.T) {
 	initTOML()
 	assert.Equal(t, "TOML Example", Get("title"))
@@ -277,9 +302,9 @@
 func TestAllKeys(t *testing.T) {
 	initConfigs()
 
-	ks := sort.StringSlice{"title", "newkey", "owner", "name", "beard", "ppu", "batters", "hobbies", "clothing", "age", "hacker", "id", "type", "eyes"}
+	ks := sort.StringSlice{"title", "newkey", "owner", "name", "beard", "ppu", "batters", "hobbies", "clothing", "age", "hacker", "id", "type", "eyes", "p_id", "p_ppu", "p_batters.batter.type", "p_type", "p_name"}
 	dob, _ := time.Parse(time.RFC3339, "1979-05-27T07:32:00Z")
-	all := map[string]interface{}{"owner": map[string]interface{}{"organization": "MongoDB", "Bio": "MongoDB Chief Developer Advocate & Hacker at Large", "dob": dob}, "title": "TOML Example", "ppu": 0.55, "eyes": "brown", "clothing": map[interface{}]interface{}{"trousers": "denim", "jacket": "leather"}, "id": "0001", "batters": map[string]interface{}{"batter": []interface{}{map[string]interface{}{"type": "Regular"}, map[string]interface{}{"type": "Chocolate"}, map[string]interface{}{"type": "Blueberry"}, map[string]interface{}{"type": "Devil's Food"}}}, "hacker": true, "beard": true, "hobbies": []interface{}{"skateboarding", "snowboarding", "go"}, "age": 35, "type": "donut", "newkey": "remote", "name": "Cake"}
+	all := map[string]interface{}{"owner": map[string]interface{}{"organization": "MongoDB", "Bio": "MongoDB Chief Developer Advocate & Hacker at Large", "dob": dob}, "title": "TOML Example", "ppu": 0.55, "eyes": "brown", "clothing": map[interface{}]interface{}{"trousers": "denim", "jacket": "leather"}, "id": "0001", "batters": map[string]interface{}{"batter": []interface{}{map[string]interface{}{"type": "Regular"}, map[string]interface{}{"type": "Chocolate"}, map[string]interface{}{"type": "Blueberry"}, map[string]interface{}{"type": "Devil's Food"}}}, "hacker": true, "beard": true, "hobbies": []interface{}{"skateboarding", "snowboarding", "go"}, "age": 35, "type": "donut", "newkey": "remote", "name": "Cake", "p_id": "0001", "p_ppu": "0.55", "p_name": "Cake", "p_batters.batter.type": "Regular", "p_type": "donut"}
 
 	var allkeys sort.StringSlice
 	allkeys = AllKeys()