diff --git a/CMakeLists.txt b/CMakeLists.txt
index de35c507c..f3752eaf2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,19 @@ ELSE()
     target_link_libraries(Hyprland xcb)
 ENDIF(NO_XWAYLAND MATCHES true)
 
+IF(NO_SYSTEMD MATCHES true)
+    message(STATUS "SYSTEMD support is disabled...")
+ELSE()
+    message(STATUS "SYSTEMD support is requested (NO_SYSTEMD not defined) checking deps...")
+    pkg_check_modules(LIBSYSTEMD libsystemd)
+    IF(LIBSYSTEMD_FOUND)
+        add_definitions( -DUSES_SYSTEMD )
+        target_link_libraries(Hyprland "${LIBSYSTEMD_LIBRARIES}")
+    ELSE()
+        message(WARNING "Systemd support requested but libsystemd was not found")
+    ENDIF(LIBSYSTEMD_FOUND)
+ENDIF(NO_SYSTEMD MATCHES true)
+
 target_compile_definitions(Hyprland PRIVATE "-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
 target_compile_definitions(Hyprland PRIVATE "-DGIT_BRANCH=\"${GIT_BRANCH}\"")
 target_compile_definitions(Hyprland PRIVATE "-DGIT_COMMIT_MESSAGE=\"${GIT_COMMIT_MESSAGE}\"")
diff --git a/example/hyprland.service b/example/hyprland.service
new file mode 100644
index 000000000..1ff479bbb
--- /dev/null
+++ b/example/hyprland.service
@@ -0,0 +1,12 @@
+; a primitive systemd --user example
+[Unit]
+Description = %p
+BindsTo     = graphical-session.target
+Upholds     = swaybg@333333.service
+
+[Service]
+Type            = notify
+ExecStart       = /usr/bin/Hyprland
+
+[Install]
+WantedBy = default.target
diff --git a/example/swaybg@.service b/example/swaybg@.service
new file mode 100644
index 000000000..0636625de
--- /dev/null
+++ b/example/swaybg@.service
@@ -0,0 +1,13 @@
+; a primitive systemd --user example
+; see example/hyprland.service for more details
+[Unit]
+Description = %p
+BindsTo     = hyprland.service
+Wants       = hyprland.service
+After       = hyprland.service
+
+[Service]
+ExecStart = /usr/bin/swaybg --color #%i
+
+[Install]
+WantedBy = default.target
diff --git a/meson.build b/meson.build
index 3ca2b5782..73c84abf0 100644
--- a/meson.build
+++ b/meson.build
@@ -50,6 +50,16 @@ if not have_xwayland
 add_project_arguments('-DNO_XWAYLAND', language: 'cpp')
 endif
 
+systemd_dep = dependency('libsystemd', required: get_option('systemd'))
+
+if get_option('systemd').enabled() 
+  if systemd_dep.found()
+        add_project_arguments('-DUSES_SYSTEMD', language: 'cpp')
+  else 
+	error('Cannot enable systemd in Hyprland: libsystemd was not found')
+  endif
+endif
+
 if get_option('buildtype') == 'debug'
   add_project_arguments('-DHYPRLAND_DEBUG', language: 'cpp')
 endif
diff --git a/meson_options.txt b/meson_options.txt
index d34c61704..e8e2b0620 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1 +1,2 @@
 option('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications')
+option('systemd', type: 'feature', value: 'auto', description: 'Enable systemd integration')
diff --git a/nix/default.nix b/nix/default.nix
index 042fbfe71..8cd0350ff 100644
--- a/nix/default.nix
+++ b/nix/default.nix
@@ -16,6 +16,7 @@
   mesa,
   mount,
   pciutils,
+  systemd,
   wayland,
   wayland-protocols,
   wayland-scanner,
@@ -27,6 +28,7 @@
   hidpiXWayland ? true,
   legacyRenderer ? false,
   nvidiaPatches ? false,
+  withSystemd ? true,
   version ? "git",
 }: let
   assertXWayland = lib.assertMsg (hidpiXWayland -> enableXWayland) ''
@@ -73,7 +75,8 @@ in
           pciutils
           (wlroots.override {inherit enableXWayland hidpiXWayland nvidiaPatches;})
         ]
-        ++ lib.optionals enableXWayland [libxcb xcbutilwm xwayland];
+        ++ lib.optionals enableXWayland [libxcb xcbutilwm xwayland]
+        ++ lib.optionals withSystemd [systemd];
 
       mesonBuildType =
         if debug
@@ -83,6 +86,7 @@ in
       mesonFlags = builtins.concatLists [
         (lib.optional (!enableXWayland) "-Dxwayland=disabled")
         (lib.optional legacyRenderer "-DLEGACY_RENDERER:STRING=true")
+        (lib.optional withSystemd "-Dsystemd=enabled")
       ];
 
       patches = [
@@ -90,8 +94,8 @@ in
         ./meson-build.patch
       ];
 
-      # Fix hardcoded paths to /usr installation
       postPatch = ''
+        # Fix hardcoded paths to /usr installation
         sed -i "s#/usr#$out#" src/render/OpenGL.cpp
 
         # for some reason rmdir doesn't work in a dirty tree
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 2c9ad5031..b60d70d7c 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -2,6 +2,9 @@
 #include "helpers/Splashes.hpp"
 #include <random>
 #include "debug/HyprCtl.hpp"
+#ifdef USES_SYSTEMD
+#include <systemd/sd-daemon.h> // for sd_notify
+#endif
 
 int handleCritSignal(int signo, void* data) {
     Debug::log(LOG, "Hyprland received signal %d", signo);
@@ -384,6 +387,15 @@ void CCompositor::startCompositor() {
 
     wlr_xcursor_manager_set_cursor_image(m_sWLRXCursorMgr, "left_ptr", m_sWLRCursor);
 
+#ifdef USES_SYSTEMD
+    if (sd_booted() > 0)
+        // tell systemd that we are ready so it can start other bond, following, related units
+        sd_notify(0, "READY=1");
+   else
+        Debug::log(LOG, "systemd integration is baked in but system itself is not booted à la systemd!");
+#endif
+
+
     // This blocks until we are done.
     Debug::log(LOG, "Hyprland is ready, running the event loop!");
     wl_display_run(m_sWLDisplay);
diff --git a/src/main.cpp b/src/main.cpp
index 5b56944e7..7d1353baa 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -4,6 +4,9 @@
 #include "config/ConfigManager.hpp"
 #include "init/initHelpers.hpp"
 #include <iostream>
+#ifdef USES_SYSTEMD
+#include <systemd/sd-daemon.h> // for sd_notify
+#endif
 
 int main(int argc, char** argv) {
 
@@ -66,6 +69,12 @@ int main(int argc, char** argv) {
     // If we are here it means we got yote.
     Debug::log(LOG, "Hyprland reached the end.");
 
+#ifdef USES_SYSTEMD
+    // tell systemd it destroy bound/related units
+    if (sd_booted() > 0)
+       sd_notify(0, "STOPPING=1");
+#endif
+
     wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
 
     // kill all clients
diff --git a/src/meson.build b/src/meson.build
index a8fa7cfc7..d7b1ec229 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -14,6 +14,7 @@ executable('Hyprland', src,
     dependency('xkbcommon'),
     dependency('libinput'),
     xcb_dep,
+    systemd_dep,
 
     dependency('pixman-1'),
     dependency('gl', 'opengl'),
diff --git a/subprojects/wlroots b/subprojects/wlroots
index b28a9afd4..dc7cc98cf 160000
--- a/subprojects/wlroots
+++ b/subprojects/wlroots
@@ -1 +1 @@
-Subproject commit b28a9afd4b0b86e9a66a40f6b44b69f59947b7d6
+Subproject commit dc7cc98cf21a8dc19ab8895505500e3700646af0