diff --git a/SOURCES/tigervnc-fix-ghost-cursor-in-zaphod-mode.patch b/SOURCES/tigervnc-fix-ghost-cursor-in-zaphod-mode.patch
new file mode 100644
index 0000000..8e45eb6
--- /dev/null
+++ b/SOURCES/tigervnc-fix-ghost-cursor-in-zaphod-mode.patch
@@ -0,0 +1,117 @@
+From f783d5c8b567199178b6690f347e060a69d2aa36 Mon Sep 17 00:00:00 2001
+From: Jan Grulich <jgrulich@redhat.com>
+Date: Thu, 11 Aug 2022 13:15:29 +0200
+Subject: [PATCH] x0vncserver: update/display cursor only on correct screen in
+ zaphod mode
+
+We have to check whether we update cursor position/shape only in case
+the cursor is on our display, otherwise in zaphod mode, ie. when having
+two instances of x0vncserver on screens :0.0 and :0.1 we would be having
+the cursor duplicated and actually not funcional (aka ghost cursor) as
+it would be actually not present. We also additionally watch EnterNotify
+and LeaveNotify events in order to show/hide cursor accordingly.
+
+Change made with help from Olivier Fourdan <ofourdan@redhat.com>
+---
+ unix/x0vncserver/XDesktop.cxx | 60 +++++++++++++++++++++++++++++++----
+ 1 file changed, 53 insertions(+), 7 deletions(-)
+
+diff --git a/unix/x0vncserver/XDesktop.cxx b/unix/x0vncserver/XDesktop.cxx
+index f2046e43e..f07fd78bf 100644
+--- a/unix/x0vncserver/XDesktop.cxx
++++ b/unix/x0vncserver/XDesktop.cxx
+@@ -192,7 +192,8 @@ XDesktop::XDesktop(Display* dpy_, Geometry *geometry_)
+                    RRScreenChangeNotifyMask | RRCrtcChangeNotifyMask);
+     /* Override TXWindow::init input mask */
+     XSelectInput(dpy, DefaultRootWindow(dpy),
+-                 PropertyChangeMask | StructureNotifyMask | ExposureMask);
++                 PropertyChangeMask | StructureNotifyMask |
++                 ExposureMask | EnterWindowMask | LeaveWindowMask);
+   } else {
+ #endif
+     vlog.info("RANDR extension not present");
+@@ -217,11 +218,13 @@ void XDesktop::poll() {
+     Window root, child;
+     int x, y, wx, wy;
+     unsigned int mask;
+-    XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child,
+-                  &x, &y, &wx, &wy, &mask);
+-    x -= geometry->offsetLeft();
+-    y -= geometry->offsetTop();
+-    server->setCursorPos(rfb::Point(x, y), false);
++
++    if (XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child,
++                      &x, &y, &wx, &wy, &mask)) {
++      x -= geometry->offsetLeft();
++      y -= geometry->offsetTop();
++      server->setCursorPos(rfb::Point(x, y), false);
++    }
+   }
+ }
+
+@@ -253,7 +256,14 @@ void XDesktop::start(VNCServer* vs) {
+ #endif
+
+ #ifdef HAVE_XFIXES
+-  setCursor();
++  Window root, child;
++  int x, y, wx, wy;
++  unsigned int mask;
++  // Check whether the cursor is initially on our screen
++  if (XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child,
++                    &x, &y, &wx, &wy, &mask))
++    setCursor();
++
+ #endif
+
+   server->setLEDState(ledState);
+@@ -701,6 +711,15 @@ bool XDesktop::handleGlobalEvent(XEvent* ev) {
+     if (cev->subtype != XFixesDisplayCursorNotify)
+       return false;
+
++    Window root, child;
++    int x, y, wx, wy;
++    unsigned int mask;
++
++    // Check whether the cursor is initially on our screen
++    if (!XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child,
++                      &x, &y, &wx, &wy, &mask))
++      return false;
++
+     return setCursor();
+ #endif
+ #ifdef HAVE_XRANDR
+@@ -753,6 +772,33 @@ bool XDesktop::handleGlobalEvent(XEvent* ev) {
+
+     return true;
+ #endif
++#ifdef HAVE_XFIXES
++  } else if (ev->type == EnterNotify) {
++    XCrossingEvent* cev;
++
++    if (!running)
++      return true;
++
++    cev = (XCrossingEvent*)ev;
++
++    if (cev->window != cev->root)
++      return false;
++
++    return setCursor();
++  } else if (ev->type == LeaveNotify) {
++    XCrossingEvent* cev;
++
++    if (!running)
++      return true;
++
++    cev = (XCrossingEvent*)ev;
++
++    if (cev->window == cev->root)
++      return false;
++
++    server->setCursor(0, 0, Point(), NULL);
++    return true;
++#endif
+   }
+
+   return false;
diff --git a/SPECS/tigervnc.spec b/SPECS/tigervnc.spec
index 12ba7ba..813e0f5 100644
--- a/SPECS/tigervnc.spec
+++ b/SPECS/tigervnc.spec
@@ -5,7 +5,7 @@
 
 Name:           tigervnc
 Version:        1.12.0
