diff --git a/CMakeLists.txt b/CMakeLists.txt
index a7945e95a85ed3aac9df1cbc69d3e796eecc01a5..2b676ebcefaf09b418753fff9f9e41f57c89fda0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,6 +117,13 @@ set(COMMON_HEADERS
     ${SRC_DIR}/qtutils.h
     ${SRC_DIR}/utilsadapter.h)
 
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(LIBNM libnm)
+
+if(LIBNM_FOUND)
+    add_definitions(-DUSE_LIBNM)
+endif()
+
 find_package(Qt5 CONFIG REQUIRED
     Core
     Quick
@@ -130,7 +137,10 @@ find_package(Qt5 CONFIG REQUIRED
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}
     ${SRC_DIR}
     ${LRC}/include/libringclient
-    ${LRC}/include)
+    ${LRC}/include
+    ${LIBNM_INCLUDE_DIRS})
+
+link_libraries(${LIBNM_LIBRARIES})
 
 add_executable(${PROJECT_NAME}
     ${SRC_DIR}/main.cpp
@@ -139,13 +149,13 @@ add_executable(${PROJECT_NAME}
     ${QML_RESOURCES}
     ${QML_RESOURCES_QML})
 
-# alternative: link_directories(${LRC}/lib)
 find_library(ringclient ringclient ${LRC}/lib NO_DEFAULT_PATH)
 find_library(qrencode qrencode)
 
 target_link_libraries(jami-qt
     ${QML_LIBS}
     ${ringclient}
-    ${qrencode})
+    ${qrencode}
+)
 
 add_subdirectory(tests)
diff --git a/jami-qt.pro b/jami-qt.pro
index 842d012980abdd3184c2da2137039f9b44603279..15cbafc36c5da6939e80ae3baee8401fc9974949 100644
--- a/jami-qt.pro
+++ b/jami-qt.pro
@@ -105,10 +105,17 @@ unix {
     LIBS += -lqrencode
     LIBS += -lX11
 
+    CONFIG += link_pkgconfig
+    PKGCONFIG += libnm
+
     isEmpty(PREFIX) { PREFIX = /tmp/$${TARGET}/bin }
     target.path = $$PREFIX/bin
     INSTALLS += target
 
+    packagesExist(libnm) {
+        DEFINES += USE_LIBNM
+    }
+
     # unix specific
     HEADERS += \
                src/xrectsel.h
diff --git a/src/connectivitymonitor.cpp b/src/connectivitymonitor.cpp
index 014faa4fc3dcd967c942c6523f4a28eef4493664..0fffff947dfa3abdaf8d17bb31d19baa04efb878 100644
--- a/src/connectivitymonitor.cpp
+++ b/src/connectivitymonitor.cpp
@@ -16,10 +16,15 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#ifndef _WIN32
+#include <glib.h>
+#include <NetworkManager.h>
+#endif
+
 #include "connectivitymonitor.h"
+#include <QDebug>
 
 #ifdef Q_OS_WIN
-#include <QDebug>
 #include <atlbase.h>
 #include <netlistmgr.h>
 
@@ -158,4 +163,78 @@ ConnectivityMonitor::~ConnectivityMonitor()
     destroy();
     CoUninitialize();
 }
+
+#else
+
+#ifdef USE_LIBNM
+static void
+logConnectionInfo(NMActiveConnection *connection)
+{
+    if (connection) {
+        qDebug() << "primary network connection:"
+                 << nm_active_connection_get_uuid(connection)
+                 << "default: "
+                 << (nm_active_connection_get_default(connection) ? "yes" : "no");
+    } else {
+        qWarning() << "no primary network connection detected, check network settings";
+    }
+}
+
+static void
+primaryConnectionChanged(NMClient *nm, GParamSpec*, ConnectivityMonitor * cm)
+{
+    auto connection = nm_client_get_primary_connection(nm);
+    logConnectionInfo(connection);
+    cm->connectivityChanged();
+}
+
+static void
+nmClientCallback(G_GNUC_UNUSED GObject *source_object,
+                 GAsyncResult *result,
+                 ConnectivityMonitor * cm)
+{
+    GError* error = nullptr;
+    if (auto nm_client = nm_client_new_finish(result, &error)) {
+        qDebug() << "NetworkManager client initialized, version: "
+                 << nm_client_get_version(nm_client)
+                 << ", daemon running:"
+                 << (nm_client_get_nm_running(nm_client) ? "yes" : "no")
+                 << ", networking enabled:"
+                 << (nm_client_networking_get_enabled(nm_client) ? "yes" : "no");
+
+        auto connection = nm_client_get_primary_connection(nm_client);
+        logConnectionInfo(connection);
+        g_signal_connect(nm_client, "notify::active-connections",
+                         G_CALLBACK(primaryConnectionChanged), cm);
+
+    } else {
+        qWarning() << "error initializing NetworkManager client: "
+                   << error->message;
+        g_clear_error(&error);
+    }
+}
+#endif
+
+ConnectivityMonitor::ConnectivityMonitor(QObject* parent)
+    : QObject(parent)
+{
+
+    GCancellable * cancellable = g_cancellable_new();
+#ifdef USE_LIBNM
+    nm_client_new_async(cancellable, (GAsyncReadyCallback)nmClientCallback, this);
+#endif
+}
+
+ConnectivityMonitor::~ConnectivityMonitor()
+{
+    qDebug() << "Destroying connectivity monitor";
+}
+
+
+bool
+ConnectivityMonitor::isOnline()
+{
+    return false;
+}
+
 #endif // Q_OS_WIN
diff --git a/src/connectivitymonitor.h b/src/connectivitymonitor.h
index f746669e8750d59aa9f755911aa7053c3ead88a9..11fd9fe0b56920e20ccb3c59a964b6e9b0877168 100644
--- a/src/connectivitymonitor.h
+++ b/src/connectivitymonitor.h
@@ -44,20 +44,18 @@ private:
 };
 
 #else
-// Dummy implementation for non-Windows platforms.
 // TODO: platform implementations should be in the daemon.
 
-// clang-format off
 class ConnectivityMonitor final : public QObject
 {
     Q_OBJECT
 public:
-    explicit ConnectivityMonitor(QObject* parent = 0) : QObject(parent) {};
-    ~ConnectivityMonitor() = default;
+    explicit ConnectivityMonitor(QObject* parent = 0);
+    ~ConnectivityMonitor();
+
+    bool isOnline();
 
-    bool isOnline() { return false; };
 signals:
     void connectivityChanged();
 };
-// clang-format on
 #endif // Q_OS_WIN
diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp
index 9739c606d02e4cca8cecfa597a19f4bae9111c22..6b7b365a2283328116b9ad4893b1d544e46668e5 100644
--- a/src/mainapplication.cpp
+++ b/src/mainapplication.cpp
@@ -148,11 +148,9 @@ MainApplication::init()
 
     initLrc(results[opts::UPDATEURL].toString(), connectivityMonitor_);
 
-#ifdef Q_OS_WIN
     connect(connectivityMonitor_, &ConnectivityMonitor::connectivityChanged, [] {
         LRCInstance::connectivityChanged();
     });
-#endif // Q_OS_WIN
 
     QObject::connect(
         &LRCInstance::instance(),