diff --git a/.gitignore b/.gitignore
index cbec41e..b20bb48 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,4 @@
 /valgrind-3.18.0.RC1.tar.bz2
 /valgrind-3.18.1.tar.bz2
 /valgrind-3.19.0.tar.bz2
+/valgrind-3.20.0.tar.bz2
diff --git a/sources b/sources
index e93a40c..0ba4c2a 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (valgrind-3.19.0.tar.bz2) = f720a89dc4c4989cc5714bff9efe97529f71990bcfad7a92b889ce099c4326d6da07fa4d5fbab2e9125e20f352354f6178471e49e419b613a3c82c2a1c667ab2
+SHA512 (valgrind-3.20.0.tar.bz2) = d6bfb9284d0410134ee7e2a5975b13c01508dd5587b562947d8197b3c113b76fdfac88c4072948be68bbf0dbeb17b4d1acb1412ce898adaa83c30ae2c6a1c12b
diff --git a/valgrind-3.19.0-ld-so-strncmp.patch b/valgrind-3.19.0-ld-so-strncmp.patch
deleted file mode 100644
index 91007ef..0000000
--- a/valgrind-3.19.0-ld-so-strncmp.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-commit 947388eb043ea1c44b37df94046e1eee790ad776
-Author: Mike Crowe <mac@mcrowe.com>
-Date:   Mon Sep 9 14:16:16 2019 +0100
-
-    Intercept strncmp for glibc ld.so v2.28+
-    
-    In glibc 5aad5f617892e75d91d4c8fb7594ff35b610c042 (first released in
-    v2.28) a call to strncmp was added to dl-load.c:is_dst. This causes
-    valgrind to complain about glibc's highly-optimised strncmp performing
-    sixteen-byte reads on short strings in ld.so. Let's intercept strncmp in
-    ld.so too so we use valgrind's simple version to avoid this problem.
-
-diff --git a/shared/vg_replace_strmem.c b/shared/vg_replace_strmem.c
-index 3b42b3a87..5396e83be 100644
---- a/shared/vg_replace_strmem.c
-+++ b/shared/vg_replace_strmem.c
-@@ -710,6 +710,8 @@ static inline void my_exit ( int x )
-  STRNCMP(VG_Z_LIBC_SONAME, __GI_strncmp)
-  STRNCMP(VG_Z_LIBC_SONAME, __strncmp_sse2)
-  STRNCMP(VG_Z_LIBC_SONAME, __strncmp_sse42)
-+ STRNCMP(VG_Z_LD_LINUX_SO_2, strncmp)
-+ STRNCMP(VG_Z_LD_LINUX_X86_64_SO_2, strncmp)
- 
- #elif defined(VGO_freebsd)
-  STRNCMP(VG_Z_LIBC_SONAME, strncmp)
diff --git a/valgrind-3.19.0-s390x-memmem.patch b/valgrind-3.19.0-s390x-memmem.patch
deleted file mode 100644
index 669b78e..0000000
--- a/valgrind-3.19.0-s390x-memmem.patch
+++ /dev/null
@@ -1,231 +0,0 @@
-From 42ca1c480a5bca408a54c6a24d2be2c081d121ac Mon Sep 17 00:00:00 2001
-From: Andreas Arnez <arnez@linux.ibm.com>
-Date: Thu, 19 May 2022 13:54:06 +0200
-Subject: [PATCH] Bug 454040 - Add intercept for memmem on s390x
-
-Since memcheck may report false positives in an optimized version of memmem on
-s390x, add an intercept for memmem on s390x platforms.
----
- shared/vg_replace_strmem.c | 36 ++++++++++++++++++++++++++++++++++++
- 1 file changed, 36 insertions(+)
-
-diff --git a/shared/vg_replace_strmem.c b/shared/vg_replace_strmem.c
-index 5396e83be..d28e74206 100644
---- a/shared/vg_replace_strmem.c
-+++ b/shared/vg_replace_strmem.c
-@@ -103,6 +103,7 @@
-    20430 WMEMCHR
-    20440 WCSNLEN
-    20450 WSTRNCMP
-+   20460 MEMMEM
- */
- 
- #if defined(VGO_solaris)
-@@ -1785,6 +1786,41 @@ static inline void my_exit ( int x )
- 
- #endif
- 
-+/*---------------------- memmem ----------------------*/
-+
-+#define MEMMEM(soname, fnname) \
-+   void* VG_REPLACE_FUNCTION_EZU(20460,soname,fnname) \
-+         (const void* haystack, SizeT hlen, const void* needle, SizeT nlen); \
-+   void* VG_REPLACE_FUNCTION_EZU(20460,soname,fnname) \
-+         (const void* haystack, SizeT hlen, const void* needle, SizeT nlen) \
-+   { \
-+      const HChar* h = haystack; \
-+      const HChar* n = needle; \
-+      \
-+      /* If the needle is the empty string, match immediately. */ \
-+      if (nlen == 0) return CONST_CAST(void *,h); \
-+      \
-+      HChar n0 = n[0]; \
-+      \
-+      for (; hlen >= nlen; hlen--, h++) { \
-+         if (h[0] != n0) continue; \
-+         \
-+         UWord i; \
-+         for (i = 1; i < nlen; i++) { \
-+            if (n[i] != h[i]) \
-+               break; \
-+         } \
-+         if (i == nlen) \
-+           return CONST_CAST(HChar *,h); \
-+         \
-+      } \
-+      return NULL; \
-+   }
-+
-+#if defined(VGP_s390x_linux)
-+ MEMMEM(VG_Z_LIBC_SONAME,          memmem)
-+#endif
-+
- 
- /*---------------------- strpbrk ----------------------*/
- 
--- 
-2.31.1
-
-From 4d675f309bcd2d4e9e2b9e6f4aba30f85116bb9b Mon Sep 17 00:00:00 2001
-From: Mark Wielaard <mark@klomp.org>
-Date: Thu, 19 May 2022 18:08:40 -0400
-Subject: [PATCH] Add memmem memcheck tests
-
----
- memcheck/tests/Makefile.am       |  3 ++
- memcheck/tests/filter_memmem     |  5 ++
- memcheck/tests/memmem.c          | 81 ++++++++++++++++++++++++++++++++
- memcheck/tests/memmem.stderr.exp |  2 +
- memcheck/tests/memmem.vgtest     |  3 ++
- 5 files changed, 94 insertions(+)
- create mode 100755 memcheck/tests/filter_memmem
- create mode 100644 memcheck/tests/memmem.c
- create mode 100644 memcheck/tests/memmem.stderr.exp
- create mode 100644 memcheck/tests/memmem.vgtest
-
-diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am
-index eb9487272..4d181c1ac 100644
---- a/memcheck/tests/Makefile.am
-+++ b/memcheck/tests/Makefile.am
-@@ -79,6 +79,7 @@ dist_noinst_SCRIPTS = \
- 	filter_strchr \
- 	filter_varinfo3 \
- 	filter_memcheck \
-+	filter_memmem \
- 	filter_overlaperror \
- 	filter_malloc_free \
-         filter_sized_delete
-@@ -220,6 +221,7 @@ EXTRA_DIST = \
- 	memalign2.stderr.exp memalign2.vgtest \
- 	memcmptest.stderr.exp memcmptest.stderr.exp2 \
- 	memcmptest.stdout.exp memcmptest.vgtest \
-+	memmem.stderr.exp memmem.vgtest \
- 	mempool.stderr.exp mempool.vgtest \
- 	mempool2.stderr.exp mempool2.vgtest \
- 	metadata.stderr.exp metadata.stdout.exp metadata.vgtest \
-@@ -417,6 +419,7 @@ check_PROGRAMS = \
- 	malloc_usable malloc1 malloc2 malloc3 manuel1 manuel2 manuel3 \
- 	match-overrun \
- 	memalign_test memalign2 memcmptest mempool mempool2 mmaptest \
-+	memmem \
- 	mismatches new_override metadata \
- 	nanoleak_supp nanoleak2 new_nothrow \
- 	noisy_child \
-diff --git a/memcheck/tests/filter_memmem b/memcheck/tests/filter_memmem
-new file mode 100755
-index 000000000..f4a40b2d1
---- /dev/null
-+++ b/memcheck/tests/filter_memmem
-@@ -0,0 +1,5 @@
-+#! /bin/sh
-+
-+# Too many memmem implementations and overrides.
-+# So just keep the main file lines.
-+./filter_stderr "$@" | grep " main (memmem.c:"
-diff --git a/memcheck/tests/memmem.c b/memcheck/tests/memmem.c
-new file mode 100644
-index 000000000..d627076e3
---- /dev/null
-+++ b/memcheck/tests/memmem.c
-@@ -0,0 +1,81 @@
-+#define _GNU_SOURCE
-+#include <assert.h>
-+#include <string.h>
-+#include <stdlib.h>
-+
-+/* mallocs an mem block and fills it with A. A needs to be a zero
-+   terminated string. The A string chars, minus the terminating zero
-+   are copied into the returned mem block.  */
-+static void *
-+create_mem (const char *a)
-+{
-+  size_t len = strlen (a);
-+  void *mem = malloc (len);
-+  memcpy (mem, a, len);
-+  return mem;
-+}
-+
-+int
-+main ()
-+{
-+  char *haystack;
-+  char *needle;
-+
-+  haystack = create_mem ("a");
-+  needle = create_mem ("a");
-+  assert (memmem (haystack, 0, needle, 0) == haystack);
-+  assert (memmem (haystack, 1, needle, 0) == haystack);
-+  assert (memmem (haystack, 0, needle, 1) == NULL);
-+  assert (memmem (haystack, 1, needle, 1) == haystack);
-+  free (haystack);
-+  free (needle);
-+
-+  haystack = create_mem ("abc");
-+  needle = create_mem ("bc");
-+  assert (memmem (haystack, 3, needle, 0) == haystack);
-+  assert (memmem (haystack, 3, needle, 2) == haystack + 1);
-+  assert (memmem (haystack + 1, 2, needle, 2) == haystack + 1);
-+  assert (memmem (haystack + 2, 1, needle, 2) == NULL);
-+  free (haystack);
-+  free (needle);
-+
-+  haystack = create_mem ("abcabcabc");
-+  needle = create_mem ("bca");
-+  assert (memmem (haystack, 9, needle, 3) == haystack + 1);
-+  free (haystack);
-+  free (needle);
-+
-+  haystack = create_mem ("abcabcabc");
-+  needle = create_mem ("bcad");
-+  assert (memmem (haystack, 9, needle, 4) == NULL);
-+  free (haystack);
-+  free (needle);
-+
-+  haystack = create_mem ("xxxxxxxxxxxxxxxxxABC");
-+  needle = create_mem ("ABCD");
-+  assert (memmem (haystack, 20, needle, 2) == haystack + 17);
-+  assert (memmem (haystack + 3, 17, needle, 2) == haystack + 17);
-+  assert (memmem (haystack + 15, 5, needle, 2) == haystack + 17);
-+  assert (memmem (haystack, 20, needle, 3) == haystack + 17);
-+  assert (memmem (haystack + 3, 17, needle, 3) == haystack + 17);
-+  assert (memmem (haystack + 15, 5, needle, 3) == haystack + 17);
-+  assert (memmem (haystack, 20, needle, 4) == NULL);
-+  assert (memmem (haystack + 3, 5, needle, 4) == NULL);
-+  assert (memmem (haystack + 15, 5, needle, 4) == NULL);
-+  free (haystack);
-+  free (needle);
-+
-+  haystack = malloc (1);
-+  needle = create_mem ("a");
-+  assert (memmem (haystack, 1, needle, 1) == NULL);
-+  free (haystack);
-+  free (needle);
-+
-+  haystack = create_mem ("A");
-+  needle = malloc (1);
-+  assert (memmem (haystack, 1, needle, 1) == NULL);
-+  free (haystack);
-+  free (needle);
-+
-+  return 0;
-+}
-diff --git a/memcheck/tests/memmem.stderr.exp b/memcheck/tests/memmem.stderr.exp
-new file mode 100644
-index 000000000..b4612fbd4
---- /dev/null
-+++ b/memcheck/tests/memmem.stderr.exp
-@@ -0,0 +1,2 @@
-+   by 0x........: main (memmem.c:70)
-+   by 0x........: main (memmem.c:76)
-diff --git a/memcheck/tests/memmem.vgtest b/memcheck/tests/memmem.vgtest
-new file mode 100644
-index 000000000..6d12895df
---- /dev/null
-+++ b/memcheck/tests/memmem.vgtest
-@@ -0,0 +1,3 @@
-+prog: memmem
-+vgopts: -q
-+stderr_filter: filter_memmem
--- 
-2.18.4
-
diff --git a/valgrind.spec b/valgrind.spec
index f69b91c..7a4f63b 100644
--- a/valgrind.spec
+++ b/valgrind.spec
@@ -2,14 +2,12 @@
 
 Summary: Dynamic analysis tools to detect memory or thread bugs and profile
 Name: %{?scl_prefix}valgrind
