diff --git a/valgrind-3.14.0-ppc64-unaligned-words.patch b/valgrind-3.14.0-ppc64-unaligned-words.patch
new file mode 100644
index 0000000..75c8bf6
--- /dev/null
+++ b/valgrind-3.14.0-ppc64-unaligned-words.patch
@@ -0,0 +1,148 @@
+commit c5a5bea00af75f6ac50da10967d956f117b956f1
+Author: Mark Wielaard <mark@klomp.org>
+Date:   Sat Dec 8 13:47:43 2018 -0500
+
+    memcheck: Allow unaligned loads of words on ppc64[le].
+    
+    On powerpc partial unaligned loads of words from partially invalid
+    addresses are OK and could be generated by our translation of ldbrx.
+    
+    Adjust partial_load memcheck tests to allow partial loads of words
+    on powerpc64.
+    
+    Part of resolving bug #386945.
+
+diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c
+index 3ef7cb9..737f79d 100644
+--- a/memcheck/mc_main.c
++++ b/memcheck/mc_main.c
+@@ -1508,6 +1508,9 @@ ULong mc_LOADVn_slow ( Addr a, SizeT nBits, Bool bigendian )
+ #  if defined(VGA_mips64) && defined(VGABI_N32)
+    if (szB == VG_WORDSIZE * 2 && VG_IS_WORD_ALIGNED(a)
+        && n_addrs_bad < VG_WORDSIZE * 2)
++#  elif defined(VGA_ppc64be) || defined(VGA_ppc64le)
++   /* On power unaligned loads of words are OK. */
++   if (szB == VG_WORDSIZE && n_addrs_bad < VG_WORDSIZE)
+ #  else
+    if (szB == VG_WORDSIZE && VG_IS_WORD_ALIGNED(a)
+        && n_addrs_bad < VG_WORDSIZE)
+diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am
+index 2af4dd1..70b8ada 100644
+--- a/memcheck/tests/Makefile.am
++++ b/memcheck/tests/Makefile.am
+@@ -235,8 +235,10 @@ EXTRA_DIST = \
+ 	partiallydefinedeq.stdout.exp \
+ 	partial_load_ok.vgtest partial_load_ok.stderr.exp \
+ 		partial_load_ok.stderr.exp64 \
++		partial_load_ok.stderr.exp-ppc64 \
+ 	partial_load_dflt.vgtest partial_load_dflt.stderr.exp \
+ 		partial_load_dflt.stderr.exp64 \
++		partial_load_dflt.stderr.exp-ppc64 \
+ 	partial_load_dflt.stderr.expr-s390x-mvc \
+ 	pdb-realloc.stderr.exp pdb-realloc.vgtest \
+ 	pdb-realloc2.stderr.exp pdb-realloc2.stdout.exp pdb-realloc2.vgtest \
+diff --git a/memcheck/tests/partial_load.c b/memcheck/tests/partial_load.c
+index 0b2f10b..685ca8d 100644
+--- a/memcheck/tests/partial_load.c
++++ b/memcheck/tests/partial_load.c
+@@ -1,14 +1,14 @@
+-
++#include <stdio.h>
+ #include <stdlib.h>
+ #include <assert.h>
+ 
+ int main ( void )
+ {
+-  long  w;
+-  int   i;
+-  char* p;
+-
++  long  w; int   i; char* p;
+   assert(sizeof(long) == sizeof(void*));
++#if defined(__powerpc64__)
++  fprintf (stderr, "powerpc64\n"); /* Used to select correct .exp file.  */
++#endif
+ 
+   /* partial load, which --partial-loads-ok=yes should suppress */
+   p = calloc( sizeof(long)-1, 1 );
+@@ -16,7 +16,7 @@ int main ( void )
+   w = *(long*)p;
+   free(p);
+ 
+-  /* partial but misaligned, cannot be suppressed */
++  /* partial but misaligned, ppc64[le] ok, but otherwise cannot be suppressed */
+   p = calloc( sizeof(long), 1 );
+   assert(p);
+   p++;
+diff --git a/memcheck/tests/partial_load_dflt.stderr.exp-ppc64 b/memcheck/tests/partial_load_dflt.stderr.exp-ppc64
+new file mode 100644
+index 0000000..cf32bcf
+--- /dev/null
++++ b/memcheck/tests/partial_load_dflt.stderr.exp-ppc64
+@@ -0,0 +1,23 @@
++
++powerpc64
++Invalid read of size 2
++   at 0x........: main (partial_load.c:30)
++ Address 0x........ is 0 bytes inside a block of size 1 alloc'd
++   at 0x........: calloc (vg_replace_malloc.c:...)
++   by 0x........: main (partial_load.c:28)
++
++Invalid read of size 8
++   at 0x........: main (partial_load.c:37)
++ Address 0x........ is 0 bytes inside a block of size 8 free'd
++   at 0x........: free (vg_replace_malloc.c:...)
++   by 0x........: main (partial_load.c:36)
++
++
++HEAP SUMMARY:
++    in use at exit: ... bytes in ... blocks
++  total heap usage: ... allocs, ... frees, ... bytes allocated
++
++For a detailed leak analysis, rerun with: --leak-check=full
++
++For counts of detected and suppressed errors, rerun with: -v
++ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
+diff --git a/memcheck/tests/partial_load_ok.stderr.exp-ppc64 b/memcheck/tests/partial_load_ok.stderr.exp-ppc64
+new file mode 100644
+index 0000000..cf32bcf
+--- /dev/null
++++ b/memcheck/tests/partial_load_ok.stderr.exp-ppc64
+@@ -0,0 +1,23 @@
++
++powerpc64
++Invalid read of size 2
++   at 0x........: main (partial_load.c:30)
++ Address 0x........ is 0 bytes inside a block of size 1 alloc'd
++   at 0x........: calloc (vg_replace_malloc.c:...)
++   by 0x........: main (partial_load.c:28)
++
++Invalid read of size 8
++   at 0x........: main (partial_load.c:37)
++ Address 0x........ is 0 bytes inside a block of size 8 free'd
++   at 0x........: free (vg_replace_malloc.c:...)
++   by 0x........: main (partial_load.c:36)
++
++
++HEAP SUMMARY:
++    in use at exit: ... bytes in ... blocks
++  total heap usage: ... allocs, ... frees, ... bytes allocated
++
++For a detailed leak analysis, rerun with: --leak-check=full
++
++For counts of detected and suppressed errors, rerun with: -v
++ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
+diff -ur valgrind-3.14.0.orig/memcheck/tests/Makefile.in valgrind-3.14.0/memcheck/tests/Makefile.in
+--- valgrind-3.14.0.orig/memcheck/tests/Makefile.in	2018-12-12 23:17:07.525501080 +0100
++++ valgrind-3.14.0/memcheck/tests/Makefile.in	2018-12-12 23:18:13.404014757 +0100
+@@ -1546,8 +1546,10 @@
+ 	partiallydefinedeq.stdout.exp \
+ 	partial_load_ok.vgtest partial_load_ok.stderr.exp \
+ 		partial_load_ok.stderr.exp64 \
++		partial_load_ok.stderr.exp-ppc64 \
+ 	partial_load_dflt.vgtest partial_load_dflt.stderr.exp \
+ 		partial_load_dflt.stderr.exp64 \
++		partial_load_dflt.stderr.exp-ppc64 \
+ 	partial_load_dflt.stderr.expr-s390x-mvc \
+ 	pdb-realloc.stderr.exp pdb-realloc.vgtest \
+ 	pdb-realloc2.stderr.exp pdb-realloc2.stdout.exp pdb-realloc2.vgtest \
diff --git a/valgrind.spec b/valgrind.spec
index a455c9e..1a9a64e 100644
--- a/valgrind.spec
+++ b/valgrind.spec
@@ -138,6 +138,7 @@ Patch18: valgrind-3.14.0-final_tidyup.patch
 # KDE#386945 Bogus memcheck errors on ppc64(le) when using strcmp
 # See also patches 10 to 16 (yes, there are this many...)
 Patch19: valgrind-3.14.0-ppc64-ldbrx.patch
+Patch20: valgrind-3.14.0-ppc64-unaligned-words.patch
 
 %if %{build_multilib}
 # Ensure glibc{,-devel} is installed for both multilib arches
@@ -290,6 +291,7 @@ Valgrind User Manual for details.
 %patch17 -p1
 %patch18 -p1
 %patch19 -p1
+%patch20 -p1
 
 %build
 CC=gcc
@@ -527,6 +529,7 @@ fi
 * Wed Dec 12 2018 Mark Wielaard <mjw@fedoraproject.org>
 - Add valgrind-3.14.0-final_tidyup.patch
 - Add valgrind-3.14.0-ppc64-ldbrx.patch
+- Add valgrind-3.14.0-ppc64-unaligned-words.patch
 
 * Sat Dec  1 2018 Mark Wielaard <mjw@fedoraproject.org> - 3.14.0.5
 - Add valgrind-3.14.0-wcsncmp.patch (#1645971)