diff --git a/lexer.go b/lexer.go
index e668962..fa10649 100644
--- a/lexer.go
+++ b/lexer.go
@@ -44,10 +44,10 @@
 )
 
 type token struct {
-	typ tokenType
-	val string
-  line int
-  col int
+	typ  tokenType
+	val  string
+	line int
+	col  int
 }
 
 func (i token) String() string {
@@ -65,7 +65,7 @@
 }
 
 func (i token) Pos() string {
-  return fmt.Sprintf("(%d, %d)", i.line + 1, i.col + 1)
+	return fmt.Sprintf("(%d, %d)", i.line+1, i.col+1)
 }
 
 func isSpace(r rune) bool {
@@ -99,8 +99,8 @@
 	width  int
 	tokens chan token
 	depth  int
-  line   int
-  col    int
+	line   int
+	col    int
 }
 
 func (l *lexer) run() {
@@ -111,31 +111,31 @@
 }
 
 func (l *lexer) nextStart() {
-  // iterate by runes (utf8 characters)
-  // search for newlines and advance line/col counts
-  for i:=l.start; i<l.pos; {
-	  r, width := utf8.DecodeRuneInString(l.input[i:])
-    if r == '\n' {
-      l.line += 1
-      l.col = 0
-    } else {
-      l.col += 1
-    }
-    i += width
-//    fmt.Printf("'%c'\n", r)
-  }
-  // advance start position to next token
-  l.start = l.pos
+	// iterate by runes (utf8 characters)
+	// search for newlines and advance line/col counts
+	for i := l.start; i < l.pos; {
+		r, width := utf8.DecodeRuneInString(l.input[i:])
+		if r == '\n' {
+			l.line += 1
+			l.col = 0
+		} else {
+			l.col += 1
+		}
+		i += width
+		//    fmt.Printf("'%c'\n", r)
+	}
+	// advance start position to next token
+	l.start = l.pos
 }
 
 func (l *lexer) emit(t tokenType) {
 	l.tokens <- token{t, l.input[l.start:l.pos], l.line, l.col}
-  l.nextStart()
+	l.nextStart()
 }
 
 func (l *lexer) emitWithValue(t tokenType, value string) {
 	l.tokens <- token{t, value, l.line, l.col}
-  l.nextStart()
+	l.nextStart()
 }
 
 func (l *lexer) next() rune {
@@ -150,7 +150,7 @@
 }
 
 func (l *lexer) ignore() {
-  l.nextStart()
+	l.nextStart()
 }
 
 func (l *lexer) backup() {
@@ -161,8 +161,8 @@
 	l.tokens <- token{
 		tokenError,
 		fmt.Sprintf(format, args...),
-    l.line,
-    l.col,
+		l.line,
+		l.col,
 	}
 	return nil
 }
diff --git a/lexer_test.go b/lexer_test.go
index 4d17e17..afe8d61 100644
--- a/lexer_test.go
+++ b/lexer_test.go
@@ -7,12 +7,12 @@
 	for _, expected := range expectedFlow {
 		token := <-ch
 		if token != expected {
-      t.Log("While testing: ", input)
+			t.Log("While testing: ", input)
 			t.Log("compared", token, "to", expected)
-			t.Log(token.val,  "<->", expected.val)
-			t.Log(token.typ,  "<->", expected.typ)
+			t.Log(token.val, "<->", expected.val)
+			t.Log(token.typ, "<->", expected.typ)
 			t.Log(token.line, "<->", expected.line)
-			t.Log(token.col,  "<->", expected.col)
+			t.Log(token.col, "<->", expected.col)
 			t.FailNow()
 		}
 	}
@@ -125,7 +125,6 @@
 	})
 }
 
-
 func TestKeyWithSymbolsAndEqual(t *testing.T) {
 	testFlow(t, "~!@#$^&*()_+-`1234567890[]\\|/?><.,;:' = 5", []token{
 		token{tokenKey, "~!@#$^&*()_+-`1234567890[]\\|/?><.,;:'", 0, 0},
@@ -139,7 +138,7 @@
 	testFlow(t, `foo = "hello\""`, []token{
 		token{tokenKey, "foo", 0, 0},
 		token{tokenEqual, "=", 0, 4},
-		token{tokenString, "hello\"" ,0, 7},
+		token{tokenString, "hello\"", 0, 7},
 		token{tokenEOF, "", 0, 15},
 	})
 }
diff --git a/parser.go b/parser.go
index 2e70e74..17cd308 100644
--- a/parser.go
+++ b/parser.go
@@ -21,8 +21,8 @@
 type parserStateFn func(*parser) parserStateFn
 
 // Formats and panics an error message based on a token
-func (p *parser) raiseError(tok *token, msg string, args... interface{}) {
-  panic(tok.Pos() + ": " + fmt.Sprintf(msg, args...))
+func (p *parser) raiseError(tok *token, msg string, args ...interface{}) {
+	panic(tok.Pos() + ": " + fmt.Sprintf(msg, args...))
 }
 
 func (p *parser) run() {
@@ -135,8 +135,8 @@
 	}
 	p.seenGroupKeys = append(p.seenGroupKeys, key.val)
 	if err := p.tree.createSubTree(key.val); err != nil {
-    p.raiseError(key, "%s", err)
-  }
+		p.raiseError(key, "%s", err)
+	}
 	p.assume(tokenRightBracket)
 	p.currentGroup = strings.Split(key.val, ".")
 	return parseStart(p)
@@ -211,7 +211,7 @@
 		p.raiseError(tok, "%s", tok)
 	}
 
-  p.raiseError(tok, "never reached")
+	p.raiseError(tok, "never reached")
 
 	return nil
 }
diff --git a/toml.go b/toml.go
index 5dceb15..7be23dd 100644
--- a/toml.go
+++ b/toml.go
@@ -144,7 +144,7 @@
 // and tree[a][b][c]
 //
 // Returns nil on success, error object on failure
-func (t *TomlTree) createSubTree(key string) error{
+func (t *TomlTree) createSubTree(key string) error {
 	subtree := t
 	for _, intermediate_key := range strings.Split(key, ".") {
 		if intermediate_key == "" {
@@ -157,7 +157,7 @@
 		}
 		subtree = ((*subtree)[intermediate_key]).(*TomlTree)
 	}
-  return nil
+	return nil
 }
 
 // encodes a string to a TOML-compliant string value
