diff --git a/README.md b/README.md
index 756ed51..d0b574d 100644
--- a/README.md
+++ b/README.md
@@ -67,7 +67,7 @@
 
 ## License
 
-Copyright (c) 2013 Thomas Pelletier
+Copyright (c) 2013, 2014 Thomas Pelletier, Eric Anderton
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in
diff --git a/lexer.go b/lexer.go
index 41f0d02..162885a 100644
--- a/lexer.go
+++ b/lexer.go
@@ -38,7 +38,7 @@
 	tokenDoubleRightBracket
 	tokenDate
 	tokenKeyGroup
-  tokenKeyGroupArray
+	tokenKeyGroupArray
 	tokenComma
 	tokenEOL
 )
@@ -389,19 +389,18 @@
 
 func lexKeyGroup(l *lexer) stateFn {
 	l.ignore()
-  l.pos += 1
+	l.pos += 1
 
-  if l.peek() == '[' {
-    // token '[[' signifies an array of anonymous key groups
-    l.ignore()
-    l.pos += 1
-	  l.emit(tokenDoubleLeftBracket)
-    return lexInsideKeyGroupArray
-  } else {
-    // vanilla key group
-	  l.emit(tokenLeftBracket)
-    return lexInsideKeyGroup
-  }
+	if l.peek() == '[' {
+		// token '[[' signifies an array of anonymous key groups
+		l.pos += 1
+		l.emit(tokenDoubleLeftBracket)
+		return lexInsideKeyGroupArray
+	} else {
+		// vanilla key group
+		l.emit(tokenLeftBracket)
+		return lexInsideKeyGroup
+	}
 }
 
 func lexInsideKeyGroupArray(l *lexer) stateFn {
@@ -410,13 +409,12 @@
 			if l.pos > l.start {
 				l.emit(tokenKeyGroupArray)
 			}
-      l.ignore()
-			l.pos += 1
-      if l.peek() != ']' {
-        break  // error
-      }
 			l.ignore()
 			l.pos += 1
+			if l.peek() != ']' {
+				break // error
+			}
+			l.pos += 1
 			l.emit(tokenDoubleRightBracket)
 			return lexVoid
 		}
diff --git a/lexer_test.go b/lexer_test.go
index 8582520..ebd03a9 100644
--- a/lexer_test.go
+++ b/lexer_test.go
@@ -404,3 +404,12 @@
 		token{tokenEOF, ""},
 	})
 }
+
+func TestKeyGroupArray(t *testing.T) {
+	testFlow(t, "[[foo]]", []token{
+		token{tokenDoubleLeftBracket, "[["},
+		token{tokenKeyGroupArray, "foo"},
+		token{tokenDoubleRightBracket, "]]"},
+		token{tokenEOF, ""},
+	})
+}
diff --git a/parser.go b/parser.go
index e12fb8e..b9a3f5f 100644
--- a/parser.go
+++ b/parser.go
@@ -71,8 +71,8 @@
 	}
 
 	switch tok.typ {
-  case tokenDoubleLeftBracket:
-    return parseGroupArray
+	case tokenDoubleLeftBracket:
+		return parseGroupArray
 	case tokenLeftBracket:
 		return parseGroup
 	case tokenKey:
@@ -86,33 +86,33 @@
 }
 
 func parseGroupArray(p *parser) parserStateFn {
-	p.getToken()  // discard the [[
+	p.getToken() // discard the [[
 	key := p.getToken()
 	if key.typ != tokenKeyGroupArray {
 		panic(fmt.Sprintf("unexpected token %s, was expecting a key group array", key))
 	}
 
-  // get or create group array element at the indicated part in the path
-  p.currentGroup = strings.Split(key.val, ".")
-  dest_tree := p.tree.GetPath(p.currentGroup)
-  var array []*TomlTree
-  if dest_tree == nil {
-    array = make([]*TomlTree, 0)
-  } else if dest_tree.([]*TomlTree) != nil {
-    array = dest_tree.([]*TomlTree)
-  } else {
-    panic(fmt.Sprintf("key %s is already assigned and not of type group array", key))
-  }
+	// get or create group array element at the indicated part in the path
+	p.currentGroup = strings.Split(key.val, ".")
+	dest_tree := p.tree.GetPath(p.currentGroup)
+	var array []*TomlTree
+	if dest_tree == nil {
+		array = make([]*TomlTree, 0)
+	} else if dest_tree.([]*TomlTree) != nil {
+		array = dest_tree.([]*TomlTree)
+	} else {
+		panic(fmt.Sprintf("key %s is already assigned and not of type group array", key))
+	}
 
-  // add a new tree to the end of the group array
-  new_tree := make(TomlTree)
-  array = append(array, &new_tree)
-  p.tree.SetPath(p.currentGroup, array)
+	// add a new tree to the end of the group array
+	new_tree := make(TomlTree)
+	array = append(array, &new_tree)
+	p.tree.SetPath(p.currentGroup, array)
 
-  // keep this key name from use by other kinds of assignments
-  p.seenGroupKeys = append(p.seenGroupKeys, key.val)
+	// keep this key name from use by other kinds of assignments
+	p.seenGroupKeys = append(p.seenGroupKeys, key.val)
 
-  // move to next parser state
+	// move to next parser state
 	p.assume(tokenDoubleRightBracket)
 	return parseStart(p)
 }
