Index: src/0dev.org/commands/mtf/main.go
==================================================================
--- src/0dev.org/commands/mtf/main.go
+++ src/0dev.org/commands/mtf/main.go
@@ -1,58 +1,44 @@
 package main
 
 import (
+	fib "0dev.org/encoding/fibonacci"
 	mtf "0dev.org/encoding/mtf"
 	iou "0dev.org/ioutil"
 	"flag"
-	"fmt"
 	"io"
 	"os"
 )
 
 func main() {
-	d := flag.Bool("d", false, "Use to toggle decode mode")
-	flag.Parse()
-
-	var code int
-	if *d {
-		code = decode(os.Stdout, os.Stdin)
-	} else {
-		code = encode(os.Stdout, os.Stdin)
-	}
-
-	os.Exit(code)
-}
-
-// Transforms the data according to the move-to-front algorithm
-// I/O is buffered for better performance
-func encode(output io.Writer, input io.Reader) int {
-	var (
-		err     error
-		encoder io.Reader = mtf.Encoder(iou.SizedReader(input, 4096))
-	)
-
-	_, err = io.Copy(output, encoder)
-	if err != nil {
-		fmt.Fprintln(os.Stderr, "Error while encoding.\n", err)
-		return 1
-	}
-
-	return 0
-}
-
-// Reverses MTF`ed data and writes back the original bytes
-// I/O is buffered for better performance
-func decode(output io.Writer, input io.Reader) int {
-	var (
-		err     error
-		decoder io.Reader = mtf.Decoder(iou.SizedReader(input, 4096))
-	)
-
-	_, err = io.Copy(output, decoder)
-	if err != nil {
-		fmt.Fprintln(os.Stderr, "Error while decoding.\n", err)
-		return 1
-	}
-
-	return 0
+	d := flag.Bool("d", false, "Toggle decode mode.")
+	flag.Parse()
+
+	var (
+		input  io.Reader = iou.SizedReader(os.Stdin, 4096)
+		output io.Writer = iou.SizedWriter(os.Stdout, 4096)
+		code   int
+	)
+
+	// Exit handler
+	defer func() {
+		os.Exit(code)
+	}()
+
+	// Flush the output buffer
+	defer output.Write(nil)
+
+	if *d {
+		input = mtf.Decoder(fib.Decoder(input))
+	} else {
+		input = mtf.Encoder(input)
+
+		// Encode output as fibonacci integers
+		output = fib.Encoder(output)
+		defer output.Write(nil)
+	}
+
+	if _, err := io.Copy(output, input); err != nil {
+		os.Stderr.WriteString("Error while transforming data.\n" + err.Error())
+		code = 1
+	}
 }

Index: src/0dev.org/encoding/mtf/mtf_test.go
==================================================================
--- src/0dev.org/encoding/mtf/mtf_test.go
+++ src/0dev.org/encoding/mtf/mtf_test.go
@@ -25,58 +25,5 @@
 		EqualFunc: func(i, j int) bool { return data[i] == processed[j] }})
 	if len(delta.Added) > 0 || len(delta.Removed) > 0 {
 		t.Error("Differences detected ", delta)
 	}
 }
-
-// func TestEncoder(t *testing.T) {
-// 	var (
-// 		input    []byte = []byte{1, 1, 0, 0}
-// 		expected []byte = []byte{1, 0, 1, 0}
-
-// 		buffer  bytes.Buffer
-// 		encoder io.Writer = Encoder(&buffer)
-// 	)
-
-// 	count, err := encoder.Write(input)
-// 	if count != len(input) {
-// 		t.Error("Unexpected write count from encoder", count)
-// 	}
-// 	if err != nil {
-// 		t.Error("Unexpected write error from encoder", err)
-// 	}
-
-// 	output := buffer.Bytes()
-
-// 	// Diff the output against the expected result
-// 	delta := diff.Diff(diff.D{Len1: len(expected), Len2: len(output),
-// 		EqualFunc: func(i, j int) bool { return expected[i] == output[j] }})
-// 	if len(delta.Added) > 0 || len(delta.Removed) > 0 {
-// 		t.Error("Differences detected ", delta)
-// 	}
-// }
-
-// func TestDecoder(t *testing.T) {
-// 	var (
-// 		input    []byte = []byte{1, 0, 1, 0}
-// 		expected []byte = []byte{1, 1, 0, 0}
-// 		output   []byte = make([]byte, 4)
-
-// 		reader  *bytes.Reader = bytes.NewReader(input)
-// 		decoder io.Reader     = Decoder(reader)
-// 	)
-
-// 	count, err := decoder.Read(output)
-// 	if count != len(output) {
-// 		t.Error("Unexpected read count from decoder", count)
-// 	}
-// 	if err != nil {
-// 		t.Error("Unexpected read error from decoder", err)
-// 	}
-
-// 	// Diff the output against the expected result
-// 	delta := diff.Diff(diff.D{Len1: len(expected), Len2: len(output),
-// 		EqualFunc: func(i, j int) bool { return expected[i] == output[j] }})
-// 	if len(delta.Added) > 0 || len(delta.Removed) > 0 {
-// 		t.Error("Differences detected ", delta)
-// 	}
-// }