diff --git a/.gitignore b/.gitignore
index 5ed2f0e..7e468c1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
-SOURCES/aarch64-port-jdk8u-aarch64-jdk8u181-b13.tar.xz
-SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u181-b13.tar.xz
+SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u191-b12.tar.xz
 SOURCES/systemtap-tapset-3.6.0pre02.tar.xz
diff --git a/.java-1.8.0-openjdk.metadata b/.java-1.8.0-openjdk.metadata
index 02f3ed9..535140f 100644
--- a/.java-1.8.0-openjdk.metadata
+++ b/.java-1.8.0-openjdk.metadata
@@ -1,3 +1,2 @@
-68194807c61d6b6a6bfbda6a9b5cd56a8e63ad8b SOURCES/aarch64-port-jdk8u-aarch64-jdk8u181-b13.tar.xz
-174fc5d1c647f3846ca6e1e0ab08e287db5c47cc SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u181-b13.tar.xz
+e197cf1d4caa32e21c54e5d625d642b12909ee2c SOURCES/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u191-b12.tar.xz
 93bca27ce5eeeb2bc1f6f3cd4ffe34c3567a3c73 SOURCES/systemtap-tapset-3.6.0pre02.tar.xz
diff --git a/SOURCES/8165489-pr3589.patch b/SOURCES/8165489-pr3589.patch
deleted file mode 100644
index 1674dec..0000000
--- a/SOURCES/8165489-pr3589.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-# HG changeset patch
-# User mdoerr
-# Date 1473159687 -7200
-#      Tue Sep 06 13:01:27 2016 +0200
-# Node ID 7f6e1069a5719c8908b53774d3560ce851c7cd70
-# Parent  b8fc1e640c4c7f38ca94131279cb67c4d3de6961
-8165489, PR3589: Missing G1 barrier in Unsafe_GetObjectVolatile
-Summary: Add missing barrier, sharing code with Unsafe_GetObject.
-Reviewed-by: kbarrett, mgerdin, pliden, tschatzl
-
-diff --git openjdk.orig/hotspot/src/share/vm/prims/unsafe.cpp openjdk/hotspot/src/share/vm/prims/unsafe.cpp
---- openjdk.orig/hotspot/src/share/vm/prims/unsafe.cpp
-+++ openjdk/hotspot/src/share/vm/prims/unsafe.cpp
-@@ -199,37 +199,40 @@
- 
- // Get/SetObject must be special-cased, since it works with handles.
- 
-+// We could be accessing the referent field in a reference
-+// object. If G1 is enabled then we need to register non-null
-+// referent with the SATB barrier.
-+
-+#if INCLUDE_ALL_GCS
-+static bool is_java_lang_ref_Reference_access(oop o, jlong offset) {
-+  if (offset == java_lang_ref_Reference::referent_offset && o != NULL) {
-+    Klass* k = o->klass();
-+    if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
-+      assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
-+      return true;
-+    }
-+  }
-+ return false;
-+}
-+#endif
-+
-+static void ensure_satb_referent_alive(oop o, jlong offset, oop v) {
-+#if INCLUDE_ALL_GCS
-+  if (UseG1GC && v != NULL && is_java_lang_ref_Reference_access(o, offset)) {
-+    G1SATBCardTableModRefBS::enqueue(v);
-+  }
-+#endif
-+}
-+
- // The xxx140 variants for backward compatibility do not allow a full-width offset.
- UNSAFE_ENTRY(jobject, Unsafe_GetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset))
-   UnsafeWrapper("Unsafe_GetObject");
-   if (obj == NULL)  THROW_0(vmSymbols::java_lang_NullPointerException());
-   GET_OOP_FIELD(obj, offset, v)
--  jobject ret = JNIHandles::make_local(env, v);
--#if INCLUDE_ALL_GCS
--  // We could be accessing the referent field in a reference
--  // object. If G1 is enabled then we need to register a non-null
--  // referent with the SATB barrier.
--  if (UseG1GC) {
--    bool needs_barrier = false;
- 
--    if (ret != NULL) {
--      if (offset == java_lang_ref_Reference::referent_offset) {
--        oop o = JNIHandles::resolve_non_null(obj);
--        Klass* k = o->klass();
--        if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
--          assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
--          needs_barrier = true;
--        }
--      }
--    }
-+  ensure_satb_referent_alive(p, offset, v);
- 
--    if (needs_barrier) {
--      oop referent = JNIHandles::resolve(ret);
--      G1SATBCardTableModRefBS::enqueue(referent);
--    }
--  }
--#endif // INCLUDE_ALL_GCS
--  return ret;
-+  return JNIHandles::make_local(env, v);
- UNSAFE_END
- 
- UNSAFE_ENTRY(void, Unsafe_SetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jobject x_h))
-@@ -262,32 +265,10 @@
- UNSAFE_ENTRY(jobject, Unsafe_GetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
-   UnsafeWrapper("Unsafe_GetObject");
-   GET_OOP_FIELD(obj, offset, v)
--  jobject ret = JNIHandles::make_local(env, v);
--#if INCLUDE_ALL_GCS
--  // We could be accessing the referent field in a reference
--  // object. If G1 is enabled then we need to register non-null
--  // referent with the SATB barrier.
--  if (UseG1GC) {
--    bool needs_barrier = false;
- 
--    if (ret != NULL) {
--      if (offset == java_lang_ref_Reference::referent_offset && obj != NULL) {
--        oop o = JNIHandles::resolve(obj);
--        Klass* k = o->klass();
--        if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
--          assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
--          needs_barrier = true;
--        }
--      }
--    }
-+  ensure_satb_referent_alive(p, offset, v);
- 
--    if (needs_barrier) {
--      oop referent = JNIHandles::resolve(ret);
--      G1SATBCardTableModRefBS::enqueue(referent);
--    }
--  }
--#endif // INCLUDE_ALL_GCS
--  return ret;
-+  return JNIHandles::make_local(env, v);
- UNSAFE_END
- 
- UNSAFE_ENTRY(void, Unsafe_SetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
-@@ -312,6 +293,9 @@
-   } else {
-     (void)const_cast<oop&>(v = *(volatile oop*) addr);
-   }
-+
-+  ensure_satb_referent_alive(p, offset, v);
-+
-   OrderAccess::acquire();
-   return JNIHandles::make_local(env, v);
- UNSAFE_END
diff --git a/SOURCES/pr3539-rh1548475.patch b/SOURCES/pr3539-rh1548475.patch
index 492a080..9b40a7f 100644
--- a/SOURCES/pr3539-rh1548475.patch
+++ b/SOURCES/pr3539-rh1548475.patch
@@ -85,8 +85,8 @@ diff --git openjdk.orig/hotspot/make/linux/makefiles/jsig.make openjdk/hotspot/m
  # cause problems with interposing. See CR: 6466665
  # LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE))
  
--LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE)
-+LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE) $(EXTRA_LDFLAGS)
+-LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE) $(LDFLAGS_NO_EXEC_STACK)
++LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE) $(LDFLAGS_NO_EXEC_STACK) $(EXTRA_LDFLAGS)
  
  # DEBUG_BINARIES overrides everything, use full -g debug information
  ifeq ($(DEBUG_BINARIES), true)
@@ -105,7 +105,7 @@ diff --git openjdk.orig/hotspot/make/linux/makefiles/saproc.make openjdk/hotspot
 diff --git openjdk.orig/hotspot/make/linux/makefiles/vm.make openjdk/hotspot/make/linux/makefiles/vm.make
 --- openjdk.orig/hotspot/make/linux/makefiles/vm.make
 +++ openjdk/hotspot/make/linux/makefiles/vm.make
-@@ -130,7 +130,7 @@
+@@ -122,7 +122,7 @@
  
  # Extra flags from gnumake's invocation or environment
  CFLAGS += $(EXTRA_CFLAGS)
diff --git a/SOURCES/pr3634.patch b/SOURCES/pr3634.patch
new file mode 100644
index 0000000..caba2ac
--- /dev/null
+++ b/SOURCES/pr3634.patch
@@ -0,0 +1,16 @@
+diff --git openjdk.orig/hotspot/src/share/vm/gc_implementation/shenandoah/shenandoah_globals.hpp openjdk/hotspot/src/share/vm/gc_implementation/shenandoah/shenandoah_globals.hpp
+--- openjdk.orig/hotspot/src/share/vm/gc_implementation/shenandoah/shenandoah_globals.hpp
++++ openjdk/hotspot/src/share/vm/gc_implementation/shenandoah/shenandoah_globals.hpp
+@@ -55,10 +55,10 @@
+           "Size of the Shenandoah regions. "                                \
+           "Determined automatically by default.")                           \
+                                                                             \
+-  experimental(uintx, ShenandoahMinRegionSize, 256 * K,                     \
++  experimental(size_t, ShenandoahMinRegionSize, 256 * K,                     \
+           "Minimum heap region size. ")                                     \
+                                                                             \
+-  experimental(uintx, ShenandoahMaxRegionSize, 32 * M,                      \
++  experimental(size_t, ShenandoahMaxRegionSize, 32 * M,                      \
+           "Maximum heap region size. ")                                     \
+                                                                             \
+   experimental(intx, ShenandoahHumongousThreshold, 100,                     \
diff --git a/SPECS/java-1.8.0-openjdk.spec b/SPECS/java-1.8.0-openjdk.spec
index e81c4d5..460dab8 100644
--- a/SPECS/java-1.8.0-openjdk.spec
+++ b/SPECS/java-1.8.0-openjdk.spec
@@ -34,13 +34,6 @@
 %global include_debug_build 0
 %endif
 
-# On x86_64 and AArch64, we use the Shenandoah HotSpot
-%ifarch x86_64 %{aarch64}
-%global use_shenandoah_hotspot 1
-%else
-%global use_shenandoah_hotspot 0
-%endif
-
 %if %{include_debug_build}
 %global build_loop2 %{debug_suffix}
 %else
@@ -175,12 +168,13 @@
 %global origin          openjdk
 %global top_level_dir_name   %{origin}
 # note, following three variables are sedded from update_sources if used correctly. Hardcode them rather there.
-%global project         aarch64-port
-%global repo            jdk8u
-%global revision        aarch64-jdk8u181-b13
 %global shenandoah_project	aarch64-port
 %global shenandoah_repo		jdk8u-shenandoah
-%global shenandoah_revision    	aarch64-shenandoah-jdk8u181-b13
+%global shenandoah_revision    	aarch64-shenandoah-jdk8u191-b12
+# Define old aarch64/jdk8u tree variables for compatibility
+%global project         %{shenandoah_project}
+%global repo            %{shenandoah_repo}
+%global revision        %{shenandoah_revision}
 
 # eg # jdk8u60-b27 -> jdk8u60 or # aarch64-jdk8u60-b27 -> aarch64-jdk8u60  (dont forget spec escape % by %%)
 %global whole_update    %(VERSION=%{revision}; echo ${VERSION%%-*})
@@ -795,8 +789,8 @@ Provides: java-%{javaver}-%{origin}-accessibility = %{epoch}:%{version}-%{releas
 %global __jar_repack 0
 
 Name:    java-%{javaver}-%{origin}
-Version: %{javaver}.%{updatever}
-Release: 3.%{buildver}%{?dist}
+Version: %{javaver}.%{updatever}.%{buildver}
+Release: 0%{?dist}
 # java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons,
 # and this change was brought into RHEL-4.  java-1.5.0-ibm packages
 # also included the epoch in their virtual provides.  This created a
@@ -824,22 +818,15 @@ Group:   Development/Languages
 License:  ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib
 URL:      http://openjdk.java.net/
 
-# aarch64-port now contains integration forest of both aarch64 and normal jdk
-# Source from upstream OpenJDK8 project. To regenerate, use
-# VERSION=%%{revision} FILE_NAME_ROOT=%%{project}-%%{repo}-${VERSION}
-# REPO_ROOT=<path to checked-out repository> generate_source_tarball.sh
-# where the source is obtained from http://hg.openjdk.java.net/%%{project}/%%{repo}
-Source0: %{project}-%{repo}-%{revision}.tar.xz
-
 # Shenandoah HotSpot
 # aarch64-port/jdk8u-shenandoah contains an integration forest of
 # OpenJDK 8u, the aarch64 port and Shenandoah
 # To regenerate, use:
 # VERSION=%%{shenandoah_revision}
 # FILE_NAME_ROOT=%%{shenandoah_project}-%%{shenandoah_repo}-${VERSION}
-# REPO_ROOT=<path to checked-out repository> REPOS=hotspot generate_source_tarball.sh
+# REPO_ROOT=<path to checked-out repository> generate_source_tarball.sh
 # where the source is obtained from http://hg.openjdk.java.net/%%{project}/%%{repo}
-Source1: %{shenandoah_project}-%{shenandoah_repo}-%{shenandoah_revision}.tar.xz
+Source0: %{shenandoah_project}-%{shenandoah_repo}-%{shenandoah_revision}.tar.xz
 
 # Custom README for -src subpackage
 Source2:  README.src
@@ -980,8 +967,6 @@ Patch206: 8207057-pr3613-hotspot-assembler-debuginfo.patch
 # Patches appearing in 8u192
 # 8205104, PR3539, RH1548475: Pass EXTRA_LDFLAGS to HotSpot build
 Patch562: pr3539-rh1548475.patch
-# 8165489, PR3589: Missing G1 barrier in Unsafe_GetObjectVolatile
-Patch570: 8165489-pr3589.patch
 # 8206406, PR3610, RH1597825: StubCodeDesc constructor publishes partially-constructed objects on StubCodeDesc::_list
 Patch580: 8206406-pr3610-rh1597825.patch
 # 8206425: .gnu_debuglink sections added unconditionally when no debuginfo is stripped
@@ -1002,6 +987,8 @@ Patch539: pr2888.patch
 Patch540: pr3575-rh1567204.patch
 
 # Shenandoah fixes
+# PR3634: Shenandoah still broken on s390 with aarch64-shenandoah-jdk8u181-b16
+Patch582: pr3634.patch
 
 # Non-OpenJDK fixes
 
@@ -1269,16 +1256,6 @@ if [ $prioritylength -ne 7 ] ; then
 fi
 # For old patches
 ln -s %{top_level_dir_name} jdk8
-%if %{use_shenandoah_hotspot}
-# On Shenandoah-supported architectures, replace HotSpot with
-# the Shenandoah version
-pushd %{top_level_dir_name}
-tar -xf %{SOURCE1}
-rm -rf hotspot
-mv %{top_level_dir_name}/hotspot .
-rm -rf %{top_level_dir_name}
-popd
-%endif
 
 cp %{SOURCE2} .
 
@@ -1372,11 +1349,8 @@ sh %{SOURCE12}
 %patch534
 %endif
 
-# Shenandoah-only patches
-%if %{use_shenandoah_hotspot}
-%else
-%patch570
-%endif
+# Shenandoah patches
+%patch582
 
 # Extract systemtap tapsets
 %if %{with_systemtap}
@@ -2015,7 +1989,70 @@ require "copy_jdk_configs.lua"
 %endif
 
 %changelog
-* Mon Jul 16 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-7.b13
+* Tue Oct 09 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.191.b12-0
+- Update to aarch64-shenandoah-jdk8u191-b12.
+- Resolves: rhbz#1633817
+
+* Tue Oct 02 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.191.b10-0
+- Update to aarch64-shenandoah-jdk8u191-b10.
+- Drop 8146115/PR3508/RH1463098 applied upstream.
+- Resolves: rhbz#1633817
+
+* Mon Oct 01 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181.b16-0
+- Add new Shenandoah patch PR3634 as upstream still fails on s390.
+- Resolves: rhbz#1633817
+
+* Mon Oct 01 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181.b16-0
+- Update to aarch64-shenandoah-jdk8u181-b16.
+- Drop PR3619 & PR3620 Shenandoah patches which should now be fixed upstream.
+- Resolves: rhbz#1633817
+
+* Thu Aug 23 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181.b15-0
+- Move to single OpenJDK tarball build, based on aarch64/shenandoah-jdk8u.
+- Update to aarch64-shenandoah-jdk8u181-b15.
+- Drop 8165489-pr3589.patch which was only applied to aarch64/jdk8u builds.
+- Move buildver to where it should be in the OpenJDK version.
+- Split ppc64 Shenandoah fix into separate patch file with its own bug ID (PR3620).
+- Update pr3539-rh1548475.patch to apply after 8187045.
+- Resolves: rhbz#1633817
+
+* Sat Aug 11 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Remove unneeded functions from ppc shenandoahBarrierSet.
+- Resolves: rhbz#1633817
+
+* Wed Aug 08 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Add missing shenandoahBarrierSet implementation for ppc64{be,le}.
+- Resolves: rhbz#1633817
+
+* Tue Aug 07 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Fix wrong format specifiers in Shenandoah code.
+- Resolves: rhbz#1633817
+
+* Tue Aug 07 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Avoid changing variable types to fix size_t, at least for now.
+- Resolves: rhbz#1633817
+
+* Tue Aug 07 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- More size_t fixes for Shenandoah.
+- Resolves: rhbz#1633817
+
+* Fri Aug 03 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Add additional s390 size_t case for Shenandoah.
+- Resolves: rhbz#1633817
+
+* Fri Aug 03 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Actually add the patch...
+- Resolves: rhbz#1633817
+
+* Fri Aug 03 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Attempt to fix Shenandoah build issues on s390.
+- Resolves: rhbz#1633817
+
+* Mon Jul 23 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-4.b13
+- Use the Shenandoah HotSpot on all architectures.
+- Resolves: rhbz#1633817
+
+* Mon Jul 16 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.181-3.b13
 - Update to aarch64-jdk8u181-b13 and aarch64-shenandoah-jdk8u181-b13.
 - Remove 8187577/PR3578 now applied upstream.
 - Resolves: rhbz#1594249