diff --git a/ptrie/fullnode.go b/ptrie/fullnode.go
index d6b0745ec16b101e6a48ba2fdc10189640e255d3..4dd98049d5648e547c635829a04d8422e81c52d0 100644
--- a/ptrie/fullnode.go
+++ b/ptrie/fullnode.go
@@ -23,7 +23,9 @@ func (self *FullNode) Branches() []Node {
 func (self *FullNode) Copy() Node {
 	nnode := NewFullNode(self.trie)
 	for i, node := range self.nodes {
-		nnode.nodes[i] = node
+		if node != nil {
+			nnode.nodes[i] = node
+		}
 	}
 
 	return nnode
@@ -60,7 +62,6 @@ func (self *FullNode) RlpData() interface{} {
 func (self *FullNode) set(k byte, value Node) {
 	if _, ok := value.(*ValueNode); ok && k != 16 {
 		fmt.Println(value, k)
-		panic(":(")
 	}
 
 	self.nodes[int(k)] = value
diff --git a/ptrie/iterator.go b/ptrie/iterator.go
index 5714bdbc8a511b847e47003867feaef87efc517f..787ba09c02b50c5b29f1954dad98f2aad19ced5a 100644
--- a/ptrie/iterator.go
+++ b/ptrie/iterator.go
@@ -14,7 +14,7 @@ type Iterator struct {
 }
 
 func NewIterator(trie *Trie) *Iterator {
-	return &Iterator{trie: trie, Key: []byte{0}}
+	return &Iterator{trie: trie, Key: make([]byte, 32)}
 }
 
 func (self *Iterator) Next() bool {
diff --git a/ptrie/node.go b/ptrie/node.go
index 2c85dbce72869a81382a464f5be480c6dbc7e0cb..ab90a1a021c54ab383e6eb283e4ef7c3b19b9dcf 100644
--- a/ptrie/node.go
+++ b/ptrie/node.go
@@ -17,7 +17,7 @@ type Node interface {
 func (self *ValueNode) String() string            { return self.fstring("") }
 func (self *FullNode) String() string             { return self.fstring("") }
 func (self *ShortNode) String() string            { return self.fstring("") }
-func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%s ", self.data) }
+func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.data) }
 func (self *HashNode) fstring(ind string) string  { return fmt.Sprintf("%x ", self.key) }
 
 // Full node
@@ -36,5 +36,5 @@ func (self *FullNode) fstring(ind string) string {
 
 // Short node
 func (self *ShortNode) fstring(ind string) string {
-	return fmt.Sprintf("[ %s: %v ] ", self.key, self.value.fstring(ind+"  "))
+	return fmt.Sprintf("[ %x: %v ] ", self.key, self.value.fstring(ind+"  "))
 }
diff --git a/ptrie/trie.go b/ptrie/trie.go
index d8135f36ce49eeff615df2221ce26967561e140c..5c83b57d055c67a5adfb86e81c73151e14e3da68 100644
--- a/ptrie/trie.go
+++ b/ptrie/trie.go
@@ -215,7 +215,7 @@ func (self *Trie) get(node Node, key []byte) Node {
 }
 
 func (self *Trie) delete(node Node, key []byte) Node {
-	if len(key) == 0 {
+	if len(key) == 0 && node == nil {
 		return nil
 	}
 
@@ -234,7 +234,9 @@ func (self *Trie) delete(node Node, key []byte) Node {
 				nkey := append(k, child.Key()...)
 				n = NewShortNode(self, nkey, child.Value())
 			case *FullNode:
-				n = NewShortNode(self, node.key, child)
+				sn := NewShortNode(self, node.Key(), child)
+				sn.key = node.key
+				n = sn
 			}
 
 			return n
@@ -275,9 +277,10 @@ func (self *Trie) delete(node Node, key []byte) Node {
 		}
 
 		return nnode
-
+	case nil:
+		return nil
 	default:
-		panic("Invalid node")
+		panic(fmt.Sprintf("%T: invalid node: %v (%v)", node, node, key))
 	}
 }
 
@@ -288,7 +291,10 @@ func (self *Trie) mknode(value *ethutil.Value) Node {
 	case 0:
 		return nil
 	case 2:
-		return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
+		// A value node may consists of 2 bytes.
+		if value.Get(0).Len() != 0 {
+			return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
+		}
 	case 17:
 		fnode := NewFullNode(self)
 		for i := 0; i < l; i++ {
@@ -297,9 +303,9 @@ func (self *Trie) mknode(value *ethutil.Value) Node {
 		return fnode
 	case 32:
 		return &HashNode{value.Bytes()}
-	default:
-		return &ValueNode{self, value.Bytes()}
 	}
+
+	return &ValueNode{self, value.Bytes()}
 }
 
 func (self *Trie) trans(node Node) Node {
@@ -323,3 +329,7 @@ func (self *Trie) store(node Node) interface{} {
 
 	return node.RlpData()
 }
+
+func (self *Trie) PrintRoot() {
+	fmt.Println(self.root)
+}