-Release:        4%{?dist}
+Release:        7%{?dist}
 Summary:        A TigerVNC remote display system
 
 %global _hardened_build 1
@@ -28,12 +28,16 @@ Patch50:        tigervnc-selinux-restore-context-in-case-of-different-policies.p
 Patch51:        tigervnc-fix-typo-in-mirror-monitor-detection.patch
 Patch52:        tigervnc-root-user-selinux-context.patch
 Patch53:        tigervnc-vncsession-restore-script-systemd-service.patch
+Patch54:        tigervnc-fix-ghost-cursor-in-zaphod-mode.patch
 
 # This is tigervnc-%%{version}/unix/xserver116.patch rebased on the latest xorg
 Patch100:       tigervnc-xserver120.patch
 # 1326867 - [RHEL7.3] GLX applications in an Xvnc session fails to start
 Patch101:       0001-rpath-hack.patch
 
+# Upstreamable patches
+# https://github.com/TigerVNC/tigervnc/pull/1513
+
 BuildRequires:  gcc-c++
 BuildRequires:  libX11-devel, automake, autoconf, libtool, gettext, gettext-autopoint
 BuildRequires:  libXext-devel, xorg-x11-server-source, libXi-devel
@@ -45,6 +49,7 @@ BuildRequires:  libjpeg-turbo-devel, gnutls-devel, pam-devel
 BuildRequires:  libdrm-devel, libXt-devel, pixman-devel
 BuildRequires:  systemd, cmake, desktop-file-utils
 BuildRequires:  libselinux-devel, selinux-policy-devel
+BuildRequires:  libXfixes-devel, libXdamage-devel, libXrandr-devel
 %if 0%{?fedora} > 24 || 0%{?rhel} >= 7
 BuildRequires:  libXfont2-devel
 %else
@@ -163,6 +168,7 @@ popd
 %patch51 -p1 -b .fix-typo-in-mirror-monitor-detection
 %patch52 -p1 -b .root-user-selinux-context
 %patch53 -p1 -b .vncsession-restore-script-systemd-service
+%patch54 -p1 -b .fix-ghost-cursor-in-zaphod-mode
 
 %build
 %ifarch sparcv9 sparc64 s390 s390x
@@ -317,6 +323,18 @@ fi
 %ghost %verify(not md5 size mtime) %{_sharedstatedir}/selinux/%{selinuxtype}/active/modules/200/%{modulename}
 
 %changelog
+* Wed Aug 24 2022 Jan Grulich <jgrulich@redhat.com> - 1.12.0-7
+- x0vncserver: fix ghost cursor in zaphod mode (better version)
+  Resolves: bz#2109679
+
+* Wed Aug 17 2022 Jan Grulich <jgrulich@redhat.com> - 1.12.0-6
+- x0vncserver: fix ghost cursor in zaphod mode
+  Resolves: bz#2109679
+
+* Tue May 31 2022 Jan Grulich <jgrulich@redhat.com> - 1.12.0-5
+- BR: libXdamage, libXfixes, libXrandr
+  Resolves: bz#2088733
+
 * Tue Feb 08 2022 Jan Grulich <jgrulich@redhat.com> - 1.12.0-4
 - Added vncsession-restore script for SELinux policy migration
   Fix SELinux context for root user