@@ -146,24 +146,24 @@
 		group_key = make([]string, 0)
 	}
 
-  // find the group to assign, looking out for arrays of groups
-  var target_node *TomlTree
-  switch node := p.tree.GetPath(group_key).(type) {
-  case []*TomlTree:
-    target_node = node[len(node)-1]
-  case *TomlTree:
-    target_node = node
-  default:
-    panic(fmt.Sprintf("Unknown group type for path %v", group_key))
-  }
+	// find the group to assign, looking out for arrays of groups
+	var target_node *TomlTree
+	switch node := p.tree.GetPath(group_key).(type) {
+	case []*TomlTree:
+		target_node = node[len(node)-1]
+	case *TomlTree:
+		target_node = node
+	default:
+		panic(fmt.Sprintf("Unknown group type for path %v", group_key))
+	}
 
-  // assign value to the found group
-  local_key := []string{ key.val }
+	// assign value to the found group
+	local_key := []string{key.val}
 	final_key := append(group_key, key.val)
-  if target_node.GetPath(local_key) != nil {
-    panic(fmt.Sprintf("the following key was defined twice: %s", strings.Join(final_key, ".")))
-  }
-  target_node.SetPath(local_key, value)
+	if target_node.GetPath(local_key) != nil {
+		panic(fmt.Sprintf("the following key was defined twice: %s", strings.Join(final_key, ".")))
+	}
+	target_node.SetPath(local_key, value)
 	return parseStart(p)
 }
 
diff --git a/toml.go b/toml.go
index ac6ae10..cafad2c 100644
--- a/toml.go
+++ b/toml.go
@@ -6,12 +6,12 @@
 
 import (
 	"errors"
+	"fmt"
 	"io/ioutil"
 	"runtime"
+	"strconv"
 	"strings"
-  "strconv"
-  "time"
-  "fmt"
+	"time"
 )
 
 // Definition of a TomlTree.
@@ -46,14 +46,18 @@
 // Returns nil if the path does not exist in the tree.
 // If keys is of length zero, the current tree is returned.
 func (t *TomlTree) Get(key string) interface{} {
-  if key == "" { return t }
+	if key == "" {
+		return t
+	}
 	return t.GetPath(strings.Split(key, "."))
 }
 
 // Returns the element in the tree indicated by 'keys'.
 // If keys is of length zero, the current tree is returned.
 func (t *TomlTree) GetPath(keys []string) interface{} {
-  if len(keys) == 0 { return t }
+	if len(keys) == 0 {
+		return t
+	}
 	subtree := t
 	for _, intermediate_key := range keys[:len(keys)-1] {
 		_, exists := (*subtree)[intermediate_key]
@@ -67,11 +71,11 @@
 
 // Same as Get but with a default value
 func (t *TomlTree) GetDefault(key string, def interface{}) interface{} {
-    val := t.Get(key)
-    if val == nil {
-        return def
-    }
-    return val;
+	val := t.Get(key)
+	if val == nil {
+		return def
+	}
+	return val
 }
 
 // Set an element in the tree.
@@ -116,89 +120,100 @@
 
 // encodes a string to a TOML-compliant string value
 func encodeTomlString(value string) string {
-  result := ""
-  for _, rr := range value {
-    int_rr := uint16(rr)
-    switch rr {
-    case '\b': result += "\\b"
-    case '\t': result += "\\t"
-    case '\n': result += "\\n"
-    case '\f': result += "\\f"
-    case '\r': result += "\\r"
-    case '"':  result += "\\\""
-    case '\\': result += "\\\\"
-    default:
-      if int_rr < 0x001F {
-        result += fmt.Sprintf("\\u%0.4X", int_rr)
-      } else {
-        result += string(rr)
-      }
-    }
-  }
-  return result
+	result := ""
+	for _, rr := range value {
+		int_rr := uint16(rr)
+		switch rr {
+		case '\b':
+			result += "\\b"
+		case '\t':
+			result += "\\t"
+		case '\n':
+			result += "\\n"
+		case '\f':
+			result += "\\f"
+		case '\r':
+			result += "\\r"
+		case '"':
+			result += "\\\""
+		case '\\':
+			result += "\\\\"
+		default:
+			if int_rr < 0x001F {
+				result += fmt.Sprintf("\\u%0.4X", int_rr)
+			} else {
+				result += string(rr)
+			}
+		}
+	}
+	return result
 }
 
 // Value print support function for ToString()
 // Outputs the TOML compliant string representation of a value
 func toTomlValue(item interface{}, indent int) string {
-  tab := strings.Repeat(" ", indent)
-  switch value := item.(type) {
-  case int64:
-    return tab + strconv.FormatInt(value, 10)
-  case float64:
-    return tab + strconv.FormatFloat(value, 'f', -1, 64)
-  case string:
-    return tab + "\"" + encodeTomlString(value) + "\""
-  case bool:
-    if value { return "true" } else { return "false" }
-  case time.Time:
-    return tab + value.Format(time.RFC3339)
-  case []interface{}:
-    result := tab + "[\n"
-    for _, item := range value {
-      result += toTomlValue(item, indent + 2) + ",\n"
-    }
-    return result + tab + "]"
-  default:
-    panic(fmt.Sprintf("unsupported value type: %v", value))
-  }
+	tab := strings.Repeat(" ", indent)
+	switch value := item.(type) {
+	case int64:
+		return tab + strconv.FormatInt(value, 10)
+	case float64:
+		return tab + strconv.FormatFloat(value, 'f', -1, 64)
+	case string:
+		return tab + "\"" + encodeTomlString(value) + "\""
+	case bool:
+		if value {
+			return "true"
+		} else {
+			return "false"
+		}
+	case time.Time:
+		return tab + value.Format(time.RFC3339)
+	case []interface{}:
+		result := tab + "[\n"
+		for _, item := range value {
+			result += toTomlValue(item, indent+2) + ",\n"
+		}
+		return result + tab + "]"
+	default:
+		panic(fmt.Sprintf("unsupported value type: %v", value))
+	}
 }
 
 // Recursive support function for ToString()
 // Outputs a tree, using the provided keyspace to prefix group names
 func (t *TomlTree) toToml(keyspace string) string {
-  result := ""
-  for k, v := range (map[string]interface{})(*t) {
-    // figure out the keyspace
-    combined_key := k
-    if keyspace != "" {
-      combined_key = keyspace + "." + combined_key
-    }
-    // output based on type
-    switch node := v.(type) {
-    case []*TomlTree:
-      for _, item := range node {
-        if len(item.Keys()) > 0 {
-          result += fmt.Sprintf("\n[[%s]]\n", combined_key)
-        }
-        result += item.toToml(combined_key)
-      }
-    case *TomlTree:
-      if len(node.Keys()) > 0 {
-        result += fmt.Sprintf("\n[%s]\n", combined_key)
-      }
-      result += node.toToml(combined_key)
-    default:
-      result += fmt.Sprintf("%s = %s\n", k, toTomlValue(node,0))
-    }
-  }
-  return result
+	result := ""
+	for k, v := range (map[string]interface{})(*t) {
+		// figure out the keyspace
+		combined_key := k
+		if keyspace != "" {
+			combined_key = keyspace + "." + combined_key
+		}
+		// output based on type
+		switch node := v.(type) {
+		case []*TomlTree:
+			for _, item := range node {
+				if len(item.Keys()) > 0 {
+					result += fmt.Sprintf("\n[[%s]]\n", combined_key)
+				}
+				result += item.toToml(combined_key)
+			}
+		case *TomlTree:
+			if len(node.Keys()) > 0 {
+				result += fmt.Sprintf("\n[%s]\n", combined_key)
+			}
+			result += node.toToml(combined_key)
+		default:
+			result += fmt.Sprintf("%s = %s\n", k, toTomlValue(node, 0))
+		}
+	}
+	return result
 }
 
 // Generates a human-readable representation of the current tree.
 // Output spans multiple lines, and is suitable for ingest by a TOML parser
 func (t *TomlTree) ToString() string {
-  return t.toToml("")
+	return t.toToml("")
 }
 
 // Create a TomlTree from a string.
diff --git a/toml_test.go b/toml_test.go
index 2626902..4b6610e 100644
--- a/toml_test.go
+++ b/toml_test.go
@@ -1,25 +1,25 @@
 package toml
 
 import (
-  "testing"
+	"testing"
 )
 
 func TestTomlGetPath(t *testing.T) {
-  node := make(TomlTree)
-  //TODO: set other node data
+	node := make(TomlTree)
+	//TODO: set other node data
 
-  for idx, item := range []struct {
-    Path []string
-    Expected interface{}
-  } {
-    { // empty path test
-      []string{},
-      &node,
-    },
-  } {
-    result := node.GetPath(item.Path)
-    if result != item.Expected {
-      t.Errorf("GetPath[%d] %v - expected %v, got %v instead.", idx, item.Path, item.Expected, result)
-    }
-  }
+	for idx, item := range []struct {
+		Path     []string
+		Expected interface{}
+	}{
+		{ // empty path test
+			[]string{},
+			&node,
+		},
+	} {
+		result := node.GetPath(item.Path)
+		if result != item.Expected {
+			t.Errorf("GetPath[%d] %v - expected %v, got %v instead.", idx, item.Path, item.Expected, result)
+		}
+	}
 }
