diff --git a/daemon/configure.ac b/daemon/configure.ac
index 1b96591123dd7026fe48263450609a3a781a8110..77778b09c699a7a90784598ae1209dd399fa8add 100644
--- a/daemon/configure.ac
+++ b/daemon/configure.ac
@@ -224,9 +224,12 @@ AC_ARG_WITH([dbus],
     [with_dbus=yes])
 AS_IF([test "x$with_dbus" = "xyes"], [
        PKG_CHECK_MODULES(DBUSCPP, dbus-c++-1,, AC_MSG_WARN([Missing dbus development files]))
+       AC_CONFIG_FILES([src/client/dbus/Makefile \
+                        doc/dbus-api/Makefile])
     ]);
 
 AC_DEFINE_UNQUOTED([HAVE_DBUS], `if test "x$with_dbus" = "xyes"; then echo 1; else echo 0; fi`, [Define if you have dbus support])
+AM_CONDITIONAL(USE_DBUS, test "x$with_dbus" = "xyes" )
 
 # Instant Messaging
 # required dependency(ies): libxpat
@@ -416,7 +419,6 @@ AC_CONFIG_FILES([Makefile \
                  src/audio/codecs/Makefile \
                  src/config/Makefile \
                  src/client/Makefile \
-                 src/client/dbus/Makefile \
                  src/hooks/Makefile \
                  src/history/Makefile \
                  src/video/Makefile \
@@ -425,7 +427,6 @@ AC_CONFIG_FILES([Makefile \
                  ringtones/Makefile \
                  man/Makefile \
                  doc/Makefile \
-                 doc/dbus-api/Makefile \
                  doc/doxygen/Makefile])
 
 # Go!
diff --git a/daemon/src/client/Makefile.am b/daemon/src/client/Makefile.am
index 0b0f066c8523e21f43bd06f7a90218ccf060f4cb..6708dc215b551390a01bd6dcb0a02484a1d897eb 100644
--- a/daemon/src/client/Makefile.am
+++ b/daemon/src/client/Makefile.am
@@ -8,20 +8,31 @@ noinst_HEADERS = callmanager.h           \
 
 if SFL_PRESENCE
 PRESENCE_SRC = presencemanager.cpp
+PRESENCE_STUB = presencemanager_stub.cpp
 noinst_HEADERS += presencemanager.h
 endif
 
 if SFL_VIDEO
+VIDEO_STUB = videocontrols_stub.cpp
 noinst_HEADERS += video_controls.h
 endif
 
+if USE_DBUS
 SUBDIRS=dbus
 
 libclient_la_LIBADD = dbus/libclient_dbus.la
+else
+STUB_SRC = client.cpp                      \
+           callmanager_stub.cpp            \
+           configurationmanager_stub.cpp   \
+           $(PRESENCE_STUB)                \
+           $(VIDEO_STUB)
+endif
 
 libclient_la_SOURCES = callmanager.cpp           \
                        configurationmanager.cpp  \
-                       $(PRESENCE_SRC)
+                       $(PRESENCE_SRC)           \
+                       $(STUB_SRC)
 
 libclient_la_CXXFLAGS = -I./ \
                         -DPREFIX=\"$(prefix)\" \
diff --git a/daemon/src/client/callmanager.h b/daemon/src/client/callmanager.h
index 49543bbfe5ee87262c4527d0c2d4e39675955aec..312710a9d3dbf3987cf9fef0103b480d5086887a 100644
--- a/daemon/src/client/callmanager.h
+++ b/daemon/src/client/callmanager.h
@@ -150,8 +150,9 @@ class CallManager
         void sendTextMessage(const std::string& callID, const std::string& message);
         void sendTextMessage(const std::string& callID, const std::string& message, const std::string& from);
 
-#ifdef __ANDROID__
-        // signals must be implemented manually for Android
+        /* the following signals must be implemented manually for any
+         * platform or configuration that does not supply dbus */
+#if !HAVE_DBUS
         void callStateChanged(const std::string& callID, const std::string& state);
 
         void transferFailed();
@@ -187,7 +188,8 @@ class CallManager
         void zrtpNegotiationFailed(const std::string& callID, const std::string& arg2, const std::string& arg3);
 
         void onRtcpReportReceived(const std::string& callID, const std::map<std::string, int>& stats);
-#endif // __ANDROID__
+#endif // !HAVE_DBUS
+
 private:
 
 #if HAVE_ZRTP
diff --git a/daemon/src/client/configurationmanager.h b/daemon/src/client/configurationmanager.h
index 632f4481521f62497b5e700b29bf6cdbc3bb3e38..cd962521dddb9538e67711eabaea4d3157069ed3 100644
--- a/daemon/src/client/configurationmanager.h
+++ b/daemon/src/client/configurationmanager.h
@@ -169,10 +169,11 @@ class ConfigurationManager
         bool checkCertificateValidity(const std::string& pemPath);
         bool checkHostnameCertificate(const std::string& certificatePath, const  std::string& host, const std::string& port);
 
-#ifdef __ANDROID__
+        /* the following signals must be implemented manually for any
+         * platform or configuration that does not supply dbus */
+#if !HAVE_DBUS
         void volumeChanged(const std::string& device, const int& value);
 
-        // signals must be implemented manually for Android
         void accountsChanged();
 
         void historyChanged();
@@ -184,7 +185,7 @@ class ConfigurationManager
         void errorAlert(const int& alert);
 
 	std::vector< int32_t > getHardwareAudioFormat();
-#endif  // __ANDROID__
+#endif  // !HAVE_DBUS
 };
 
 #endif //CONFIGURATIONMANAGER_H
diff --git a/daemon/src/client/presencemanager.h b/daemon/src/client/presencemanager.h
index d615706cb2c67511f0e9c9c2aff2b5c5dca34089..3aaaaed17b7e10e14f9a715e2f9557dbce2d3056 100644
--- a/daemon/src/client/presencemanager.h
+++ b/daemon/src/client/presencemanager.h
@@ -76,14 +76,16 @@ class PresenceManager
         PresenceManager();
 #endif
 
-#ifdef __ANDROID__
+    /* the following signals must be implemented manually for any
+     * platform or configuration that does not supply dbus */
+#if !HAVE_DBUS
     void newServerSubscriptionRequest(const std::string& remote);
     void serverError(const std::string& accountID, const std::string& error, const std::string& msg);
     void newBuddyNotification(const std::string& accountID, const std::string& buddyUri,
                               const bool& status, const std::string& lineStatus);
     void subscriptionStateChanged(const std::string& accountID, const std::string& buddyUri,
                               const bool& state);
-#endif //__ANDROID__
+#endif // !HAVE_DBUS
 
     /* Presence subscription/Notification. */
     void publish(const std::string& accountID, const bool& status, const std::string& note);
diff --git a/daemon/src/client/video_controls.h b/daemon/src/client/video_controls.h
index 614078bce9b813d17703239dd0d6489c35abcf0c..518239a449f68b4692effe0a7a8b51204ae06dd2 100644
--- a/daemon/src/client/video_controls.h
+++ b/daemon/src/client/video_controls.h
@@ -60,9 +60,13 @@
 #include "video/video_base.h"
 #include "video/video_input_selector.h"
 
-class VideoControls : public org::sflphone::SFLphone::VideoControls_adaptor,
+class VideoControls
+#if HAVE_DBUS
+    : public org::sflphone::SFLphone::VideoControls_adaptor,
     public DBus::IntrospectableAdaptor,
-    public DBus::ObjectAdaptor {
+    public DBus::ObjectAdaptor
+#endif
+{
     private:
         std::shared_ptr<sfl_video::VideoInputSelector> videoInputSelector_;
         VideoPreference videoPreference_;
@@ -70,8 +74,11 @@ class VideoControls : public org::sflphone::SFLphone::VideoControls_adaptor,
         int inputClients_; // XXX necessary with the videoInputSelector_?
 
     public:
-
+#if HAVE_DBUS
         VideoControls(DBus::Connection& connection);
+#else
+        VideoControls();
+#endif
         VideoPreference &getVideoPreferences();
 
         std::vector<std::map<std::string, std::string> >
@@ -131,6 +138,14 @@ class VideoControls : public org::sflphone::SFLphone::VideoControls_adaptor,
         bool switchInput(const std::string& resource);
         bool hasCameraStarted();
         std::weak_ptr<sfl_video::VideoFrameActiveWriter> getVideoCamera();
+
+        /* the following signals must be implemented manually for any
+         * platform or configuration that does not supply dbus */
+#if !HAVE_DBUS
+        void deviceEvent();
+        void startedDecoding(const std::string &id, const std::string, int w, int h);
+        void stoppedDecoding(const std::string &id, const std::string);
+#endif // !HAVE_DBUS
 };
 
 #endif // VIDEO_CONTROLS_H_