diff --git a/include/villas/hook.hpp b/include/villas/hook.hpp
index 2d1b95a97..22617dea2 100644
--- a/include/villas/hook.hpp
+++ b/include/villas/hook.hpp
@@ -79,18 +79,7 @@ public:
 	virtual ~Hook();
 
 	virtual void parse(json_t *c);
-	virtual void prepare();
-
-	void prepare(struct vlist *sigs)
-	{
-		int ret;
-
-		ret = signal_list_copy(&signals, sigs);
-		if (ret)
-			throw RuntimeError("Failed to copy signal list");
-
-		prepare();
-	}
+	void prepare(struct vlist *sigs);
 
 	/** Called whenever a hook is started; before threads are created. */
 	virtual void start()
@@ -115,6 +104,9 @@ public:
 		state = State::CHECKED;
 	}
 
+	virtual void prepare()
+	{ }
+
 	/** Called periodically. Period is set by global 'stats' option in the configuration file. */
 	virtual void periodic()
 	{
diff --git a/lib/hook.cpp b/lib/hook.cpp
index 5c8829f14..cefaa95b2 100644
--- a/lib/hook.cpp
+++ b/lib/hook.cpp
@@ -65,10 +65,18 @@ Hook::~Hook()
 	ret = signal_list_destroy(&signals);
 }
 
-void Hook::prepare()
+void Hook::prepare(struct vlist *sigs)
 {
+	int ret;
+
 	assert(state == State::CHECKED);
 
+	ret = signal_list_copy(&signals, sigs);
+	if (ret)
+		throw RuntimeError("Failed to copy signal list");
+
+	prepare();
+
 	state = State::PREPARED;
 }