diff --git a/rpc/util.go b/rpc/util.go
index 29824bcdb99f302d4e5b4d8466c3f3cd54a1da3b..1939b347493bb073ff703219a8e9aceab0041832 100644
--- a/rpc/util.go
+++ b/rpc/util.go
@@ -84,6 +84,7 @@ type Log struct {
 	Address string   `json:"address"`
 	Topic   []string `json:"topics"`
 	Data    string   `json:"data"`
+	Number  uint64   `json:"number"`
 }
 
 func toLogs(logs state.Logs) (ls []Log) {
@@ -94,6 +95,7 @@ func toLogs(logs state.Logs) (ls []Log) {
 		l.Topic = make([]string, len(log.Topics()))
 		l.Address = toHex(log.Address())
 		l.Data = toHex(log.Data())
+		l.Number = log.Number()
 		for j, topic := range log.Topics() {
 			l.Topic[j] = toHex(topic)
 		}
diff --git a/state/log.go b/state/log.go
index 46360f4aae28208ccd95abdb18baf9de8471d95a..d503bd1a0704484d9c6c056e267dc9e4cc37e1a3 100644
--- a/state/log.go
+++ b/state/log.go
@@ -12,16 +12,19 @@ type Log interface {
 	Address() []byte
 	Topics() [][]byte
 	Data() []byte
+
+	Number() uint64
 }
 
 type StateLog struct {
 	address []byte
 	topics  [][]byte
 	data    []byte
+	number  uint64
 }
 
-func NewLog(address []byte, topics [][]byte, data []byte) *StateLog {
-	return &StateLog{address, topics, data}
+func NewLog(address []byte, topics [][]byte, data []byte, number uint64) *StateLog {
+	return &StateLog{address, topics, data, number}
 }
 
 func (self *StateLog) Address() []byte {
@@ -36,6 +39,10 @@ func (self *StateLog) Data() []byte {
 	return self.data
 }
 
+func (self *StateLog) Number() uint64 {
+	return self.number
+}
+
 func NewLogFromValue(decoder *ethutil.Value) *StateLog {
 	log := &StateLog{
 		address: decoder.Get(0).Bytes(),
diff --git a/vm/environment.go b/vm/environment.go
index 8507e248f864ea06a84d1be8d6c0a2a51541d730..5b4d6c8f0ab8f100d2f374676e617449b9ed007d 100644
--- a/vm/environment.go
+++ b/vm/environment.go
@@ -54,6 +54,7 @@ type Log struct {
 	address []byte
 	topics  [][]byte
 	data    []byte
+	log     uint64
 }
 
 func (self *Log) Address() []byte {
@@ -68,6 +69,10 @@ func (self *Log) Data() []byte {
 	return self.data
 }
 
+func (self *Log) Number() uint64 {
+	return self.log
+}
+
 func (self *Log) RlpData() interface{} {
 	return []interface{}{self.address, ethutil.ByteSliceToInterface(self.topics), self.data}
 }
diff --git a/vm/vm.go b/vm/vm.go
index 5ec507ddc6ba45878ca1ef82c538cd1f9cd0f2ff..b20d7b6030b553a1e6c8b659bf0d325086098fee 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -578,7 +578,7 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
 			}
 
 			data := mem.Get(mStart.Int64(), mSize.Int64())
-			log := &Log{context.Address(), topics, data}
+			log := &Log{context.Address(), topics, data, self.env.BlockNumber().Uint64()}
 			self.env.AddLog(log)
 
 			self.Printf(" => %v", log)