diff --git a/systemd/patches/0001-build-sys-Detect-whether-struct-statx-is-defined-in-.patch b/systemd/patches/0001-build-sys-Detect-whether-struct-statx-is-defined-in-.patch
new file mode 100644
index 000000000..5a2cf2372
--- /dev/null
+++ b/systemd/patches/0001-build-sys-Detect-whether-struct-statx-is-defined-in-.patch
@@ -0,0 +1,105 @@
+From 75720bff62a84896e9a0654afc7cf9408cf89a38 Mon Sep 17 00:00:00 2001
+From: Filipe Brandenburger <filbranden@google.com>
+Date: Sun, 15 Jul 2018 22:43:35 -0700
+Subject: [PATCH] build-sys: Detect whether struct statx is defined in
+ sys/stat.h
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Starting with glibc 2.27.9000-36.fc29, include file sys/stat.h will have a
+definition for struct statx, in which case include file linux/stat.h should be
+avoided, in order to prevent a duplicate definition.
+
+    In file included from ../src/basic/missing.h:18,
+		     from ../src/basic/util.h:28,
+		     from ../src/basic/hashmap.h:10,
+		     from ../src/shared/bus-util.h:12,
+		     from ../src/libsystemd/sd-bus/bus-creds.c:11:
+    /usr/include/linux/stat.h:99:8: error: redefinition of ‘struct statx’
+     struct statx {
+	    ^~~~~
+    In file included from /usr/include/sys/stat.h:446,
+		     from ../src/basic/util.h:19,
+		     from ../src/basic/hashmap.h:10,
+		     from ../src/shared/bus-util.h:12,
+		     from ../src/libsystemd/sd-bus/bus-creds.c:11:
+    /usr/include/bits/statx.h:36:8: note: originally defined here
+     struct statx
+	    ^~~~~
+
+Extend our meson.build to look for struct statx when only sys/stat.h is
+included and, in that case, do not include linux/stat.h anymore.
+
+Tested that systemd builds correctly when using a glibc version that includes a
+definition for struct statx.
+
+glibc Fedora RPM update:
+https://src.fedoraproject.org/rpms/glibc/c/28cb5d31fc1e5887912283c889689c47076278ae
+
+glibc upstream commit:
+https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=fd70af45528d59a00eb3190ef6706cb299488fcd
+---
+ meson.build            | 5 +++++
+ src/basic/missing.h    | 5 ++++-
+ src/basic/xattr-util.c | 1 -
+ 3 files changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index dd904c7148..68423bdfa5 100644
+--- a/meson.build
++++ b/meson.build
+@@ -425,6 +425,7 @@ decl_headers = '''
+ #include <sys/stat.h>
+ '''
+ # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
++# FIXME: these should use -D_GNU_SOURCE, since that is defined at build time
+ 
+ foreach decl : ['char16_t',
+                 'char32_t',
+@@ -439,6 +440,10 @@ foreach decl : ['char16_t',
+         conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
+ endforeach
+ 
++conf.set10('HAVE_STRUCT_STATX_IN_SYS_STAT_H', cc.sizeof('struct statx', prefix : '''
++#include <sys/stat.h>
++''', args : '-D_GNU_SOURCE') > 0)
++
+ foreach decl : [['IFLA_INET6_ADDR_GEN_MODE',         'linux/if_link.h'],
+                 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
+                 ['IFLA_VRF_TABLE',                   'linux/if_link.h'],
+diff --git a/src/basic/missing.h b/src/basic/missing.h
+index 71a07d0574..14ad3d4914 100644
+--- a/src/basic/missing.h
++++ b/src/basic/missing.h
+@@ -15,7 +15,6 @@
+ #include <linux/neighbour.h>
+ #include <linux/oom.h>
+ #include <linux/rtnetlink.h>
+-#include <linux/stat.h>
+ #include <net/ethernet.h>
+ #include <stdlib.h>
+ #include <sys/resource.h>
+@@ -25,6 +24,10 @@
+ #include <uchar.h>
+ #include <unistd.h>
+ 
++#if !HAVE_STRUCT_STATX_IN_SYS_STAT_H
++#include <linux/stat.h>
++#endif
++
+ #if HAVE_AUDIT
+ #include <libaudit.h>
+ #endif
+diff --git a/src/basic/xattr-util.c b/src/basic/xattr-util.c
+index c5c55ea846..0ee0979837 100644
+--- a/src/basic/xattr-util.c
++++ b/src/basic/xattr-util.c
+@@ -2,7 +2,6 @@
+ 
+ #include <errno.h>
+ #include <fcntl.h>
+-#include <linux/stat.h>
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <string.h>
diff --git a/systemd/patches/0002-meson-rename-Ddebug-to-Ddebug-extra.patch b/systemd/patches/0002-meson-rename-Ddebug-to-Ddebug-extra.patch
new file mode 100644
index 000000000..81402af55
--- /dev/null
+++ b/systemd/patches/0002-meson-rename-Ddebug-to-Ddebug-extra.patch
@@ -0,0 +1,43 @@
+From 8f6b442a78d0b485f044742ad90b2e8271b4e68e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
+Date: Sun, 19 Aug 2018 19:11:30 +0200
+Subject: [PATCH] meson: rename -Ddebug to -Ddebug-extra
+
+Meson added -Doptimization and -Ddebug options, which obviously causes
+a conflict with our -Ddebug options. Let's rename it.
+
+Fixes #9883.
+---
+ meson.build       | 2 +-
+ meson_options.txt | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index f79ac4b12..2209c935a 100644
+--- a/meson.build
++++ b/meson.build
+@@ -763,7 +763,7 @@ substs.set('DEBUGTTY', get_option('debug-tty'))
+ 
+ enable_debug_hashmap = false
+ enable_debug_mmap_cache = false
+-foreach name : get_option('debug')
++foreach name : get_option('debug-extra')
+         if name == 'hashmap'
+                 enable_debug_hashmap = true
+         elif name == 'mmap-cache'
+diff --git a/meson_options.txt b/meson_options.txt
+index e3140c8c1..7b1f61bf4 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -45,7 +45,7 @@ option('debug-shell', type : 'string', value : '/bin/sh',
+        description : 'path to debug shell binary')
+ option('debug-tty', type : 'string', value : '/dev/tty9',
+        description : 'specify the tty device for debug shell')
+-option('debug', type : 'array', choices : ['hashmap', 'mmap-cache'], value : [],
++option('debug-extra', type : 'array', choices : ['hashmap', 'mmap-cache'], value : [],
+        description : 'enable extra debugging')
+ option('memory-accounting-default', type : 'boolean',
+        description : 'enable MemoryAccounting= by default')
+-- 
+2.14.4
+
diff --git a/systemd/patches/0003-bus-socket-Fix-line_begins-to-accept-word-matching-f.patch b/systemd/patches/0003-bus-socket-Fix-line_begins-to-accept-word-matching-f.patch
new file mode 100644
index 000000000..1b9df6dfc
--- /dev/null
+++ b/systemd/patches/0003-bus-socket-Fix-line_begins-to-accept-word-matching-f.patch
@@ -0,0 +1,48 @@
+From 3f10c66270b74530339b3f466c43874bb40c210f Mon Sep 17 00:00:00 2001
+From: Filipe Brandenburger <filbranden@google.com>
+Date: Tue, 17 Jul 2018 11:32:40 -0700
+Subject: [PATCH] bus-socket: Fix line_begins() to accept word matching full
+ string
+
+The switch to memory_startswith() changed the logic to only look for a space or
+NUL byte after the matched word, but matching the full size should also be
+acceptable.
+
+This changed the behavior of parsing of "AUTH\r\n", where m will be set to 4,
+since even though the word will match, the check for it being followed by ' '
+or NUL will make line_begins() return false.
+
+Tested:
+
+- Using netcat to connect to the private socket directly:
+  $ echo -ne '\0AUTH\r\n' | sudo nc -U /run/systemd/private
+  REJECTED EXTERNAL ANONYMOUS
+
+- Running the Ignition blackbox test:
+  $ sudo sh -c 'PATH=$PWD/bin/amd64:$PATH ./tests.test'
+  PASS
+
+Fixes: d27b725abf64a19a6b2f99332b663f17ad046771
+---
+ src/libsystemd/sd-bus/bus-socket.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
+index be491c957..a785a247c 100644
+--- a/src/libsystemd/sd-bus/bus-socket.c
++++ b/src/libsystemd/sd-bus/bus-socket.c
+@@ -246,10 +246,7 @@ static bool line_begins(const char *s, size_t m, const char *word) {
+         const char *p;
+ 
+         p = memory_startswith(s, m, word);
+-        if (!p)
+-                return false;
+-
+-        return IN_SET(*p, 0, ' ');
++        return p && (p == (s + m) || *p == ' ');
+ }
+ 
+ static int verify_anonymous_token(sd_bus *b, const char *p, size_t l) {
+-- 
+2.14.4
+
diff --git a/systemd/patches/systemd-231-ipfire-disable-tests.patch b/systemd/patches/systemd-231-ipfire-disable-tests.patch
deleted file mode 100644
index cd4bbe928..000000000
--- a/systemd/patches/systemd-231-ipfire-disable-tests.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-diff -Nur a/Makefile.am b/Makefile.am
---- a/Makefile.am	2016-07-25 21:49:47.000000000 +0200
-+++ b/Makefile.am	2016-09-23 08:34:47.924257243 +0200
-@@ -1480,9 +1480,7 @@
- 	test-job-type \
- 	test-env-util \
- 	test-strbuf \
--	test-strv \
- 	test-path \
--	test-path-util \
- 	test-strxcpyx \
- 	test-siphash24 \
- 	test-unit-name \
-@@ -1541,7 +1539,6 @@
- 	test-capability \
- 	test-async \
- 	test-ratelimit \
--	test-condition \
- 	test-uid-range \
- 	test-locale-util \
- 	test-execute \
-@@ -3586,11 +3583,9 @@
- 
- tests += \
- 	test-dhcp-option \
--	test-dhcp-client \
- 	test-dhcp-server \
- 	test-ipv4ll \
- 	test-ndisc-rs \
--	test-dhcp6-client \
- 	test-lldp
- 
- # ------------------------------------------------------------------------------
-@@ -4298,16 +4293,11 @@
- 	catalog-remove-hook
- 
- tests += \
--	test-journal \
- 	test-journal-enum \
- 	test-journal-send \
- 	test-journal-syslog \
- 	test-journal-match \
--	test-journal-stream \
- 	test-journal-init \
--	test-journal-verify \
--	test-journal-interleaving \
--	test-journal-flush \
- 	test-mmap-cache \
- 	test-catalog \
- 	test-audit-type
-@@ -6518,7 +6508,6 @@
- 	test-libudev-sym.c
- 
- tests += \
--	test-libsystemd-sym \
- 	test-libudev-sym
- 
- .PHONY: cppcheck
diff --git a/systemd/systemd.nm b/systemd/systemd.nm
index a95228f15..368ecdf0e 100644
--- a/systemd/systemd.nm
+++ b/systemd/systemd.nm
@@ -4,8 +4,8 @@
 ###############################################################################
 
 name       = systemd
-version    = 233
-release    = 3
+version    = 239
+release    = 1
 
 maintainer = Stefan Schantl <stefan.schantl@ipfire.org>
 groups     = System/Base
@@ -35,8 +35,6 @@ build
 		/usr/bin/tree
 		/usr/bin/umount
 
-		autoconf
-		automake
 		attr-devel
 		cryptsetup-luks-devel >= 1.4.2
 		dbus-devel
@@ -55,9 +53,10 @@ build
 		libcap-devel
 		libgcrypt-devel
 		libmount-devel
-		libtool
 		libuuid-devel
 		m4
+		meson
+		ninja >= 1.5
 		pam-devel
 		pciutils-devel
 		python3-devel
@@ -70,30 +69,36 @@ build
 
 	export LD_LIBRARY_PATH = %{DIR_APP}/.libs
 
-	configure_options += \
-		PYTHON=%{python3} \
-		--with-sysvinit-path= \
-		--with-sysvrcnd-path= \
-		--enable-zlib \
-		--disable-smack \
-		--disable-backlight \
-		--disable-firstboot \
-		--disable-hibernate \
-		--disable-importd \
-		--disable-libiptc \
-		--disable-machined \
-		--disable-networkd \
-		--disable-resolved \
-		--disable-sysusers \
-		--disable-timesyncd \
-		--disable-timedated \
-		--disable-polkit \
-		--disable-static
+	configure_options = \
+		-Dsysvinit-path= \
+		-Dsysvrcnd-path= \
+		-Dzlib=true \
+		-Dsmack=false \
+		-Dbacklight=false \
+		-Dfirstboot=false \
+		-Dhibernate=false \
+		-Dimportd=false \
+		-Dlibiptc=false \
+		-Dmachined=false \
+		-Dnetworkd=false \
+		-Dresolve=false \
+		-Dportabled=false \
+		-Dsysusers=false \
+		-Dtimesyncd=false \
+		-Dtimedated=false \
+		-Dpolkit=false \
+		-Dstatic=false
 
 	prepare_cmds
 		%{create_groups}
+	end
+
+	build
+		# Call meson and pass configure options.
+		meson --buildtype=plain %{configure_options} . build
 
-		./autogen.sh
+		# Call ninja to start build
+		ninja -v %{PARALLELISMFLAGS} -C build
 	end
 
 	test
@@ -104,10 +109,16 @@ build
 		systemd-machine-id-setup
 
 		# Run the testsuite.
-		make check || true
+		ninja test -v %{PARALLELISMFLAGS} -C build || true
 	end
 
-	install_cmds
+	install
+		# Export destdir.
+		export DESTDIR=%{BUILDROOT}
+
+		# Call ninja to perform installation
+		ninja install -v %{PARALLELISMFLAGS} -C build
+
 		# Create folder in log to store the journal.
 		mkdir -pv %{BUILDROOT}/var/log/journal
 
