diff --git a/execution/events/event.go b/execution/events/event.go
index e5f7f5edb3773ba0608164d216bd1ebda9b8d93f..5830a1298cbd7894c5cf209fd07880f9eb3570b2 100644
--- a/execution/events/event.go
+++ b/execution/events/event.go
@@ -39,6 +39,27 @@ func (ev *Event) Key() Key {
 	return ev.Header.Key()
 }
 
+// Performs a shallow copy of Event
+func (ev *Event) Copy() *Event {
+	h := *ev.Header
+	evCopy := Event{
+		Header: &h,
+	}
+	if ev.Tx != nil {
+		tx := *ev.Tx
+		evCopy.Tx = &tx
+	}
+	if ev.Call != nil {
+		call := *ev.Call
+		evCopy.Call = &call
+	}
+	if ev.Log != nil {
+		log := *ev.Log
+		evCopy.Log = &log
+	}
+	return &evCopy
+}
+
 func (ev *Event) Encode() ([]byte, error) {
 	return cdc.MarshalBinary(ev)
 }
diff --git a/execution/state.go b/execution/state.go
index 07409c436ab2cdfb3fc03cb7123e316c2213368f..8418c836fdadca65c923fd81b71010451c573e86 100644
--- a/execution/state.go
+++ b/execution/state.go
@@ -321,6 +321,12 @@ func (ws *writeState) Publish(ctx context.Context, msg interface{}, tags event.T
 				ws.state.eventKeyHighWatermark, exeEvent)
 		}
 		ws.state.eventKeyHighWatermark = key
+		if exeEvent.Tx != nil {
+			// Don't serialise the tx (for now) we should normalise and store against tx hash
+			exeEvent = exeEvent.Copy()
+			// The header still contains the tx hash
+			exeEvent.Tx.Tx = nil
+		}
 		bs, err := exeEvent.Encode()
 		if err != nil {
 			return err