Added Keys() function
diff --git a/properties.go b/properties.go
index 3741842..a5aaa21 100644
--- a/properties.go
+++ b/properties.go
@@ -324,6 +324,15 @@
 	return len(p.m)
 }
 
+// Keys returns all keys.
+func (p *Properties) Keys() []string {
+	keys := make([]string, len(p.m))
+	for k, _ := range p.m {
+		keys = append(keys, k)
+	}
+	return keys
+}
+
 // Set sets the property key to the corresponding value.
 // If a value for key existed before then ok is true and prev
 // contains the previous value. If the value contains a
diff --git a/properties_test.go b/properties_test.go
index e0e0f9b..ef5ce2c 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -285,6 +285,20 @@
 
 // ----------------------------------------------------------------------------
 
+type keysTest struct {
+	input string
+	keys  []string
+}
+
+var keysTests = []*keysTest{
+	&keysTest{"", []string{}},
+	&keysTest{"key = abc", []string{"key"}},
+	&keysTest{"key = abc\nkey2=def", []string{"key", "key2"}},
+	&keysTest{"key = abc\nkey=def", []string{"key"}},
+}
+
+// ----------------------------------------------------------------------------
+
 // TestBasic tests basic single key/value combinations with all possible
 // whitespace, delimiter and newline permutations.
 func (l *TestSuite) TestBasic(c *C) {
@@ -456,6 +470,17 @@
 	c.Assert(func() { p.MustGetString("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
+func (l *TestSuite) TestKeys(c *C) {
+	for _, test := range keysTests {
+		p, err := parse(test.input)
+		c.Assert(err, IsNil)
+		c.Assert(p.Len(), Equals, len(test.keys))
+		for _, key := range test.keys {
+			_, ok := p.Get(key)
+			c.Assert(ok, Equals, true)
+		}
+	}
+}
 func (l *TestSuite) TestWrite(c *C) {
 	for _, test := range writeTests {
 		input, output, enc := test[0], test[1], test[2]