diff --git a/qthing/include/qthing/callback.hpp b/qthing/include/qthing/callback.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..288607d12070759e1a9a8c7dfd87acf1b99be87a
--- /dev/null
+++ b/qthing/include/qthing/callback.hpp
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <functional>
+
+namespace qthing {
+
+template <typename... Args>
+class Callback {
+ private:
+  using CallbackType = std::function<void(Args...)>;
+  mutable CallbackType callback = NULL;
+
+ public:
+  Callback(){};
+
+  void add(CallbackType newCallback) const {
+    if (callback == NULL) {
+      callback = newCallback;
+    } else {
+      auto oldCallback = callback;
+      callback = [newCallback, oldCallback](Args&&... args) {
+        oldCallback(std::forward<Args>(args)...);
+        newCallback(std::forward<Args>(args)...);
+      };
+    }
+  }
+
+  void operator()(Args&&... args) const {
+    if (callback != NULL) {
+      callback(std::forward<Args>(args)...);
+    }
+  }
+};
+
+}  // namespace qthing