diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index bd45016bff..4bdf4e261d 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -62,6 +62,7 @@
 #include "event.h"
 #include "memory.h"
 #include "stream.h"
+#include "hooks.h"
 #ifdef HAVE_AVAHI
 # include "mdns.h"
 #endif
@@ -199,6 +200,7 @@ enum {
     VIR_DAEMON_ERR_PRIVS,
     VIR_DAEMON_ERR_NETWORK,
     VIR_DAEMON_ERR_CONFIG,
+    VIR_DAEMON_ERR_HOOKS,
 
     VIR_DAEMON_ERR_LAST
 };
@@ -212,7 +214,8 @@ VIR_ENUM_IMPL(virDaemonErr, VIR_DAEMON_ERR_LAST,
               "Unable to setup signal handlers",
               "Unable to drop privileges",
               "Unable to initialize network sockets",
-              "Unable to load configuration file")
+              "Unable to load configuration file",
+              "Unable to look for hook scripts")
 
 static void sig_handler(int sig, siginfo_t * siginfo,
                         void* context ATTRIBUTE_UNUSED) {
@@ -378,8 +381,11 @@ qemudDispatchSignalEvent(int watch ATTRIBUTE_UNUSED,
     switch (siginfo.si_signo) {
     case SIGHUP:
         VIR_INFO0(_("Reloading configuration on SIGHUP"));
+        virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
+                    VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL);
         if (virStateReload() < 0)
             VIR_WARN0(_("Error while reloading drivers"));
+
         break;
 
     case SIGINT:
@@ -3143,9 +3149,23 @@ int main(int argc, char **argv) {
         goto error;
     }
 
+    /* setup the hooks if any */
+    if (virHookInitialize()) {
+        ret = VIR_DAEMON_ERR_HOOKS;
+        goto error;
+    }
+
     /* Disable error func, now logging is setup */
     virSetErrorFunc(NULL, virshErrorHandler);
 
+    /*
+     * Call the daemon startup hook
+     * TODO: should we abort the daemon startup if the script returned
+     *       an error ?
+     */
+    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_START,
+                0, "start", NULL);
+
     if (qemudNetworkInit(server) < 0) {
         ret = VIR_DAEMON_ERR_NETWORK;
         goto error;
@@ -3206,6 +3226,9 @@ shutdown:
     }
     pthread_join(server->eventThread, NULL);
 
+    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
+                0, "shutdown", NULL);
+
 error:
     if (statuswrite != -1) {
         if (ret != 0) {