diff --git a/daemon/bin/dbus/dbusclient.cpp b/daemon/bin/dbus/dbusclient.cpp
index ffee9a33a59d12aad2f34ac9556d601f79136410..2ec27fccb21f4e6dfb7864cba3637ab8421c5276 100644
--- a/daemon/bin/dbus/dbusclient.cpp
+++ b/daemon/bin/dbus/dbusclient.cpp
@@ -63,8 +63,6 @@ private:
     std::function<void()> callback_;
 };
 
-DBusClient* DBusClient::_lastDbusClient = nullptr;
-
 DBusClient::DBusClient(int sflphFlags, bool persistent) :
     callManager_(nullptr)
     , configurationManager_(nullptr)
@@ -76,6 +74,7 @@ DBusClient::DBusClient(int sflphFlags, bool persistent) :
 #ifdef SFL_VIDEO
     , videoManager_(nullptr)
 #endif
+    , timeout_(nullptr)
 {
     try {
         DBus::_init_threading();
@@ -83,11 +82,9 @@ DBusClient::DBusClient(int sflphFlags, bool persistent) :
 
         // timeout and expired are deleted internally by dispatcher_'s
         // destructor, so we must NOT delete them ourselves.
-        DBus::DefaultTimeout *timeout = new DBus::DefaultTimeout(10 /* ms */,
-                                                                 true,
-                                                                 dispatcher_);
+        timeout_ = new DBus::DefaultTimeout(10 /* ms */, true, dispatcher_);
         // Poll for SIP/IAX events
-        timeout->expired = new EventCallback(sflph_poll_events);
+        timeout_->expired = new EventCallback(sflph_poll_events);
 
         DBus::Connection sessionConnection(DBus::Connection::SessionBus());
         sessionConnection.request_name("org.sflphone.SFLphone");
@@ -140,70 +137,74 @@ DBusClient::~DBusClient()
     delete configurationManager_;
     delete callManager_;
     delete dispatcher_;
-
-    finiLibrary();
 }
 
 int DBusClient::initLibrary(int sflphFlags)
 {
-    if (!_lastDbusClient) {
-        _lastDbusClient = this;
-    }
+    using namespace std::placeholders;
+    using std::bind;
+
+    auto callM = callManager_; // just an alias
 
     // Call event handlers
     sflph_call_ev_handlers callEvHandlers = {
-        callOnStateChange,
-        callOnTransferFail,
-        callOnTransferSuccess,
-        callOnRecordPlaybackStopped,
-        callOnVoiceMailNotify,
-        callOnIncomingMessage,
-        callOnIncomingCall,
-        callOnRecordPlaybackFilepath,
-        callOnConferenceCreated,
-        callOnConferenceChanged,
-        callOnUpdatePlaybackScale,
-        callOnConferenceRemove,
-        callOnNewCall,
-        callOnSipCallStateChange,
-        callOnRecordStateChange,
-        callOnSecureSdesOn,
-        callOnSecureSdesOff,
-        callOnSecureZrtpOn,
-        callOnSecureZrtpOff,
-        callOnShowSas,
-        callOnZrtpNotSuppOther,
-        callOnZrtpNegotiationFail,
-        callOnRtcpReceiveReport,
+        bind(&DBusCallManager::callStateChanged, callM, _1, _2),
+        bind(&DBusCallManager::transferFailed, callM),
+        bind(&DBusCallManager::transferSucceeded, callM),
+        bind(&DBusCallManager::recordPlaybackStopped, callM, _1),
+        bind(&DBusCallManager::voiceMailNotify, callM, _1, _2),
+        bind(&DBusCallManager::incomingMessage, callM, _1, _2, _3),
+        bind(&DBusCallManager::incomingCall, callM, _1, _2, _3),
+        bind(&DBusCallManager::recordPlaybackFilepath, callM, _1, _2),
+        bind(&DBusCallManager::conferenceCreated, callM, _1),
+        bind(&DBusCallManager::conferenceChanged, callM, _1, _2),
+        bind(&DBusCallManager::updatePlaybackScale, callM, _1, _2, _3),
+        bind(&DBusCallManager::conferenceRemoved, callM, _1),
+        bind(&DBusCallManager::newCallCreated, callM, _1, _2, _3),
+        bind(&DBusCallManager::sipCallStateChanged, callM, _1, _2, _3),
+        bind(&DBusCallManager::recordingStateChanged, callM, _1, _2),
+        bind(&DBusCallManager::secureSdesOn, callM, _1),
+        bind(&DBusCallManager::secureSdesOff, callM, _1),
+        bind(&DBusCallManager::secureZrtpOn, callM, _1, _2),
+        bind(&DBusCallManager::secureZrtpOff, callM, _1),
+        bind(&DBusCallManager::showSAS, callM, _1, _2, _3),
+        bind(&DBusCallManager::zrtpNotSuppOther, callM, _1),
+        bind(&DBusCallManager::zrtpNegotiationFailed, callM, _1, _2, _3),
+        bind(&DBusCallManager::onRtcpReportReceived, callM, _1, _2)
     };
 
+    auto confM = configurationManager_; // just an alias
+
     // Configuration event handlers
     sflph_config_ev_handlers configEvHandlers = {
-        configOnVolumeChange,
-        configOnAccountsChange,
-        configOnHistoryChange,
-        configOnStunStatusFail,
-        configOnRegistrationStateChange,
-        configOnSipRegistrationStateChange,
-        configOnError,
+        bind(&DBusConfigurationManager::volumeChanged, confM, _1, _2),
+        bind(&DBusConfigurationManager::accountsChanged, confM),
+        bind(&DBusConfigurationManager::historyChanged, confM),
+        bind(&DBusConfigurationManager::stunStatusFailure, confM, _1),
+        bind(&DBusConfigurationManager::registrationStateChanged, confM, _1, _2),
+        bind(&DBusConfigurationManager::sipRegistrationStateChanged, confM, _1, _2, _3),
+        bind(&DBusConfigurationManager::errorAlert, confM, _1),
     };
 
 #ifdef SFL_PRESENCE
+    auto presM = presenceManager_;
     // Presence event handlers
     sflph_pres_ev_handlers presEvHandlers = {
-        presOnNewServerSubscriptionRequest,
-        presOnServerError,
-        presOnNewBuddyNotification,
-        presOnSubscriptionStateChange,
+        bind(&DBusPresenceManager::newServerSubscriptionRequest, presM, _1),
+        bind(&DBusPresenceManager::serverError, presM, _1, _2, _3),
+        bind(&DBusPresenceManager::newBuddyNotification, presM, _1, _2, _3, _4),
+        bind(&DBusPresenceManager::subscriptionStateChanged, presM, _1, _2, _3)
     };
 #endif // SFL_PRESENCE
 
 #ifdef SFL_VIDEO
+    auto videoM = videoManager_;
+
     // Video event handlers
     sflph_video_ev_handlers videoEvHandlers = {
-        videoOnDeviceEvent,
-        videoOnStartDecoding,
-        videoOnStopDecoding,
+        bind(&DBusVideoManager::deviceEvent, videoM),
+        bind(&DBusVideoManager::startedDecoding, videoM, _1, _2, _3, _4, _5),
+        bind(&DBusVideoManager::stoppedDecoding, videoM, _1, _2, _3)
     };
 #endif // SFL_VIDEO
 
@@ -247,11 +248,10 @@ int DBusClient::event_loop()
 
 int DBusClient::exit()
 {
-    // Avoid libsflphone events from now on
-    _lastDbusClient = nullptr;
-
     try {
         dispatcher_->leave();
+        timeout_->expired = new EventCallback([] {});
+        finiLibrary();
     } catch (const DBus::Error &err) {
         std::cerr << "quitting: " << err.name() << ": " << err.what() << std::endl;
         return 1;
@@ -262,290 +262,3 @@ int DBusClient::exit()
 
     return 0;
 }
-
-DBusCallManager* DBusClient::getCallManager()
-{
-    return callManager_;
-}
-
-DBusConfigurationManager* DBusClient::getConfigurationManager()
-{
-    return configurationManager_;
-}
-
-#ifdef SFL_PRESENCE
-DBusPresenceManager* DBusClient::getPresenceManager()
-{
-    return presenceManager_;
-}
-#endif
-
-#ifdef SFL_VIDEO
-DBusVideoManager* DBusClient::getVideoManager()
-{
-    return videoManager_;
-}
-#endif
-
-void DBusClient::callOnStateChange(const std::string& call_id, const std::string& state)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->callStateChanged(call_id, state);
-    }
-}
-
-void DBusClient::callOnTransferFail(void)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->transferFailed();
-    }
-}
-
-void DBusClient::callOnTransferSuccess(void)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->transferSucceeded();
-    }
-}
-
-void DBusClient::callOnRecordPlaybackStopped(const std::string& path)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->recordPlaybackStopped(path);
-    }
-}
-
-void DBusClient::callOnVoiceMailNotify(const std::string& call_id, int nd_msg)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->voiceMailNotify(call_id, nd_msg);
-    }
-}
-
-void DBusClient::callOnIncomingMessage(const std::string& id, const std::string& from, const std::string& msg)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->incomingMessage(id, from, msg);
-    }
-}
-
-void DBusClient::callOnIncomingCall(const std::string& account_id, const std::string& call_id, const std::string& from)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->incomingCall(account_id, call_id, from);
-    }
-}
-
-void DBusClient::callOnRecordPlaybackFilepath(const std::string& id, const std::string& filename)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->recordPlaybackFilepath(id, filename);
-    }
-}
-
-void DBusClient::callOnConferenceCreated(const std::string& conf_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->conferenceCreated(conf_id);
-    }
-}
-
-void DBusClient::callOnConferenceChanged(const std::string& conf_id, const std::string& state)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->conferenceChanged(conf_id, state);
-    }
-}
-
-void DBusClient::callOnUpdatePlaybackScale(const std::string& filepath, int position, int scale)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->updatePlaybackScale(filepath, position, scale);
-    }
-}
-
-void DBusClient::callOnConferenceRemove(const std::string& conf_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->conferenceRemoved(conf_id);
-    }
-}
-
-void DBusClient::callOnNewCall(const std::string& account_id, const std::string& call_id, const std::string& to)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->newCallCreated(account_id, call_id, to);
-    }
-}
-
-void DBusClient::callOnSipCallStateChange(const std::string& call_id, const std::string& state, int code)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->sipCallStateChanged(call_id, state, code);
-    }
-}
-
-void DBusClient::callOnRecordStateChange(const std::string& call_id, int state)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->recordingStateChanged(call_id, state);
-    }
-}
-
-void DBusClient::callOnSecureSdesOn(const std::string& call_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->secureSdesOn(call_id);
-    }
-}
-
-void DBusClient::callOnSecureSdesOff(const std::string& call_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->secureSdesOff(call_id);
-    }
-}
-
-void DBusClient::callOnSecureZrtpOn(const std::string& call_id, const std::string& cipher)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->secureZrtpOn(call_id, cipher);
-    }
-}
-
-void DBusClient::callOnSecureZrtpOff(const std::string& call_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->secureZrtpOff(call_id);
-    }
-}
-
-void DBusClient::callOnShowSas(const std::string& call_id, const std::string& sas, int verified)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->showSAS(call_id, sas, verified);
-    }
-}
-
-void DBusClient::callOnZrtpNotSuppOther(const std::string& call_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->zrtpNotSuppOther(call_id);
-    }
-}
-
-void DBusClient::callOnZrtpNegotiationFail(const std::string& call_id, const std::string& reason, const std::string& severity)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->zrtpNegotiationFailed(call_id, reason, severity);
-    }
-}
-
-void DBusClient::callOnRtcpReceiveReport(const std::string& call_id, const std::map<std::string, int>& stats)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getCallManager()->onRtcpReportReceived(call_id, stats);
-    }
-}
-
-void DBusClient::configOnVolumeChange(const std::string& device, int value)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->volumeChanged(device, value);
-    }
-}
-
-void DBusClient::configOnAccountsChange(void)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->accountsChanged();
-    }
-}
-
-void DBusClient::configOnHistoryChange(void)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->historyChanged();
-    }
-}
-
-void DBusClient::configOnStunStatusFail(const std::string& account_id)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->stunStatusFailure(account_id);
-    }
-}
-
-void DBusClient::configOnRegistrationStateChange(const std::string& account_id, int state)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->registrationStateChanged(account_id, state);
-    }
-}
-
-void DBusClient::configOnSipRegistrationStateChange(const std::string& account_id, const std::string& state, int code)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->sipRegistrationStateChanged(account_id, state, code);
-    }
-}
-
-void DBusClient::configOnError(int alert)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getConfigurationManager()->errorAlert(alert);
-    }
-}
-
-#ifdef SFL_PRESENCE
-void DBusClient::presOnNewServerSubscriptionRequest(const std::string& remote)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getPresenceManager()->newServerSubscriptionRequest(remote);
-    }
-}
-
-void DBusClient::presOnServerError(const std::string& account_id, const std::string& error, const std::string& msg)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getPresenceManager()->serverError(account_id, error, msg);
-    }
-}
-
-void DBusClient::presOnNewBuddyNotification(const std::string& account_id, const std::string& buddy_uri, int status, const std::string& line_status)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getPresenceManager()->newBuddyNotification(account_id, buddy_uri, status, line_status);
-    }
-}
-
-void DBusClient::presOnSubscriptionStateChange(const std::string& account_id, const std::string& buddy_uri, int state)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getPresenceManager()->subscriptionStateChanged(account_id, buddy_uri, state);
-    }
-}
-#endif // SFL_PRESENCE
-
-#ifdef SFL_VIDEO
-void DBusClient::videoOnDeviceEvent(void)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getVideoManager()->deviceEvent();
-    }
-}
-
-void DBusClient::videoOnStartDecoding(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getVideoManager()->startedDecoding(id, shm_path, w, h, is_mixer);
-    }
-}
-
-void DBusClient::videoOnStopDecoding(const std::string& id, const std::string& shm_path, bool is_mixer)
-{
-    if (_lastDbusClient) {
-        _lastDbusClient->getVideoManager()->stoppedDecoding(id, shm_path, is_mixer);
-    }
-}
-#endif // SFL_VIDEO
diff --git a/daemon/bin/dbus/dbusclient.h b/daemon/bin/dbus/dbusclient.h
index 3cc3685678dd3a139cf82c41e3e487b18af998ed..abd7ae5e4e211df8c1a6d2384aba1bf95255f878 100644
--- a/daemon/bin/dbus/dbusclient.h
+++ b/daemon/bin/dbus/dbusclient.h
@@ -48,6 +48,7 @@ class DBusVideoManager;
 
 namespace DBus {
     class BusDispatcher;
+    class DefaultTimeout;
 }
 
 class DBusClient {
@@ -55,72 +56,14 @@ class DBusClient {
         DBusClient(int sflphFlags, bool persistent);
         ~DBusClient();
 
-        DBusCallManager* getCallManager();
-        DBusConfigurationManager* getConfigurationManager();
-
-#ifdef SFL_PRESENCE
-        DBusPresenceManager* getPresenceManager();
-#endif
-
-#ifdef SFL_VIDEO
-        DBusVideoManager* getVideoManager();
-#endif
-
         int event_loop();
         int exit();
 
     private:
+
         int initLibrary(int sflphFlags);
         void finiLibrary();
 
-    private:
-        static DBusClient* _lastDbusClient;
-
-        static void callOnStateChange(const std::string& call_id, const std::string& state);
-        static void callOnTransferFail(void);
-        static void callOnTransferSuccess(void);
-        static void callOnRecordPlaybackStopped(const std::string& path);
-        static void callOnVoiceMailNotify(const std::string& call_id, int nd_msg);
-        static void callOnIncomingMessage(const std::string& id, const std::string& from, const std::string& msg);
-        static void callOnIncomingCall(const std::string& account_id, const std::string& call_id, const std::string& from);
-        static void callOnRecordPlaybackFilepath(const std::string& id, const std::string& filename);
-        static void callOnConferenceCreated(const std::string& conf_id);
-        static void callOnConferenceChanged(const std::string& conf_id, const std::string& state);
-        static void callOnUpdatePlaybackScale(const std::string& filepath, int position, int scale);
-        static void callOnConferenceRemove(const std::string& conf_id);
-        static void callOnNewCall(const std::string& account_id, const std::string& call_id, const std::string& to);
-        static void callOnSipCallStateChange(const std::string& call_id, const std::string& state, int code);
-        static void callOnRecordStateChange(const std::string& call_id, int state);
-        static void callOnSecureSdesOn(const std::string& call_id);
-        static void callOnSecureSdesOff(const std::string& call_id);
-        static void callOnSecureZrtpOn(const std::string& call_id, const std::string& cipher);
-        static void callOnSecureZrtpOff(const std::string& call_id);
-        static void callOnShowSas(const std::string& call_id, const std::string& sas, int verified);
-        static void callOnZrtpNotSuppOther(const std::string& call_id);
-        static void callOnZrtpNegotiationFail(const std::string& call_id, const std::string& reason, const std::string& severity);
-        static void callOnRtcpReceiveReport(const std::string& call_id, const std::map<std::string, int>& stats);
-        static void configOnVolumeChange(const std::string& device, int value);
-        static void configOnAccountsChange(void);
-        static void configOnHistoryChange(void);
-        static void configOnStunStatusFail(const std::string& account_id);
-        static void configOnRegistrationStateChange(const std::string& account_id, int state);
-        static void configOnSipRegistrationStateChange(const std::string& account_id, const std::string& state, int code);
-        static void configOnError(int alert);
-
-#ifdef SFL_PRESENCE
-        static void presOnNewServerSubscriptionRequest(const std::string& remote);
-        static void presOnServerError(const std::string& account_id, const std::string& error, const std::string& msg);
-        static void presOnNewBuddyNotification(const std::string& account_id, const std::string& buddy_uri, int status, const std::string& line_status);
-        static void presOnSubscriptionStateChange(const std::string& account_id, const std::string& buddy_uri, int state);
-#endif // SFL_PRESENCE
-
-#ifdef SFL_VIDEO
-        static void videoOnDeviceEvent(void);
-        static void videoOnStartDecoding(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer);
-        static void videoOnStopDecoding(const std::string& id, const std::string& shm_path, bool is_mixer);
-#endif // SFL_VIDEO
-
-    private:
         DBusCallManager*          callManager_;
         DBusConfigurationManager* configurationManager_;
 
@@ -134,6 +77,7 @@ class DBusClient {
 #ifdef SFL_VIDEO
         DBusVideoManager *videoManager_;
 #endif
+        DBus::DefaultTimeout *timeout_;
 };
 
 #endif
diff --git a/daemon/bin/main.cpp b/daemon/bin/main.cpp
index 70943daec0b01a72cb0da34b29e807fc060d92c6..9d01b01d62eb2d155a97f4b3a542c9db5143fcbf 100644
--- a/daemon/bin/main.cpp
+++ b/daemon/bin/main.cpp
@@ -147,23 +147,15 @@ static void interrupt()
 
 static void signal_handler(int code)
 {
+    std::cerr << "Caught signal " << strsignal(code)
+				  << ", terminating..." << std::endl;
+
 	// Unset signal handlers
 	signal(SIGHUP, SIG_DFL);
 	signal(SIGINT, SIG_DFL);
 	signal(SIGTERM, SIG_DFL);
 
-	// Stop manager in new thread since we don't know what
-	// this handler is interrupting (e.g. a mutex might be held in the
-	// interrupted function)
-	std::thread th([code] {
-		interrupt();
-		std::cerr << "Caught signal " << strsignal(code)
-				  << ", terminating..." << std::endl;
-	});
-
-	// Detach thread and leave signal handler so that interrupted thread
-	// can continue
-	th.detach();
+    interrupt();
 }
 
 int main(int argc, char *argv [])
diff --git a/daemon/src/sflphone.h b/daemon/src/sflphone.h
index 8d703b326e6a31126e407a27a37cefd32a645022..0ab75af99b5a4b3c2adadc4e2e20f02848940ae8 100644
--- a/daemon/src/sflphone.h
+++ b/daemon/src/sflphone.h
@@ -35,6 +35,7 @@
 #endif
 
 #include <vector>
+#include <functional>
 #include <string>
 #include <map>
 
@@ -45,60 +46,60 @@ sflph_version();
 #ifdef SFL_PRESENCE
 struct sflph_pres_ev_handlers
 {
-    void (*on_new_server_subscription_request)(const std::string& remote);
-    void (*on_server_error)(const std::string& account_id, const std::string& error, const std::string& msg);
-    void (*on_new_buddy_notification)(const std::string& account_id, const std::string& buddy_uri, int status, const std::string& line_status);
-    void (*on_subscription_state_change)(const std::string& account_id, const std::string& buddy_uri, int state);
+    std::function<void (const std::string& /*remote*/)> on_new_server_subscription_request;
+    std::function<void (const std::string& /*account_id*/, const std::string& /*error*/, const std::string& /*msg*/)> on_server_error;
+    std::function<void (const std::string& /*account_id*/, const std::string& /*buddy_uri*/, int /*status*/, const std::string& /*line_status*/)> on_new_buddy_notification;
+    std::function<void (const std::string& /*account_id*/, const std::string& /*buddy_uri*/, int /*state*/)> on_subscription_state_change;
 };
 #endif /* SFL_PRESENCE */
 
 /* configuration events */
 struct sflph_config_ev_handlers
 {
-    void (*on_volume_change)(const std::string& device, int value);
-    void (*on_accounts_change)(void);
-    void (*on_history_change)(void);
-    void (*on_stun_status_fail)(const std::string& account_id);
-    void (*on_registration_state_change)(const std::string& account_id, int state);
-    void (*on_sip_registration_state_change)(const std::string& account_id, const std::string& state, int code);
-    void (*on_error)(int alert);
+    std::function<void (const std::string& /*device*/, int /*value*/)> on_volume_change;
+    std::function<void ()> on_accounts_change;
+    std::function<void ()> on_history_change;
+    std::function<void (const std::string& /*account_id*/)> on_stun_status_fail;
+    std::function<void (const std::string& /*account_id*/, int /*state*/)> on_registration_state_change;
+    std::function<void (const std::string& /*account_id*/, const std::string& /*state*/, int /*code*/)> on_sip_registration_state_change;
+    std::function<void (int /*alert*/)> on_error;
 };
 
 /* call events */
 struct sflph_call_ev_handlers
 {
-    void (*on_state_change)(const std::string& call_id, const std::string& state);
-    void (*on_transfer_fail)(void);
-    void (*on_transfer_success)(void);
-    void (*on_record_playback_stopped)(const std::string& path);
-    void (*on_voice_mail_notify)(const std::string& call_id, int nd_msg);
-    void (*on_incoming_message)(const std::string& id, const std::string& from, const std::string& msg);
-    void (*on_incoming_call)(const std::string& account_id, const std::string& call_id, const std::string& from);
-    void (*on_record_playback_filepath)(const std::string& id, const std::string& filename);
-    void (*on_conference_created)(const std::string& conf_id);
-    void (*on_conference_changed)(const std::string& conf_id, const std::string& state);
-    void (*on_update_playback_scale)(const std::string& filepath, int position, int scale);
-    void (*on_conference_remove)(const std::string& conf_id);
-    void (*on_new_call)(const std::string& account_id, const std::string& call_id, const std::string& to);
-    void (*on_sip_call_state_change)(const std::string& call_id, const std::string& state, int code);
-    void (*on_record_state_change)(const std::string& call_id, int state);
-    void (*on_secure_sdes_on)(const std::string& call_id);
-    void (*on_secure_sdes_off)(const std::string& call_id);
-    void (*on_secure_zrtp_on)(const std::string& call_id, const std::string& cipher);
-    void (*on_secure_zrtp_off)(const std::string& call_id);
-    void (*on_show_sas)(const std::string& call_id, const std::string& sas, int verified);
-    void (*on_zrtp_not_supp_other)(const std::string& call_id);
-    void (*on_zrtp_negotiation_fail)(const std::string& call_id, const std::string& reason, const std::string& severity);
-    void (*on_rtcp_receive_report)(const std::string& call_id, const std::map<std::string, int>& stats);
+    std::function<void (const std::string& /*call_id*/, const std::string& /*state*/)> on_state_change;
+    std::function<void ()> on_transfer_fail;
+    std::function<void ()> on_transfer_success;
+    std::function<void (const std::string& /*path*/)> on_record_playback_stopped;
+    std::function<void (const std::string& /*call_id*/, int /*nd_msg*/)> on_voice_mail_notify;
+    std::function<void (const std::string& /*id*/, const std::string& /*from*/, const std::string& /*msg*/)> on_incoming_message;
+    std::function<void (const std::string& /*account_id*/, const std::string& /*call_id*/, const std::string& /*from*/)> on_incoming_call;
+    std::function<void (const std::string& /*id*/, const std::string& /*filename*/)> on_record_playback_filepath;
+    std::function<void (const std::string& /*conf_id*/)> on_conference_created;
+    std::function<void (const std::string& /*conf_id*/, const std::string& /*state*/)> on_conference_changed;
+    std::function<void (const std::string& /*filepath*/, int /*position*/, int /*scale*/)> on_update_playback_scale;
+    std::function<void (const std::string& /*conf_id*/)> on_conference_remove;
+    std::function<void (const std::string& /*account_id*/, const std::string& /*call_id*/, const std::string& /*to*/)> on_new_call;
+    std::function<void (const std::string& /*call_id*/, const std::string& /*state*/, int /*code*/)> on_sip_call_state_change;
+    std::function<void (const std::string& /*call_id*/, int /*state*/)> on_record_state_change;
+    std::function<void (const std::string& /*call_id*/)> on_secure_sdes_on;
+    std::function<void (const std::string& /*call_id*/)> on_secure_sdes_off;
+    std::function<void (const std::string& /*call_id*/, const std::string& /*cipher*/)> on_secure_zrtp_on;
+    std::function<void (const std::string& /*call_id*/)> on_secure_zrtp_off;
+    std::function<void (const std::string& /*call_id*/, const std::string& /*sas*/, int /*verified*/)> on_show_sas;
+    std::function<void (const std::string& /*call_id*/)> on_zrtp_not_supp_other;
+    std::function<void (const std::string& /*call_id*/, const std::string& /*reason*/, const std::string& /*severity*/)> on_zrtp_negotiation_fail;
+    std::function<void (const std::string& /*call_id*/, const std::map<std::string, int>& /*stats*/)> on_rtcp_receive_report;
 };
 
 /* video events */
 #ifdef SFL_VIDEO
 struct sflph_video_ev_handlers
 {
-    void (*on_device_event)(void);
-    void (*on_start_decoding)(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer);
-    void (*on_stop_decoding)(const std::string& id, const std::string& shm_path, bool is_mixer);
+    std::function<void ()> on_device_event;
+    std::function<void (const std::string& /*id*/, const std::string& /*shm_path*/, int /*w*/, int /*h*/, bool /*is_mixer*/)> on_start_decoding;
+    std::function<void (const std::string& /*id*/, const std::string& /*shm_path*/, bool /*is_mixer*/)> on_stop_decoding;
 };
 #endif /* SFL_VIDEO */