diff --git a/src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java b/src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d944d51cfd05c80084d9b73dba062883f657d38
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java
@@ -0,0 +1,16 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class AfterFullUpdateEvent<E extends Entity> extends AfterUpdateEvent<E> {
+	private final E oldEntity;
+
+	public AfterFullUpdateEvent(final Object source, final E entity, final E oldEntity) {
+		super(source, entity);
+		this.oldEntity = oldEntity;
+	}
+
+	public E getOldEntity() {
+		return oldEntity;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
index 4b73660d36aef3cb763d09f099dbc81535c8a700..847bca9e9396ed56d3c244ed5eecf41bc9484e78 100644
--- a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
@@ -2,8 +2,17 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
+import java.util.Map;
+
 public class AfterPatchEvent<E extends Entity> extends AfterUpdateEvent<E> {
-	public AfterPatchEvent(final Object source, final E entity) {
+	private final Map<String, Object> changes;
+
+	public AfterPatchEvent(final Object source, final E entity, final Map<String, Object> changes) {
 		super(source, entity);
+		this.changes = changes;
+	}
+
+	public Map<String, Object> getChanges() {
+		return changes;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
index 702173630447bc819fe8bf66771a64c56e8b584d..7920b79d220fc72ce48543d3d9997fdaebb65035 100644
--- a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
@@ -2,7 +2,7 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
-public class AfterUpdateEvent<E extends Entity> extends CrudEvent<E> {
+public abstract class AfterUpdateEvent<E extends Entity> extends CrudEvent<E> {
 	public AfterUpdateEvent(final Object source, final E entity) {
 		super(source, entity);
 	}
diff --git a/src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java b/src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..8514163395a1679925eecc3dd48c42f76fe0fbbe
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java
@@ -0,0 +1,16 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class BeforeFullUpdateEvent<E extends Entity> extends BeforeUpdateEvent<E> {
+	private final E oldEntity;
+
+	public BeforeFullUpdateEvent(final Object source, final E entity, final E oldEntity) {
+		super(source, entity);
+		this.oldEntity = oldEntity;
+	}
+
+	public E getOldEntity() {
+		return oldEntity;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
index 82eee8540dd42629a35834dbb7f365e962599fb5..717d14f98f82b781bb3152d842947248380064a3 100644
--- a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
@@ -2,8 +2,17 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
+import java.util.Map;
+
 public class BeforePatchEvent<E extends Entity> extends BeforeUpdateEvent<E> {
-	public BeforePatchEvent(final Object source, final E entity) {
+	private final Map<String, Object> changes;
+
+	public BeforePatchEvent(final Object source, final E entity, final Map<String, Object> changes) {
 		super(source, entity);
+		this.changes = changes;
+	}
+
+	public Map<String, Object> getChanges() {
+		return changes;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
index 65fc96e1009ca9a1423fbe596049af898124617f..f5964dce95cff6844548cbb79cecd531cec26d43 100644
--- a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
@@ -2,7 +2,7 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
-public class BeforeUpdateEvent<E extends Entity> extends CrudEvent<E> {
+public abstract class BeforeUpdateEvent<E extends Entity> extends CrudEvent<E> {
 	public BeforeUpdateEvent(final Object source, final E entity) {
 		super(source, entity);
 	}
diff --git a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
index e2f2d0272238cc58ce9adad3c6612c20dc755f05..114c0be1039794d74902a8a5d1f07539dbdab92a 100644
--- a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
@@ -22,12 +22,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectReader;
 import de.thm.arsnova.event.AfterCreationEvent;
 import de.thm.arsnova.event.AfterDeletionEvent;
+import de.thm.arsnova.event.AfterFullUpdateEvent;
 import de.thm.arsnova.event.AfterPatchEvent;
-import de.thm.arsnova.event.AfterUpdateEvent;
 import de.thm.arsnova.event.BeforeCreationEvent;
 import de.thm.arsnova.event.BeforeDeletionEvent;
+import de.thm.arsnova.event.BeforeFullUpdateEvent;
 import de.thm.arsnova.event.BeforePatchEvent;
-import de.thm.arsnova.event.BeforeUpdateEvent;
 import de.thm.arsnova.model.Entity;
 import de.thm.arsnova.model.serialization.View;
 import de.thm.arsnova.persistence.CrudRepository;
@@ -130,9 +130,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		newEntity.setUpdateTimestamp(new Date());
 
 		prepareUpdate(newEntity);
-		eventPublisher.publishEvent(new BeforeUpdateEvent<>(this, newEntity));
+		eventPublisher.publishEvent(new BeforeFullUpdateEvent<>(this, newEntity, oldEntity));
 		final T updatedEntity = repository.save(newEntity);
-		eventPublisher.publishEvent(new AfterUpdateEvent<>(this, updatedEntity));
+		eventPublisher.publishEvent(new AfterFullUpdateEvent<>(this, updatedEntity, oldEntity));
 		finalizeUpdate(updatedEntity);
 
 		return updatedEntity;
@@ -171,9 +171,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		reader.readValue(tree);
 		entity.setUpdateTimestamp(new Date());
 		preparePatch(entity);
-		eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity));
+		eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity, changes));
 		final T patchedEntity = repository.save(entity);
-		eventPublisher.publishEvent(new AfterPatchEvent<>(this, patchedEntity));
+		eventPublisher.publishEvent(new AfterPatchEvent<>(this, patchedEntity, changes));
 
 		return patchedEntity;
 	}
@@ -194,7 +194,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			reader.readValue(tree);
 			entity.setUpdateTimestamp(new Date());
 			preparePatch(entity);
-			eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity));
+			eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity, changes));
 		}
 
 		return repository.saveAll(entities);