-Version: 3.19.0
-Release: 4%{?dist}
+Version: 3.20.0
+Release: 1%{?dist}
 Epoch: 1
 License: GPLv2+
 URL: https://www.valgrind.org/
 
-# Only necessary for RHEL, will be ignored on Fedora
-
 # Are we building for a Software Collection?
 %{?scl:%global is_scl 1}
 %{!?scl:%global is_scl 0}
@@ -85,12 +83,6 @@ Patch3: valgrind-3.16.0-some-stack-protector.patch
 # Add some -Wl,z,now.
 Patch4: valgrind-3.16.0-some-Wl-z-now.patch
 
-# KDE#434764 # iconv_open causes ld.so v2.28+ to execute optimised strncmp
-Patch5: valgrind-3.19.0-ld-so-strncmp.patch
-
-# KDE#454040 s390x: False-positive memcheck:cond in memmem on arch13 systems
-Patch6: valgrind-3.19.0-s390x-memmem.patch
-
 BuildRequires: make
 BuildRequires: glibc-devel
 
@@ -228,9 +220,6 @@ Valgrind User Manual for details.
 %patch4 -p1
 %endif
 
-%patch5 -p1
-%patch6 -p1
-
 %build
 # LTO triggers undefined symbols in valgrind.  Valgrind has a --enable-lto
 # configure time option, but that doesn't seem to help.
@@ -459,6 +448,9 @@ fi
 %endif
 
 %changelog
+* Mon Oct 24 2022 Mark Wielaard <mjw@fedoraproject.org> - 3.20.0-1
+- Upgrade to valgrind 3.20.0. Drop old patches.
+
 * Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.19.0-4
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild