diff --git a/client/handlers/main.yml b/client/handlers/main.yml
index 021071dcacc56accaf4ec141c24ffb7d5ac33735..68bca17bb37bcd546ecc12ba4f9921ae4e746fdf 100644
--- a/client/handlers/main.yml
+++ b/client/handlers/main.yml
@@ -6,3 +6,10 @@
 
 - name: restart sddm
   service: name=sddm state=restarted
+
+- name: reload systemd service files
+  systemd: daemon_reload=yes
+
+- name: restart networkd
+  service: name=systemd-networkd state=restarted
+
diff --git a/client/tasks/network.yml b/client/tasks/network.yml
new file mode 100644
index 0000000000000000000000000000000000000000..55ba1f9695f182b8fc2bc98284bf54a880917338
--- /dev/null
+++ b/client/tasks/network.yml
@@ -0,0 +1,53 @@
+---
+
+- name: ensure networkd has a valid configuration
+  template:
+    src: 20-wired.network.j2
+    dest: /etc/systemd/network/20-wired.network
+    owner: root
+    group: root
+    mode: 0644
+  notify:
+    - reload systemd service files
+    - restart networkd
+
+- meta: flush_handlers
+
+- name: ensure networkd is enabled and running
+  service:
+    name: systemd-networkd
+    state: started
+    enabled: yes
+
+- name: ensure legacy methods are disabled
+  service:
+    name: "{{ item }}"
+    state: stopped
+    enabled: no
+  with_items:
+    - "ifup@"
+    - "networking"
+
+- name: ensure we wait for network to be online
+  service:
+    name: systemd-networkd-wait-online
+    enabled: yes
+
+- name: ensure ansible's copy module does not bullshit us
+  file:
+    path: /etc/systemd/system/sddm.service.d
+    state: directory
+    owner: root
+    group: root
+    mode: 0644
+
+- name: ensure sddm waits for network to be online
+  copy:
+    src: sddm-override.conf
+    dest: /etc/systemd/system/sddm.service.d/network.conf
+    owner: root
+    group: root
+    mode: 0644
+  notify:
+    - reload systemd service files
+
diff --git a/client/templates/20-wired.network.j2 b/client/templates/20-wired.network.j2
new file mode 100644
index 0000000000000000000000000000000000000000..020f88170fac52615c749786f8683c6f2a61fdb2
--- /dev/null
+++ b/client/templates/20-wired.network.j2
@@ -0,0 +1,5 @@
+[Match]
+Name={{ ansible_default_ipv4.interface }}
+
+[Network]
+DHCP=ipv4