diff --git a/ethutil/value.go b/ethutil/value.go
index 735a71dbc9339b7fa015f43d05ed94203504e5d4..635683e666b76f2859b7c873f651e3f3ed89683b 100644
--- a/ethutil/value.go
+++ b/ethutil/value.go
@@ -1,7 +1,6 @@
 package ethutil
 
 import (
-	"bytes"
 	"fmt"
 	"math/big"
 	"reflect"
@@ -67,7 +66,8 @@ func (val *Value) Uint() uint64 {
 	} else if Val, ok := val.Val.(uint); ok {
 		return uint64(Val)
 	} else if Val, ok := val.Val.([]byte); ok {
-		return ReadVarint(bytes.NewReader(Val))
+		return new(big.Int).SetBytes(Val).Uint64()
+		//return ReadVarint(bytes.NewReader(Val))
 	} else if Val, ok := val.Val.(*big.Int); ok {
 		return Val.Uint64()
 	}
@@ -207,6 +207,13 @@ func (val *Value) Cmp(o *Value) bool {
 	return reflect.DeepEqual(val.Val, o.Val)
 }
 
+func (self *Value) DeepCmp(o *Value) bool {
+	a := NewValue(self.BigInt())
+	b := NewValue(o.BigInt())
+
+	return a.Cmp(b)
+}
+
 func (val *Value) Encode() []byte {
 	return Encode(val.Val)
 }
@@ -262,6 +269,55 @@ func (val *Value) Append(v interface{}) *Value {
 	return val
 }
 
+const (
+	valOpAdd = iota
+	valOpDiv
+	valOpMul
+	valOpPow
+	valOpSub
+)
+
+// Math stuff
+func (self *Value) doOp(op int, other interface{}) *Value {
+	left := self.BigInt()
+	right := NewValue(other).BigInt()
+
+	switch op {
+	case valOpAdd:
+		self.Val = left.Add(left, right)
+	case valOpDiv:
+		self.Val = left.Div(left, right)
+	case valOpMul:
+		self.Val = left.Mul(left, right)
+	case valOpPow:
+		self.Val = left.Exp(left, right, Big0)
+	case valOpSub:
+		self.Val = left.Sub(left, right)
+	}
+
+	return self
+}
+
+func (self *Value) Add(other interface{}) *Value {
+	return self.doOp(valOpAdd, other)
+}
+
+func (self *Value) Sub(other interface{}) *Value {
+	return self.doOp(valOpSub, other)
+}
+
+func (self *Value) Div(other interface{}) *Value {
+	return self.doOp(valOpDiv, other)
+}
+
+func (self *Value) Mul(other interface{}) *Value {
+	return self.doOp(valOpMul, other)
+}
+
+func (self *Value) Pow(other interface{}) *Value {
+	return self.doOp(valOpPow, other)
+}
+
 type ValueIterator struct {
 	value        *Value
 	currentValue *Value
diff --git a/ethutil/value_test.go b/ethutil/value_test.go
index a100f44bc8e343ae1d69b24eb213d39dfba8d3d4..710cbd8876039b3335f163742f2232a838c78cea 100644
--- a/ethutil/value_test.go
+++ b/ethutil/value_test.go
@@ -63,3 +63,18 @@ func TestIterator(t *testing.T) {
 		i++
 	}
 }
+
+func TestMath(t *testing.T) {
+	a := NewValue(1)
+	a.Add(1).Add(1)
+
+	if !a.DeepCmp(NewValue(3)) {
+		t.Error("Expected 3, got", a)
+	}
+
+	a = NewValue(2)
+	a.Sub(1).Sub(1)
+	if !a.DeepCmp(NewValue(0)) {
+		t.Error("Expected 0, got", a)
+	}
+}