diff --git a/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt b/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt
index 257c6a5353b3a1105073fc78eaffd73215dfd577..d40ceb03ff205e791130888b9f7874905b0375a0 100644
--- a/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt
+++ b/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt
@@ -202,25 +202,27 @@ class ProcessHandle constructor(
     }
 
     private fun publish(contentType: Long, content: ByteArray, lwwElementSet: LWWElementSet?, lwwElement: LWWElement?, references: MutableList<Protocol.Reference>): Pointer {
-        val processState = Store.instance.getProcessState(system, processSecret.process)
-        val event = Event(
-            system,
-            processSecret.process,
-            processState.logicalClock + 1L,
-            contentType,
-            content,
-            Protocol.VectorClock.newBuilder().addAllLogicalClocks(listOf()).build(),
-            lwwElementSet,
-            lwwElement,
-            references,
-            processState.indices!!.toProto(),
-            unixMilliseconds = System.currentTimeMillis()
-        )
-
-        val eventBuffer = event.toProto().toByteArray()
-        val signedEvent = SignedEvent(processSecret.system.sign(eventBuffer), eventBuffer)
-
-        return ingest(signedEvent)
+        synchronized(this) {
+            val processState = Store.instance.getProcessState(system, processSecret.process)
+            val event = Event(
+                system,
+                processSecret.process,
+                processState.logicalClock + 1L,
+                contentType,
+                content,
+                Protocol.VectorClock.newBuilder().addAllLogicalClocks(listOf()).build(),
+                lwwElementSet,
+                lwwElement,
+                references,
+                processState.indices!!.toProto(),
+                unixMilliseconds = System.currentTimeMillis()
+            )
+
+            val eventBuffer = event.toProto().toByteArray()
+            val signedEvent = SignedEvent(processSecret.system.sign(eventBuffer), eventBuffer)
+
+            return ingest(signedEvent)
+        }
     }
 
     fun ingest(signedEvent: SignedEvent): Pointer {
diff --git a/app/src/main/java/com/futo/polycentric/core/Synchronization.kt b/app/src/main/java/com/futo/polycentric/core/Synchronization.kt
index db0b3d878897396ab927dfc843be1a34303b9fa9..dab6c4b8a7a0b7813287bd6f4083efe64ebe6c69 100644
--- a/app/src/main/java/com/futo/polycentric/core/Synchronization.kt
+++ b/app/src/main/java/com/futo/polycentric/core/Synchronization.kt
@@ -27,8 +27,10 @@ class Synchronization {
         }
 
         private fun ingest(processHandle: ProcessHandle, events: Protocol.Events) {
-            for (rawEvent in events.eventsList) {
-                processHandle.ingest(SignedEvent.fromProto(rawEvent))
+            synchronized(processHandle) {
+                for (rawEvent in events.eventsList) {
+                    processHandle.ingest(SignedEvent.fromProto(rawEvent))
+                }
             }
         }
 
@@ -72,8 +74,10 @@ class Synchronization {
         }
 
         fun saveBatch(processHandle: ProcessHandle, events: Protocol.Events) {
-            for (e in events.eventsList) {
-                processHandle.ingest(SignedEvent.fromProto(e))
+            synchronized(processHandle) {
+                for (e in events.eventsList) {
+                    processHandle.ingest(SignedEvent.fromProto(e))
+                }
             }
         }