diff --git a/block.go b/block.go
index f666b09db16382f4bfefcda9482866e349708137..5c089137d5d83c27e873db0464cee038c5177537 100644
--- a/block.go
+++ b/block.go
@@ -3,19 +3,18 @@ package main
 import (
   "fmt"
   "time"
+  _"bytes"
 )
 
 type Block struct {
-  RlpSerializer
-
   number        uint32
   prevHash      string
   uncles        []*Block
   coinbase      string
   // state xxx
-  difficulty    int
+  difficulty    uint32
   time          time.Time
-  nonce         int
+  nonce         uint32
   transactions  []*Transaction
 }
 
@@ -23,6 +22,11 @@ func NewBlock(/* TODO use raw data */transactions []*Transaction) *Block {
   block := &Block{
     // Slice of transactions to include in this block
     transactions: transactions,
+    number: 1,
+    prevHash: "1234",
+    coinbase: "me",
+    difficulty: 10,
+    nonce: 0,
 
     time: time.Now(),
   }
@@ -44,28 +48,77 @@ func (block *Block) MarshalRlp() []byte {
     encTx[i] = string(tx.MarshalRlp())
   }
 
+  /* I made up the block. It should probably contain different data or types. It sole purpose now is testing */
   header := []interface{}{
     block.number,
-    //block.prevHash,
+    block.prevHash,
     // Sha of uncles
-    //block.coinbase,
+    "",
+    block.coinbase,
     // root state
-    //Sha256Bin([]byte(RlpEncode(encTx))),
-    //block.difficulty,
-    //block.time,
-    //block.nonce,
+    "",
+    string(Sha256Bin([]byte(RlpEncode(encTx)))),
+    block.difficulty,
+    block.time.String(),
+    block.nonce,
     // extra?
   }
 
-  return Encode([]interface{}{header, encTx})
+  encoded := Encode([]interface{}{header, encTx})
+
+  return encoded
 }
 
 func (block *Block) UnmarshalRlp(data []byte) {
-  fmt.Printf("%q\n", data)
   t, _ := Decode(data,0)
   if slice, ok := t.([]interface{}); ok {
-    if txes, ok := slice[1].([]interface{}); ok {
-      fmt.Println(txes[0])
+    if header, ok := slice[0].([]interface{}); ok {
+      if number, ok := header[0].(uint8); ok {
+        block.number = uint32(number)
+      }
+
+      if prevHash, ok := header[1].([]byte); ok {
+        block.prevHash = string(prevHash)
+      }
+
+      // sha of uncles is header[2]
+
+      if coinbase, ok := header[3].([]byte); ok {
+        block.coinbase = string(coinbase)
+      }
+
+      // state is header[header[4]
+
+      // sha is header[5]
+
+      // It's either 8bit or 64
+      if difficulty, ok := header[6].(uint8); ok {
+        block.difficulty = uint32(difficulty)
+      }
+      if difficulty, ok := header[6].(uint64); ok {
+        block.difficulty = uint32(difficulty)
+      }
+
+      if time, ok := header[7].([]byte); ok {
+        fmt.Sprintf("Time is: ", string(time))
+      }
+
+      if nonce, ok := header[8].(uint8); ok {
+        block.nonce = uint32(nonce)
+      }
+    }
+
+    if txSlice, ok := slice[1].([]interface{}); ok {
+      block.transactions = make([]*Transaction, len(txSlice))
+
+      for i, tx := range txSlice {
+        if t, ok := tx.([]byte); ok {
+          tx := &Transaction{}
+          tx.UnmarshalRlp(t)
+
+          block.transactions[i] = tx
+        }
+      }
     }
   }
 }
diff --git a/transaction.go b/transaction.go
index cb7edd89cd8b3cac531a48e55e9a7cd5184adfd4..b6e9eaa8f6662dc7ef9180a412460b1ac2d8569d 100644
--- a/transaction.go
+++ b/transaction.go
@@ -34,8 +34,6 @@ var Period3Reward *big.Int = new(big.Int)
 var Period4Reward *big.Int = new(big.Int)
 
 type Transaction struct {
-  RlpSerializer
-
   sender      string
   recipient   string
   value       uint32
@@ -83,7 +81,7 @@ func (tx *Transaction) MarshalRlp() []byte {
     tx.data,
   }
 
-  return []byte(Encode(preEnc))
+  return Encode(preEnc)
 }
 
 func (tx *Transaction) UnmarshalRlp(data []byte) {