diff --git a/src/toml/example.toml b/src/toml/example.toml
deleted file mode 100644
index 3d902f2..0000000
--- a/src/toml/example.toml
+++ /dev/null
@@ -1,29 +0,0 @@
-# This is a TOML document. Boom.
-
-title = "TOML Example"
-
-[owner]
-name = "Tom Preston-Werner"
-organization = "GitHub"
-bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
-dob = 1979-05-27T07:32:00Z # First class dates? Why not?
-
-[database]
-server = "192.168.1.1"
-ports = [ 8001, 8001, 8002 ]
-connection_max = 5000
-enabled = true
-
-[servers]
-
-  # You can indent as you please. Tabs or spaces. TOML don't care.
-  [servers.alpha]
-  ip = "10.0.0.1"
-  dc = "eqdc10"
-
-  [servers.beta]
-  ip = "10.0.0.2"
-  dc = "eqdc10"
-
-[clients]
-data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
diff --git a/src/toml/lexer.go b/src/toml/lexer.go
deleted file mode 100644
index 586263b..0000000
--- a/src/toml/lexer.go
+++ /dev/null
@@ -1,400 +0,0 @@
-// TOML lexer.// Written using the principles developped by Rob Pike in
-// http://www.youtube.com/watch?v=HxaD_trXwRE
-
-package toml
-
-import (
-	"fmt"
-	"regexp"
-	"strings"
-	"unicode/utf8"
-)
-
-var dateRegexp *regexp.Regexp
-
-// Define tokens
-type tokenType int
-
-const (
-	eof = -(iota + 1)
-)
-
-const (
-	tokenError tokenType = iota
-	tokenEOF
-	tokenComment
-	tokenKey
-	tokenEqual
-	tokenString
-	tokenInteger
-	tokenTrue
-	tokenFalse
-	tokenFloat
-	tokenLeftBracket
-	tokenRightBracket
-	tokenDate
-	tokenKeyGroup
-	tokenComma
-	tokenEOL
-)
-
-type token struct {
-	typ tokenType
-	val string
-}
-
-func (i token) String() string {
-	switch i.typ {
-	case tokenEOF:
-		return "EOF"
-	case tokenError:
-		return i.val
-	}
-
-	if len(i.val) > 10 {
-		return fmt.Sprintf("%.10q...", i.val)
-	}
-	return fmt.Sprintf("%q", i.val)
-}
-
-func isSpace(r rune) bool {
-	return r == ' ' || r == '\t'
-}
-
-func isAlpha(r rune) bool {
-	return r >= 'a' && r <= 'z'
-}
-
-func isDigit(r rune) bool {
-	return r >= '0' && r <= '9'
-}
-
-// Define lexer
-type lexer struct {
-	input  string
-	start  int
-	pos    int
-	width  int
-	tokens chan token
-	depth  int
-}
-
-func (l *lexer) run() {
-	for state := lexVoid; state != nil; {
-		state = state(l)
-	}
-	close(l.tokens)
-}
-
-func (l *lexer) emit(t tokenType) {
-	l.tokens <- token{t, l.input[l.start:l.pos]}
-	l.start = l.pos
-}
-
-func (l *lexer) emitWithValue(t tokenType, value string) {
-	l.tokens <- token{t, value}
-	l.start = l.pos
-}
-
-func (l *lexer) next() rune {
-	if l.pos >= len(l.input) {
-		l.width = 0
-		return eof
-	}
-	var r rune
-	r, l.width = utf8.DecodeRuneInString(l.input[l.pos:])
-	l.pos += l.width
-	return r
-}
-
-func (l *lexer) ignore() {
-	l.start = l.pos
-}
-
-func (l *lexer) backup() {
-	l.pos -= l.width
-}
-
-func (l *lexer) errorf(format string, args ...interface{}) stateFn {
-	l.tokens <- token{
-		tokenError,
-		fmt.Sprintf(format, args...),
-	}
-	return nil
-}
-
-func (l *lexer) peek() rune {
-	r := l.next()
-	l.backup()
-	return r
-}
-
-func (l *lexer) accept(valid string) bool {
-	if strings.IndexRune(valid, l.next()) >= 0 {
-		return true
-	}
-	l.backup()
-	return false
-}
-
-func (l *lexer) follow(next string) bool {
-	return strings.HasPrefix(l.input[l.pos:], next)
-}
-
-// Define state functions
-type stateFn func(*lexer) stateFn
-
-func lexVoid(l *lexer) stateFn {
-	for {
-		next := l.peek()
-		switch next {
-		case '[':
-			return lexKeyGroup
-		case '#':
-			return lexComment
-		case '=':
-			return lexEqual
-		}
-
-		if isAlpha(next) {
-			return lexKey
-		}
-
-		if isSpace(next) {
-			l.ignore()
-		}
-
-		if l.next() == eof {
-			break
-		}
-	}
-
-	l.emit(tokenEOF)
-	return nil
-}
-
-func lexRvalue(l *lexer) stateFn {
-	for {
-		next := l.peek()
-		switch next {
-		case '[':
-			l.depth += 1
-			return lexLeftBracket
-		case ']':
-			l.depth -= 1
-			return lexRightBracket
-		case '#':
-			return lexComment
-		case '"':
-			return lexString
-		case ',':
-			return lexComma
-		case '\n':
-			l.ignore()
-			l.pos += 1
-			if l.depth == 0 {
-				return lexVoid
-			} else {
-				return lexRvalue
-			}
-		}
-
-		if l.follow("true") {
-			return lexTrue
-		}
-
-		if l.follow("false") {
-			return lexFalse
-		}
-
-		if isAlpha(next) {
-			return lexKey
-		}
-
-		if dateRegexp.FindString(l.input[l.pos:]) != "" {
-			return lexDate
-		}
-
-		if next == '+' || next == '-' || isDigit(next) {
-			return lexNumber
-		}
-
-		if isSpace(next) {
-			l.ignore()
-		}
-
-		if l.next() == eof {
-			break
-		}
-	}
-
-	l.emit(tokenEOF)
-	return nil
-}
-
-func lexDate(l *lexer) stateFn {
-	l.ignore()
-	l.pos += 20 // Fixed size of a date in TOML
-	l.emit(tokenDate)
-	return lexRvalue
-}
-
-func lexTrue(l *lexer) stateFn {
-	l.ignore()
-	l.pos += 4
-	l.emit(tokenTrue)
-	return lexRvalue
-}
-
-func lexFalse(l *lexer) stateFn {
-	l.ignore()
-	l.pos += 5
-	l.emit(tokenFalse)
-	return lexRvalue
-}
-
-func lexEqual(l *lexer) stateFn {
-	l.ignore()
-	l.accept("=")
-	l.emit(tokenEqual)
-	return lexRvalue
-}
-
-func lexComma(l *lexer) stateFn {
-	l.ignore()
-	l.accept(",")
-	l.emit(tokenComma)
-	return lexRvalue
-}
-
-func lexKey(l *lexer) stateFn {
-	l.ignore()
-	for isAlpha(l.next()) {
-	}
-	l.backup()
-	l.emit(tokenKey)
-	return lexVoid
-}
-
-func lexComment(l *lexer) stateFn {
-	for {
-		next := l.next()
-		if next == '\n' || next == eof {
-			break
-		}
-	}
-	l.ignore()
-	return lexVoid
-}
-
-func lexLeftBracket(l *lexer) stateFn {
-	l.ignore()
-	l.pos += 1
-	l.emit(tokenLeftBracket)
-	return lexRvalue
-}
-
-func lexString(l *lexer) stateFn {
-	l.pos += 1
-	l.ignore()
-	growing_string := ""
-
-	for {
-		if l.peek() == '"' {
-			l.emitWithValue(tokenString, growing_string)
-			l.pos += 1
-			l.ignore()
-			return lexVoid
-		}
-
-		if l.follow("\\\"") {
-			l.pos += 1
-			growing_string += "\""
-		} else {
-			growing_string += string(l.peek())
-		}
-
-		if l.next() == eof {
-			break
-		}
-	}
-
-	return l.errorf("unclosed string")
-}
-
-func lexKeyGroup(l *lexer) stateFn {
-	l.ignore()
-	l.pos += 1
-	l.emit(tokenLeftBracket)
-	return lexInsideKeyGroup
-}
-
-func lexInsideKeyGroup(l *lexer) stateFn {
-	for {
-		if l.peek() == ']' {
-			if l.pos > l.start {
-				l.emit(tokenKeyGroup)
-			}
-			l.ignore()
-			l.pos += 1
-			l.emit(tokenRightBracket)
-			return lexVoid
-		}
-
-		if l.next() == eof {
-			break
-		}
-	}
-	return l.errorf("unclosed key group")
-}
-
-func lexRightBracket(l *lexer) stateFn {
-	l.ignore()
-	l.pos += 1
-	l.emit(tokenRightBracket)
-	return lexRvalue
-}
-
-func lexNumber(l *lexer) stateFn {
-	l.ignore()
-	if !l.accept("+") {
-		l.accept("-")
-	}
-	point_seen := false
-	digit_seen := false
-	for {
-		next := l.next()
-		if next == '.' {
-			point_seen = true
-		} else if isDigit(next) {
-			digit_seen = true
-		} else {
-			l.backup()
-			break
-		}
-	}
-
-	if !digit_seen {
-		return l.errorf("no digit in that number")
-	}
-	if point_seen {
-		l.emit(tokenFloat)
-	} else {
-		l.emit(tokenInteger)
-	}
-	return lexRvalue
-}
-
-func init() {
-	dateRegexp = regexp.MustCompile("^\\d{1,4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z")
-}
-
-// Entry point
-func lex(input string) (*lexer, chan token) {
-	l := &lexer{
-		input:  input,
-		tokens: make(chan token),
-	}
-	go l.run()
-	return l, l.tokens
-}
diff --git a/src/toml/lexer_test.go b/src/toml/lexer_test.go
deleted file mode 100644
index b232705..0000000
--- a/src/toml/lexer_test.go
+++ /dev/null
@@ -1,231 +0,0 @@
-package toml
-
-import "testing"
-
-func testFlow(t *testing.T, input string, expectedFlow []token) {
-	_, ch := lex(input)
-	for _, expected := range expectedFlow {
-		token := <-ch
-		if token != expected {
-			t.Log("compared", token, "to", expected)
-			t.Log(token.val, "<->", expected.val)
-			t.Log(token.typ, "<->", expected.typ)
-			t.FailNow()
-		}
-	}
-
-	tok, ok := <-ch
-	if ok {
-		t.Log("channel is not closed!")
-		t.Log(len(ch)+1, "tokens remaining:")
-
-		t.Log("token ->", tok)
-		for token := range ch {
-			t.Log("token ->", token)
-		}
-		t.FailNow()
-	}
-}
-
-func TestValidKeyGroup(t *testing.T) {
-	testFlow(t, "[hello world]", []token{
-		token{tokenLeftBracket, "["},
-		token{tokenKeyGroup, "hello world"},
-		token{tokenRightBracket, "]"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestUnclosedKeyGroup(t *testing.T) {
-	testFlow(t, "[hello world", []token{
-		token{tokenLeftBracket, "["},
-		token{tokenError, "unclosed key group"},
-	})
-}
-
-func TestComment(t *testing.T) {
-	testFlow(t, "# blahblah", []token{
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyGroupComment(t *testing.T) {
-	testFlow(t, "[hello world] # blahblah", []token{
-		token{tokenLeftBracket, "["},
-		token{tokenKeyGroup, "hello world"},
-		token{tokenRightBracket, "]"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestMultipleKeyGroupsComment(t *testing.T) {
-	testFlow(t, "[hello world] # blahblah\n[test]", []token{
-		token{tokenLeftBracket, "["},
-		token{tokenKeyGroup, "hello world"},
-		token{tokenRightBracket, "]"},
-		token{tokenLeftBracket, "["},
-		token{tokenKeyGroup, "test"},
-		token{tokenRightBracket, "]"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestBasicKey(t *testing.T) {
-	testFlow(t, "hello", []token{
-		token{tokenKey, "hello"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestBasicKeyAndEqual(t *testing.T) {
-	testFlow(t, "hello =", []token{
-		token{tokenKey, "hello"},
-		token{tokenEqual, "="},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualStringEscape(t *testing.T) {
-	testFlow(t, "foo = \"hello\\\"\"", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenString, "hello\""},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualStringUnfinished(t *testing.T) {
-	testFlow(t, "foo = \"bar", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenError, "unclosed string"},
-	})
-}
-
-func TestKeyEqualString(t *testing.T) {
-	testFlow(t, "foo = \"bar\"", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenString, "bar"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualTrue(t *testing.T) {
-	testFlow(t, "foo = true", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenTrue, "true"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualFalse(t *testing.T) {
-	testFlow(t, "foo = false", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenFalse, "false"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualArrayBools(t *testing.T) {
-	testFlow(t, "foo = [true, false, true]", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenLeftBracket, "["},
-		token{tokenTrue, "true"},
-		token{tokenComma, ","},
-		token{tokenFalse, "false"},
-		token{tokenComma, ","},
-		token{tokenTrue, "true"},
-		token{tokenRightBracket, "]"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualArrayBoolsWithComments(t *testing.T) {
-	testFlow(t, "foo = [true, false, true] # YEAH", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenLeftBracket, "["},
-		token{tokenTrue, "true"},
-		token{tokenComma, ","},
-		token{tokenFalse, "false"},
-		token{tokenComma, ","},
-		token{tokenTrue, "true"},
-		token{tokenRightBracket, "]"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestDateRegexp(t *testing.T) {
-	if dateRegexp.FindString("1979-05-27T07:32:00Z") == "" {
-		t.Fail()
-	}
-}
-
-func TestKeyEqualDate(t *testing.T) {
-	testFlow(t, "foo = 1979-05-27T07:32:00Z", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenDate, "1979-05-27T07:32:00Z"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestKeyEqualNumber(t *testing.T) {
-	testFlow(t, "foo = 42", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenInteger, "42"},
-		token{tokenEOF, ""},
-	})
-
-	testFlow(t, "foo = +42", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenInteger, "+42"},
-		token{tokenEOF, ""},
-	})
-
-	testFlow(t, "foo = -42", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenInteger, "-42"},
-		token{tokenEOF, ""},
-	})
-
-	testFlow(t, "foo = 4.2", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenFloat, "4.2"},
-		token{tokenEOF, ""},
-	})
-
-	testFlow(t, "foo = +4.2", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenFloat, "+4.2"},
-		token{tokenEOF, ""},
-	})
-
-	testFlow(t, "foo = -4.2", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenFloat, "-4.2"},
-		token{tokenEOF, ""},
-	})
-}
-
-func TestMultiline(t *testing.T) {
-	testFlow(t, "foo = 42\nbar=21", []token{
-		token{tokenKey, "foo"},
-		token{tokenEqual, "="},
-		token{tokenInteger, "42"},
-		token{tokenKey, "bar"},
-		token{tokenEqual, "="},
-		token{tokenInteger, "21"},
-		token{tokenEOF, ""},
-	})
-}
diff --git a/src/toml/parser.go b/src/toml/parser.go
deleted file mode 100644
index fc6a6ff..0000000
--- a/src/toml/parser.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// TOML Parser.
-
-package toml
-
-import (
-	"fmt"
-	"strconv"
-	"time"
-)
-
-type parser struct {
-	flow         chan token
-	tree         *TomlTree
-	tokensBuffer []token
-	currentGroup string
-}
-
-type parserStateFn func(*parser) parserStateFn
-
-func (p *parser) run() {
-	for state := parseStart; state != nil; {
-		state = state(p)
-	}
-}
-
-func (p *parser) peek() *token {
-	if len(p.tokensBuffer) != 0 {
-		return &(p.tokensBuffer[0])
-	}
-
-	tok, ok := <-p.flow
-	if !ok {
-		return nil
-	}
-	p.tokensBuffer = append(p.tokensBuffer, tok)
-	return &tok
-}
-
-func (p *parser) assume(typ tokenType) {
-	tok := p.getToken()
-	if tok == nil {
-		panic(fmt.Sprintf("was expecting token %s, but token stream is empty", typ))
-	}
-	if tok.typ != typ {
-		panic(fmt.Sprintf("was expecting token %s, but got %s", typ, tok.typ))
-	}
-}
-
-func (p *parser) getToken() *token {
-	if len(p.tokensBuffer) != 0 {
-		tok := p.tokensBuffer[0]
-		p.tokensBuffer = p.tokensBuffer[1:]
-		return &tok
-	}
-	tok, ok := <-p.flow
-	if !ok {
-		return nil
-	}
-	return &tok
-}
-
-func parseStart(p *parser) parserStateFn {
-	tok := p.peek()
-
-	// end of stream, parsing is finished
-	if tok == nil {
-		return nil
-	}
-
-	switch tok.typ {
-	case tokenLeftBracket:
-		return parseGroup
-	case tokenKey:
-		return parseAssign
-	case tokenEOF:
-		return nil
-	default:
-		panic("unexpected token")
-	}
-	return nil
-}
-
-func parseGroup(p *parser) parserStateFn {
-	p.getToken() // discard the [
-	key := p.getToken()
-	if key.typ != tokenKeyGroup {
-		panic(fmt.Sprintf("unexpected token %s, was expecting a key group", key))
-	}
-	p.tree.createSubTree(key.val)
-	p.assume(tokenRightBracket)
-	p.currentGroup = key.val
-	return parseStart(p)
-}
-
-func parseAssign(p *parser) parserStateFn {
-	key := p.getToken()
-	p.assume(tokenEqual)
-	value := parseRvalue(p)
-	final_key := key.val
-	if p.currentGroup != "" {
-		final_key = p.currentGroup + "." + key.val
-	}
-	p.tree.Set(final_key, value)
-	return parseStart(p)
-}
-
-func parseRvalue(p *parser) interface{} {
-	tok := p.getToken()
-	if tok == nil {
-		panic("expecting a value")
-	}
-
-	switch tok.typ {
-	case tokenString:
-		return tok.val
-	case tokenTrue:
-		return true
-	case tokenFalse:
-		return false
-	case tokenInteger:
-		val, err := strconv.ParseInt(tok.val, 10, 64)
-		if err != nil {
-			panic(err)
-		}
-		return val
-	case tokenFloat:
-		val, err := strconv.ParseFloat(tok.val, 64)
-		if err != nil {
-			panic(err)
-		}
-		return val
-	case tokenDate:
-		val, err := time.Parse(time.RFC3339, tok.val)
-		if err != nil {
-			panic(err)
-		}
-		return val
-	case tokenLeftBracket:
-		return parseArray(p)
-	}
-
-	panic("never reached")
-
-	return nil
-}
-
-func parseArray(p *parser) []interface{} {
-	array := make([]interface{}, 0)
-	for {
-		follow := p.peek()
-		if follow == nil {
-			panic("unterminated array")
-		}
-		if follow.typ == tokenRightBracket {
-			p.getToken()
-			return array
-		}
-		val := parseRvalue(p)
-		array = append(array, val)
-		follow = p.peek()
-		if follow == nil {
-			panic("unterminated array")
-		}
-		if follow.typ != tokenRightBracket && follow.typ != tokenComma {
-			panic("missing comma")
-		}
-		if follow.typ == tokenComma {
-			p.getToken()
-		}
-	}
-	return array
-}
-
-func parse(flow chan token) *TomlTree {
-	result := make(TomlTree)
-	parser := &parser{
-		flow:         flow,
-		tree:         &result,
-		tokensBuffer: make([]token, 0),
-		currentGroup: "",
-	}
-	parser.run()
-	return parser.tree
-}
diff --git a/src/toml/parser_test.go b/src/toml/parser_test.go
deleted file mode 100644
index fd271ce..0000000
--- a/src/toml/parser_test.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package toml
-
-import (
-	"fmt"
-	"testing"
-	"time"
-)
-
-func assertTree(t *testing.T, tree *TomlTree, ref map[string]interface{}) {
-	for k, v := range ref {
-		if fmt.Sprintf("%v", tree.Get(k)) != fmt.Sprintf("%v", v) {
-			t.Log("was expecting", v, "at", k, "but got", tree.Get(k))
-			t.Fail()
-		}
-	}
-}
-
-func TestCreateSubTree(t *testing.T) {
-	tree := make(TomlTree)
-	tree.createSubTree("a.b.c")
-	tree.Set("a.b.c", 42)
-	if tree.Get("a.b.c") != 42 {
-		t.Fail()
-	}
-}
-
-func TestSimpleKV(t *testing.T) {
-	tree := Load("a = 42")
-	assertTree(t, tree, map[string]interface{}{
-		"a": int64(42),
-	})
-
-	tree = Load("a = 42\nb = 21")
-	assertTree(t, tree, map[string]interface{}{
-		"a": int64(42),
-		"b": int64(21),
-	})
-}
-
-func TestSimpleNumbers(t *testing.T) {
-	tree := Load("a = +42\nb = -21\nc = +4.2\nd = -2.1")
-	assertTree(t, tree, map[string]interface{}{
-		"a": int64(42),
-		"b": int64(-21),
-		"c": float64(4.2),
-		"d": float64(-2.1),
-	})
-}
-
-func TestSimpleDate(t *testing.T) {
-	tree := Load("a = 1979-05-27T07:32:00Z")
-	assertTree(t, tree, map[string]interface{}{
-		"a": time.Date(1979, time.May, 27, 7, 32, 0, 0, time.UTC),
-	})
-}
-
-func TestSimpleString(t *testing.T) {
-	tree := Load("a = \"hello world\"")
-	assertTree(t, tree, map[string]interface{}{
-		"a": "hello world",
-	})
-}
-
-func TestBools(t *testing.T) {
-	tree := Load("a = true\nb = false")
-	assertTree(t, tree, map[string]interface{}{
-		"a": true,
-		"b": false,
-	})
-}
-
-func TestNestedKeys(t *testing.T) {
-	tree := Load("[a.b.c]\nd = 42")
-	assertTree(t, tree, map[string]interface{}{
-		"a.b.c.d": int64(42),
-	})
-}
-
-func TestArraySimple(t *testing.T) {
-	tree := Load("a = [42, 21, 10]")
-	assertTree(t, tree, map[string]interface{}{
-		"a": []int64{int64(42), int64(21), int64(10)},
-	})
-
-	tree = Load("a = [42, 21, 10,]")
-	assertTree(t, tree, map[string]interface{}{
-		"a": []int64{int64(42), int64(21), int64(10)},
-	})
-}
-
-func TestArrayMultiline(t *testing.T) {
-	tree := Load("a = [42,\n21, 10,]")
-	assertTree(t, tree, map[string]interface{}{
-		"a": []int64{int64(42), int64(21), int64(10)},
-	})
-}
-
-func TestArrayNested(t *testing.T) {
-	tree := Load("a = [[42, 21], [10]]")
-	assertTree(t, tree, map[string]interface{}{
-		"a": [][]int64{[]int64{int64(42), int64(21)}, []int64{int64(10)}},
-	})
-}
diff --git a/src/toml/toml.go b/src/toml/toml.go
deleted file mode 100644
index e8f5556..0000000
--- a/src/toml/toml.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// TOML markup language parser.
-//
-// This version supports the specification as described in
-// https://github.com/mojombo/toml/tree/e3656ad493400895f4460f1244a25f8f8e31a32a
-package toml
-
-import (
-	"strings"
-)
-
-// Definition of a TomlTree.
-// This is the result of the parsing of a TOML file.
-type TomlTree map[string]interface{}
-
-// Keys returns the keys of the toplevel tree.
-// Warning: this is a costly operation.
-func (t *TomlTree) Keys() []string {
-	keys := make([]string, 0)
-	mp := (map[string]interface{})(*t)
-	for k, _ := range mp {
-		keys = append(keys, k)
-	}
-	return keys
-}
-
-// Get the value at key in the TomlTree.
-// Key is a dot-separated path (e.g. a.b.c).
-// Returns nil if the path does not exist in the tree.
-func (t *TomlTree) Get(key string) interface{} {
-	subtree := t
-	keys := strings.Split(key, ".")
-	for _, intermediate_key := range keys[:len(keys)-1] {
-		_, exists := (*subtree)[intermediate_key]
-		if !exists {
-			return nil
-		}
-		subtree = (*subtree)[intermediate_key].(*TomlTree)
-	}
-	return (*subtree)[keys[len(keys)-1]]
-}
-
-// Set an element in the tree.
-// Key is a dot-separated path (e.g. a.b.c).
-// Creates all necessary intermediates trees, if needed.
-func (t *TomlTree) Set(key string, value interface{}) {
-	subtree := t
-	keys := strings.Split(key, ".")
-	for _, intermediate_key := range keys[:len(keys)-1] {
-		_, exists := (*subtree)[intermediate_key]
-		if !exists {
-			var new_tree TomlTree = make(TomlTree)
-			(*subtree)[intermediate_key] = &new_tree
-		}
-		subtree = (*subtree)[intermediate_key].(*TomlTree)
-	}
-	(*subtree)[keys[len(keys)-1]] = value
-}
-
-// createSubTree takes a tree and a key andcreate the necessary intermediate
-// subtrees to create a subtree at that point. In-place.
-//
-// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b]
-// and tree[a][b][c]
-func (t *TomlTree) createSubTree(key string) {
-	subtree := t
-	for _, intermediate_key := range strings.Split(key, ".") {
-		_, exists := (*subtree)[intermediate_key]
-		if !exists {
-			var new_tree TomlTree = make(TomlTree)
-			(*subtree)[intermediate_key] = &new_tree
-		}
-		subtree = ((*subtree)[intermediate_key]).(*TomlTree)
-	}
-}
-
-// Create a TomlTree from a string.
-func Load(content string) *TomlTree {
-	_, flow := lex(content)
-	return parse(flow)
-}
diff --git a/src/toml/toml_test.go b/src/toml/toml_test.go
deleted file mode 100644
index f9fa173..0000000
--- a/src/toml/toml_test.go
+++ /dev/null
@@ -1 +0,0 @@
-package toml
