diff --git a/.gitignore b/.gitignore
index d19e02f..010e1ba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-SOURCES/aarch64-port-jdk8u-aarch64-jdk8u101-b13.tar.xz
-SOURCES/systemtap-tapset.tar.gz
+SOURCES/aarch64-port-jdk8u-aarch64-jdk8u102-b14.tar.xz
+SOURCES/systemtap-tapset-3.1.0.tar.xz
diff --git a/.java-1.8.0-openjdk.metadata b/.java-1.8.0-openjdk.metadata
index be5b5b0..3ceac4b 100644
--- a/.java-1.8.0-openjdk.metadata
+++ b/.java-1.8.0-openjdk.metadata
@@ -1,2 +1,2 @@
-493d8737db5adf5aded6cc57ca3313604dc4f6ec SOURCES/aarch64-port-jdk8u-aarch64-jdk8u101-b13.tar.xz
-8dd5345808d840741a9619becc84302f44b54e78 SOURCES/systemtap-tapset.tar.gz
+4c11157a3c6ae41fb5345769a1f5cebd0de50d91 SOURCES/aarch64-port-jdk8u-aarch64-jdk8u102-b14.tar.xz
+44b09844ec2e90db08d3d883993e0dbab0c1988a SOURCES/systemtap-tapset-3.1.0.tar.xz
diff --git a/SOURCES/6961123-pr2972-rh1339740.patch b/SOURCES/6961123-pr2972-rh1339740.patch
deleted file mode 100644
index d880c5f..0000000
--- a/SOURCES/6961123-pr2972-rh1339740.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-# HG changeset patch
-# User omajid
-# Date 1451403643 18000
-#      Tue Dec 29 10:40:43 2015 -0500
-# Node ID 0be28a33e12dfc9ae1e4be381530643f691d351a
-# Parent  f4c9545cd8a56a5fab74c95de3573623ba2b83c4
-6961123, PR2972: setWMClass fails to null-terminate WM_CLASS string
-Reviewed-by: serb
-
-diff -r f4c9545cd8a5 -r 0be28a33e12d src/solaris/classes/sun/awt/X11/XBaseWindow.java
---- openjdk/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Thu Aug 28 05:20:02 2014 -0700
-+++ openjdk/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Tue Dec 29 10:40:43 2015 -0500
-@@ -673,7 +673,7 @@
-         XToolkit.awtLock();
-         try {
-             XAtom xa = XAtom.get(XAtom.XA_WM_CLASS);
--            xa.setProperty8(getWindow(), cl[0] + '\0' + cl[1]);
-+            xa.setProperty8(getWindow(), cl[0] + '\0' + cl[1] + '\0');
-         } finally {
-             XToolkit.awtUnlock();
-         }
diff --git a/SOURCES/8147771-additional_hunk.patch b/SOURCES/8147771-additional_hunk.patch
deleted file mode 100644
index 36c951d..0000000
--- a/SOURCES/8147771-additional_hunk.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-# HG changeset patch
-# User igerasim
-# Date 1468169506 -3600
-#      Sun Jul 10 17:51:46 2016 +0100
-# Node ID 5e27ac7f7cbc125d91530f9e49dcdb488eacc78f
-# Parent  8b1a17d4bf3d2a90fafbb1fccc8a6af7c4b38df5
-8147771: Construction of static protection domains under Javax custom policy
-Summary: Changed SubjectDomainCombiner to combine static PD as is even when custom policy is enabled.
-Reviewed-by: valeriep
-
-diff -r 8b1a17d4bf3d -r 5e27ac7f7cbc src/share/classes/javax/security/auth/SubjectDomainCombiner.java
---- openjdk/jdk/src/share/classes/javax/security/auth/SubjectDomainCombiner.java	Fri Jul 01 04:11:25 2016 +0100
-+++ openjdk/jdk/src/share/classes/javax/security/auth/SubjectDomainCombiner.java	Sun Jul 10 17:51:46 2016 +0100
-@@ -246,7 +246,8 @@
-                 if (subjectPd == null) {
-                     if (pdAccess.getStaticPermissionsField(pd)) {
-                         // Need to keep static ProtectionDomain objects static
--                        subjectPd = pd;
-+                        subjectPd = new ProtectionDomain(pd.getCodeSource(),
-+                                                pd.getPermissions());
-                     } else {
-                         subjectPd = new ProtectionDomain(pd.getCodeSource(),
-                                                 pd.getPermissions(),
diff --git a/SOURCES/8148752-pr2943-rh1330188.patch b/SOURCES/8148752-pr2943-rh1330188.patch
deleted file mode 100644
index d1207d0..0000000
--- a/SOURCES/8148752-pr2943-rh1330188.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-# HG changeset patch
-# User thartmann
-# Date 1455606693 -3600
-#      Tue Feb 16 08:11:33 2016 +0100
-# Node ID 7bb48ba4de4fb35c10c526146f65da74a3a16c7a
-# Parent  d15bc25b259dcffd2566f90ff09fd263e87e0304
-8148752, PR2943: Compiled StringBuilder code throws StringIndexOutOfBoundsException
-Summary: Fixed handling of long/double MH arguments in GraphBuilder::try_method_handle_inline().
-Reviewed-by: roland, shade, vlivanov, kvn, twisti
-
-diff -r d15bc25b259d -r 7bb48ba4de4f src/share/vm/opto/callGenerator.cpp
---- openjdk/hotspot/src/share/vm/opto/callGenerator.cpp	Wed Apr 20 04:04:43 2016 +0100
-+++ openjdk/hotspot/src/share/vm/opto/callGenerator.cpp	Tue Feb 16 08:11:33 2016 +0100
-@@ -829,17 +829,18 @@
-           }
-         }
-         // Cast reference arguments to its type.
--        for (int i = 0; i < signature->count(); i++) {
-+        for (int i = 0, j = 0; i < signature->count(); i++) {
-           ciType* t = signature->type_at(i);
-           if (t->is_klass()) {
--            Node* arg = kit.argument(receiver_skip + i);
-+            Node* arg = kit.argument(receiver_skip + j);
-             const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
-             const Type*       sig_type = TypeOopPtr::make_from_klass(t->as_klass());
-             if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
-               Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type));
--              kit.set_argument(receiver_skip + i, cast_obj);
-+              kit.set_argument(receiver_skip + j, cast_obj);
-             }
-           }
-+          j += t->size();  // long and double take two slots
-         }
- 
-         // Try to get the most accurate receiver type
-diff -r d15bc25b259d -r 7bb48ba4de4f test/compiler/jsr292/LongReferenceCastingTest.java
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ openjdk/hotspot/test/compiler/jsr292/LongReferenceCastingTest.java	Tue Feb 16 08:11:33 2016 +0100
-@@ -0,0 +1,75 @@
-+/*
-+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ *
-+ */
-+
-+import java.lang.invoke.*;
-+
-+/**
-+ * @test
-+ * @bug 8148752
-+ * @summary Test correct casting of MH arguments during inlining.
-+ * @run main LongReferenceCastingTest
-+ */
-+public class LongReferenceCastingTest {
-+    static final String MY_STRING = "myString";
-+    static final MethodHandle MH;
-+
-+    static {
-+        try {
-+            MethodHandles.Lookup lookup = MethodHandles.lookup();
-+            MethodType mt = MethodType.methodType(String.class, long.class, Object.class, String.class);
-+            MH = lookup.findVirtual(LongReferenceCastingTest.class, "myMethod", mt);
-+        } catch (Exception e) {
-+            throw new Error(e);
-+        }
-+    }
-+
-+    public String myMethod(long l, Object o, String s) {
-+        // The long argument occupies two stack slots, causing C2 to treat it as
-+        // two arguments and casting the fist one two long and the second one to Object.
-+        // As a result, Object o is casted to String and the o.toString() call is
-+        // inlined as String::toString(). We fail at runtime because 'o' is not a String.
-+        return o.toString();
-+    }
-+
-+    public String toString() {
-+        return MY_STRING;
-+    }
-+
-+    public static void main(String[] args) throws Exception {
-+        LongReferenceCastingTest test = new LongReferenceCastingTest();
-+        try {
-+            for (int i = 0; i < 20_000; ++i) {
-+                if (!test.invoke().equals(MY_STRING)) {
-+                    throw new RuntimeException("Invalid string");
-+                }
-+            }
-+        } catch (Throwable t) {
-+            throw new RuntimeException("Test failed", t);
-+        }
-+    }
-+
-+    public String invoke() throws Throwable {
-+        return (String) MH.invokeExact(this, 0L, (Object)this, MY_STRING);
-+    }
-+}
diff --git a/SOURCES/8157306-pr3121-rh1360863.patch b/SOURCES/8157306-pr3121-rh1360863.patch
new file mode 100644
index 0000000..8cb69ae
--- /dev/null
+++ b/SOURCES/8157306-pr3121-rh1360863.patch
@@ -0,0 +1,29 @@
+# HG changeset patch
+# User aph
+# Date 1470065634 -3600
+#      Mon Aug 01 16:33:54 2016 +0100
+# Node ID ee9bffb3bd390b2ad805c7b59d7d2ab8a68a4367
+# Parent  ab3e0bde3c15bbba60de4decabcd70ffef657448
+8157306, PR3121: Random infrequent null pointer exceptions in javac
+Reviewed-by: kvn
+
+diff -r ab3e0bde3c15 -r ee9bffb3bd39 src/share/vm/opto/lcm.cpp
+--- openjdk/hotspot/src/share/vm/opto/lcm.cpp	Tue Jul 26 04:42:03 2016 +0100
++++ openjdk/hotspot/src/share/vm/opto/lcm.cpp	Mon Aug 01 16:33:54 2016 +0100
+@@ -1090,11 +1090,14 @@
+     Block *sb = block->_succs[i];
+     // Clone the entire area; ignoring the edge fixup for now.
+     for( uint j = end; j > beg; j-- ) {
+-      // It is safe here to clone a node with anti_dependence
+-      // since clones dominate on each path.
+       Node *clone = block->get_node(j-1)->clone();
+       sb->insert_node(clone, 1);
+       map_node_to_block(clone, sb);
++#ifdef AARCH64
++      if (clone->needs_anti_dependence_check()) {
++        insert_anti_dependences(sb, clone);
++      }
++#endif
+     }
+   }
+ 
diff --git a/SOURCES/jstack-pr1845.patch b/SOURCES/jstack-pr1845.patch
deleted file mode 100644
index 5d036ba..0000000
--- a/SOURCES/jstack-pr1845.patch
+++ /dev/null
@@ -1,274 +0,0 @@
-diff -r c728621e76f2 tapset/jstack.stp.in
---- tapset/jstack-1.8.0.stp.in	Mon Jun 02 18:41:24 2014 +0100
-+++ tapset/jstack-1.8.0.stp.in	Sat Jun 14 00:21:14 2014 +0900
-@@ -45,11 +45,7 @@
-  semantic error: failed to retrieve location attribute for local
- */
- 
--global Universe_methodKlassObj;
--global Universe_collectedHeap;
--global HeapWordSize;
- global CodeCache_heap;
--global NarrowOopStruct;
- 
- global sp_register;
- global fp_register;
-@@ -57,9 +53,8 @@
- global ptr_size;
- global ptr_mask;
- 
--global constantPoolOopDesc_size;
-+global constantPool_size;
- global HeapBlock_Header_size;
--global oopDesc_size;
- 
- global vm_inited;
- 
-@@ -67,26 +62,6 @@
-    in a bare function and vm_init_end seems a good place to use. */
- probe hotspot.vm_init_end
- {
--  // The parent/type oop for a methodOop.
--  Universe_methodKlassObj[pid()] = %( systemtap_v >= "1.8"
--                                     %? @var("_methodKlassObj@universe.cpp")
--                                     %: $_methodKlassObj %);
--
--  /**
--   * The Universe class holds some of the interesting statics for
--   * introspection into HotSpot. The CollectedHeap
--   * (Universe::_collectedHeap) is an abstraction of a java heap for Hotspot
--   * it contains a _reserved MemRegion which represents a contigous
--   * region of the address space consisting of HeapWords (which just
--   * have one field member char *i).
--   *
--   * Note that we access it through its "short name" _collectedHeap.
--   */
--  Universe_collectedHeap[pid()] = %( systemtap_v >= "1.8"
--                                    %? @var("_collectedHeap@universe.cpp")
--                                    %: $_collectedHeap %);
--  HeapWordSize[pid()] = $HeapWordSize;
--
-   /**
-    * The CodeCache class contains the static CodeHeap _heap that
-    * is malloced at the start of the vm run and holds all generated
-@@ -107,17 +82,6 @@
-                             %? @var("_heap@codeCache.cpp")
-                             %: $_heap %);
- 
--  /**
--   * Does target process use CompressedOops ?
--   */
--  NarrowOopStruct[pid()] = 0;
--  %( systemtap_v >= "1.8"
--    %? if (@var("UseCompressedOops@globals.cpp"))
--         NarrowOopStruct[pid()] = &@var("_narrow_oop@universe.cpp");
--    %: if($UseCompressedOops)
--         NarrowOopStruct[pid()] = $_narrow_oop;
--  %)
--
-   // Should really check arch of user space (for 32bit jvm on 64bit kernel).
-   %( arch == "i386" %?
-      sp_register = "esp";
-@@ -136,22 +100,17 @@
- 
-   // Pretend we have an array at address zero and take address of second
-   // element and we have the size.
--  constantPoolOopDesc_size = &@cast(0, "constantPoolOopDesc")[1];
-+  constantPool_size = &@cast(0, "ConstantPool")[1];
- 
-   // Really should get from dwarf: @size("HeapBlock::Header"), @size("oopDesc")
-   HeapBlock_Header_size = 2 * ptr_size;
--  oopDesc_size = 2 * ptr_size;
- 
-   vm_inited[pid()] = 1;
- }
- 
- probe hotspot.vm_shutdown
- {
--  delete(Universe_methodKlassObj[pid()]);
--  delete(Universe_collectedHeap[pid()]);
--  delete(HeapWordSize[pid()]);
-   delete(CodeCache_heap[pid()]);
--  delete(NarrowOopStruct[pid()]);
-   delete(vm_inited[pid()]);
- }
- 
-@@ -262,15 +221,7 @@
-         return frame;
-     }
- 
--  // Extract heap and code bounds.
--  heap_start = @cast(Universe_collectedHeap[pid()],
--                     "CollectedHeap",
--                     "@ABS_SERVER_LIBJVM_SO@")->_reserved->_start;
--  heap_size = HeapWordSize[pid()] * @cast(Universe_collectedHeap[pid()],
--                                   "CollectedHeap",
--                                   "@ABS_SERVER_LIBJVM_SO@")->_reserved->_word_size;
--  heap_end = heap_start + heap_size;
--
-+  // Extract code bounds.
-   CodeCache_low = @cast(CodeCache_heap[pid()], "CodeHeap",
-                         "@ABS_SERVER_LIBJVM_SO@")->_memory->_low;
-   CodeCache_high =  @cast(CodeCache_heap[pid()], "CodeHeap",
-@@ -351,105 +302,69 @@
-               // For the interpreter (and other code blobs) it is on the
-               // stack relative to the frame pointer.
-               if (blob_name == "nmethod")
--                methodOopPtr = @cast(blob, "nmethod",
-+                methodPtr = @cast(blob, "nmethod",
-                                      "@ABS_SERVER_LIBJVM_SO@")->_method
-               else 
--                methodOopPtr = user_long(fp + (-3 * ptr_size)) & ptr_mask
--
--              // Start optimistic. A methodOop is only valid if it was
--              // heap allocated. And if the "type class" oop equals the
--              // Universe::methodKlassObj.
--              if (heap_start > methodOopPtr || methodOopPtr >= heap_end)
--                isMethodOop = 0
--              else
--                {
--                  if (NarrowOopStruct[pid()])
--                    {
--                      methodOopKlass = @cast(methodOopPtr, "methodOopDesc",
--                                             "@ABS_SERVER_LIBJVM_SO@")->_metadata->_compressed_klass;
--                      methodOopKlass = (@cast(NarrowOopStruct[pid()],
--                                              "NarrowOopStruct",
--                                              "@ABS_SERVER_LIBJVM_SO@")->_base
--                                        + (methodOopKlass
--                                           << @cast(NarrowOopStruct[pid()],
--                                                    "NarrowOopStruct",
--                                                    "@ABS_SERVER_LIBJVM_SO@")->_shift));
--                    }
--                  else
--                    methodOopKlass = @cast(methodOopPtr, "methodOopDesc",
--                                           "@ABS_SERVER_LIBJVM_SO@")->_metadata->_klass;
-+                methodPtr = user_long(fp + (-3 * ptr_size)) & ptr_mask
- 
--                  isMethodOop = (methodOopKlass == Universe_methodKlassObj[pid()]);
--                }
-+              // The java class is the holder of the constants (strings)
-+              // that describe the method and signature. This constant pool
-+              // contains symbolic information that describe the properties
-+              // of the class. The indexes for methods and signaturates in
-+              // the constant pool are Symbols that contain utf8
-+              // strings (plus lenghts). (We could also sanity check that
-+              // the tag value is correct [CONSTANT_String = 8]).
-+              // Note that the class name uses '/' instead of '.' as
-+              // package name separator and that the method signature is
-+              // encoded as a method descriptor string. Both of which we
-+              // don't demangle here.
-+              constMethod = @cast(methodPtr, "Method",
-+                                          "@ABS_SERVER_LIBJVM_SO@")->_constMethod;
-+              constantPool = @cast(constMethod, "ConstMethod",
-+                                          "@ABS_SERVER_LIBJVM_SO@")->_constants;
-+              constantPool_base = constantPool + constantPool_size;
-+
-+              klass = @cast(constantPool, "ConstantPool",
-+                               "@ABS_SERVER_LIBJVM_SO@")->_pool_holder;
-+              klassSymbol = @cast(klass, "Klass",
-+                                  "@ABS_SERVER_LIBJVM_SO@")->_name;
-+              klassName = &@cast(klassSymbol, "Symbol",
-+                                 "@ABS_SERVER_LIBJVM_SO@")->_body[0];
-+              klassLength = @cast(klassSymbol, "Symbol",
-+                                  "@ABS_SERVER_LIBJVM_SO@")->_length;
-+
-+              methodIndex = @cast(constMethod, "ConstMethod",
-+                                  "@ABS_SERVER_LIBJVM_SO@")->_name_index;
-+              methodSymbol = user_long(constantPool_base + (methodIndex * ptr_size));
-+              methodName = &@cast(methodSymbol, "Symbol",
-+                                  "@ABS_SERVER_LIBJVM_SO@")->_body[0];
-+              methodLength = @cast(methodSymbol, "Symbol",
-+                                   "@ABS_SERVER_LIBJVM_SO@")->_length;
- 
--              if (isMethodOop)
-+              if (log_sig)
-                 {
--                  // The java class is the holder of the constants (strings)
--                  // that describe the method and signature. This constant pool
--                  // contains symbolic information that describe the properties
--                  // of the class. The indexes for methods and signaturates in
--                  // the constant pool are Symbols that contain utf8
--                  // strings (plus lenghts). (We could also sanity check that
--                  // the tag value is correct [CONSTANT_String = 8]).
--                  // Note that the class name uses '/' instead of '.' as
--                  // package name separator and that the method signature is
--                  // encoded as a method descriptor string. Both of which we
--                  // don't demangle here.
--                  constantPoolOopDesc = @cast(methodOopPtr, "methodOopDesc",
--                                              "@ABS_SERVER_LIBJVM_SO@")->_constants;
--                  constantPoolOop_base = constantPoolOopDesc + constantPoolOopDesc_size;
--
--                  klassPtr = @cast(constantPoolOopDesc, "constantPoolOopDesc",
--                                   "@ABS_SERVER_LIBJVM_SO@")->_pool_holder;
--                  klassSymbol = @cast(klassPtr + oopDesc_size, "Klass",
--                                      "@ABS_SERVER_LIBJVM_SO@")->_name;
--                  klassName = &@cast(klassSymbol, "Symbol",
--                                     "@ABS_SERVER_LIBJVM_SO@")->_body[0];
--                  klassLength = @cast(klassSymbol, "Symbol",
--                                      "@ABS_SERVER_LIBJVM_SO@")->_length;
--
--                  methodIndex = @cast(methodOopPtr, "methodOopDesc",
--                                      "@ABS_SERVER_LIBJVM_SO@")->_constMethod->_name_index;
--                  methodOopDesc = user_long(constantPoolOop_base + (methodIndex * ptr_size)) - 1;
--                  methodName = &@cast(methodOopDesc, "Symbol",
--                                      "@ABS_SERVER_LIBJVM_SO@")->_body[0];
--                  methodLength = @cast(methodOopDesc, "Symbol",
--                                       "@ABS_SERVER_LIBJVM_SO@")->_length;
--
--                  if (log_sig)
--                    {
--                      sigIndex = @cast(methodOopPtr, "methodOopDesc",
--                                       "@ABS_SERVER_LIBJVM_SO@")->_constMethod->_signature_index;
--                      sigOopDesc = user_long(constantPoolOop_base
--                                             + (sigIndex * ptr_size)) - 1;
--                      sigName = &@cast(sigOopDesc, "Symbol",
--                                       "@ABS_SERVER_LIBJVM_SO@")->_body[0];
--                      sigLength = @cast(sigOopDesc, "Symbol",
--                                        "@ABS_SERVER_LIBJVM_SO@")->_length;
--                      sig = user_string_n(sigName, sigLength);
--                    }
--                  else
--                    sig = "";
--
--                  code_name = (log_native
--                               ? sprintf("<%s@0x%x>",
--                                         str_replace(blob_name, " ", "_"), pc)
--                               : "");
--
--                  frame = sprintf("%s.%s%s%s",
--                                  user_string_n(klassName, klassLength),
--                                  user_string_n(methodName, methodLength),
--                                  sig, code_name);
-+                  sigIndex = @cast(constMethod, "ConstMethod",
-+                                   "@ABS_SERVER_LIBJVM_SO@")->_signature_index;
-+                  sigSymbol = user_long(constantPool_base
-+                                         + (sigIndex * ptr_size));
-+                  sigName = &@cast(sigSymbol, "Symbol",
-+                                   "@ABS_SERVER_LIBJVM_SO@")->_body[0];
-+                  sigLength = @cast(sigSymbol, "Symbol",
-+                                    "@ABS_SERVER_LIBJVM_SO@")->_length;
-+                  sig = user_string_n(sigName, sigLength);
-                 }
-               else
--                {
--                  // This is probably just an internal function, not a java
--                  // method, just print the blob_name and continue.
--                  // fp is probably still trusted.
--                  if (log_native)
--                    frame = sprintf("<%s@0x%x>",
--                                    str_replace(blob_name, " ", "_"), pc);
--                }
-+                sig = "";
-+
-+              code_name = (log_native
-+                           ? sprintf("<%s@0x%x>",
-+                                     str_replace(blob_name, " ", "_"), pc)
-+                           : "");
-+
-+              frame = sprintf("%s.%s%s%s",
-+                              user_string_n(klassName, klassLength),
-+                              user_string_n(methodName, methodLength),
-+                              sig, code_name);
- 
-               // We cannot trust the frame pointer of compiled methods.
-               // The server (c2) jit compiler uses the fp register.
diff --git a/SOURCES/pr3083-rh1346460.patch b/SOURCES/pr3083-rh1346460.patch
new file mode 100644
index 0000000..d44ed1d
--- /dev/null
+++ b/SOURCES/pr3083-rh1346460.patch
@@ -0,0 +1,152 @@
+# HG changeset patch
+# User andrew
+# Date 1467652889 -3600
+#      Mon Jul 04 18:21:29 2016 +0100
+# Node ID a4541d1d8609cadb08d3e31b40b9184ff32dd6c3
+# Parent  bc6eab2038c603afb2eb2b4644f3b900c8fd0c46
+PR3083, RH1346460: Regression in SSL debug output without an ECC provider
+Summary: Return null rather than throwing an exception when there's no ECC provider.
+
+diff -r bc6eab2038c6 -r a4541d1d8609 src/share/classes/sun/security/util/Debug.java
+--- openjdk/jdk/src/share/classes/sun/security/util/Debug.java	Mon Jul 04 17:08:12 2016 +0100
++++ openjdk/jdk/src/share/classes/sun/security/util/Debug.java	Mon Jul 04 18:21:29 2016 +0100
+@@ -73,6 +73,7 @@
+         System.err.println("certpath      PKIX CertPathBuilder and");
+         System.err.println("              CertPathValidator debugging");
+         System.err.println("combiner      SubjectDomainCombiner debugging");
++        System.err.println("ecc           Elliptic Curve Cryptography debugging");
+         System.err.println("gssloginconfig");
+         System.err.println("              GSS LoginConfigImpl debugging");
+         System.err.println("configfile    JAAS ConfigFile loading");
+diff -r bc6eab2038c6 -r a4541d1d8609 src/share/classes/sun/security/util/ECUtil.java
+--- openjdk/jdk/src/share/classes/sun/security/util/ECUtil.java	Mon Jul 04 17:08:12 2016 +0100
++++ openjdk/jdk/src/share/classes/sun/security/util/ECUtil.java	Mon Jul 04 18:21:29 2016 +0100
+@@ -41,6 +41,9 @@
+ 
+ public class ECUtil {
+ 
++    /* Are we debugging ? */
++    private static final Debug debug = Debug.getInstance("ecc");
++
+     // Used by SunPKCS11 and SunJSSE.
+     public static ECPoint decodePoint(byte[] data, EllipticCurve curve)
+             throws IOException {
+@@ -90,6 +93,10 @@
+     }
+ 
+     private static AlgorithmParameters getECParameters(Provider p) {
++        return getECParameters(p, false);
++    }
++
++    private static AlgorithmParameters getECParameters(Provider p, boolean throwException) {
+         try {
+             if (p != null) {
+                 return AlgorithmParameters.getInstance("EC", p);
+@@ -97,13 +104,21 @@
+ 
+             return AlgorithmParameters.getInstance("EC");
+         } catch (NoSuchAlgorithmException nsae) {
+-            throw new RuntimeException(nsae);
++            if (throwException) {
++                throw new RuntimeException(nsae);
++            } else {
++                // ECC provider is optional so just return null
++                if (debug != null) {
++                    debug.println("Provider unavailable: " + nsae);
++                }
++                return null;
++            }
+         }
+     }
+ 
+     public static byte[] encodeECParameterSpec(Provider p,
+                                                ECParameterSpec spec) {
+-        AlgorithmParameters parameters = getECParameters(p);
++        AlgorithmParameters parameters = getECParameters(p, true);
+ 
+         try {
+             parameters.init(spec);
+@@ -122,11 +137,16 @@
+     public static ECParameterSpec getECParameterSpec(Provider p,
+                                                      ECParameterSpec spec) {
+         AlgorithmParameters parameters = getECParameters(p);
++        if (parameters == null)
++            return null;
+ 
+         try {
+             parameters.init(spec);
+             return parameters.getParameterSpec(ECParameterSpec.class);
+         } catch (InvalidParameterSpecException ipse) {
++            if (debug != null) {
++                debug.println("Invalid parameter specification: " + ipse);
++            }
+             return null;
+         }
+     }
+@@ -135,34 +155,49 @@
+                                                      byte[] params)
+             throws IOException {
+         AlgorithmParameters parameters = getECParameters(p);
++        if (parameters == null)
++            return null;
+ 
+         parameters.init(params);
+ 
+         try {
+             return parameters.getParameterSpec(ECParameterSpec.class);
+         } catch (InvalidParameterSpecException ipse) {
++            if (debug != null) {
++                debug.println("Invalid parameter specification: " + ipse);
++            }
+             return null;
+         }
+     }
+ 
+     public static ECParameterSpec getECParameterSpec(Provider p, String name) {
+         AlgorithmParameters parameters = getECParameters(p);
++        if (parameters == null)
++            return null;
+ 
+         try {
+             parameters.init(new ECGenParameterSpec(name));
+             return parameters.getParameterSpec(ECParameterSpec.class);
+         } catch (InvalidParameterSpecException ipse) {
++            if (debug != null) {
++                debug.println("Invalid parameter specification: " + ipse);
++            }
+             return null;
+         }
+     }
+ 
+     public static ECParameterSpec getECParameterSpec(Provider p, int keySize) {
+         AlgorithmParameters parameters = getECParameters(p);
++        if (parameters == null)
++            return null;
+ 
+         try {
+             parameters.init(new ECKeySizeParameterSpec(keySize));
+             return parameters.getParameterSpec(ECParameterSpec.class);
+         } catch (InvalidParameterSpecException ipse) {
++            if (debug != null) {
++                debug.println("Invalid parameter specification: " + ipse);
++            }
+             return null;
+         }
+ 
+@@ -171,11 +206,16 @@
+     public static String getCurveName(Provider p, ECParameterSpec spec) {
+         ECGenParameterSpec nameSpec;
+         AlgorithmParameters parameters = getECParameters(p);
++        if (parameters == null)
++            return null;
+ 
+         try {
+             parameters.init(spec);
+             nameSpec = parameters.getParameterSpec(ECGenParameterSpec.class);
+         } catch (InvalidParameterSpecException ipse) {
++            if (debug != null) {
++                debug.println("Invalid parameter specification: " + ipse);
++            }
+             return null;
+         }
+ 
diff --git a/SOURCES/soundFontPatch.patch b/SOURCES/soundFontPatch.patch
deleted file mode 100644
index 2009642..0000000
--- a/SOURCES/soundFontPatch.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-# HG changeset patch
-# User omajid
-# Date 1445973555 14400
-# Node ID 3e006ea10d21a7fcf15725c51f2ab7ededce53ab
-# Parent  dfeaf40df80032570558c031f37f6630dc729e3f
-8140620: Find and load default.sf2 as the default soundbank on Linux
-Reviewed-by: serb
-
-+++  openjdk/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java
----  openjdk/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java
-@@ -671,6 +671,40 @@
-             actions.add(new PrivilegedAction<InputStream>() {
-                 public InputStream run() {
-                     if (System.getProperties().getProperty("os.name")
-+                            .startsWith("Linux")) {
-+
-+                        File[] systemSoundFontsDir = new File[] {
-+                            /* Arch, Fedora, Mageia */
-+                            new File("/usr/share/soundfonts/"),
-+                            new File("/usr/local/share/soundfonts/"),
-+                            /* Debian, Gentoo, OpenSUSE, Ubuntu */
-+                            new File("/usr/share/sounds/sf2/"),
-+                            new File("/usr/local/share/sounds/sf2/"),
-+                        };
-+
-+                        /*
-+                         * Look for a default.sf2
-+                         */
-+                        for (File systemSoundFontDir : systemSoundFontsDir) {
-+                            if (systemSoundFontDir.exists()) {
-+                                File defaultSoundFont = new File(systemSoundFontDir, "default.sf2");
-+                                if (defaultSoundFont.exists()) {
-+                                    try {
-+                                        return new FileInputStream(defaultSoundFont);
-+                                    } catch (IOException e) {
-+                                        // continue with lookup
-+                                    }
-+                                }
-+                            }
-+                        }
-+                    }
-+                    return null;
-+                }
-+            });
-+
-+            actions.add(new PrivilegedAction<InputStream>() {
-+                public InputStream run() {
-+                    if (System.getProperties().getProperty("os.name")
-                             .startsWith("Windows")) {
-                         File gm_dls = new File(System.getenv("SystemRoot")
-                                 + "\\system32\\drivers\\gm.dls");
-
-
diff --git a/SPECS/java-1.8.0-openjdk.spec b/SPECS/java-1.8.0-openjdk.spec
index 12edc74..856d031 100644
--- a/SPECS/java-1.8.0-openjdk.spec
+++ b/SPECS/java-1.8.0-openjdk.spec
@@ -147,7 +147,7 @@
 # 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-jdk8u101-b13
+%global revision        aarch64-jdk8u102-b14
 # eg # jdk8u60-b27 -> jdk8u60 or # aarch64-jdk8u60-b27 -> aarch64-jdk8u60  (dont forget spec escape % by %%)
 %global whole_update    %(VERSION=%{revision}; echo ${VERSION%%-*})
 # eg  jdk8u60 -> 60 or aarch64-jdk8u60 -> 60
@@ -715,7 +715,7 @@ OrderWithRequires: %{name}-headless%1 = %{epoch}:%{version}-%{release}
 
 Name:    java-%{javaver}-%{origin}
 Version: %{javaver}.%{updatever}
-Release: 3.%{buildver}%{?dist}
+Release: 1.%{buildver}%{?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
@@ -735,7 +735,7 @@ 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=aarch64-jdk8u101-b13 FILE_NAME_ROOT=aarch64-port-jdk8u-${VERSION}
+# VERSION=aarch64-jdk8u102-b14 FILE_NAME_ROOT=aarch64-port-jdk8u-${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
@@ -747,7 +747,7 @@ Source2:  README.src
 # They are based on code contained in the IcedTea7 project.
 
 # Systemtap tapsets. Zipped up to keep it small.
-Source8: systemtap-tapset.tar.gz
+Source8: systemtap-tapset-3.1.0.tar.xz
 
 # Desktop files. Adapated from IcedTea.
 Source9: jconsole.desktop.in
@@ -787,6 +787,8 @@ Patch511: rh1214835.patch
 Patch512: no_strict_overflow.patch
 # RH1337583, PR2974: PKCS#10 certificate requests now use CRLF line endings rather than system line endings
 Patch523: pr2974-rh1343832.patch
+# PR3083, RH1346460: Regression in SSL debug output without an ECC provider
+Patch528: pr3083-rh1346460.patch
 
 # Arch-specific upstreamable patches
 # PR2415: JVM -Xmx requirement is too high on s390
@@ -810,18 +812,12 @@ Patch203: system-lcms.patch
 # PR2462: Backport "8074839: Resolve disabled warnings for libunpack and the unpack200 binary"
 # This fixes printf warnings that lead to build failure with -Werror=format-security from optflags
 Patch502: pr2462.patch
-# S8140620, PR2769: Find and load default.sf2 as the default soundbank on Linux
-Patch605: soundFontPatch.patch
-# S8158260, PR2991, RH1341258: JVM on PPC64 LE crashes due to an illegal instruction in JITed code
-Patch524: 8158260-pr2991-rh1341258.patch
 # S6260348, PR3066: GTK+ L&F JTextComponent not respecting desktop caret blink rate
 Patch526: 6260348-pr3066.patch
+# S8157306, PR3121, RH1360863: Random infrequent null pointer exceptions in javac
+Patch531: 8157306-pr3121-rh1360863.patch
 
-# Patches upstream and appearing in 8u102
-# S8148752, PR2943, RH1330188: Compiled StringBuilder code throws StringIndexOutOfBoundsException
-Patch519: 8148752-pr2943-rh1330188.patch
-# S6961123, PR2972, RH1339740:  Java application name in GNOME Shell contains funny characters
-Patch520: 6961123-pr2972-rh1339740.patch
+# Patches upstream and appearing in 8u111
 # S8159244, PR3074: Partially initialized string object created by C2's string concat optimization may escape
 Patch527: 8159244-pr3074.patch
 
@@ -832,6 +828,8 @@ Patch521: 8044762-pr2960.patch
 Patch522: 8049226-pr2960.patch
 # 8154210: Zero: Better byte behaviour
 Patch606: 8154210.patch
+# S8158260, PR2991, RH1341258: JVM on PPC64 LE crashes due to an illegal instruction in JITed code
+Patch524: 8158260-pr2991-rh1341258.patch
 
 # Patches ineligible for 8u
 # 8043805: Allow using a system-installed libjpeg
@@ -842,11 +840,8 @@ Patch201: system-libjpeg.patch
 Patch12: removeSunEcProvider-RH1154143.patch
 # Temporary fix for typo in CORBA security patch
 Patch529: corba_typo_fix.patch
-# Temporary fix to apply missing hunk from 8147771 (missed due to unneeded 8138811)
-Patch530: 8147771-additional_hunk.patch
 
 # Non-OpenJDK fixes
-Patch300: jstack-pr1845.patch
 
 BuildRequires: autoconf
 BuildRequires: automake
@@ -1115,26 +1110,23 @@ sh %{SOURCE12}
 %patch603
 %patch601
 %patch602
-%patch605
 
 %patch502
 %patch504
 %patch511
 %patch512
-%patch519
-%patch520
 %patch521
 %patch522
 %patch523
 %patch526
 %patch527
+%patch528
 %patch529
-%patch530
+%patch531
 
 # Extract systemtap tapsets
 %if %{with_systemtap}
-tar xzf %{SOURCE8}
-%patch300
+tar -x -I xz -f %{SOURCE8}
 %if %{include_debug_build}
 cp -r tapset tapset%{debug_suffix}
 %endif
@@ -1152,6 +1144,7 @@ for suffix in %{build_loop} ; do
 %endif
     sed -i -e s:@ABS_JAVA_HOME_DIR@:%{_jvmdir}/%{sdkdir $suffix}:g $OUTPUT_FILE
     sed -i -e s:@INSTALL_ARCH_DIR@:%{archinstall}:g $OUTPUT_FILE
+    sed -i -e s:@prefix@:%{_jvmdir}/%{sdkdir $suffix}/:g $OUTPUT_FILE
   done
 done
 # systemtap tapsets ends
@@ -1821,6 +1814,31 @@ end
 %endif
 
 %changelog
+* Tue Aug 30 2016 Jiri Vanek <jvanek@redhat.com> - 1:1.8.0.102-1.b14
+- New variable, @prefix@, needs to be substituted in tapsets (rhbz1371005)
+- Resolves: rhbz#1368440
+
+* Tue Aug 23 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.102-0.b14
+- Update to aarch64-jdk8u102-b14.
+- Drop 8140620, 8148752 and 6961123, all of which appear upstream in u102.
+- Move 8159244 to 8u111 section as it only appears to be in unpublished u102 b31.
+- Move 8158260 to 8u112 section following its backport to 8u.
+- Resolves: rhbz#1368440
+
+* Tue Aug 23 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.101-5.b15
+- Update to aarch64-jdk8u101-b15.
+- Rebase SystemTap tarball on IcedTea 3.1.0 versions so as to avoid patching.
+- Drop additional hunk for 8147771 which is now applied upstream.
+- Resolves: rhbz#1368440
+
+* Tue Aug 09 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.101-4.b13
+- Fix regression in SSL debug output when no ECC provider is available.
+- Resolves: rhbz#1365618
+
+* Mon Aug 01 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.101-4.b13
+- Add upstream patch for S8157306, documented & applied on all archs with conditional in patch
+- Resolves: rhbz#1365620
+
 * Mon Jul 11 2016 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.101-3.b13
 - Replace bad 8159244 patch from upstream 8u with fresh backport from OpenJDK 9.
 - Resolves: rhbz#1350036