diff --git a/main/commons/pom.xml b/main/commons/pom.xml
index b2e8b1bf3..08fb094ed 100644
--- a/main/commons/pom.xml
+++ b/main/commons/pom.xml
@@ -12,5 +12,12 @@
commons
Cryptomator common
Shared utilities
+
+
+
+ org.cryptomator
+ commons-test
+
+
diff --git a/main/commons/src/main/java/org/cryptomator/common/Holder.java b/main/commons/src/main/java/org/cryptomator/common/Holder.java
new file mode 100644
index 000000000..f147ea3e6
--- /dev/null
+++ b/main/commons/src/main/java/org/cryptomator/common/Holder.java
@@ -0,0 +1,34 @@
+package org.cryptomator.common;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+public class Holder implements Supplier, Consumer {
+
+ private final V initial;
+
+ private V value;
+
+ public Holder(W initial) {
+ this.initial = initial;
+ reset();
+ }
+
+ public V get() {
+ return value;
+ }
+
+ public void set(V value) {
+ this.value = value;
+ }
+
+ public void reset() {
+ set(initial);
+ }
+
+ @Override
+ public void accept(V value) {
+ set(value);
+ }
+
+}
diff --git a/main/commons/src/test/java/org/cryptomator/common/HolderTest.java b/main/commons/src/test/java/org/cryptomator/common/HolderTest.java
new file mode 100644
index 000000000..ad71e866f
--- /dev/null
+++ b/main/commons/src/test/java/org/cryptomator/common/HolderTest.java
@@ -0,0 +1,42 @@
+package org.cryptomator.common;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class HolderTest {
+
+ private static final Object INITIAL = new Object();
+ private static final Object VALUE = new Object();
+
+ private Holder