diff --git a/PKGBUILD b/PKGBUILD
index 4d9e15edf48babc06629533bbf3579b0641f5c1a..e89be5c68ecead9ffc5aabeb6ec3f2c4d5100428 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -6,13 +6,13 @@
 pkgbase=xorg-server
 pkgname=('xorg-server' 'xorg-server-xephyr' 'xorg-server-xdmx' 'xorg-server-xvfb'
 		'xorg-server-xnest' 'xorg-server-xwayland' 'xorg-server-common' 'xorg-server-devel')
-pkgver=1.19.5
-pkgrel=2
+pkgver=1.19.6
+pkgrel=3
 arch=('x86_64')
 license=('custom')
 groups=('xorg')
 url="http://xorg.freedesktop.org"
-makedepends=('pixman' 'libx11' 'mesa' 'libgl' 'xf86driproto' 'xcmiscproto' 'xtrans' 'bigreqsproto' 'randrproto' 
+makedepends=('pixman' 'libx11' 'mesa' 'mesa-libgl' 'xf86driproto' 'xcmiscproto' 'xtrans' 'bigreqsproto' 'randrproto' 
              'inputproto' 'fontsproto' 'videoproto' 'presentproto' 'compositeproto' 'recordproto' 'scrnsaverproto'
              'resourceproto' 'xineramaproto' 'libxkbfile' 'libxfont2' 'renderproto' 'libpciaccess' 'libxv'
              'xf86dgaproto' 'libxmu' 'libxrender' 'libxi' 'dmxproto' 'libxaw' 'libdmx' 'libxtst' 'libxres'
@@ -23,13 +23,15 @@ source=(https://xorg.freedesktop.org/releases/individual/xserver/${pkgbase}-${pk
         xvfb-run
 		xvfb-run.1
 		nvidia-add-modulepath-support.patch
-		xserver-autobind-hotplug.patch)
+		xserver-autobind-hotplug.patch
+		revert-udev-changes.diff)
 		
-sha256sums=('18fffa8eb93d06d2800d06321fc0df4d357684d8d714315a66d8dfa7df251447'
+sha256sums=('a732502f1db000cf36a376cd0c010ffdbf32ecdd7f1fa08ba7f5bdf9601cc197'
             'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9'
             '2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776'
             '23f2fd69a53ef70c267becf7d2a9e7e07b739f8ec5bec10adb219bc6465099c7'
-            '67aaf8668c5fb3c94b2569df28e64bfa1dc97ce429cbbc067c309113caff6369')
+            '67aaf8668c5fb3c94b2569df28e64bfa1dc97ce429cbbc067c309113caff6369'
+            'c551dd768de10dd8a47213696003d118edb248ca6c09c0d9f1591abb0632d199')
 validpgpkeys=('6DD4217456569BA711566AC7F06E8FDE7B45DAAC') # Eric Vidal
 
 prepare() {
@@ -41,6 +43,10 @@ prepare() {
   # patch from Fedora, not yet merged
   patch -Np1 -i ../xserver-autobind-hotplug.patch
   
+  # https://bugs.archlinux.org/task/56804 
+  # https://bugs.freedesktop.org/show_bug.cgi?id=104382
+  patch -Rp1 -i ../revert-udev-changes.diff
+
   autoreconf -vfi
 }
 
@@ -86,7 +92,7 @@ build() {
       --with-sha1=libgcrypt \
       --disable-systemd \
       --without-systemd-daemon \
-      --enable-systemd-logind=no 
+      --disable-systemd-logind
       
   make
 
@@ -101,7 +107,7 @@ build() {
 
 package_xorg-server-common() {
   pkgdesc="Xorg server common files"
-  depends=('xkeyboard-config' 'xorg-xkbcomp' 'xorg-setxkbmap' 'xorg-fonts-misc' 'libunwind')
+  depends=('xkeyboard-config' 'xorg-xkbcomp' 'xorg-setxkbmap')
 
   cd "${pkgbase}-${pkgver}"
   install -m755 -d "${pkgdir}/usr/share/licenses/xorg-server-common"
@@ -118,7 +124,7 @@ package_xorg-server-common() {
 
 package_xorg-server() {
   pkgdesc="Xorg X server"
-  depends=('libepoxy' 'libxfont2' 'pixman' 'xorg-server-common' 'libunwind' 'libgl' 'xf86-input-libinput'
+  depends=('libepoxy' 'libxfont2' 'pixman' 'xorg-server-common' 'libunwind' 'dbus' 'libgl' 'xf86-input-libinput'
 			'libpciaccess' 'libdrm' 'libxshmfence')
   # see xorg-server-*/hw/xfree86/common/xf86Module.h for ABI versions - we provide major numbers that drivers can depend on
   # and /usr/lib/pkgconfig/xorg-server.pc in xorg-server-devel pkg
diff --git a/revert-udev-changes.diff b/revert-udev-changes.diff
new file mode 100644
index 0000000000000000000000000000000000000000..d25a0c73e1020eabda6978c6808330aa7a92224f
--- /dev/null
+++ b/revert-udev-changes.diff
@@ -0,0 +1,104 @@
+From 5a5b6d6cca469521daa6ac9087f3589b7489ab55 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue, 26 Sep 2017 15:21:59 +1000
+Subject: config/udev: consider ID_INPUT_FOO=0 as 'unset'
+
+Historically we didn't need to care about this case but more devices are
+having invalid types set and they cannot be unset with a hwdb entry (which
+doesn't handle the empty string). Allow for "0" to mean "unset" because
+anything else would be crazy anyway.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+(cherry picked from commit 5aad81445c8c3d6b7b30d503cfe26027fa482870)
+---
+ config/udev.c | 65 +++++++++++++++++++++++++++++------------------------------
+ 1 file changed, 32 insertions(+), 33 deletions(-)
+
+(limited to 'config/udev.c')
+
+diff --git a/config/udev.c b/config/udev.c
+index 932f230..e198e86 100644
+--- a/config/udev.c
++++ b/config/udev.c
+@@ -134,7 +134,8 @@ device_added(struct udev_device *udev_device)
+     }
+ #endif
+ 
+-    if (!udev_device_get_property_value(udev_device, "ID_INPUT")) {
++    value = udev_device_get_property_value(udev_device, "ID_INPUT");
++    if (value && !strcmp(value, "0")) {
+         LogMessageVerb(X_INFO, 10,
+                        "config/udev: ignoring device %s without "
+                        "property ID_INPUT set\n", path);
+@@ -237,38 +238,36 @@ device_added(struct udev_device *udev_device)
+         else if (!strcmp(key, "ID_VENDOR")) {
+             LOG_PROPERTY(path, key, value);
+             attrs.vendor = strdup(value);
+-        }
+-        else if (!strcmp(key, "ID_INPUT_KEY")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_KEY;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_KEYBOARD")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_KEYBOARD;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_MOUSE")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_POINTER;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_JOYSTICK")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_JOYSTICK;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_TABLET")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_TABLET;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_TABLET_PAD")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_TABLET_PAD;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_TOUCHPAD")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_TOUCHPAD;
+-        }
+-        else if (!strcmp(key, "ID_INPUT_TOUCHSCREEN")) {
+-            LOG_PROPERTY(path, key, value);
+-            attrs.flags |= ATTR_TOUCHSCREEN;
++        } else if (!strncmp(key, "ID_INPUT_", 9)) {
++            const struct pfmap {
++                const char *property;
++                unsigned int flag;
++            } map[] = {
++                { "ID_INPUT_KEY", ATTR_KEY },
++                { "ID_INPUT_KEYBOARD", ATTR_KEYBOARD },
++                { "ID_INPUT_MOUSE", ATTR_POINTER },
++                { "ID_INPUT_JOYSTICK", ATTR_JOYSTICK },
++                { "ID_INPUT_TABLET", ATTR_TABLET },
++                { "ID_INPUT_TABLET_PAD", ATTR_TABLET_PAD },
++                { "ID_INPUT_TOUCHPAD", ATTR_TOUCHPAD },
++                { "ID_INPUT_TOUCHSCREEN", ATTR_TOUCHSCREEN },
++                { NULL, 0 },
++            };
++
++            /* Anything but the literal string "0" is considered a
++             * boolean true. The empty string isn't a thing with udev
++             * properties anyway */
++            if (value && strcmp(value, "0")) {
++                const struct pfmap *m = map;
++
++                while (m->property != NULL) {
++                    if (!strcmp(m->property, key)) {
++                        LOG_PROPERTY(path, key, value);
++                        attrs.flags |= m->flag;
++                    }
++                    m++;
++                }
++            }
+         }
+     }
+ 
+-- 
+cgit v1.1
+