Merge jdk8-b61
authorduke
Wed, 05 Jul 2017 18:26:11 +0200
changeset 14066 cdaa6122185f
parent 14065 a5c547191d8b (diff)
parent 13948 377a84796813 (current diff)
child 14067 b03f3620044b
child 14068 fa9e37ca6ade
child 14069 2ca7a2522cb4
child 14071 51cb26593d43
child 14072 11606bd0741b
child 14088 43f75cb620fb
child 14091 e5c8662f325d
child 14094 c5f2cddd1f98
child 14095 ab1fb3836ddb
child 14098 6fc9f2af5e0d
child 14100 ea25fe53bbce
child 14102 90de1dc5cd5b
child 14108 480731d07d2a
child 14154 9acc7f86a458
child 14159 0fe829613155
child 14180 66f6161a0bcb
child 14239 11ac4468449e
child 14247 6b14930af6e1
child 14264 1aca6b2e90a0
child 14276 50c4a858cb40
Merge
--- a/.hgtags-top-repo	Wed Jul 05 18:25:14 2017 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 18:26:11 2017 +0200
@@ -181,3 +181,4 @@
 522dfac8ca4d07c0b74025d4ac3b6e5feefbb829 jdk8-b57
 9367024804874faf8e958adeb333682bab1c0c47 jdk8-b58
 dae9821589ccd2611bdf7084269b98e819091770 jdk8-b59
+e07f499b9dccb529ecf74172cf6ac11a195ec57a jdk8-b60
--- a/corba/.hgtags	Wed Jul 05 18:25:14 2017 +0200
+++ b/corba/.hgtags	Wed Jul 05 18:26:11 2017 +0200
@@ -181,3 +181,4 @@
 f3ab4163ae012965fc8acdfc25ce0fece8d6906d jdk8-b57
 18462a19f7bd66d38015f61ea549a5e0c0c889a3 jdk8-b58
 d54dc53e223ed9ce7d5f4d2cd02ad9d5def3c2db jdk8-b59
+207ef43ba69ead6cbbab415d81834545e4d46747 jdk8-b60
--- a/corba/src/share/classes/sun/rmi/rmic/iiop/StubGenerator.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/corba/src/share/classes/sun/rmi/rmic/iiop/StubGenerator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1631,7 +1631,7 @@
 
         // Write data members...
         p.pln();
-        p.pln("private " + getName(theType) + " target = null;");
+        p.pln("volatile private " + getName(theType) + " target = null;");
         p.pln();
 
         // Write the ids...
@@ -1695,6 +1695,10 @@
 
         if (remoteMethods.length > 0) {
             p.plnI("try {");
+            p.pln(getName(theType) + " target = this.target;");
+            p.plnI("if (target == null) {");
+            p.pln("throw new java.io.IOException();");
+            p.pOln("}");
             p.plnI(idExtInputStream + " "+in+" = ");
             p.pln("(" + idExtInputStream + ") "+_in+";");
             p.pO();
--- a/hotspot/.hgtags	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/.hgtags	Wed Jul 05 18:26:11 2017 +0200
@@ -283,3 +283,5 @@
 f2e12eb74117c917c0bb264694c02de4a6a15a10 hs25-b03
 8a1a6b9b4f20fd2f6a12441d638e51f19a82db19 jdk8-b59
 1cc7a2a11d00832e3d07f81f3744a6883422db7e hs25-b04
+3cfd05b2219a29649741a52637696f06acf24a4e jdk8-b60
+b261523fe66c40a02968f0aa7e73602491bb3386 hs25-b05
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java	Wed Jul 05 18:26:11 2017 +0200
@@ -89,6 +89,7 @@
   public Address    getAddressAt       (long offset) throws UnmappedAddressException, UnalignedAddressException;
   /** Returns the decoded address at the given offset */
   public Address    getCompOopAddressAt (long offset) throws UnmappedAddressException, UnalignedAddressException;
+  public Address    getCompKlassAddressAt (long offset) throws UnmappedAddressException, UnalignedAddressException;
 
   //
   // Java-related routines
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -121,6 +121,9 @@
   public long getHeapOopSize();
   public long getNarrowOopBase();
   public int  getNarrowOopShift();
+  public long getKlassPtrSize();
+  public long getNarrowKlassBase();
+  public int  getNarrowKlassShift();
 
   public ReadResult readBytesFromProcess(long address, long numBytes)
     throws DebuggerException;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java	Wed Jul 05 18:26:11 2017 +0200
@@ -58,6 +58,10 @@
   protected long heapOopSize;
   protected long narrowOopBase;  // heap base for compressed oops.
   protected int  narrowOopShift; // shift to decode compressed oops.
+  // class metadata space
+  protected long klassPtrSize;
+  protected long narrowKlassBase;  // heap base for compressed klass ptrs.
+  protected int  narrowKlassShift; // shift to decode compressed klass ptrs.
   // Should be initialized if desired by calling initCache()
   private PageCache cache;
 
@@ -159,10 +163,14 @@
     javaPrimitiveTypesConfigured = true;
   }
 
-  public void putHeapConst(long heapOopSize, long narrowOopBase, int narrowOopShift) {
+  public void putHeapConst(long heapOopSize, long klassPtrSize, long narrowOopBase, int narrowOopShift,
+                           long narrowKlassBase, int narrowKlassShift) {
     this.heapOopSize = heapOopSize;
+    this.klassPtrSize = klassPtrSize;
     this.narrowOopBase = narrowOopBase;
     this.narrowOopShift = narrowOopShift;
+    this.narrowKlassBase = narrowKlassBase;
+    this.narrowKlassShift = narrowKlassShift;
   }
 
   /** May be called by subclasses if desired to initialize the page
@@ -464,6 +472,15 @@
     return value;
   }
 
+  protected long readCompKlassAddressValue(long address)
+    throws UnmappedAddressException, UnalignedAddressException {
+    long value = readCInteger(address, getKlassPtrSize(), true);
+    if (value != 0) {
+      value = (long)(narrowKlassBase + (long)(value << narrowKlassShift));
+    }
+    return value;
+  }
+
   protected void writeAddressValue(long address, long value)
     throws UnmappedAddressException, UnalignedAddressException {
     writeCInteger(address, machDesc.getAddressSize(), value);
@@ -551,4 +568,15 @@
   public int getNarrowOopShift() {
     return narrowOopShift;
   }
+
+  public long getKlassPtrSize() {
+    return klassPtrSize;
+  }
+
+  public long getNarrowKlassBase() {
+    return narrowKlassBase;
+  }
+  public int getNarrowKlassShift() {
+    return narrowKlassShift;
+  }
 }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -42,5 +42,7 @@
                                               long jintSize,
                                               long jlongSize,
                                               long jshortSize);
-  public void putHeapConst(long heapOopSize, long narrowOopBase, int narrowOopShift);
+  public void putHeapConst(long heapOopSize, long klassPtrSize,
+                           long narrowKlassBase, int narrowKlassShift,
+                           long narrowOopBase, int narrowOopShift);
 }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdAddress.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdAddress.java	Wed Jul 05 18:26:11 2017 +0200
@@ -79,6 +79,11 @@
         return debugger.readCompOopAddress(addr + offset);
     }
 
+    public Address getCompKlassAddressAt(long offset)
+            throws UnalignedAddressException, UnmappedAddressException {
+        return debugger.readCompOopAddress(addr + offset);
+    }
+
     //
     // Java-related routines
     //
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -46,6 +46,7 @@
     throws DebuggerException;
   public BsdAddress readAddress(long address) throws DebuggerException;
   public BsdAddress readCompOopAddress(long address) throws DebuggerException;
+  public BsdAddress readCompKlassAddress(long address) throws DebuggerException;
   public BsdOopHandle readOopHandle(long address) throws DebuggerException;
   public BsdOopHandle readCompOopHandle(long address) throws DebuggerException;
   public long[]       getThreadIntegerRegisterSet(int lwp_id) throws DebuggerException;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebuggerLocal.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebuggerLocal.java	Wed Jul 05 18:26:11 2017 +0200
@@ -431,6 +431,12 @@
         return (value == 0 ? null : new BsdAddress(this, value));
     }
 
+    public BsdAddress readCompKlassAddress(long address)
+            throws UnmappedAddressException, UnalignedAddressException {
+        long value = readCompKlassAddressValue(address);
+        return (value == 0 ? null : new BsdAddress(this, value));
+    }
+
     /** From the BsdDebugger interface */
     public BsdOopHandle readOopHandle(long address)
             throws UnmappedAddressException, UnalignedAddressException,
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java	Wed Jul 05 18:26:11 2017 +0200
@@ -80,6 +80,10 @@
     return new DummyAddress(debugger, badLong);
   }
 
+  public Address getCompKlassAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
+    return new DummyAddress(debugger, badLong);
+  }
+
   //
   // Java-related routines
   //
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java	Wed Jul 05 18:26:11 2017 +0200
@@ -79,6 +79,11 @@
         return debugger.readCompOopAddress(addr + offset);
     }
 
+    public Address getCompKlassAddressAt(long offset)
+            throws UnalignedAddressException, UnmappedAddressException {
+        return debugger.readCompKlassAddress(addr + offset);
+    }
+
     //
     // Java-related routines
     //
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -46,6 +46,7 @@
     throws DebuggerException;
   public LinuxAddress readAddress(long address) throws DebuggerException;
   public LinuxAddress readCompOopAddress(long address) throws DebuggerException;
+  public LinuxAddress readCompKlassAddress(long address) throws DebuggerException;
   public LinuxOopHandle readOopHandle(long address) throws DebuggerException;
   public LinuxOopHandle readCompOopHandle(long address) throws DebuggerException;
   public long[]       getThreadIntegerRegisterSet(int lwp_id) throws DebuggerException;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java	Wed Jul 05 18:26:11 2017 +0200
@@ -429,6 +429,12 @@
         return (value == 0 ? null : new LinuxAddress(this, value));
     }
 
+    public LinuxAddress readCompKlassAddress(long address)
+            throws UnmappedAddressException, UnalignedAddressException {
+        long value = readCompKlassAddressValue(address);
+        return (value == 0 ? null : new LinuxAddress(this, value));
+    }
+
     /** From the LinuxDebugger interface */
     public LinuxOopHandle readOopHandle(long address)
             throws UnmappedAddressException, UnalignedAddressException,
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java	Wed Jul 05 18:26:11 2017 +0200
@@ -76,6 +76,10 @@
     return debugger.readCompOopAddress(addr + offset);
   }
 
+  public Address getCompKlassAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
+    return debugger.readCompKlassAddress(addr + offset);
+  }
+
   //
   // Java-related routines
   //
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -47,6 +47,7 @@
     throws DebuggerException;
   public ProcAddress   readAddress(long address) throws DebuggerException;
   public ProcAddress   readCompOopAddress(long address) throws DebuggerException;
+  public ProcAddress   readCompKlassAddress(long address) throws DebuggerException;
   public ProcOopHandle readOopHandle(long address) throws DebuggerException;
   public ProcOopHandle readCompOopHandle(long address) throws DebuggerException;
   public long[]       getThreadIntegerRegisterSet(int tid) throws DebuggerException;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java	Wed Jul 05 18:26:11 2017 +0200
@@ -351,6 +351,12 @@
         return (value == 0 ? null : new ProcAddress(this, value));
     }
 
+    public ProcAddress readCompKlassAddress(long address)
+    throws UnmappedAddressException, UnalignedAddressException {
+        long value = readCompKlassAddressValue(address);
+        return (value == 0 ? null : new ProcAddress(this, value));
+    }
+
     /** From the ProcDebugger interface */
     public ProcOopHandle readOopHandle(long address)
     throws UnmappedAddressException, UnalignedAddressException, NotInHeapException {
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java	Wed Jul 05 18:26:11 2017 +0200
@@ -74,6 +74,9 @@
   public Address getCompOopAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
     return debugger.readCompOopAddress(addr + offset);
   }
+  public Address getCompKlassAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
+    return debugger.readCompKlassAddress(addr + offset);
+  }
 
   //
   // Java-related routines
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -68,6 +68,9 @@
   public long      getHeapOopSize() throws RemoteException;
   public long      getNarrowOopBase() throws RemoteException;
   public int       getNarrowOopShift() throws RemoteException;
+  public long      getKlassPtrSize() throws RemoteException;
+  public long      getNarrowKlassBase() throws RemoteException;
+  public int       getNarrowKlassShift() throws RemoteException;
 
   public boolean   areThreadsEqual(long addrOrId1, boolean isAddress1,
                                    long addrOrId2, boolean isAddress2) throws RemoteException;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java	Wed Jul 05 18:26:11 2017 +0200
@@ -99,7 +99,10 @@
       javaPrimitiveTypesConfigured = true;
       narrowOopBase  = remoteDebugger.getNarrowOopBase();
       narrowOopShift = remoteDebugger.getNarrowOopShift();
+      narrowKlassBase  = remoteDebugger.getNarrowKlassBase();
+      narrowKlassShift = remoteDebugger.getNarrowKlassShift();
       heapOopSize  = remoteDebugger.getHeapOopSize();
+      klassPtrSize  = remoteDebugger.getKlassPtrSize();
     }
     catch (RemoteException e) {
       throw new DebuggerException(e);
@@ -319,6 +322,12 @@
     return (value == 0 ? null : new RemoteAddress(this, value));
   }
 
+  RemoteAddress readCompKlassAddress(long address)
+    throws UnmappedAddressException, UnalignedAddressException {
+    long value = readCompKlassAddressValue(address);
+    return (value == 0 ? null : new RemoteAddress(this, value));
+  }
+
   RemoteOopHandle readOopHandle(long address)
     throws UnmappedAddressException, UnalignedAddressException, NotInHeapException {
     long value = readAddressValue(address);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -126,6 +126,18 @@
     return debugger.getNarrowOopShift();
   }
 
+  public long getKlassPtrSize() throws RemoteException {
+    return debugger.getHeapOopSize();
+  }
+
+  public long getNarrowKlassBase() throws RemoteException {
+    return debugger.getNarrowKlassBase();
+  }
+
+  public int  getNarrowKlassShift() throws RemoteException {
+    return debugger.getNarrowKlassShift();
+  }
+
   public boolean   areThreadsEqual(long addrOrId1, boolean isAddress1,
                                    long addrOrId2, boolean isAddress2) throws RemoteException {
     ThreadProxy t1 = getThreadProxy(addrOrId1, isAddress1);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java	Wed Jul 05 18:26:11 2017 +0200
@@ -76,6 +76,10 @@
     return debugger.readCompOopAddress(addr + offset);
   }
 
+  public Address getCompKlassAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
+    return debugger.readCompKlassAddress(addr + offset);
+  }
+
   //
   // Java-related routines
   //
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java	Wed Jul 05 18:26:11 2017 +0200
@@ -46,6 +46,7 @@
     throws DebuggerException;
   public WindbgAddress readAddress(long address) throws DebuggerException;
   public WindbgAddress readCompOopAddress(long address) throws DebuggerException;
+  public WindbgAddress readCompKlassAddress(long address) throws DebuggerException;
   public WindbgOopHandle readOopHandle(long address) throws DebuggerException;
   public WindbgOopHandle readCompOopHandle(long address) throws DebuggerException;
 
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java	Wed Jul 05 18:26:11 2017 +0200
@@ -321,6 +321,11 @@
     return (WindbgAddress) newAddress(readCompOopAddressValue(address));
   }
 
+  public WindbgAddress readCompKlassAddress(long address)
+    throws UnmappedAddressException, UnalignedAddressException {
+    return (WindbgAddress) newAddress(readCompKlassAddressValue(address));
+  }
+
   /** From the WindbgDebugger interface */
   public WindbgOopHandle readOopHandle(long address)
     throws UnmappedAddressException, UnalignedAddressException, NotInHeapException {
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java	Wed Jul 05 18:26:11 2017 +0200
@@ -53,6 +53,8 @@
 
   private static AddressField narrowOopBaseField;
   private static CIntegerField narrowOopShiftField;
+  private static AddressField narrowKlassBaseField;
+  private static CIntegerField narrowKlassShiftField;
 
   static {
     VM.registerVMInitializedObserver(new Observer() {
@@ -86,6 +88,8 @@
 
     narrowOopBaseField = type.getAddressField("_narrow_oop._base");
     narrowOopShiftField = type.getCIntegerField("_narrow_oop._shift");
+    narrowKlassBaseField = type.getAddressField("_narrow_klass._base");
+    narrowKlassShiftField = type.getCIntegerField("_narrow_klass._shift");
   }
 
   public Universe() {
@@ -111,6 +115,19 @@
     return (int)narrowOopShiftField.getValue();
   }
 
+  public static long getNarrowKlassBase() {
+    if (narrowKlassBaseField.getValue() == null) {
+      return 0;
+    } else {
+      return narrowKlassBaseField.getValue().minus(null);
+    }
+  }
+
+  public static int getNarrowKlassShift() {
+    return (int)narrowKlassShiftField.getValue();
+  }
+
+
   /** Returns "TRUE" iff "p" points into the allocated area of the heap. */
   public boolean isIn(Address p) {
     return heap().isIn(p);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Array.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Array.java	Wed Jul 05 18:26:11 2017 +0200
@@ -59,7 +59,7 @@
     if (headerSize != 0) {
       return headerSize;
     }
-    if (VM.getVM().isCompressedHeadersEnabled()) {
+    if (VM.getVM().isCompressedKlassPointersEnabled()) {
       headerSize = typeSize;
     } else {
       headerSize = VM.getVM().alignUp(typeSize + VM.getVM().getIntSize(),
@@ -80,7 +80,7 @@
     if (lengthOffsetInBytes != 0) {
       return lengthOffsetInBytes;
     }
-    if (VM.getVM().isCompressedHeadersEnabled()) {
+    if (VM.getVM().isCompressedKlassPointersEnabled()) {
       lengthOffsetInBytes = typeSize - VM.getVM().getIntSize();
     } else {
       lengthOffsetInBytes = typeSize;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java	Wed Jul 05 18:26:11 2017 +0200
@@ -44,7 +44,7 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
-    Type type          = db.lookupType("arrayKlass");
+    Type type          = db.lookupType("ArrayKlass");
     dimension          = new CIntField(type.getCIntegerField("_dimension"), 0);
     higherDimension    = new MetadataField(type.getAddressField("_higher_dimension"), 0);
     lowerDimension     = new MetadataField(type.getAddressField("_lower_dimension"), 0);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/BranchData.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/BranchData.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/CounterData.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/CounterData.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Instance.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Instance.java	Wed Jul 05 18:26:11 2017 +0200
@@ -53,7 +53,7 @@
 
   // Returns header size in bytes.
   public static long getHeaderSize() {
-    if (VM.getVM().isCompressedHeadersEnabled()) {
+    if (VM.getVM().isCompressedKlassPointersEnabled()) {
       return typeSize - VM.getVM().getIntSize();
     } else {
       return typeSize;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/JumpData.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/JumpData.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java	Wed Jul 05 18:26:11 2017 +0200
@@ -188,11 +188,11 @@
   public Klass arrayKlassOrNull()         { return arrayKlassImpl(true);        }
 
   public Klass arrayKlassImpl(boolean orNull, int rank) {
-    throw new RuntimeException("array_klass should be dispatched to InstanceKlass, objArrayKlass or typeArrayKlass");
+    throw new RuntimeException("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
   }
 
   public Klass arrayKlassImpl(boolean orNull) {
-    throw new RuntimeException("array_klass should be dispatched to InstanceKlass, objArrayKlass or typeArrayKlass");
+    throw new RuntimeException("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
   }
 
   // This returns the name in the form java/lang/String which isn't really a signature
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Metadata.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Metadata.java	Wed Jul 05 18:26:11 2017 +0200
@@ -55,8 +55,8 @@
     metadataConstructor.addMapping("InstanceMirrorKlass", InstanceMirrorKlass.class);
     metadataConstructor.addMapping("InstanceRefKlass", InstanceRefKlass.class);
     metadataConstructor.addMapping("InstanceClassLoaderKlass", InstanceClassLoaderKlass.class);
-    metadataConstructor.addMapping("typeArrayKlass", TypeArrayKlass.class);
-    metadataConstructor.addMapping("objArrayKlass", ObjArrayKlass.class);
+    metadataConstructor.addMapping("TypeArrayKlass", TypeArrayKlass.class);
+    metadataConstructor.addMapping("ObjArrayKlass", ObjArrayKlass.class);
     metadataConstructor.addMapping("Method", Method.class);
     metadataConstructor.addMapping("MethodData", MethodData.class);
     metadataConstructor.addMapping("ConstMethod", ConstMethod.class);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/MetadataField.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/MetadataField.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,7 +27,6 @@
 import sun.jvm.hotspot.runtime.VMObject;
 import sun.jvm.hotspot.debugger.*;
 
-// The class for an C int field simply provides access to the value.
 public class MetadataField extends Field {
 
   public MetadataField(sun.jvm.hotspot.types.AddressField vmField, long startOffset) {
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/MultiBranchData.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/MultiBranchData.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/NarrowKlassField.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2012, 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.
+ *
+ */
+
+package sun.jvm.hotspot.oops;
+
+import sun.jvm.hotspot.debugger.*;
+
+public class NarrowKlassField extends MetadataField {
+
+  public NarrowKlassField(sun.jvm.hotspot.types.AddressField vmField, long startOffset) {
+    super(vmField, startOffset);
+  }
+
+  public Metadata getValue(Address addr) {
+    return Metadata.instantiateWrapperFor(addr.getCompKlassAddressAt(getOffset()));
+  }
+  public void setValue(Oop obj, long value) throws MutationException {
+    // Fix this: set* missing in Address
+  }
+}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjArrayKlass.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjArrayKlass.java	Wed Jul 05 18:26:11 2017 +0200
@@ -43,7 +43,7 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
-    Type type = db.lookupType("objArrayKlass");
+    Type type = db.lookupType("ObjArrayKlass");
     elementKlass = new MetadataField(type.getAddressField("_element_klass"), 0);
     bottomKlass  = new MetadataField(type.getAddressField("_bottom_klass"), 0);
   }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java	Wed Jul 05 18:26:11 2017 +0200
@@ -47,10 +47,7 @@
     Type type  = db.lookupType("oopDesc");
     mark       = new CIntField(type.getCIntegerField("_mark"), 0);
     klass      = new MetadataField(type.getAddressField("_metadata._klass"), 0);
-    if (VM.getVM().isCompressedHeadersEnabled()) {
-      // compressedKlass  = new CIntField(type.getCIntegerField("_metadata._compressed_klass"), 0);
-      throw new InternalError("unimplemented");
-    }
+    compressedKlass  = new NarrowKlassField(type.getAddressField("_metadata._compressed_klass"), 0);
     headerSize = type.getSize();
   }
 
@@ -74,13 +71,13 @@
 
   private static CIntField mark;
   private static MetadataField  klass;
-  private static CIntField compressedKlass;
+  private static NarrowKlassField compressedKlass;
 
   // Accessors for declared fields
   public Mark  getMark()   { return new Mark(getHandle()); }
   public Klass getKlass() {
-    if (VM.getVM().isCompressedHeadersEnabled()) {
-      throw new InternalError("unimplemented");
+    if (VM.getVM().isCompressedKlassPointersEnabled()) {
+      return (Klass)compressedKlass.getValue(getHandle());
     } else {
       return (Klass)klass.getValue(getHandle());
     }
@@ -150,7 +147,7 @@
   void iterateFields(OopVisitor visitor, boolean doVMFields) {
     if (doVMFields) {
       visitor.doCInt(mark, true);
-      if (VM.getVM().isCompressedHeadersEnabled()) {
+      if (VM.getVM().isCompressedKlassPointersEnabled()) {
         throw new InternalError("unimplemented");
       } else {
         visitor.doMetadata(klass, true);
@@ -210,8 +207,8 @@
     if (handle == null) {
       return null;
     }
-    if (VM.getVM().isCompressedHeadersEnabled()) {
-      throw new InternalError("Unimplemented");
+    if (VM.getVM().isCompressedKlassPointersEnabled()) {
+      return (Klass)Metadata.instantiateWrapperFor(handle.getCompKlassAddressAt(compressedKlass.getOffset()));
     } else {
       return (Klass)Metadata.instantiateWrapperFor(handle.getAddressAt(klass.getOffset()));
     }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/TypeArrayKlass.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/TypeArrayKlass.java	Wed Jul 05 18:26:11 2017 +0200
@@ -31,7 +31,7 @@
 import sun.jvm.hotspot.types.*;
 import sun.jvm.hotspot.utilities.*;
 
-// TypeArrayKlass is a proxy for typeArrayKlass in the JVM
+// TypeArrayKlass is a proxy for TypeArrayKlass in the JVM
 
 public class TypeArrayKlass extends ArrayKlass {
   static {
@@ -43,7 +43,7 @@
   }
 
   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
-    Type t             = db.lookupType("typeArrayKlass");
+    Type t             = db.lookupType("TypeArrayKlass");
     maxLength          = new CIntField(t.getCIntegerField("_max_length"), 0);
   }
 
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/VirtualCallData.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/VirtualCallData.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/java_lang_Class.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/java_lang_Class.java	Wed Jul 05 18:26:11 2017 +0200
@@ -63,11 +63,7 @@
 
   /** get Klass* field at offset hc_klass_offset from a java.lang.Class object */
   public static Klass asKlass(Oop aClass) {
-    if (VM.getVM().isCompressedHeadersEnabled()) {
-      throw new InternalError("unimplemented");
-    } else {
-      return (Klass)Metadata.instantiateWrapperFor(aClass.getHandle().getAddressAt(klassOffset));
-    }
+    return (Klass)Metadata.instantiateWrapperFor(aClass.getHandle().getAddressAt(klassOffset));
   }
 
   /** get oop_size field at offset oop_size_offset from a java.lang.Class object */
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java	Wed Jul 05 18:26:11 2017 +0200
@@ -103,6 +103,7 @@
   private int          logMinObjAlignmentInBytes;
   private int          heapWordSize;
   private int          heapOopSize;
+  private int          klassPtrSize;
   private int          oopSize;
   /** This is only present in a non-core build */
   private CodeCache    codeCache;
@@ -129,7 +130,7 @@
   private static CIntegerType boolType;
   private Boolean sharingEnabled;
   private Boolean compressedOopsEnabled;
-  private Boolean compressedHeadersEnabled;
+  private Boolean compressedKlassPointersEnabled;
 
   // command line flags supplied to VM - see struct Flag in globals.hpp
   public static final class Flag {
@@ -350,6 +351,12 @@
     } else {
       heapOopSize = (int)getOopSize();
     }
+
+    if (isCompressedKlassPointersEnabled()) {
+      klassPtrSize = (int)getIntSize();
+    } else {
+      klassPtrSize = (int)getOopSize(); // same as an oop
+    }
   }
 
   /** This could be used by a reflective runtime system */
@@ -374,8 +381,9 @@
       ((Observer) iter.next()).update(null, null);
     }
 
-    debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(),
-                          Universe.getNarrowOopShift());
+    debugger.putHeapConst(soleInstance.getHeapOopSize(), soleInstance.getKlassPtrSize(),
+                          Universe.getNarrowOopBase(), Universe.getNarrowOopShift(),
+                          Universe.getNarrowKlassBase(), Universe.getNarrowKlassShift());
   }
 
   /** This is used by the debugging system */
@@ -536,6 +544,10 @@
   public int getHeapOopSize() {
     return heapOopSize;
   }
+
+  public int getKlassPtrSize() {
+    return klassPtrSize;
+  }
   /** Utility routine for getting data structure alignment correct */
   public long alignUp(long size, long alignment) {
     return (size + alignment - 1) & ~(alignment - 1);
@@ -784,13 +796,13 @@
     return compressedOopsEnabled.booleanValue();
   }
 
-  public boolean isCompressedHeadersEnabled() {
-    if (compressedHeadersEnabled == null) {
-        Flag flag = getCommandLineFlag("UseCompressedHeaders");
-        compressedHeadersEnabled = (flag == null) ? Boolean.FALSE:
+  public boolean isCompressedKlassPointersEnabled() {
+    if (compressedKlassPointersEnabled == null) {
+        Flag flag = getCommandLineFlag("UseCompressedKlassPointers");
+        compressedKlassPointersEnabled = (flag == null) ? Boolean.FALSE:
              (flag.getBool()? Boolean.TRUE: Boolean.FALSE);
     }
-    return compressedHeadersEnabled.booleanValue();
+    return compressedKlassPointersEnabled.booleanValue();
   }
 
   public int getObjectAlignmentInBytes() {
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -354,15 +354,14 @@
     }
 
     protected void writeFields() throws IOException {
-        U2Array fields = klass.getFields();
-        final int length = (int) fields.length();
+        final int javaFieldsCount = klass.getJavaFieldsCount();
 
         // write number of fields
-        dos.writeShort((short) length);
+        dos.writeShort((short) javaFieldsCount);
 
-        if (DEBUG) debugMessage("number of fields = " + length);
+        if (DEBUG) debugMessage("number of fields = " + javaFieldsCount);
 
-        for (int index = 0; index < length; index++) {
+        for (int index = 0; index < javaFieldsCount; index++) {
             short accessFlags    = klass.getFieldAccessFlags(index);
             dos.writeShort(accessFlags & (short) JVM_RECOGNIZED_FIELD_MODIFIERS);
 
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -53,9 +53,8 @@
   private static void initialize(TypeDataBase db) {
     Type type = db.lookupType("oopDesc");
 
-    if (VM.getVM().isCompressedHeadersEnabled()) {
-      // klassField = type.getNarrowOopField("_metadata._compressed_klass");
-      throw new InternalError("unimplemented");
+    if (VM.getVM().isCompressedKlassPointersEnabled()) {
+      klassField = type.getAddressField("_metadata._compressed_klass");
     } else {
       klassField = type.getAddressField("_metadata._klass");
     }
@@ -70,7 +69,11 @@
     }
     try {
       // Try to instantiate the Klass
-      Metadata.instantiateWrapperFor(klassField.getValue(oop));
+      if (VM.getVM().isCompressedKlassPointersEnabled()) {
+        Metadata.instantiateWrapperFor(oop.getCompKlassAddressAt(klassField.getOffset()));
+      } else {
+        Metadata.instantiateWrapperFor(klassField.getValue(oop));
+      }
           return true;
         }
     catch (AddressException e) {
--- a/hotspot/agent/src/share/native/sadis.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/agent/src/share/native/sadis.c	Wed Jul 05 18:26:11 2017 +0200
@@ -46,7 +46,7 @@
 
 #else
 
-#include <strings.h>
+#include <string.h>
 #include <dlfcn.h>
 #include <link.h>
 
--- a/hotspot/make/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -76,6 +76,8 @@
 
 include $(GAMMADIR)/make/altsrc.make
 
+-include $(HS_ALT_MAKE)/Makefile.make
+
 ifneq ($(ALT_OUTPUTDIR),)
   ALT_OUT=ALT_OUTPUTDIR=$(ALT_OUTPUTDIR)
 else
@@ -88,16 +90,23 @@
 KERNEL_VM_TARGETS=productkernel fastdebugkernel optimizedkernel jvmgkernel
 ZERO_VM_TARGETS=productzero fastdebugzero optimizedzero jvmgzero
 SHARK_VM_TARGETS=productshark fastdebugshark optimizedshark jvmgshark
+MINIMAL1_VM_TARGETS=productminimal1 fastdebugminimal1 jvmgminimal1
 
-COMMON_VM_PRODUCT_TARGETS=product product1 productkernel docs export_product
-COMMON_VM_FASTDEBUG_TARGETS=fastdebug fastdebug1 fastdebugkernel docs export_fastdebug
-COMMON_VM_DEBUG_TARGETS=jvmg jvmg1 jvmgkernel docs export_debug
+COMMON_VM_PRODUCT_TARGETS=product product1 docs export_product
+COMMON_VM_FASTDEBUG_TARGETS=fastdebug fastdebug1 docs export_fastdebug
+COMMON_VM_DEBUG_TARGETS=jvmg jvmg1 docs export_debug
 
 # JDK directory list
 JDK_DIRS=bin include jre lib demo
 
 all:           all_product all_fastdebug
 
+ifeq ($(JVM_VARIANT_MINIMAL1),true)
+all_product:	productminimal1
+all_fastdebug:	fastdebugminimal1
+all_debug:	jvmgminimal1
+endif
+
 ifdef BUILD_CLIENT_ONLY
 all_product:   product1 docs export_product
 all_fastdebug: fastdebug1 docs export_fastdebug
@@ -114,7 +123,7 @@
 endif
 endif
 
-all_optimized: optimized optimized1 optimizedkernel docs export_optimized
+all_optimized: optimized optimized1 docs export_optimized
 
 allzero:           all_productzero all_fastdebugzero
 all_productzero:   productzero docs export_product
@@ -167,6 +176,11 @@
 	$(MAKE) BUILD_FLAVOR=$(@:%shark=%) VM_TARGET=$@ \
 	  generic_buildshark $(ALT_OUT)
 
+$(MINIMAL1_VM_TARGETS):
+	$(CD) $(GAMMADIR)/make; \
+	$(MAKE) BUILD_FLAVOR=$(@:%minimal1=%) VM_TARGET=$@ \
+	  generic_buildminimal1 $(ALT_OUT)
+
 # Build compiler1 (client) rule, different for platforms
 generic_build1:
 	$(MKDIR) -p $(OUTPUTDIR)
@@ -239,6 +253,27 @@
 		$(MAKE) -f $(ABS_OS_MAKEFILE) \
 			$(MAKE_ARGS) $(VM_TARGET) 
 
+generic_buildminimal1:
+ifeq ($(JVM_VARIANT_MINIMAL1),true)
+	$(MKDIR) -p $(OUTPUTDIR)
+  ifeq ($(ARCH_DATA_MODEL), 32)
+    ifeq ($(OSNAME),windows)
+	$(ECHO) "No ($(VM_TARGET)) for $(OSNAME) ARCH_DATA_MODEL=$(ARCH_DATA_MODEL)" ;
+    else
+      ifeq ($(OSNAME),solaris)
+	$(ECHO) "No ($(VM_TARGET)) for $(OSNAME) ARCH_DATA_MODEL=$(ARCH_DATA_MODEL)" ;
+      else
+	$(CD) $(OUTPUTDIR); \
+	$(MAKE) -f $(ABS_OS_MAKEFILE) $(MAKE_ARGS) $(VM_TARGET) ;
+      endif
+    endif
+  else
+	    @$(ECHO) "No ($(VM_TARGET)) for $(OSNAME) ARCH_DATA_MODEL=$(ARCH_DATA_MODEL)"
+  endif
+else
+	@$(ECHO) "Error: trying to build a minimal target but JVM_VARIANT_MINIMAL1 is not true."
+endif
+
 # Export file rule
 generic_export: $(EXPORT_LIST)
 export_product:
@@ -287,6 +322,8 @@
 KERNEL_DIR=$(KERNEL_BASE_DIR)/$(VM_SUBDIR)
 ZERO_DIR=$(ZERO_BASE_DIR)/$(VM_SUBDIR)
 SHARK_DIR=$(SHARK_BASE_DIR)/$(VM_SUBDIR)
+MINIMAL1_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_minimal1
+MINIMAL1_DIR=$(MINIMAL1_BASE_DIR)/$(VM_SUBDIR)
 
 ifeq ($(JVM_VARIANT_SERVER), true)
     MISC_DIR=$(C2_DIR)
@@ -308,6 +345,10 @@
     MISC_DIR=$(ZERO_DIR)
     GEN_DIR=$(ZERO_BASE_DIR)/generated
 endif
+ifeq ($(JVM_VARIANT_MINIMAL1), true)
+    MISC_DIR=$(MINIMAL1_DIR)
+    GEN_DIR=$(MINIMAL1_BASE_DIR)/generated
+endif
 
 # Bin files (windows)
 ifeq ($(OSNAME),windows)
@@ -357,6 +398,16 @@
 	$(install-file)
 endif
 
+# Minimal JVM files always come from minimal area
+$(EXPORT_MINIMAL_DIR)/%.diz:  $(MINIMAL1_DIR)/%.diz
+	$(install-file)
+$(EXPORT_MINIMAL_DIR)/%.dll:  $(MINIMAL1_DIR)/%.dll
+	$(install-file)
+$(EXPORT_MINIMAL_DIR)/%.pdb:  $(MINIMAL1_DIR)/%.pdb
+	$(install-file)
+$(EXPORT_MINIMAL_DIR)/%.map:  $(MINIMAL1_DIR)/%.map
+	$(install-file)
+
 # Shared Library
 ifneq ($(OSNAME),windows)
     ifeq ($(JVM_VARIANT_SERVER), true)
@@ -411,6 +462,26 @@
         $(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX):       $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
 		$(install-file)
     endif
+    ifeq ($(JVM_VARIANT_MINIMAL1), true)
+        $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX):	$(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
+		$(install-file)
+        $(EXPORT_MINIMAL_DIR)/%.$(LIBRARY_SUFFIX):	$(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
+		$(install-file)
+        $(EXPORT_MINIMAL_DIR)/64/%.$(LIBRARY_SUFFIX):	$(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
+		$(install-file)
+        $(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo:		$(MINIMAL1_DIR)/%.debuginfo
+		$(install-file)
+        $(EXPORT_MINIMAL_DIR)/%.debuginfo:		$(MINIMAL1_DIR)/%.debuginfo
+		$(install-file)
+        $(EXPORT_MINIMAL_DIR)/64/%.debuginfo:		$(MINIMAL1_DIR)/%.debuginfo
+		$(install-file)
+        $(EXPORT_JRE_LIB_ARCH_DIR)/%.diz:		$(MINIMAL1_DIR)/%.diz
+		$(install-file)
+        $(EXPORT_MINIMAL_DIR)/%.diz:			$(MINIMAL1_DIR)/%.diz
+		$(install-file)
+        $(EXPORT_MINIMAL_DIR)/64/%.diz:			$(MINIMAL1_DIR)/%.diz
+		$(install-file)
+    endif
 endif
 
 # Jar file (sa-jdi.jar)
@@ -451,7 +522,7 @@
 	$(install-file)
 
 # Xusage file
-$(EXPORT_SERVER_DIR)/Xusage.txt $(EXPORT_CLIENT_DIR)/Xusage.txt $(EXPORT_KERNEL_DIR)/Xusage.txt: $(XUSAGE)
+$(EXPORT_SERVER_DIR)/Xusage.txt $(EXPORT_CLIENT_DIR)/Xusage.txt $(EXPORT_KERNEL_DIR)/Xusage.txt $(EXPORT_MINIMAL_DIR)/Xusage.txt: $(XUSAGE)
 	$(prep-target)
 	$(RM) $@.temp
 	$(SED) 's/\(separated by \)[;:]/\1$(PATH_SEP)/g' $< > $@.temp
@@ -467,6 +538,7 @@
 	$(RM) -r $(KERNEL_DIR)
 	$(RM) -r $(ZERO_DIR)
 	$(RM) -r $(SHARK_DIR)
+	$(RM) -r $(MINIMAL1_DIR)
 clean_export:
 	$(RM) -r $(EXPORT_PATH)
 clean_jdk:
@@ -574,10 +646,11 @@
 	@$(ECHO) "create_jdk:       Create JDK image, export all files into it"
 	@$(ECHO) "update_jdk:       Update JDK image with fresh exported files"
 	@$(ECHO) " "
-	@$(ECHO) "Others targets are:"
+	@$(ECHO) "Other targets are:"
 	@$(ECHO) "   $(C1_VM_TARGETS)"
 	@$(ECHO) "   $(C2_VM_TARGETS)"
 	@$(ECHO) "   $(KERNEL_VM_TARGETS)"
+	@$(ECHO) "   $(MINIMAL1_VM_TARGETS)"
 
 # Variable help (only common ones used by this workspace)
 variable_help: variable_help_intro variable_list variable_help_end
@@ -672,9 +745,10 @@
 include $(GAMMADIR)/make/jprt.gmk
 
 .PHONY: all world clobber clean help $(C1_VM_TARGETS) $(C2_VM_TARGETS) \
-        $(KERNEL_VM_TARGETS) \
-	generic_build1 generic_build2 generic_buildkernel generic_export \
+        $(KERNEL_VM_TARGETS) $(MINIMAL1_VM_TARGETS) \
+	generic_build1 generic_build2 generic_buildkernel generic_buildminimal1 generic_export \
 	export_product export_fastdebug export_debug export_optimized \
 	export_jdk_product export_jdk_fastdebug export_jdk_debug \
 	create_jdk copy_jdk update_jdk test_jdk \
-	copy_product_jdk copy_fastdebug_jdk copy_debug_jdk 
+	copy_product_jdk copy_fastdebug_jdk copy_debug_jdk  \
+	$(HS_ALT_MAKE)/Makefile.make
--- a/hotspot/make/bsd/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
@@ -175,6 +175,10 @@
 #       profiledshark   shark           <os>_<arch>_shark/profiled
 #       productshark    shark           <os>_<arch>_shark/product
 #
+#       fastdebugminimal1 minimal1      <os>_<arch>_minimal1/fastdebug
+#       jvmgminimal1      minimal1      <os>_<arch>_minimal1/jvmg
+#       productminimal1   minimal1      <os>_<arch>_minimal1/product
+#
 # What you get with each target:
 #
 # debug*     - "thin" libjvm_g - debug info linked into the gamma_g launcher
@@ -199,6 +203,7 @@
 SUBDIRS_CORE      = $(addprefix $(OSNAME)_$(BUILDARCH)_core/,$(TARGETS))
 SUBDIRS_ZERO      = $(addprefix $(OSNAME)_$(VARIANTARCH)_zero/,$(TARGETS))
 SUBDIRS_SHARK     = $(addprefix $(OSNAME)_$(VARIANTARCH)_shark/,$(TARGETS))
+SUBDIRS_MINIMAL1  = $(addprefix $(OSNAME)_$(BUILDARCH)_minimal1/,$(TARGETS))
 
 TARGETS_C2        = $(TARGETS)
 TARGETS_C1        = $(addsuffix 1,$(TARGETS))
@@ -206,6 +211,7 @@
 TARGETS_CORE      = $(addsuffix core,$(TARGETS))
 TARGETS_ZERO      = $(addsuffix zero,$(TARGETS))
 TARGETS_SHARK     = $(addsuffix shark,$(TARGETS))
+TARGETS_MINIMAL1  = $(addsuffix minimal1,$(TARGETS))
 
 BUILDTREE_MAKE    = $(GAMMADIR)/make/$(OSNAME)/makefiles/buildtree.make
 BUILDTREE_VARS    = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) SRCARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) LIBRARY_SUFFIX=$(LIBRARY_SUFFIX)
@@ -223,6 +229,7 @@
 	@echo "  $(TARGETS_CORE)"
 	@echo "  $(TARGETS_ZERO)"
 	@echo "  $(TARGETS_SHARK)"
+	@echo "  $(TARGETS_MINIMAL1)"
 
 checks: check_os_version check_j2se_version
 
@@ -281,6 +288,10 @@
 	$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
 	$(BUILDTREE) VARIANT=shark VARIANTARCH=$(VARIANTARCH)
 
+$(SUBDIRS_MINIMAL1): $(BUILDTREE_MAKE)
+	$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
+	$(BUILDTREE) VARIANT=minimal1
+
 platform_zero: $(GAMMADIR)/make/$(OSNAME)/platform_zero.in
 	$(SED) 's/@ZERO_ARCHDEF@/$(ZERO_ARCHDEF)/g;s/@ZERO_LIBARCH@/$(ZERO_LIBARCH)/g;' < $< > $@
 
@@ -340,12 +351,22 @@
 	cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && $(MAKE) $(MFLAGS) install
 endif
 
+$(TARGETS_MINIMAL1):  $(SUBDIRS_MINIMAL1)
+	cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && $(MAKE) $(MFLAGS)
+ifeq ($(TEST_IN_BUILD),true)
+	cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && ./test_gamma
+endif
+ifdef INSTALL
+	cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && $(MAKE) $(MFLAGS) install
+endif
+
 # Just build the tree, and nothing else:
 tree:      $(SUBDIRS_C2)
 tree1:     $(SUBDIRS_C1)
 treecore:  $(SUBDIRS_CORE)
 treezero:  $(SUBDIRS_ZERO)
 treeshark: $(SUBDIRS_SHARK)
+treeminimal1: $(SUBDIRS_MINIMAL1)
 
 # Doc target.  This is the same for all build options.
 #     Hence create a docs directory beside ...$(ARCH)_[...]
@@ -367,17 +388,23 @@
 clean_docs:
 	rm -rf $(SUBDIR_DOCS)
 
-clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark:
+clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark clean_minimal1:
 	rm -rf $(OSNAME)_$(BUILDARCH)_$(subst clean_,,$@)
 
-clean:  clean_compiler2 clean_compiler1 clean_core clean_zero clean_shark clean_docs
+clean:  clean_compiler2 clean_compiler1 clean_core clean_zero clean_shark clean_minimal1 clean_docs
 
 include $(GAMMADIR)/make/cscope.make
 
+#
+# Include alternate Makefile if it exists.
+#
+-include $(HS_ALT_MAKE)/$(OSNAME)/Makefile.make
+
 #-------------------------------------------------------------------------------
 
-.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO) $(TARGETS_SHARK)
+.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO) $(TARGETS_SHARK) $(TARGETS_MINIMAL1)
 .PHONY: tree tree1 treecore treezero treeshark
 .PHONY: all compiler1 compiler2 core zero shark
 .PHONY: clean clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark docs clean_docs
 .PHONY: checks check_os_version check_j2se_version
+.PHONY: $(HS_ALT_MAKE)/$(OSNAME)/Makefile.make
--- a/hotspot/make/bsd/makefiles/adlc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/adlc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/bsd/makefiles/buildtree.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/buildtree.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
@@ -60,6 +60,7 @@
 
 -include $(SPEC)
 include $(GAMMADIR)/make/scm.make
+include $(GAMMADIR)/make/defs.make
 include $(GAMMADIR)/make/altsrc.make
 
 
@@ -163,6 +164,13 @@
   endif
 endif
 
+# if hotspot-only build and/or OPENJDK isn't passed down, need to set OPENJDK
+ifndef OPENJDK
+  ifneq ($(call if-has-altsrc,$(HS_COMMON_SRC)/,true,false),true)
+    OPENJDK=true
+  endif
+endif
+
 BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION=  JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION)
 
 BUILDTREE	= \
@@ -195,6 +203,8 @@
 	sed -n '/=/s/^ */Platform_/p' < $(PLATFORM_FILE); \
 	echo; \
 	echo "GAMMADIR = $(GAMMADIR)"; \
+	echo "HS_ALT_MAKE = $(HS_ALT_MAKE)"; \
+	echo "OSNAME = $(OSNAME)"; \
 	echo "SYSDEFS = \$$(Platform_sysdefs)"; \
 	echo "SRCARCH = $(SRCARCH)"; \
 	echo "BUILDARCH = $(BUILDARCH)"; \
@@ -205,6 +215,7 @@
 	echo "SA_BUILD_VERSION = $(HS_BUILD_VER)"; \
 	echo "HOTSPOT_BUILD_USER = $(HOTSPOT_BUILD_USER)"; \
 	echo "HOTSPOT_VM_DISTRO = $(HOTSPOT_VM_DISTRO)"; \
+	echo "OPENJDK = $(OPENJDK)"; \
 	echo; \
 	echo "# Used for platform dispatching"; \
 	echo "TARGET_DEFINES  = -DTARGET_OS_FAMILY_\$$(Platform_os_family)"; \
@@ -251,6 +262,7 @@
 	[ -n "$(SPEC)" ] && \
 	    echo "include $(SPEC)"; \
 	echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \
+	echo "include \$$(GAMMADIR)/make/excludeSrc.make"; \
 	echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \
 	) > $@
 
--- a/hotspot/make/bsd/makefiles/defs.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/defs.make	Wed Jul 05 18:26:11 2017 +0200
@@ -155,6 +155,7 @@
 EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX)
 EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
 EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
+EXPORT_MINIMAL_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/minimal
 
 EXPORT_LIST += $(EXPORT_JRE_LIB_DIR)/wb.jar
 
@@ -168,6 +169,19 @@
   EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
 endif
 
+ifeq ($(JVM_VARIANT_MINIMAL1),true)
+  EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/Xusage.txt
+  EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.$(LIBRARY_SUFFIX)
+
+  ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
+    ifeq ($(ZIP_DEBUGINFO_FILES),1)
+	EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.diz
+    else
+	EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.debuginfo
+    endif
+  endif 
+endif
+
 # Serviceability Binaries
 # No SA Support for PPC, IA64, ARM or zero
 ADD_SA_BINARIES/x86   = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
--- a/hotspot/make/bsd/makefiles/dtrace.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/dtrace.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
@@ -114,21 +114,21 @@
 
 # $@.tmp is created first to avoid an empty $(JVMOFFS).h if an error occurs.
 $(JVMOFFS).h: $(GENOFFS)
-	$(QUIETLY) DYLD_LIBRARY_PATH=. ./$(GENOFFS) -header > $@.tmp; touch $@; \
+	$(QUIETLY) DYLD_LIBRARY_PATH=.:$(DYLD_LIBRARY_PATH) ./$(GENOFFS) -header > $@.tmp; touch $@; \
 	if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
 	then rm -f $@; mv $@.tmp $@; \
 	else rm -f $@.tmp; \
 	fi
 
 $(JVMOFFS)Index.h: $(GENOFFS)
-	$(QUIETLY) DYLD_LIBRARY_PATH=. ./$(GENOFFS) -index > $@.tmp; touch $@; \
+	$(QUIETLY) DYLD_LIBRARY_PATH=.:$(DYLD_LIBRARY_PATH) ./$(GENOFFS) -index > $@.tmp; touch $@; \
 	if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
 	then rm -f $@; mv $@.tmp $@; \
 	else rm -f $@.tmp; \
 	fi
 
 $(JVMOFFS).cpp: $(GENOFFS) $(JVMOFFS).h $(JVMOFFS)Index.h
-	$(QUIETLY) DYLD_LIBRARY_PATH=. ./$(GENOFFS) -table > $@.tmp; touch $@; \
+	$(QUIETLY) DYLD_LIBRARY_PATH=.:$(DYLD_LIBRARY_PATH) ./$(GENOFFS) -table > $@.tmp; touch $@; \
 	if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
 	then rm -f $@; mv $@.tmp $@; \
 	else rm -f $@.tmp; \
--- a/hotspot/make/bsd/makefiles/gcc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/gcc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
@@ -151,11 +151,6 @@
   CFLAGS += -DCC_INTERP
 endif
 
-# Build for embedded targets
-ifdef JAVASE_EMBEDDED
-  CFLAGS += -DJAVASE_EMBEDDED
-endif
-
 # Keep temporary files (.ii, .s)
 ifdef NEED_ASM
   CFLAGS += -save-temps
@@ -186,20 +181,32 @@
   CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations
 endif
 
+OPT_CFLAGS/SIZE=-Os
+OPT_CFLAGS/SPEED=-O3
+
+# Hotspot uses very unstrict aliasing turn this optimization off
+# This option is added to CFLAGS rather than OPT_CFLAGS
+# so that OPT_CFLAGS overrides get this option too.
+CFLAGS += -fno-strict-aliasing
 
 # The flags to use for an Optimized g++ build
 ifeq ($(OS_VENDOR), Darwin)
   # use -Os by default, unless -O3 can be proved to be worth the cost, as per policy
   # <http://wikis.sun.com/display/OpenJDK/Mac+OS+X+Port+Compilers>
-  OPT_CFLAGS += -Os
+  OPT_CFLAGS_DEFAULT ?= SIZE
 else
-  OPT_CFLAGS += -O3
+  OPT_CFLAGS_DEFAULT ?= SPEED
 endif
 
-# Hotspot uses very unstrict aliasing turn this optimization off
-OPT_CFLAGS += -fno-strict-aliasing
+ifdef OPT_CFLAGS
+  ifneq ("$(origin OPT_CFLAGS)", "command line")
+    $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
+  endif
+endif
 
-# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp 
+OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
+
+# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
 # if we use expensive-optimizations
 ifeq ($(BUILDARCH), ia64)
 OPT_CFLAGS += -fno-expensive-optimizations
--- a/hotspot/make/bsd/makefiles/ia64.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/ia64.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
@@ -25,8 +25,6 @@
 #
 # IA64 only uses c++ based interpreter
 CFLAGS += -DCC_INTERP -D_LP64=1 -DVM_LITTLE_ENDIAN
-# Hotspot uses very unstrict aliasing turn this optimization off
-OPT_CFLAGS += -fno-strict-aliasing
 ifeq ($(VERSION),debug)
 ASM_FLAGS= -DDEBUG
 else
--- a/hotspot/make/bsd/makefiles/jvmg.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/jvmg.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/bsd/makefiles/launcher.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/launcher.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/bsd/makefiles/minimal1.make	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2012, 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.
+#  
+#
+
+TYPE=MINIMAL1
+
+INCLUDE_JVMTI ?= false
+INCLUDE_FPROF ?= false
+INCLUDE_VM_STRUCTS ?= false
+INCLUDE_JNI_CHECK ?= false
+INCLUDE_SERVICES ?= false
+INCLUDE_MANAGEMENT ?= false
+INCLUDE_ALTERNATE_GCS ?= false
+INCLUDE_NMT ?= false
+INCLUDE_CDS ?= false
+
+CXXFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\"
+CFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\"
+
+Src_Dirs/MINIMAL1 = $(CORE_PATHS) $(COMPILER1_PATHS)
+
+Src_Files_EXCLUDE/MINIMAL1 += $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
+
+-include $(HS_ALT_MAKE)/$(OSNAME)/makefiles/minimal1.make
+
+.PHONY: $(HS_ALT_MAKE)/$(OSNAME)/makefiles/minimal1.make
--- a/hotspot/make/bsd/makefiles/product.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/product.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/bsd/makefiles/rules.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/rules.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2012, 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
--- a/hotspot/make/bsd/makefiles/sparcWorks.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/sparcWorks.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/bsd/makefiles/top.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/top.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/bsd/makefiles/vm.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/bsd/makefiles/vm.make	Wed Jul 05 18:26:11 2017 +0200
@@ -190,7 +190,7 @@
 ZERO_SPECIFIC_FILES      := zero
 
 # Always exclude these.
-Src_Files_EXCLUDE := jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp
+Src_Files_EXCLUDE += jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp
 
 # Exclude per type.
 Src_Files_EXCLUDE/CORE      := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
--- a/hotspot/make/defs.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/defs.make	Wed Jul 05 18:26:11 2017 +0200
@@ -22,6 +22,27 @@
 #  
 #
 
+# The common definitions for hotspot builds.
+
+# Optionally include SPEC file generated by configure.
+ifneq ($(SPEC),)
+  include $(SPEC)
+endif
+
+# Directory paths and user name
+# Unless GAMMADIR is set on the command line, search upward from
+# the current directory for a parent directory containing "src/share/vm".
+# If that fails, look for $GAMMADIR in the environment.
+# When the tree of subdirs is built, this setting is stored in each flags.make.
+GAMMADIR := $(shell until ([ -d dev ]&&echo $${GAMMADIR:-/GAMMADIR/}) || ([ -d src/share/vm ]&&pwd); do cd ..; done)
+HS_SRC_DIR=$(GAMMADIR)/src
+HS_MAKE_DIR=$(GAMMADIR)/make
+HS_BUILD_DIR=$(GAMMADIR)/build
+
+ifeq ($(USER),)
+  USER=$(USERNAME)
+endif
+
 ifeq ($(HS_ALT_MAKE),)
   ifneq ($(OPENJDK),true)
     HS_ALT_MAKE=$(GAMMADIR)/make/closed
@@ -30,12 +51,10 @@
   endif
 endif
 
-# The common definitions for hotspot builds.
-
-# Optionally include SPEC file generated by configure.
-ifneq ($(SPEC),)
-  include $(SPEC)
-endif
+#
+# Include alternate defs.make if it exists
+#
+-include $(HS_ALT_MAKE)/defs.make
 
 # Default to verbose build logs (show all compile lines):
 MAKE_VERBOSE=y
@@ -84,20 +103,6 @@
   endif
 endif
 
-# Directory paths and user name
-# Unless GAMMADIR is set on the command line, search upward from
-# the current directory for a parent directory containing "src/share/vm".
-# If that fails, look for $GAMMADIR in the environment.
-# When the tree of subdirs is built, this setting is stored in each flags.make.
-GAMMADIR := $(shell until ([ -d dev ]&&echo $${GAMMADIR:-/GAMMADIR/}) || ([ -d src/share/vm ]&&pwd); do cd ..; done)
-HS_SRC_DIR=$(GAMMADIR)/src
-HS_MAKE_DIR=$(GAMMADIR)/make
-HS_BUILD_DIR=$(GAMMADIR)/build
-
-ifeq ($(USER),)
-  USER=$(USERNAME)
-endif
-
 # hotspot version definitions
 include $(GAMMADIR)/make/hotspot_version
 
@@ -339,3 +344,4 @@
 EXPORT_LIST += $(EXPORT_INCLUDE_DIR)/jfr.h
 endif
 
+.PHONY: $(HS_ALT_MAKE)/defs.make
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/excludeSrc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,110 @@
+#
+# Copyright (c) 2012, 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.
+#  
+#
+ifeq ($(INCLUDE_JVMTI), false)
+      CXXFLAGS += -DINCLUDE_JVMTI=0
+      CFLAGS += -DINCLUDE_JVMTI=0
+
+      Src_Files_EXCLUDE += jvmtiGetLoadedClasses.cpp forte.cpp jvmtiThreadState.cpp jvmtiExtensions.cpp \
+	jvmtiImpl.cpp jvmtiManageCapabilities.cpp jvmtiRawMonitor.cpp jvmtiUtil.cpp jvmtiTrace.cpp \
+	jvmtiCodeBlobEvents.cpp jvmtiEnv.cpp jvmtiRedefineClasses.cpp jvmtiEnvBase.cpp jvmtiEnvThreadState.cpp \
+	jvmtiTagMap.cpp jvmtiEventController.cpp evmCompat.cpp jvmtiEnter.xsl jvmtiExport.cpp
+endif
+
+ifeq ($(INCLUDE_FPROF), false)
+      CXXFLAGS += -DINCLUDE_FPROF=0
+      CFLAGS += -DINCLUDE_FPROF=0
+
+      Src_Files_EXCLUDE += fprofiler.cpp
+endif
+
+ifeq ($(INCLUDE_VM_STRUCTS), false)
+      CXXFLAGS += -DINCLUDE_VM_STRUCTS=0
+      CFLAGS += -DINCLUDE_VM_STRUCTS=0
+
+      Src_Files_EXCLUDE += vmStructs.cpp
+endif
+
+ifeq ($(INCLUDE_JNI_CHECK), false)
+      CXXFLAGS += -DINCLUDE_JNI_CHECK=0
+      CFLAGS += -DINCLUDE_JNI_CHECK=0
+
+      Src_Files_EXCLUDE += jniCheck.cpp
+endif
+
+ifeq ($(INCLUDE_SERVICES), false)
+      CXXFLAGS += -DINCLUDE_SERVICES=0
+      CFLAGS += -DINCLUDE_SERVICES=0
+
+      Src_Files_EXCLUDE += heapDumper.cpp heapInspection.cpp \
+	attachListener_linux.cpp attachListener.cpp
+endif
+
+ifeq ($(INCLUDE_MANAGEMENT), false)
+      CXXFLAGS += -DINCLUDE_MANAGEMENT=0
+      CFLAGS += -DINCLUDE_MANAGEMENT=0
+endif
+
+ifeq ($(INCLUDE_CDS), false)
+      CXXFLAGS += -DINCLUDE_CDS=0
+      CFLAGS += -DINCLUDE_CDS=0
+
+      Src_Files_EXCLUDE += metaspaceShared.cpp
+endif
+
+ifeq ($(INCLUDE_ALTERNATE_GCS), false)
+      CXXFLAGS += -DINCLUDE_ALTERNATE_GCS=0
+      CFLAGS += -DINCLUDE_ALTERNATE_GCS=0
+
+      CXXFLAGS += -DSERIALGC
+      CFLAGS += -DSERIALGC
+      Src_Files_EXCLUDE += \
+	binaryTreeDictionary.cpp cmsAdaptiveSizePolicy.cpp cmsCollectorPolicy.cpp \
+	cmsGCAdaptivePolicyCounters.cpp cmsLockVerifier.cpp cmsPermGen.cpp compactibleFreeListSpace.cpp \
+	concurrentMarkSweepGeneration.cpp concurrentMarkSweepThread.cpp freeBlockDictionary.cpp \
+	freeChunk.cpp freeList.cpp promotionInfo.cpp vmCMSOperations.cpp collectionSetChooser.cpp \
+	concurrentG1Refine.cpp concurrentG1RefineThread.cpp concurrentMark.cpp concurrentMarkThread.cpp \
+	dirtyCardQueue.cpp g1AllocRegion.cpp g1BlockOffsetTable.cpp g1CollectedHeap.cpp g1GCPhaseTimes.cpp \
+	g1CollectorPolicy.cpp g1ErgoVerbose.cpp g1_globals.cpp g1HRPrinter.cpp g1MarkSweep.cpp \
+	g1MMUTracker.cpp g1MonitoringSupport.cpp g1RemSet.cpp g1SATBCardTableModRefBS.cpp heapRegion.cpp \
+	heapRegionRemSet.cpp heapRegionSeq.cpp heapRegionSet.cpp heapRegionSets.cpp ptrQueue.cpp \
+	satbQueue.cpp sparsePRT.cpp survRateGroup.cpp vm_operations_g1.cpp adjoiningGenerations.cpp \
+	adjoiningVirtualSpaces.cpp asPSOldGen.cpp asPSYoungGen.cpp cardTableExtension.cpp \
+	gcTaskManager.cpp gcTaskThread.cpp objectStartArray.cpp parallelScavengeHeap.cpp parMarkBitMap.cpp \
+	pcTasks.cpp psAdaptiveSizePolicy.cpp psCompactionManager.cpp psGCAdaptivePolicyCounters.cpp \
+	psGenerationCounters.cpp psMarkSweep.cpp psMarkSweepDecorator.cpp psOldGen.cpp psParallelCompact.cpp \
+	psPermGen.cpp psPromotionLAB.cpp psPromotionManager.cpp psScavenge.cpp psTasks.cpp psVirtualspace.cpp \
+	psYoungGen.cpp vmPSOperations.cpp asParNewGeneration.cpp parCardTableModRefBS.cpp \
+	parGCAllocBuffer.cpp parNewGeneration.cpp mutableSpace.cpp gSpaceCounters.cpp allocationStats.cpp \
+	spaceCounters.cpp gcAdaptivePolicyCounters.cpp mutableNUMASpace.cpp immutableSpace.cpp \
+	immutableSpace.cpp g1MemoryPool.cpp psMemoryPool.cpp yieldWorkingGroup.cpp g1Log.cpp
+endif 
+
+ifeq ($(INCLUDE_NMT), false)
+      CXXFLAGS += -DINCLUDE_NMT=0
+      CFLAGS += -DINCLUDE_NMT=0
+
+      Src_Files_EXCLUDE += \
+	 memBaseline.cpp memPtr.cpp memRecorder.cpp memReporter.cpp memSnapshot.cpp memTrackWorker.cpp \
+	 memTracker.cpp nmtDCmd.cpp
+endif
--- a/hotspot/make/hotspot_version	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/hotspot_version	Wed Jul 05 18:26:11 2017 +0200
@@ -35,7 +35,7 @@
 
 HS_MAJOR_VER=25
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=04
+HS_BUILD_NUMBER=05
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=8
--- a/hotspot/make/linux/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -175,6 +175,10 @@
 #       profiledshark   shark           <os>_<arch>_shark/profiled
 #       productshark    shark           <os>_<arch>_shark/product
 #
+#       fastdebugminimal1 minimal1      <os>_<arch>_minimal1/fastdebug
+#       jvmgminimal1      minimal1      <os>_<arch>_minimal1/jvmg
+#       productminimal1   minimal1      <os>_<arch>_minimal1/product
+#
 # What you get with each target:
 #
 # debug*     - "thin" libjvm_g - debug info linked into the gamma_g launcher
@@ -199,6 +203,7 @@
 SUBDIRS_CORE      = $(addprefix $(OSNAME)_$(BUILDARCH)_core/,$(TARGETS))
 SUBDIRS_ZERO      = $(addprefix $(OSNAME)_$(VARIANTARCH)_zero/,$(TARGETS))
 SUBDIRS_SHARK     = $(addprefix $(OSNAME)_$(VARIANTARCH)_shark/,$(TARGETS))
+SUBDIRS_MINIMAL1  = $(addprefix $(OSNAME)_$(BUILDARCH)_minimal1/,$(TARGETS))
 
 TARGETS_C2        = $(TARGETS)
 TARGETS_C1        = $(addsuffix 1,$(TARGETS))
@@ -206,6 +211,7 @@
 TARGETS_CORE      = $(addsuffix core,$(TARGETS))
 TARGETS_ZERO      = $(addsuffix zero,$(TARGETS))
 TARGETS_SHARK     = $(addsuffix shark,$(TARGETS))
+TARGETS_MINIMAL1 =  $(addsuffix minimal1,$(TARGETS))
 
 BUILDTREE_MAKE    = $(GAMMADIR)/make/$(OSNAME)/makefiles/buildtree.make
 BUILDTREE_VARS    = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) SRCARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH)
@@ -224,6 +230,7 @@
 	@echo "  $(TARGETS_CORE)"
 	@echo "  $(TARGETS_ZERO)"
 	@echo "  $(TARGETS_SHARK)"
+	@echo "  $(TARGETS_MINIMAL1)"
 
 checks: check_os_version check_j2se_version
 
@@ -281,6 +288,11 @@
 	$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
 	$(BUILDTREE) VARIANT=shark VARIANTARCH=$(VARIANTARCH)
 
+$(SUBDIRS_MINIMAL1): $(BUILDTREE_MAKE)
+	$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
+	$(BUILDTREE) VARIANT=minimal1
+
+
 platform_zero: $(GAMMADIR)/make/$(OSNAME)/platform_zero.in
 	$(SED) 's/@ZERO_ARCHDEF@/$(ZERO_ARCHDEF)/g;s/@ZERO_LIBARCH@/$(ZERO_LIBARCH)/g;' < $< > $@
 
@@ -340,12 +352,22 @@
 	cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && $(MAKE) $(MFLAGS) install
 endif
 
+$(TARGETS_MINIMAL1):  $(SUBDIRS_MINIMAL1)
+	cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && $(MAKE) $(MFLAGS)
+ifeq ($(TEST_IN_BUILD),true)
+	cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && ./test_gamma
+endif
+ifdef INSTALL
+	cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && $(MAKE) $(MFLAGS) install
+endif
+
 # Just build the tree, and nothing else:
 tree:      $(SUBDIRS_C2)
 tree1:     $(SUBDIRS_C1)
 treecore:  $(SUBDIRS_CORE)
 treezero:  $(SUBDIRS_ZERO)
 treeshark: $(SUBDIRS_SHARK)
+treeminimal1: $(SUBDIRS_MINIMAL1)
 
 # Doc target.  This is the same for all build options.
 #     Hence create a docs directory beside ...$(ARCH)_[...]
@@ -369,17 +391,23 @@
 clean_docs:
 	rm -rf $(SUBDIR_DOCS)
 
-clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark:
+clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark clean_minimal1:
 	rm -rf $(OSNAME)_$(BUILDARCH)_$(subst clean_,,$@)
 
-clean:  clean_compiler2 clean_compiler1 clean_core clean_zero clean_shark clean_docs
+clean:  clean_compiler2 clean_compiler1 clean_core clean_zero clean_shark clean_minimal1 clean_docs
 
 include $(GAMMADIR)/make/cscope.make
 
+#
+# Include alternate Makefile if it exists.
+#
+-include $(HS_ALT_MAKE)/$(OSNAME)/Makefile.make
+
 #-------------------------------------------------------------------------------
 
-.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO) $(TARGETS_SHARK)
+.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO) $(TARGETS_SHARK) $(TARGETS_MINIMAL1)
 .PHONY: tree tree1 treecore treezero treeshark
 .PHONY: all compiler1 compiler2 core zero shark
 .PHONY: clean clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark docs clean_docs
 .PHONY: checks check_os_version check_j2se_version
+.PHONY: $(HS_ALT_MAKE)/$(OSNAME)/Makefile.make
--- a/hotspot/make/linux/makefiles/buildtree.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/buildtree.make	Wed Jul 05 18:26:11 2017 +0200
@@ -57,6 +57,7 @@
 
 -include $(SPEC)
 include $(GAMMADIR)/make/scm.make
+include $(GAMMADIR)/make/defs.make
 include $(GAMMADIR)/make/altsrc.make
 
 
@@ -156,6 +157,13 @@
   endif
 endif
 
+# if hotspot-only build and/or OPENJDK isn't passed down, need to set OPENJDK
+ifndef OPENJDK
+  ifneq ($(call if-has-altsrc,$(HS_COMMON_SRC)/,true,false),true)
+    OPENJDK=true
+  endif
+endif
+
 BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION=  JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION)
 
 BUILDTREE	= \
@@ -188,6 +196,8 @@
 	sed -n '/=/s/^ */Platform_/p' < $(PLATFORM_FILE); \
 	echo; \
 	echo "GAMMADIR = $(GAMMADIR)"; \
+	echo "HS_ALT_MAKE = $(HS_ALT_MAKE)"; \
+	echo "OSNAME = $(OSNAME)"; \
 	echo "SYSDEFS = \$$(Platform_sysdefs)"; \
 	echo "SRCARCH = $(SRCARCH)"; \
 	echo "BUILDARCH = $(BUILDARCH)"; \
@@ -198,6 +208,7 @@
 	echo "SA_BUILD_VERSION = $(HS_BUILD_VER)"; \
 	echo "HOTSPOT_BUILD_USER = $(HOTSPOT_BUILD_USER)"; \
 	echo "HOTSPOT_VM_DISTRO = $(HOTSPOT_VM_DISTRO)"; \
+	echo "OPENJDK = $(OPENJDK)"; \
 	echo; \
 	echo "# Used for platform dispatching"; \
 	echo "TARGET_DEFINES  = -DTARGET_OS_FAMILY_\$$(Platform_os_family)"; \
@@ -254,6 +265,7 @@
 	[ -n "$(SPEC)" ] && \
 	    echo "include $(SPEC)"; \
 	echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \
+	echo "include \$$(GAMMADIR)/make/excludeSrc.make"; \
 	echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \
 	) > $@
 
--- a/hotspot/make/linux/makefiles/defs.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/defs.make	Wed Jul 05 18:26:11 2017 +0200
@@ -254,6 +254,7 @@
 endif
 EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
 EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
+EXPORT_MINIMAL_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/minimal
 
 EXPORT_LIST += $(EXPORT_JRE_LIB_DIR)/wb.jar
 
@@ -281,6 +282,19 @@
   endif 
 endif
 
+ifeq ($(JVM_VARIANT_MINIMAL1),true)
+  EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/Xusage.txt
+  EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.$(LIBRARY_SUFFIX)
+
+  ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
+    ifeq ($(ZIP_DEBUGINFO_FILES),1)
+	EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.diz
+    else
+	EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.debuginfo
+    endif
+  endif 
+endif
+
 # Serviceability Binaries
 # No SA Support for PPC, IA64, ARM or zero
 ADD_SA_BINARIES/x86   = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
--- a/hotspot/make/linux/makefiles/dtrace.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/dtrace.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,6 @@
 #
-# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012 Red Hat, Inc.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -25,3 +26,40 @@
 # Linux does not build jvm_db
 LIBJVM_DB =
 
+# Only OPENJDK builds test and support SDT probes currently.
+ifndef OPENJDK
+REASON = "This JDK does not support SDT probes"
+else
+
+# We need a recent GCC for the default
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \>= 4 \) \& \( $(CC_VER_MINOR) \>= 4 \) )" "0"
+REASON = "gcc version is too old"
+else
+
+# But it does have a SystemTap dtrace compatible sys/sdt.h
+ifneq ($(ALT_SDT_H),)
+  SDT_H_FILE = $(ALT_SDT_H)
+else
+  SDT_H_FILE = /usr/include/sys/sdt.h
+endif
+DTRACE_ENABLED = $(shell test -f $(SDT_H_FILE) && echo $(SDT_H_FILE))
+REASON = "$(SDT_H_FILE) not found"
+
+ifneq ($(DTRACE_ENABLED),)
+  CFLAGS += -DDTRACE_ENABLED
+endif
+
+endif
+endif
+
+# Phony target used in vm.make build target to check whether enabled.
+.PHONY: dtraceCheck
+ifeq ($(DTRACE_ENABLED),)
+dtraceCheck:
+	$(QUIETLY) echo "**NOTICE** Dtrace support disabled: $(REASON)"
+else
+dtraceCheck:
+endif
+
+# It doesn't support HAVE_DTRACE_H though.
+
--- a/hotspot/make/linux/makefiles/gcc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/gcc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -116,11 +116,6 @@
   CFLAGS += -DCC_INTERP
 endif
 
-# Build for embedded targets
-ifdef JAVASE_EMBEDDED
-  CFLAGS += -DJAVASE_EMBEDDED
-endif
-
 # Keep temporary files (.ii, .s)
 ifdef NEED_ASM
   CFLAGS += -save-temps
@@ -146,10 +141,23 @@
 CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) 
 
 # The flags to use for an Optimized g++ build
-OPT_CFLAGS += -O3
+OPT_CFLAGS/SIZE=-Os
+OPT_CFLAGS/SPEED=-O3
 
 # Hotspot uses very unstrict aliasing turn this optimization off
-OPT_CFLAGS += -fno-strict-aliasing
+# This option is added to CFLAGS rather than OPT_CFLAGS
+# so that OPT_CFLAGS overrides get this option too.
+CFLAGS += -fno-strict-aliasing 
+
+OPT_CFLAGS_DEFAULT ?= SPEED
+
+ifdef OPT_CFLAGS
+  ifneq ("$(origin OPT_CFLAGS)", "command line")
+    $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.")
+  endif
+endif
+
+OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS)
 
 # The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp 
 # if we use expensive-optimizations
--- a/hotspot/make/linux/makefiles/ia64.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/ia64.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
@@ -25,8 +25,6 @@
 #
 # IA64 only uses c++ based interpreter
 CFLAGS += -DCC_INTERP -D_LP64=1 -DVM_LITTLE_ENDIAN
-# Hotspot uses very unstrict aliasing turn this optimization off
-OPT_CFLAGS += -fno-strict-aliasing
 ifeq ($(VERSION),debug)
 ASM_FLAGS= -DDEBUG
 else
--- a/hotspot/make/linux/makefiles/launcher.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/launcher.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/linux/makefiles/minimal1.make	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2012, 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.
+#  
+#
+
+TYPE=MINIMAL1
+
+INCLUDE_JVMTI ?= false
+INCLUDE_FPROF ?= false
+INCLUDE_VM_STRUCTS ?= false
+INCLUDE_JNI_CHECK ?= false
+INCLUDE_SERVICES ?= false
+INCLUDE_MANAGEMENT ?= false
+INCLUDE_ALTERNATE_GCS ?= false
+INCLUDE_NMT ?= false
+INCLUDE_CDS ?= false
+
+CXXFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\"
+CFLAGS += -DMINIMAL_JVM -DCOMPILER1 -DVMTYPE=\"Minimal\"
+
+Src_Dirs/MINIMAL1 = $(CORE_PATHS) $(COMPILER1_PATHS)
+
+Src_Files_EXCLUDE/MINIMAL1 += $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
+
+-include $(HS_ALT_MAKE)/$(OSNAME)/makefiles/minimal1.make
+
+.PHONY: $(HS_ALT_MAKE)/$(OSNAME)/makefiles/minimal1.make
--- a/hotspot/make/linux/makefiles/ppc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/ppc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2004, 2012, 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
--- a/hotspot/make/linux/makefiles/product.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/product.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/linux/makefiles/rules.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/rules.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2012, 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
--- a/hotspot/make/linux/makefiles/sparcWorks.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/sparcWorks.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/linux/makefiles/top.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/top.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/linux/makefiles/vm.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/linux/makefiles/vm.make	Wed Jul 05 18:26:11 2017 +0200
@@ -192,7 +192,7 @@
 ZERO_SPECIFIC_FILES      := zero
 
 # Always exclude these.
-Src_Files_EXCLUDE := jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp
+Src_Files_EXCLUDE += jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp
 
 # Exclude per type.
 Src_Files_EXCLUDE/CORE      := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
@@ -387,7 +387,7 @@
 
 #----------------------------------------------------------------------
 
-build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) $(WB_JAR)
+build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) dtraceCheck $(WB_JAR)
 
 install: install_jvm install_jsig install_saproc
 
--- a/hotspot/make/solaris/makefiles/adlc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/adlc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2012, 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
--- a/hotspot/make/solaris/makefiles/buildtree.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/buildtree.make	Wed Jul 05 18:26:11 2017 +0200
@@ -148,6 +148,13 @@
   endif
 endif
 
+# if hotspot-only build and/or OPENJDK isn't passed down, need to set OPENJDK
+ifndef OPENJDK
+  ifneq ($(call if-has-altsrc,$(HS_COMMON_SRC)/,true,false),true)
+    OPENJDK=true
+  endif
+endif
+
 BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION= JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) 
 
 BUILDTREE	= \
@@ -190,6 +197,7 @@
 	echo "SA_BUILD_VERSION = $(HS_BUILD_VER)"; \
 	echo "HOTSPOT_BUILD_USER = $(HOTSPOT_BUILD_USER)"; \
 	echo "HOTSPOT_VM_DISTRO = $(HOTSPOT_VM_DISTRO)"; \
+	echo "OPENJDK = $(OPENJDK)"; \
 	echo "$(LP64_SETTING/$(DATA_MODE))"; \
 	echo; \
 	echo "# Used for platform dispatching"; \
--- a/hotspot/make/solaris/makefiles/dtrace.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/dtrace.make	Wed Jul 05 18:26:11 2017 +0200
@@ -206,15 +206,15 @@
 
 # $@.tmp is created first to avoid an empty $(JVMOFFS).h if an error occurs.
 $(JVMOFFS).h: $(GENOFFS)
-	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -header > $@.tmp
+	$(QUIETLY) LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./$(GENOFFS) -header > $@.tmp
 	$(QUIETLY) $(CONDITIONALLY_UPDATE_JVMOFFS_TARGET)
 
 $(JVMOFFS)Index.h: $(GENOFFS)
-	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -index > $@.tmp
+	$(QUIETLY) LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./$(GENOFFS) -index > $@.tmp
 	$(QUIETLY)  $(CONDITIONALLY_UPDATE_JVMOFFS_TARGET)
 
 $(JVMOFFS).cpp: $(GENOFFS) $(JVMOFFS).h $(JVMOFFS)Index.h
-	$(QUIETLY) LD_LIBRARY_PATH=. ./$(GENOFFS) -table > $@.tmp
+	$(QUIETLY) LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./$(GENOFFS) -table > $@.tmp
 	$(QUIETLY) $(CONDITIONALLY_UPDATE_JVMOFFS_TARGET)
 
 $(JVMOFFS.o): $(JVMOFFS).h $(JVMOFFS).cpp 
--- a/hotspot/make/solaris/makefiles/gcc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/gcc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2012, 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
--- a/hotspot/make/solaris/makefiles/jvmg.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/jvmg.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/solaris/makefiles/optimized.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/optimized.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2012, 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
--- a/hotspot/make/solaris/makefiles/rules.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/rules.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2000, 2012, 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
--- a/hotspot/make/solaris/makefiles/top.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/solaris/makefiles/top.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2012, 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
--- a/hotspot/make/windows/build.bat	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/build.bat	Wed Jul 05 18:26:11 2017 +0200
@@ -1,6 +1,6 @@
 @echo off
 REM
-REM Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+REM Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
 REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 REM
 REM This code is free software; you can redistribute it and/or modify it
--- a/hotspot/make/windows/build_vm_def.sh	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/build_vm_def.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2000, 2012, 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
--- a/hotspot/make/windows/get_msc_ver.sh	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/get_msc_ver.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2012, 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
--- a/hotspot/make/windows/makefiles/adlc.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/adlc.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/windows/makefiles/defs.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/defs.make	Wed Jul 05 18:26:11 2017 +0200
@@ -154,10 +154,9 @@
 # On 32 bit windows we build server, client and kernel, on 64 bit just server.
 ifeq ($(JVM_VARIANTS),)
   ifeq ($(ARCH_DATA_MODEL), 32)
-    JVM_VARIANTS:=client,server,kernel
+    JVM_VARIANTS:=client,server
     JVM_VARIANT_CLIENT:=true
     JVM_VARIANT_SERVER:=true
-    JVM_VARIANT_KERNEL:=true
   else
     JVM_VARIANTS:=server
     JVM_VARIANT_SERVER:=true
--- a/hotspot/make/windows/makefiles/launcher.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/launcher.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2012, 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
--- a/hotspot/make/windows/makefiles/projectcreator.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/projectcreator.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/make/windows/makefiles/rules.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/rules.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2012, 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
--- a/hotspot/make/windows/makefiles/sanity.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/sanity.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2012, 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
--- a/hotspot/make/windows/makefiles/shared.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/shared.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2012, 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
--- a/hotspot/make/windows/makefiles/vm.make	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/makefiles/vm.make	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2012, 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
--- a/hotspot/make/windows/projectfiles/common/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/make/windows/projectfiles/common/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, 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
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1641,6 +1641,21 @@
 
 }
 
+void  MacroAssembler::set_narrow_klass(Klass* k, Register d) {
+  assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
+  int klass_index = oop_recorder()->find_index(k);
+  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
+  narrowOop encoded_k = oopDesc::encode_klass(k);
+
+  assert_not_delayed();
+  // Relocation with special format (see relocInfo_sparc.hpp).
+  relocate(rspec, 1);
+  // Assembler::sethi(encoded_k, d);
+  emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(encoded_k) );
+  // Don't add relocation for 'add'. Do patching during 'sethi' processing.
+  add(d, low10(encoded_k), d);
+
+}
 
 void MacroAssembler::align(int modulus) {
   while (offset() % modulus != 0) nop();
@@ -4660,7 +4675,7 @@
   // if this changes, change that.
   if (UseCompressedKlassPointers) {
     lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass);
-    decode_heap_oop_not_null(klass);
+    decode_klass_not_null(klass);
   } else {
     ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass);
   }
@@ -4669,7 +4684,7 @@
 void MacroAssembler::store_klass(Register klass, Register dst_oop) {
   if (UseCompressedKlassPointers) {
     assert(dst_oop != klass, "not enough registers");
-    encode_heap_oop_not_null(klass);
+    encode_klass_not_null(klass);
     st(klass, dst_oop, oopDesc::klass_offset_in_bytes());
   } else {
     st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes());
@@ -4829,17 +4844,58 @@
   // pd_code_size_limit.
   // Also do not verify_oop as this is called by verify_oop.
   assert (UseCompressedOops, "must be compressed");
-  assert (Universe::heap() != NULL, "java heap should be initialized");
   assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
   sllx(src, LogMinObjAlignmentInBytes, dst);
   if (Universe::narrow_oop_base() != NULL)
     add(dst, G6_heapbase, dst);
 }
 
+void MacroAssembler::encode_klass_not_null(Register r) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+  assert (UseCompressedKlassPointers, "must be compressed");
+  assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+  if (Universe::narrow_klass_base() != NULL)
+    sub(r, G6_heapbase, r);
+  srlx(r, LogKlassAlignmentInBytes, r);
+}
+
+void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+  assert (UseCompressedKlassPointers, "must be compressed");
+  assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+  if (Universe::narrow_klass_base() == NULL) {
+    srlx(src, LogKlassAlignmentInBytes, dst);
+  } else {
+    sub(src, G6_heapbase, dst);
+    srlx(dst, LogKlassAlignmentInBytes, dst);
+  }
+}
+
+void  MacroAssembler::decode_klass_not_null(Register r) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+  // Do not add assert code to this unless you change vtableStubs_sparc.cpp
+  // pd_code_size_limit.
+  assert (UseCompressedKlassPointers, "must be compressed");
+  assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+  sllx(r, LogKlassAlignmentInBytes, r);
+  if (Universe::narrow_klass_base() != NULL)
+    add(r, G6_heapbase, r);
+}
+
+void  MacroAssembler::decode_klass_not_null(Register src, Register dst) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+  // Do not add assert code to this unless you change vtableStubs_sparc.cpp
+  // pd_code_size_limit.
+  assert (UseCompressedKlassPointers, "must be compressed");
+  assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+  sllx(src, LogKlassAlignmentInBytes, dst);
+  if (Universe::narrow_klass_base() != NULL)
+    add(dst, G6_heapbase, dst);
+}
+
 void MacroAssembler::reinit_heapbase() {
-  if (UseCompressedOops) {
-    // call indirectly to solve generation ordering problem
-    AddressLiteral base(Universe::narrow_oop_base_addr());
+  if (UseCompressedOops || UseCompressedKlassPointers) {
+    AddressLiteral base(Universe::narrow_ptrs_base_addr());
     load_ptr_contents(base, G6_heapbase);
   }
 }
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2280,6 +2280,11 @@
   void encode_heap_oop_not_null(Register src, Register dst);
   void decode_heap_oop_not_null(Register src, Register dst);
 
+  void encode_klass_not_null(Register r);
+  void decode_klass_not_null(Register r);
+  void encode_klass_not_null(Register src, Register dst);
+  void decode_klass_not_null(Register src, Register dst);
+
   // Support for managing the JavaThread pointer (i.e.; the reference to
   // thread-local information).
   void get_thread();                                // load G2_thread
@@ -2409,6 +2414,7 @@
   inline void    set_metadata             (const AddressLiteral& obj_addr, Register d); // same as load_address
 
   void set_narrow_oop( jobject obj, Register d );
+  void set_narrow_klass( Klass* k, Register d );
 
   // nop padding
   void align(int modulus);
--- a/hotspot/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/cpu/sparc/vm/c1_FrameMap_sparc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_FrameMap_sparc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -105,6 +105,11 @@
         if (src->is_address() && !src->is_stack() && (src->type() == T_OBJECT || src->type() == T_ARRAY)) return false;
       }
 
+      if (UseCompressedKlassPointers) {
+        if (src->is_address() && !src->is_stack() && src->type() == T_ADDRESS &&
+            src->as_address_ptr()->disp() == oopDesc::klass_offset_in_bytes()) return false;
+      }
+
       if (dst->is_register()) {
         if (src->is_address() && Assembler::is_simm13(src->as_address_ptr()->disp())) {
           return !PatchALot;
@@ -969,8 +974,18 @@
 #endif
         }
         break;
-      case T_METADATA:
-      case T_ADDRESS:  __ ld_ptr(base, offset, to_reg->as_register()); break;
+      case T_METADATA:  __ ld_ptr(base, offset, to_reg->as_register()); break;
+      case T_ADDRESS:
+#ifdef _LP64
+        if (offset == oopDesc::klass_offset_in_bytes() && UseCompressedKlassPointers) {
+          __ lduw(base, offset, to_reg->as_register());
+          __ decode_klass_not_null(to_reg->as_register());
+        } else
+#endif
+        {
+          __ ld_ptr(base, offset, to_reg->as_register());
+        }
+        break;
       case T_ARRAY : // fall through
       case T_OBJECT:
         {
@@ -2290,7 +2305,7 @@
         __ mov(length, len);
         __ load_klass(dst, tmp);
 
-        int ek_offset = in_bytes(objArrayKlass::element_klass_offset());
+        int ek_offset = in_bytes(ObjArrayKlass::element_klass_offset());
         __ ld_ptr(tmp, ek_offset, super_k);
 
         int sco_offset = in_bytes(Klass::super_check_offset_offset());
@@ -2344,7 +2359,7 @@
     if (UseCompressedKlassPointers) {
       // tmp holds the default type. It currently comes uncompressed after the
       // load of a constant, so encode it.
-      __ encode_heap_oop(tmp);
+      __ encode_klass_not_null(tmp);
       // load the raw value of the dst klass, since we will be comparing
       // uncompressed values directly.
       __ lduw(dst, oopDesc::klass_offset_in_bytes(), tmp2);
@@ -2781,7 +2796,7 @@
     __ load_klass(value, klass_RInfo);
 
     // get instance klass
-    __ ld_ptr(Address(k_RInfo, objArrayKlass::element_klass_offset()), k_RInfo);
+    __ ld_ptr(Address(k_RInfo, ObjArrayKlass::element_klass_offset()), k_RInfo);
     // perform the fast part of the checking logic
     __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, O7, success_target, failure_target, NULL);
 
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/cpu/sparc/vm/c1_LinearScan_sparc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_LinearScan_sparc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -189,7 +189,7 @@
   if (UseCompressedKlassPointers) {
     // Save klass
     mov(klass, t1);
-    encode_heap_oop_not_null(t1);
+    encode_klass_not_null(t1);
     stw(t1, obj, oopDesc::klass_offset_in_bytes());
   } else {
     st_ptr(klass, obj, oopDesc::klass_offset_in_bytes());
--- a/hotspot/src/cpu/sparc/vm/interpreterGenerator_sparc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/interpreterGenerator_sparc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -208,8 +208,6 @@
   Register O1_scratch    = O1;
   Register O4_param_size = O4;   // size of parameters
 
-  address code_start = __ pc();
-
   // here's where control starts out:
   __ align(CodeEntryAlignment);
   address entry_point = __ pc();
@@ -252,22 +250,9 @@
   // O4_first_arg_addr is live!
 
   if (TraceMethodHandles) {
-    const char* name = vmIntrinsics::name_at(iid);
-    if (*name == '_')  name += 1;
-    const size_t len = strlen(name) + 50;
-    char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
-    const char* suffix = "";
-    if (vmIntrinsics::method_for(iid) == NULL ||
-        !vmIntrinsics::method_for(iid)->access_flags().is_public()) {
-      if (is_signature_polymorphic_static(iid))
-        suffix = "/static";
-      else
-        suffix = "/private";
-    }
-    jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
     if (O0_mh != noreg)
       __ mov(O0_mh, G3_method_handle);  // make stub happy
-    trace_method_handle(_masm, qname);
+    trace_method_handle_interpreter_entry(_masm, iid);
   }
 
   if (iid == vmIntrinsics::_invokeBasic) {
@@ -287,14 +272,6 @@
     generate_method_handle_dispatch(_masm, iid, O0_recv, G5_member, not_for_compiler_entry);
   }
 
-  if (PrintMethodHandleStubs) {
-    address code_end = __ pc();
-    tty->print_cr("--------");
-    tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
-    Disassembler::decode(code_start, code_end);
-    tty->cr();
-  }
-
   return entry_point;
 }
 
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -58,5 +58,3 @@
                                   Register recv, Register method_temp,
                                   Register temp2, Register temp3,
                                   bool for_compiler_entry);
-
-  static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
--- a/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -97,8 +97,8 @@
     jint inst2;
     guarantee(Assembler::inv_op2(inst)==Assembler::sethi_op2, "must be sethi");
     if (format() != 0) {
-      assert(type() == relocInfo::oop_type, "only narrow oops case");
-      jint np = oopDesc::encode_heap_oop((oop)x);
+      assert(type() == relocInfo::oop_type || type() == relocInfo::metadata_type, "only narrow oops or klasses case");
+      jint np = type() == relocInfo::oop_type ? oopDesc::encode_heap_oop((oop)x) : oopDesc::encode_klass((Klass*)x);
       inst &= ~Assembler::hi22(-1);
       inst |=  Assembler::hi22((intptr_t)np);
       if (verify_only) {
--- a/hotspot/src/cpu/sparc/vm/sparc.ad	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad	Wed Jul 05 18:26:11 2017 +0200
@@ -557,9 +557,9 @@
     int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
     int v_off = entry_offset*wordSize + vtableEntry::method_offset_in_bytes();
     int klass_load_size;
-    if (UseCompressedOops && UseCompressedKlassPointers) {
+    if (UseCompressedKlassPointers) {
       assert(Universe::heap() != NULL, "java heap should be initialized");
-      if (Universe::narrow_oop_base() == NULL)
+      if (Universe::narrow_klass_base() == NULL)
         klass_load_size = 2*BytesPerInstWord; // see MacroAssembler::load_klass()
       else
         klass_load_size = 3*BytesPerInstWord;
@@ -1707,11 +1707,11 @@
 void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
   st->print_cr("\nUEP:");
 #ifdef    _LP64
-  if (UseCompressedOops) {
+  if (UseCompressedKlassPointers) {
     assert(Universe::heap() != NULL, "java heap should be initialized");
     st->print_cr("\tLDUW   [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check - compressed klass");
     st->print_cr("\tSLL    R_G5,3,R_G5");
-    if (Universe::narrow_oop_base() != NULL)
+    if (Universe::narrow_klass_base() != NULL)
       st->print_cr("\tADD    R_G5,R_G6_heap_base,R_G5");
   } else {
     st->print_cr("\tLDX    [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check");
@@ -1942,6 +1942,12 @@
   return false;
 }
 
+bool Matcher::narrow_klass_use_complex_address() {
+  NOT_LP64(ShouldNotCallThis());
+  assert(UseCompressedKlassPointers, "only for compressed klass code");
+  return false;
+}
+
 // Is it better to copy float constants, or load them directly from memory?
 // Intel can load a float constant from a direct address, requiring no
 // extra registers.  Most RISCs will have to materialize an address into a
@@ -2602,9 +2608,9 @@
       int off = __ offset();
       __ load_klass(O0, G3_scratch);
       int klass_load_size;
-      if (UseCompressedOops && UseCompressedKlassPointers) {
+      if (UseCompressedKlassPointers) {
         assert(Universe::heap() != NULL, "java heap should be initialized");
-        if (Universe::narrow_oop_base() == NULL)
+        if (Universe::narrow_klass_base() == NULL)
           klass_load_size = 2*BytesPerInstWord;
         else
           klass_load_size = 3*BytesPerInstWord;
@@ -3610,6 +3616,15 @@
   interface(CONST_INTER);
 %}
 
+operand immNKlass()
+%{
+  match(ConNKlass);
+
+  op_cost(10);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // NULL Pointer Immediate
 operand immN0()
 %{
@@ -5870,8 +5885,8 @@
 %}
 
 // Load Unsigned Integer into a Long Register
-instruct loadUI2L(iRegL dst, memory mem) %{
-  match(Set dst (LoadUI2L mem));
+instruct loadUI2L(iRegL dst, memory mem, immL_32bits mask) %{
+  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
   ins_cost(MEMORY_REF_COST);
 
   size(4);
@@ -6159,6 +6174,17 @@
   ins_pipe(ialu_hi_lo_reg);
 %}
 
+instruct loadConNKlass(iRegN dst, immNKlass src) %{
+  match(Set dst src);
+  ins_cost(DEFAULT_COST * 3/2);
+  format %{ "SET    $src,$dst\t! compressed klass ptr" %}
+  ins_encode %{
+    Register dst = $dst$$Register;
+    __ set_narrow_klass((Klass*)$src$$constant, dst);
+  %}
+  ins_pipe(ialu_hi_lo_reg);
+%}
+
 // Materialize long value (predicated by immL_cheap).
 instruct loadConL_set64(iRegL dst, immL_cheap con, o7RegL tmp) %{
   match(Set dst con);
@@ -6475,6 +6501,25 @@
    ins_pipe(istore_mem_spORreg);
 %}
 
+instruct storeNKlass(memory dst, iRegN src) %{
+   match(Set dst (StoreNKlass dst src));
+   ins_cost(MEMORY_REF_COST);
+   size(4);
+
+   format %{ "STW    $src,$dst\t! compressed klass ptr" %}
+   ins_encode %{
+     Register base = as_Register($dst$$base);
+     Register index = as_Register($dst$$index);
+     Register src = $src$$Register;
+     if (index != G0) {
+       __ stw(src, base, index);
+     } else {
+       __ stw(src, base, $dst$$disp);
+     }
+   %}
+   ins_pipe(istore_mem_spORreg);
+%}
+
 instruct storeN0(memory dst, immN0 src) %{
    match(Set dst (StoreN dst src));
    ins_cost(MEMORY_REF_COST);
@@ -6582,6 +6627,23 @@
   ins_pipe(ialu_reg);
 %}
 
+instruct encodeKlass_not_null(iRegN dst, iRegP src) %{
+  match(Set dst (EncodePKlass src));
+  format %{ "encode_klass_not_null $src, $dst" %}
+  ins_encode %{
+    __ encode_klass_not_null($src$$Register, $dst$$Register);
+  %}
+  ins_pipe(ialu_reg);
+%}
+
+instruct decodeKlass_not_null(iRegP dst, iRegN src) %{
+  match(Set dst (DecodeNKlass src));
+  format %{ "decode_klass_not_null $src, $dst" %}
+  ins_encode %{
+    __ decode_klass_not_null($src$$Register, $dst$$Register);
+  %}
+  ins_pipe(ialu_reg);
+%}
 
 //----------MemBar Instructions-----------------------------------------------
 // Memory barrier flavors
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -3091,7 +3091,7 @@
     arraycopy_range_checks(src, src_pos, dst, dst_pos, length,
                            O5_temp, G4_dst_klass, L_failed);
 
-    // typeArrayKlass
+    // TypeArrayKlass
     //
     // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
     // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
@@ -3142,7 +3142,7 @@
     __ br(Assembler::always, false, Assembler::pt, entry_jlong_arraycopy);
     __ delayed()->signx(length, count); // length
 
-    // objArrayKlass
+    // ObjArrayKlass
   __ BIND(L_objArray);
     // live at this point:  G3_src_klass, G4_dst_klass, src[_pos], dst[_pos], length
 
@@ -3198,8 +3198,8 @@
       generate_type_check(G3_src_klass, sco_temp, G4_dst_klass,
                           O5_temp, L_plain_copy);
 
-      // Fetch destination element klass from the objArrayKlass header.
-      int ek_offset = in_bytes(objArrayKlass::element_klass_offset());
+      // Fetch destination element klass from the ObjArrayKlass header.
+      int ek_offset = in_bytes(ObjArrayKlass::element_klass_offset());
 
       // the checkcast_copy loop needs two extra arguments:
       __ ld_ptr(G4_dst_klass, ek_offset, O4);   // dest elem klass
--- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -867,7 +867,7 @@
 
   // do fast instanceof cache test
 
-  __ ld_ptr(O4,     in_bytes(objArrayKlass::element_klass_offset()),  O4);
+  __ ld_ptr(O4,     in_bytes(ObjArrayKlass::element_klass_offset()),  O4);
 
   assert(Otos_i == O0, "just checking");
 
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -117,6 +117,7 @@
     // 32-bit oops don't make sense for the 64-bit VM on sparc
     // since the 32-bit VM has the same registers and smaller objects.
     Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
+    Universe::set_narrow_klass_shift(LogKlassAlignmentInBytes);
 #endif // _LP64
 #ifdef COMPILER2
     // Indirect branch is the same cost as direct
--- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -220,13 +220,13 @@
       const int basic = 5*BytesPerInstWord +
                         // shift;add for load_klass (only shift with zero heap based)
                         (UseCompressedKlassPointers ?
-                         ((Universe::narrow_oop_base() == NULL) ? BytesPerInstWord : 2*BytesPerInstWord) : 0);
+                         ((Universe::narrow_klass_base() == NULL) ? BytesPerInstWord : 2*BytesPerInstWord) : 0);
       return basic + slop;
     } else {
       const int basic = (28 LP64_ONLY(+ 6)) * BytesPerInstWord +
                         // shift;add for load_klass (only shift with zero heap based)
                         (UseCompressedKlassPointers ?
-                         ((Universe::narrow_oop_base() == NULL) ? BytesPerInstWord : 2*BytesPerInstWord) : 0);
+                         ((Universe::narrow_klass_base() == NULL) ? BytesPerInstWord : 2*BytesPerInstWord) : 0);
       return (basic + slop);
     }
   }
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1170,26 +1170,11 @@
 // and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.
 // The ZF is set if the compared values were equal, and cleared otherwise.
 void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg
-  if (Atomics & 2) {
-     // caveat: no instructionmark, so this isn't relocatable.
-     // Emit a synthetic, non-atomic, CAS equivalent.
-     // Beware.  The synthetic form sets all ICCs, not just ZF.
-     // cmpxchg r,[m] is equivalent to rax, = CAS (m, rax, r)
-     cmpl(rax, adr);
-     movl(rax, adr);
-     if (reg != rax) {
-        Label L ;
-        jcc(Assembler::notEqual, L);
-        movl(adr, reg);
-        bind(L);
-     }
-  } else {
-     InstructionMark im(this);
-     prefix(adr, reg);
-     emit_byte(0x0F);
-     emit_byte(0xB1);
-     emit_operand(reg, adr);
-  }
+  InstructionMark im(this);
+  prefix(adr, reg);
+  emit_byte(0x0F);
+  emit_byte(0xB1);
+  emit_operand(reg, adr);
 }
 
 void Assembler::comisd(XMMRegister dst, Address src) {
@@ -1513,12 +1498,7 @@
 }
 
 void Assembler::lock() {
-  if (Atomics & 1) {
-     // Emit either nothing, a NOP, or a NOP: prefix
-     emit_byte(0x90) ;
-  } else {
-     emit_byte(0xF0);
-  }
+  emit_byte(0xF0);
 }
 
 void Assembler::lzcntl(Register dst, Register src) {
@@ -6936,7 +6916,7 @@
 #ifdef ASSERT
   // TraceBytecodes does not use r12 but saves it over the call, so don't verify
   // r12 is the heapbase.
-  LP64_ONLY(if (UseCompressedOops && !TraceBytecodes) verify_heapbase("call_VM_base");)
+  LP64_ONLY(if ((UseCompressedOops || UseCompressedKlassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");)
 #endif // ASSERT
 
   assert(java_thread != oop_result  , "cannot use the same register for java_thread & oop_result");
@@ -10036,7 +10016,7 @@
 #ifdef _LP64
   if (UseCompressedKlassPointers) {
     movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
-    decode_heap_oop_not_null(dst);
+    decode_klass_not_null(dst);
   } else
 #endif
     movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
@@ -10047,15 +10027,10 @@
   if (UseCompressedKlassPointers) {
     assert (Universe::heap() != NULL, "java heap should be initialized");
     movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
-    if (Universe::narrow_oop_shift() != 0) {
-      assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
-      if (LogMinObjAlignmentInBytes == Address::times_8) {
-        movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset()));
-      } else {
-        // OK to use shift since we don't need to preserve flags.
-        shlq(dst, LogMinObjAlignmentInBytes);
-        movq(dst, Address(r12_heapbase, dst, Address::times_1, Klass::prototype_header_offset()));
-      }
+    if (Universe::narrow_klass_shift() != 0) {
+      assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+      assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
+      movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset()));
     } else {
       movq(dst, Address(dst, Klass::prototype_header_offset()));
     }
@@ -10070,7 +10045,7 @@
 void MacroAssembler::store_klass(Register dst, Register src) {
 #ifdef _LP64
   if (UseCompressedKlassPointers) {
-    encode_heap_oop_not_null(src);
+    encode_klass_not_null(src);
     movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
   } else
 #endif
@@ -10152,12 +10127,12 @@
 
 #ifdef ASSERT
 void MacroAssembler::verify_heapbase(const char* msg) {
-  assert (UseCompressedOops, "should be compressed");
+  assert (UseCompressedOops || UseCompressedKlassPointers, "should be compressed");
   assert (Universe::heap() != NULL, "java heap should be initialized");
   if (CheckCompressedOops) {
     Label ok;
     push(rscratch1); // cmpptr trashes rscratch1
-    cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
+    cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
     jcc(Assembler::equal, ok);
     STOP(msg);
     bind(ok);
@@ -10295,6 +10270,74 @@
   }
 }
 
+void MacroAssembler::encode_klass_not_null(Register r) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+#ifdef ASSERT
+  verify_heapbase("MacroAssembler::encode_klass_not_null: heap base corrupted?");
+#endif
+  if (Universe::narrow_klass_base() != NULL) {
+    subq(r, r12_heapbase);
+  }
+  if (Universe::narrow_klass_shift() != 0) {
+    assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+    shrq(r, LogKlassAlignmentInBytes);
+  }
+}
+
+void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+#ifdef ASSERT
+  verify_heapbase("MacroAssembler::encode_klass_not_null2: heap base corrupted?");
+#endif
+  if (dst != src) {
+    movq(dst, src);
+  }
+  if (Universe::narrow_klass_base() != NULL) {
+    subq(dst, r12_heapbase);
+  }
+  if (Universe::narrow_klass_shift() != 0) {
+    assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+    shrq(dst, LogKlassAlignmentInBytes);
+  }
+}
+
+void  MacroAssembler::decode_klass_not_null(Register r) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+  // Note: it will change flags
+  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+  // Cannot assert, unverified entry point counts instructions (see .ad file)
+  // vtableStubs also counts instructions in pd_code_size_limit.
+  // Also do not verify_oop as this is called by verify_oop.
+  if (Universe::narrow_klass_shift() != 0) {
+    assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+    shlq(r, LogKlassAlignmentInBytes);
+    if (Universe::narrow_klass_base() != NULL) {
+      addq(r, r12_heapbase);
+    }
+  } else {
+    assert (Universe::narrow_klass_base() == NULL, "sanity");
+  }
+}
+
+void  MacroAssembler::decode_klass_not_null(Register dst, Register src) {
+  assert(Metaspace::is_initialized(), "metaspace should be initialized");
+  // Note: it will change flags
+  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+  // Cannot assert, unverified entry point counts instructions (see .ad file)
+  // vtableStubs also counts instructions in pd_code_size_limit.
+  // Also do not verify_oop as this is called by verify_oop.
+  if (Universe::narrow_klass_shift() != 0) {
+    assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+    assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
+    leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
+  } else {
+    assert (Universe::narrow_klass_base() == NULL, "sanity");
+    if (dst != src) {
+      movq(dst, src);
+    }
+  }
+}
+
 void  MacroAssembler::set_narrow_oop(Register dst, jobject obj) {
   assert (UseCompressedOops, "should only be used for compressed headers");
   assert (Universe::heap() != NULL, "java heap should be initialized");
@@ -10313,6 +10356,22 @@
   mov_narrow_oop(dst, oop_index, rspec);
 }
 
+void  MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
+  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
+  int klass_index = oop_recorder()->find_index(k);
+  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
+  mov_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
+}
+
+void  MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
+  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
+  int klass_index = oop_recorder()->find_index(k);
+  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
+  mov_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
+}
+
 void  MacroAssembler::cmp_narrow_oop(Register dst, jobject obj) {
   assert (UseCompressedOops, "should only be used for compressed headers");
   assert (Universe::heap() != NULL, "java heap should be initialized");
@@ -10331,9 +10390,25 @@
   Assembler::cmp_narrow_oop(dst, oop_index, rspec);
 }
 
+void  MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) {
+  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
+  int klass_index = oop_recorder()->find_index(k);
+  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
+  Assembler::cmp_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
+}
+
+void  MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
+  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
+  int klass_index = oop_recorder()->find_index(k);
+  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
+  Assembler::cmp_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
+}
+
 void MacroAssembler::reinit_heapbase() {
-  if (UseCompressedOops) {
-    movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
+  if (UseCompressedOops || UseCompressedKlassPointers) {
+    movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
   }
 }
 #endif // _LP64
@@ -10616,7 +10691,7 @@
         // Array header size is 12 bytes in 32-bit VM
         // + 6 bytes for 3 chars == 18 bytes,
         // enough space to load vec and shift.
-        assert(HeapWordSize*typeArrayKlass::header_size() >= 12,"sanity");
+        assert(HeapWordSize*TypeArrayKlass::header_size() >= 12,"sanity");
         movdqu(vec, Address(str2, (int_cnt2*2)-16));
         psrldq(vec, 16-(int_cnt2*2));
       }
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2083,6 +2083,15 @@
   void cmp_narrow_oop(Register dst, jobject obj);
   void cmp_narrow_oop(Address dst, jobject obj);
 
+  void encode_klass_not_null(Register r);
+  void decode_klass_not_null(Register r);
+  void encode_klass_not_null(Register dst, Register src);
+  void decode_klass_not_null(Register dst, Register src);
+  void set_narrow_klass(Register dst, Klass* k);
+  void set_narrow_klass(Address dst, Klass* k);
+  void cmp_narrow_klass(Register dst, Klass* k);
+  void cmp_narrow_klass(Address dst, Klass* k);
+
   // if heap base register is used - reinit it with the correct value
   void reinit_heapbase();
 
--- a/hotspot/src/cpu/x86/vm/c1_FrameMap_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_FrameMap_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/cpu/x86/vm/c1_FrameMap_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_FrameMap_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -148,7 +148,7 @@
 
   static int adjust_reg_range(int range) {
     // Reduce the number of available regs (to free r12) in case of compressed oops
-    if (UseCompressedOops) return range - 1;
+    if (UseCompressedOops || UseCompressedKlassPointers) return range - 1;
     return range;
   }
 
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -340,7 +340,7 @@
   Register receiver = FrameMap::receiver_opr->as_register();
   Register ic_klass = IC_Klass;
   const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
-  const bool do_post_padding = VerifyOops || UseCompressedOops;
+  const bool do_post_padding = VerifyOops || UseCompressedKlassPointers;
   if (!do_post_padding) {
     // insert some nops so that the verified entry point is aligned on CodeEntryAlignment
     while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
@@ -1262,7 +1262,11 @@
       break;
 
     case T_ADDRESS:
-      __ movptr(dest->as_register(), from_addr);
+      if (UseCompressedKlassPointers && addr->disp() == oopDesc::klass_offset_in_bytes()) {
+        __ movl(dest->as_register(), from_addr);
+      } else {
+        __ movptr(dest->as_register(), from_addr);
+      }
       break;
     case T_INT:
       __ movl(dest->as_register(), from_addr);
@@ -1364,6 +1368,12 @@
     }
 #endif
     __ verify_oop(dest->as_register());
+  } else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
+#ifdef _LP64
+    if (UseCompressedKlassPointers) {
+      __ decode_klass_not_null(dest->as_register());
+    }
+#endif
   }
 }
 
@@ -1705,7 +1715,7 @@
   } else if (obj == klass_RInfo) {
     klass_RInfo = dst;
   }
-  if (k->is_loaded() && !UseCompressedOops) {
+  if (k->is_loaded() && !UseCompressedKlassPointers) {
     select_different_registers(obj, dst, k_RInfo, klass_RInfo);
   } else {
     Rtmp1 = op->tmp3()->as_register();
@@ -1881,7 +1891,7 @@
     __ load_klass(klass_RInfo, value);
 
     // get instance klass (it's already uncompressed)
-    __ movptr(k_RInfo, Address(k_RInfo, objArrayKlass::element_klass_offset()));
+    __ movptr(k_RInfo, Address(k_RInfo, ObjArrayKlass::element_klass_offset()));
     // perform the fast part of the checking logic
     __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, NULL);
     // call out-of-line instance of __ check_klass_subtype_slow_path(...):
@@ -3349,7 +3359,7 @@
 
 #ifndef _LP64
         __ movptr(tmp, dst_klass_addr);
-        __ movptr(tmp, Address(tmp, objArrayKlass::element_klass_offset()));
+        __ movptr(tmp, Address(tmp, ObjArrayKlass::element_klass_offset()));
         __ push(tmp);
         __ movl(tmp, Address(tmp, Klass::super_check_offset_offset()));
         __ push(tmp);
@@ -3375,14 +3385,14 @@
         // Allocate abi space for args but be sure to keep stack aligned
         __ subptr(rsp, 6*wordSize);
         __ load_klass(c_rarg3, dst);
-        __ movptr(c_rarg3, Address(c_rarg3, objArrayKlass::element_klass_offset()));
+        __ movptr(c_rarg3, Address(c_rarg3, ObjArrayKlass::element_klass_offset()));
         store_parameter(c_rarg3, 4);
         __ movl(c_rarg3, Address(c_rarg3, Klass::super_check_offset_offset()));
         __ call(RuntimeAddress(copyfunc_addr));
         __ addptr(rsp, 6*wordSize);
 #else
         __ load_klass(c_rarg4, dst);
-        __ movptr(c_rarg4, Address(c_rarg4, objArrayKlass::element_klass_offset()));
+        __ movptr(c_rarg4, Address(c_rarg4, ObjArrayKlass::element_klass_offset()));
         __ movl(c_rarg3, Address(c_rarg4, Klass::super_check_offset_offset()));
         __ call(RuntimeAddress(copyfunc_addr));
 #endif
@@ -3446,7 +3456,7 @@
     __ mov_metadata(tmp, default_type->constant_encoding());
 #ifdef _LP64
     if (UseCompressedKlassPointers) {
-      __ encode_heap_oop(tmp);
+      __ encode_klass_not_null(tmp);
     }
 #endif
 
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1166,7 +1166,7 @@
   }
   LIR_Opr reg = rlock_result(x);
   LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
-  if (!x->klass()->is_loaded() || UseCompressedOops) {
+  if (!x->klass()->is_loaded() || UseCompressedKlassPointers) {
     tmp3 = new_register(objectType);
   }
   __ checkcast(reg, obj.result(), x->klass(),
@@ -1188,7 +1188,7 @@
   }
   obj.load_item();
   LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
-  if (!x->klass()->is_loaded() || UseCompressedOops) {
+  if (!x->klass()->is_loaded() || UseCompressedKlassPointers) {
     tmp3 = new_register(objectType);
   }
   __ instanceof(reg, obj.result(), x->klass(),
--- a/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -159,7 +159,7 @@
 #ifdef _LP64
   if (UseCompressedKlassPointers) { // Take care not to kill klass
     movptr(t1, klass);
-    encode_heap_oop_not_null(t1);
+    encode_klass_not_null(t1);
     movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1);
   } else
 #endif
--- a/hotspot/src/cpu/x86/vm/interpreterGenerator_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/interpreterGenerator_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -209,8 +209,6 @@
   Register rcx_mh     = rcx;   // MH receiver; dies quickly and is recycled
   Register rbx_method = rbx;   // eventual target of this invocation
 
-  address code_start = __ pc();
-
   // here's where control starts out:
   __ align(CodeEntryAlignment);
   address entry_point = __ pc();
@@ -251,23 +249,7 @@
 
   // rdx_first_arg_addr is live!
 
-  if (TraceMethodHandles) {
-    const char* name = vmIntrinsics::name_at(iid);
-    if (*name == '_')  name += 1;
-    const size_t len = strlen(name) + 50;
-    char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
-    const char* suffix = "";
-    if (vmIntrinsics::method_for(iid) == NULL ||
-        !vmIntrinsics::method_for(iid)->access_flags().is_public()) {
-      if (is_signature_polymorphic_static(iid))
-        suffix = "/static";
-      else
-        suffix = "/private";
-    }
-    jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
-    // note: stub look for mh in rcx
-    trace_method_handle(_masm, qname);
-  }
+  trace_method_handle_interpreter_entry(_masm, iid);
 
   if (iid == vmIntrinsics::_invokeBasic) {
     generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry);
@@ -287,14 +269,6 @@
     generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry);
   }
 
-  if (PrintMethodHandleStubs) {
-    address code_end = __ pc();
-    tty->print_cr("--------");
-    tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
-    Disassembler::decode(code_start, code_end);
-    tty->cr();
-  }
-
   return entry_point;
 }
 
--- a/hotspot/src/cpu/x86/vm/methodHandles_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -55,8 +55,6 @@
                                   Register temp2,
                                   bool for_compiler_entry);
 
-  static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
-
   static Register saved_last_sp_register() {
     // Should be in sharedRuntime, not here.
     return LP64_ONLY(r13) NOT_LP64(rsi);
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1801,7 +1801,7 @@
     assert_different_registers(src, src_pos, dst, dst_pos, rcx_lh);
     arraycopy_range_checks(src, src_pos, dst, dst_pos, LENGTH, L_failed);
 
-    // typeArrayKlass
+    // TypeArrayKlass
     //
     // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
     // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
@@ -1864,7 +1864,7 @@
     __ leave(); // required for proper stackwalking of RuntimeStub frame
     __ ret(0);
 
-    // objArrayKlass
+    // ObjArrayKlass
   __ BIND(L_objArray);
     // live at this point:  rcx_src_klass, src[_pos], dst[_pos]
 
@@ -1894,7 +1894,7 @@
     // live at this point:  rcx_src_klass, dst[_pos], src[_pos]
     {
       // Handy offsets:
-      int  ek_offset = in_bytes(objArrayKlass::element_klass_offset());
+      int  ek_offset = in_bytes(ObjArrayKlass::element_klass_offset());
       int sco_offset = in_bytes(Klass::super_check_offset_offset());
 
       Register rsi_dst_klass = rsi;
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2604,7 +2604,7 @@
     arraycopy_range_checks(src, src_pos, dst, dst_pos, r11_length,
                            r10, L_failed);
 
-    // typeArrayKlass
+    // TypeArrayKlass
     //
     // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
     // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
@@ -2670,7 +2670,7 @@
     __ movl2ptr(count, r11_length); // length
     __ jump(RuntimeAddress(long_copy_entry));
 
-    // objArrayKlass
+    // ObjArrayKlass
   __ BIND(L_objArray);
     // live at this point:  r10_src_klass, r11_length, src[_pos], dst[_pos]
 
@@ -2723,8 +2723,8 @@
       assert_clean_int(sco_temp, rax);
       generate_type_check(r10_src_klass, sco_temp, r11_dst_klass, L_plain_copy);
 
-      // Fetch destination element klass from the objArrayKlass header.
-      int ek_offset = in_bytes(objArrayKlass::element_klass_offset());
+      // Fetch destination element klass from the ObjArrayKlass header.
+      int ek_offset = in_bytes(ObjArrayKlass::element_klass_offset());
       __ movptr(r11_dst_klass, Address(r11_dst_klass, ek_offset));
       __ movl(  sco_temp,      Address(r11_dst_klass, sco_offset));
       assert_clean_int(sco_temp, rax);
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -949,7 +949,7 @@
   __ load_klass(rbx, rax);
   // Move superklass into EAX
   __ load_klass(rax, rdx);
-  __ movptr(rax, Address(rax, objArrayKlass::element_klass_offset()));
+  __ movptr(rax, Address(rax, ObjArrayKlass::element_klass_offset()));
   // Compress array+index*wordSize+12 into a single register.  Frees ECX.
   __ lea(rdx, element_address);
 
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -970,7 +970,7 @@
   // Move superklass into rax
   __ load_klass(rax, rdx);
   __ movptr(rax, Address(rax,
-                         objArrayKlass::element_klass_offset()));
+                         ObjArrayKlass::element_klass_offset()));
   // Compress array + index*oopSize + 12 into a single register.  Frees rcx.
   __ lea(rdx, element_address);
 
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -212,11 +212,11 @@
   if (is_vtable_stub) {
     // Vtable stub size
     return (DebugVtables ? 512 : 24) + (CountCompiledCalls ? 13 : 0) +
-           (UseCompressedOops ? 16 : 0);  // 1 leaq can be 3 bytes + 1 long
+           (UseCompressedKlassPointers ? 16 : 0);  // 1 leaq can be 3 bytes + 1 long
   } else {
     // Itable stub size
     return (DebugVtables ? 512 : 74) + (CountCompiledCalls ? 13 : 0) +
-           (UseCompressedOops ? 32 : 0);  // 2 leaqs
+           (UseCompressedKlassPointers ? 32 : 0);  // 2 leaqs
   }
   // In order to tune these parameters, run the JVM with VM options
   // +PrintMiscellaneous and +WizardMode to see information about
--- a/hotspot/src/cpu/x86/vm/x86_32.ad	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad	Wed Jul 05 18:26:11 2017 +0200
@@ -1424,6 +1424,11 @@
   return true;
 }
 
+bool Matcher::narrow_klass_use_complex_address() {
+  ShouldNotCallThis();
+  return true;
+}
+
 
 // Is it better to copy float constants, or load them directly from memory?
 // Intel can load a float constant from a direct address, requiring no
@@ -1553,9 +1558,6 @@
 // Returns true if the high 32 bits of the value is known to be zero.
 bool is_operand_hi32_zero(Node* n) {
   int opc = n->Opcode();
-  if (opc == Op_LoadUI2L) {
-    return true;
-  }
   if (opc == Op_AndL) {
     Node* o2 = n->in(2);
     if (o2->is_Con() && (o2->get_long() & 0xFFFFFFFF00000000LL) == 0LL) {
@@ -6147,8 +6149,8 @@
 %}
 
 // Load Unsigned Integer into Long Register
-instruct loadUI2L(eRegL dst, memory mem, eFlagsReg cr) %{
-  match(Set dst (LoadUI2L mem));
+instruct loadUI2L(eRegL dst, memory mem, immL_32bits mask, eFlagsReg cr) %{
+  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
   effect(KILL cr);
 
   ins_cost(250);
@@ -12145,8 +12147,8 @@
 
   ins_cost(1100);  // slightly larger than the next version
   format %{ "MOV    EDI,[$sub+Klass::secondary_supers]\n\t"
-            "MOV    ECX,[EDI+arrayKlass::length]\t# length to scan\n\t"
-            "ADD    EDI,arrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
+            "MOV    ECX,[EDI+ArrayKlass::length]\t# length to scan\n\t"
+            "ADD    EDI,ArrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
             "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t"
             "JNE,s  miss\t\t# Missed: EDI not-zero\n\t"
             "MOV    [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache\n\t"
@@ -12164,8 +12166,8 @@
 
   ins_cost(1000);
   format %{ "MOV    EDI,[$sub+Klass::secondary_supers]\n\t"
-            "MOV    ECX,[EDI+arrayKlass::length]\t# length to scan\n\t"
-            "ADD    EDI,arrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
+            "MOV    ECX,[EDI+ArrayKlass::length]\t# length to scan\n\t"
+            "ADD    EDI,ArrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
             "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t"
             "JNE,s  miss\t\t# Missed: flags NZ\n\t"
             "MOV    [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache, flags Z\n\t"
--- a/hotspot/src/cpu/x86/vm/x86_64.ad	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad	Wed Jul 05 18:26:11 2017 +0200
@@ -1409,10 +1409,10 @@
 #ifndef PRODUCT
 void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
 {
-  if (UseCompressedOops) {
+  if (UseCompressedKlassPointers) {
     st->print_cr("movl    rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
-    if (Universe::narrow_oop_shift() != 0) {
-      st->print_cr("\tdecode_heap_oop_not_null rscratch1, rscratch1");
+    if (Universe::narrow_klass_shift() != 0) {
+      st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
     }
     st->print_cr("\tcmpq    rax, rscratch1\t # Inline cache check");
   } else {
@@ -1428,7 +1428,7 @@
 {
   MacroAssembler masm(&cbuf);
   uint insts_size = cbuf.insts_size();
-  if (UseCompressedOops) {
+  if (UseCompressedKlassPointers) {
     masm.load_klass(rscratch1, j_rarg0);
     masm.cmpptr(rax, rscratch1);
   } else {
@@ -1576,6 +1576,11 @@
   return (LogMinObjAlignmentInBytes <= 3);
 }
 
+bool Matcher::narrow_klass_use_complex_address() {
+  assert(UseCompressedKlassPointers, "only for compressed klass code");
+  return (LogKlassAlignmentInBytes <= 3);
+}
+
 // Is it better to copy float constants, or load them directly from
 // memory?  Intel can load a float constant from a direct address,
 // requiring no extra registers.  Most RISCs will have to materialize
@@ -3139,6 +3144,14 @@
   interface(CONST_INTER);
 %}
 
+operand immNKlass() %{
+  match(ConNKlass);
+
+  op_cost(10);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // NULL Pointer Immediate
 operand immN0() %{
   predicate(n->get_narrowcon() == 0);
@@ -4038,6 +4051,145 @@
   %}
 %}
 
+operand indirectNarrowKlass(rRegN reg)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(DecodeNKlass reg);
+
+  format %{ "[$reg]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index(0x4);
+    scale(0x0);
+    disp(0x0);
+  %}
+%}
+
+operand indOffset8NarrowKlass(rRegN reg, immL8 off)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (DecodeNKlass reg) off);
+
+  format %{ "[$reg + $off (8-bit)]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index(0x4);
+    scale(0x0);
+    disp($off);
+  %}
+%}
+
+operand indOffset32NarrowKlass(rRegN reg, immL32 off)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (DecodeNKlass reg) off);
+
+  format %{ "[$reg + $off (32-bit)]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index(0x4);
+    scale(0x0);
+    disp($off);
+  %}
+%}
+
+operand indIndexOffsetNarrowKlass(rRegN reg, rRegL lreg, immL32 off)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (AddP (DecodeNKlass reg) lreg) off);
+
+  op_cost(10);
+  format %{"[$reg + $off + $lreg]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index($lreg);
+    scale(0x0);
+    disp($off);
+  %}
+%}
+
+operand indIndexNarrowKlass(rRegN reg, rRegL lreg)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (DecodeNKlass reg) lreg);
+
+  op_cost(10);
+  format %{"[$reg + $lreg]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index($lreg);
+    scale(0x0);
+    disp(0x0);
+  %}
+%}
+
+operand indIndexScaleNarrowKlass(rRegN reg, rRegL lreg, immI2 scale)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (DecodeNKlass reg) (LShiftL lreg scale));
+
+  op_cost(10);
+  format %{"[$reg + $lreg << $scale]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index($lreg);
+    scale($scale);
+    disp(0x0);
+  %}
+%}
+
+operand indIndexScaleOffsetNarrowKlass(rRegN reg, immL32 off, rRegL lreg, immI2 scale)
+%{
+  predicate(Universe::narrow_klass_shift() == 0);
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (AddP (DecodeNKlass reg) (LShiftL lreg scale)) off);
+
+  op_cost(10);
+  format %{"[$reg + $off + $lreg << $scale]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index($lreg);
+    scale($scale);
+    disp($off);
+  %}
+%}
+
+operand indCompressedKlassOffset(rRegN reg, immL32 off) %{
+  predicate(UseCompressedKlassPointers && (Universe::narrow_klass_shift() == Address::times_8));
+  constraint(ALLOC_IN_RC(ptr_reg));
+  match(AddP (DecodeNKlass reg) off);
+
+  op_cost(10);
+  format %{"[R12 + $reg << 3 + $off] (compressed klass addressing)" %}
+  interface(MEMORY_INTER) %{
+    base(0xc); // R12
+    index($reg);
+    scale(0x3);
+    disp($off);
+  %}
+%}
+
+operand indPosIndexScaleOffsetNarrowKlass(rRegN reg, immL32 off, rRegI idx, immI2 scale)
+%{
+  constraint(ALLOC_IN_RC(ptr_reg));
+  predicate(Universe::narrow_klass_shift() == 0 && n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0);
+  match(AddP (AddP (DecodeNKlass reg) (LShiftL (ConvI2L idx) scale)) off);
+
+  op_cost(10);
+  format %{"[$reg + $off + $idx << $scale]" %}
+  interface(MEMORY_INTER) %{
+    base($reg);
+    index($idx);
+    scale($scale);
+    disp($off);
+  %}
+%}
 
 //----------Special Memory Operands--------------------------------------------
 // Stack Slot Operand - This operand is used for loading and storing temporary
@@ -4209,7 +4361,11 @@
                indCompressedOopOffset,
                indirectNarrow, indOffset8Narrow, indOffset32Narrow,
                indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow,
-               indIndexScaleOffsetNarrow, indPosIndexScaleOffsetNarrow);
+               indIndexScaleOffsetNarrow, indPosIndexScaleOffsetNarrow,
+               indCompressedKlassOffset,
+               indirectNarrowKlass, indOffset8NarrowKlass, indOffset32NarrowKlass,
+               indIndexOffsetNarrowKlass, indIndexNarrowKlass, indIndexScaleNarrowKlass,
+               indIndexScaleOffsetNarrowKlass, indPosIndexScaleOffsetNarrowKlass);
 
 //----------PIPELINE-----------------------------------------------------------
 // Rules which define the behavior of the target architectures pipeline.
@@ -5044,9 +5200,9 @@
 %}
 
 // Load Unsigned Integer into Long Register
-instruct loadUI2L(rRegL dst, memory mem)
-%{
-  match(Set dst (LoadUI2L mem));
+instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask) 
+%{
+  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
 
   ins_cost(125);
   format %{ "movl    $dst, $mem\t# uint -> long" %}
@@ -5469,6 +5625,22 @@
   ins_pipe(ialu_reg_fat); // XXX
 %}
 
+instruct loadConNKlass(rRegN dst, immNKlass src) %{
+  match(Set dst src);
+
+  ins_cost(125);
+  format %{ "movl    $dst, $src\t# compressed klass ptr" %}
+  ins_encode %{
+    address con = (address)$src$$constant;
+    if (con == NULL) {
+      ShouldNotReachHere();
+    } else {
+      __ set_narrow_klass($dst$$Register, (Klass*)$src$$constant);
+    }
+  %}
+  ins_pipe(ialu_reg_fat); // XXX
+%}
+
 instruct loadConF0(regF dst, immF0 src)
 %{
   match(Set dst src);
@@ -5738,7 +5910,7 @@
 
 instruct storeImmP0(memory mem, immP0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreP mem zero));
 
   ins_cost(125); // XXX
@@ -5774,9 +5946,21 @@
   ins_pipe(ialu_mem_reg);
 %}
 
+instruct storeNKlass(memory mem, rRegN src)
+%{
+  match(Set mem (StoreNKlass mem src));
+
+  ins_cost(125); // XXX
+  format %{ "movl    $mem, $src\t# compressed klass ptr" %}
+  ins_encode %{
+    __ movl($mem$$Address, $src$$Register);
+  %}
+  ins_pipe(ialu_mem_reg);
+%}
+
 instruct storeImmN0(memory mem, immN0 zero)
 %{
-  predicate(Universe::narrow_oop_base() == NULL);
+  predicate(Universe::narrow_oop_base() == NULL && Universe::narrow_klass_base() == NULL);
   match(Set mem (StoreN mem zero));
 
   ins_cost(125); // XXX
@@ -5804,10 +5988,22 @@
   ins_pipe(ialu_mem_imm);
 %}
 
+instruct storeImmNKlass(memory mem, immNKlass src)
+%{
+  match(Set mem (StoreNKlass mem src));
+
+  ins_cost(150); // XXX
+  format %{ "movl    $mem, $src\t# compressed klass ptr" %}
+  ins_encode %{
+    __ set_narrow_klass($mem$$Address, (Klass*)$src$$constant);
+  %}
+  ins_pipe(ialu_mem_imm);
+%}
+
 // Store Integer Immediate
 instruct storeImmI0(memory mem, immI0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreI mem zero));
 
   ins_cost(125); // XXX
@@ -5832,7 +6028,7 @@
 // Store Long Immediate
 instruct storeImmL0(memory mem, immL0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreL mem zero));
 
   ins_cost(125); // XXX
@@ -5857,7 +6053,7 @@
 // Store Short/Char Immediate
 instruct storeImmC0(memory mem, immI0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreC mem zero));
 
   ins_cost(125); // XXX
@@ -5883,7 +6079,7 @@
 // Store Byte Immediate
 instruct storeImmB0(memory mem, immI0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreB mem zero));
 
   ins_cost(125); // XXX
@@ -5908,7 +6104,7 @@
 // Store CMS card-mark Immediate
 instruct storeImmCM0_reg(memory mem, immI0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreCM mem zero));
 
   ins_cost(125); // XXX
@@ -5946,7 +6142,7 @@
 // Store immediate Float value (it is faster than store from XMM register)
 instruct storeF0(memory mem, immF0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreF mem zero));
 
   ins_cost(25); // XXX
@@ -5996,7 +6192,7 @@
 
 instruct storeD0(memory mem, immD0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set mem (StoreD mem zero));
 
   ins_cost(25); // XXX
@@ -6482,6 +6678,32 @@
   ins_pipe(ialu_reg_long);
 %}
 
+instruct encodeKlass_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
+  match(Set dst (EncodePKlass src));
+  effect(KILL cr);
+  format %{ "encode_heap_oop_not_null $dst,$src" %}
+  ins_encode %{
+    __ encode_klass_not_null($dst$$Register, $src$$Register);
+  %}
+  ins_pipe(ialu_reg_long);
+%}
+
+instruct decodeKlass_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{
+  match(Set dst (DecodeNKlass src));
+  effect(KILL cr);
+  format %{ "decode_heap_oop_not_null $dst,$src" %}
+  ins_encode %{
+    Register s = $src$$Register;
+    Register d = $dst$$Register;
+    if (s != d) {
+      __ decode_klass_not_null(d, s);
+    } else {
+      __ decode_klass_not_null(d);
+    }
+  %}
+  ins_pipe(ialu_reg_long);
+%}
+
 
 //----------Conditional Move---------------------------------------------------
 // Jump
@@ -10452,7 +10674,7 @@
 
 instruct testP_mem_reg0(rFlagsReg cr, memory mem, immP0 zero)
 %{
-  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL));
+  predicate(UseCompressedOops && (Universe::narrow_oop_base() == NULL) && (Universe::narrow_klass_base() == NULL));
   match(Set cr (CmpP (LoadP mem) zero));
 
   format %{ "cmpq    R12, $mem\t# ptr (R12_heapbase==0)" %}
@@ -10503,6 +10725,27 @@
   ins_pipe(ialu_cr_reg_mem);
 %}
 
+instruct compN_rReg_imm_klass(rFlagsRegU cr, rRegN op1, immNKlass op2) %{
+  match(Set cr (CmpN op1 op2));
+
+  format %{ "cmpl    $op1, $op2\t# compressed klass ptr" %}
+  ins_encode %{
+    __ cmp_narrow_klass($op1$$Register, (Klass*)$op2$$constant);
+  %}
+  ins_pipe(ialu_cr_reg_imm);
+%}
+
+instruct compN_mem_imm_klass(rFlagsRegU cr, memory mem, immNKlass src)
+%{
+  match(Set cr (CmpN src (LoadNKlass mem)));
+
+  format %{ "cmpl    $mem, $src\t# compressed klass ptr" %}
+  ins_encode %{
+    __ cmp_narrow_klass($mem$$Address, (Klass*)$src$$constant);
+  %}
+  ins_pipe(ialu_cr_reg_mem);
+%}
+
 instruct testN_reg(rFlagsReg cr, rRegN src, immN0 zero) %{
   match(Set cr (CmpN src zero));
 
@@ -10526,7 +10769,7 @@
 
 instruct testN_mem_reg0(rFlagsReg cr, memory mem, immN0 zero)
 %{
-  predicate(Universe::narrow_oop_base() == NULL);
+  predicate(Universe::narrow_oop_base() == NULL && (Universe::narrow_klass_base() == NULL));
   match(Set cr (CmpN (LoadN mem) zero));
 
   format %{ "cmpl    R12, $mem\t# compressed ptr (R12_heapbase==0)" %}
--- a/hotspot/src/cpu/zero/vm/interpreterGenerator_zero.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/zero/vm/interpreterGenerator_zero.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2007 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
--- a/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2011 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
--- a/hotspot/src/os/bsd/dtrace/generateJvmOffsets.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/bsd/dtrace/generateJvmOffsets.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -267,8 +267,8 @@
 
   printf("\n");
 
-  GEN_OFFS(NarrowOopStruct, _base);
-  GEN_OFFS(NarrowOopStruct, _shift);
+  GEN_OFFS(NarrowPtrStruct, _base);
+  GEN_OFFS(NarrowPtrStruct, _shift);
   printf("\n");
 
   GEN_VALUE(SIZE_HeapBlockHeader, (int) sizeof(HeapBlock::Header));
--- a/hotspot/src/os/bsd/dtrace/jhelper.d	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/bsd/dtrace/jhelper.d	Wed Jul 05 18:26:11 2017 +0200
@@ -45,10 +45,6 @@
 
 extern pointer __1cJCodeCacheF_heap_;
 extern pointer __1cIUniverseO_collectedHeap_;
-extern pointer __1cIUniverseL_narrow_oop_;
-#ifdef _LP64
-extern pointer UseCompressedOops;
-#endif
 
 extern pointer __1cHnmethodG__vtbl_;
 extern pointer __1cNMethodG__vtbl_;
@@ -136,8 +132,8 @@
   copyin_offset(SIZE_oopDesc);
   copyin_offset(SIZE_ConstantPool);
 
-  copyin_offset(OFFSET_NarrowOopStruct_base);
-  copyin_offset(OFFSET_NarrowOopStruct_shift);
+  copyin_offset(OFFSET_NarrowPtrStruct_base);
+  copyin_offset(OFFSET_NarrowPtrStruct_shift);
 
   /*
    * The PC to translate is in arg0.
@@ -159,17 +155,6 @@
   this->CodeCache_heap_address = copyin_ptr(&``__1cJCodeCacheF_heap_);
 
   /* Reading volatile values */
-#ifdef _LP64
-  this->Use_Compressed_Oops  = copyin_uint8(&``UseCompressedOops);
-#else
-  this->Use_Compressed_Oops  = 0;
-#endif
-
-  this->Universe_narrow_oop_base  = copyin_ptr(&``__1cIUniverseL_narrow_oop_ +
-                                               OFFSET_NarrowOopStruct_base);
-  this->Universe_narrow_oop_shift = copyin_int32(&``__1cIUniverseL_narrow_oop_ +
-                                                 OFFSET_NarrowOopStruct_shift);
-
   this->CodeCache_low = copyin_ptr(this->CodeCache_heap_address + 
       OFFSET_CodeHeap_memory + OFFSET_VirtualSpace_low);
 
--- a/hotspot/src/os/bsd/vm/decoder_machO.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/bsd/vm/decoder_machO.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/os/bsd/vm/os_bsd.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/bsd/vm/os_bsd.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/os/linux/vm/decoder_linux.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/linux/vm/decoder_linux.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/os/linux/vm/os_linux.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/linux/vm/os_linux.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/os/linux/vm/vmError_linux.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/linux/vm/vmError_linux.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -44,7 +44,7 @@
     jio_snprintf(p, buflen - len,
                "\n\n"
                "Do you want to debug the problem?\n\n"
-               "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
+               "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " UINTX_FORMAT " (" INTPTR_FORMAT ")\n"
                "Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
                "Otherwise, press RETURN to abort...",
                os::current_process_id(), os::current_process_id(),
--- a/hotspot/src/os/posix/launcher/java_md.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/posix/launcher/java_md.c	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os/posix/launcher/launcher.script	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/posix/launcher/launcher.script	Wed Jul 05 18:26:11 2017 +0200
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2012, 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
--- a/hotspot/src/os/posix/vm/os_posix.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/posix/vm/os_posix.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os/posix/vm/os_posix.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/posix/vm/os_posix.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os/solaris/dtrace/generateJvmOffsets.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/dtrace/generateJvmOffsets.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -262,8 +262,8 @@
 
   printf("\n");
 
-  GEN_OFFS(NarrowOopStruct, _base);
-  GEN_OFFS(NarrowOopStruct, _shift);
+  GEN_OFFS(NarrowPtrStruct, _base);
+  GEN_OFFS(NarrowPtrStruct, _shift);
   printf("\n");
 
   GEN_VALUE(SIZE_HeapBlockHeader, sizeof(HeapBlock::Header));
--- a/hotspot/src/os/solaris/dtrace/hs_private.d	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/dtrace/hs_private.d	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/os/solaris/dtrace/jhelper.d	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/dtrace/jhelper.d	Wed Jul 05 18:26:11 2017 +0200
@@ -45,10 +45,6 @@
 
 extern pointer __1cJCodeCacheF_heap_;
 extern pointer __1cIUniverseO_collectedHeap_;
-extern pointer __1cIUniverseL_narrow_oop_;
-#ifdef _LP64
-extern pointer UseCompressedOops;
-#endif
 
 extern pointer __1cHnmethodG__vtbl_;
 extern pointer __1cGMethodG__vtbl_;
@@ -136,8 +132,8 @@
   copyin_offset(SIZE_oopDesc);
   copyin_offset(SIZE_ConstantPool);
 
-  copyin_offset(OFFSET_NarrowOopStruct_base);
-  copyin_offset(OFFSET_NarrowOopStruct_shift);
+  copyin_offset(OFFSET_NarrowPtrStruct_base);
+  copyin_offset(OFFSET_NarrowPtrStruct_shift);
 
   /*
    * The PC to translate is in arg0.
@@ -158,18 +154,6 @@
 
   this->CodeCache_heap_address = copyin_ptr(&``__1cJCodeCacheF_heap_);
 
-  /* Reading volatile values */
-#ifdef _LP64
-  this->Use_Compressed_Oops  = copyin_uint8(&``UseCompressedOops);
-#else
-  this->Use_Compressed_Oops  = 0;
-#endif
-
-  this->Universe_narrow_oop_base  = copyin_ptr(&``__1cIUniverseL_narrow_oop_ +
-                                               OFFSET_NarrowOopStruct_base);
-  this->Universe_narrow_oop_shift = copyin_int32(&``__1cIUniverseL_narrow_oop_ +
-                                                 OFFSET_NarrowOopStruct_shift);
-
   this->CodeCache_low = copyin_ptr(this->CodeCache_heap_address + 
       OFFSET_CodeHeap_memory + OFFSET_VirtualSpace_low);
 
--- a/hotspot/src/os/solaris/vm/attachListener_solaris.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/vm/attachListener_solaris.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/os/solaris/vm/decoder_solaris.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/vm/decoder_solaris.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -5870,15 +5870,6 @@
   }
 }
 
-// Just to get the Kernel build to link on solaris for testing.
-
-extern "C" {
-class ASGCT_CallTrace;
-void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext)
-  KERNEL_RETURN;
-}
-
-
 // ObjectMonitor park-unpark infrastructure ...
 //
 // We implement Solaris and Linux PlatformEvents with the
--- a/hotspot/src/os/solaris/vm/os_solaris.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/vm/os_solaris.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/os/solaris/vm/os_solaris.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/vm/os_solaris.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/os/windows/vm/decoder_windows.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/windows/vm/decoder_windows.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/os/windows/vm/decoder_windows.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/windows/vm/decoder_windows.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/os/windows/vm/jvm_windows.h	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/windows/vm/jvm_windows.h	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -61,8 +61,6 @@
 
 typedef int socklen_t;
 
-// #include "jni.h"
-
 #define JNI_ONLOAD_SYMBOLS      {"_JNI_OnLoad@8", "JNI_OnLoad"}
 #define JNI_ONUNLOAD_SYMBOLS    {"_JNI_OnUnload@8", "JNI_OnUnload"}
 #define JVM_ONLOAD_SYMBOLS      {"_JVM_OnLoad@12", "JVM_OnLoad"}
@@ -108,10 +106,7 @@
  * File I/O
  */
 
-// #include <sys/types.h>
-// #include <sys/stat.h>
-// #include <fcntl.h>
-// #include <errno.h>
+#include <sys/stat.h>
 
 /* O Flags */
 
--- a/hotspot/src/os/windows/vm/os_windows.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/windows/vm/os_windows.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
--- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, 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
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2003, 2012, 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
--- a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2004, 2012, 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
--- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/share/tools/ProjectCreator/ProjectCreator.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/tools/ProjectCreator/ProjectCreator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/tools/ProjectCreator/Util.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/tools/ProjectCreator/Util.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/tools/ProjectCreator/WinGammaPlatform.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/tools/ProjectCreator/WinGammaPlatform.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/tools/ProjectCreator/WinGammaPlatformVC7.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/tools/ProjectCreator/WinGammaPlatformVC7.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/adlc/adlparse.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/adlparse.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1392,7 +1392,7 @@
       _AD.addForm(machnode);
     }
     else if (!strcmp(ident, "attributes")) {
-      bool vsi_seen = false, bhds_seen = false;
+      bool vsi_seen = false;
 
       skipws();
       if ( (_curchar != '%')
@@ -1436,7 +1436,6 @@
           }
 
           pipeline->_branchHasDelaySlot = true;
-          bhds_seen = true;
           continue;
         }
 
@@ -1639,6 +1638,12 @@
     next_char();                   // Skip "(" or ","
     ident = get_ident();           // Grab next identifier
 
+    if (_AD._adl_debug > 1) {
+      if (ident != NULL) {
+        fprintf(stderr, "resource_parse: identifier: %s\n", ident);
+      }
+    }
+
     if (ident == NULL) {
       parse_err(SYNERR, "keyword identifier expected at \"%c\"\n", _curchar);
       return;
@@ -2427,7 +2432,6 @@
   int        lparen = 0;          // keep track of parenthesis nesting depth
   int        rparen = 0;          // position of instruction at this depth
   InstructForm *inst_seen  = NULL;
-  InstructForm *child_seen = NULL;
 
   // Walk the match tree,
   // Record <parent, position, instruction name, input position>
@@ -2437,7 +2441,7 @@
     if (_curchar == '(') {
       ++lparen;
       next_char();
-      child_seen = peep_match_child_parse(match, parent, position, rparen);
+      ( void ) peep_match_child_parse(match, parent, position, rparen);
     }
     // Right paren signals end of an input, may be more
     else if (_curchar == ')') {
@@ -3154,6 +3158,9 @@
 
 
 //------------------------------size_parse-----------------------------------
+// Parse a 'size(<expr>)' attribute which specifies the size of the
+// emitted instructions in bytes. <expr> can be a C++ expression,
+// e.g. a constant.
 char* ADLParser::size_parse(InstructForm *instr) {
   char* sizeOfInstr = NULL;
 
@@ -4274,7 +4281,17 @@
             || ((c >= '0') && (c <= '9'))
             || ((c == '_')) || ((c == ':')) || ((c == '#')) );
   if (start == end) {             // We popped out on the first try
-    parse_err(SYNERR, "identifier expected at %c\n", c);
+    // It can occur that `start' contains the rest of the input file.
+    // In this case the output should be truncated.
+    if (strlen(start) > 24) {
+      char buf[32];
+      strncpy(buf, start, 20);
+      buf[20] = '\0';
+      strcat(buf, "[...]");
+      parse_err(SYNERR, "Identifier expected, but found '%s'.", buf);
+    } else {
+      parse_err(SYNERR, "Identifier expected, but found '%s'.", start);
+    }
     start = NULL;
   }
   else {
--- a/hotspot/src/share/vm/adlc/archDesc.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/archDesc.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -221,6 +221,7 @@
       _register = NULL;
       _encode = NULL;
       _pipeline = NULL;
+      _frame = NULL;
 }
 
 ArchDesc::~ArchDesc() {
@@ -648,7 +649,10 @@
 // Return the textual binding for a given CPP flag name.
 // Return NULL if there is no binding, or it has been #undef-ed.
 char* ArchDesc::get_preproc_def(const char* flag) {
-  SourceForm* deff = (SourceForm*) _preproc_table[flag];
+  // In case of syntax errors, flag may take the value NULL.
+  SourceForm* deff = NULL;
+  if (flag != NULL)
+    deff = (SourceForm*) _preproc_table[flag];
   return (deff == NULL) ? NULL : deff->_code;
 }
 
@@ -803,7 +807,9 @@
     while (i++ <= 15)  fputc(' ', errfile);
     fprintf(errfile, "%-8s:", pref);
     vfprintf(errfile, fmt, args);
-    fprintf(errfile, "\n"); }
+    fprintf(errfile, "\n");
+    fflush(errfile);
+  }
   return 1;
 }
 
@@ -855,8 +861,14 @@
 
   // Check constraints on result's register class
   const char *result_class = opForm.constrained_reg_class();
-  if (!result_class) opForm.dump();
-  assert( result_class, "Resulting register class was not defined for operand");
+  if (result_class == NULL) {
+    opForm.dump();
+    syntax_err(opForm._linenum,
+               "Use of an undefined result class for operand: %s",
+               opForm._ident);
+    abort();
+  }
+
   regMask = reg_class_to_reg_mask( result_class );
 
   return regMask;
@@ -865,8 +877,14 @@
 // Obtain the name of the RegMask for an InstructForm
 const char *ArchDesc::reg_mask(InstructForm &inForm) {
   const char *result = inForm.reduce_result();
-  assert( result,
-          "Did not find result operand or RegMask for this instruction");
+
+  if (result == NULL) {
+    syntax_err(inForm._linenum,
+               "Did not find result operand or RegMask"
+               " for this instruction: %s",
+               inForm._ident);
+    abort();
+  }
 
   // Instructions producing 'Universe' use RegMask::Empty
   if( strcmp(result,"Universe")==0 ) {
@@ -875,10 +893,17 @@
 
   // Lookup this result operand and get its register class
   Form *form = (Form*)_globalNames[result];
-  assert( form, "Result operand must be defined");
+  if (form == NULL) {
+    syntax_err(inForm._linenum,
+               "Did not find result operand for result: %s", result);
+    abort();
+  }
   OperandForm *oper = form->is_operand();
-  if (oper == NULL) form->dump();
-  assert( oper, "Result must be an OperandForm");
+  if (oper == NULL) {
+    syntax_err(inForm._linenum, "Form is not an OperandForm:");
+    form->dump();
+    abort();
+  }
   return reg_mask( *oper );
 }
 
@@ -887,7 +912,13 @@
 char *ArchDesc::stack_or_reg_mask(OperandForm  &opForm) {
   // name of cisc_spillable version
   const char *reg_mask_name = reg_mask(opForm);
-  assert( reg_mask_name != NULL, "called with incorrect opForm");
+
+  if (reg_mask_name == NULL) {
+     syntax_err(opForm._linenum,
+                "Did not find reg_mask for opForm: %s",
+                opForm._ident);
+     abort();
+  }
 
   const char *stack_or = "STACK_OR_";
   int   length         = (int)strlen(stack_or) + (int)strlen(reg_mask_name) + 1;
@@ -968,7 +999,8 @@
   // Create InstructForm and assign type for each ideal instruction.
   for ( int j = _last_machine_leaf+1; j < _last_opcode; ++j) {
     char         *ident    = (char *)NodeClassNames[j];
-    if(!strcmp(ident, "ConI") || !strcmp(ident, "ConP") || !strcmp(ident, "ConN") ||
+    if(!strcmp(ident, "ConI") || !strcmp(ident, "ConP") ||
+       !strcmp(ident, "ConN") || !strcmp(ident, "ConNKlass") ||
        !strcmp(ident, "ConF") || !strcmp(ident, "ConD") ||
        !strcmp(ident, "ConL") || !strcmp(ident, "Con" ) ||
        !strcmp(ident, "Bool") ) {
--- a/hotspot/src/share/vm/adlc/archDesc.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/archDesc.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -365,13 +365,14 @@
 // A derived class defines the appropriate output for a specific mapping.
 class OutputMap {
 protected:
-  FILE     *_hpp;
-  FILE     *_cpp;
-  FormDict &_globals;
-  ArchDesc &_AD;
+  FILE       *_hpp;
+  FILE       *_cpp;
+  FormDict   &_globals;
+  ArchDesc   &_AD;
+  const char *_name;
 public:
-  OutputMap (FILE *decl_file, FILE *def_file, FormDict &globals, ArchDesc &AD)
-    : _hpp(decl_file), _cpp(def_file), _globals(globals), _AD(AD) {};
+  OutputMap (FILE *decl_file, FILE *def_file, FormDict &globals, ArchDesc &AD, const char *name)
+    : _hpp(decl_file), _cpp(def_file), _globals(globals), _AD(AD), _name(name) {};
   // Access files used by this routine
   FILE        *decl_file() { return _hpp; }
   FILE        *def_file()  { return _cpp; }
--- a/hotspot/src/share/vm/adlc/dict2.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/dict2.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -33,7 +33,7 @@
 // String hash tables
 #define MAXID 20
 static char initflag = 0;       // True after 1st initialization
-static char shft[MAXID] = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6};
+static char shft[MAXID + 1] = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7};
 static short xsum[MAXID];
 
 //------------------------------bucket---------------------------------------
--- a/hotspot/src/share/vm/adlc/filebuff.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/filebuff.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -31,10 +31,14 @@
 using namespace std;
 
 // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES
-typedef struct {
+
+class BufferedFile {
+ public:
   const char *_name;
   FILE *_fp;
-} BufferedFile;
+  inline BufferedFile() { _name = NULL; _fp = NULL; };
+  inline ~BufferedFile() {};
+};
 
 class ArchDesc;
 
--- a/hotspot/src/share/vm/adlc/forms.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/forms.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -215,6 +215,7 @@
   if (strcmp(name,"ConI")==0) return Form::idealI;
   if (strcmp(name,"ConP")==0) return Form::idealP;
   if (strcmp(name,"ConN")==0) return Form::idealN;
+  if (strcmp(name,"ConNKlass")==0) return Form::idealNKlass;
   if (strcmp(name,"ConL")==0) return Form::idealL;
   if (strcmp(name,"ConF")==0) return Form::idealF;
   if (strcmp(name,"ConD")==0) return Form::idealD;
@@ -255,9 +256,8 @@
   if( strcmp(opType,"LoadD_unaligned")==0 )  return Form::idealD;
   if( strcmp(opType,"LoadF")==0 )  return Form::idealF;
   if( strcmp(opType,"LoadI")==0 )  return Form::idealI;
-  if( strcmp(opType,"LoadUI2L")==0 )  return Form::idealI;
   if( strcmp(opType,"LoadKlass")==0 )  return Form::idealP;
-  if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealN;
+  if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealNKlass;
   if( strcmp(opType,"LoadL")==0 )  return Form::idealL;
   if( strcmp(opType,"LoadL_unaligned")==0 )  return Form::idealL;
   if( strcmp(opType,"LoadPLocked")==0 )  return Form::idealP;
@@ -280,6 +280,7 @@
   if( strcmp(opType,"StoreL")==0)  return Form::idealL;
   if( strcmp(opType,"StoreP")==0)  return Form::idealP;
   if( strcmp(opType,"StoreN")==0)  return Form::idealN;
+  if( strcmp(opType,"StoreNKlass")==0)  return Form::idealNKlass;
   if( strcmp(opType,"StoreVector")==0 )  return Form::idealV;
   assert( strcmp(opType,"Store") != 0, "Must type Stores" );
   return Form::none;
--- a/hotspot/src/share/vm/adlc/forms.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/forms.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -173,7 +173,8 @@
     idealC      =  7,  // Char    type
     idealS      =  8,  // String  type
     idealN      =  9,  // Narrow oop types
-    idealV      = 10   // Vector  type
+    idealNKlass = 10,  // Narrow klass types
+    idealV      = 11   // Vector  type
   };
   // Convert ideal name to a DataType, return DataType::none if not a 'ConX'
   Form::DataType  ideal_to_const_type(const char *ideal_type_name) const;
@@ -448,11 +449,11 @@
   // Return number of USEs + number of DEFs
   int        num_operands();
   // Return zero-based position in list;  -1 if not in list.
-  int        operand_position(const char *name, int usedef);
+  int        operand_position(const char *name, int usedef, Form *fm);
   // Find position for this name, regardless of use/def information
   int        operand_position(const char *name);
   // Find position for this name when looked up for output via "format"
-  int        operand_position_format(const char *name);
+  int        operand_position_format(const char *name, Form *fm);
   // Find position for the Label when looked up for output via "format"
   int        label_position();
   // Find position for the Method when looked up for output via "format"
--- a/hotspot/src/share/vm/adlc/formssel.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/formssel.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -567,7 +567,7 @@
         if( strcmp(rc_name,"stack_slots") ) {
           // Check for ideal_type of RegFlags
           const char *type = opform->ideal_type( globals, registers );
-          if( !strcmp(type,"RegFlags") )
+          if( (type != NULL) && !strcmp(type, "RegFlags") )
             rematerialize = true;
         } else
           rematerialize = false; // Do not rematerialize things target stk
@@ -746,14 +746,16 @@
 // Expected use is for pointer vs oop determination for LoadP
 bool InstructForm::captures_bottom_type(FormDict &globals) const {
   if( _matrule && _matrule->_rChild &&
-       (!strcmp(_matrule->_rChild->_opType,"CastPP")     ||  // new result type
-        !strcmp(_matrule->_rChild->_opType,"CastX2P")    ||  // new result type
-        !strcmp(_matrule->_rChild->_opType,"DecodeN")    ||
-        !strcmp(_matrule->_rChild->_opType,"EncodeP")    ||
-        !strcmp(_matrule->_rChild->_opType,"LoadN")      ||
-        !strcmp(_matrule->_rChild->_opType,"GetAndSetN") ||
-        !strcmp(_matrule->_rChild->_opType,"LoadNKlass") ||
-        !strcmp(_matrule->_rChild->_opType,"CreateEx")   ||  // type of exception
+       (!strcmp(_matrule->_rChild->_opType,"CastPP")       ||  // new result type
+        !strcmp(_matrule->_rChild->_opType,"CastX2P")      ||  // new result type
+        !strcmp(_matrule->_rChild->_opType,"DecodeN")      ||
+        !strcmp(_matrule->_rChild->_opType,"EncodeP")      ||
+        !strcmp(_matrule->_rChild->_opType,"DecodeNKlass") ||
+        !strcmp(_matrule->_rChild->_opType,"EncodePKlass") ||
+        !strcmp(_matrule->_rChild->_opType,"LoadN")        ||
+        !strcmp(_matrule->_rChild->_opType,"GetAndSetN")   ||
+        !strcmp(_matrule->_rChild->_opType,"LoadNKlass")   ||
+        !strcmp(_matrule->_rChild->_opType,"CreateEx")     ||  // type of exception
         !strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true;
   else if ( is_ideal_load() == Form::idealP )                return true;
   else if ( is_ideal_store() != Form::none  )                return true;
@@ -793,6 +795,20 @@
   return num_opnds;
 }
 
+const char *InstructForm::opnd_ident(int idx) {
+  return _components.at(idx)->_name;
+}
+
+const char *InstructForm::unique_opnd_ident(int idx) {
+  uint i;
+  for (i = 1; i < num_opnds(); ++i) {
+    if (unique_opnds_idx(i) == idx) {
+      break;
+    }
+  }
+  return (_components.at(i) != NULL) ? _components.at(i)->_name : "";
+}
+
 // Return count of unmatched operands.
 uint InstructForm::num_post_match_opnds() {
   uint  num_post_match_opnds = _components.count();
@@ -864,6 +880,9 @@
   return base;
 }
 
+// This function determines the order of the MachOper in _opnds[]
+// by writing the operand names into the _components list.
+//
 // Implementation does not modify state of internal structures
 void InstructForm::build_components() {
   // Add top-level operands to the components
@@ -959,11 +978,11 @@
 
 // Return zero-based position in component list;  -1 if not in list.
 int   InstructForm::operand_position(const char *name, int usedef) {
-  return unique_opnds_idx(_components.operand_position(name, usedef));
+  return unique_opnds_idx(_components.operand_position(name, usedef, this));
 }
 
 int   InstructForm::operand_position_format(const char *name) {
-  return unique_opnds_idx(_components.operand_position_format(name));
+  return unique_opnds_idx(_components.operand_position_format(name, this));
 }
 
 // Return zero-based position in component list; -1 if not in list.
@@ -1223,7 +1242,7 @@
     if (different) {
       globalAD->syntax_err(short_branch->_linenum, "Instruction %s and its short form %s have different parameters\n", _ident, short_branch->_ident);
     }
-    if (AD._short_branch_debug) {
+    if (AD._adl_debug > 1 || AD._short_branch_debug) {
       fprintf(stderr, "Instruction %s has short form %s\n", _ident, short_branch->_ident);
     }
     _short_branch_form = short_branch;
@@ -1255,16 +1274,19 @@
   // Find replacement variable's type
   const Form *form   = _localNames[rep_var];
   if (form == NULL) {
-    fprintf(stderr, "unknown replacement variable in format statement: '%s'\n", rep_var);
-    assert(false, "ShouldNotReachHere()");
+    globalAD->syntax_err(_linenum, "Unknown replacement variable %s in format statement of %s.",
+                         rep_var, _ident);
+    return;
   }
   OpClassForm *opc   = form->is_opclass();
   assert( opc, "replacement variable was not found in local names");
   // Lookup the index position of the replacement variable
   int idx  = operand_position_format(rep_var);
   if ( idx == -1 ) {
-    assert( strcmp(opc->_ident,"label")==0, "Unimplemented");
-    assert( false, "ShouldNotReachHere()");
+    globalAD->syntax_err(_linenum, "Could not find replacement variable %s in format statement of %s.\n",
+                         rep_var, _ident);
+    assert(strcmp(opc->_ident, "label") == 0, "Unimplemented");
+    return;
   }
 
   if (is_noninput_operand(idx)) {
@@ -1273,7 +1295,7 @@
     OperandForm* oper = form->is_operand();
     if (oper != NULL && oper->is_bound_register()) {
       const RegDef* first = oper->get_RegClass()->find_first_elem();
-      fprintf(fp, "    tty->print(\"%s\");\n", first->_regname);
+      fprintf(fp, "    st->print(\"%s\");\n", first->_regname);
     } else {
       globalAD->syntax_err(_linenum, "In %s can't find format for %s %s", _ident, opc->_ident, rep_var);
     }
@@ -1371,26 +1393,28 @@
   // idx0=0 is used to indicate that info comes from this same node, not from input edge.
   // idx1 starts at oper_input_base()
   if ( cur_num_opnds >= 1 ) {
-    fprintf(fp,"    // Start at oper_input_base() and count operands\n");
-    fprintf(fp,"    unsigned %sidx0 = %d;\n", prefix, oper_input_base(globals));
-    fprintf(fp,"    unsigned %sidx1 = %d;\n", prefix, oper_input_base(globals));
+    fprintf(fp,"  // Start at oper_input_base() and count operands\n");
+    fprintf(fp,"  unsigned %sidx0 = %d;\n", prefix, oper_input_base(globals));
+    fprintf(fp,"  unsigned %sidx1 = %d;", prefix, oper_input_base(globals));
+    fprintf(fp," \t// %s\n", unique_opnd_ident(1));
 
     // Generate starting points for other unique operands if they exist
     for ( idx = 2; idx < num_unique_opnds(); ++idx ) {
       if( *receiver == 0 ) {
-        fprintf(fp,"    unsigned %sidx%d = %sidx%d + opnd_array(%d)->num_edges();\n",
+        fprintf(fp,"  unsigned %sidx%d = %sidx%d + opnd_array(%d)->num_edges();",
                 prefix, idx, prefix, idx-1, idx-1 );
       } else {
-        fprintf(fp,"    unsigned %sidx%d = %sidx%d + %s_opnds[%d]->num_edges();\n",
+        fprintf(fp,"  unsigned %sidx%d = %sidx%d + %s_opnds[%d]->num_edges();",
                 prefix, idx, prefix, idx-1, receiver, idx-1 );
       }
+      fprintf(fp," \t// %s\n", unique_opnd_ident(idx));
     }
   }
   if( *receiver != 0 ) {
     // This value is used by generate_peepreplace when copying a node.
     // Don't emit it in other cases since it can hide bugs with the
     // use invalid idx's.
-    fprintf(fp,"    unsigned %sidx%d = %sreq(); \n", prefix, idx, receiver);
+    fprintf(fp,"  unsigned %sidx%d = %sreq(); \n", prefix, idx, receiver);
   }
 
 }
@@ -1774,9 +1798,25 @@
   return Component::INVALID;
 }
 
+const char *Component::getUsedefName() {
+  switch (_usedef) {
+    case Component::INVALID:  return "INVALID";  break;
+    case Component::USE:      return "USE";      break;
+    case Component::USE_DEF:  return "USE_DEF";  break;
+    case Component::USE_KILL: return "USE_KILL"; break;
+    case Component::KILL:     return "KILL";     break;
+    case Component::TEMP:     return "TEMP";     break;
+    case Component::DEF:      return "DEF";      break;
+    case Component::CALL:     return "CALL";     break;
+    default: assert(false, "unknown effect");
+  }
+  return "Undefined Use/Def info";
+}
+
 Effect::Effect(const char *name) : _name(name), _use_def(effect_lookup(name)) {
   _ftype = Form::EFF;
 }
+
 Effect::~Effect() {
 }
 
@@ -2273,7 +2313,7 @@
 }
 
 int OperandForm::operand_position(const char *name, int usedef) {
-  return _components.operand_position(name, usedef);
+  return _components.operand_position(name, usedef, this);
 }
 
 
@@ -2399,20 +2439,20 @@
   if (_matrule && (_matrule->is_base_register(globals) ||
                    strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
     // !!!!! !!!!!
-    fprintf(fp,    "{ char reg_str[128];\n");
-    fprintf(fp,"      ra->dump_register(node,reg_str);\n");
-    fprintf(fp,"      tty->print(\"%cs\",reg_str);\n",'%');
-    fprintf(fp,"    }\n");
+    fprintf(fp,"  { char reg_str[128];\n");
+    fprintf(fp,"    ra->dump_register(node,reg_str);\n");
+    fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
+    fprintf(fp,"  }\n");
   } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
     format_constant( fp, index, dtype );
   } else if (ideal_to_sReg_type(_ident) != Form::none) {
     // Special format for Stack Slot Register
-    fprintf(fp,    "{ char reg_str[128];\n");
-    fprintf(fp,"      ra->dump_register(node,reg_str);\n");
-    fprintf(fp,"      tty->print(\"%cs\",reg_str);\n",'%');
-    fprintf(fp,"    }\n");
+    fprintf(fp,"  { char reg_str[128];\n");
+    fprintf(fp,"    ra->dump_register(node,reg_str);\n");
+    fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
+    fprintf(fp,"  }\n");
   } else {
-    fprintf(fp,"tty->print(\"No format defined for %s\n\");\n", _ident);
+    fprintf(fp,"  st->print(\"No format defined for %s\n\");\n", _ident);
     fflush(fp);
     fprintf(stderr,"No format defined for %s\n", _ident);
     dump();
@@ -2426,36 +2466,37 @@
   Form::DataType dtype;
   if (_matrule && (_matrule->is_base_register(globals) ||
                    strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
-    fprintf(fp,    "{ char reg_str[128];\n");
-    fprintf(fp,"      ra->dump_register(node->in(idx");
-    if ( index != 0 ) fprintf(fp,                  "+%d",index);
-    fprintf(fp,                                       "),reg_str);\n");
-    fprintf(fp,"      tty->print(\"%cs\",reg_str);\n",'%');
-    fprintf(fp,"    }\n");
+    fprintf(fp,"  { char reg_str[128];\n");
+    fprintf(fp,"    ra->dump_register(node->in(idx");
+    if ( index != 0 ) fprintf(fp,              "+%d",index);
+    fprintf(fp,                                      "),reg_str);\n");
+    fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
+    fprintf(fp,"  }\n");
   } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
     format_constant( fp, index, dtype );
   } else if (ideal_to_sReg_type(_ident) != Form::none) {
     // Special format for Stack Slot Register
-    fprintf(fp,    "{ char reg_str[128];\n");
-    fprintf(fp,"      ra->dump_register(node->in(idx");
+    fprintf(fp,"  { char reg_str[128];\n");
+    fprintf(fp,"    ra->dump_register(node->in(idx");
     if ( index != 0 ) fprintf(fp,                  "+%d",index);
     fprintf(fp,                                       "),reg_str);\n");
-    fprintf(fp,"      tty->print(\"%cs\",reg_str);\n",'%');
-    fprintf(fp,"    }\n");
+    fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
+    fprintf(fp,"  }\n");
   } else {
-    fprintf(fp,"tty->print(\"No format defined for %s\n\");\n", _ident);
+    fprintf(fp,"  st->print(\"No format defined for %s\n\");\n", _ident);
     assert( false,"Internal error:\n  output_external_operand() attempting to output other than a Register or Constant");
   }
 }
 
 void OperandForm::format_constant(FILE *fp, uint const_index, uint const_type) {
   switch(const_type) {
-  case Form::idealI:  fprintf(fp,"st->print(\"#%%d\", _c%d);\n", const_index); break;
-  case Form::idealP:  fprintf(fp,"_c%d->dump_on(st);\n",         const_index); break;
-  case Form::idealN:  fprintf(fp,"_c%d->dump_on(st);\n",         const_index); break;
-  case Form::idealL:  fprintf(fp,"st->print(\"#%%lld\", _c%d);\n", const_index); break;
-  case Form::idealF:  fprintf(fp,"st->print(\"#%%f\", _c%d);\n", const_index); break;
-  case Form::idealD:  fprintf(fp,"st->print(\"#%%f\", _c%d);\n", const_index); break;
+  case Form::idealI: fprintf(fp,"  st->print(\"#%%d\", _c%d);\n", const_index); break;
+  case Form::idealP: fprintf(fp,"  if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break;
+  case Form::idealNKlass:
+  case Form::idealN: fprintf(fp,"  if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break;
+  case Form::idealL: fprintf(fp,"  st->print(\"#%%lld\", _c%d);\n", const_index); break;
+  case Form::idealF: fprintf(fp,"  st->print(\"#%%f\", _c%d);\n", const_index); break;
+  case Form::idealD: fprintf(fp,"  st->print(\"#%%f\", _c%d);\n", const_index); break;
   default:
     assert( false, "ShouldNotReachHere()");
   }
@@ -2825,17 +2866,8 @@
   fprintf(fp,"Component:");  // Write to output files
   fprintf(fp, "  name = %s", _name);
   fprintf(fp, ", type = %s", _type);
-  const char * usedef = "Undefined Use/Def info";
-  switch (_usedef) {
-    case USE:      usedef = "USE";      break;
-    case USE_DEF:  usedef = "USE_DEF";  break;
-    case USE_KILL: usedef = "USE_KILL"; break;
-    case KILL:     usedef = "KILL";     break;
-    case TEMP:     usedef = "TEMP";     break;
-    case DEF:      usedef = "DEF";      break;
-    default: assert(false, "unknown effect");
-  }
-  fprintf(fp, ", use/def = %s\n", usedef);
+  assert(_usedef != 0, "unknown effect");
+  fprintf(fp, ", use/def = %s\n", getUsedefName());
 }
 
 
@@ -2927,9 +2959,9 @@
   return count;
 }
 
-// Return zero-based position in list;  -1 if not in list.
+// Return zero-based position of operand 'name' in list;  -1 if not in list.
 // if parameter 'usedef' is ::USE, it will match USE, USE_DEF, ...
-int ComponentList::operand_position(const char *name, int usedef) {
+int ComponentList::operand_position(const char *name, int usedef, Form *fm) {
   PreserveIter pi(this);
   int position = 0;
   int num_opnds = num_operands();
@@ -2952,10 +2984,18 @@
         return position+1;
       } else {
         if( preceding_non_use && strcmp(component->_name, preceding_non_use->_name) ) {
-          fprintf(stderr, "the name '%s' should not precede the name '%s'\n", preceding_non_use->_name, name);
+          fprintf(stderr, "the name '%s(%s)' should not precede the name '%s(%s)'",
+                  preceding_non_use->_name, preceding_non_use->getUsedefName(),
+                  name, component->getUsedefName());
+          if (fm && fm->is_instruction()) fprintf(stderr,  "in form '%s'", fm->is_instruction()->_ident);
+          if (fm && fm->is_operand()) fprintf(stderr,  "in form '%s'", fm->is_operand()->_ident);
+          fprintf(stderr,  "\n");
         }
         if( position >= num_opnds ) {
-          fprintf(stderr, "the name '%s' is too late in its name list\n", name);
+          fprintf(stderr, "the name '%s' is too late in its name list", name);
+          if (fm && fm->is_instruction()) fprintf(stderr,  "in form '%s'", fm->is_instruction()->_ident);
+          if (fm && fm->is_operand()) fprintf(stderr,  "in form '%s'", fm->is_operand()->_ident);
+          fprintf(stderr,  "\n");
         }
         assert(position < num_opnds, "advertised index in bounds");
         return position;
@@ -3001,10 +3041,10 @@
   return Not_in_list;
 }
 
-int ComponentList::operand_position_format(const char *name) {
+int ComponentList::operand_position_format(const char *name, Form *fm) {
   PreserveIter pi(this);
   int  first_position = operand_position(name);
-  int  use_position   = operand_position(name, Component::USE);
+  int  use_position   = operand_position(name, Component::USE, fm);
 
   return ((first_position < use_position) ? use_position : first_position);
 }
@@ -3267,8 +3307,8 @@
 
   // If we are a "Set", start from the right child.
   const MatchNode *const mnode = sets_result() ?
-    (const MatchNode *const)this->_rChild :
-    (const MatchNode *const)this;
+    (const MatchNode *)this->_rChild :
+    (const MatchNode *)this;
 
   // If our right child exists, it is the right reduction
   if ( mnode->_rChild ) {
@@ -3285,8 +3325,8 @@
 
   // If we are a "Set", start from the right child.
   const MatchNode *const mnode = sets_result() ?
-    (const MatchNode *const)this->_rChild :
-    (const MatchNode *const)this;
+    (const MatchNode *)this->_rChild :
+    (const MatchNode *)this;
 
   // If our left child exists, it is the left reduction
   if ( mnode->_lChild ) {
@@ -3390,9 +3430,9 @@
 
 int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
   static const char *needs_ideal_memory_list[] = {
-    "StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" ,
+    "StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" ,
     "StoreB","StoreC","Store" ,"StoreFP",
-    "LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF"  ,
+    "LoadI", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF"  ,
     "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
     "StoreVector", "LoadVector",
     "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
@@ -3947,6 +3987,8 @@
         strcmp(opType,"ConvL2I")==0 ||
         strcmp(opType,"DecodeN")==0 ||
         strcmp(opType,"EncodeP")==0 ||
+        strcmp(opType,"EncodePKlass")==0 ||
+        strcmp(opType,"DecodeNKlass")==0 ||
         strcmp(opType,"RoundDouble")==0 ||
         strcmp(opType,"RoundFloat")==0 ||
         strcmp(opType,"ReverseBytesI")==0 ||
@@ -4108,12 +4150,17 @@
   output(stderr);
 }
 
-void MatchRule::output(FILE *fp) {
+// Write just one line.
+void MatchRule::output_short(FILE *fp) {
   fprintf(fp,"MatchRule: ( %s",_name);
   if (_lChild) _lChild->output(fp);
   if (_rChild) _rChild->output(fp);
-  fprintf(fp," )\n");
-  fprintf(fp,"   nesting depth = %d\n", _depth);
+  fprintf(fp," )");
+}
+
+void MatchRule::output(FILE *fp) {
+  output_short(fp);
+  fprintf(fp,"\n   nesting depth = %d\n", _depth);
   if (_result) fprintf(fp,"   Result Type = %s", _result);
   fprintf(fp,"\n");
 }
--- a/hotspot/src/share/vm/adlc/formssel.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/formssel.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -76,7 +76,7 @@
 private:
   bool           _ideal_only;       // Not a user-defined instruction
   // Members used for tracking CISC-spilling
-  uint           _cisc_spill_operand;// Which operand may cisc-spill
+  int            _cisc_spill_operand;// Which operand may cisc-spill
   void           set_cisc_spill_operand(uint op_index) { _cisc_spill_operand = op_index; }
   bool           _is_cisc_alternate;
   InstructForm  *_cisc_spill_alternate;// cisc possible replacement
@@ -103,7 +103,7 @@
   RewriteRule   *_rewrule;         // Rewrite rule for this instruction
   FormatRule    *_format;          // Format for assembly generation
   Peephole      *_peephole;        // List of peephole rules for instruction
-  const char    *_ins_pipe;        // Instruction Scheduline description class
+  const char    *_ins_pipe;        // Instruction Scheduling description class
 
   uint          *_uniq_idx;        // Indexes of unique operands
   int            _uniq_idx_length; // Length of _uniq_idx array
@@ -198,6 +198,7 @@
 
   virtual const char *cost();      // Access ins_cost attribute
   virtual uint        num_opnds(); // Count of num_opnds for MachNode class
+                                   // Counts USE_DEF opnds twice.  See also num_unique_opnds().
   virtual uint        num_post_match_opnds();
   virtual uint        num_consts(FormDict &globals) const;// Constants in match rule
   // Constants in match rule with specified type
@@ -228,6 +229,7 @@
   // Return number of relocation entries needed for this instruction.
   virtual uint        reloc(FormDict &globals);
 
+  const char         *opnd_ident(int idx);  // Name of operand #idx.
   const char         *reduce_result();
   // Return the name of the operand on the right hand side of the binary match
   // Return NULL if there is no right hand side
@@ -240,7 +242,7 @@
   // Check if this instruction can cisc-spill to 'alternate'
   bool                cisc_spills_to(ArchDesc &AD, InstructForm *alternate);
   InstructForm       *cisc_spill_alternate() { return _cisc_spill_alternate; }
-  uint                cisc_spill_operand() const { return _cisc_spill_operand; }
+  int                 cisc_spill_operand() const { return _cisc_spill_operand; }
   bool                is_cisc_alternate() const { return _is_cisc_alternate; }
   void                set_cisc_alternate(bool val) { _is_cisc_alternate = val; }
   const char         *cisc_reg_mask_name() const { return _cisc_reg_mask_name; }
@@ -277,6 +279,7 @@
                           return idx;
                         }
   }
+  const char         *unique_opnd_ident(int idx);  // Name of operand at unique idx.
 
   // Operands which are only KILLs aren't part of the input array and
   // require special handling in some cases.  Their position in this
@@ -889,6 +892,7 @@
 
   void dump();                     // Debug printer
   void output(FILE *fp);           // Write to output files
+  const char* getUsedefName();
 
 public:
   // Implementation depends upon working bit intersection and union.
@@ -1030,6 +1034,7 @@
   void       matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt);
 
   void dump();
+  void output_short(FILE *fp);
   void output(FILE *fp);
 };
 
--- a/hotspot/src/share/vm/adlc/main.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/main.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -341,14 +341,20 @@
 static void usage(ArchDesc& AD)
 {
   printf("Architecture Description Language Compiler\n\n");
-  printf("Usage: adl [-doqw] [-Dflag[=def]] [-Uflag] [-cFILENAME] [-hFILENAME] [-aDFAFILE] ADLFILE\n");
+  printf("Usage: adlc [-doqwTs] [-#]* [-D<FLAG>[=<DEF>]] [-U<FLAG>] [-c<CPP_FILE_NAME>] [-h<HPP_FILE_NAME>] [-a<DFA_FILE_NAME>] [-v<GLOBALS_FILE_NAME>] <ADL_FILE_NAME>\n");
   printf(" d  produce DFA debugging info\n");
   printf(" o  no output produced, syntax and semantic checking only\n");
   printf(" q  quiet mode, supresses all non-essential messages\n");
   printf(" w  suppress warning messages\n");
+  printf(" T  make DFA as many subroutine calls\n");
+  printf(" s  output which instructions are cisc-spillable\n");
+  printf(" D  define preprocessor symbol\n");
+  printf(" U  undefine preprocessor symbol\n");
   printf(" c  specify CPP file name (default: %s)\n", AD._CPP_file._name);
   printf(" h  specify HPP file name (default: %s)\n", AD._HPP_file._name);
   printf(" a  specify DFA output file name\n");
+  printf(" v  specify adGlobals output file name\n");
+  printf(" #  increment ADL debug level\n");
   printf("\n");
 }
 
@@ -450,22 +456,6 @@
   return fname;
 }
 
-//------------------------------strip_path_and_ext------------------------------
-static char *strip_path_and_ext(char *fname)
-{
-  char *ep;
-  char *sp;
-
-  if (fname) {
-    for (sp = fname; *sp; sp++)
-      if (*sp == '/')  fname = sp+1;
-    ep = fname;                    // start at first character and look for '.'
-    while (ep <= (fname + strlen(fname) - 1) && *ep != '.') ep++;
-    if (*ep == '.')     *ep = '\0'; // truncate string at '.'
-  }
-  return fname;
-}
-
 //------------------------------base_plus_suffix-------------------------------
 // New concatenated string
 static char *base_plus_suffix(const char* base, const char *suffix)
@@ -477,18 +467,6 @@
   return fname;
 }
 
-
-//------------------------------prefix_plus_base_plus_suffix-------------------
-// New concatenated string
-static char *prefix_plus_base_plus_suffix(const char* prefix, const char* base, const char *suffix)
-{
-  int len = (int)strlen(prefix) + (int)strlen(base) + (int)strlen(suffix) + 1;
-
-  char* fname = new char[len];
-  sprintf(fname,"%s%s%s",prefix,base,suffix);
-  return fname;
-}
-
 //------------------------------get_legal_text---------------------------------
 // Get pointer to legal text at the beginning of AD file.
 // This code assumes that a legal text starts at the beginning of .ad files,
--- a/hotspot/src/share/vm/adlc/output_c.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/output_c.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -518,6 +518,14 @@
 
     int cycles = piperesource->_cycles;
     uint stage          = pipeline->_stages.index(piperesource->_stage);
+    if (NameList::Not_in_list == stage) {
+      fprintf(stderr,
+              "pipeline_res_mask_initializer: "
+              "semantic error: "
+              "pipeline stage undeclared: %s\n",
+              piperesource->_stage);
+      exit(1);
+    }
     uint upper_limit    = stage+cycles-1;
     uint lower_limit    = stage-1;
     uint upper_idx      = upper_limit >> 5;
@@ -1000,7 +1008,7 @@
   }
   fprintf(fp_cpp, "};\n\n");
   fprintf(fp_cpp, "#ifndef PRODUCT\n");
-  fprintf(fp_cpp, "void Bundle::dump() const {\n");
+  fprintf(fp_cpp, "void Bundle::dump(outputStream *st) const {\n");
   fprintf(fp_cpp, "  static const char * bundle_flags[] = {\n");
   fprintf(fp_cpp, "    \"\",\n");
   fprintf(fp_cpp, "    \"use nop delay\",\n");
@@ -1019,22 +1027,22 @@
   // See if the same string is in the table
   fprintf(fp_cpp, "  bool needs_comma = false;\n\n");
   fprintf(fp_cpp, "  if (_flags) {\n");
-  fprintf(fp_cpp, "    tty->print(\"%%s\", bundle_flags[_flags]);\n");
+  fprintf(fp_cpp, "    st->print(\"%%s\", bundle_flags[_flags]);\n");
   fprintf(fp_cpp, "    needs_comma = true;\n");
   fprintf(fp_cpp, "  };\n");
   fprintf(fp_cpp, "  if (instr_count()) {\n");
-  fprintf(fp_cpp, "    tty->print(\"%%s%%d instr%%s\", needs_comma ? \", \" : \"\", instr_count(), instr_count() != 1 ? \"s\" : \"\");\n");
+  fprintf(fp_cpp, "    st->print(\"%%s%%d instr%%s\", needs_comma ? \", \" : \"\", instr_count(), instr_count() != 1 ? \"s\" : \"\");\n");
   fprintf(fp_cpp, "    needs_comma = true;\n");
   fprintf(fp_cpp, "  };\n");
   fprintf(fp_cpp, "  uint r = resources_used();\n");
   fprintf(fp_cpp, "  if (r) {\n");
-  fprintf(fp_cpp, "    tty->print(\"%%sresource%%s:\", needs_comma ? \", \" : \"\", (r & (r-1)) != 0 ? \"s\" : \"\");\n");
+  fprintf(fp_cpp, "    st->print(\"%%sresource%%s:\", needs_comma ? \", \" : \"\", (r & (r-1)) != 0 ? \"s\" : \"\");\n");
   fprintf(fp_cpp, "    for (uint i = 0; i < %d; i++)\n", _pipeline->_rescount);
   fprintf(fp_cpp, "      if ((r & (1 << i)) != 0)\n");
-  fprintf(fp_cpp, "        tty->print(\" %%s\", resource_names[i]);\n");
+  fprintf(fp_cpp, "        st->print(\" %%s\", resource_names[i]);\n");
   fprintf(fp_cpp, "    needs_comma = true;\n");
   fprintf(fp_cpp, "  };\n");
-  fprintf(fp_cpp, "  tty->print(\"\\n\");\n");
+  fprintf(fp_cpp, "  st->print(\"\\n\");\n");
   fprintf(fp_cpp, "}\n");
   fprintf(fp_cpp, "#endif\n");
 }
@@ -1048,39 +1056,6 @@
           node, regMask);
 }
 
-// Scan the peepmatch and output a test for each instruction
-static void check_peepmatch_instruction_tree(FILE *fp, PeepMatch *pmatch, PeepConstraint *pconstraint) {
-  int         parent        = -1;
-  int         inst_position = 0;
-  const char* inst_name     = NULL;
-  int         input         = 0;
-  fprintf(fp, "      // Check instruction sub-tree\n");
-  pmatch->reset();
-  for( pmatch->next_instruction( parent, inst_position, inst_name, input );
-       inst_name != NULL;
-       pmatch->next_instruction( parent, inst_position, inst_name, input ) ) {
-    // If this is not a placeholder
-    if( ! pmatch->is_placeholder() ) {
-      // Define temporaries 'inst#', based on parent and parent's input index
-      if( parent != -1 ) {                // root was initialized
-        fprintf(fp, "  inst%d = inst%d->in(%d);\n",
-                inst_position, parent, input);
-      }
-
-      // When not the root
-      // Test we have the correct instruction by comparing the rule
-      if( parent != -1 ) {
-        fprintf(fp, "  matches = matches &&  ( inst%d->rule() == %s_rule );",
-                inst_position, inst_name);
-      }
-    } else {
-      // Check that user did not try to constrain a placeholder
-      assert( ! pconstraint->constrains_instruction(inst_position),
-              "fatal(): Can not constrain a placeholder instruction");
-    }
-  }
-}
-
 static void print_block_index(FILE *fp, int inst_position) {
   assert( inst_position >= 0, "Instruction number less than zero");
   fprintf(fp, "block_index");
@@ -1242,7 +1217,7 @@
         if( left_op_index != 0 ) {
           assert( (left_index <= 9999) && (left_op_index <= 9999), "exceed string size");
           // Must have index into operands
-          sprintf(left_reg_index,",inst%d_idx%d", left_index, left_op_index);
+          sprintf(left_reg_index,",inst%d_idx%d", (int)left_index, left_op_index);
         } else {
           strcpy(left_reg_index, "");
         }
@@ -1255,7 +1230,7 @@
           if( right_op_index != 0 ) {
             assert( (right_index <= 9999) && (right_op_index <= 9999), "exceed string size");
             // Must have index into operands
-            sprintf(right_reg_index,",inst%d_idx%d", right_index, right_op_index);
+            sprintf(right_reg_index,",inst%d_idx%d", (int)right_index, right_op_index);
           } else {
             strcpy(right_reg_index, "");
           }
@@ -1645,7 +1620,7 @@
           new_pos = new_inst->operand_position(parameter,Component::USE);
           exp_pos += node->num_opnds();
           // If there is no use of the created operand, just skip it
-          if (new_pos != -1) {
+          if (new_pos != NameList::Not_in_list) {
             //Copy the operand from the original made above
             fprintf(fp,"  n%d->set_opnd_array(%d, op%d->clone(C)); // %s\n",
                     cnt, new_pos, exp_pos-node->num_opnds(), opid);
@@ -1789,7 +1764,8 @@
       // Build mapping from num_edges to local variables
       fprintf(fp,"  unsigned num0 = 0;\n");
       for( i = 1; i < cur_num_opnds; i++ ) {
-        fprintf(fp,"  unsigned num%d = opnd_array(%d)->num_edges();\n",i,i);
+        fprintf(fp,"  unsigned num%d = opnd_array(%d)->num_edges();",i,i);
+        fprintf(fp, " \t// %s\n", node->opnd_ident(i));
       }
       // Build a mapping from operand index to input edges
       fprintf(fp,"  unsigned idx0 = oper_input_base();\n");
@@ -1934,6 +1910,7 @@
   }
 
   // Track necessary state when identifying a replacement variable
+  // @arg rep_var: The formal parameter of the encoding.
   void update_state(const char *rep_var) {
     // A replacement variable or one of its subfields
     // Obtain replacement variable from list
@@ -1955,7 +1932,7 @@
         }
       }
       else {
-        // Lookup its position in parameter list
+        // Lookup its position in (formal) parameter list of encoding
         int   param_no  = _encoding.rep_var_index(rep_var);
         if ( param_no == -1 ) {
           _AD.syntax_err( _encoding._linenum,
@@ -1964,6 +1941,7 @@
         }
 
         // Lookup the corresponding ins_encode parameter
+        // This is the argument (actual parameter) to the encoding.
         const char *inst_rep_var = _ins_encode.rep_var_name(_inst, param_no);
         if (inst_rep_var == NULL) {
           _AD.syntax_err( _ins_encode._linenum,
@@ -2329,6 +2307,7 @@
           // Add parameter for index position, if not result operand
           if( _operand_idx != 0 ) fprintf(_fp,",idx%d", _operand_idx);
           fprintf(_fp,")");
+          fprintf(_fp, "/* %s */", _operand_name);
         }
       } else {
         assert( _reg_status == LITERAL_OUTPUT, "should have output register literal in emit_rep_var");
@@ -2368,7 +2347,7 @@
         }
       } else {
         assert( _constant_status == LITERAL_OUTPUT, "should have output constant literal in emit_rep_var");
-        // Cosntant literal has already been sent to output file, nothing more needed
+        // Constant literal has already been sent to output file, nothing more needed
       }
     }
     else if ( strcmp(rep_var,"$disp") == 0 ) {
@@ -2387,6 +2366,8 @@
     }
     else {
       printf("emit_field: %s\n",rep_var);
+      globalAD->syntax_err(_inst._linenum, "Unknown replacement variable %s in format statement of %s.",
+                           rep_var, _inst._ident);
       assert( false, "UnImplemented()");
     }
   }
@@ -2484,14 +2465,14 @@
 
   //(1)
   // Output instruction's emit prototype
-  fprintf(fp,"uint  %sNode::size(PhaseRegAlloc *ra_) const {\n",
+  fprintf(fp,"uint %sNode::size(PhaseRegAlloc *ra_) const {\n",
           inst._ident);
 
-  fprintf(fp, " assert(VerifyOops || MachNode::size(ra_) <= %s, \"bad fixed size\");\n", inst._size);
+  fprintf(fp, "  assert(VerifyOops || MachNode::size(ra_) <= %s, \"bad fixed size\");\n", inst._size);
 
   //(2)
   // Print the size
-  fprintf(fp, " return (VerifyOops ? MachNode::size(ra_) : %s);\n", inst._size);
+  fprintf(fp, "  return (VerifyOops ? MachNode::size(ra_) : %s);\n", inst._size);
 
   // (3) and (4)
   fprintf(fp,"}\n");
@@ -2579,7 +2560,7 @@
   }
 
   // (3) and (4)
-  fprintf(fp, "}\n");
+  fprintf(fp, "}\n\n");
 }
 
 // defineEvalConstant ---------------------------------------------------------
@@ -2727,12 +2708,12 @@
 // (2)  }
 //
 static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) {
-  fprintf(fp,"MachOper  *%sOper::clone(Compile* C) const {\n", oper._ident);
+  fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper._ident);
   // Check for constants that need to be copied over
   const int  num_consts    = oper.num_consts(globalNames);
   const bool is_ideal_bool = oper.is_ideal_bool();
   if( (num_consts > 0) ) {
-    fprintf(fp,"  return  new (C) %sOper(", oper._ident);
+    fprintf(fp,"  return new (C) %sOper(", oper._ident);
     // generate parameters for constants
     int i = 0;
     fprintf(fp,"_c%d", i);
@@ -2744,21 +2725,12 @@
   }
   else {
     assert( num_consts == 0, "Currently support zero or one constant per operand clone function");
-    fprintf(fp,"  return  new (C) %sOper();\n", oper._ident);
+    fprintf(fp,"  return new (C) %sOper();\n", oper._ident);
   }
   // finish method
   fprintf(fp,"}\n");
 }
 
-static void define_hash(FILE *fp, char *operand) {
-  fprintf(fp,"uint %sOper::hash() const { return 5; }\n", operand);
-}
-
-static void define_cmp(FILE *fp, char *operand) {
-  fprintf(fp,"uint %sOper::cmp( const MachOper &oper ) const { return opcode() == oper.opcode(); }\n", operand);
-}
-
-
 // Helper functions for bug 4796752, abstracted with minimal modification
 // from define_oper_interface()
 OperandForm *rep_var_to_operand(const char *encoding, OperandForm &oper, FormDict &globals) {
@@ -2852,14 +2824,14 @@
   } else if ( (strcmp(name,"disp") == 0) ) {
     fprintf(fp,"(PhaseRegAlloc *ra_, const Node *node, int idx) const { \n");
   } else {
-    fprintf(fp,"() const { ");
+    fprintf(fp,"() const { \n");
   }
 
   // Check for hexadecimal value OR replacement variable
   if( *encoding == '$' ) {
     // Replacement variable
     const char *rep_var = encoding + 1;
-    fprintf(fp,"// Replacement variable: %s\n", encoding+1);
+    fprintf(fp,"    // Replacement variable: %s\n", encoding+1);
     // Lookup replacement variable, rep_var, in operand's component list
     const Component *comp = oper._components.search(rep_var);
     assert( comp != NULL, "Replacement variable not found in components");
@@ -2880,10 +2852,10 @@
     } else if ( op->ideal_to_sReg_type(op->_ident) != Form::none ) {
       // StackSlot for an sReg comes either from input node or from self, when idx==0
       fprintf(fp,"    if( idx != 0 ) {\n");
-      fprintf(fp,"      // Access register number for input operand\n");
+      fprintf(fp,"      // Access stack offset (register number) for input operand\n");
       fprintf(fp,"      return ra_->reg2offset(ra_->get_reg_first(node->in(idx)));/* sReg */\n");
       fprintf(fp,"    }\n");
-      fprintf(fp,"    // Access register number from myself\n");
+      fprintf(fp,"    // Access stack offset (register number) from myself\n");
       fprintf(fp,"    return ra_->reg2offset(ra_->get_reg_first(node));/* sReg */\n");
     } else if (op->_matrule && op->_matrule->is_base_constant(globals)) {
       // Constant
@@ -2900,7 +2872,7 @@
   }
   else if( *encoding == '0' && *(encoding+1) == 'x' ) {
     // Hex value
-    fprintf(fp,"return %s;", encoding);
+    fprintf(fp,"    return %s;\n", encoding);
   } else {
     assert( false, "Do not support octal or decimal encode constants");
   }
@@ -3133,8 +3105,8 @@
     // Output the definition for number of relocation entries
     uint reloc_size = instr->reloc(_globalNames);
     if ( reloc_size != 0 ) {
-      fprintf(fp,"int  %sNode::reloc()   const {\n", instr->_ident);
-      fprintf(fp,  "  return  %d;\n", reloc_size );
+      fprintf(fp,"int %sNode::reloc() const {\n", instr->_ident);
+      fprintf(fp,"  return %d;\n", reloc_size);
       fprintf(fp,"}\n");
       fprintf(fp,"\n");
     }
@@ -3241,7 +3213,7 @@
 class OutputReduceOp : public OutputMap {
 public:
   OutputReduceOp(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "reduceOp") {};
 
   void declaration() { fprintf(_hpp, "extern const int   reduceOp[];\n"); }
   void definition()  { fprintf(_cpp, "const        int   reduceOp[] = {\n"); }
@@ -3276,7 +3248,7 @@
 class OutputLeftOp : public OutputMap {
 public:
   OutputLeftOp(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "leftOp") {};
 
   void declaration() { fprintf(_hpp, "extern const int   leftOp[];\n"); }
   void definition()  { fprintf(_cpp, "const        int   leftOp[] = {\n"); }
@@ -3306,7 +3278,7 @@
 class OutputRightOp : public OutputMap {
 public:
   OutputRightOp(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "rightOp") {};
 
   void declaration() { fprintf(_hpp, "extern const int   rightOp[];\n"); }
   void definition()  { fprintf(_cpp, "const        int   rightOp[] = {\n"); }
@@ -3336,11 +3308,11 @@
 class OutputRuleName : public OutputMap {
 public:
   OutputRuleName(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "ruleName") {};
 
   void declaration() { fprintf(_hpp, "extern const char *ruleName[];\n"); }
   void definition()  { fprintf(_cpp, "const char        *ruleName[] = {\n"); }
-  void closing()     { fprintf(_cpp, "  \"no trailing comma\"\n");
+  void closing()     { fprintf(_cpp, "  \"invalid rule name\" // no trailing comma\n");
                        OutputMap::closing();
   }
   void map(OpClassForm &opc)  { fprintf(_cpp, "  \"%s\"", _AD.machOperEnum(opc._ident) ); }
@@ -3354,7 +3326,7 @@
 class OutputSwallowed : public OutputMap {
 public:
   OutputSwallowed(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "swallowed") {};
 
   void declaration() { fprintf(_hpp, "extern const bool  swallowed[];\n"); }
   void definition()  { fprintf(_cpp, "const        bool  swallowed[] = {\n"); }
@@ -3375,7 +3347,7 @@
 class OutputInstChainRule : public OutputMap {
 public:
   OutputInstChainRule(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "instruction_chain_rule") {};
 
   void declaration() { fprintf(_hpp, "extern const bool  instruction_chain_rule[];\n"); }
   void definition()  { fprintf(_cpp, "const        bool  instruction_chain_rule[] = {\n"); }
@@ -3416,7 +3388,7 @@
     if ( op->ideal_only() )  continue;
 
     // Generate the entry for this opcode
-    map.map(*op);    fprintf(fp_cpp, ", // %d\n", idx);
+    fprintf(fp_cpp, "  /* %4d */", idx); map.map(*op); fprintf(fp_cpp, ",\n");
     ++idx;
   };
   fprintf(fp_cpp, "  // last operand\n");
@@ -3425,7 +3397,7 @@
   map.record_position(OutputMap::BEGIN_OPCLASSES, idx );
   _opclass.reset();
   for(; (opc = (OpClassForm*)_opclass.iter()) != NULL; ) {
-    map.map(*opc);    fprintf(fp_cpp, ", // %d\n", idx);
+    fprintf(fp_cpp, "  /* %4d */", idx); map.map(*opc); fprintf(fp_cpp, ",\n");
     ++idx;
   };
   fprintf(fp_cpp, "  // last operand class\n");
@@ -3435,7 +3407,7 @@
   _internalOpNames.reset();
   char *name = NULL;
   for(; (name = (char *)_internalOpNames.iter()) != NULL; ) {
-    map.map(name);    fprintf(fp_cpp, ", // %d\n", idx);
+    fprintf(fp_cpp, "  /* %4d */", idx); map.map(name); fprintf(fp_cpp, ",\n");
     ++idx;
   };
   fprintf(fp_cpp, "  // last internally defined operand\n");
@@ -3453,7 +3425,7 @@
         if ( ! inst->is_simple_chain_rule(_globalNames) ) continue;
         if ( inst->rematerialize(_globalNames, get_registers()) ) continue;
 
-        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
+        fprintf(fp_cpp, "  /* %4d */", idx); map.map(*inst); fprintf(fp_cpp, ",\n");
         ++idx;
       };
       map.record_position(OutputMap::BEGIN_REMATERIALIZE, idx );
@@ -3464,7 +3436,7 @@
         if ( ! inst->is_simple_chain_rule(_globalNames) ) continue;
         if ( ! inst->rematerialize(_globalNames, get_registers()) ) continue;
 
-        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
+        fprintf(fp_cpp, "  /* %4d */", idx); map.map(*inst); fprintf(fp_cpp, ",\n");
         ++idx;
       };
       map.record_position(OutputMap::END_INST_CHAIN_RULES, idx );
@@ -3478,7 +3450,7 @@
         if ( inst->is_simple_chain_rule(_globalNames) ) continue;
         if ( ! inst->rematerialize(_globalNames, get_registers()) ) continue;
 
-        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
+        fprintf(fp_cpp, "  /* %4d */", idx); map.map(*inst); fprintf(fp_cpp, ",\n");
         ++idx;
       };
       map.record_position(OutputMap::END_REMATERIALIZE, idx );
@@ -3489,7 +3461,7 @@
         if ( inst->is_simple_chain_rule(_globalNames) ) continue;
         if ( inst->rematerialize(_globalNames, get_registers()) ) continue;
 
-        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
+        fprintf(fp_cpp, "  /* %4d */", idx); map.map(*inst); fprintf(fp_cpp, ",\n");
         ++idx;
       };
     }
@@ -3571,7 +3543,7 @@
     next              = _register->iter_RegDefs();
     char policy       = reg_save_policy(rdef->_callconv);
     const char *comma = (next != NULL) ? "," : " // no trailing comma";
-    fprintf(fp_cpp, "  '%c'%s\n", policy, comma);
+    fprintf(fp_cpp, "  '%c'%s // %s\n", policy, comma, rdef->_regname);
   }
   fprintf(fp_cpp, "};\n\n");
 
@@ -3583,7 +3555,7 @@
     next        = _register->iter_RegDefs();
     char policy = reg_save_policy(rdef->_c_conv);
     const char *comma = (next != NULL) ? "," : " // no trailing comma";
-    fprintf(fp_cpp, "  '%c'%s\n", policy, comma);
+    fprintf(fp_cpp, "  '%c'%s // %s\n", policy, comma, rdef->_regname);
   }
   fprintf(fp_cpp, "};\n\n");
 
@@ -3644,6 +3616,8 @@
       fprintf(fp, "_leaf->bottom_type()->is_ptr()");
     } else if ( (strcmp(optype,"ConN") == 0) ) {
       fprintf(fp, "_leaf->bottom_type()->is_narrowoop()");
+    } else if ( (strcmp(optype,"ConNKlass") == 0) ) {
+      fprintf(fp, "_leaf->bottom_type()->is_narrowklass()");
     } else if ( (strcmp(optype,"ConF") == 0) ) {
       fprintf(fp, "_leaf->getf()");
     } else if ( (strcmp(optype,"ConD") == 0) ) {
@@ -3792,7 +3766,7 @@
       // For each operand not in the match rule, call MachOperGenerator
       // with the enum for the opcode that needs to be built.
       ComponentList clist = inst->_components;
-      int         index  = clist.operand_position(comp->_name, comp->_usedef);
+      int         index  = clist.operand_position(comp->_name, comp->_usedef, inst);
       const char *opcode = machOperEnum(comp->_type);
       fprintf(fp_cpp, "%s node->set_opnd_array(%d, ", indent, index);
       fprintf(fp_cpp, "MachOperGenerator(%s, C));\n", opcode);
@@ -3987,7 +3961,7 @@
     fprintf(fp_cpp, "  case %s_rule:", opClass);
 
     // Start local scope
-    fprintf(fp_cpp, "  {\n");
+    fprintf(fp_cpp, " {\n");
     // Generate code to construct the new MachNode
     buildMachNode(fp_cpp, inst, "     ");
     // Return result and exit scope
@@ -4137,6 +4111,9 @@
 // Get info for the CISC_oracle and MachNode::cisc_version()
 void ArchDesc::identify_cisc_spill_instructions() {
 
+  if (_frame == NULL)
+    return;
+
   // Find the user-defined operand for cisc-spilling
   if( _frame->_cisc_spilling_operand_name != NULL ) {
     const Form *form = _globalNames[_frame->_cisc_spilling_operand_name];
--- a/hotspot/src/share/vm/adlc/output_h.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/adlc/output_h.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -25,6 +25,8 @@
 // output_h.cpp - Class HPP file output routines for architecture definition
 #include "adlc.hpp"
 
+// The comment delimiter used in format statements after assembler instructions.
+#define commentSeperator "!"
 
 // Generate the #define that describes the number of registers.
 static void defineRegCount(FILE *fp, RegisterForm *registers) {
@@ -79,10 +81,15 @@
     _register->reset_RegDefs();
     int i = 0;
     while( (reg_def = _register->iter_RegDefs()) != NULL ) {
-      fprintf(fp_hpp,"  %s_num,\t\t// %d\n", reg_def->_regname, i++);
+      fprintf(fp_hpp,"  %s_num,", reg_def->_regname);
+      for (int j = 0; j < 20-(int)strlen(reg_def->_regname); j++) fprintf(fp_hpp, " ");
+      fprintf(fp_hpp," // enum %3d, regnum %3d, reg encode %3s\n",
+              i++,
+              reg_def->register_num(),
+              reg_def->register_encode());
     }
     // Finish defining enumeration
-    fprintf(fp_hpp, "  _last_Mach_Reg\t// %d\n", i);
+    fprintf(fp_hpp, "  _last_Mach_Reg            // %d\n", i);
     fprintf(fp_hpp, "};\n");
   }
 
@@ -121,13 +128,24 @@
     fprintf(fp_hpp, "// in the order of occurrence in the alloc_class(es).\n");
     fprintf(fp_hpp, "enum MachRegisterEncodes {\n");
 
+    // Find max enum string length.
+    size_t maxlen = 0;
+    _register->reset_RegDefs();
+    reg_def = _register->iter_RegDefs();
+    while (reg_def != NULL) {
+      size_t len = strlen(reg_def->_regname);
+      if (len > maxlen) maxlen = len;
+      reg_def = _register->iter_RegDefs();
+    }
+
     // Output the register encoding for each register in the allocation classes
     _register->reset_RegDefs();
     reg_def_next = _register->iter_RegDefs();
     while( (reg_def = reg_def_next) != NULL ) {
       reg_def_next = _register->iter_RegDefs();
-      fprintf(fp_hpp,"  %s_enc = %s%s\n",
-              reg_def->_regname, reg_def->register_encode(), reg_def_next == NULL? "" : "," );
+      fprintf(fp_hpp,"  %s_enc", reg_def->_regname);
+      for (size_t i = strlen(reg_def->_regname); i < maxlen; i++) fprintf(fp_hpp, " ");
+      fprintf(fp_hpp," = %3s%s\n", reg_def->register_encode(), reg_def_next == NULL? "" : "," );
     }
     // Finish defining enumeration
     fprintf(fp_hpp, "};\n");
@@ -177,14 +195,6 @@
   fprintf(fp,"  virtual const RegMask *in_RegMask(int index) const;\n");
 }
 
-static void declare_hash(FILE *fp) {
-  fprintf(fp,"  virtual uint           hash() const;\n");
-}
-
-static void declare_cmp(FILE *fp) {
-  fprintf(fp,"  virtual uint           cmp( const MachOper &oper ) const;\n");
-}
-
 static void declareConstStorage(FILE *fp, FormDict &globals, OperandForm *oper) {
   int i = 0;
   Component *comp;
@@ -207,6 +217,10 @@
       if (i > 0) fprintf(fp,", ");
       fprintf(fp,"  const TypeNarrowOop *_c%d;\n", i);
     }
+    else if (!strcmp(type, "ConNKlass")) {
+      if (i > 0) fprintf(fp,", ");
+      fprintf(fp,"  const TypeNarrowKlass *_c%d;\n", i);
+    }
     else if (!strcmp(type, "ConL")) {
       if (i > 0) fprintf(fp,", ");
       fprintf(fp,"  jlong          _c%d;\n", i);
@@ -243,6 +257,10 @@
         fprintf(fp,"  const TypePtr *_c%d;\n", i);
         i++;
       }
+      else if (!strcmp(comp->base_type(globals), "ConNKlass")) {
+        fprintf(fp,"  const TypePtr *_c%d;\n", i);
+        i++;
+      }
       else if (!strcmp(comp->base_type(globals), "ConL")) {
         fprintf(fp,"  jlong            _c%d;\n", i);
         i++;
@@ -288,11 +306,12 @@
       fprintf(fp,is_ideal_bool ? "BoolTest::mask c%d" : "int32 c%d", i);
       break;
     }
-    case Form::idealN : { fprintf(fp,"const TypeNarrowOop *c%d", i); break; }
-    case Form::idealP : { fprintf(fp,"const TypePtr *c%d", i); break; }
-    case Form::idealL : { fprintf(fp,"jlong c%d", i);   break;        }
-    case Form::idealF : { fprintf(fp,"jfloat c%d", i);  break;        }
-    case Form::idealD : { fprintf(fp,"jdouble c%d", i); break;        }
+    case Form::idealN :      { fprintf(fp,"const TypeNarrowOop *c%d", i); break; }
+    case Form::idealNKlass : { fprintf(fp,"const TypeNarrowKlass *c%d", i); break; }
+    case Form::idealP :      { fprintf(fp,"const TypePtr *c%d", i); break; }
+    case Form::idealL :      { fprintf(fp,"jlong c%d", i);   break;        }
+    case Form::idealF :      { fprintf(fp,"jfloat c%d", i);  break;        }
+    case Form::idealD :      { fprintf(fp,"jdouble c%d", i); break;        }
     default:
       assert(!is_ideal_bool, "Non-constant operand lacks component list.");
       break;
@@ -316,6 +335,11 @@
         fprintf(fp,"const TypePtr *c%d", i);
         i++;
       }
+      else if (!strcmp(comp->base_type(globals), "ConNKlass")) {
+        if (i > 0) fprintf(fp,", ");
+        fprintf(fp,"const TypePtr *c%d", i);
+        i++;
+      }
       else if (!strcmp(comp->base_type(globals), "ConL")) {
         if (i > 0) fprintf(fp,", ");
         fprintf(fp,"jlong c%d", i);
@@ -358,18 +382,19 @@
 static void defineCCodeDump(OperandForm* oper, FILE *fp, int i) {
   assert(oper != NULL, "what");
   CondInterface* cond = oper->_interface->is_CondInterface();
-  fprintf(fp, "         if( _c%d == BoolTest::eq ) st->print(\"%s\");\n",i,cond->_equal_format);
-  fprintf(fp, "    else if( _c%d == BoolTest::ne ) st->print(\"%s\");\n",i,cond->_not_equal_format);
-  fprintf(fp, "    else if( _c%d == BoolTest::le ) st->print(\"%s\");\n",i,cond->_less_equal_format);
-  fprintf(fp, "    else if( _c%d == BoolTest::ge ) st->print(\"%s\");\n",i,cond->_greater_equal_format);
-  fprintf(fp, "    else if( _c%d == BoolTest::lt ) st->print(\"%s\");\n",i,cond->_less_format);
-  fprintf(fp, "    else if( _c%d == BoolTest::gt ) st->print(\"%s\");\n",i,cond->_greater_format);
+  fprintf(fp, "       if( _c%d == BoolTest::eq ) st->print(\"%s\");\n",i,cond->_equal_format);
+  fprintf(fp, "  else if( _c%d == BoolTest::ne ) st->print(\"%s\");\n",i,cond->_not_equal_format);
+  fprintf(fp, "  else if( _c%d == BoolTest::le ) st->print(\"%s\");\n",i,cond->_less_equal_format);
+  fprintf(fp, "  else if( _c%d == BoolTest::ge ) st->print(\"%s\");\n",i,cond->_greater_equal_format);
+  fprintf(fp, "  else if( _c%d == BoolTest::lt ) st->print(\"%s\");\n",i,cond->_less_format);
+  fprintf(fp, "  else if( _c%d == BoolTest::gt ) st->print(\"%s\");\n",i,cond->_greater_format);
 }
 
 // Output code that dumps constant values, increment "i" if type is constant
 static uint dump_spec_constant(FILE *fp, const char *ideal_type, uint i, OperandForm* oper) {
   if (!strcmp(ideal_type, "ConI")) {
     fprintf(fp,"   st->print(\"#%%d\", _c%d);\n", i);
+    fprintf(fp,"   st->print(\"/0x%%08x\", _c%d);\n", i);
     ++i;
   }
   else if (!strcmp(ideal_type, "ConP")) {
@@ -380,16 +405,25 @@
     fprintf(fp,"    _c%d->dump_on(st);\n", i);
     ++i;
   }
+  else if (!strcmp(ideal_type, "ConNKlass")) {
+    fprintf(fp,"    _c%d->dump_on(st);\n", i);
+    ++i;
+  }
   else if (!strcmp(ideal_type, "ConL")) {
     fprintf(fp,"    st->print(\"#\" INT64_FORMAT, _c%d);\n", i);
+    fprintf(fp,"    st->print(\"/\" PTR64_FORMAT, _c%d);\n", i);
     ++i;
   }
   else if (!strcmp(ideal_type, "ConF")) {
     fprintf(fp,"    st->print(\"#%%f\", _c%d);\n", i);
+    fprintf(fp,"    jint _c%di = JavaValue(_c%d).get_jint();\n", i, i);
+    fprintf(fp,"    st->print(\"/0x%%x/\", _c%di);\n", i);
     ++i;
   }
   else if (!strcmp(ideal_type, "ConD")) {
     fprintf(fp,"    st->print(\"#%%f\", _c%d);\n", i);
+    fprintf(fp,"    jlong _c%dl = JavaValue(_c%d).get_jlong();\n", i, i);
+    fprintf(fp,"    st->print(\"/\" PTR64_FORMAT, _c%dl);\n", i);
     ++i;
   }
   else if (!strcmp(ideal_type, "Bool")) {
@@ -411,7 +445,7 @@
   }
 
   // Local pointer indicates remaining part of format rule
-  uint  idx = 0;                   // position of operand in match rule
+  int idx = 0;                   // position of operand in match rule
 
   // Generate internal format function, used when stored locally
   fprintf(fp, "\n#ifndef PRODUCT\n");
@@ -426,13 +460,12 @@
       oper._format->_rep_vars.reset();
       oper._format->_strings.reset();
       while ( (string = oper._format->_strings.iter()) != NULL ) {
-        fprintf(fp,"  ");
 
         // Check if this is a standard string or a replacement variable
         if ( string != NameList::_signal ) {
           // Normal string
           // Pass through to st->print
-          fprintf(fp,"st->print(\"%s\");\n", string);
+          fprintf(fp,"  st->print(\"%s\");\n", string);
         } else {
           // Replacement variable
           const char *rep_var = oper._format->_rep_vars.iter();
@@ -455,7 +488,7 @@
           }
 
           // output invocation of "$..."s format function
-          if ( op != NULL )   op->int_format(fp, globals, idx);
+          if ( op != NULL ) op->int_format(fp, globals, idx);
 
           if ( idx == -1 ) {
             fprintf(stderr,
@@ -498,13 +531,12 @@
       oper._format->_rep_vars.reset();
       oper._format->_strings.reset();
       while ( (string = oper._format->_strings.iter()) != NULL ) {
-        fprintf(fp,"  ");
 
         // Check if this is a standard string or a replacement variable
         if ( string != NameList::_signal ) {
           // Normal string
           // Pass through to st->print
-          fprintf(fp,"st->print(\"%s\");\n", string);
+          fprintf(fp,"  st->print(\"%s\");\n", string);
         } else {
           // Replacement variable
           const char *rep_var = oper._format->_rep_vars.iter();
@@ -529,7 +561,7 @@
           if ( op != NULL )   op->ext_format(fp, globals, idx);
 
           // Lookup the index position of the replacement variable
-          idx      = oper._components.operand_position_format(rep_var);
+          idx      = oper._components.operand_position_format(rep_var, &oper);
           if ( idx == -1 ) {
             fprintf(stderr,
                     "Using a name, %s, that isn't in match rule\n", rep_var);
@@ -583,7 +615,7 @@
     inst._format->_rep_vars.reset();
     inst._format->_strings.reset();
     while( (string = inst._format->_strings.iter()) != NULL ) {
-      fprintf(fp,"    ");
+      fprintf(fp,"  ");
       // Check if this is a standard string or a replacement variable
       if( string == NameList::_signal ) { // Replacement variable
         const char* rep_var =  inst._format->_rep_vars.iter();
@@ -640,11 +672,12 @@
   if( call_type != Form::invalid_type ) {
     switch( call_type ) {
     case Form::JAVA_DYNAMIC:
-      fprintf(fp,"    _method->print_short_name();\n");
+      fprintf(fp,"  _method->print_short_name(st);\n");
       break;
     case Form::JAVA_STATIC:
-      fprintf(fp,"    if( _method ) _method->print_short_name(st); else st->print(\" wrapper for: %%s\", _name);\n");
-      fprintf(fp,"    if( !_method ) dump_trap_args(st);\n");
+      fprintf(fp,"  if( _method ) _method->print_short_name(st);\n");
+      fprintf(fp,"  else st->print(\" wrapper for: %%s\", _name);\n");
+      fprintf(fp,"  if( !_method ) dump_trap_args(st);\n");
       break;
     case Form::JAVA_COMPILED:
     case Form::JAVA_INTERP:
@@ -652,52 +685,46 @@
     case Form::JAVA_RUNTIME:
     case Form::JAVA_LEAF:
     case Form::JAVA_NATIVE:
-      fprintf(fp,"    st->print(\" %%s\", _name);");
+      fprintf(fp,"  st->print(\" %%s\", _name);");
       break;
     default:
-      assert(0,"ShouldNotReacHere");
+      assert(0,"ShouldNotReachHere");
     }
-    fprintf(fp,  "    st->print_cr(\"\");\n" );
-    fprintf(fp,  "    if (_jvms) _jvms->format(ra, this, st); else st->print_cr(\"        No JVM State Info\");\n" );
-    fprintf(fp,  "    st->print(\"        # \");\n" );
-    fprintf(fp,  "    if( _jvms ) _oop_map->print_on(st);\n");
+    fprintf(fp,  "  st->print_cr(\"\");\n" );
+    fprintf(fp,  "  if (_jvms) _jvms->format(ra, this, st); else st->print_cr(\"        No JVM State Info\");\n" );
+    fprintf(fp,  "  st->print(\"        # \");\n" );
+    fprintf(fp,  "  if( _jvms && _oop_map ) _oop_map->print_on(st);\n");
   }
   else if(inst.is_ideal_safepoint()) {
-    fprintf(fp,  "    st->print(\"\");\n" );
-    fprintf(fp,  "    if (_jvms) _jvms->format(ra, this, st); else st->print_cr(\"        No JVM State Info\");\n" );
-    fprintf(fp,  "    st->print(\"        # \");\n" );
-    fprintf(fp,  "    if( _jvms ) _oop_map->print_on(st);\n");
+    fprintf(fp,  "  st->print(\"\");\n" );
+    fprintf(fp,  "  if (_jvms) _jvms->format(ra, this, st); else st->print_cr(\"        No JVM State Info\");\n" );
+    fprintf(fp,  "  st->print(\"        # \");\n" );
+    fprintf(fp,  "  if( _jvms && _oop_map ) _oop_map->print_on(st);\n");
   }
   else if( inst.is_ideal_if() ) {
-    fprintf(fp,  "    st->print(\"  P=%%f C=%%f\",_prob,_fcnt);\n" );
+    fprintf(fp,  "  st->print(\"  P=%%f C=%%f\",_prob,_fcnt);\n" );
   }
   else if( inst.is_ideal_mem() ) {
     // Print out the field name if available to improve readability
-    fprintf(fp,  "    if (ra->C->alias_type(adr_type())->field() != NULL) {\n");
-    fprintf(fp,  "      ciField* f = ra->C->alias_type(adr_type())->field();\n");
-    fprintf(fp,  "      st->print(\" ! Field: \");\n");
-    fprintf(fp,  "      if (f->is_volatile())\n");
-    fprintf(fp,  "        st->print(\"volatile \");\n");
-    fprintf(fp,  "      f->holder()->name()->print_symbol_on(st);\n");
-    fprintf(fp,  "      st->print(\".\");\n");
-    fprintf(fp,  "      f->name()->print_symbol_on(st);\n");
-    fprintf(fp,  "      if (f->is_constant())\n");
-    fprintf(fp,  "        st->print(\" (constant)\");\n");
-    fprintf(fp,  "    } else\n");
+    fprintf(fp,  "  if (ra->C->alias_type(adr_type())->field() != NULL) {\n");
+    fprintf(fp,  "    ciField* f = ra->C->alias_type(adr_type())->field();\n");
+    fprintf(fp,  "    st->print(\" %s Field: \");\n", commentSeperator);
+    fprintf(fp,  "    if (f->is_volatile())\n");
+    fprintf(fp,  "      st->print(\"volatile \");\n");
+    fprintf(fp,  "    f->holder()->name()->print_symbol_on(st);\n");
+    fprintf(fp,  "    st->print(\".\");\n");
+    fprintf(fp,  "    f->name()->print_symbol_on(st);\n");
+    fprintf(fp,  "    if (f->is_constant())\n");
+    fprintf(fp,  "      st->print(\" (constant)\");\n");
+    fprintf(fp,  "  } else {\n");
     // Make sure 'Volatile' gets printed out
     fprintf(fp,  "    if (ra->C->alias_type(adr_type())->is_volatile())\n");
     fprintf(fp,  "      st->print(\" volatile!\");\n");
+    fprintf(fp,  "  }\n");
   }
 
   // Complete the definition of the format function
-  fprintf(fp, "  }\n#endif\n");
-}
-
-static bool is_non_constant(char* x) {
-  // Tells whether the string (part of an operator interface) is non-constant.
-  // Simply detect whether there is an occurrence of a formal parameter,
-  // which will always begin with '$'.
-  return strchr(x, '$') == 0;
+  fprintf(fp, "}\n#endif\n");
 }
 
 void ArchDesc::declare_pipe_classes(FILE *fp_hpp) {
@@ -1089,7 +1116,7 @@
   fprintf(fp_hpp, "  static void initialize_nops(MachNode *nop_list[%d], Compile* C);\n\n",
     _pipeline->_nopcnt);
   fprintf(fp_hpp, "#ifndef PRODUCT\n");
-  fprintf(fp_hpp, "  void dump() const;\n");
+  fprintf(fp_hpp, "  void dump(outputStream *st = tty) const;\n");
   fprintf(fp_hpp, "#endif\n");
   fprintf(fp_hpp, "};\n\n");
 
@@ -1234,12 +1261,12 @@
       unsigned int position = 0;
       const char  *opret, *opname, *optype;
       oper->_matrule->base_operand(position,_globalNames,opret,opname,optype);
-      fprintf(fp,"  virtual const Type *type() const {");
+      fprintf(fp,"  virtual const Type    *type() const {");
       const char *type = getIdealType(optype);
       if( type != NULL ) {
         Form::DataType data_type = oper->is_base_constant(_globalNames);
         // Check if we are an ideal pointer type
-        if( data_type == Form::idealP || data_type == Form::idealN ) {
+        if( data_type == Form::idealP || data_type == Form::idealN || data_type == Form::idealNKlass ) {
           // Return the ideal type we already have: <TypePtr *>
           fprintf(fp," return _c0;");
         } else {
@@ -1377,6 +1404,16 @@
           fprintf(fp,   " return _c0->get_ptrtype()->reloc();");
           fprintf(fp, " }\n");
         }
+        else if (!strcmp(oper->ideal_type(_globalNames), "ConNKlass")) {
+          // Access the locally stored constant
+          fprintf(fp,"  virtual intptr_t       constant() const {");
+          fprintf(fp,   " return _c0->get_ptrtype()->get_con();");
+          fprintf(fp, " }\n");
+          // Generate query to determine if this pointer is an oop
+          fprintf(fp,"  virtual relocInfo::relocType           constant_reloc() const {");
+          fprintf(fp,   " return _c0->get_ptrtype()->reloc();");
+          fprintf(fp, " }\n");
+        }
         else if (!strcmp(oper->ideal_type(_globalNames), "ConL")) {
           fprintf(fp,"  virtual intptr_t       constant() const {");
           // We don't support addressing modes with > 4Gig offsets.
@@ -1503,12 +1540,19 @@
       fprintf(fp, "  GrowableArray<Label*> _index2label;\n");
     }
     fprintf(fp,"public:\n");
-    fprintf(fp,"  MachOper *opnd_array(uint operand_index) const { assert(operand_index < _num_opnds, \"invalid _opnd_array index\"); return _opnd_array[operand_index]; }\n");
-    fprintf(fp,"  void      set_opnd_array(uint operand_index, MachOper *operand) { assert(operand_index < _num_opnds, \"invalid _opnd_array index\"); _opnd_array[operand_index] = operand; }\n");
+    fprintf(fp,"  MachOper *opnd_array(uint operand_index) const {\n");
+    fprintf(fp,"    assert(operand_index < _num_opnds, \"invalid _opnd_array index\");\n");
+    fprintf(fp,"    return _opnd_array[operand_index];\n");
+    fprintf(fp,"  }\n");
+    fprintf(fp,"  void      set_opnd_array(uint operand_index, MachOper *operand) {\n");
+    fprintf(fp,"    assert(operand_index < _num_opnds, \"invalid _opnd_array index\");\n");
+    fprintf(fp,"    _opnd_array[operand_index] = operand;\n");
+    fprintf(fp,"  }\n");
     fprintf(fp,"private:\n");
     if ( instr->is_ideal_jump() ) {
       fprintf(fp,"  virtual void           add_case_label(int index_num, Label* blockLabel) {\n");
-      fprintf(fp,"                                          _index2label.at_put_grow(index_num, blockLabel);}\n");
+      fprintf(fp,"    _index2label.at_put_grow(index_num, blockLabel);\n");
+      fprintf(fp,"  }\n");
     }
     if( can_cisc_spill() && (instr->cisc_spill_alternate() != NULL) ) {
       fprintf(fp,"  const RegMask  *_cisc_RegMask;\n");
@@ -1544,7 +1588,7 @@
     while (attr != NULL) {
       if (strcmp(attr->_ident,"ins_cost") &&
           strcmp(attr->_ident,"ins_short_branch")) {
-        fprintf(fp,"  int             %s() const { return %s; }\n",
+        fprintf(fp,"          int            %s() const { return %s; }\n",
                 attr->_ident, attr->_val);
       }
       // Check value for ins_avoid_back_to_back, and if it is true (1), set the flag
@@ -1628,12 +1672,12 @@
 
     // Output the declaration for number of relocation entries
     if ( instr->reloc(_globalNames) != 0 ) {
-      fprintf(fp,"  virtual int            reloc()   const;\n");
+      fprintf(fp,"  virtual int            reloc() const;\n");
     }
 
     if (instr->alignment() != 1) {
-      fprintf(fp,"  virtual int            alignment_required()   const { return %d; }\n", instr->alignment());
-      fprintf(fp,"  virtual int            compute_padding(int current_offset)   const;\n");
+      fprintf(fp,"  virtual int            alignment_required() const { return %d; }\n", instr->alignment());
+      fprintf(fp,"  virtual int            compute_padding(int current_offset) const;\n");
     }
 
     // Starting point for inputs matcher wants.
@@ -1803,13 +1847,14 @@
       // as is done for pointers
       //
       // Construct appropriate constant type containing the constant value.
-      fprintf(fp,"  virtual const class Type *bottom_type() const{\n");
+      fprintf(fp,"  virtual const class Type *bottom_type() const {\n");
       switch( data_type ) {
       case Form::idealI:
         fprintf(fp,"    return  TypeInt::make(opnd_array(1)->constant());\n");
         break;
       case Form::idealP:
       case Form::idealN:
+      case Form::idealNKlass:
         fprintf(fp,"    return  opnd_array(1)->type();\n");
         break;
       case Form::idealD:
@@ -1833,7 +1878,7 @@
       // !!!!! !!!!!
       // Provide explicit bottom type for conversions to int
       // On Intel the result operand is a stackSlot, untyped.
-      fprintf(fp,"  virtual const class Type *bottom_type() const{");
+      fprintf(fp,"  virtual const class Type *bottom_type() const {");
       fprintf(fp,   " return  TypeInt::INT;");
       fprintf(fp, " };\n");
     }*/
@@ -1854,7 +1899,7 @@
       // BoxNode provides the address of a stack slot.
       // Define its bottom type to be TypeRawPtr::BOTTOM instead of TypePtr::BOTTOM
       // This prevent s insert_anti_dependencies from complaining. It will
-      // complain if it see that the pointer base is TypePtr::BOTTOM since
+      // complain if it sees that the pointer base is TypePtr::BOTTOM since
       // it doesn't understand what that might alias.
       fprintf(fp,"  const Type            *bottom_type() const { return TypeRawPtr::BOTTOM; } // Box?\n");
     }
@@ -2017,7 +2062,7 @@
 class OutputMachOperands : public OutputMap {
 public:
   OutputMachOperands(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD) {};
+    : OutputMap(hpp, cpp, globals, AD, "MachOperands") {};
 
   void declaration() { }
   void definition()  { fprintf(_cpp, "enum MachOperands {\n"); }
@@ -2052,7 +2097,7 @@
   int end_instructions;
 public:
   OutputMachOpcodes(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
-    : OutputMap(hpp, cpp, globals, AD),
+    : OutputMap(hpp, cpp, globals, AD, "MachOpcodes"),
       begin_inst_chain_rule(-1), end_inst_chain_rule(-1), end_instructions(-1)
   {};
 
--- a/hotspot/src/share/vm/asm/assembler.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/asm/assembler.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/asm/assembler.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/asm/assembler.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/asm/register.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/asm/register.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_Canonicalizer.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Canonicalizer.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_Compilation.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Compilation.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -32,6 +32,7 @@
 #include "c1/c1_ValueMap.hpp"
 #include "c1/c1_ValueStack.hpp"
 #include "code/debugInfoRec.hpp"
+#include "compiler/compileLog.hpp"
 
 
 typedef enum {
@@ -67,10 +68,25 @@
 class PhaseTraceTime: public TraceTime {
  private:
   JavaThread* _thread;
+  CompileLog* _log;
 
  public:
-  PhaseTraceTime(TimerName timer):
-    TraceTime("", &timers[timer], CITime || CITimeEach, Verbose) {
+  PhaseTraceTime(TimerName timer)
+  : TraceTime("", &timers[timer], CITime || CITimeEach, Verbose), _log(NULL) {
+    if (Compilation::current() != NULL) {
+      _log = Compilation::current()->log();
+    }
+
+    if (_log != NULL) {
+      _log->begin_head("phase name='%s'", timer_name[timer]);
+      _log->stamp();
+      _log->end_head();
+    }
+  }
+
+  ~PhaseTraceTime() {
+    if (_log != NULL)
+      _log->done("phase");
   }
 };
 
@@ -390,6 +406,10 @@
     PhaseTraceTime timeit(_t_codeinstall);
     install_code(frame_size);
   }
+
+  if (log() != NULL) // Print code cache state into compiler log
+    log()->code_cache_state();
+
   totalInstructionNodes += Instruction::number_of_instructions();
 }
 
@@ -456,6 +476,7 @@
                          int osr_bci, BufferBlob* buffer_blob)
 : _compiler(compiler)
 , _env(env)
+, _log(env->log())
 , _method(method)
 , _osr_bci(osr_bci)
 , _hir(NULL)
--- a/hotspot/src/share/vm/c1/c1_Compilation.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Compilation.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -66,6 +66,7 @@
   int _next_block_id;
   AbstractCompiler*  _compiler;
   ciEnv*             _env;
+  CompileLog*        _log;
   ciMethod*          _method;
   int                _osr_bci;
   IR*                _hir;
@@ -123,6 +124,7 @@
 
   // accessors
   ciEnv* env() const                             { return _env; }
+  CompileLog* log() const                        { return _log; }
   AbstractCompiler* compiler() const             { return _compiler; }
   bool has_exception_handlers() const            { return _has_exception_handlers; }
   bool has_fpu_code() const                      { return _has_fpu_code; }
--- a/hotspot/src/share/vm/c1/c1_Compiler.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Compiler.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_FrameMap.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_FrameMap.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_FrameMap.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_FrameMap.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1682,6 +1682,12 @@
   ciInstanceKlass* callee_holder = ciEnv::get_instance_klass_for_declared_method_holder(holder);
   ciInstanceKlass* actual_recv = callee_holder;
 
+  CompileLog* log = compilation()->log();
+  if (log != NULL)
+      log->elem("call method='%d' instr='%s'",
+                log->identify(target),
+                Bytecodes::name(code));
+
   // Some methods are obviously bindable without any type checks so
   // convert them directly to an invokespecial or invokestatic.
   if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) {
@@ -1826,6 +1832,7 @@
     }
     code = Bytecodes::_invokespecial;
   }
+
   // check if we could do inlining
   if (!PatchALot && Inline && klass->is_loaded() &&
       (klass->is_initialized() || klass->is_interface() && target->holder()->is_initialized())
@@ -2448,6 +2455,7 @@
 #endif
   _skip_block = false;
   assert(state() != NULL, "ValueStack missing!");
+  CompileLog* log = compilation()->log();
   ciBytecodeStream s(method());
   s.reset_to_bci(bci);
   int prev_bci = bci;
@@ -2466,6 +2474,9 @@
          (block_at(s.cur_bci()) == NULL || block_at(s.cur_bci()) == block())) {
     assert(state()->kind() == ValueStack::Parsing, "invalid state kind");
 
+    if (log != NULL)
+      log->set_context("bc code='%d' bci='%d'", (int)code, s.cur_bci());
+
     // Check for active jsr during OSR compilation
     if (compilation()->is_osr_compile()
         && scope()->is_top_scope()
@@ -2686,8 +2697,13 @@
       case Bytecodes::_breakpoint     : BAILOUT_("concurrent setting of breakpoint", NULL);
       default                         : ShouldNotReachHere(); break;
     }
+
+    if (log != NULL)
+      log->clear_context(); // skip marker if nothing was printed
+
     // save current bci to setup Goto at the end
     prev_bci = s.cur_bci();
+
   }
   CHECK_BAILOUT_(NULL);
   // stop processing of this block (see try_inline_full)
@@ -3667,7 +3683,7 @@
       INLINE_BAILOUT("total inlining greater than DesiredMethodLimit");
     }
     // printing
-    print_inlining(callee, "");
+    print_inlining(callee);
   }
 
   // NOTE: Bailouts from this point on, which occur at the
@@ -4133,8 +4149,19 @@
 
 
 void GraphBuilder::print_inlining(ciMethod* callee, const char* msg, bool success) {
+  CompileLog* log = compilation()->log();
+  if (log != NULL) {
+    if (success) {
+      if (msg != NULL)
+        log->inline_success(msg);
+      else
+        log->inline_success("receiver is statically known");
+    } else {
+      log->inline_fail(msg);
+    }
+  }
+
   if (!PrintInlining)  return;
-  assert(msg != NULL, "must be");
   CompileTask::print_inlining(callee, scope()->level(), bci(), msg);
   if (success && CIPrintMethodCodes) {
     callee->print_codes();
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -31,6 +31,7 @@
 #include "c1/c1_ValueStack.hpp"
 #include "ci/ciMethodData.hpp"
 #include "ci/ciStreams.hpp"
+#include "compiler/compileLog.hpp"
 
 class MemoryBuffer;
 
@@ -369,7 +370,7 @@
   void append_unsafe_CAS(ciMethod* callee);
   bool append_unsafe_get_and_set_obj(ciMethod* callee, bool is_add);
 
-  void print_inlining(ciMethod* callee, const char* msg, bool success = true);
+  void print_inlining(ciMethod* callee, const char* msg = NULL, bool success = true);
 
   void profile_call(ciMethod* callee, Value recv, ciKlass* predicted_holder);
   void profile_invocation(ciMethod* inlinee, ValueStack* state);
--- a/hotspot/src/share/vm/c1/c1_IR.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_IR.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_IR.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_IR.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_InstructionPrinter.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_InstructionPrinter.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1286,7 +1286,7 @@
   if (x->needs_null_check()) {
     info = state_for(x);
   }
-  __ move(new LIR_Address(rcvr.result(), oopDesc::klass_offset_in_bytes(), UseCompressedKlassPointers ? T_OBJECT : T_ADDRESS), result, info);
+  __ move(new LIR_Address(rcvr.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), result, info);
   __ move_wide(new LIR_Address(result, in_bytes(Klass::java_mirror_offset()), T_OBJECT), result);
 }
 
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_LinearScan.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_Optimizer.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Optimizer.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -29,6 +29,7 @@
 #include "c1/c1_ValueSet.hpp"
 #include "c1/c1_ValueStack.hpp"
 #include "utilities/bitMap.inline.hpp"
+#include "compiler/compileLog.hpp"
 
 define_array(ValueSetArray, ValueSet*);
 define_stack(ValueSetList, ValueSetArray);
@@ -54,7 +55,18 @@
       // substituted some ifops/phis, so resolve the substitution
       SubstitutionResolver sr(_hir);
     }
+
+    CompileLog* log = _hir->compilation()->log();
+    if (log != NULL)
+      log->set_context("optimize name='cee'");
   }
+
+  ~CE_Eliminator() {
+    CompileLog* log = _hir->compilation()->log();
+    if (log != NULL)
+      log->clear_context(); // skip marker if nothing was printed
+  }
+
   int cee_count() const                          { return _cee_count; }
   int ifop_count() const                         { return _ifop_count; }
 
@@ -306,6 +318,15 @@
   , _merge_count(0)
   {
     _hir->iterate_preorder(this);
+    CompileLog* log = _hir->compilation()->log();
+    if (log != NULL)
+      log->set_context("optimize name='eliminate_blocks'");
+  }
+
+  ~BlockMerger() {
+    CompileLog* log = _hir->compilation()->log();
+    if (log != NULL)
+      log->clear_context(); // skip marker if nothing was printed
   }
 
   bool try_merge(BlockBegin* block) {
@@ -574,6 +595,15 @@
     , _work_list(new BlockList()) {
     _visitable_instructions = new ValueSet();
     _visitor.set_eliminator(this);
+    CompileLog* log = _opt->ir()->compilation()->log();
+    if (log != NULL)
+      log->set_context("optimize name='null_check_elimination'");
+  }
+
+  ~NullCheckEliminator() {
+    CompileLog* log = _opt->ir()->compilation()->log();
+    if (log != NULL)
+      log->clear_context(); // skip marker if nothing was printed
   }
 
   Optimizer*  opt()                               { return _opt; }
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -327,7 +327,7 @@
   //       anymore after new_typeArray() and no GC can happen before.
   //       (This may have to change if this code changes!)
   assert(klass->is_klass(), "not a class");
-  BasicType elt_type = typeArrayKlass::cast(klass)->element_type();
+  BasicType elt_type = TypeArrayKlass::cast(klass)->element_type();
   oop obj = oopFactory::new_typeArray(elt_type, length, CHECK);
   thread->set_vm_result(obj);
   // This is pretty rare but this runtime patch is stressful to deoptimization
@@ -346,7 +346,7 @@
   //       anymore after new_objArray() and no GC can happen before.
   //       (This may have to change if this code changes!)
   assert(array_klass->is_klass(), "not a class");
-  Klass* elem_klass = objArrayKlass::cast(array_klass)->element_klass();
+  Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass();
   objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK);
   thread->set_vm_result(obj);
   // This is pretty rare but this runtime patch is stressful to deoptimization
@@ -362,7 +362,7 @@
 
   assert(klass->is_klass(), "not a class");
   assert(rank >= 1, "rank must be nonzero");
-  oop obj = arrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
+  oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
   thread->set_vm_result(obj);
 JRT_END
 
@@ -1234,8 +1234,8 @@
     bs->write_ref_array((HeapWord*)dst_addr, length);
     return ac_ok;
   } else {
-    Klass* bound = objArrayKlass::cast(dst->klass())->element_klass();
-    Klass* stype = objArrayKlass::cast(src->klass())->element_klass();
+    Klass* bound = ObjArrayKlass::cast(dst->klass())->element_klass();
+    Klass* stype = ObjArrayKlass::cast(src->klass())->element_klass();
     if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
       // Elements are guaranteed to be subtypes, so no check necessary
       bs->write_ref_array_pre(dst_addr, length);
@@ -1263,7 +1263,7 @@
   if (src->is_typeArray()) {
     Klass* const klass_oop = src->klass();
     if (klass_oop != dst->klass()) return ac_failed;
-    typeArrayKlass* klass = typeArrayKlass::cast(klass_oop);
+    TypeArrayKlass* klass = TypeArrayKlass::cast(klass_oop);
     const int l2es = klass->log2_element_size();
     const int ihs = klass->array_header_in_bytes() / wordSize;
     char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es);
--- a/hotspot/src/share/vm/c1/c1_ValueMap.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_ValueMap.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_ValueStack.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_ValueStack.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/c1/c1_ValueStack.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_ValueStack.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/ci/ciArrayKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciArrayKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -31,7 +31,7 @@
 // ciArrayKlass
 //
 // This class represents a Klass* in the HotSpot virtual machine
-// whose Klass part in an arrayKlass.
+// whose Klass part in an ArrayKlass.
 
 // ------------------------------------------------------------------
 // ciArrayKlass::ciArrayKlass
@@ -39,7 +39,7 @@
 // Loaded array klass.
 ciArrayKlass::ciArrayKlass(KlassHandle h_k) : ciKlass(h_k) {
   assert(get_Klass()->oop_is_array(), "wrong type");
-  _dimension = get_arrayKlass()->dimension();
+  _dimension = get_ArrayKlass()->dimension();
 }
 
 // ------------------------------------------------------------------
--- a/hotspot/src/share/vm/ci/ciArrayKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciArrayKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -30,7 +30,7 @@
 // ciArrayKlass
 //
 // This class, and its subclasses represent Klass*s in the
-// HotSpot virtual machine whose Klass part is an arrayKlass.
+// HotSpot virtual machine whose Klass part is an ArrayKlass.
 class ciArrayKlass : public ciKlass {
   CI_PACKAGE_ACCESS
 private:
@@ -40,8 +40,8 @@
   ciArrayKlass(KlassHandle h_k);
   ciArrayKlass(ciSymbol* name, int dimension, BasicType bt);
 
-  arrayKlass* get_arrayKlass() {
-    return (arrayKlass*)get_Klass();
+  ArrayKlass* get_ArrayKlass() {
+    return (ArrayKlass*)get_Klass();
   }
 
   const char* type_string() { return "ciArrayKlass"; }
@@ -53,7 +53,7 @@
   bool is_leaf_type();          // No subtypes of this array type.
 
   ciInstance* component_mirror() {
-    // This is a real field in arrayKlass, but we derive it from element_type.
+    // This is a real field in ArrayKlass, but we derive it from element_type.
     return element_type()->java_mirror();
   }
 
--- a/hotspot/src/share/vm/ci/ciEnv.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -326,7 +326,7 @@
 
   if (resolved_klass->oop_is_objArray()) {
     // Find the element klass, if this is an array.
-    resolved_klass = objArrayKlass::cast(resolved_klass)->bottom_klass();
+    resolved_klass = ObjArrayKlass::cast(resolved_klass)->bottom_klass();
   }
   if (resolved_klass->oop_is_instance()) {
     return Reflection::verify_class_access(accessing_klass->get_Klass(),
@@ -1126,7 +1126,8 @@
       if (all_tiers) {
         log()->elem("method_not_compilable");
       } else {
-        log()->elem("method_not_compilable_at_tier");
+        log()->elem("method_not_compilable_at_tier level='%d'",
+                    current()->task()->comp_level());
       }
     }
     _compilable = new_compilable;
--- a/hotspot/src/share/vm/ci/ciKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -33,7 +33,7 @@
 // HotSpot virtual machine.  In the vm, each Klass* contains an
 // embedded Klass object.  ciKlass is subclassed to explicitly
 // represent the kind of Klass embedded in the Klass*.  For
-// example, a Klass* with an embedded objArrayKlass object is
+// example, a Klass* with an embedded ObjArrayKlass object is
 // represented in the ciObject hierarchy by the class
 // ciObjArrayKlass.
 class ciKlass : public ciType {
--- a/hotspot/src/share/vm/ci/ciMethodHandle.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciMethodHandle.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, 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
--- a/hotspot/src/share/vm/ci/ciObjArrayKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciObjArrayKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -32,7 +32,7 @@
 // ciObjArrayKlass
 //
 // This class represents a Klass* in the HotSpot virtual machine
-// whose Klass part is an objArrayKlass.
+// whose Klass part is an ObjArrayKlass.
 
 // ------------------------------------------------------------------
 // ciObjArrayKlass::ciObjArrayKlass
@@ -40,7 +40,7 @@
 // Constructor for loaded object array klasses.
 ciObjArrayKlass::ciObjArrayKlass(KlassHandle h_k) : ciArrayKlass(h_k) {
   assert(get_Klass()->oop_is_objArray(), "wrong type");
-  Klass* element_Klass = get_objArrayKlass()->bottom_klass();
+  Klass* element_Klass = get_ObjArrayKlass()->bottom_klass();
   _base_element_klass = CURRENT_ENV->get_klass(element_Klass);
   assert(_base_element_klass->is_instance_klass() ||
          _base_element_klass->is_type_array_klass(), "bad base klass");
@@ -83,7 +83,7 @@
     // Produce the element klass.
     if (is_loaded()) {
       VM_ENTRY_MARK;
-      Klass* element_Klass = get_objArrayKlass()->element_klass();
+      Klass* element_Klass = get_ObjArrayKlass()->element_klass();
       _element_klass = CURRENT_THREAD_ENV->get_klass(element_Klass);
     } else {
       VM_ENTRY_MARK;
--- a/hotspot/src/share/vm/ci/ciObjArrayKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciObjArrayKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -30,7 +30,7 @@
 // ciObjArrayKlass
 //
 // This class represents a Klass* in the HotSpot virtual machine
-// whose Klass part is an objArrayKlass.
+// whose Klass part is an ObjArrayKlass.
 class ciObjArrayKlass : public ciArrayKlass {
   CI_PACKAGE_ACCESS
   friend class ciEnv;
@@ -45,8 +45,8 @@
                   ciKlass* base_element_klass,
                   int dimension);
 
-  objArrayKlass* get_objArrayKlass() {
-    return (objArrayKlass*)get_Klass();
+  ObjArrayKlass* get_ObjArrayKlass() {
+    return (ObjArrayKlass*)get_Klass();
   }
 
   static ciObjArrayKlass* make_impl(ciKlass* element_klass);
--- a/hotspot/src/share/vm/ci/ciObjectFactory.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciObjectFactory.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -146,7 +146,7 @@
 
   for (int i = T_BOOLEAN; i <= T_CONFLICT; i++) {
     BasicType t = (BasicType)i;
-    if (type2name(t) != NULL && t != T_OBJECT && t != T_ARRAY && t != T_NARROWOOP) {
+    if (type2name(t) != NULL && t != T_OBJECT && t != T_ARRAY && t != T_NARROWOOP && t != T_NARROWKLASS) {
       ciType::_basic_types[t] = new (_arena) ciType(t);
       init_ident_of(ciType::_basic_types[t]);
     }
@@ -174,7 +174,7 @@
   }
 
   ciEnv::_unloaded_cisymbol = ciObjectFactory::get_symbol(vmSymbols::dummy_symbol());
-  // Create dummy InstanceKlass and objArrayKlass object and assign them idents
+  // Create dummy InstanceKlass and ObjArrayKlass object and assign them idents
   ciEnv::_unloaded_ciinstance_klass = new (_arena) ciInstanceKlass(ciEnv::_unloaded_cisymbol, NULL, NULL);
   init_ident_of(ciEnv::_unloaded_ciinstance_klass);
   ciEnv::_unloaded_ciobjarrayklass = new (_arena) ciObjArrayKlass(ciEnv::_unloaded_cisymbol, ciEnv::_unloaded_ciinstance_klass, 1);
@@ -454,7 +454,7 @@
   // the cache.
   ciKlass* new_klass = NULL;
 
-  // Two cases: this is an unloaded objArrayKlass or an
+  // Two cases: this is an unloaded ObjArrayKlass or an
   // unloaded InstanceKlass.  Deal with both.
   if (name->byte_at(0) == '[') {
     // Decompose the name.'
@@ -480,7 +480,7 @@
       // The type array itself takes care of one of the dimensions.
       dimension--;
 
-      // The element klass is a typeArrayKlass.
+      // The element klass is a TypeArrayKlass.
       element_klass = ciTypeArrayKlass::make(element_type);
     }
     new_klass = new (arena()) ciObjArrayKlass(name, element_klass, dimension);
--- a/hotspot/src/share/vm/ci/ciSignature.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciSignature.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/ci/ciSymbol.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciSymbol.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/ci/ciTypeArrayKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciTypeArrayKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -35,7 +35,7 @@
 // ciTypeArrayKlass::ciTypeArrayKlass
 ciTypeArrayKlass::ciTypeArrayKlass(KlassHandle h_k) : ciArrayKlass(h_k) {
   assert(get_Klass()->oop_is_typeArray(), "wrong type");
-  assert(element_type() == get_typeArrayKlass()->element_type(), "");
+  assert(element_type() == get_TypeArrayKlass()->element_type(), "");
 }
 
 // ------------------------------------------------------------------
--- a/hotspot/src/share/vm/ci/ciTypeArrayKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciTypeArrayKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -37,8 +37,8 @@
 protected:
   ciTypeArrayKlass(KlassHandle h_k);
 
-  typeArrayKlass* get_typeArrayKlass() {
-    return (typeArrayKlass*)get_Klass();
+  TypeArrayKlass* get_TypeArrayKlass() {
+    return (TypeArrayKlass*)get_Klass();
   }
 
   const char* type_string() { return "ciTypeArrayKlass"; }
--- a/hotspot/src/share/vm/ci/ciTypeFlow.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciTypeFlow.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -782,7 +782,7 @@
 
 Array<Klass*>* ClassFileParser::parse_interfaces(constantPoolHandle cp,
                                                  int length,
-                                                   ClassLoaderData* loader_data,
+                                                 ClassLoaderData* loader_data,
                                                  Handle protection_domain,
                                                  Symbol* class_name,
                                                  TRAPS) {
@@ -816,9 +816,6 @@
                     unresolved_klass, class_loader, protection_domain,
                     false, CHECK_NULL);
       interf = KlassHandle(THREAD, k);
-
-      if (LinkWellKnownClasses)  // my super type is well known to me
-        cp->klass_at_put(interface_index, interf()); // eagerly resolve
     }
 
     if (!Klass::cast(interf())->is_interface()) {
@@ -1008,40 +1005,42 @@
   BAD_ALLOCATION_TYPE, // 1
   BAD_ALLOCATION_TYPE, // 2
   BAD_ALLOCATION_TYPE, // 3
-  NONSTATIC_BYTE ,     // T_BOOLEAN  =  4,
-  NONSTATIC_SHORT,     // T_CHAR     =  5,
-  NONSTATIC_WORD,      // T_FLOAT    =  6,
-  NONSTATIC_DOUBLE,    // T_DOUBLE   =  7,
-  NONSTATIC_BYTE,      // T_BYTE     =  8,
-  NONSTATIC_SHORT,     // T_SHORT    =  9,
-  NONSTATIC_WORD,      // T_INT      = 10,
-  NONSTATIC_DOUBLE,    // T_LONG     = 11,
-  NONSTATIC_OOP,       // T_OBJECT   = 12,
-  NONSTATIC_OOP,       // T_ARRAY    = 13,
-  BAD_ALLOCATION_TYPE, // T_VOID     = 14,
-  BAD_ALLOCATION_TYPE, // T_ADDRESS  = 15,
-  BAD_ALLOCATION_TYPE, // T_NARROWOOP= 16,
-  BAD_ALLOCATION_TYPE, // T_METADATA = 17,
-  BAD_ALLOCATION_TYPE, // T_CONFLICT = 18,
+  NONSTATIC_BYTE ,     // T_BOOLEAN     =  4,
+  NONSTATIC_SHORT,     // T_CHAR        =  5,
+  NONSTATIC_WORD,      // T_FLOAT       =  6,
+  NONSTATIC_DOUBLE,    // T_DOUBLE      =  7,
+  NONSTATIC_BYTE,      // T_BYTE        =  8,
+  NONSTATIC_SHORT,     // T_SHORT       =  9,
+  NONSTATIC_WORD,      // T_INT         = 10,
+  NONSTATIC_DOUBLE,    // T_LONG        = 11,
+  NONSTATIC_OOP,       // T_OBJECT      = 12,
+  NONSTATIC_OOP,       // T_ARRAY       = 13,
+  BAD_ALLOCATION_TYPE, // T_VOID        = 14,
+  BAD_ALLOCATION_TYPE, // T_ADDRESS     = 15,
+  BAD_ALLOCATION_TYPE, // T_NARROWOOP   = 16,
+  BAD_ALLOCATION_TYPE, // T_METADATA    = 17,
+  BAD_ALLOCATION_TYPE, // T_NARROWKLASS = 18,
+  BAD_ALLOCATION_TYPE, // T_CONFLICT    = 19,
   BAD_ALLOCATION_TYPE, // 0
   BAD_ALLOCATION_TYPE, // 1
   BAD_ALLOCATION_TYPE, // 2
   BAD_ALLOCATION_TYPE, // 3
-  STATIC_BYTE ,        // T_BOOLEAN  =  4,
-  STATIC_SHORT,        // T_CHAR     =  5,
-  STATIC_WORD,          // T_FLOAT    =  6,
-  STATIC_DOUBLE,       // T_DOUBLE   =  7,
-  STATIC_BYTE,         // T_BYTE     =  8,
-  STATIC_SHORT,        // T_SHORT    =  9,
-  STATIC_WORD,         // T_INT      = 10,
-  STATIC_DOUBLE,       // T_LONG     = 11,
-  STATIC_OOP,          // T_OBJECT   = 12,
-  STATIC_OOP,          // T_ARRAY    = 13,
-  BAD_ALLOCATION_TYPE, // T_VOID     = 14,
-  BAD_ALLOCATION_TYPE, // T_ADDRESS  = 15,
-  BAD_ALLOCATION_TYPE, // T_NARROWOOP= 16,
-  BAD_ALLOCATION_TYPE, // T_METADATA = 17,
-  BAD_ALLOCATION_TYPE, // T_CONFLICT = 18,
+  STATIC_BYTE ,        // T_BOOLEAN     =  4,
+  STATIC_SHORT,        // T_CHAR        =  5,
+  STATIC_WORD,         // T_FLOAT       =  6,
+  STATIC_DOUBLE,       // T_DOUBLE      =  7,
+  STATIC_BYTE,         // T_BYTE        =  8,
+  STATIC_SHORT,        // T_SHORT       =  9,
+  STATIC_WORD,         // T_INT         = 10,
+  STATIC_DOUBLE,       // T_LONG        = 11,
+  STATIC_OOP,          // T_OBJECT      = 12,
+  STATIC_OOP,          // T_ARRAY       = 13,
+  BAD_ALLOCATION_TYPE, // T_VOID        = 14,
+  BAD_ALLOCATION_TYPE, // T_ADDRESS     = 15,
+  BAD_ALLOCATION_TYPE, // T_NARROWOOP   = 16,
+  BAD_ALLOCATION_TYPE, // T_METADATA    = 17,
+  BAD_ALLOCATION_TYPE, // T_NARROWKLASS = 18,
+  BAD_ALLOCATION_TYPE, // T_CONFLICT    = 19,
 };
 
 static FieldAllocationType basic_type_to_atype(bool is_static, BasicType type) {
@@ -1072,10 +1071,11 @@
 
 Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data,
                                          Symbol* class_name,
-                                              constantPoolHandle cp, bool is_interface,
-                                              FieldAllocationCount *fac,
+                                         constantPoolHandle cp,
+                                         bool is_interface,
+                                         FieldAllocationCount *fac,
                                          Array<AnnotationArray*>** fields_annotations,
-                                              u2* java_fields_count_ptr, TRAPS) {
+                                         u2* java_fields_count_ptr, TRAPS) {
   ClassFileStream* cfs = stream();
   cfs->guarantee_more(2, CHECK_NULL);  // length
   u2 length = cfs->get_u2_fast();
@@ -2169,14 +2169,12 @@
   }
 
   // All sizing information for a Method* is finally available, now create it
-  Method* m = Method::allocate(loader_data,
-                                        code_length,
-                                        access_flags,
-                                            linenumber_table_length,
-                                            total_lvt_length,
-                                            exception_table_length,
-                                            checked_exceptions_length,
-                                            CHECK_(nullHandle));
+  Method* m = Method::allocate(loader_data, code_length, access_flags,
+                               linenumber_table_length,
+                               total_lvt_length,
+                               exception_table_length,
+                               checked_exceptions_length,
+                               CHECK_(nullHandle));
 
   ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
 
@@ -2351,14 +2349,14 @@
 // are added to klass's access_flags.
 
 Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data,
-                                                 constantPoolHandle cp,
-                                                 bool is_interface,
-                                              AccessFlags* promoted_flags,
-                                              bool* has_final_method,
-                                                 Array<AnnotationArray*>** methods_annotations,
-                                                 Array<AnnotationArray*>** methods_parameter_annotations,
-                                                 Array<AnnotationArray*>** methods_default_annotations,
-                                              TRAPS) {
+                                               constantPoolHandle cp,
+                                               bool is_interface,
+                                               AccessFlags* promoted_flags,
+                                               bool* has_final_method,
+                                               Array<AnnotationArray*>** methods_annotations,
+                                               Array<AnnotationArray*>** methods_parameter_annotations,
+                                               Array<AnnotationArray*>** methods_default_annotations,
+                                               TRAPS) {
   ClassFileStream* cfs = stream();
   AnnotationArray* method_annotations = NULL;
   AnnotationArray* method_parameter_annotations = NULL;
@@ -2450,10 +2448,9 @@
   }
   // Sort method array by ascending method name (for faster lookups & vtable construction)
   // Note that the ordering is not alphabetical, see Symbol::fast_compare
-  Method::sort_methods(methods,
-                              methods_annotations,
-                              methods_parameter_annotations,
-                              methods_default_annotations);
+  Method::sort_methods(methods, methods_annotations,
+                       methods_parameter_annotations,
+                       methods_default_annotations);
 
   // If JVMTI original method ordering or sharing is enabled construct int
   // array remembering the original ordering
@@ -2835,10 +2832,10 @@
   }
   AnnotationArray* annotations = assemble_annotations(loader_data,
                                                       runtime_visible_annotations,
-                                                     runtime_visible_annotations_length,
-                                                     runtime_invisible_annotations,
-                                                     runtime_invisible_annotations_length,
-                                                     CHECK);
+                                                      runtime_visible_annotations_length,
+                                                      runtime_invisible_annotations,
+                                                      runtime_invisible_annotations_length,
+                                                      CHECK);
   set_class_annotations(annotations);
 
   if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) {
@@ -2884,9 +2881,9 @@
 
 AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_data,
                                                        u1* runtime_visible_annotations,
-                                                      int runtime_visible_annotations_length,
-                                                      u1* runtime_invisible_annotations,
-                                                      int runtime_invisible_annotations_length, TRAPS) {
+                                                       int runtime_visible_annotations_length,
+                                                       u1* runtime_invisible_annotations,
+                                                       int runtime_invisible_annotations_length, TRAPS) {
   AnnotationArray* annotations = NULL;
   if (runtime_visible_annotations != NULL ||
       runtime_invisible_annotations != NULL) {
@@ -3161,13 +3158,13 @@
     Array<AnnotationArray*>* methods_parameter_annotations = NULL;
     Array<AnnotationArray*>* methods_default_annotations = NULL;
     Array<Method*>* methods = parse_methods(loader_data,
-                                              cp, access_flags.is_interface(),
-                                           &promoted_flags,
-                                           &has_final_method,
-                                              &methods_annotations,
-                                              &methods_parameter_annotations,
-                                              &methods_default_annotations,
-                                           CHECK_(nullHandle));
+                                            cp, access_flags.is_interface(),
+                                            &promoted_flags,
+                                            &has_final_method,
+                                            &methods_annotations,
+                                            &methods_parameter_annotations,
+                                            &methods_default_annotations,
+                                            CHECK_(nullHandle));
 
     // Additional attributes
     ClassAnnotationCollector parsed_annotations;
@@ -3186,17 +3183,14 @@
                            "Interfaces must have java.lang.Object as superclass in class file %s",
                            CHECK_(nullHandle));
       }
-      Klass* k = SystemDictionary::resolve_super_or_fail(class_name,
-                                                           sk,
-                                                           class_loader,
-                                                           protection_domain,
-                                                           true,
-                                                           CHECK_(nullHandle));
+      Klass* k = SystemDictionary::resolve_super_or_fail(class_name, sk,
+                                                         class_loader,
+                                                         protection_domain,
+                                                         true,
+                                                         CHECK_(nullHandle));
 
       KlassHandle kh (THREAD, k);
       super_klass = instanceKlassHandle(THREAD, kh());
-      if (LinkWellKnownClasses)  // my super class is well known to me
-        cp->klass_at_put(super_class_index, super_klass()); // eagerly resolve
     }
     if (super_klass.not_null()) {
       if (super_klass->is_interface()) {
@@ -3222,10 +3216,10 @@
     // sort methods
     Array<int>* method_ordering = sort_methods(loader_data,
                                                methods,
-                                                   methods_annotations,
-                                                   methods_parameter_annotations,
-                                                   methods_default_annotations,
-                                                   CHECK_(nullHandle));
+                                               methods_annotations,
+                                               methods_parameter_annotations,
+                                               methods_default_annotations,
+                                               CHECK_(nullHandle));
 
     // promote flags from parse_methods() to the klass' flags
     access_flags.add_promoted_flags(promoted_flags.as_int());
@@ -3591,16 +3585,16 @@
       InstanceKlass::nonstatic_oop_map_size(total_oop_map_count);
 
     Klass* ik = InstanceKlass::allocate_instance_klass(loader_data,
-                                                         vtable_size,
-                                                         itable_size,
-                                                static_field_size,
-                                                         total_oop_map_size2,
-                                                         rt,
-                                                access_flags,
-                                                         name,
-                                                         super_klass(),
-                                                         host_klass,
-                                                CHECK_(nullHandle));
+                                                       vtable_size,
+                                                       itable_size,
+                                                       static_field_size,
+                                                       total_oop_map_size2,
+                                                       rt,
+                                                       access_flags,
+                                                       name,
+                                                       super_klass(),
+                                                       host_klass,
+                                                       CHECK_(nullHandle));
 
     // Add all classes to our internal class loader list here,
     // including classes in the bootstrap (NULL) class loader.
@@ -3642,7 +3636,7 @@
     // has to be changed accordingly.
     this_klass->set_initial_method_idnum(methods->length());
     this_klass->set_name(cp->klass_name_at(this_class_index));
-    if (LinkWellKnownClasses || is_anonymous())  // I am well known to myself
+    if (is_anonymous())  // I am well known to myself
       cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve
 
     if (fields_annotations != NULL ||
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classFileParser.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -148,7 +148,7 @@
   // Interface parsing
   Array<Klass*>* parse_interfaces(constantPoolHandle cp,
                                   int length,
-                                    ClassLoaderData* loader_data,
+                                  ClassLoaderData* loader_data,
                                   Handle protection_domain,
                                   Symbol* class_name,
                                   TRAPS);
@@ -166,10 +166,10 @@
                               TRAPS);
   Array<u2>* parse_fields(ClassLoaderData* loader_data,
                           Symbol* class_name,
-                               constantPoolHandle cp, bool is_interface,
-                               FieldAllocationCount *fac,
+                          constantPoolHandle cp, bool is_interface,
+                          FieldAllocationCount *fac,
                           Array<AnnotationArray*>** fields_annotations,
-                               u2* java_fields_count_ptr, TRAPS);
+                          u2* java_fields_count_ptr, TRAPS);
 
   // Method parsing
   methodHandle parse_method(ClassLoaderData* loader_data,
@@ -181,13 +181,13 @@
                             AnnotationArray** method_default_annotations,
                             TRAPS);
   Array<Method*>* parse_methods(ClassLoaderData* loader_data,
-                                  constantPoolHandle cp,
-                                  bool is_interface,
+                                constantPoolHandle cp,
+                                bool is_interface,
                                 AccessFlags* promoted_flags,
                                 bool* has_final_method,
-                                  Array<AnnotationArray*>** methods_annotations,
-                                  Array<AnnotationArray*>** methods_parameter_annotations,
-                                  Array<AnnotationArray*>** methods_default_annotations,
+                                Array<AnnotationArray*>** methods_annotations,
+                                Array<AnnotationArray*>** methods_parameter_annotations,
+                                Array<AnnotationArray*>** methods_default_annotations,
                                 TRAPS);
   Array<int>* sort_methods(ClassLoaderData* loader_data,
                            Array<Method*>* methods,
@@ -232,9 +232,9 @@
   // Annotations handling
   AnnotationArray* assemble_annotations(ClassLoaderData* loader_data,
                                         u1* runtime_visible_annotations,
-                                       int runtime_visible_annotations_length,
-                                       u1* runtime_invisible_annotations,
-                                       int runtime_invisible_annotations_length, TRAPS);
+                                        int runtime_visible_annotations_length,
+                                        u1* runtime_invisible_annotations,
+                                        int runtime_invisible_annotations_length, TRAPS);
   int skip_annotation(u1* buffer, int limit, int index);
   int skip_annotation_value(u1* buffer, int limit, int index);
   void parse_annotations(u1* buffer, int limit, constantPoolHandle cp,
@@ -252,8 +252,8 @@
                      unsigned int* nonstatic_oop_counts);
   void set_precomputed_flags(instanceKlassHandle k);
   Array<Klass*>* compute_transitive_interfaces(ClassLoaderData* loader_data,
-                                                 instanceKlassHandle super,
-                                                 Array<Klass*>* local_ifs, TRAPS);
+                                               instanceKlassHandle super,
+                                               Array<Klass*>* local_ifs, TRAPS);
 
   // Format checker methods
   void classfile_parse_error(const char* msg, TRAPS);
@@ -344,7 +344,7 @@
   // constant pool construction, but in later versions they can.
   // %%% Let's phase out the old is_klass_reference.
   bool is_klass_reference(constantPoolHandle cp, int index) {
-    return ((LinkWellKnownClasses || EnableInvokeDynamic)
+    return (EnableInvokeDynamic
             ? cp->tag_at(index).is_klass_or_reference()
             : cp->tag_at(index).is_klass_reference());
   }
--- a/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/classfile/javaAssertions.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/javaAssertions.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -540,18 +540,18 @@
     if (k->oop_is_array()) {
       Handle comp_mirror;
       if (k->oop_is_typeArray()) {
-        BasicType type = typeArrayKlass::cast(k())->element_type();
+        BasicType type = TypeArrayKlass::cast(k())->element_type();
         comp_mirror = Universe::java_mirror(type);
       } else {
         assert(k->oop_is_objArray(), "Must be");
-        Klass* element_klass = objArrayKlass::cast(k())->element_klass();
+        Klass* element_klass = ObjArrayKlass::cast(k())->element_klass();
         assert(element_klass != NULL, "Must have an element klass");
           comp_mirror = Klass::cast(element_klass)->java_mirror();
       }
       assert(comp_mirror.not_null(), "must have a mirror");
 
         // Two-way link between the array klass and its component mirror:
-      arrayKlass::cast(k())->set_component_mirror(comp_mirror());
+      ArrayKlass::cast(k())->set_component_mirror(comp_mirror());
       set_array_klass(comp_mirror(), k());
     } else {
       assert(k->oop_is_instance(), "Must be");
@@ -704,7 +704,7 @@
 #ifdef ASSERT
   if (is_primitive) {
     Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
-    assert(k == NULL || is_java_primitive(arrayKlass::cast(k)->element_type()),
+    assert(k == NULL || is_java_primitive(ArrayKlass::cast(k)->element_type()),
         "Should be either the T_VOID primitive or a java primitive");
   }
 #endif
@@ -719,7 +719,7 @@
   BasicType type = T_VOID;
   if (ak != NULL) {
     // Note: create_basic_type_mirror above initializes ak to a non-null value.
-    type = arrayKlass::cast(ak)->element_type();
+    type = ArrayKlass::cast(ak)->element_type();
   } else {
     assert(java_class == Universe::void_mirror(), "only valid non-array primitive");
   }
@@ -846,7 +846,7 @@
 
 typeArrayOop java_lang_Thread::name(oop java_thread) {
   oop name = java_thread->obj_field(_name_offset);
-  assert(name == NULL || (name->is_typeArray() && typeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking");
+  assert(name == NULL || (name->is_typeArray() && TypeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking");
   return typeArrayOop(name);
 }
 
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -244,7 +244,7 @@
     }
   } else {
     k = Universe::typeArrayKlassObj(t);
-    k = typeArrayKlass::cast(k)->array_klass(fd.dimension(), CHECK_NULL);
+    k = TypeArrayKlass::cast(k)->array_klass(fd.dimension(), CHECK_NULL);
   }
   return k;
 }
@@ -291,16 +291,6 @@
                                                  Handle protection_domain,
                                                  bool is_superclass,
                                                  TRAPS) {
-
-  // Try to get one of the well-known klasses.
-  // They are trusted, and do not participate in circularities.
-  if (LinkWellKnownClasses) {
-    Klass* k = find_well_known_klass(class_name);
-    if (k != NULL) {
-      return k;
-    }
-  }
-
   // Double-check, if child class is already loaded, just return super-class,interface
   // Don't add a placedholder if already loaded, i.e. already in system dictionary
   // Make sure there's a placeholder for the *child* before resolving.
@@ -920,20 +910,12 @@
 // Look for a loaded instance or array klass by name.  Do not do any loading.
 // return NULL in case of error.
 Klass* SystemDictionary::find_instance_or_array_klass(Symbol* class_name,
-                                                        Handle class_loader,
-                                                        Handle protection_domain,
-                                                        TRAPS) {
+                                                      Handle class_loader,
+                                                      Handle protection_domain,
+                                                      TRAPS) {
   Klass* k = NULL;
   assert(class_name != NULL, "class name must be non NULL");
 
-  // Try to get one of the well-known klasses.
-  if (LinkWellKnownClasses) {
-    k = find_well_known_klass(class_name);
-    if (k != NULL) {
-      return k;
-    }
-  }
-
   if (FieldType::is_array(class_name)) {
     // The name refers to an array.  Parse the name.
     // dimension and object_key in FieldArrayInfo are assigned as a
@@ -954,48 +936,16 @@
   return k;
 }
 
-// Quick range check for names of well-known classes:
-static Symbol* wk_klass_name_limits[2] = {NULL, NULL};
-
-#ifndef PRODUCT
-static int find_wkk_calls, find_wkk_probes, find_wkk_wins;
-// counts for "hello world": 3983, 1616, 1075
-//  => 60% hit after limit guard, 25% total win rate
-#endif
-
-Klass* SystemDictionary::find_well_known_klass(Symbol* class_name) {
-  // A bounds-check on class_name will quickly get a negative result.
-  NOT_PRODUCT(find_wkk_calls++);
-  if (class_name >= wk_klass_name_limits[0] &&
-      class_name <= wk_klass_name_limits[1]) {
-    NOT_PRODUCT(find_wkk_probes++);
-    vmSymbols::SID sid = vmSymbols::find_sid(class_name);
-    if (sid != vmSymbols::NO_SID) {
-      Klass* k = NULL;
-      switch (sid) {
-        #define WK_KLASS_CASE(name, symbol, ignore_option) \
-        case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
-          k = WK_KLASS(name); break;
-        WK_KLASSES_DO(WK_KLASS_CASE)
-        #undef WK_KLASS_CASE
-      }
-      NOT_PRODUCT(if (k != NULL)  find_wkk_wins++);
-      return k;
-    }
-  }
-  return NULL;
-}
-
 // Note: this method is much like resolve_from_stream, but
 // updates no supplemental data structures.
 // TODO consolidate the two methods with a helper routine?
 Klass* SystemDictionary::parse_stream(Symbol* class_name,
-                                        Handle class_loader,
-                                        Handle protection_domain,
-                                        ClassFileStream* st,
-                                        KlassHandle host_klass,
-                                        GrowableArray<Handle>* cp_patches,
-                                        TRAPS) {
+                                      Handle class_loader,
+                                      Handle protection_domain,
+                                      ClassFileStream* st,
+                                      KlassHandle host_klass,
+                                      GrowableArray<Handle>* cp_patches,
+                                      TRAPS) {
   TempNewSymbol parsed_name = NULL;
 
   // Parse the stream. Note that we do this even though this klass might
@@ -1076,11 +1026,11 @@
 // the class until we have parsed the stream.
 
 Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
-                                               Handle class_loader,
-                                               Handle protection_domain,
-                                               ClassFileStream* st,
-                                               bool verify,
-                                               TRAPS) {
+                                             Handle class_loader,
+                                             Handle protection_domain,
+                                             ClassFileStream* st,
+                                             bool verify,
+                                             TRAPS) {
 
   // Classloaders that support parallelism, e.g. bootstrap classloader,
   // or all classloaders with UnsyncloadClass do not acquire lock here
@@ -1939,23 +1889,12 @@
     int opt  = (info & right_n_bits(CEIL_LG_OPTION_LIMIT));
 
     initialize_wk_klass((WKID)id, opt, CHECK);
-
-    // Update limits, so find_well_known_klass can be very fast:
-    Symbol* s = vmSymbols::symbol_at((vmSymbols::SID)sid);
-    if (wk_klass_name_limits[1] == NULL) {
-      wk_klass_name_limits[0] = wk_klass_name_limits[1] = s;
-    } else if (wk_klass_name_limits[1] < s) {
-      wk_klass_name_limits[1] = s;
-    } else if (wk_klass_name_limits[0] > s) {
-      wk_klass_name_limits[0] = s;
-    }
   }
 
   // move the starting value forward to the limit:
   start_id = limit_id;
 }
 
-
 void SystemDictionary::initialize_preloaded_classes(TRAPS) {
   assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
   // Preload commonly used klasses
@@ -2187,7 +2126,7 @@
   // Force the protection domain to be null.  (This removes protection checks.)
   Handle no_protection_domain;
   Klass* klass = find_instance_or_array_klass(class_name, class_loader,
-                                                no_protection_domain, CHECK_NULL);
+                                              no_protection_domain, CHECK_NULL);
   if (klass != NULL)
     return klass;
 
@@ -2525,7 +2464,7 @@
       mirror = NULL;  // safety
       // Emulate ConstantPool::verify_constant_pool_resolve.
       if (Klass::cast(sel_klass)->oop_is_objArray())
-        sel_klass = objArrayKlass::cast(sel_klass)->bottom_klass();
+        sel_klass = ObjArrayKlass::cast(sel_klass)->bottom_klass();
       if (Klass::cast(sel_klass)->oop_is_instance()) {
         KlassHandle sel_kh(THREAD, sel_klass);
         LinkResolver::check_klass_accessability(accessing_klass, sel_kh, CHECK_(empty));
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -92,93 +92,93 @@
 // The order of these definitions is significant; it is the order in which
 // preloading is actually performed by initialize_preloaded_classes.
 
-#define WK_KLASSES_DO(template)                                               \
-  /* well-known classes */                                                    \
-  template(Object_klass,                 java_lang_Object,               Pre) \
-  template(String_klass,                 java_lang_String,               Pre) \
-  template(Class_klass,                  java_lang_Class,                Pre) \
-  template(Cloneable_klass,              java_lang_Cloneable,            Pre) \
-  template(ClassLoader_klass,            java_lang_ClassLoader,          Pre) \
-  template(Serializable_klass,           java_io_Serializable,           Pre) \
-  template(System_klass,                 java_lang_System,               Pre) \
-  template(Throwable_klass,              java_lang_Throwable,            Pre) \
-  template(Error_klass,                  java_lang_Error,                Pre) \
-  template(ThreadDeath_klass,            java_lang_ThreadDeath,          Pre) \
-  template(Exception_klass,              java_lang_Exception,            Pre) \
-  template(RuntimeException_klass,       java_lang_RuntimeException,     Pre) \
-  template(ProtectionDomain_klass,       java_security_ProtectionDomain, Pre) \
-  template(AccessControlContext_klass,   java_security_AccessControlContext, Pre) \
-  template(ClassNotFoundException_klass, java_lang_ClassNotFoundException, Pre) \
-  template(NoClassDefFoundError_klass,   java_lang_NoClassDefFoundError, Pre) \
-  template(LinkageError_klass,           java_lang_LinkageError,         Pre) \
-  template(ClassCastException_klass,     java_lang_ClassCastException,   Pre) \
-  template(ArrayStoreException_klass,    java_lang_ArrayStoreException,  Pre) \
-  template(VirtualMachineError_klass,    java_lang_VirtualMachineError,  Pre) \
-  template(OutOfMemoryError_klass,       java_lang_OutOfMemoryError,     Pre) \
-  template(StackOverflowError_klass,     java_lang_StackOverflowError,   Pre) \
-  template(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre) \
-  template(Reference_klass,              java_lang_ref_Reference,        Pre) \
-                                                                              \
-  /* Preload ref klasses and set reference types */                           \
-  template(SoftReference_klass,          java_lang_ref_SoftReference,    Pre) \
-  template(WeakReference_klass,          java_lang_ref_WeakReference,    Pre) \
-  template(FinalReference_klass,         java_lang_ref_FinalReference,   Pre) \
-  template(PhantomReference_klass,       java_lang_ref_PhantomReference, Pre) \
-  template(Finalizer_klass,              java_lang_ref_Finalizer,        Pre) \
-                                                                              \
-  template(Thread_klass,                 java_lang_Thread,               Pre) \
-  template(ThreadGroup_klass,            java_lang_ThreadGroup,          Pre) \
-  template(Properties_klass,             java_util_Properties,           Pre) \
-  template(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre) \
-  template(reflect_Field_klass,          java_lang_reflect_Field,        Pre) \
-  template(reflect_Method_klass,         java_lang_reflect_Method,       Pre) \
-  template(reflect_Constructor_klass,    java_lang_reflect_Constructor,  Pre) \
-                                                                              \
+#define WK_KLASSES_DO(do_klass)                                                                                          \
+  /* well-known classes */                                                                                               \
+  do_klass(Object_klass,                                java_lang_Object,                          Pre                 ) \
+  do_klass(String_klass,                                java_lang_String,                          Pre                 ) \
+  do_klass(Class_klass,                                 java_lang_Class,                           Pre                 ) \
+  do_klass(Cloneable_klass,                             java_lang_Cloneable,                       Pre                 ) \
+  do_klass(ClassLoader_klass,                           java_lang_ClassLoader,                     Pre                 ) \
+  do_klass(Serializable_klass,                          java_io_Serializable,                      Pre                 ) \
+  do_klass(System_klass,                                java_lang_System,                          Pre                 ) \
+  do_klass(Throwable_klass,                             java_lang_Throwable,                       Pre                 ) \
+  do_klass(Error_klass,                                 java_lang_Error,                           Pre                 ) \
+  do_klass(ThreadDeath_klass,                           java_lang_ThreadDeath,                     Pre                 ) \
+  do_klass(Exception_klass,                             java_lang_Exception,                       Pre                 ) \
+  do_klass(RuntimeException_klass,                      java_lang_RuntimeException,                Pre                 ) \
+  do_klass(ProtectionDomain_klass,                      java_security_ProtectionDomain,            Pre                 ) \
+  do_klass(AccessControlContext_klass,                  java_security_AccessControlContext,        Pre                 ) \
+  do_klass(ClassNotFoundException_klass,                java_lang_ClassNotFoundException,          Pre                 ) \
+  do_klass(NoClassDefFoundError_klass,                  java_lang_NoClassDefFoundError,            Pre                 ) \
+  do_klass(LinkageError_klass,                          java_lang_LinkageError,                    Pre                 ) \
+  do_klass(ClassCastException_klass,                    java_lang_ClassCastException,              Pre                 ) \
+  do_klass(ArrayStoreException_klass,                   java_lang_ArrayStoreException,             Pre                 ) \
+  do_klass(VirtualMachineError_klass,                   java_lang_VirtualMachineError,             Pre                 ) \
+  do_klass(OutOfMemoryError_klass,                      java_lang_OutOfMemoryError,                Pre                 ) \
+  do_klass(StackOverflowError_klass,                    java_lang_StackOverflowError,              Pre                 ) \
+  do_klass(IllegalMonitorStateException_klass,          java_lang_IllegalMonitorStateException,    Pre                 ) \
+  do_klass(Reference_klass,                             java_lang_ref_Reference,                   Pre                 ) \
+                                                                                                                         \
+  /* Preload ref klasses and set reference types */                                                                      \
+  do_klass(SoftReference_klass,                         java_lang_ref_SoftReference,               Pre                 ) \
+  do_klass(WeakReference_klass,                         java_lang_ref_WeakReference,               Pre                 ) \
+  do_klass(FinalReference_klass,                        java_lang_ref_FinalReference,              Pre                 ) \
+  do_klass(PhantomReference_klass,                      java_lang_ref_PhantomReference,            Pre                 ) \
+  do_klass(Finalizer_klass,                             java_lang_ref_Finalizer,                   Pre                 ) \
+                                                                                                                         \
+  do_klass(Thread_klass,                                java_lang_Thread,                          Pre                 ) \
+  do_klass(ThreadGroup_klass,                           java_lang_ThreadGroup,                     Pre                 ) \
+  do_klass(Properties_klass,                            java_util_Properties,                      Pre                 ) \
+  do_klass(reflect_AccessibleObject_klass,              java_lang_reflect_AccessibleObject,        Pre                 ) \
+  do_klass(reflect_Field_klass,                         java_lang_reflect_Field,                   Pre                 ) \
+  do_klass(reflect_Method_klass,                        java_lang_reflect_Method,                  Pre                 ) \
+  do_klass(reflect_Constructor_klass,                   java_lang_reflect_Constructor,             Pre                 ) \
+                                                                                                                         \
   /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */                              \
   /* Universe::is_gte_jdk14x_version() is not set up by this point. */                                                   \
   /* It's okay if this turns out to be NULL in non-1.4 JDKs. */                                                          \
-  template(reflect_MagicAccessorImpl_klass,             sun_reflect_MagicAccessorImpl,             Opt)                  \
-  template(reflect_MethodAccessorImpl_klass,            sun_reflect_MethodAccessorImpl,            Opt_Only_JDK14NewRef) \
-  template(reflect_ConstructorAccessorImpl_klass,       sun_reflect_ConstructorAccessorImpl,       Opt_Only_JDK14NewRef) \
-  template(reflect_DelegatingClassLoader_klass,         sun_reflect_DelegatingClassLoader,         Opt)                  \
-  template(reflect_ConstantPool_klass,                  sun_reflect_ConstantPool,                  Opt_Only_JDK15)       \
-  template(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15)       \
-                                                                              \
-  /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
-  template(MethodHandle_klass,             java_lang_invoke_MethodHandle,             Pre_JSR292) \
-  template(MemberName_klass,               java_lang_invoke_MemberName,               Pre_JSR292) \
-  template(MethodHandleNatives_klass,      java_lang_invoke_MethodHandleNatives,      Pre_JSR292) \
-  template(LambdaForm_klass,               java_lang_invoke_LambdaForm,               Opt)        \
-  template(MethodType_klass,               java_lang_invoke_MethodType,               Pre_JSR292) \
-  template(BootstrapMethodError_klass,     java_lang_BootstrapMethodError,            Pre_JSR292) \
-  template(CallSite_klass,                 java_lang_invoke_CallSite,                 Pre_JSR292) \
-  template(ConstantCallSite_klass,         java_lang_invoke_ConstantCallSite,         Pre_JSR292) \
-  template(MutableCallSite_klass,          java_lang_invoke_MutableCallSite,          Pre_JSR292) \
-  template(VolatileCallSite_klass,         java_lang_invoke_VolatileCallSite,         Pre_JSR292) \
-  /* Note: MethodHandle must be first, and VolatileCallSite last in group */  \
-                                                                              \
-  template(StringBuffer_klass,           java_lang_StringBuffer,         Pre) \
-  template(StringBuilder_klass,          java_lang_StringBuilder,        Pre) \
-                                                                              \
-  /* It's NULL in non-1.4 JDKs. */                                            \
-  template(StackTraceElement_klass,      java_lang_StackTraceElement,    Opt) \
-  /* Universe::is_gte_jdk14x_version() is not set up by this point. */        \
-  /* It's okay if this turns out to be NULL in non-1.4 JDKs. */               \
-  template(nio_Buffer_klass,             java_nio_Buffer,                Opt) \
-                                                                              \
-  template(DownloadManager_klass,        sun_jkernel_DownloadManager, Opt_Kernel) \
-                                                                              \
-  template(PostVMInitHook_klass,         sun_misc_PostVMInitHook, Opt)        \
-                                                                              \
-  /* Preload boxing klasses */                                                \
-  template(Boolean_klass,                java_lang_Boolean,              Pre) \
-  template(Character_klass,              java_lang_Character,            Pre) \
-  template(Float_klass,                  java_lang_Float,                Pre) \
-  template(Double_klass,                 java_lang_Double,               Pre) \
-  template(Byte_klass,                   java_lang_Byte,                 Pre) \
-  template(Short_klass,                  java_lang_Short,                Pre) \
-  template(Integer_klass,                java_lang_Integer,              Pre) \
-  template(Long_klass,                   java_lang_Long,                 Pre) \
+  do_klass(reflect_MagicAccessorImpl_klass,             sun_reflect_MagicAccessorImpl,             Opt                 ) \
+  do_klass(reflect_MethodAccessorImpl_klass,            sun_reflect_MethodAccessorImpl,            Opt_Only_JDK14NewRef) \
+  do_klass(reflect_ConstructorAccessorImpl_klass,       sun_reflect_ConstructorAccessorImpl,       Opt_Only_JDK14NewRef) \
+  do_klass(reflect_DelegatingClassLoader_klass,         sun_reflect_DelegatingClassLoader,         Opt                 ) \
+  do_klass(reflect_ConstantPool_klass,                  sun_reflect_ConstantPool,                  Opt_Only_JDK15      ) \
+  do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15      ) \
+                                                                                                                         \
+  /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */                                            \
+  do_klass(MethodHandle_klass,                          java_lang_invoke_MethodHandle,             Pre_JSR292          ) \
+  do_klass(MemberName_klass,                            java_lang_invoke_MemberName,               Pre_JSR292          ) \
+  do_klass(MethodHandleNatives_klass,                   java_lang_invoke_MethodHandleNatives,      Pre_JSR292          ) \
+  do_klass(LambdaForm_klass,                            java_lang_invoke_LambdaForm,               Opt                 ) \
+  do_klass(MethodType_klass,                            java_lang_invoke_MethodType,               Pre_JSR292          ) \
+  do_klass(BootstrapMethodError_klass,                  java_lang_BootstrapMethodError,            Pre_JSR292          ) \
+  do_klass(CallSite_klass,                              java_lang_invoke_CallSite,                 Pre_JSR292          ) \
+  do_klass(ConstantCallSite_klass,                      java_lang_invoke_ConstantCallSite,         Pre_JSR292          ) \
+  do_klass(MutableCallSite_klass,                       java_lang_invoke_MutableCallSite,          Pre_JSR292          ) \
+  do_klass(VolatileCallSite_klass,                      java_lang_invoke_VolatileCallSite,         Pre_JSR292          ) \
+  /* Note: MethodHandle must be first, and VolatileCallSite last in group */                                             \
+                                                                                                                         \
+  do_klass(StringBuffer_klass,                          java_lang_StringBuffer,                    Pre                 ) \
+  do_klass(StringBuilder_klass,                         java_lang_StringBuilder,                   Pre                 ) \
+                                                                                                                         \
+  /* It's NULL in non-1.4 JDKs. */                                                                                       \
+  do_klass(StackTraceElement_klass,                     java_lang_StackTraceElement,               Opt                 ) \
+  /* Universe::is_gte_jdk14x_version() is not set up by this point. */                                                   \
+  /* It's okay if this turns out to be NULL in non-1.4 JDKs. */                                                          \
+  do_klass(nio_Buffer_klass,                            java_nio_Buffer,                           Opt                 ) \
+                                                                                                                         \
+  do_klass(DownloadManager_klass,                       sun_jkernel_DownloadManager,               Opt_Kernel          ) \
+                                                                                                                         \
+  do_klass(PostVMInitHook_klass,                        sun_misc_PostVMInitHook,                   Opt                 ) \
+                                                                                                                         \
+  /* Preload boxing klasses */                                                                                           \
+  do_klass(Boolean_klass,                               java_lang_Boolean,                         Pre                 ) \
+  do_klass(Character_klass,                             java_lang_Character,                       Pre                 ) \
+  do_klass(Float_klass,                                 java_lang_Float,                           Pre                 ) \
+  do_klass(Double_klass,                                java_lang_Double,                          Pre                 ) \
+  do_klass(Byte_klass,                                  java_lang_Byte,                            Pre                 ) \
+  do_klass(Short_klass,                                 java_lang_Short,                           Pre                 ) \
+  do_klass(Integer_klass,                               java_lang_Integer,                         Pre                 ) \
+  do_klass(Long_klass,                                  java_lang_Long,                            Pre                 ) \
   /*end*/
 
 
@@ -280,9 +280,6 @@
                                                Handle protection_domain,
                                                TRAPS);
 
-  // If the given name is known to vmSymbols, return the well-know klass:
-  static Klass* find_well_known_klass(Symbol* class_name);
-
   // Lookup an instance or array class that has already been loaded
   // either into the given class loader, or else into another class
   // loader that is constrained (via loader constraints) to produce
@@ -392,9 +389,9 @@
     return k;
   }
 
-  static Klass* check_klass_Pre(Klass* k) { return check_klass(k); }
+  static Klass* check_klass_Pre(       Klass* k) { return check_klass(k); }
   static Klass* check_klass_Pre_JSR292(Klass* k) { return EnableInvokeDynamic ? check_klass(k) : k; }
-  static Klass* check_klass_Opt(Klass* k) { return k; }
+  static Klass* check_klass_Opt(       Klass* k) { return k; }
   static Klass* check_klass_Opt_Kernel(Klass* k) { return k; } //== Opt
   static Klass* check_klass_Opt_Only_JDK15(Klass* k) {
     assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only");
--- a/hotspot/src/share/vm/classfile/vmSymbols.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/vmSymbols.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -324,24 +324,6 @@
   return vmIntrinsics::_none;
 }
 
-Method* vmIntrinsics::method_for(vmIntrinsics::ID id) {
-  if (id == _none)  return NULL;
-  Symbol* cname = vmSymbols::symbol_at(class_for(id));
-  Symbol* mname = vmSymbols::symbol_at(name_for(id));
-  Symbol* msig  = vmSymbols::symbol_at(signature_for(id));
-  if (cname == NULL || mname == NULL || msig == NULL)  return NULL;
-  Klass* k = SystemDictionary::find_well_known_klass(cname);
-  if (k == NULL)  return NULL;
-  Method* m = InstanceKlass::cast(k)->find_method(mname, msig);
-  if (m == NULL &&
-      cname == vmSymbols::java_lang_invoke_MethodHandle() &&
-      msig == vmSymbols::star_name()) {
-    // Any signature polymorphic method is represented by a fixed concrete signature:
-    m = InstanceKlass::cast(k)->find_method(mname, vmSymbols::object_array_object_signature());
-  }
-  return m;
-}
-
 
 #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0"
 static const char* vm_intrinsic_name_bodies =
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1138,9 +1138,6 @@
 
   static const char* short_name_as_C_string(ID id, char* buf, int size);
 
-  // Access to intrinsic methods:
-  static Method* method_for(ID id);
-
   // Wrapper object methods:
   static ID for_boxing(BasicType type);
   static ID for_unboxing(BasicType type);
--- a/hotspot/src/share/vm/code/dependencies.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/code/dependencies.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -333,12 +333,14 @@
       for (int j = 0; j < stride; j++) {
         if (j == skipj)  continue;
         ciBaseObject* v = deps->at(i+j);
+        int idx;
         if (v->is_object()) {
-          bytes.write_int(_oop_recorder->find_index(v->as_object()->constant_encoding()));
+          idx = _oop_recorder->find_index(v->as_object()->constant_encoding());
         } else {
           ciMetadata* meta = v->as_metadata();
-          bytes.write_int(_oop_recorder->find_index(meta->constant_encoding()));
+          idx = _oop_recorder->find_index(meta->constant_encoding());
         }
+        bytes.write_int(idx);
       }
     }
   }
@@ -573,8 +575,8 @@
     if (type() == call_site_target_value) {
       args[j] = argument_oop(j);
     } else {
-    args[j] = argument(j);
-  }
+      args[j] = argument(j);
+    }
   }
   if (_deps != NULL && _deps->log() != NULL) {
     Dependencies::write_dependency_to(_deps->log(),
@@ -665,6 +667,14 @@
 
 Metadata* Dependencies::DepStream::argument(int i) {
   Metadata* result = recorded_metadata_at(argument_index(i));
+
+  if (result == NULL) { // Explicit context argument can be compressed
+    int ctxkj = dep_context_arg(type());  // -1 if no explicit context arg
+    if (ctxkj >= 0 && i == ctxkj && ctxkj+1 < argument_count()) {
+      result = ctxk_encoded_as_null(type(), argument(ctxkj+1));
+    }
+  }
+
   assert(result == NULL || result->is_klass() || result->is_method(), "must be");
   return result;
 }
@@ -680,25 +690,21 @@
 
   // Most dependencies have an explicit context type argument.
   {
-    int ctxkj = dep_context_arg(_type);  // -1 if no explicit context arg
+    int ctxkj = dep_context_arg(type());  // -1 if no explicit context arg
     if (ctxkj >= 0) {
       Metadata* k = argument(ctxkj);
-      if (k != NULL) {       // context type was not compressed away
-        assert(k->is_klass(), "type check");
-        return (Klass*) k;
-      }
-      // recompute "default" context type
-      return ctxk_encoded_as_null(_type, argument(ctxkj+1));
+      assert(k != NULL && k->is_klass(), "type check");
+      return (Klass*)k;
     }
   }
 
   // Some dependencies are using the klass of the first object
   // argument as implicit context type (e.g. call_site_target_value).
   {
-    int ctxkj = dep_implicit_context_arg(_type);
+    int ctxkj = dep_implicit_context_arg(type());
     if (ctxkj >= 0) {
       Klass* k = argument_oop(ctxkj)->klass();
-      assert(k->is_klass(), "type check");
+      assert(k != NULL && k->is_klass(), "type check");
       return (Klass*) k;
     }
   }
--- a/hotspot/src/share/vm/code/stubs.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/code/stubs.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/code/stubs.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/code/stubs.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/code/vmreg.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/code/vmreg.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/compiler/abstractCompiler.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/compiler/abstractCompiler.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1570,7 +1570,8 @@
   }
   CompileLog* log = thread->log();
   if (log != NULL) {
-    log->begin_elem("start_compile_thread thread='" UINTX_FORMAT "' process='%d'",
+    log->begin_elem("start_compile_thread name='%s' thread='" UINTX_FORMAT "' process='%d'",
+                    thread->name(),
                     os::current_thread_id(),
                     os::current_process_id());
     log->stamp();
--- a/hotspot/src/share/vm/compiler/compileLog.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/compiler/compileLog.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -302,3 +302,48 @@
   char buf[4 * K];
   finish_log_on_error(file, buf, sizeof(buf));
 }
+
+// ------------------------------------------------------------------
+// CompileLog::inline_success
+//
+// Print about successful method inlining.
+void CompileLog::inline_success(const char* reason) {
+  begin_elem("inline_success reason='");
+  text(reason);
+  end_elem("'");
+}
+
+// ------------------------------------------------------------------
+// CompileLog::inline_fail
+//
+// Print about failed method inlining.
+void CompileLog::inline_fail(const char* reason) {
+  begin_elem("inline_fail reason='");
+  text(reason);
+  end_elem("'");
+}
+
+// ------------------------------------------------------------------
+// CompileLog::set_context
+//
+// Set XML tag as an optional marker - it is printed only if
+// there are other entries after until it is reset.
+void CompileLog::set_context(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  clear_context();
+  _context.print("<");
+  _context.vprint(format, ap);
+  _context.print_cr("/>");
+  va_end(ap);
+}
+
+// ------------------------------------------------------------------
+// CompileLog::code_cache_state
+//
+// Print code cache state.
+void CompileLog::code_cache_state() {
+  begin_elem("code_cache");
+  CodeCache::log_state(this);
+  end_elem("");
+}
--- a/hotspot/src/share/vm/compiler/compileLog.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/compiler/compileLog.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -62,7 +62,13 @@
 
   intx          thread_id()                      { return _thread_id; }
   const char*   file()                           { return _file; }
+
+  // Optional context marker, to help place actions that occur during
+  // parsing. If there is no log output until the next context string
+  // or reset, context string will be silently ignored
   stringStream* context()                        { return &_context; }
+  void    clear_context()                        { context()->reset(); }
+  void      set_context(const char* format, ...);
 
   void          name(ciSymbol* s);               // name='s'
   void          name(Symbol* s)                  { xmlStream::name(s); }
@@ -71,6 +77,9 @@
   int           identify(ciBaseObject* obj);
   void          clear_identities();
 
+  void inline_fail   (const char* reason);
+  void inline_success(const char* reason);
+
   // virtuals
   virtual void see_tag(const char* tag, bool push);
   virtual void pop_tag(const char* tag);
@@ -78,6 +87,9 @@
   // make a provisional end of log mark
   void mark_file_end() { _file_end = out()->count(); }
 
+  // Print code cache statistics
+  void code_cache_state();
+
   // copy all logs to the given stream
   static void finish_log(outputStream* out);
   static void finish_log_on_error(outputStream* out, char *buf, int buflen);
--- a/hotspot/src/share/vm/compiler/oopMap.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/compiler/oopMap.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -222,7 +222,7 @@
   // depends on this property.
   debug_only(
     FreeChunk* junk = NULL;
-    assert(UseCompressedOops ||
+    assert(UseCompressedKlassPointers ||
            junk->prev_addr() == (void*)(oop(junk)->klass_addr()),
            "Offset of FreeChunk::_prev within FreeChunk must match"
            "  that of OopDesc::_klass within OopDesc");
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,6 +1,6 @@
 
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -204,7 +204,7 @@
   int random_seed = 17;
   do {
     while (ParCompactionManager::steal_objarray(which, &random_seed, task)) {
-      objArrayKlass* const k = (objArrayKlass*)task.obj()->klass();
+      ObjArrayKlass* const k = (ObjArrayKlass*)task.obj()->klass();
       k->oop_follow_contents(cm, task.obj(), task.index());
       cm->follow_marking_stacks();
     }
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -188,10 +188,10 @@
     // Process ObjArrays one at a time to avoid marking stack bloat.
     ObjArrayTask task;
     if (_objarray_stack.pop_overflow(task)) {
-      objArrayKlass* const k = (objArrayKlass*)task.obj()->klass();
+      ObjArrayKlass* const k = (ObjArrayKlass*)task.obj()->klass();
       k->oop_follow_contents(this, task.obj(), task.index());
     } else if (_objarray_stack.pop_local(task)) {
-      objArrayKlass* const k = (objArrayKlass*)task.obj()->klass();
+      ObjArrayKlass* const k = (ObjArrayKlass*)task.obj()->klass();
       k->oop_follow_contents(this, task.obj(), task.index());
     }
   } while (!marking_stacks_empty());
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,6 +1,6 @@
 
 /*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/collectorCounters.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/collectorCounters.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/collectorCounters.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/collectorCounters.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/gSpaceCounters.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gSpaceCounters.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/gSpaceCounters.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gSpaceCounters.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/gcStats.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcStats.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/gcUtil.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcUtil.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/gcUtil.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcUtil.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/generationCounters.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/generationCounters.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/generationCounters.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/generationCounters.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/hSpaceCounters.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/hSpaceCounters.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -115,7 +115,7 @@
     // Process ObjArrays one at a time to avoid marking stack bloat.
     if (!_objarray_stack.is_empty()) {
       ObjArrayTask task = _objarray_stack.pop();
-      objArrayKlass* const k = (objArrayKlass*)task.obj()->klass();
+      ObjArrayKlass* const k = (ObjArrayKlass*)task.obj()->klass();
       k->oop_follow_contents(task.obj(), task.index());
     }
   } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty());
--- a/hotspot/src/share/vm/gc_implementation/shared/spaceCounters.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/spaceCounters.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/spaceCounters.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/spaceCounters.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/gc_implementation/shared/spaceDecorator.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/spaceDecorator.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1626,7 +1626,7 @@
           if (rhsObject != NULL) {
             /* Check assignability of rhsObject into arrObj */
             Klass* rhsKlassOop = rhsObject->klass(); // EBX (subclass)
-            Klass* elemKlassOop = objArrayKlass::cast(arrObj->klass())->element_klass(); // superklass EAX
+            Klass* elemKlassOop = ObjArrayKlass::cast(arrObj->klass())->element_klass(); // superklass EAX
             //
             // Check for compatibilty. This check must not GC!!
             // Seems way more expensive now that we must dispatch
--- a/hotspot/src/share/vm/interpreter/interpreter.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/interpreter/interpreter.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -211,7 +211,7 @@
     int n = Interpreter::local_offset_in_bytes(index)/jintSize;
     dims[index] = first_size_address[n];
   }
-  oop obj = arrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK);
+  oop obj = ArrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK);
   thread->set_vm_result(obj);
 IRT_END
 
--- a/hotspot/src/share/vm/libadt/set.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/libadt/set.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/libadt/vectset.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/libadt/vectset.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/memory/allocation.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/allocation.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -27,6 +27,7 @@
 
 #include "runtime/globals.hpp"
 #include "utilities/globalDefinitions.hpp"
+#include "utilities/macros.hpp"
 #ifdef COMPILER1
 #include "c1/c1_globals.hpp"
 #endif
@@ -157,8 +158,16 @@
 
 typedef unsigned short MEMFLAGS;
 
+#if INCLUDE_NMT
+
 extern bool NMT_track_callsite;
 
+#else
+
+const bool NMT_track_callsite = false;
+
+#endif // INCLUDE_NMT
+
 // debug build does not inline
 #if defined(_DEBUG_)
   #define CURRENT_PC       (NMT_track_callsite ? os::get_caller_pc(1) : 0)
--- a/hotspot/src/share/vm/memory/allocation.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/allocation.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/memory/freeBlockDictionary.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/freeBlockDictionary.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/src/share/vm/memory/freeList.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/freeList.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/memory/freeList.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/freeList.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/memory/heap.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/heap.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/memory/heap.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/heap.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/memory/heapInspection.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2010, 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
@@ -28,7 +28,7 @@
 #include "memory/allocation.inline.hpp"
 #include "oops/oop.inline.hpp"
 
-#ifndef SERVICES_KERNEL
+#if INCLUDE_SERVICES
 
 
 // HeapInspection
@@ -129,12 +129,12 @@
   void sort();
 };
 
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
 
 class HeapInspection : public AllStatic {
  public:
-  static void heap_inspection(outputStream* st, bool need_prologue) KERNEL_RETURN;
-  static void find_instances_at_safepoint(Klass* k, GrowableArray<oop>* result) KERNEL_RETURN;
+  static void heap_inspection(outputStream* st, bool need_prologue) NOT_SERVICES_RETURN;
+  static void find_instances_at_safepoint(Klass* k, GrowableArray<oop>* result) NOT_SERVICES_RETURN;
 };
 
 #endif // SHARE_VM_MEMORY_HEAPINSPECTION_HPP
--- a/hotspot/src/share/vm/memory/metaspace.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/metaspace.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -135,6 +135,8 @@
   MetaWord* expand_and_allocate(size_t size,
                                 MetadataType mdtype);
 
+  static bool is_initialized() { return _class_space_list != NULL; }
+
 #ifndef PRODUCT
   bool contains(const void *ptr) const;
   bool contains_class(const void *ptr) const;
--- a/hotspot/src/share/vm/memory/metaspaceShared.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -42,14 +42,8 @@
 
 
 int MetaspaceShared::_max_alignment = 0;
-int MetaspaceShared::max_alignment()                   { return _max_alignment; }
-void MetaspaceShared::set_max_alignment(int alignment) { _max_alignment = alignment; }
 
-// Accessor functions to save shared space created for metadata, which has
-// extra space allocated at the end for miscellaneous data and code.
 ReservedSpace* MetaspaceShared::_shared_rs = NULL;
-ReservedSpace* MetaspaceShared::shared_rs()            { return _shared_rs; }
-void MetaspaceShared::set_shared_rs(ReservedSpace* rs) { _shared_rs = rs; }
 
 // Read/write a data stream for restoring/preserving metadata pointers and
 // miscellaneous data from/to the shared archive file.
--- a/hotspot/src/share/vm/memory/metaspaceShared.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/metaspaceShared.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -56,18 +56,33 @@
     n_regions = 4
   };
 
-  static void set_max_alignment(int alignment) KERNEL_RETURN;
-  static int max_alignment()                   KERNEL_RETURN_(0);
+  // Accessor functions to save shared space created for metadata, which has
+  // extra space allocated at the end for miscellaneous data and code.
+  static void set_max_alignment(int alignment) {
+    CDS_ONLY(_max_alignment = alignment);
+  }
+
+  static int max_alignment() {
+    CDS_ONLY(return _max_alignment);
+    NOT_CDS(return 0);
+  }
 
-  static void preload_and_dump(TRAPS) KERNEL_RETURN;
-  static ReservedSpace* shared_rs();
-  static void set_shared_rs(ReservedSpace* rs) KERNEL_RETURN;
+  static void preload_and_dump(TRAPS) NOT_CDS_RETURN;
+
+  static ReservedSpace* shared_rs() {
+    CDS_ONLY(return _shared_rs);
+    NOT_CDS(return NULL);
+  }
 
-  static bool map_shared_spaces(FileMapInfo* mapinfo) KERNEL_RETURN_(false);
-  static void initialize_shared_spaces() KERNEL_RETURN;
+  static void set_shared_rs(ReservedSpace* rs) {
+    CDS_ONLY(_shared_rs = rs;)
+  }
+
+  static bool map_shared_spaces(FileMapInfo* mapinfo) NOT_CDS_RETURN_(false);
+  static void initialize_shared_spaces() NOT_CDS_RETURN;
 
   // Return true if given address is in the mapped shared space.
-  static bool is_in_shared_space(const void* p) KERNEL_RETURN_(false);
+  static bool is_in_shared_space(const void* p) NOT_CDS_RETURN_(false);
 
   static void generate_vtable_methods(void** vtbl_list,
                                       void** vtable,
@@ -79,7 +94,7 @@
   // Remap the shared readonly space to shared readwrite, private if
   // sharing is enabled. Simply returns true if sharing is not enabled
   // or if the remapping has already been done by a prior call.
-  static bool remap_shared_readonly_as_readwrite() KERNEL_RETURN_(true);
+  static bool remap_shared_readonly_as_readwrite() NOT_CDS_RETURN_(true);
 
   static void print_shared_spaces();
 };
--- a/hotspot/src/share/vm/memory/oopFactory.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/oopFactory.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -47,12 +47,12 @@
 }
 
 typeArrayOop oopFactory::new_tenured_charArray(int length, TRAPS) {
-  return typeArrayKlass::cast(Universe::charArrayKlassObj())->allocate(length, THREAD);
+  return TypeArrayKlass::cast(Universe::charArrayKlassObj())->allocate(length, THREAD);
 }
 
 typeArrayOop oopFactory::new_typeArray(BasicType type, int length, TRAPS) {
   Klass* type_asKlassOop = Universe::typeArrayKlassObj(type);
-  typeArrayKlass* type_asArrayKlass = typeArrayKlass::cast(type_asKlassOop);
+  TypeArrayKlass* type_asArrayKlass = TypeArrayKlass::cast(type_asKlassOop);
   typeArrayOop result = type_asArrayKlass->allocate(length, THREAD);
   return result;
 }
@@ -66,14 +66,14 @@
 typeArrayOop oopFactory::new_metaDataArray(int length, TRAPS) {
   BasicType type = LP64_ONLY(T_LONG) NOT_LP64(T_INT);
   Klass* type_asKlassOop = Universe::typeArrayKlassObj(type);
-  typeArrayKlass* type_asArrayKlass = typeArrayKlass::cast(type_asKlassOop);
+  TypeArrayKlass* type_asArrayKlass = TypeArrayKlass::cast(type_asKlassOop);
   typeArrayOop result = type_asArrayKlass->allocate_common(length, true, THREAD);
   return result;
 }
 
 typeArrayOop oopFactory::new_typeArray_nozero(BasicType type, int length, TRAPS) {
   Klass* type_asKlassOop = Universe::typeArrayKlassObj(type);
-  typeArrayKlass* type_asArrayKlass = typeArrayKlass::cast(type_asKlassOop);
+  TypeArrayKlass* type_asArrayKlass = TypeArrayKlass::cast(type_asKlassOop);
   typeArrayOop result = type_asArrayKlass->allocate_common(length, false, THREAD);
   return result;
 }
@@ -82,7 +82,7 @@
 objArrayOop oopFactory::new_objArray(Klass* klass, int length, TRAPS) {
   assert(klass->is_klass(), "must be instance class");
   if (klass->oop_is_array()) {
-    return ((arrayKlass*)klass)->allocate_arrayArray(1, length, THREAD);
+    return ((ArrayKlass*)klass)->allocate_arrayArray(1, length, THREAD);
   } else {
     assert (klass->oop_is_instance(), "new object array with klass not an InstanceKlass");
     return ((InstanceKlass*)klass)->allocate_objArray(1, length, THREAD);
--- a/hotspot/src/share/vm/memory/oopFactory.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/oopFactory.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -40,19 +40,19 @@
 class oopFactory: AllStatic {
  public:
   // Basic type leaf array allocation
-  static typeArrayOop    new_boolArray  (int length, TRAPS) { return typeArrayKlass::cast(Universe::boolArrayKlassObj  ())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_charArray  (int length, TRAPS) { return typeArrayKlass::cast(Universe::charArrayKlassObj  ())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_singleArray(int length, TRAPS) { return typeArrayKlass::cast(Universe::singleArrayKlassObj())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_doubleArray(int length, TRAPS) { return typeArrayKlass::cast(Universe::doubleArrayKlassObj())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_byteArray  (int length, TRAPS) { return typeArrayKlass::cast(Universe::byteArrayKlassObj  ())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_shortArray (int length, TRAPS) { return typeArrayKlass::cast(Universe::shortArrayKlassObj ())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_intArray   (int length, TRAPS) { return typeArrayKlass::cast(Universe::intArrayKlassObj   ())->allocate(length, CHECK_NULL); }
-  static typeArrayOop    new_longArray  (int length, TRAPS) { return typeArrayKlass::cast(Universe::longArrayKlassObj  ())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_boolArray  (int length, TRAPS) { return TypeArrayKlass::cast(Universe::boolArrayKlassObj  ())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_charArray  (int length, TRAPS) { return TypeArrayKlass::cast(Universe::charArrayKlassObj  ())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_singleArray(int length, TRAPS) { return TypeArrayKlass::cast(Universe::singleArrayKlassObj())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_doubleArray(int length, TRAPS) { return TypeArrayKlass::cast(Universe::doubleArrayKlassObj())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_byteArray  (int length, TRAPS) { return TypeArrayKlass::cast(Universe::byteArrayKlassObj  ())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_shortArray (int length, TRAPS) { return TypeArrayKlass::cast(Universe::shortArrayKlassObj ())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_intArray   (int length, TRAPS) { return TypeArrayKlass::cast(Universe::intArrayKlassObj   ())->allocate(length, CHECK_NULL); }
+  static typeArrayOop    new_longArray  (int length, TRAPS) { return TypeArrayKlass::cast(Universe::longArrayKlassObj  ())->allocate(length, CHECK_NULL); }
 
   // create java.lang.Object[]
   static objArrayOop     new_objectArray(int length, TRAPS)  {
     assert(Universe::objectArrayKlassObj() != NULL, "Too early?");
-    return objArrayKlass::
+    return ObjArrayKlass::
       cast(Universe::objectArrayKlassObj())->allocate(length, CHECK_NULL);
   }
 
--- a/hotspot/src/share/vm/memory/referencePolicy.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/referencePolicy.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/memory/space.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/space.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/memory/specialized_oop_closures.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/specialized_oop_closures.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -200,7 +200,7 @@
   enum Kind {
     ik,             // InstanceKlass
     irk,            // InstanceRefKlass
-    oa,             // objArrayKlass
+    oa,             // ObjArrayKlass
     NUM_Kinds
   };
 
--- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/memory/universe.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/universe.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -151,7 +151,9 @@
 
 CollectedHeap*  Universe::_collectedHeap = NULL;
 
-NarrowOopStruct Universe::_narrow_oop = { NULL, 0, true };
+NarrowPtrStruct Universe::_narrow_oop = { NULL, 0, true };
+NarrowPtrStruct Universe::_narrow_klass = { NULL, 0, true };
+address Universe::_narrow_ptrs_base;
 
 
 void Universe::basic_type_classes_do(void f(Klass*)) {
@@ -265,14 +267,14 @@
       compute_base_vtable_size();
 
       if (!UseSharedSpaces) {
-        _boolArrayKlassObj      = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);
-        _charArrayKlassObj      = typeArrayKlass::create_klass(T_CHAR,    sizeof(jchar),    CHECK);
-        _singleArrayKlassObj    = typeArrayKlass::create_klass(T_FLOAT,   sizeof(jfloat),   CHECK);
-        _doubleArrayKlassObj    = typeArrayKlass::create_klass(T_DOUBLE,  sizeof(jdouble),  CHECK);
-        _byteArrayKlassObj      = typeArrayKlass::create_klass(T_BYTE,    sizeof(jbyte),    CHECK);
-        _shortArrayKlassObj     = typeArrayKlass::create_klass(T_SHORT,   sizeof(jshort),   CHECK);
-        _intArrayKlassObj       = typeArrayKlass::create_klass(T_INT,     sizeof(jint),     CHECK);
-        _longArrayKlassObj      = typeArrayKlass::create_klass(T_LONG,    sizeof(jlong),    CHECK);
+        _boolArrayKlassObj      = TypeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);
+        _charArrayKlassObj      = TypeArrayKlass::create_klass(T_CHAR,    sizeof(jchar),    CHECK);
+        _singleArrayKlassObj    = TypeArrayKlass::create_klass(T_FLOAT,   sizeof(jfloat),   CHECK);
+        _doubleArrayKlassObj    = TypeArrayKlass::create_klass(T_DOUBLE,  sizeof(jdouble),  CHECK);
+        _byteArrayKlassObj      = TypeArrayKlass::create_klass(T_BYTE,    sizeof(jbyte),    CHECK);
+        _shortArrayKlassObj     = TypeArrayKlass::create_klass(T_SHORT,   sizeof(jshort),   CHECK);
+        _intArrayKlassObj       = TypeArrayKlass::create_klass(T_INT,     sizeof(jint),     CHECK);
+        _longArrayKlassObj      = TypeArrayKlass::create_klass(T_LONG,    sizeof(jlong),    CHECK);
 
         _typeArrayKlassObjs[T_BOOLEAN] = _boolArrayKlassObj;
         _typeArrayKlassObjs[T_CHAR]    = _charArrayKlassObj;
@@ -440,8 +442,8 @@
   { InstanceClassLoaderKlass o; add_vtable(list, &n, &o, count); }
   { InstanceMirrorKlass o;    add_vtable(list, &n, &o, count); }
   { InstanceRefKlass o;       add_vtable(list, &n, &o, count); }
-  { typeArrayKlass o;         add_vtable(list, &n, &o, count); }
-  { objArrayKlass o;          add_vtable(list, &n, &o, count); }
+  { TypeArrayKlass o;         add_vtable(list, &n, &o, count); }
+  { ObjArrayKlass o;          add_vtable(list, &n, &o, count); }
   { Method o;                 add_vtable(list, &n, &o, count); }
   { ConstantPool o;           add_vtable(list, &n, &o, count); }
 }
@@ -752,7 +754,7 @@
 #ifndef SERIALGC
     Universe::_collectedHeap = new ParallelScavengeHeap();
 #else  // SERIALGC
-    fatal("UseParallelGC not supported in java kernel vm.");
+    fatal("UseParallelGC not supported in this VM.");
 #endif // SERIALGC
 
   } else if (UseG1GC) {
@@ -777,7 +779,7 @@
         gc_policy = new ConcurrentMarkSweepPolicy();
       }
 #else   // SERIALGC
-    fatal("UseConcMarkSweepGC not supported in java kernel vm.");
+    fatal("UseConcMarkSweepGC not supported in this VM.");
 #endif // SERIALGC
     } else { // default old generation
       gc_policy = new MarkSweepPolicy();
@@ -807,7 +809,7 @@
     }
     if ((uint64_t)Universe::heap()->reserved_region().end() > OopEncodingHeapMax) {
       // Can't reserve heap below 32Gb.
-      Universe::set_narrow_oop_base(Universe::heap()->base() - os::vm_page_size());
+      // keep the Universe::narrow_oop_base() set in Universe::reserve_heap()
       Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
       if (verbose) {
         tty->print(", Compressed Oops with base: "PTR_FORMAT, Universe::narrow_oop_base());
@@ -838,8 +840,16 @@
       tty->cr();
       tty->cr();
     }
+    if (UseCompressedKlassPointers) {
+      Universe::set_narrow_klass_base(Universe::narrow_oop_base());
+      Universe::set_narrow_klass_shift(MIN2(Universe::narrow_oop_shift(), LogKlassAlignmentInBytes));
+    }
+    Universe::set_narrow_ptrs_base(Universe::narrow_oop_base());
   }
-  assert(Universe::narrow_oop_base() == (Universe::heap()->base() - os::vm_page_size()) ||
+  // Universe::narrow_oop_base() is one page below the metaspace
+  // base. The actual metaspace base depends on alignment constraints
+  // so we don't know its exact location here.
+  assert((intptr_t)Universe::narrow_oop_base() <= (intptr_t)(Universe::heap()->base() - os::vm_page_size() - ClassMetaspaceSize) ||
          Universe::narrow_oop_base() == NULL, "invalid value");
   assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes ||
          Universe::narrow_oop_shift() == 0, "invalid value");
@@ -861,7 +871,10 @@
 ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
   // Add in the class metaspace area so the classes in the headers can
   // be compressed the same as instances.
-  size_t total_reserved = align_size_up(heap_size + ClassMetaspaceSize, alignment);
+  // Need to round class space size up because it's below the heap and
+  // the actual alignment depends on its size.
+  size_t metaspace_size = align_size_up(ClassMetaspaceSize, alignment);
+  size_t total_reserved = align_size_up(heap_size + metaspace_size, alignment);
   char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
 
   ReservedHeapSpace total_rs(total_reserved, alignment, UseLargePages, addr);
@@ -895,11 +908,23 @@
     return total_rs;
   }
 
-  // Split the reserved space into main Java heap and a space for classes
-  // so that they can be compressed using the same algorithm as compressed oops
-  ReservedSpace heap_rs = total_rs.first_part(heap_size);
-  ReservedSpace class_rs = total_rs.last_part(heap_size, alignment);
+  // Split the reserved space into main Java heap and a space for
+  // classes so that they can be compressed using the same algorithm
+  // as compressed oops. If compress oops and compress klass ptrs are
+  // used we need the meta space first: if the alignment used for
+  // compressed oops is greater than the one used for compressed klass
+  // ptrs, a metadata space on top of the heap could become
+  // unreachable.
+  ReservedSpace class_rs = total_rs.first_part(metaspace_size);
+  ReservedSpace heap_rs = total_rs.last_part(metaspace_size, alignment);
   Metaspace::initialize_class_space(class_rs);
+
+  if (UseCompressedOops) {
+    // Universe::initialize_heap() will reset this to NULL if unscaled
+    // or zero-based narrow oops are actually used.
+    address base = (address)(total_rs.base() - os::vm_page_size());
+    Universe::set_narrow_oop_base(base);
+  }
   return heap_rs;
 }
 
--- a/hotspot/src/share/vm/memory/universe.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/memory/universe.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -105,16 +105,16 @@
   Method* get_Method();
 };
 
-// For UseCompressedOops.
-struct NarrowOopStruct {
-  // Base address for oop-within-java-object materialization.
-  // NULL if using wide oops or zero based narrow oops.
+// For UseCompressedOops and UseCompressedKlassPointers.
+struct NarrowPtrStruct {
+  // Base address for oop/klass-within-java-object materialization.
+  // NULL if using wide oops/klasses or zero based narrow oops/klasses.
   address _base;
-  // Number of shift bits for encoding/decoding narrow oops.
-  // 0 if using wide oops or zero based unscaled narrow oops,
-  // LogMinObjAlignmentInBytes otherwise.
+  // Number of shift bits for encoding/decoding narrow ptrs.
+  // 0 if using wide ptrs or zero based unscaled narrow ptrs,
+  // LogMinObjAlignmentInBytes/LogKlassAlignmentInBytes otherwise.
   int     _shift;
-  // Generate code with implicit null checks for narrow oops.
+  // Generate code with implicit null checks for narrow ptrs.
   bool    _use_implicit_null_checks;
 };
 
@@ -206,7 +206,10 @@
   static CollectedHeap* _collectedHeap;
 
   // For UseCompressedOops.
-  static struct NarrowOopStruct _narrow_oop;
+  static struct NarrowPtrStruct _narrow_oop;
+  // For UseCompressedKlassPointers.
+  static struct NarrowPtrStruct _narrow_klass;
+  static address _narrow_ptrs_base;
 
   // array of dummy objects used with +FullGCAlot
   debug_only(static objArrayOop _fullgc_alot_dummy_array;)
@@ -259,8 +262,21 @@
     HeapBasedNarrowOop = 2
   };
   static char*    preferred_heap_base(size_t heap_size, NARROW_OOP_MODE mode);
-  static void     set_narrow_oop_base(address base)   { _narrow_oop._base  = base; }
-  static void     set_narrow_oop_use_implicit_null_checks(bool use) { _narrow_oop._use_implicit_null_checks = use; }
+  static char*    preferred_metaspace_base(size_t heap_size, NARROW_OOP_MODE mode);
+  static void     set_narrow_oop_base(address base) {
+    assert(UseCompressedOops, "no compressed oops?");
+    _narrow_oop._base    = base;
+  }
+  static void     set_narrow_klass_base(address base) {
+    assert(UseCompressedKlassPointers, "no compressed klass ptrs?");
+    _narrow_klass._base   = base;
+  }
+  static void     set_narrow_oop_use_implicit_null_checks(bool use) {
+    assert(UseCompressedOops, "no compressed ptrs?");
+    _narrow_oop._use_implicit_null_checks   = use;
+  }
+  static bool     reserve_metaspace_helper(bool with_base = false);
+  static ReservedHeapSpace reserve_heap_metaspace(size_t heap_size, size_t alignment, bool& contiguous);
 
   // Debugging
   static int _verify_count;                           // number of verifies done
@@ -354,14 +370,30 @@
   static CollectedHeap* heap() { return _collectedHeap; }
 
   // For UseCompressedOops
-  static address* narrow_oop_base_addr()              { return &_narrow_oop._base; }
-  static address  narrow_oop_base()                   { return  _narrow_oop._base; }
-  static bool  is_narrow_oop_base(void* addr)         { return (narrow_oop_base() == (address)addr); }
-  static int      narrow_oop_shift()                  { return  _narrow_oop._shift; }
-  static bool     narrow_oop_use_implicit_null_checks()             { return  _narrow_oop._use_implicit_null_checks; }
+  static address  narrow_oop_base()                       { return  _narrow_oop._base; }
+  static bool  is_narrow_oop_base(void* addr)             { return (narrow_oop_base() == (address)addr); }
+  static int      narrow_oop_shift()                      { return  _narrow_oop._shift; }
+  static bool     narrow_oop_use_implicit_null_checks()   { return  _narrow_oop._use_implicit_null_checks; }
+
+  // For UseCompressedKlassPointers
+  static address  narrow_klass_base()                     { return  _narrow_klass._base; }
+  static bool  is_narrow_klass_base(void* addr)           { return (narrow_klass_base() == (address)addr); }
+  static int      narrow_klass_shift()                    { return  _narrow_klass._shift; }
+  static bool     narrow_klass_use_implicit_null_checks() { return  _narrow_klass._use_implicit_null_checks; }
+
+  static address* narrow_ptrs_base_addr()                 { return &_narrow_ptrs_base; }
+  static void     set_narrow_ptrs_base(address a)         { _narrow_ptrs_base = a; }
+  static address  narrow_ptrs_base()                      { return _narrow_ptrs_base; }
 
   // this is set in vm_version on sparc (and then reset in universe afaict)
-  static void     set_narrow_oop_shift(int shift)     { _narrow_oop._shift = shift; }
+  static void     set_narrow_oop_shift(int shift)         {
+    _narrow_oop._shift   = shift;
+  }
+
+  static void     set_narrow_klass_shift(int shift)       {
+    assert(shift == 0 || shift == LogKlassAlignmentInBytes, "invalid shift for klass ptrs");
+    _narrow_klass._shift   = shift;
+  }
 
   // Reserve Java heap and determine CompressedOops mode
   static ReservedSpace reserve_heap(size_t heap_size, size_t alignment);
--- a/hotspot/src/share/vm/oops/arrayKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/arrayKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -36,7 +36,7 @@
 #include "oops/objArrayOop.hpp"
 #include "oops/oop.inline.hpp"
 
-int arrayKlass::static_size(int header_size) {
+int ArrayKlass::static_size(int header_size) {
   // size of an array klass object
   assert(header_size <= InstanceKlass::header_size(), "bad header size");
   // If this assert fails, see comments in base_create_array_klass.
@@ -51,7 +51,7 @@
 }
 
 
-Klass* arrayKlass::java_super() const {
+Klass* ArrayKlass::java_super() const {
   if (super() == NULL)  return NULL;  // bootstrap case
   // Array klasses have primary supertypes which are not reported to Java.
   // Example super chain:  String[][] -> Object[][] -> Object[] -> Object
@@ -59,18 +59,18 @@
 }
 
 
-oop arrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
+oop ArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
   ShouldNotReachHere();
   return NULL;
 }
 
-Method* arrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
+Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
   // There are no methods in an array klass but the super class (Object) has some
   assert(super(), "super klass must be present");
   return Klass::cast(super())->uncached_lookup_method(name, signature);
 }
 
-arrayKlass::arrayKlass(Symbol* name) {
+ArrayKlass::ArrayKlass(Symbol* name) {
   set_alloc_size(0);
   set_name(name);
 
@@ -89,15 +89,15 @@
 
 
 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
-// since a GC can happen. At this point all instance variables of the arrayKlass must be setup.
-void arrayKlass::complete_create_array_klass(arrayKlass* k, KlassHandle super_klass, TRAPS) {
+// since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
+void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS) {
   ResourceMark rm(THREAD);
   k->initialize_supers(super_klass(), CHECK);
   k->vtable()->initialize_vtable(false, CHECK);
   java_lang_Class::create_mirror(k, CHECK);
 }
 
-GrowableArray<Klass*>* arrayKlass::compute_secondary_supers(int num_extra_slots) {
+GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots) {
   // interfaces = { cloneable_klass, serializable_klass };
   assert(num_extra_slots == 0, "sanity of primitive array type");
   // Must share this for correct bootstrapping!
@@ -105,7 +105,7 @@
   return NULL;
 }
 
-bool arrayKlass::compute_is_subtype_of(Klass* k) {
+bool ArrayKlass::compute_is_subtype_of(Klass* k) {
   // An array is a subtype of Serializable, Clonable, and Object
   return    k == SystemDictionary::Object_klass()
          || k == SystemDictionary::Cloneable_klass()
@@ -113,19 +113,19 @@
 }
 
 
-inline intptr_t* arrayKlass::start_of_vtable() const {
+inline intptr_t* ArrayKlass::start_of_vtable() const {
   // all vtables start at the same place, that's why we use InstanceKlass::header_size here
   return ((intptr_t*)this) + InstanceKlass::header_size();
 }
 
 
-klassVtable* arrayKlass::vtable() const {
+klassVtable* ArrayKlass::vtable() const {
   KlassHandle kh(Thread::current(), this);
   return new klassVtable(kh, start_of_vtable(), vtable_length() / vtableEntry::size());
 }
 
 
-objArrayOop arrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
+objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) {
   if (length < 0) {
     THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
   }
@@ -136,40 +136,40 @@
   }
   int size = objArrayOopDesc::object_size(length);
   Klass* k = array_klass(n+dimension(), CHECK_0);
-  arrayKlass* ak = arrayKlass::cast(k);
+  ArrayKlass* ak = ArrayKlass::cast(k);
   objArrayOop o =
     (objArrayOop)CollectedHeap::array_allocate(ak, size, length, CHECK_0);
   // initialization to NULL not necessary, area already cleared
   return o;
 }
 
-void arrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
+void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
   Klass* k = this;
   // Iterate over this array klass and all higher dimensions
   while (k != NULL) {
     f(k, CHECK);
-    k = arrayKlass::cast(k)->higher_dimension();
+    k = ArrayKlass::cast(k)->higher_dimension();
   }
 }
 
-void arrayKlass::array_klasses_do(void f(Klass* k)) {
+void ArrayKlass::array_klasses_do(void f(Klass* k)) {
   Klass* k = this;
   // Iterate over this array klass and all higher dimensions
   while (k != NULL) {
     f(k);
-    k = arrayKlass::cast(k)->higher_dimension();
+    k = ArrayKlass::cast(k)->higher_dimension();
   }
 }
 
 
-void arrayKlass::with_array_klasses_do(void f(Klass* k)) {
+void ArrayKlass::with_array_klasses_do(void f(Klass* k)) {
   array_klasses_do(f);
 }
 
 
 // GC support
 
-void arrayKlass::oops_do(OopClosure* cl) {
+void ArrayKlass::oops_do(OopClosure* cl) {
   Klass::oops_do(cl);
 
   cl->do_oop(adr_component_mirror());
@@ -177,42 +177,42 @@
 
 // JVM support
 
-jint arrayKlass::compute_modifier_flags(TRAPS) const {
+jint ArrayKlass::compute_modifier_flags(TRAPS) const {
   return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
 }
 
 // JVMTI support
 
-jint arrayKlass::jvmti_class_status() const {
+jint ArrayKlass::jvmti_class_status() const {
   return JVMTI_CLASS_STATUS_ARRAY;
 }
 
-void arrayKlass::remove_unshareable_info() {
+void ArrayKlass::remove_unshareable_info() {
   Klass::remove_unshareable_info();
   // Clear the java mirror
   set_component_mirror(NULL);
 }
 
-void arrayKlass::restore_unshareable_info(TRAPS) {
+void ArrayKlass::restore_unshareable_info(TRAPS) {
   Klass::restore_unshareable_info(CHECK);
   // Klass recreates the component mirror also
 }
 
 // Printing
 
-void arrayKlass::print_on(outputStream* st) const {
+void ArrayKlass::print_on(outputStream* st) const {
   assert(is_klass(), "must be klass");
   Klass::print_on(st);
 }
 
-void arrayKlass::print_value_on(outputStream* st) const {
+void ArrayKlass::print_value_on(outputStream* st) const {
   assert(is_klass(), "must be klass");
   for(int index = 0; index < dimension(); index++) {
     st->print("[]");
   }
 }
 
-void arrayKlass::oop_print_on(oop obj, outputStream* st) {
+void ArrayKlass::oop_print_on(oop obj, outputStream* st) {
   assert(obj->is_array(), "must be array");
   Klass::oop_print_on(obj, st);
   st->print_cr(" - length: %d", arrayOop(obj)->length());
@@ -221,7 +221,7 @@
 
 // Verification
 
-void arrayKlass::verify_on(outputStream* st) {
+void ArrayKlass::verify_on(outputStream* st) {
   Klass::verify_on(st);
 
   if (component_mirror() != NULL) {
@@ -229,7 +229,7 @@
   }
 }
 
-void arrayKlass::oop_verify_on(oop obj, outputStream* st) {
+void ArrayKlass::oop_verify_on(oop obj, outputStream* st) {
   guarantee(obj->is_array(), "must be array");
   arrayOop a = arrayOop(obj);
   guarantee(a->length() >= 0, "array with negative length?");
--- a/hotspot/src/share/vm/oops/arrayKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/arrayKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -30,9 +30,9 @@
 
 class klassVtable;
 
-// arrayKlass is the abstract baseclass for all array classes
+// ArrayKlass is the abstract baseclass for all array classes
 
-class arrayKlass: public Klass {
+class ArrayKlass: public Klass {
   friend class VMStructs;
  private:
   int      _dimension;         // This is n'th-dimensional array.
@@ -46,8 +46,8 @@
   // Constructors
   // The constructor with the Symbol argument does the real array
   // initialization, the other is a dummy
-  arrayKlass(Symbol* name);
-  arrayKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for cds"); }
+  ArrayKlass(Symbol* name);
+  ArrayKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for cds"); }
 
  public:
   // Testing operation
@@ -80,7 +80,7 @@
   oop* adr_component_mirror()           { return (oop*)&this->_component_mirror;}
 
   // Compiler/Interpreter offset
-  static ByteSize component_mirror_offset() { return in_ByteSize(offset_of(arrayKlass, _component_mirror)); }
+  static ByteSize component_mirror_offset() { return in_ByteSize(offset_of(ArrayKlass, _component_mirror)); }
 
   virtual Klass* java_super() const;//{ return SystemDictionary::Object_klass(); }
 
@@ -94,16 +94,16 @@
   Method* uncached_lookup_method(Symbol* name, Symbol* signature) const;
 
   // Casting from Klass*
-  static arrayKlass* cast(Klass* k) {
-    assert(k->oop_is_array(), "cast to arrayKlass");
-    return (arrayKlass*) k;
+  static ArrayKlass* cast(Klass* k) {
+    assert(k->oop_is_array(), "cast to ArrayKlass");
+    return (ArrayKlass*) k;
   }
 
   GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots);
   bool compute_is_subtype_of(Klass* k);
 
   // Sizing
-  static int header_size()                 { return sizeof(arrayKlass)/HeapWordSize; }
+  static int header_size()                 { return sizeof(ArrayKlass)/HeapWordSize; }
   static int static_size(int header_size);
 
   // Java vtable
@@ -124,7 +124,7 @@
   virtual void oops_do(OopClosure* cl);
 
   // Return a handle.
-  static void     complete_create_array_klass(arrayKlass* k, KlassHandle super_klass, TRAPS);
+  static void     complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS);
 
 
   // jvm support
--- a/hotspot/src/share/vm/oops/constantPool.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/constantPool.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -533,7 +533,7 @@
 void ConstantPool::verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle k, TRAPS) {
  if (k->oop_is_instance() || k->oop_is_objArray()) {
     instanceKlassHandle holder (THREAD, this_oop->pool_holder());
-    Klass* elem_oop = k->oop_is_instance() ? k() : objArrayKlass::cast(k())->bottom_klass();
+    Klass* elem_oop = k->oop_is_instance() ? k() : ObjArrayKlass::cast(k())->bottom_klass();
     KlassHandle element (THREAD, elem_oop);
 
     // The element type could be a typeArray - we only need the access check if it is
--- a/hotspot/src/share/vm/oops/constantPool.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/constantPool.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -468,7 +468,7 @@
     assert(tag_at(which).is_string(), "Corrupted constant pool");
     // Must do an acquire here in case another thread resolved the klass
     // behind our back, lest we later load stale values thru the oop.
-    // we might want a volatile_obj_at in objArrayKlass.
+    // we might want a volatile_obj_at in ObjArrayKlass.
     int obj_index = cp_to_object_index(which);
     return resolved_references()->obj_at(obj_index);
   }
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -989,13 +989,13 @@
 
       // Check if update has already taken place
       if (this_oop->array_klasses() == NULL) {
-        Klass*    k = objArrayKlass::allocate_objArray_klass(this_oop->class_loader_data(), 1, this_oop, CHECK_NULL);
+        Klass*    k = ObjArrayKlass::allocate_objArray_klass(this_oop->class_loader_data(), 1, this_oop, CHECK_NULL);
         this_oop->set_array_klasses(k);
       }
     }
   }
   // _this will always be set at this point
-  objArrayKlass* oak = (objArrayKlass*)this_oop->array_klasses();
+  ObjArrayKlass* oak = (ObjArrayKlass*)this_oop->array_klasses();
   if (or_null) {
     return oak->array_klass_or_null(n);
   }
@@ -1224,12 +1224,12 @@
 
 void InstanceKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
   if (array_klasses() != NULL)
-    arrayKlass::cast(array_klasses())->array_klasses_do(f, THREAD);
+    ArrayKlass::cast(array_klasses())->array_klasses_do(f, THREAD);
 }
 
 void InstanceKlass::array_klasses_do(void f(Klass* k)) {
   if (array_klasses() != NULL)
-    arrayKlass::cast(array_klasses())->array_klasses_do(f);
+    ArrayKlass::cast(array_klasses())->array_klasses_do(f);
 }
 
 
@@ -2310,7 +2310,7 @@
   Symbol* classname1 = Klass::cast(class1)->name();
 
   if (Klass::cast(class2)->oop_is_objArray()) {
-    class2 = objArrayKlass::cast(class2)->bottom_klass();
+    class2 = ObjArrayKlass::cast(class2)->bottom_klass();
   }
   oop classloader2;
   if (Klass::cast(class2)->oop_is_instance()) {
--- a/hotspot/src/share/vm/oops/instanceOop.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/instanceOop.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -37,7 +37,9 @@
 
   // If compressed, the offset of the fields of the instance may not be aligned.
   static int base_offset_in_bytes() {
-    return UseCompressedKlassPointers ?
+    // offset computation code breaks if UseCompressedKlassPointers
+    // only is true
+    return (UseCompressedOops && UseCompressedKlassPointers) ?
              klass_gap_offset_in_bytes() :
              sizeof(instanceOopDesc);
   }
--- a/hotspot/src/share/vm/oops/klass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/klass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -532,13 +532,13 @@
 
 
 Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) {
-  fatal("array_klass should be dispatched to InstanceKlass, objArrayKlass or typeArrayKlass");
+  fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
   return NULL;
 }
 
 
 Klass* Klass::array_klass_impl(bool or_null, TRAPS) {
-  fatal("array_klass should be dispatched to InstanceKlass, objArrayKlass or typeArrayKlass");
+  fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
   return NULL;
 }
 
@@ -674,7 +674,7 @@
     assert(i>=0 && i<((InstanceKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds");
   } else {
     assert(oop_is_array(), "Must be");
-    assert(i>=0 && i<((arrayKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds");
+    assert(i>=0 && i<((ArrayKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds");
   }
 }
 
--- a/hotspot/src/share/vm/oops/klassVtable.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1096,7 +1096,7 @@
     SystemDictionary::classes_do(do_class);
     fixed  = no_klasses * oopSize;      // vtable length
     // filler size is a conservative approximation
-    filler = oopSize * (no_klasses - no_instance_klasses) * (sizeof(InstanceKlass) - sizeof(arrayKlass) - 1);
+    filler = oopSize * (no_klasses - no_instance_klasses) * (sizeof(InstanceKlass) - sizeof(ArrayKlass) - 1);
     entries = sizeof(vtableEntry) * sum_of_vtable_len;
     array_entries = sizeof(vtableEntry) * sum_of_array_vtable_len;
   }
--- a/hotspot/src/share/vm/oops/klassVtable.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/klassVtable.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -31,7 +31,7 @@
 #include "utilities/growableArray.hpp"
 
 // A klassVtable abstracts the variable-length vtable that is embedded in InstanceKlass
-// and arrayKlass.  klassVtable objects are used just as convenient transient accessors to the vtable,
+// and ArrayKlass.  klassVtable objects are used just as convenient transient accessors to the vtable,
 // not to actually hold the vtable data.
 // Note: the klassVtable should not be accessed before the class has been verified
 // (until that point, the vtable is uninitialized).
--- a/hotspot/src/share/vm/oops/method.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/method.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -712,7 +712,8 @@
   }
   if ((TraceDeoptimization || LogCompilation) && (xtty != NULL)) {
     ttyLocker ttyl;
-    xtty->begin_elem("make_not_%scompilable thread='%d'", is_osr ? "osr_" : "", (int) os::current_thread_id());
+    xtty->begin_elem("make_not_%scompilable thread='" UINTX_FORMAT "'",
+                     is_osr ? "osr_" : "", os::current_thread_id());
     xtty->method(this);
     xtty->stamp();
     xtty->end_elem();
@@ -1065,7 +1066,7 @@
 Klass* Method::check_non_bcp_klass(Klass* klass) {
   if (klass != NULL && Klass::cast(klass)->class_loader() != NULL) {
     if (Klass::cast(klass)->oop_is_objArray())
-      klass = objArrayKlass::cast(klass)->bottom_klass();
+      klass = ObjArrayKlass::cast(klass)->bottom_klass();
     return klass;
   }
   return NULL;
--- a/hotspot/src/share/vm/oops/objArrayKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -56,16 +56,16 @@
 #include "oops/oop.pcgc.inline.hpp"
 #endif
 
-objArrayKlass* objArrayKlass::allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS) {
-  assert(objArrayKlass::header_size() <= InstanceKlass::header_size(),
+ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS) {
+  assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(),
       "array klasses must be same size as InstanceKlass");
 
-  int size = arrayKlass::static_size(objArrayKlass::header_size());
+  int size = ArrayKlass::static_size(ObjArrayKlass::header_size());
 
-  return new (loader_data, size, THREAD) objArrayKlass(n, klass_handle, name);
+  return new (loader_data, size, THREAD) ObjArrayKlass(n, klass_handle, name);
 }
 
-Klass* objArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
+Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
                                                 int n, KlassHandle element_klass, TRAPS) {
 
   // Eagerly allocate the direct array supertype.
@@ -145,7 +145,7 @@
   }
 
   // Initialize instance variables
-  objArrayKlass* oak = objArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_0);
+  ObjArrayKlass* oak = ObjArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_0);
 
   // Add all classes to our internal class loader list here,
   // including classes in the bootstrap (NULL) class loader.
@@ -153,12 +153,12 @@
   loader_data->add_class(oak);
 
   // Call complete_create_array_klass after all instance variables has been initialized.
-  arrayKlass::complete_create_array_klass(oak, super_klass, CHECK_0);
+  ArrayKlass::complete_create_array_klass(oak, super_klass, CHECK_0);
 
   return oak;
 }
 
-objArrayKlass::objArrayKlass(int n, KlassHandle element_klass, Symbol* name) : arrayKlass(name) {
+ObjArrayKlass::ObjArrayKlass(int n, KlassHandle element_klass, Symbol* name) : ArrayKlass(name) {
   this->set_dimension(n);
   this->set_element_klass(element_klass());
   // decrement refcount because object arrays are not explicitly freed.  The
@@ -168,7 +168,7 @@
 
   Klass* bk;
   if (element_klass->oop_is_objArray()) {
-    bk = objArrayKlass::cast(element_klass())->bottom_klass();
+    bk = ObjArrayKlass::cast(element_klass())->bottom_klass();
   } else {
     bk = element_klass();
   }
@@ -181,12 +181,12 @@
   assert(this->oop_is_objArray(), "sanity");
 }
 
-int objArrayKlass::oop_size(oop obj) const {
+int ObjArrayKlass::oop_size(oop obj) const {
   assert(obj->is_objArray(), "must be object array");
   return objArrayOop(obj)->object_size();
 }
 
-objArrayOop objArrayKlass::allocate(int length, TRAPS) {
+objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
   if (length >= 0) {
     if (length <= arrayOopDesc::max_array_length(T_OBJECT)) {
       int size = objArrayOopDesc::object_size(length);
@@ -204,7 +204,7 @@
 
 static int multi_alloc_counter = 0;
 
-oop objArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
+oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
   int length = *sizes;
   // Call to lower_dimension uses this pointer, so most be called before a
   // possible GC
@@ -215,7 +215,7 @@
   if (rank > 1) {
     if (length != 0) {
       for (int index = 0; index < length; index++) {
-        arrayKlass* ak = arrayKlass::cast(h_lower_dimension());
+        ArrayKlass* ak = ArrayKlass::cast(h_lower_dimension());
         oop sub_array = ak->multi_allocate(rank-1, &sizes[1], CHECK_NULL);
         h_array->obj_at_put(index, sub_array);
       }
@@ -235,7 +235,7 @@
 }
 
 // Either oop or narrowOop depending on UseCompressedOops.
-template <class T> void objArrayKlass::do_copy(arrayOop s, T* src,
+template <class T> void ObjArrayKlass::do_copy(arrayOop s, T* src,
                                arrayOop d, T* dst, int length, TRAPS) {
 
   BarrierSet* bs = Universe::heap()->barrier_set();
@@ -252,8 +252,8 @@
     Copy::conjoint_oops_atomic(src, dst, length);
   } else {
     // We have to make sure all elements conform to the destination array
-    Klass* bound = objArrayKlass::cast(d->klass())->element_klass();
-    Klass* stype = objArrayKlass::cast(s->klass())->element_klass();
+    Klass* bound = ObjArrayKlass::cast(d->klass())->element_klass();
+    Klass* stype = ObjArrayKlass::cast(s->klass())->element_klass();
     if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
       // elements are guaranteed to be subtypes, so no check necessary
       bs->write_ref_array_pre(dst, length);
@@ -290,7 +290,7 @@
   bs->write_ref_array((HeapWord*)dst, length);
 }
 
-void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
+void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
                                int dst_pos, int length, TRAPS) {
   assert(s->is_objArray(), "must be obj array");
 
@@ -327,7 +327,7 @@
 }
 
 
-Klass* objArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
+Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
 
   assert(dimension() <= n, "check order of chain");
   int dim = dimension();
@@ -348,30 +348,30 @@
 
         // Create multi-dim klass object and link them together
         Klass* k =
-          objArrayKlass::allocate_objArray_klass(class_loader_data(), dim + 1, this, CHECK_NULL);
-        objArrayKlass* ak = objArrayKlass::cast(k);
+          ObjArrayKlass::allocate_objArray_klass(class_loader_data(), dim + 1, this, CHECK_NULL);
+        ObjArrayKlass* ak = ObjArrayKlass::cast(k);
         ak->set_lower_dimension(this);
         OrderAccess::storestore();
         set_higher_dimension(ak);
-        assert(ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
+        assert(ak->oop_is_objArray(), "incorrect initialization of ObjArrayKlass");
       }
     }
   } else {
     CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
   }
 
-  objArrayKlass *ak = objArrayKlass::cast(higher_dimension());
+  ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
   if (or_null) {
     return ak->array_klass_or_null(n);
   }
   return ak->array_klass(n, CHECK_NULL);
 }
 
-Klass* objArrayKlass::array_klass_impl(bool or_null, TRAPS) {
+Klass* ObjArrayKlass::array_klass_impl(bool or_null, TRAPS) {
   return array_klass_impl(or_null, dimension() +  1, CHECK_NULL);
 }
 
-bool objArrayKlass::can_be_primary_super_slow() const {
+bool ObjArrayKlass::can_be_primary_super_slow() const {
   if (!bottom_klass()->can_be_primary_super())
     // array of interfaces
     return false;
@@ -379,7 +379,7 @@
     return Klass::can_be_primary_super_slow();
 }
 
-GrowableArray<Klass*>* objArrayKlass::compute_secondary_supers(int num_extra_slots) {
+GrowableArray<Klass*>* ObjArrayKlass::compute_secondary_supers(int num_extra_slots) {
   // interfaces = { cloneable_klass, serializable_klass, elemSuper[], ... };
   Array<Klass*>* elem_supers = Klass::cast(element_klass())->secondary_supers();
   int num_elem_supers = elem_supers == NULL ? 0 : elem_supers->length();
@@ -402,16 +402,16 @@
   }
 }
 
-bool objArrayKlass::compute_is_subtype_of(Klass* k) {
+bool ObjArrayKlass::compute_is_subtype_of(Klass* k) {
   if (!k->oop_is_objArray())
-    return arrayKlass::compute_is_subtype_of(k);
+    return ArrayKlass::compute_is_subtype_of(k);
 
-  objArrayKlass* oak = objArrayKlass::cast(k);
+  ObjArrayKlass* oak = ObjArrayKlass::cast(k);
   return element_klass()->is_subtype_of(oak->element_klass());
 }
 
-void objArrayKlass::initialize(TRAPS) {
-  Klass::cast(bottom_klass())->initialize(THREAD);  // dispatches to either InstanceKlass or typeArrayKlass
+void ObjArrayKlass::initialize(TRAPS) {
+  Klass::cast(bottom_klass())->initialize(THREAD);  // dispatches to either InstanceKlass or TypeArrayKlass
 }
 
 #define ObjArrayKlass_SPECIALIZED_OOP_ITERATE(T, a, p, do_oop) \
@@ -456,7 +456,7 @@
       a, p, low, high, do_oop)                               \
   }
 
-void objArrayKlass::oop_follow_contents(oop obj) {
+void ObjArrayKlass::oop_follow_contents(oop obj) {
   assert (obj->is_array(), "obj must be array");
   MarkSweep::follow_klass(obj->klass());
   if (UseCompressedOops) {
@@ -467,7 +467,7 @@
 }
 
 #ifndef SERIALGC
-void objArrayKlass::oop_follow_contents(ParCompactionManager* cm,
+void ObjArrayKlass::oop_follow_contents(ParCompactionManager* cm,
                                         oop obj) {
   assert(obj->is_array(), "obj must be array");
   PSParallelCompact::follow_klass(cm, obj->klass());
@@ -487,7 +487,7 @@
 
 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)           \
                                                                                 \
-int objArrayKlass::oop_oop_iterate##nv_suffix(oop obj,                          \
+int ObjArrayKlass::oop_oop_iterate##nv_suffix(oop obj,                          \
                                               OopClosureType* closure) {        \
   SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::oa); \
   assert (obj->is_array(), "obj must be array");                                \
@@ -504,7 +504,7 @@
 
 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix)         \
                                                                                 \
-int objArrayKlass::oop_oop_iterate##nv_suffix##_m(oop obj,                      \
+int ObjArrayKlass::oop_oop_iterate##nv_suffix##_m(oop obj,                      \
                                                   OopClosureType* closure,      \
                                                   MemRegion mr) {               \
   SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::oa); \
@@ -526,7 +526,7 @@
 // for objArrayOops.
 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r(OopClosureType, nv_suffix)         \
                                                                                 \
-int objArrayKlass::oop_oop_iterate_range##nv_suffix(oop obj,                    \
+int ObjArrayKlass::oop_oop_iterate_range##nv_suffix(oop obj,                    \
                                                   OopClosureType* closure,      \
                                                   int start, int end) {         \
   SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::oa); \
@@ -567,7 +567,7 @@
 ALL_OOP_OOP_ITERATE_CLOSURES_1(ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r)
 ALL_OOP_OOP_ITERATE_CLOSURES_2(ObjArrayKlass_OOP_OOP_ITERATE_DEFN_r)
 
-int objArrayKlass::oop_adjust_pointers(oop obj) {
+int ObjArrayKlass::oop_adjust_pointers(oop obj) {
   assert(obj->is_objArray(), "obj must be obj array");
   objArrayOop a = objArrayOop(obj);
   // Get size before changing pointers.
@@ -579,7 +579,7 @@
 }
 
 #ifndef SERIALGC
-void objArrayKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
+void ObjArrayKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_objArray(), "obj must be obj array");
   ObjArrayKlass_OOP_ITERATE( \
     objArrayOop(obj), p, \
@@ -588,7 +588,7 @@
     })
 }
 
-int objArrayKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
+int ObjArrayKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   assert (obj->is_objArray(), "obj must be obj array");
   objArrayOop a = objArrayOop(obj);
   int size = a->object_size();
@@ -600,7 +600,7 @@
 
 // JVM support
 
-jint objArrayKlass::compute_modifier_flags(TRAPS) const {
+jint ObjArrayKlass::compute_modifier_flags(TRAPS) const {
   // The modifier for an objectArray is the same as its element
   if (element_klass() == NULL) {
     assert(Universe::is_bootstrapping(), "partial objArray only at startup");
@@ -616,7 +616,7 @@
 
 // Printing
 
-void objArrayKlass::print_on(outputStream* st) const {
+void ObjArrayKlass::print_on(outputStream* st) const {
 #ifndef PRODUCT
   Klass::print_on(st);
   st->print(" - instance klass: ");
@@ -625,7 +625,7 @@
 #endif //PRODUCT
 }
 
-void objArrayKlass::print_value_on(outputStream* st) const {
+void ObjArrayKlass::print_value_on(outputStream* st) const {
   assert(is_klass(), "must be klass");
 
   element_klass()->print_value_on(st);
@@ -634,8 +634,8 @@
 
 #ifndef PRODUCT
 
-void objArrayKlass::oop_print_on(oop obj, outputStream* st) {
-  arrayKlass::oop_print_on(obj, st);
+void ObjArrayKlass::oop_print_on(oop obj, outputStream* st) {
+  ArrayKlass::oop_print_on(obj, st);
   assert(obj->is_objArray(), "must be objArray");
   objArrayOop oa = objArrayOop(obj);
   int print_len = MIN2((intx) oa->length(), MaxElementPrintSize);
@@ -654,7 +654,7 @@
 
 static int max_objArray_print_length = 4;
 
-void objArrayKlass::oop_print_value_on(oop obj, outputStream* st) {
+void ObjArrayKlass::oop_print_value_on(oop obj, outputStream* st) {
   assert(obj->is_objArray(), "must be objArray");
   st->print("a ");
   element_klass()->print_value_on(st);
@@ -673,15 +673,15 @@
   }
 }
 
-const char* objArrayKlass::internal_name() const {
+const char* ObjArrayKlass::internal_name() const {
   return external_name();
 }
 
 
 // Verification
 
-void objArrayKlass::verify_on(outputStream* st) {
-  arrayKlass::verify_on(st);
+void ObjArrayKlass::verify_on(outputStream* st) {
+  ArrayKlass::verify_on(st);
   guarantee(element_klass()->is_metadata(), "should be in metaspace");
   guarantee(element_klass()->is_klass(), "should be klass");
   guarantee(bottom_klass()->is_metadata(), "should be in metaspace");
@@ -690,8 +690,8 @@
   guarantee(bk->oop_is_instance() || bk->oop_is_typeArray(),  "invalid bottom klass");
 }
 
-void objArrayKlass::oop_verify_on(oop obj, outputStream* st) {
-  arrayKlass::oop_verify_on(obj, st);
+void ObjArrayKlass::oop_verify_on(oop obj, outputStream* st) {
+  ArrayKlass::oop_verify_on(obj, st);
   guarantee(obj->is_objArray(), "must be objArray");
   objArrayOop oa = objArrayOop(obj);
   for(int index = 0; index < oa->length(); index++) {
--- a/hotspot/src/share/vm/oops/objArrayKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/objArrayKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -29,20 +29,20 @@
 #include "memory/specialized_oop_closures.hpp"
 #include "oops/arrayKlass.hpp"
 
-// objArrayKlass is the klass for objArrays
+// ObjArrayKlass is the klass for objArrays
 
-class objArrayKlass : public arrayKlass {
+class ObjArrayKlass : public ArrayKlass {
   friend class VMStructs;
  private:
   Klass* _element_klass;            // The klass of the elements of this array type
-  Klass* _bottom_klass;             // The one-dimensional type (InstanceKlass or typeArrayKlass)
+  Klass* _bottom_klass;             // The one-dimensional type (InstanceKlass or TypeArrayKlass)
 
   // Constructor
-  objArrayKlass(int n, KlassHandle element_klass, Symbol* name);
-  static objArrayKlass* allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS);
+  ObjArrayKlass(int n, KlassHandle element_klass, Symbol* name);
+  static ObjArrayKlass* allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS);
  public:
   // For dummy objects
-  objArrayKlass() {}
+  ObjArrayKlass() {}
 
   // Instance variables
   Klass* element_klass() const      { return _element_klass; }
@@ -54,7 +54,7 @@
   Klass** bottom_klass_addr()       { return &_bottom_klass; }
 
   // Compiler/Interpreter offset
-  static ByteSize element_klass_offset() { return in_ByteSize(offset_of(objArrayKlass, _element_klass)); }
+  static ByteSize element_klass_offset() { return in_ByteSize(offset_of(ObjArrayKlass, _element_klass)); }
 
   // Dispatched operation
   bool can_be_primary_super_slow() const;
@@ -78,11 +78,11 @@
 
  private:
   // Either oop or narrowOop depending on UseCompressedOops.
-  // must be called from within objArrayKlass.cpp
+  // must be called from within ObjArrayKlass.cpp
   template <class T> void do_copy(arrayOop s, T* src, arrayOop d,
                                   T* dst, int length, TRAPS);
  protected:
-  // Returns the objArrayKlass for n'th dimension.
+  // Returns the ObjArrayKlass for n'th dimension.
   virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
 
   // Returns the array class with this class as element type.
@@ -90,14 +90,14 @@
 
  public:
   // Casting from Klass*
-  static objArrayKlass* cast(Klass* k) {
-    assert(k->oop_is_objArray(), "cast to objArrayKlass");
-    return (objArrayKlass*) k;
+  static ObjArrayKlass* cast(Klass* k) {
+    assert(k->oop_is_objArray(), "cast to ObjArrayKlass");
+    return (ObjArrayKlass*) k;
   }
 
   // Sizing
-  static int header_size()                { return sizeof(objArrayKlass)/HeapWordSize; }
-  int size() const                        { return arrayKlass::static_size(header_size()); }
+  static int header_size()                { return sizeof(ObjArrayKlass)/HeapWordSize; }
+  int size() const                        { return ArrayKlass::static_size(header_size()); }
 
   // Initialization (virtual from Klass)
   void initialize(TRAPS);
--- a/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/objArrayKlass.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -32,7 +32,7 @@
 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
 #endif
 
-void objArrayKlass::oop_follow_contents(oop obj, int index) {
+void ObjArrayKlass::oop_follow_contents(oop obj, int index) {
   if (UseCompressedOops) {
     objarray_follow_contents<narrowOop>(obj, index);
   } else {
@@ -41,7 +41,7 @@
 }
 
 template <class T>
-void objArrayKlass::objarray_follow_contents(oop obj, int index) {
+void ObjArrayKlass::objarray_follow_contents(oop obj, int index) {
   objArrayOop a = objArrayOop(obj);
   const size_t len = size_t(a->length());
   const size_t beg_index = size_t(index);
@@ -64,7 +64,7 @@
 }
 
 #ifndef SERIALGC
-void objArrayKlass::oop_follow_contents(ParCompactionManager* cm, oop obj,
+void ObjArrayKlass::oop_follow_contents(ParCompactionManager* cm, oop obj,
                                         int index) {
   if (UseCompressedOops) {
     objarray_follow_contents<narrowOop>(cm, obj, index);
@@ -74,7 +74,7 @@
 }
 
 template <class T>
-void objArrayKlass::objarray_follow_contents(ParCompactionManager* cm, oop obj,
+void ObjArrayKlass::objarray_follow_contents(ParCompactionManager* cm, oop obj,
                                              int index) {
   objArrayOop a = objArrayOop(obj);
   const size_t len = size_t(a->length());
--- a/hotspot/src/share/vm/oops/objArrayOop.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/objArrayOop.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -31,7 +31,7 @@
                                                                                    \
 int objArrayOopDesc::oop_iterate_range(OopClosureType* blk, int start, int end) {  \
   SpecializationStats::record_call();                                              \
-  return ((objArrayKlass*)klass())->oop_oop_iterate_range##nv_suffix(this, blk, start, end); \
+  return ((ObjArrayKlass*)klass())->oop_oop_iterate_range##nv_suffix(this, blk, start, end); \
 }
 
 ALL_OOP_OOP_ITERATE_CLOSURES_1(ObjArrayOop_OOP_ITERATE_DEFN)
--- a/hotspot/src/share/vm/oops/objArrayOop.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/objArrayOop.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -31,7 +31,7 @@
 // Evaluating "String arg[10]" will create an objArrayOop.
 
 class objArrayOopDesc : public arrayOopDesc {
-  friend class objArrayKlass;
+  friend class ObjArrayKlass;
   friend class Runtime1;
   friend class psPromotionManager;
   friend class CSetMarkOopClosure;
--- a/hotspot/src/share/vm/oops/oop.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/oop.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -185,8 +185,8 @@
 inline bool check_obj_alignment(oop obj) {
   return (intptr_t)obj % MinObjAlignmentInBytes == 0;
 }
-inline bool check_obj_alignment(Klass* obj) {
-  return (intptr_t)obj % MinObjAlignmentInBytes == 0;
+inline bool check_klass_alignment(Klass* obj) {
+  return (intptr_t)obj % KlassAlignmentInBytes == 0;
 }
 
 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) {
@@ -228,9 +228,9 @@
 
 inline narrowOop oopDesc::encode_klass_not_null(Klass* v) {
   assert(!is_null(v), "oop value can never be zero");
-  assert(check_obj_alignment(v), "Address not aligned");
-  address base = Universe::narrow_oop_base();
-  int    shift = Universe::narrow_oop_shift();
+  assert(check_klass_alignment(v), "Address not aligned");
+  address base = Universe::narrow_klass_base();
+  int    shift = Universe::narrow_klass_shift();
   uint64_t  pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1));
   assert(OopEncodingHeapMax > pd, "change encoding max if new encoding");
   uint64_t result = pd >> shift;
@@ -245,10 +245,10 @@
 
 inline Klass* oopDesc::decode_klass_not_null(narrowOop v) {
   assert(!is_null(v), "narrow oop value can never be zero");
-  address base = Universe::narrow_oop_base();
-  int    shift = Universe::narrow_oop_shift();
+  address base = Universe::narrow_klass_base();
+  int    shift = Universe::narrow_klass_shift();
   Klass* result = (Klass*)(void*)((uintptr_t)base + ((uintptr_t)v << shift));
-  assert(check_obj_alignment(result), err_msg("address not aligned: " PTR_FORMAT, (void*) result));
+  assert(check_klass_alignment(result), err_msg("address not aligned: " PTR_FORMAT, (void*) result));
   return result;
 }
 
--- a/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -44,7 +44,7 @@
     // It might contain oops beyond the header, so take the virtual call.
     new_klass->oop_update_pointers(cm, this);
   }
-  // Else skip it.  The typeArrayKlass in the header never needs scavenging.
+  // Else skip it.  The TypeArrayKlass in the header never needs scavenging.
 }
 
 inline void oopDesc::follow_contents(ParCompactionManager* cm) {
--- a/hotspot/src/share/vm/oops/oop.psgc.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/oop.psgc.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -39,7 +39,7 @@
     // It might contain oops beyond the header, so take the virtual call.
     k->oop_push_contents(pm, this);
   }
-  // Else skip it.  The typeArrayKlass in the header never needs scavenging.
+  // Else skip it.  The TypeArrayKlass in the header never needs scavenging.
 }
 
 #endif // SHARE_VM_OOPS_OOP_PSGC_INLINE_HPP
--- a/hotspot/src/share/vm/oops/oopsHierarchy.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/oopsHierarchy.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -128,7 +128,7 @@
 #endif
 
   // from parNewGeneration and other things that want to get to the end of
-  // an oop for stuff (like objArrayKlass.cpp)
+  // an oop for stuff (like ObjArrayKlass.cpp)
   operator oop* () const              { return (oop *)obj(); }
 };
 
@@ -172,8 +172,8 @@
 class     InstanceMirrorKlass;
 class     InstanceClassLoaderKlass;
 class     InstanceRefKlass;
-class   arrayKlass;
-class     objArrayKlass;
-class     typeArrayKlass;
+class   ArrayKlass;
+class     ObjArrayKlass;
+class     TypeArrayKlass;
 
 #endif // SHARE_VM_OOPS_OOPSHIERARCHY_HPP
--- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -40,18 +40,18 @@
 #include "oops/typeArrayOop.hpp"
 #include "runtime/handles.inline.hpp"
 
-bool typeArrayKlass::compute_is_subtype_of(Klass* k) {
+bool TypeArrayKlass::compute_is_subtype_of(Klass* k) {
   if (!k->oop_is_typeArray()) {
-    return arrayKlass::compute_is_subtype_of(k);
+    return ArrayKlass::compute_is_subtype_of(k);
   }
 
-  typeArrayKlass* tak = typeArrayKlass::cast(k);
+  TypeArrayKlass* tak = TypeArrayKlass::cast(k);
   if (dimension() != tak->dimension()) return false;
 
   return element_type() == tak->element_type();
 }
 
-typeArrayKlass* typeArrayKlass::create_klass(BasicType type,
+TypeArrayKlass* TypeArrayKlass::create_klass(BasicType type,
                                       const char* name_str, TRAPS) {
   Symbol* sym = NULL;
   if (name_str != NULL) {
@@ -60,7 +60,7 @@
 
   ClassLoaderData* null_loader_data = ClassLoaderData::the_null_class_loader_data();
 
-  typeArrayKlass* ak = typeArrayKlass::allocate(null_loader_data, type, sym, CHECK_NULL);
+  TypeArrayKlass* ak = TypeArrayKlass::allocate(null_loader_data, type, sym, CHECK_NULL);
 
   // Add all classes to our internal class loader list here,
   // including classes in the bootstrap (NULL) class loader.
@@ -73,27 +73,27 @@
   return ak;
 }
 
-typeArrayKlass* typeArrayKlass::allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS) {
-  assert(typeArrayKlass::header_size() <= InstanceKlass::header_size(),
+TypeArrayKlass* TypeArrayKlass::allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS) {
+  assert(TypeArrayKlass::header_size() <= InstanceKlass::header_size(),
       "array klasses must be same size as InstanceKlass");
 
-  int size = arrayKlass::static_size(typeArrayKlass::header_size());
+  int size = ArrayKlass::static_size(TypeArrayKlass::header_size());
 
-  return new (loader_data, size, THREAD) typeArrayKlass(type, name);
+  return new (loader_data, size, THREAD) TypeArrayKlass(type, name);
 }
 
-typeArrayKlass::typeArrayKlass(BasicType type, Symbol* name) : arrayKlass(name) {
+TypeArrayKlass::TypeArrayKlass(BasicType type, Symbol* name) : ArrayKlass(name) {
   set_layout_helper(array_layout_helper(type));
   assert(oop_is_array(), "sanity");
   assert(oop_is_typeArray(), "sanity");
 
   set_max_length(arrayOopDesc::max_array_length(type));
-  assert(size() >= typeArrayKlass::header_size(), "bad size");
+  assert(size() >= TypeArrayKlass::header_size(), "bad size");
 
   set_class_loader_data(ClassLoaderData::the_null_class_loader_data());
 }
 
-typeArrayOop typeArrayKlass::allocate_common(int length, bool do_zero, TRAPS) {
+typeArrayOop TypeArrayKlass::allocate_common(int length, bool do_zero, TRAPS) {
   assert(log2_element_size() >= 0, "bad scale");
   if (length >= 0) {
     if (length <= max_length()) {
@@ -117,7 +117,7 @@
   }
 }
 
-oop typeArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {
+oop TypeArrayKlass::multi_allocate(int rank, jint* last_size, TRAPS) {
   // For typeArrays this is only called for the last dimension
   assert(rank == 1, "just checking");
   int length = *last_size;
@@ -125,11 +125,11 @@
 }
 
 
-void typeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
+void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS) {
   assert(s->is_typeArray(), "must be type array");
 
   // Check destination
-  if (!d->is_typeArray() || element_type() != typeArrayKlass::cast(d->klass())->element_type()) {
+  if (!d->is_typeArray() || element_type() != TypeArrayKlass::cast(d->klass())->element_type()) {
     THROW(vmSymbols::java_lang_ArrayStoreException());
   }
 
@@ -156,7 +156,7 @@
 
 
 // create a klass of array holding typeArrays
-Klass* typeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
+Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
   int dim = dimension();
   assert(dim <= n, "check order of chain");
     if (dim == n)
@@ -173,92 +173,92 @@
       MutexLocker mu(MultiArray_lock, THREAD);
 
       if (higher_dimension() == NULL) {
-        Klass* oak = objArrayKlass::allocate_objArray_klass(
+        Klass* oak = ObjArrayKlass::allocate_objArray_klass(
               class_loader_data(), dim + 1, this, CHECK_NULL);
-        objArrayKlass* h_ak = objArrayKlass::cast(oak);
+        ObjArrayKlass* h_ak = ObjArrayKlass::cast(oak);
         h_ak->set_lower_dimension(this);
         OrderAccess::storestore();
         set_higher_dimension(h_ak);
-        assert(h_ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
+        assert(h_ak->oop_is_objArray(), "incorrect initialization of ObjArrayKlass");
       }
     }
   } else {
     CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
   }
-  objArrayKlass* h_ak = objArrayKlass::cast(higher_dimension());
+  ObjArrayKlass* h_ak = ObjArrayKlass::cast(higher_dimension());
   if (or_null) {
     return h_ak->array_klass_or_null(n);
   }
   return h_ak->array_klass(n, CHECK_NULL);
 }
 
-Klass* typeArrayKlass::array_klass_impl(bool or_null, TRAPS) {
+Klass* TypeArrayKlass::array_klass_impl(bool or_null, TRAPS) {
   return array_klass_impl(or_null, dimension() +  1, THREAD);
 }
 
-int typeArrayKlass::oop_size(oop obj) const {
+int TypeArrayKlass::oop_size(oop obj) const {
   assert(obj->is_typeArray(),"must be a type array");
   typeArrayOop t = typeArrayOop(obj);
   return t->object_size();
 }
 
-void typeArrayKlass::oop_follow_contents(oop obj) {
+void TypeArrayKlass::oop_follow_contents(oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
   // Performance tweak: We skip iterating over the klass pointer since we
-  // know that Universe::typeArrayKlass never moves.
+  // know that Universe::TypeArrayKlass never moves.
 }
 
 #ifndef SERIALGC
-void typeArrayKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) {
+void TypeArrayKlass::oop_follow_contents(ParCompactionManager* cm, oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
   // Performance tweak: We skip iterating over the klass pointer since we
-  // know that Universe::typeArrayKlass never moves.
+  // know that Universe::TypeArrayKlass never moves.
 }
 #endif // SERIALGC
 
-int typeArrayKlass::oop_adjust_pointers(oop obj) {
+int TypeArrayKlass::oop_adjust_pointers(oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
   typeArrayOop t = typeArrayOop(obj);
   // Performance tweak: We skip iterating over the klass pointer since we
-  // know that Universe::typeArrayKlass never moves.
+  // know that Universe::TypeArrayKlass never moves.
   return t->object_size();
 }
 
-int typeArrayKlass::oop_oop_iterate(oop obj, ExtendedOopClosure* blk) {
+int TypeArrayKlass::oop_oop_iterate(oop obj, ExtendedOopClosure* blk) {
   assert(obj->is_typeArray(),"must be a type array");
   typeArrayOop t = typeArrayOop(obj);
   // Performance tweak: We skip iterating over the klass pointer since we
-  // know that Universe::typeArrayKlass never moves.
+  // know that Universe::TypeArrayKlass never moves.
   return t->object_size();
 }
 
-int typeArrayKlass::oop_oop_iterate_m(oop obj, ExtendedOopClosure* blk, MemRegion mr) {
+int TypeArrayKlass::oop_oop_iterate_m(oop obj, ExtendedOopClosure* blk, MemRegion mr) {
   assert(obj->is_typeArray(),"must be a type array");
   typeArrayOop t = typeArrayOop(obj);
   // Performance tweak: We skip iterating over the klass pointer since we
-  // know that Universe::typeArrayKlass never moves.
+  // know that Universe::TypeArrayKlass never moves.
   return t->object_size();
 }
 
 #ifndef SERIALGC
-void typeArrayKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
+void TypeArrayKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   ShouldNotReachHere();
   assert(obj->is_typeArray(),"must be a type array");
 }
 
 int
-typeArrayKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
+TypeArrayKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   assert(obj->is_typeArray(),"must be a type array");
   return typeArrayOop(obj)->object_size();
 }
 #endif // SERIALGC
 
-void typeArrayKlass::initialize(TRAPS) {
+void TypeArrayKlass::initialize(TRAPS) {
   // Nothing to do. Having this function is handy since objArrayKlasses can be
-  // initialized by calling initialize on their bottom_klass, see objArrayKlass::initialize
+  // initialized by calling initialize on their bottom_klass, see ObjArrayKlass::initialize
 }
 
-const char* typeArrayKlass::external_name(BasicType type) {
+const char* TypeArrayKlass::external_name(BasicType type) {
   switch (type) {
     case T_BOOLEAN: return "[Z";
     case T_CHAR:    return "[C";
@@ -276,7 +276,7 @@
 
 // Printing
 
-void typeArrayKlass::print_on(outputStream* st) const {
+void TypeArrayKlass::print_on(outputStream* st) const {
 #ifndef PRODUCT
   assert(is_klass(), "must be klass");
   print_value_on(st);
@@ -284,7 +284,7 @@
 #endif //PRODUCT
 }
 
-void typeArrayKlass::print_value_on(outputStream* st) const {
+void TypeArrayKlass::print_value_on(outputStream* st) const {
   assert(is_klass(), "must be klass");
   st->print("{type array ");
   switch (element_type()) {
@@ -364,8 +364,8 @@
 }
 
 
-void typeArrayKlass::oop_print_on(oop obj, outputStream* st) {
-  arrayKlass::oop_print_on(obj, st);
+void TypeArrayKlass::oop_print_on(oop obj, outputStream* st) {
+  ArrayKlass::oop_print_on(obj, st);
   typeArrayOop ta = typeArrayOop(obj);
   int print_len = MIN2((intx) ta->length(), MaxElementPrintSize);
   switch (element_type()) {
@@ -387,6 +387,6 @@
 
 #endif // PRODUCT
 
-const char* typeArrayKlass::internal_name() const {
+const char* TypeArrayKlass::internal_name() const {
   return Klass::external_name();
 }
--- a/hotspot/src/share/vm/oops/typeArrayKlass.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -28,19 +28,19 @@
 #include "classfile/classLoaderData.hpp"
 #include "oops/arrayKlass.hpp"
 
-// A typeArrayKlass is the klass of a typeArray
+// A TypeArrayKlass is the klass of a typeArray
 // It contains the type and size of the elements
 
-class typeArrayKlass : public arrayKlass {
+class TypeArrayKlass : public ArrayKlass {
   friend class VMStructs;
  private:
   jint _max_length;            // maximum number of elements allowed in an array
 
   // Constructor
-  typeArrayKlass(BasicType type, Symbol* name);
-  static typeArrayKlass* allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS);
+  TypeArrayKlass(BasicType type, Symbol* name);
+  static TypeArrayKlass* allocate(ClassLoaderData* loader_data, BasicType type, Symbol* name, TRAPS);
  public:
-  typeArrayKlass() {} // For dummy objects.
+  TypeArrayKlass() {} // For dummy objects.
 
   // instance variables
   jint max_length()                     { return _max_length; }
@@ -50,10 +50,10 @@
   bool oop_is_typeArray_slow() const    { return true; }
 
   // klass allocation
-  static typeArrayKlass* create_klass(BasicType type, const char* name_str,
+  static TypeArrayKlass* create_klass(BasicType type, const char* name_str,
                                TRAPS);
   static inline Klass* create_klass(BasicType type, int scale, TRAPS) {
-    typeArrayKlass* tak = create_klass(type, external_name(type), CHECK_NULL);
+    TypeArrayKlass* tak = create_klass(type, external_name(type), CHECK_NULL);
     assert(scale == (1 << tak->log2_element_size()), "scale must check out");
     return tak;
   }
@@ -90,17 +90,17 @@
 
  public:
   // Casting from Klass*
-  static typeArrayKlass* cast(Klass* k) {
-    assert(k->oop_is_typeArray(), "cast to typeArrayKlass");
-    return (typeArrayKlass*) k;
+  static TypeArrayKlass* cast(Klass* k) {
+    assert(k->oop_is_typeArray(), "cast to TypeArrayKlass");
+    return (TypeArrayKlass*) k;
   }
 
   // Naming
   static const char* external_name(BasicType type);
 
   // Sizing
-  static int header_size()  { return sizeof(typeArrayKlass)/HeapWordSize; }
-  int size() const          { return arrayKlass::static_size(header_size()); }
+  static int header_size()  { return sizeof(TypeArrayKlass)/HeapWordSize; }
+  int size() const          { return ArrayKlass::static_size(header_size()); }
 
   // Initialization (virtual from Klass)
   void initialize(TRAPS);
--- a/hotspot/src/share/vm/oops/typeArrayOop.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/oops/typeArrayOop.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -73,7 +73,7 @@
   jfloat*   float_base()  const { return (jfloat*)  base(T_FLOAT); }
   jdouble*  double_base() const { return (jdouble*) base(T_DOUBLE); }
 
-  friend class typeArrayKlass;
+  friend class TypeArrayKlass;
 
  public:
   jbyte* byte_at_addr(int which) const {
@@ -190,7 +190,7 @@
 
  public:
   int object_size() {
-    typeArrayKlass* tk = typeArrayKlass::cast(klass());
+    TypeArrayKlass* tk = TypeArrayKlass::cast(klass());
     return object_size(tk->layout_helper(), length());
   }
 };
--- a/hotspot/src/share/vm/opto/addnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/addnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/block.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/block.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/block.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/block.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -439,9 +439,7 @@
   WarmCallInfo wci = *(initial_wci);
   failure_msg = try_to_inline(callee_method, caller_method, caller_bci, profile, &wci);
   if (failure_msg != NULL && C->log() != NULL) {
-    C->log()->begin_elem("inline_fail reason='");
-    C->log()->text("%s", failure_msg);
-    C->log()->end_elem("'");
+    C->log()->inline_fail(failure_msg);
   }
 
 #ifndef PRODUCT
--- a/hotspot/src/share/vm/opto/callGenerator.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/callGenerator.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/opto/cfgnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1386,7 +1386,7 @@
     Node *n = phi->in(i);
     if( !n ) return NULL;
     if( phase->type(n) == Type::TOP ) return NULL;
-    if( n->Opcode() == Op_ConP || n->Opcode() == Op_ConN )
+    if( n->Opcode() == Op_ConP || n->Opcode() == Op_ConN || n->Opcode() == Op_ConNKlass )
       break;
   }
   if( i >= phi->req() )         // Only split for constants
@@ -1875,17 +1875,19 @@
   }
 
 #ifdef _LP64
-  // Push DecodeN down through phi.
+  // Push DecodeN/DecodeNKlass down through phi.
   // The rest of phi graph will transform by split EncodeP node though phis up.
-  if (UseCompressedOops && can_reshape && progress == NULL) {
+  if ((UseCompressedOops || UseCompressedKlassPointers) && can_reshape && progress == NULL) {
     bool may_push = true;
     bool has_decodeN = false;
+    bool is_decodeN = false;
     for (uint i=1; i<req(); ++i) {// For all paths in
       Node *ii = in(i);
-      if (ii->is_DecodeN() && ii->bottom_type() == bottom_type()) {
+      if (ii->is_DecodeNarrowPtr() && ii->bottom_type() == bottom_type()) {
         // Do optimization if a non dead path exist.
         if (ii->in(1)->bottom_type() != Type::TOP) {
           has_decodeN = true;
+          is_decodeN = ii->is_DecodeN();
         }
       } else if (!ii->is_Phi()) {
         may_push = false;
@@ -1895,13 +1897,18 @@
     if (has_decodeN && may_push) {
       PhaseIterGVN *igvn = phase->is_IterGVN();
       // Make narrow type for new phi.
-      const Type* narrow_t = TypeNarrowOop::make(this->bottom_type()->is_ptr());
+      const Type* narrow_t;
+      if (is_decodeN) {
+        narrow_t = TypeNarrowOop::make(this->bottom_type()->is_ptr());
+      } else {
+        narrow_t = TypeNarrowKlass::make(this->bottom_type()->is_ptr());
+      }
       PhiNode* new_phi = new (phase->C) PhiNode(r, narrow_t);
       uint orig_cnt = req();
       for (uint i=1; i<req(); ++i) {// For all paths in
         Node *ii = in(i);
         Node* new_ii = NULL;
-        if (ii->is_DecodeN()) {
+        if (ii->is_DecodeNarrowPtr()) {
           assert(ii->bottom_type() == bottom_type(), "sanity");
           new_ii = ii->in(1);
         } else {
@@ -1909,14 +1916,22 @@
           if (ii->as_Phi() == this) {
             new_ii = new_phi;
           } else {
-            new_ii = new (phase->C) EncodePNode(ii, narrow_t);
+            if (is_decodeN) {
+              new_ii = new (phase->C) EncodePNode(ii, narrow_t);
+            } else {
+              new_ii = new (phase->C) EncodePKlassNode(ii, narrow_t);
+            }
             igvn->register_new_node_with_optimizer(new_ii);
           }
         }
         new_phi->set_req(i, new_ii);
       }
       igvn->register_new_node_with_optimizer(new_phi, this);
-      progress = new (phase->C) DecodeNNode(new_phi, bottom_type());
+      if (is_decodeN) {
+        progress = new (phase->C) DecodeNNode(new_phi, bottom_type());
+      } else {
+        progress = new (phase->C) DecodeNKlassNode(new_phi, bottom_type());
+      }
     }
   }
 #endif
--- a/hotspot/src/share/vm/opto/classes.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/classes.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -91,6 +91,7 @@
 macro(GetAndSetN)
 macro(Con)
 macro(ConN)
+macro(ConNKlass)
 macro(ConD)
 macro(ConF)
 macro(ConI)
@@ -118,6 +119,7 @@
 macro(CountTrailingZerosL)
 macro(CreateEx)
 macro(DecodeN)
+macro(DecodeNKlass)
 macro(DivD)
 macro(DivF)
 macro(DivI)
@@ -126,6 +128,7 @@
 macro(DivModI)
 macro(DivModL)
 macro(EncodeP)
+macro(EncodePKlass)
 macro(ExpD)
 macro(FastLock)
 macro(FastUnlock)
@@ -147,7 +150,6 @@
 macro(LoadD_unaligned)
 macro(LoadF)
 macro(LoadI)
-macro(LoadUI2L)
 macro(LoadKlass)
 macro(LoadNKlass)
 macro(LoadL)
@@ -233,6 +235,7 @@
 macro(StoreL)
 macro(StoreP)
 macro(StoreN)
+macro(StoreNKlass)
 macro(StrComp)
 macro(StrEquals)
 macro(StrIndexOf)
--- a/hotspot/src/share/vm/opto/compile.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/compile.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -828,6 +828,9 @@
                            has_unsafe_access(),
                            SharedRuntime::is_wide_vector(max_vector_size())
                            );
+
+    if (log() != NULL) // Print code cache state into compiler log
+      log()->code_cache_state();
   }
 }
 
@@ -2236,6 +2239,7 @@
           nop != Op_CreateEx &&
           nop != Op_CheckCastPP &&
           nop != Op_DecodeN &&
+          nop != Op_DecodeNKlass &&
           !n->is_Mem() ) {
         Node *x = n->clone();
         call->set_req( TypeFunc::Parms, x );
@@ -2284,11 +2288,11 @@
   case Op_GetAndSetN:
   case Op_StoreP:
   case Op_StoreN:
+  case Op_StoreNKlass:
   case Op_LoadB:
   case Op_LoadUB:
   case Op_LoadUS:
   case Op_LoadI:
-  case Op_LoadUI2L:
   case Op_LoadKlass:
   case Op_LoadNKlass:
   case Op_LoadL:
@@ -2318,7 +2322,7 @@
             addp->in(AddPNode::Base) == n->in(AddPNode::Base),
             "Base pointers must match" );
 #ifdef _LP64
-    if (UseCompressedOops &&
+    if ((UseCompressedOops || UseCompressedKlassPointers) &&
         addp->Opcode() == Op_ConP &&
         addp == n->in(AddPNode::Base) &&
         n->in(AddPNode::Offset)->is_Con()) {
@@ -2327,16 +2331,18 @@
       // instructions (4) then load 64-bits constant (7).
       // Do this transformation here since IGVN will convert ConN back to ConP.
       const Type* t = addp->bottom_type();
-      if (t->isa_oopptr()) {
+      if (t->isa_oopptr() || t->isa_klassptr()) {
         Node* nn = NULL;
 
+        int op = t->isa_oopptr() ? Op_ConN : Op_ConNKlass;
+
         // Look for existing ConN node of the same exact type.
         Compile* C = Compile::current();
         Node* r  = C->root();
         uint cnt = r->outcnt();
         for (uint i = 0; i < cnt; i++) {
           Node* m = r->raw_out(i);
-          if (m!= NULL && m->Opcode() == Op_ConN &&
+          if (m!= NULL && m->Opcode() == op &&
               m->bottom_type()->make_ptr() == t) {
             nn = m;
             break;
@@ -2345,7 +2351,11 @@
         if (nn != NULL) {
           // Decode a narrow oop to match address
           // [R12 + narrow_oop_reg<<3 + offset]
-          nn = new (C) DecodeNNode(nn, t);
+          if (t->isa_oopptr()) {
+            nn = new (C) DecodeNNode(nn, t);
+          } else {
+            nn = new (C) DecodeNKlassNode(nn, t);
+          }
           n->set_req(AddPNode::Base, nn);
           n->set_req(AddPNode::Address, nn);
           if (addp->outcnt() == 0) {
@@ -2400,22 +2410,24 @@
   case Op_CmpP:
     // Do this transformation here to preserve CmpPNode::sub() and
     // other TypePtr related Ideal optimizations (for example, ptr nullness).
-    if (n->in(1)->is_DecodeN() || n->in(2)->is_DecodeN()) {
+    if (n->in(1)->is_DecodeNarrowPtr() || n->in(2)->is_DecodeNarrowPtr()) {
       Node* in1 = n->in(1);
       Node* in2 = n->in(2);
-      if (!in1->is_DecodeN()) {
+      if (!in1->is_DecodeNarrowPtr()) {
         in2 = in1;
         in1 = n->in(2);
       }
-      assert(in1->is_DecodeN(), "sanity");
+      assert(in1->is_DecodeNarrowPtr(), "sanity");
 
       Compile* C = Compile::current();
       Node* new_in2 = NULL;
-      if (in2->is_DecodeN()) {
+      if (in2->is_DecodeNarrowPtr()) {
+        assert(in2->Opcode() == in1->Opcode(), "must be same node type");
         new_in2 = in2->in(1);
       } else if (in2->Opcode() == Op_ConP) {
         const Type* t = in2->bottom_type();
         if (t == TypePtr::NULL_PTR) {
+          assert(in1->is_DecodeN(), "compare klass to null?");
           // Don't convert CmpP null check into CmpN if compressed
           // oops implicit null check is not generated.
           // This will allow to generate normal oop implicit null check.
@@ -2460,6 +2472,8 @@
           //
         } else if (t->isa_oopptr()) {
           new_in2 = ConNode::make(C, t->make_narrowoop());
+        } else if (t->isa_klassptr()) {
+          new_in2 = ConNode::make(C, t->make_narrowklass());
         }
       }
       if (new_in2 != NULL) {
@@ -2476,23 +2490,28 @@
     break;
 
   case Op_DecodeN:
-    assert(!n->in(1)->is_EncodeP(), "should be optimized out");
+  case Op_DecodeNKlass:
+    assert(!n->in(1)->is_EncodeNarrowPtr(), "should be optimized out");
     // DecodeN could be pinned when it can't be fold into
     // an address expression, see the code for Op_CastPP above.
-    assert(n->in(0) == NULL || !Matcher::narrow_oop_use_complex_address(), "no control");
+    assert(n->in(0) == NULL || (UseCompressedOops && !Matcher::narrow_oop_use_complex_address()), "no control");
     break;
 
-  case Op_EncodeP: {
+  case Op_EncodeP:
+  case Op_EncodePKlass: {
     Node* in1 = n->in(1);
-    if (in1->is_DecodeN()) {
+    if (in1->is_DecodeNarrowPtr()) {
       n->subsume_by(in1->in(1));
     } else if (in1->Opcode() == Op_ConP) {
       Compile* C = Compile::current();
       const Type* t = in1->bottom_type();
       if (t == TypePtr::NULL_PTR) {
+        assert(t->isa_oopptr(), "null klass?");
         n->subsume_by(ConNode::make(C, TypeNarrowOop::NULL_PTR));
       } else if (t->isa_oopptr()) {
         n->subsume_by(ConNode::make(C, t->make_narrowoop()));
+      } else if (t->isa_klassptr()) {
+        n->subsume_by(ConNode::make(C, t->make_narrowklass()));
       }
     }
     if (in1->outcnt() == 0) {
@@ -2526,7 +2545,7 @@
   }
 
   case Op_Phi:
-    if (n->as_Phi()->bottom_type()->isa_narrowoop()) {
+    if (n->as_Phi()->bottom_type()->isa_narrowoop() || n->as_Phi()->bottom_type()->isa_narrowklass()) {
       // The EncodeP optimization may create Phi with the same edges
       // for all paths. It is not handled well by Register Allocator.
       Node* unique_in = n->in(1);
@@ -2689,12 +2708,13 @@
   }
 
   // Skip next transformation if compressed oops are not used.
-  if (!UseCompressedOops || !Matcher::gen_narrow_oop_implicit_null_checks())
+  if ((UseCompressedOops && !Matcher::gen_narrow_oop_implicit_null_checks()) ||
+      (!UseCompressedOops && !UseCompressedKlassPointers))
     return;
 
-  // Go over safepoints nodes to skip DecodeN nodes for debug edges.
+  // Go over safepoints nodes to skip DecodeN/DecodeNKlass nodes for debug edges.
   // It could be done for an uncommon traps or any safepoints/calls
-  // if the DecodeN node is referenced only in a debug info.
+  // if the DecodeN/DecodeNKlass node is referenced only in a debug info.
   while (sfpt.size() > 0) {
     n = sfpt.pop();
     JVMState *jvms = n->as_SafePoint()->jvms();
@@ -2705,7 +2725,7 @@
                         n->as_CallStaticJava()->uncommon_trap_request() != 0);
     for (int j = start; j < end; j++) {
       Node* in = n->in(j);
-      if (in->is_DecodeN()) {
+      if (in->is_DecodeNarrowPtr()) {
         bool safe_to_skip = true;
         if (!is_uncommon ) {
           // Is it safe to skip?
--- a/hotspot/src/share/vm/opto/connode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/connode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -45,16 +45,17 @@
 //------------------------------make-------------------------------------------
 ConNode *ConNode::make( Compile* C, const Type *t ) {
   switch( t->basic_type() ) {
-  case T_INT:       return new (C) ConINode( t->is_int() );
-  case T_LONG:      return new (C) ConLNode( t->is_long() );
-  case T_FLOAT:     return new (C) ConFNode( t->is_float_constant() );
-  case T_DOUBLE:    return new (C) ConDNode( t->is_double_constant() );
-  case T_VOID:      return new (C) ConNode ( Type::TOP );
-  case T_OBJECT:    return new (C) ConPNode( t->is_ptr() );
-  case T_ARRAY:     return new (C) ConPNode( t->is_aryptr() );
-  case T_ADDRESS:   return new (C) ConPNode( t->is_ptr() );
-  case T_NARROWOOP: return new (C) ConNNode( t->is_narrowoop() );
-  case T_METADATA:  return new (C) ConPNode( t->is_ptr() );
+  case T_INT:         return new (C) ConINode( t->is_int() );
+  case T_LONG:        return new (C) ConLNode( t->is_long() );
+  case T_FLOAT:       return new (C) ConFNode( t->is_float_constant() );
+  case T_DOUBLE:      return new (C) ConDNode( t->is_double_constant() );
+  case T_VOID:        return new (C) ConNode ( Type::TOP );
+  case T_OBJECT:      return new (C) ConPNode( t->is_ptr() );
+  case T_ARRAY:       return new (C) ConPNode( t->is_aryptr() );
+  case T_ADDRESS:     return new (C) ConPNode( t->is_ptr() );
+  case T_NARROWOOP:   return new (C) ConNNode( t->is_narrowoop() );
+  case T_NARROWKLASS: return new (C) ConNKlassNode( t->is_narrowklass() );
+  case T_METADATA:    return new (C) ConPNode( t->is_ptr() );
     // Expected cases:  TypePtr::NULL_PTR, any is_rawptr()
     // Also seen: AnyPtr(TopPTR *+top); from command line:
     //   r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660
@@ -447,7 +448,7 @@
 // If not converting int->oop, throw away cast after constant propagation
 Node *CastPPNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
   const Type *t = ccp->type(in(1));
-  if (!t->isa_oop_ptr() || (in(1)->is_DecodeN() && Matcher::gen_narrow_oop_implicit_null_checks())) {
+  if (!t->isa_oop_ptr() || ((in(1)->is_DecodeN()) && Matcher::gen_narrow_oop_implicit_null_checks())) {
     return NULL; // do not transform raw pointers or narrow oops
   }
   return ConstraintCastNode::Ideal_DU_postCCP(ccp);
@@ -607,15 +608,56 @@
   if (t == Type::TOP) return Type::TOP;
   if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR;
 
-  assert(t->isa_oop_ptr() || UseCompressedKlassPointers && t->isa_klassptr(), "only oopptr here");
+  assert(t->isa_oop_ptr(), "only oopptr here");
   return t->make_narrowoop();
 }
 
 
-Node *EncodePNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
+Node *EncodeNarrowPtrNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
   return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1));
 }
 
+Node* DecodeNKlassNode::Identity(PhaseTransform* phase) {
+  const Type *t = phase->type( in(1) );
+  if( t == Type::TOP ) return in(1);
+
+  if (in(1)->is_EncodePKlass()) {
+    // (DecodeNKlass (EncodePKlass p)) -> p
+    return in(1)->in(1);
+  }
+  return this;
+}
+
+const Type *DecodeNKlassNode::Value( PhaseTransform *phase ) const {
+  const Type *t = phase->type( in(1) );
+  if (t == Type::TOP) return Type::TOP;
+  assert(t != TypeNarrowKlass::NULL_PTR, "null klass?");
+
+  assert(t->isa_narrowklass(), "only narrow klass ptr here");
+  return t->make_ptr();
+}
+
+Node* EncodePKlassNode::Identity(PhaseTransform* phase) {
+  const Type *t = phase->type( in(1) );
+  if( t == Type::TOP ) return in(1);
+
+  if (in(1)->is_DecodeNKlass()) {
+    // (EncodePKlass (DecodeNKlass p)) -> p
+    return in(1)->in(1);
+  }
+  return this;
+}
+
+const Type *EncodePKlassNode::Value( PhaseTransform *phase ) const {
+  const Type *t = phase->type( in(1) );
+  if (t == Type::TOP) return Type::TOP;
+  assert (t != TypePtr::NULL_PTR, "null klass?");
+
+  assert(UseCompressedKlassPointers && t->isa_klassptr(), "only klass ptr here");
+  return t->make_narrowklass();
+}
+
+
 //=============================================================================
 //------------------------------Identity---------------------------------------
 Node *Conv2BNode::Identity( PhaseTransform *phase ) {
--- a/hotspot/src/share/vm/opto/connode.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/connode.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -88,6 +88,14 @@
   virtual int Opcode() const;
 };
 
+//------------------------------ConNKlassNode---------------------------------
+// Simple narrow klass constants
+class ConNKlassNode : public ConNode {
+public:
+  ConNKlassNode( const TypeNarrowKlass *t ) : ConNode(t) {}
+  virtual int Opcode() const;
+};
+
 
 //------------------------------ConLNode---------------------------------------
 // Simple long constants
@@ -270,42 +278,91 @@
 };
 
 
+//------------------------------EncodeNarrowPtr--------------------------------
+class EncodeNarrowPtrNode : public TypeNode {
+ protected:
+  EncodeNarrowPtrNode(Node* value, const Type* type):
+    TypeNode(type, 2) {
+    init_class_id(Class_EncodeNarrowPtr);
+    init_req(0, NULL);
+    init_req(1, value);
+  }
+ public:
+  virtual uint  ideal_reg() const { return Op_RegN; }
+  virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
+};
+
 //------------------------------EncodeP--------------------------------
 // Encodes an oop pointers into its compressed form
 // Takes an extra argument which is the real heap base as a long which
 // may be useful for code generation in the backend.
-class EncodePNode : public TypeNode {
+class EncodePNode : public EncodeNarrowPtrNode {
  public:
   EncodePNode(Node* value, const Type* type):
-    TypeNode(type, 2) {
+    EncodeNarrowPtrNode(value, type) {
     init_class_id(Class_EncodeP);
-    init_req(0, NULL);
-    init_req(1, value);
   }
   virtual int Opcode() const;
   virtual Node *Identity( PhaseTransform *phase );
   virtual const Type *Value( PhaseTransform *phase ) const;
-  virtual uint  ideal_reg() const { return Op_RegN; }
+};
 
-  virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
+//------------------------------EncodePKlass--------------------------------
+// Encodes a klass pointer into its compressed form
+// Takes an extra argument which is the real heap base as a long which
+// may be useful for code generation in the backend.
+class EncodePKlassNode : public EncodeNarrowPtrNode {
+ public:
+  EncodePKlassNode(Node* value, const Type* type):
+    EncodeNarrowPtrNode(value, type) {
+    init_class_id(Class_EncodePKlass);
+  }
+  virtual int Opcode() const;
+  virtual Node *Identity( PhaseTransform *phase );
+  virtual const Type *Value( PhaseTransform *phase ) const;
+};
+
+//------------------------------DecodeNarrowPtr--------------------------------
+class DecodeNarrowPtrNode : public TypeNode {
+ protected:
+  DecodeNarrowPtrNode(Node* value, const Type* type):
+    TypeNode(type, 2) {
+    init_class_id(Class_DecodeNarrowPtr);
+    init_req(0, NULL);
+    init_req(1, value);
+  }
+ public:
+  virtual uint  ideal_reg() const { return Op_RegP; }
 };
 
 //------------------------------DecodeN--------------------------------
 // Converts a narrow oop into a real oop ptr.
 // Takes an extra argument which is the real heap base as a long which
 // may be useful for code generation in the backend.
-class DecodeNNode : public TypeNode {
+class DecodeNNode : public DecodeNarrowPtrNode {
  public:
   DecodeNNode(Node* value, const Type* type):
-    TypeNode(type, 2) {
+    DecodeNarrowPtrNode(value, type) {
     init_class_id(Class_DecodeN);
-    init_req(0, NULL);
-    init_req(1, value);
   }
   virtual int Opcode() const;
-  virtual Node *Identity( PhaseTransform *phase );
   virtual const Type *Value( PhaseTransform *phase ) const;
-  virtual uint  ideal_reg() const { return Op_RegP; }
+  virtual Node *Identity( PhaseTransform *phase );
+};
+
+//------------------------------DecodeNKlass--------------------------------
+// Converts a narrow klass pointer into a real klass ptr.
+// Takes an extra argument which is the real heap base as a long which
+// may be useful for code generation in the backend.
+class DecodeNKlassNode : public DecodeNarrowPtrNode {
+ public:
+  DecodeNKlassNode(Node* value, const Type* type):
+    DecodeNarrowPtrNode(value, type) {
+    init_class_id(Class_DecodeNKlass);
+  }
+  virtual int Opcode() const;
+  virtual const Type *Value( PhaseTransform *phase ) const;
+  virtual Node *Identity( PhaseTransform *phase );
 };
 
 //------------------------------Conv2BNode-------------------------------------
--- a/hotspot/src/share/vm/opto/divnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/divnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/domgraph.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/domgraph.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/escape.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/escape.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -368,7 +368,9 @@
     case Op_CastPP:
     case Op_CheckCastPP:
     case Op_EncodeP:
-    case Op_DecodeN: {
+    case Op_DecodeN:
+    case Op_EncodePKlass:
+    case Op_DecodeNKlass: {
       add_local_var_and_edge(n, PointsToNode::NoEscape,
                              n->in(1), delayed_worklist);
       break;
@@ -381,7 +383,8 @@
       break;
     }
     case Op_ConP:
-    case Op_ConN: {
+    case Op_ConN:
+    case Op_ConNKlass: {
       // assume all oop constants globally escape except for null
       PointsToNode::EscapeState es;
       if (igvn->type(n) == TypePtr::NULL_PTR ||
@@ -458,6 +461,7 @@
     }
     case Op_StoreP:
     case Op_StoreN:
+    case Op_StoreNKlass:
     case Op_StorePConditional:
     case Op_CompareAndSwapP:
     case Op_CompareAndSwapN: {
@@ -465,7 +469,7 @@
       const Type *adr_type = igvn->type(adr);
       adr_type = adr_type->make_ptr();
       if (adr_type->isa_oopptr() ||
-          (opcode == Op_StoreP || opcode == Op_StoreN) &&
+          (opcode == Op_StoreP || opcode == Op_StoreN || opcode == Op_StoreNKlass) &&
                         (adr_type == TypeRawPtr::NOTNULL &&
                          adr->in(AddPNode::Address)->is_Proj() &&
                          adr->in(AddPNode::Address)->in(0)->is_Allocate())) {
@@ -572,7 +576,9 @@
     case Op_CastPP:
     case Op_CheckCastPP:
     case Op_EncodeP:
-    case Op_DecodeN: {
+    case Op_DecodeN:
+    case Op_EncodePKlass:
+    case Op_DecodeNKlass: {
       add_local_var_and_edge(n, PointsToNode::NoEscape,
                              n->in(1), NULL);
       break;
@@ -646,6 +652,7 @@
     }
     case Op_StoreP:
     case Op_StoreN:
+    case Op_StoreNKlass:
     case Op_StorePConditional:
     case Op_CompareAndSwapP:
     case Op_CompareAndSwapN:
@@ -661,7 +668,7 @@
       const Type *adr_type = _igvn->type(adr);
       adr_type = adr_type->make_ptr();
       if (adr_type->isa_oopptr() ||
-          (opcode == Op_StoreP || opcode == Op_StoreN) &&
+          (opcode == Op_StoreP || opcode == Op_StoreN || opcode == Op_StoreNKlass) &&
                         (adr_type == TypeRawPtr::NOTNULL &&
                          adr->in(AddPNode::Address)->is_Proj() &&
                          adr->in(AddPNode::Address)->in(0)->is_Allocate())) {
@@ -2088,7 +2095,7 @@
     Node* uncast_base = base->uncast();
     int opcode = uncast_base->Opcode();
     assert(opcode == Op_ConP || opcode == Op_ThreadLocal ||
-           opcode == Op_CastX2P || uncast_base->is_DecodeN() ||
+           opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() ||
            (uncast_base->is_Mem() && uncast_base->bottom_type() == TypeRawPtr::NOTNULL) ||
            (uncast_base->is_Proj() && uncast_base->in(0)->is_Allocate()), "sanity");
   }
@@ -2837,8 +2844,8 @@
         alloc_worklist.append_if_missing(use);
       } else if (use->is_Phi() ||
                  use->is_CheckCastPP() ||
-                 use->is_EncodeP() ||
-                 use->is_DecodeN() ||
+                 use->is_EncodeNarrowPtr() ||
+                 use->is_DecodeNarrowPtr() ||
                  (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) {
         alloc_worklist.append_if_missing(use);
 #ifdef ASSERT
--- a/hotspot/src/share/vm/opto/gcm.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/gcm.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/generateOptoStub.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/generateOptoStub.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/opto/graphKit.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1115,7 +1115,7 @@
   // short-circuit a common case
   jint offset_con = find_int_con(offset, Type::OffsetBot);
   if (offset_con != Type::OffsetBot) {
-    return longcon((long) offset_con);
+    return longcon((jlong) offset_con);
   }
   return _gvn.transform( new (C) ConvI2LNode(offset));
 }
--- a/hotspot/src/share/vm/opto/idealKit.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/idealKit.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/opto/idealKit.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/idealKit.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/opto/ifnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/ifnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/opto/lcm.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/lcm.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -164,6 +164,7 @@
     case Op_StoreL:
     case Op_StoreP:
     case Op_StoreN:
+    case Op_StoreNKlass:
       was_store = true;         // Memory op is a store op
       // Stores will have their address in slot 2 (memory in slot 1).
       // If the value being nul-checked is in another slot, it means we
--- a/hotspot/src/share/vm/opto/library_call.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2378,13 +2378,15 @@
     }
   }
 
-  if (sharpened_klass != NULL) {
+  // The sharpened class might be unloaded if there is no class loader
+  // contraint in place.
+  if (sharpened_klass != NULL && sharpened_klass->is_loaded()) {
     const TypeOopPtr* tjp = TypeOopPtr::make_from_klass(sharpened_klass);
 
 #ifndef PRODUCT
     if (PrintIntrinsics || PrintInlining || PrintOptoInlining) {
-      tty->print("  from base type:  ");   adr_type->dump();
-      tty->print("  sharpened value: ");   tjp->dump();
+      tty->print("  from base type: ");  adr_type->dump();
+      tty->print("  sharpened value: ");  tjp->dump();
     }
 #endif
     // Sharpen the value type.
@@ -3435,7 +3437,7 @@
     if (generate_array_guard(kls, region) != NULL) {
       // Be sure to pin the oop load to the guard edge just created:
       Node* is_array_ctrl = region->in(region->req()-1);
-      Node* cma = basic_plus_adr(kls, in_bytes(arrayKlass::component_mirror_offset()));
+      Node* cma = basic_plus_adr(kls, in_bytes(ArrayKlass::component_mirror_offset()));
       Node* cmo = make_load(is_array_ctrl, cma, TypeInstPtr::MIRROR, T_OBJECT);
       phi->add_req(cmo);
     }
@@ -4381,7 +4383,7 @@
   // 12 - 64-bit VM, compressed klass
   // 16 - 64-bit VM, normal klass
   if (base_off % BytesPerLong != 0) {
-    assert(UseCompressedOops, "");
+    assert(UseCompressedKlassPointers, "");
     if (is_array) {
       // Exclude length to copy by 8 bytes words.
       base_off += sizeof(int);
@@ -5032,7 +5034,7 @@
       PreserveJVMState pjvms(this);
       set_control(not_subtype_ctrl);
       // (At this point we can assume disjoint_bases, since types differ.)
-      int ek_offset = in_bytes(objArrayKlass::element_klass_offset());
+      int ek_offset = in_bytes(ObjArrayKlass::element_klass_offset());
       Node* p1 = basic_plus_adr(dest_klass, ek_offset);
       Node* n1 = LoadKlassNode::make(_gvn, immutable_memory(), p1, TypeRawPtr::BOTTOM);
       Node* dest_elem_klass = _gvn.transform(n1);
--- a/hotspot/src/share/vm/opto/live.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/live.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -331,6 +331,7 @@
 #ifdef _LP64
                       UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_CastPP ||
                       UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_DecodeN ||
+                      UseCompressedKlassPointers && check->as_Mach()->ideal_Opcode() == Op_DecodeNKlass ||
 #endif
                       check->as_Mach()->ideal_Opcode() == Op_LoadP ||
                       check->as_Mach()->ideal_Opcode() == Op_LoadKlass)) {
--- a/hotspot/src/share/vm/opto/locknode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/locknode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/opto/locknode.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/locknode.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/opto/loopPredicate.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/share/vm/opto/loopTransform.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
@@ -92,10 +92,10 @@
       limit_n != NULL && limit_n->is_Con()) {
     // Use longs to avoid integer overflow.
     int stride_con  = cl->stride_con();
-    long init_con   = cl->init_trip()->get_int();
-    long limit_con  = cl->limit()->get_int();
+    jlong init_con   = cl->init_trip()->get_int();
+    jlong limit_con  = cl->limit()->get_int();
     int stride_m    = stride_con - (stride_con > 0 ? 1 : -1);
-    long trip_count = (limit_con - init_con + stride_m)/stride_con;
+    jlong trip_count = (limit_con - init_con + stride_m)/stride_con;
     if (trip_count > 0 && (julong)trip_count < (julong)max_juint) {
       // Set exact trip count.
       cl->set_exact_trip_count((uint)trip_count);
@@ -1212,16 +1212,16 @@
     } else if (loop_head->has_exact_trip_count() && init->is_Con()) {
       // Loop's limit is constant. Loop's init could be constant when pre-loop
       // become peeled iteration.
-      long init_con = init->get_int();
+      jlong init_con = init->get_int();
       // We can keep old loop limit if iterations count stays the same:
       //   old_trip_count == new_trip_count * 2
       // Note: since old_trip_count >= 2 then new_trip_count >= 1
       // so we also don't need to adjust zero trip test.
-      long limit_con  = limit->get_int();
+      jlong limit_con  = limit->get_int();
       // (stride_con*2) not overflow since stride_con <= 8.
       int new_stride_con = stride_con * 2;
       int stride_m    = new_stride_con - (stride_con > 0 ? 1 : -1);
-      long trip_count = (limit_con - init_con + stride_m)/new_stride_con;
+      jlong trip_count = (limit_con - init_con + stride_m)/new_stride_con;
       // New trip count should satisfy next conditions.
       assert(trip_count > 0 && (julong)trip_count < (julong)max_juint/2, "sanity");
       uint new_trip_count = (uint)trip_count;
@@ -2413,7 +2413,7 @@
         break;
       }
       int opc = n->Opcode();
-      if (opc == Op_StoreP || opc == Op_StoreN || opc == Op_StoreCM) {
+      if (opc == Op_StoreP || opc == Op_StoreN || opc == Op_StoreNKlass || opc == Op_StoreCM) {
         msg = "oop fills not handled";
         break;
       }
--- a/hotspot/src/share/vm/opto/loopUnswitch.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, 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
--- a/hotspot/src/share/vm/opto/loopnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -328,12 +328,12 @@
   const TypeInt* limit_t = gvn->type(limit)->is_int();
 
   if (stride_con > 0) {
-    long init_p = (long)init_t->_lo + stride_con;
-    if (init_p > (long)max_jint || init_p > (long)limit_t->_hi)
+    jlong init_p = (jlong)init_t->_lo + stride_con;
+    if (init_p > (jlong)max_jint || init_p > (jlong)limit_t->_hi)
       return false; // cyclic loop or this loop trips only once
   } else {
-    long init_p = (long)init_t->_hi + stride_con;
-    if (init_p < (long)min_jint || init_p < (long)limit_t->_lo)
+    jlong init_p = (jlong)init_t->_hi + stride_con;
+    if (init_p < (jlong)min_jint || init_p < (jlong)limit_t->_lo)
       return false; // cyclic loop or this loop trips only once
   }
 
@@ -716,16 +716,16 @@
 #endif
   if (cl->has_exact_trip_count()) {
     // Simple case: loop has constant boundaries.
-    // Use longs to avoid integer overflow.
+    // Use jlongs to avoid integer overflow.
     int stride_con = cl->stride_con();
-    long  init_con = cl->init_trip()->get_int();
-    long limit_con = cl->limit()->get_int();
+    jlong  init_con = cl->init_trip()->get_int();
+    jlong limit_con = cl->limit()->get_int();
     julong trip_cnt = cl->trip_count();
-    long final_con = init_con + trip_cnt*stride_con;
+    jlong final_con = init_con + trip_cnt*stride_con;
     int final_int = (int)final_con;
     // The final value should be in integer range since the loop
     // is counted and the limit was checked for overflow.
-    assert(final_con == (long)final_int, "final value should be integer");
+    assert(final_con == (jlong)final_int, "final value should be integer");
     limit = _igvn.intcon(final_int);
   } else {
     // Create new LoopLimit node to get exact limit (final iv value).
@@ -790,16 +790,16 @@
     return NULL;  // Identity
 
   if (init_t->is_int()->is_con() && limit_t->is_int()->is_con()) {
-    // Use longs to avoid integer overflow.
-    long init_con   =  init_t->is_int()->get_con();
-    long limit_con  = limit_t->is_int()->get_con();
+    // Use jlongs to avoid integer overflow.
+    jlong init_con   =  init_t->is_int()->get_con();
+    jlong limit_con  = limit_t->is_int()->get_con();
     int  stride_m   = stride_con - (stride_con > 0 ? 1 : -1);
-    long trip_count = (limit_con - init_con + stride_m)/stride_con;
-    long final_con  = init_con + stride_con*trip_count;
+    jlong trip_count = (limit_con - init_con + stride_m)/stride_con;
+    jlong final_con  = init_con + stride_con*trip_count;
     int final_int = (int)final_con;
     // The final value should be in integer range since the loop
     // is counted and the limit was checked for overflow.
-    assert(final_con == (long)final_int, "final value should be integer");
+    assert(final_con == (jlong)final_int, "final value should be integer");
     return TypeInt::make(final_int);
   }
 
@@ -829,7 +829,7 @@
   const TypeInt* init_t  = phase->type(in(Init) )->is_int();
   const TypeInt* limit_t = phase->type(in(Limit))->is_int();
   int stride_p;
-  long lim, ini;
+  jlong lim, ini;
   julong max;
   if (stride_con > 0) {
     stride_p = stride_con;
--- a/hotspot/src/share/vm/opto/loopnode.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopnode.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/opto/loopopts.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopopts.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -550,7 +550,7 @@
     // This will likely Split-If, a higher-payoff operation.
     for (DUIterator_Fast kmax, k = phi->fast_outs(kmax); k < kmax; k++) {
       Node* use = phi->fast_out(k);
-      if (use->is_Cmp() || use->is_DecodeN() || use->is_EncodeP())
+      if (use->is_Cmp() || use->is_DecodeNarrowPtr() || use->is_EncodeNarrowPtr())
         cost += ConditionalMoveLimit;
       // Is there a use inside the loop?
       // Note: check only basic types since CMoveP is pinned.
@@ -1006,7 +1006,7 @@
             // to fold a StoreP and an AddP together (as part of an
             // address expression) and the AddP and StoreP have
             // different controls.
-            if( !x->is_Load() && !x->is_DecodeN() ) _igvn._worklist.yank(x);
+            if (!x->is_Load() && !x->is_DecodeNarrowPtr()) _igvn._worklist.yank(x);
           }
           _igvn.remove_dead_node(n);
         }
--- a/hotspot/src/share/vm/opto/machnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/machnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -265,7 +265,8 @@
     // See if it adds up to a base + offset.
     if (index != NULL) {
       const Type* t_index = index->bottom_type();
-      if (t_index->isa_narrowoop()) { // EncodeN, LoadN, LoadConN, LoadNKlass.
+      if (t_index->isa_narrowoop() || t_index->isa_narrowklass()) { // EncodeN, LoadN, LoadConN, LoadNKlass,
+                                                                    // EncodeNKlass, LoadConNklass.
         // Memory references through narrow oops have a
         // funny base so grab the type from the index:
         // [R12 + narrow_oop_reg<<3 + offset]
@@ -352,6 +353,10 @@
     // 32-bit unscaled narrow oop can be the base of any address expression
     t = t->make_ptr();
   }
+  if (UseCompressedKlassPointers && Universe::narrow_klass_shift() == 0) {
+    // 32-bit unscaled narrow oop can be the base of any address expression
+    t = t->make_ptr();
+  }
   if (t->isa_intptr_t() && offset != 0 && offset != Type::OffsetBot) {
     // We cannot assert that the offset does not look oop-ish here.
     // Depending on the heap layout the cardmark base could land
--- a/hotspot/src/share/vm/opto/macro.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/macro.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2125,7 +2125,7 @@
       Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
       klass_node = transform_later( LoadKlassNode::make(_igvn, mem, k_adr, _igvn.type(k_adr)->is_ptr()) );
 #ifdef _LP64
-      if (UseCompressedOops && klass_node->is_DecodeN()) {
+      if (UseCompressedKlassPointers && klass_node->is_DecodeNKlass()) {
         assert(klass_node->in(1)->Opcode() == Op_LoadNKlass, "sanity");
         klass_node->in(1)->init_req(0, ctrl);
       } else
--- a/hotspot/src/share/vm/opto/macro.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/macro.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
--- a/hotspot/src/share/vm/opto/matcher.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/matcher.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1058,7 +1058,7 @@
         Node *m = n->in(i);          // Get input
         int op = m->Opcode();
         assert((op == Op_BoxLock) == jvms->is_monitor_use(i), "boxes only at monitor sites");
-        if( op == Op_ConI || op == Op_ConP || op == Op_ConN ||
+        if( op == Op_ConI || op == Op_ConP || op == Op_ConN || op == Op_ConNKlass ||
             op == Op_ConF || op == Op_ConD || op == Op_ConL
             // || op == Op_BoxLock  // %%%% enable this and remove (+++) in chaitin.cpp
             ) {
@@ -1450,7 +1450,8 @@
       if (j == max_scan)        // No post-domination before scan end?
         return true;            // Then break the match tree up
     }
-    if (m->is_DecodeN() && Matcher::narrow_oop_use_complex_address()) {
+    if ((m->is_DecodeN() && Matcher::narrow_oop_use_complex_address()) ||
+        (m->is_DecodeNKlass() && Matcher::narrow_klass_use_complex_address())) {
       // These are commonly used in address expressions and can
       // efficiently fold into them on X64 in some cases.
       return false;
@@ -1574,14 +1575,14 @@
 // program.  The register allocator is free to split uses later to
 // split live ranges.
 MachNode* Matcher::find_shared_node(Node* leaf, uint rule) {
-  if (!leaf->is_Con() && !leaf->is_DecodeN()) return NULL;
+  if (!leaf->is_Con() && !leaf->is_DecodeNarrowPtr()) return NULL;
 
   // See if this Con has already been reduced using this rule.
   if (_shared_nodes.Size() <= leaf->_idx) return NULL;
   MachNode* last = (MachNode*)_shared_nodes.at(leaf->_idx);
   if (last != NULL && rule == last->rule()) {
     // Don't expect control change for DecodeN
-    if (leaf->is_DecodeN())
+    if (leaf->is_DecodeNarrowPtr())
       return last;
     // Get the new space root.
     Node* xroot = new_node(C->root());
@@ -1671,12 +1672,12 @@
       // DecodeN node consumed by an address may have different type
       // then its input. Don't compare types for such case.
       if (m->adr_type() != mach_at &&
-          (m->in(MemNode::Address)->is_DecodeN() ||
+          (m->in(MemNode::Address)->is_DecodeNarrowPtr() ||
            m->in(MemNode::Address)->is_AddP() &&
-           m->in(MemNode::Address)->in(AddPNode::Address)->is_DecodeN() ||
+           m->in(MemNode::Address)->in(AddPNode::Address)->is_DecodeNarrowPtr() ||
            m->in(MemNode::Address)->is_AddP() &&
            m->in(MemNode::Address)->in(AddPNode::Address)->is_AddP() &&
-           m->in(MemNode::Address)->in(AddPNode::Address)->in(AddPNode::Address)->is_DecodeN())) {
+           m->in(MemNode::Address)->in(AddPNode::Address)->in(AddPNode::Address)->is_DecodeNarrowPtr())) {
         mach_at = m->adr_type();
       }
       if (m->adr_type() != mach_at) {
@@ -1721,7 +1722,7 @@
     guarantee(_proj_list.size() == num_proj, "no allocation during spill generation");
   }
 
-  if (leaf->is_Con() || leaf->is_DecodeN()) {
+  if (leaf->is_Con() || leaf->is_DecodeNarrowPtr()) {
     // Record the con for sharing
     _shared_nodes.map(leaf->_idx, ex);
   }
@@ -2038,7 +2039,7 @@
           continue; // for(int i = ...)
         }
 
-        if( mop == Op_AddP && m->in(AddPNode::Base)->Opcode() == Op_DecodeN ) {
+        if( mop == Op_AddP && m->in(AddPNode::Base)->is_DecodeNarrowPtr()) {
           // Bases used in addresses must be shared but since
           // they are shared through a DecodeN they may appear
           // to have a single use so force sharing here.
@@ -2277,7 +2278,7 @@
     if (has_new_node(val)) {
       Node* new_val = new_node(val);
       if (is_decoden) {
-        assert(val->is_DecodeN() && val->in(0) == NULL, "sanity");
+        assert(val->is_DecodeNarrowPtr() && val->in(0) == NULL, "sanity");
         // Note: new_val may have a control edge if
         // the original ideal node DecodeN was matched before
         // it was unpinned in Matcher::collect_null_checks().
--- a/hotspot/src/share/vm/opto/matcher.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/matcher.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -380,6 +380,7 @@
   static const bool clone_shift_expressions;
 
   static bool narrow_oop_use_complex_address();
+  static bool narrow_klass_use_complex_address();
 
   // Generate implicit null check for narrow oops if it can fold
   // into address expression (x64).
--- a/hotspot/src/share/vm/opto/memnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/memnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -714,10 +714,12 @@
         continue;
 
       case Op_DecodeN:         // No change to NULL-ness, so peek thru
+      case Op_DecodeNKlass:
         adr = adr->in(1);
         continue;
 
       case Op_EncodeP:
+      case Op_EncodePKlass:
         // EncodeP node's control edge could be set by this method
         // when EncodeP node depends on CastPP node.
         //
@@ -794,6 +796,7 @@
       case Op_LoadNKlass:       // Loading from within a klass
       case Op_ConP:             // Loading from a klass
       case Op_ConN:             // Loading from a klass
+      case Op_ConNKlass:        // Loading from a klass
       case Op_CreateEx:         // Sucking up the guts of an exception oop
       case Op_Con:              // Reading from TLS
       case Op_CMoveP:           // CMoveP is pinned
@@ -900,7 +903,7 @@
     } else
 #endif
     {
-      assert(!adr->bottom_type()->is_ptr_to_narrowoop(), "should have got back a narrow oop");
+      assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
       return new (C) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr());
     }
   }
@@ -1671,9 +1674,9 @@
       }
       const Type* aift = load_array_final_field(tkls, klass);
       if (aift != NULL)  return aift;
-      if (tkls->offset() == in_bytes(arrayKlass::component_mirror_offset())
+      if (tkls->offset() == in_bytes(ArrayKlass::component_mirror_offset())
           && klass->is_array_klass()) {
-        // The field is arrayKlass::_component_mirror.  Return its (constant) value.
+        // The field is ArrayKlass::_component_mirror.  Return its (constant) value.
         // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.)
         assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror");
         return TypeInstPtr::make(klass->as_array_klass()->component_mirror());
@@ -1894,13 +1897,13 @@
   const TypePtr *adr_type = adr->bottom_type()->isa_ptr();
   assert(adr_type != NULL, "expecting TypeKlassPtr");
 #ifdef _LP64
-  if (adr_type->is_ptr_to_narrowoop()) {
+  if (adr_type->is_ptr_to_narrowklass()) {
     assert(UseCompressedKlassPointers, "no compressed klasses");
-    Node* load_klass = gvn.transform(new (C) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowoop()));
-    return new (C) DecodeNNode(load_klass, load_klass->bottom_type()->make_ptr());
+    Node* load_klass = gvn.transform(new (C) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass()));
+    return new (C) DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
   }
 #endif
-  assert(!adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
+  assert(!adr_type->is_ptr_to_narrowklass() && !adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
   return new (C) LoadKlassNode(ctl, mem, adr, at, tk);
 }
 
@@ -2014,7 +2017,7 @@
     if( !klass->is_loaded() )
       return _type;             // Bail out if not loaded
     if( klass->is_obj_array_klass() &&
-        tkls->offset() == in_bytes(objArrayKlass::element_klass_offset())) {
+        tkls->offset() == in_bytes(ObjArrayKlass::element_klass_offset())) {
       ciKlass* elem = klass->as_obj_array_klass()->element_klass();
       // // Always returning precise element type is incorrect,
       // // e.g., element type could be object and array may contain strings
@@ -2067,7 +2070,7 @@
   }
 
   // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*.
-  // Simplify ak.component_mirror.array_klass to plain ak, ak an arrayKlass.
+  // Simplify ak.component_mirror.array_klass to plain ak, ak an ArrayKlass.
   // See inline_native_Class_query for occurrences of these patterns.
   // Java Example:  x.getClass().isAssignableFrom(y)
   // Java Example:  Array.newInstance(x.getClass().getComponentType(), n)
@@ -2080,7 +2083,7 @@
       && (offset == java_lang_Class::klass_offset_in_bytes() ||
           offset == java_lang_Class::array_klass_offset_in_bytes())) {
     // We are loading a special hidden field from a Class mirror,
-    // the field which points to its Klass or arrayKlass metaobject.
+    // the field which points to its Klass or ArrayKlass metaobject.
     if (base->is_Load()) {
       Node* adr2 = base->in(MemNode::Address);
       const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr();
@@ -2091,7 +2094,7 @@
           ) {
         int mirror_field = in_bytes(Klass::java_mirror_offset());
         if (offset == java_lang_Class::array_klass_offset_in_bytes()) {
-          mirror_field = in_bytes(arrayKlass::component_mirror_offset());
+          mirror_field = in_bytes(ArrayKlass::component_mirror_offset());
         }
         if (tkls->offset() == mirror_field) {
           return adr2->in(AddPNode::Base);
@@ -2110,7 +2113,7 @@
   if (t == Type::TOP)
     return t;
 
-  return t->make_narrowoop();
+  return t->make_narrowklass();
 }
 
 //------------------------------Identity---------------------------------------
@@ -2121,9 +2124,10 @@
 
   const Type *t = phase->type( x );
   if( t == Type::TOP ) return x;
-  if( t->isa_narrowoop()) return x;
-
-  return phase->transform(new (phase->C) EncodePNode(x, t->make_narrowoop()));
+  if( t->isa_narrowklass()) return x;
+  assert (!t->isa_narrowoop(), "no narrow oop here");
+
+  return phase->transform(new (phase->C) EncodePKlassNode(x, t->make_narrowklass()));
 }
 
 //------------------------------Value-----------------------------------------
@@ -2228,12 +2232,15 @@
   case T_ADDRESS:
   case T_OBJECT:
 #ifdef _LP64
-    if (adr->bottom_type()->is_ptr_to_narrowoop() ||
-        (UseCompressedKlassPointers && val->bottom_type()->isa_klassptr() &&
-         adr->bottom_type()->isa_rawptr())) {
+    if (adr->bottom_type()->is_ptr_to_narrowoop()) {
       val = gvn.transform(new (C) EncodePNode(val, val->bottom_type()->make_narrowoop()));
       return new (C) StoreNNode(ctl, mem, adr, adr_type, val);
-    } else
+    } else if (adr->bottom_type()->is_ptr_to_narrowklass() ||
+               (UseCompressedKlassPointers && val->bottom_type()->isa_klassptr() &&
+                adr->bottom_type()->isa_rawptr())) {
+      val = gvn.transform(new (C) EncodePKlassNode(val, val->bottom_type()->make_narrowklass()));
+      return new (C) StoreNKlassNode(ctl, mem, adr, adr_type, val);
+    }
 #endif
     {
       return new (C) StorePNode(ctl, mem, adr, adr_type, val);
--- a/hotspot/src/share/vm/opto/memnode.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/memnode.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -274,18 +274,6 @@
   virtual BasicType memory_type() const { return T_INT; }
 };
 
-//------------------------------LoadUI2LNode-----------------------------------
-// Load an unsigned integer into long from memory
-class LoadUI2LNode : public LoadNode {
-public:
-  LoadUI2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong* t = TypeLong::UINT)
-    : LoadNode(c, mem, adr, at, t) {}
-  virtual int Opcode() const;
-  virtual uint ideal_reg() const { return Op_RegL; }
-  virtual int store_Opcode() const { return Op_StoreL; }
-  virtual BasicType memory_type() const { return T_LONG; }
-};
-
 //------------------------------LoadRangeNode----------------------------------
 // Load an array length from the array
 class LoadRangeNode : public LoadINode {
@@ -437,12 +425,12 @@
 // Load a narrow Klass from an object.
 class LoadNKlassNode : public LoadNNode {
 public:
-  LoadNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowOop *tk )
+  LoadNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowKlass *tk )
     : LoadNNode(c,mem,adr,at,tk) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegN; }
-  virtual int store_Opcode() const { return Op_StoreN; }
-  virtual BasicType memory_type() const { return T_NARROWOOP; }
+  virtual int store_Opcode() const { return Op_StoreNKlass; }
+  virtual BasicType memory_type() const { return T_NARROWKLASS; }
 
   virtual const Type *Value( PhaseTransform *phase ) const;
   virtual Node *Identity( PhaseTransform *phase );
@@ -593,6 +581,15 @@
   virtual BasicType memory_type() const { return T_NARROWOOP; }
 };
 
+//------------------------------StoreNKlassNode--------------------------------------
+// Store narrow klass to memory
+class StoreNKlassNode : public StoreNNode {
+public:
+  StoreNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNNode(c,mem,adr,at,val) {}
+  virtual int Opcode() const;
+  virtual BasicType memory_type() const { return T_NARROWKLASS; }
+};
+
 //------------------------------StoreCMNode-----------------------------------
 // Store card-mark byte to memory for CM
 // The last StoreCM before a SafePoint must be preserved and occur after its "oop" store
--- a/hotspot/src/share/vm/opto/mulnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/mulnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -599,20 +599,6 @@
   Node* in1 = in(1);
   uint op = in1->Opcode();
 
-  // Masking sign bits off of an integer?  Do an unsigned integer to
-  // long load.
-  // NOTE: This check must be *before* we try to convert the AndLNode
-  // to an AndINode and commute it with ConvI2LNode because
-  // 0xFFFFFFFFL masks the whole integer and we get a sign extension,
-  // which is wrong.
-  if (op == Op_ConvI2L && in1->in(1)->Opcode() == Op_LoadI && mask == CONST64(0x00000000FFFFFFFF)) {
-    Node* load = in1->in(1);
-    return new (phase->C) LoadUI2LNode(load->in(MemNode::Control),
-                                          load->in(MemNode::Memory),
-                                          load->in(MemNode::Address),
-                                          load->adr_type());
-  }
-
   // Are we masking a long that was converted from an int with a mask
   // that fits in 32-bits?  Commute them and use an AndINode.  Don't
   // convert masks which would cause a sign extension of the integer
--- a/hotspot/src/share/vm/opto/node.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/node.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -62,8 +62,12 @@
 class ConNode;
 class CountedLoopNode;
 class CountedLoopEndNode;
+class DecodeNarrowPtrNode;
 class DecodeNNode;
+class DecodeNKlassNode;
+class EncodeNarrowPtrNode;
 class EncodePNode;
+class EncodePKlassNode;
 class FastLockNode;
 class FastUnlockNode;
 class IfNode;
@@ -585,8 +589,12 @@
       DEFINE_CLASS_ID(CheckCastPP, Type, 2)
       DEFINE_CLASS_ID(CMove, Type, 3)
       DEFINE_CLASS_ID(SafePointScalarObject, Type, 4)
-      DEFINE_CLASS_ID(DecodeN, Type, 5)
-      DEFINE_CLASS_ID(EncodeP, Type, 6)
+      DEFINE_CLASS_ID(DecodeNarrowPtr, Type, 5)
+        DEFINE_CLASS_ID(DecodeN, DecodeNarrowPtr, 0)
+        DEFINE_CLASS_ID(DecodeNKlass, DecodeNarrowPtr, 1)
+      DEFINE_CLASS_ID(EncodeNarrowPtr, Type, 6)
+        DEFINE_CLASS_ID(EncodeP, EncodeNarrowPtr, 0)
+        DEFINE_CLASS_ID(EncodePKlass, EncodeNarrowPtr, 1)
 
     DEFINE_CLASS_ID(Proj,  Node, 3)
       DEFINE_CLASS_ID(CatchProj, Proj, 0)
@@ -706,8 +714,12 @@
   DEFINE_CLASS_QUERY(Cmp)
   DEFINE_CLASS_QUERY(CountedLoop)
   DEFINE_CLASS_QUERY(CountedLoopEnd)
+  DEFINE_CLASS_QUERY(DecodeNarrowPtr)
   DEFINE_CLASS_QUERY(DecodeN)
+  DEFINE_CLASS_QUERY(DecodeNKlass)
+  DEFINE_CLASS_QUERY(EncodeNarrowPtr)
   DEFINE_CLASS_QUERY(EncodeP)
+  DEFINE_CLASS_QUERY(EncodePKlass)
   DEFINE_CLASS_QUERY(FastLock)
   DEFINE_CLASS_QUERY(FastUnlock)
   DEFINE_CLASS_QUERY(If)
--- a/hotspot/src/share/vm/opto/parse.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/parse1.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse1.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1381,8 +1381,7 @@
       // that occur during parsing of this BC.  If there is no log
       // output until the next context string, this context string
       // will be silently ignored.
-      log->context()->reset();
-      log->context()->print_cr("<bc code='%d' bci='%d'/>", (int)bc(), bci());
+      log->set_context("bc code='%d' bci='%d'", (int)bc(), bci());
     }
 
     if (block()->has_trap_at(bci())) {
@@ -1411,7 +1410,8 @@
 
     NOT_PRODUCT( parse_histogram()->record_change(); );
 
-    if (log != NULL)  log->context()->reset();  // done w/ this one
+    if (log != NULL)
+      log->clear_context();  // skip marker if nothing was printed
 
     // Fall into next bytecode.  Each bytecode normally has 1 sequential
     // successor which is typically made ready by visiting this bytecode.
--- a/hotspot/src/share/vm/opto/parse2.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse2.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1239,7 +1239,7 @@
 
 static Node* extract_obj_from_klass_load(PhaseGVN* gvn, Node* n) {
   Node* ldk;
-  if (n->is_DecodeN()) {
+  if (n->is_DecodeNKlass()) {
     if (n->in(1)->Opcode() != Op_LoadNKlass) {
       return NULL;
     } else {
--- a/hotspot/src/share/vm/opto/parse3.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse3.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/opto/parseHelper.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/parseHelper.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -200,7 +200,7 @@
   // Come here for polymorphic array klasses
 
   // Extract the array element class
-  int element_klass_offset = in_bytes(objArrayKlass::element_klass_offset());
+  int element_klass_offset = in_bytes(ObjArrayKlass::element_klass_offset());
   Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset);
   Node *a_e_klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p2, tak) );
 
--- a/hotspot/src/share/vm/opto/phaseX.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/phaseX.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/phaseX.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/phaseX.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -497,8 +497,8 @@
 #ifndef PRODUCT
 protected:
   // Sub-quadratic implementation of VerifyIterativeGVN.
-  unsigned long _verify_counter;
-  unsigned long _verify_full_passes;
+  julong _verify_counter;
+  julong _verify_full_passes;
   enum { _verify_window_size = 30 };
   Node* _verify_window[_verify_window_size];
   void verify_step(Node* n);
--- a/hotspot/src/share/vm/opto/runtime.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/runtime.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -286,13 +286,13 @@
   if (Klass::cast(array_type)->oop_is_typeArray()) {
     // The oopFactory likes to work with the element type.
     // (We could bypass the oopFactory, since it doesn't add much value.)
-    BasicType elem_type = typeArrayKlass::cast(array_type)->element_type();
+    BasicType elem_type = TypeArrayKlass::cast(array_type)->element_type();
     result = oopFactory::new_typeArray(elem_type, len, THREAD);
   } else {
     // Although the oopFactory likes to work with the elem_type,
     // the compiler prefers the array_type, since it must already have
     // that latter value in hand for the fast path.
-    Klass* elem_type = objArrayKlass::cast(array_type)->element_klass();
+    Klass* elem_type = ObjArrayKlass::cast(array_type)->element_klass();
     result = oopFactory::new_objArray(elem_type, len, THREAD);
   }
 
@@ -323,7 +323,7 @@
 
   assert(Klass::cast(array_type)->oop_is_typeArray(), "should be called only for type array");
   // The oopFactory likes to work with the element type.
-  BasicType elem_type = typeArrayKlass::cast(array_type)->element_type();
+  BasicType elem_type = TypeArrayKlass::cast(array_type)->element_type();
   result = oopFactory::new_typeArray_nozero(elem_type, len, THREAD);
 
   // Pass oops back through thread local storage.  Our apparent type to Java
@@ -344,7 +344,7 @@
       is_deoptimized_caller_frame(thread)) {
     // Zero array here if the caller is deoptimized.
     int size = ((typeArrayOop)result)->object_size();
-    BasicType elem_type = typeArrayKlass::cast(array_type)->element_type();
+    BasicType elem_type = TypeArrayKlass::cast(array_type)->element_type();
     const size_t hs = arrayOopDesc::header_size(elem_type);
     // Align to next 8 bytes to avoid trashing arrays's length.
     const size_t aligned_hs = align_object_offset(hs);
@@ -370,7 +370,7 @@
   jint dims[2];
   dims[0] = len1;
   dims[1] = len2;
-  oop obj = arrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD);
+  oop obj = ArrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD);
   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   thread->set_vm_result(obj);
 JRT_END
@@ -386,7 +386,7 @@
   dims[0] = len1;
   dims[1] = len2;
   dims[2] = len3;
-  oop obj = arrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD);
+  oop obj = ArrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD);
   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   thread->set_vm_result(obj);
 JRT_END
@@ -403,7 +403,7 @@
   dims[1] = len2;
   dims[2] = len3;
   dims[3] = len4;
-  oop obj = arrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD);
+  oop obj = ArrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD);
   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   thread->set_vm_result(obj);
 JRT_END
@@ -421,7 +421,7 @@
   dims[2] = len3;
   dims[3] = len4;
   dims[4] = len5;
-  oop obj = arrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD);
+  oop obj = ArrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD);
   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   thread->set_vm_result(obj);
 JRT_END
@@ -438,7 +438,7 @@
   jint *c_dims = NEW_RESOURCE_ARRAY(jint, len);
   Copy::conjoint_jints_atomic(j_dims, c_dims, len);
 
-  oop obj = arrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD);
+  oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD);
   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   thread->set_vm_result(obj);
 JRT_END
--- a/hotspot/src/share/vm/opto/split_if.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/split_if.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
--- a/hotspot/src/share/vm/opto/subnode.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/subnode.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -789,7 +789,7 @@
 
   // Now check for LoadKlass on left.
   Node* ldk1 = in(1);
-  if (ldk1->is_DecodeN()) {
+  if (ldk1->is_DecodeNKlass()) {
     ldk1 = ldk1->in(1);
     if (ldk1->Opcode() != Op_LoadNKlass )
       return NULL;
@@ -814,7 +814,7 @@
 
   // Check for a LoadKlass from primary supertype array.
   // Any nested loadklass from loadklass+con must be from the p.s. array.
-  if (ldk2->is_DecodeN()) {
+  if (ldk2->is_DecodeNKlass()) {
     // Keep ldk2 as DecodeN since it could be used in CmpP below.
     if (ldk2->in(1)->Opcode() != Op_LoadNKlass )
       return NULL;
--- a/hotspot/src/share/vm/opto/subnode.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/subnode.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/opto/superword.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/superword.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -179,7 +179,6 @@
   for (int i = 0; i < _block.length(); i++) {
     Node* n = _block.at(i);
     if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) &&
-        n->Opcode() != Op_LoadUI2L &&
         is_java_primitive(n->as_Mem()->memory_type())) {
       int align = memory_alignment(n->as_Mem(), 0);
       if (align != bottom_align) {
--- a/hotspot/src/share/vm/opto/type.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/type.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -57,6 +57,7 @@
   { Bad,             T_LONG,       "long:",         false, Op_RegL,              relocInfo::none          },  // Long
   { Half,            T_VOID,       "half",          false, 0,                    relocInfo::none          },  // Half
   { Bad,             T_NARROWOOP,  "narrowoop:",    false, Op_RegN,              relocInfo::none          },  // NarrowOop
+  { Bad,             T_NARROWKLASS,"narrowklass:",  false, Op_RegN,              relocInfo::none          },  // NarrowKlass
   { Bad,             T_ILLEGAL,    "tuple:",        false, Node::NotAMachineReg, relocInfo::none          },  // Tuple
   { Bad,             T_ARRAY,      "array:",        false, Node::NotAMachineReg, relocInfo::none          },  // Array
 
@@ -332,6 +333,8 @@
   TypeNarrowOop::NULL_PTR = TypeNarrowOop::make( TypePtr::NULL_PTR );
   TypeNarrowOop::BOTTOM   = TypeNarrowOop::make( TypeInstPtr::BOTTOM );
 
+  TypeNarrowKlass::NULL_PTR = TypeNarrowKlass::make( TypePtr::NULL_PTR );
+
   mreg2type[Op_Node] = Type::BOTTOM;
   mreg2type[Op_Set ] = 0;
   mreg2type[Op_RegN] = TypeNarrowOop::BOTTOM;
@@ -395,34 +398,36 @@
   longpair[1] = TypeLong::LONG;
   TypeTuple::LONG_PAIR = TypeTuple::make(2, longpair);
 
-  _const_basic_type[T_NARROWOOP] = TypeNarrowOop::BOTTOM;
-  _const_basic_type[T_BOOLEAN] = TypeInt::BOOL;
-  _const_basic_type[T_CHAR]    = TypeInt::CHAR;
-  _const_basic_type[T_BYTE]    = TypeInt::BYTE;
-  _const_basic_type[T_SHORT]   = TypeInt::SHORT;
-  _const_basic_type[T_INT]     = TypeInt::INT;
-  _const_basic_type[T_LONG]    = TypeLong::LONG;
-  _const_basic_type[T_FLOAT]   = Type::FLOAT;
-  _const_basic_type[T_DOUBLE]  = Type::DOUBLE;
-  _const_basic_type[T_OBJECT]  = TypeInstPtr::BOTTOM;
-  _const_basic_type[T_ARRAY]   = TypeInstPtr::BOTTOM; // there is no separate bottom for arrays
-  _const_basic_type[T_VOID]    = TypePtr::NULL_PTR;   // reflection represents void this way
-  _const_basic_type[T_ADDRESS] = TypeRawPtr::BOTTOM;  // both interpreter return addresses & random raw ptrs
-  _const_basic_type[T_CONFLICT]= Type::BOTTOM;        // why not?
-
-  _zero_type[T_NARROWOOP] = TypeNarrowOop::NULL_PTR;
-  _zero_type[T_BOOLEAN] = TypeInt::ZERO;     // false == 0
-  _zero_type[T_CHAR]    = TypeInt::ZERO;     // '\0' == 0
-  _zero_type[T_BYTE]    = TypeInt::ZERO;     // 0x00 == 0
-  _zero_type[T_SHORT]   = TypeInt::ZERO;     // 0x0000 == 0
-  _zero_type[T_INT]     = TypeInt::ZERO;
-  _zero_type[T_LONG]    = TypeLong::ZERO;
-  _zero_type[T_FLOAT]   = TypeF::ZERO;
-  _zero_type[T_DOUBLE]  = TypeD::ZERO;
-  _zero_type[T_OBJECT]  = TypePtr::NULL_PTR;
-  _zero_type[T_ARRAY]   = TypePtr::NULL_PTR; // null array is null oop
-  _zero_type[T_ADDRESS] = TypePtr::NULL_PTR; // raw pointers use the same null
-  _zero_type[T_VOID]    = Type::TOP;         // the only void value is no value at all
+  _const_basic_type[T_NARROWOOP]   = TypeNarrowOop::BOTTOM;
+  _const_basic_type[T_NARROWKLASS] = Type::BOTTOM;
+  _const_basic_type[T_BOOLEAN]     = TypeInt::BOOL;
+  _const_basic_type[T_CHAR]        = TypeInt::CHAR;
+  _const_basic_type[T_BYTE]        = TypeInt::BYTE;
+  _const_basic_type[T_SHORT]       = TypeInt::SHORT;
+  _const_basic_type[T_INT]         = TypeInt::INT;
+  _const_basic_type[T_LONG]        = TypeLong::LONG;
+  _const_basic_type[T_FLOAT]       = Type::FLOAT;
+  _const_basic_type[T_DOUBLE]      = Type::DOUBLE;
+  _const_basic_type[T_OBJECT]      = TypeInstPtr::BOTTOM;
+  _const_basic_type[T_ARRAY]       = TypeInstPtr::BOTTOM; // there is no separate bottom for arrays
+  _const_basic_type[T_VOID]        = TypePtr::NULL_PTR;   // reflection represents void this way
+  _const_basic_type[T_ADDRESS]     = TypeRawPtr::BOTTOM;  // both interpreter return addresses & random raw ptrs
+  _const_basic_type[T_CONFLICT]    = Type::BOTTOM;        // why not?
+
+  _zero_type[T_NARROWOOP]   = TypeNarrowOop::NULL_PTR;
+  _zero_type[T_NARROWKLASS] = TypeNarrowKlass::NULL_PTR;
+  _zero_type[T_BOOLEAN]     = TypeInt::ZERO;     // false == 0
+  _zero_type[T_CHAR]        = TypeInt::ZERO;     // '\0' == 0
+  _zero_type[T_BYTE]        = TypeInt::ZERO;     // 0x00 == 0
+  _zero_type[T_SHORT]       = TypeInt::ZERO;     // 0x0000 == 0
+  _zero_type[T_INT]         = TypeInt::ZERO;
+  _zero_type[T_LONG]        = TypeLong::ZERO;
+  _zero_type[T_FLOAT]       = TypeF::ZERO;
+  _zero_type[T_DOUBLE]      = TypeD::ZERO;
+  _zero_type[T_OBJECT]      = TypePtr::NULL_PTR;
+  _zero_type[T_ARRAY]       = TypePtr::NULL_PTR; // null array is null oop
+  _zero_type[T_ADDRESS]     = TypePtr::NULL_PTR; // raw pointers use the same null
+  _zero_type[T_VOID]        = Type::TOP;         // the only void value is no value at all
 
   // get_zero_type() should not happen for T_CONFLICT
   _zero_type[T_CONFLICT]= NULL;
@@ -563,9 +568,14 @@
     const Type* result = make_ptr()->meet(t->make_ptr());
     return result->make_narrowoop();
   }
+  if (isa_narrowklass() && t->isa_narrowklass()) {
+    const Type* result = make_ptr()->meet(t->make_ptr());
+    return result->make_narrowklass();
+  }
 
   const Type *mt = xmeet(t);
   if (isa_narrowoop() || t->isa_narrowoop()) return mt;
+  if (isa_narrowklass() || t->isa_narrowklass()) return mt;
 #ifdef ASSERT
   assert( mt == t->xmeet(this), "meet not commutative" );
   const Type* dual_join = mt->_dual;
@@ -635,6 +645,9 @@
   case NarrowOop:
     return t->xmeet(this);
 
+  case NarrowKlass:
+    return t->xmeet(this);
+
   case Bad:                     // Type check
   default:                      // Bogus type not in lattice
     typerr(t);
@@ -693,6 +706,7 @@
   Bad,          // Long - handled in v-call
   Half,         // Half
   Bad,          // NarrowOop - handled in v-call
+  Bad,          // NarrowKlass - handled in v-call
 
   Bad,          // Tuple - handled in v-call
   Bad,          // Array - handled in v-call
@@ -756,6 +770,8 @@
   dump2(d,1, st);
   if (is_ptr_to_narrowoop()) {
     st->print(" [narrow]");
+  } else if (is_ptr_to_narrowklass()) {
+    st->print(" [narrowklass]");
   }
 }
 #endif
@@ -838,6 +854,7 @@
   case MetadataPtr:
   case KlassPtr:
   case NarrowOop:
+  case NarrowKlass:
   case Int:
   case Long:
   case DoubleTop:
@@ -955,6 +972,7 @@
   case MetadataPtr:
   case KlassPtr:
   case NarrowOop:
+  case NarrowKlass:
   case Int:
   case Long:
   case FloatTop:
@@ -1109,6 +1127,7 @@
   case MetadataPtr:
   case KlassPtr:
   case NarrowOop:
+  case NarrowKlass:
   case Long:
   case FloatTop:
   case FloatCon:
@@ -1366,6 +1385,7 @@
   case MetadataPtr:
   case KlassPtr:
   case NarrowOop:
+  case NarrowKlass:
   case Int:
   case FloatTop:
   case FloatCon:
@@ -2096,6 +2116,7 @@
   case DoubleCon:
   case DoubleBot:
   case NarrowOop:
+  case NarrowKlass:
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
@@ -2350,17 +2371,18 @@
     _const_oop(o), _klass(k),
     _klass_is_exact(xk),
     _is_ptr_to_narrowoop(false),
+    _is_ptr_to_narrowklass(false),
     _instance_id(instance_id) {
 #ifdef _LP64
-  if (UseCompressedOops && _offset != 0) {
+  if (_offset != 0) {
     if (_offset == oopDesc::klass_offset_in_bytes()) {
-      _is_ptr_to_narrowoop = UseCompressedKlassPointers;
+      _is_ptr_to_narrowklass = UseCompressedKlassPointers;
     } else if (klass() == NULL) {
       // Array with unknown body type
       assert(this->isa_aryptr(), "only arrays without klass");
-      _is_ptr_to_narrowoop = true;
+      _is_ptr_to_narrowoop = UseCompressedOops;
     } else if (this->isa_aryptr()) {
-      _is_ptr_to_narrowoop = (klass()->is_obj_array_klass() &&
+      _is_ptr_to_narrowoop = (UseCompressedOops && klass()->is_obj_array_klass() &&
                              _offset != arrayOopDesc::length_offset_in_bytes());
     } else if (klass()->is_instance_klass()) {
       ciInstanceKlass* ik = klass()->as_instance_klass();
@@ -2369,7 +2391,7 @@
         // Perm objects don't use compressed references
       } else if (_offset == OffsetBot || _offset == OffsetTop) {
         // unsafe access
-        _is_ptr_to_narrowoop = true;
+        _is_ptr_to_narrowoop = UseCompressedOops;
       } else { // exclude unsafe ops
         assert(this->isa_instptr(), "must be an instance ptr.");
 
@@ -2387,22 +2409,22 @@
           ciField* field = k->get_field_by_offset(_offset, true);
           assert(field != NULL, "missing field");
           BasicType basic_elem_type = field->layout_type();
-          _is_ptr_to_narrowoop = (basic_elem_type == T_OBJECT ||
-                                  basic_elem_type == T_ARRAY);
+          _is_ptr_to_narrowoop = UseCompressedOops && (basic_elem_type == T_OBJECT ||
+                                                       basic_elem_type == T_ARRAY);
         } else {
           // Instance fields which contains a compressed oop references.
           field = ik->get_field_by_offset(_offset, false);
           if (field != NULL) {
             BasicType basic_elem_type = field->layout_type();
-            _is_ptr_to_narrowoop = (basic_elem_type == T_OBJECT ||
-                                    basic_elem_type == T_ARRAY);
+            _is_ptr_to_narrowoop = UseCompressedOops && (basic_elem_type == T_OBJECT ||
+                                                         basic_elem_type == T_ARRAY);
           } else if (klass()->equals(ciEnv::current()->Object_klass())) {
             // Compile::find_alias_type() cast exactness on all types to verify
             // that it does not affect alias type.
-            _is_ptr_to_narrowoop = true;
+            _is_ptr_to_narrowoop = UseCompressedOops;
           } else {
             // Type for the copy start in LibraryCallKit::inline_native_clone().
-            _is_ptr_to_narrowoop = true;
+            _is_ptr_to_narrowoop = UseCompressedOops;
           }
         }
       }
@@ -2475,6 +2497,7 @@
   case DoubleCon:
   case DoubleBot:
   case NarrowOop:
+  case NarrowKlass:
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
@@ -2925,6 +2948,7 @@
   case DoubleCon:
   case DoubleBot:
   case NarrowOop:
+  case NarrowKlass:
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
@@ -3353,6 +3377,7 @@
     case T_NARROWOOP:
       etype = T_OBJECT;
       break;
+    case T_NARROWKLASS:
     case T_CONFLICT:
     case T_ILLEGAL:
     case T_VOID:
@@ -3425,6 +3450,7 @@
   case DoubleCon:
   case DoubleBot:
   case NarrowOop:
+  case NarrowKlass:
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
@@ -3671,23 +3697,27 @@
 
 
 //=============================================================================
-const TypeNarrowOop *TypeNarrowOop::BOTTOM;
-const TypeNarrowOop *TypeNarrowOop::NULL_PTR;
-
-
-const TypeNarrowOop* TypeNarrowOop::make(const TypePtr* type) {
-  return (const TypeNarrowOop*)(new TypeNarrowOop(type))->hashcons();
-}
 
 //------------------------------hash-------------------------------------------
 // Type-specific hashing function.
-int TypeNarrowOop::hash(void) const {
+int TypeNarrowPtr::hash(void) const {
   return _ptrtype->hash() + 7;
 }
 
-
-bool TypeNarrowOop::eq( const Type *t ) const {
-  const TypeNarrowOop* tc = t->isa_narrowoop();
+bool TypeNarrowPtr::singleton(void) const {    // TRUE if type is a singleton
+  return _ptrtype->singleton();
+}
+
+bool TypeNarrowPtr::empty(void) const {
+  return _ptrtype->empty();
+}
+
+intptr_t TypeNarrowPtr::get_con() const {
+  return _ptrtype->get_con();
+}
+
+bool TypeNarrowPtr::eq( const Type *t ) const {
+  const TypeNarrowPtr* tc = isa_same_narrowptr(t);
   if (tc != NULL) {
     if (_ptrtype->base() != tc->_ptrtype->base()) {
       return false;
@@ -3697,22 +3727,46 @@
   return false;
 }
 
-bool TypeNarrowOop::singleton(void) const {    // TRUE if type is a singleton
-  return _ptrtype->singleton();
-}
-
-bool TypeNarrowOop::empty(void) const {
-  return _ptrtype->empty();
+const Type *TypeNarrowPtr::xdual() const {    // Compute dual right now.
+  const TypePtr* odual = _ptrtype->dual()->is_ptr();
+  return make_same_narrowptr(odual);
+}
+
+
+const Type *TypeNarrowPtr::filter( const Type *kills ) const {
+  if (isa_same_narrowptr(kills)) {
+    const Type* ft =_ptrtype->filter(is_same_narrowptr(kills)->_ptrtype);
+    if (ft->empty())
+      return Type::TOP;           // Canonical empty value
+    if (ft->isa_ptr()) {
+      return make_hash_same_narrowptr(ft->isa_ptr());
+    }
+    return ft;
+  } else if (kills->isa_ptr()) {
+    const Type* ft = _ptrtype->join(kills);
+    if (ft->empty())
+      return Type::TOP;           // Canonical empty value
+    return ft;
+  } else {
+    return Type::TOP;
+  }
 }
 
 //------------------------------xmeet------------------------------------------
 // Compute the MEET of two types.  It returns a new Type object.
-const Type *TypeNarrowOop::xmeet( const Type *t ) const {
+const Type *TypeNarrowPtr::xmeet( const Type *t ) const {
   // Perform a fast test for common case; meeting the same types together.
   if( this == t ) return this;  // Meeting same type-rep?
 
-
-  // Current "this->_base" is OopPtr
+  if (t->base() == base()) {
+    const Type* result = _ptrtype->xmeet(t->make_ptr());
+    if (result->isa_ptr()) {
+      return make_hash_same_narrowptr(result->is_ptr());
+    }
+    return result;
+  }
+
+  // Current "this->_base" is NarrowKlass or NarrowOop
   switch (t->base()) {          // switch on original type
 
   case Int:                     // Mixing ints & oops happens when javac
@@ -3730,20 +3784,14 @@
   case AryPtr:
   case MetadataPtr:
   case KlassPtr:
+  case NarrowOop:
+  case NarrowKlass:
 
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
     return this;
 
-  case NarrowOop: {
-    const Type* result = _ptrtype->xmeet(t->make_ptr());
-    if (result->isa_ptr()) {
-      return TypeNarrowOop::make(result->is_ptr());
-    }
-    return result;
-  }
-
   default:                      // All else is a mistake
     typerr(t);
 
@@ -3752,42 +3800,40 @@
   return this;
 }
 
-const Type *TypeNarrowOop::xdual() const {    // Compute dual right now.
-  const TypePtr* odual = _ptrtype->dual()->is_ptr();
-  return new TypeNarrowOop(odual);
-}
-
-const Type *TypeNarrowOop::filter( const Type *kills ) const {
-  if (kills->isa_narrowoop()) {
-    const Type* ft =_ptrtype->filter(kills->is_narrowoop()->_ptrtype);
-    if (ft->empty())
-      return Type::TOP;           // Canonical empty value
-    if (ft->isa_ptr()) {
-      return make(ft->isa_ptr());
-    }
-    return ft;
-  } else if (kills->isa_ptr()) {
-    const Type* ft = _ptrtype->join(kills);
-    if (ft->empty())
-      return Type::TOP;           // Canonical empty value
-    return ft;
-  } else {
-    return Type::TOP;
-  }
-}
-
-
-intptr_t TypeNarrowOop::get_con() const {
-  return _ptrtype->get_con();
-}
+#ifndef PRODUCT
+void TypeNarrowPtr::dump2( Dict & d, uint depth, outputStream *st ) const {
+  _ptrtype->dump2(d, depth, st);
+}
+#endif
+
+const TypeNarrowOop *TypeNarrowOop::BOTTOM;
+const TypeNarrowOop *TypeNarrowOop::NULL_PTR;
+
+
+const TypeNarrowOop* TypeNarrowOop::make(const TypePtr* type) {
+  return (const TypeNarrowOop*)(new TypeNarrowOop(type))->hashcons();
+}
+
 
 #ifndef PRODUCT
 void TypeNarrowOop::dump2( Dict & d, uint depth, outputStream *st ) const {
   st->print("narrowoop: ");
-  _ptrtype->dump2(d, depth, st);
+  TypeNarrowPtr::dump2(d, depth, st);
 }
 #endif
 
+const TypeNarrowKlass *TypeNarrowKlass::NULL_PTR;
+
+const TypeNarrowKlass* TypeNarrowKlass::make(const TypePtr* type) {
+  return (const TypeNarrowKlass*)(new TypeNarrowKlass(type))->hashcons();
+}
+
+#ifndef PRODUCT
+void TypeNarrowKlass::dump2( Dict & d, uint depth, outputStream *st ) const {
+  st->print("narrowklass: ");
+  TypeNarrowPtr::dump2(d, depth, st);
+}
+#endif
 
 
 //------------------------------eq---------------------------------------------
@@ -3878,6 +3924,7 @@
   case DoubleCon:
   case DoubleBot:
   case NarrowOop:
+  case NarrowKlass:
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
@@ -4169,6 +4216,7 @@
   case DoubleCon:
   case DoubleBot:
   case NarrowOop:
+  case NarrowKlass:
   case Bottom:                  // Ye Olde Default
     return Type::BOTTOM;
   case Top:
--- a/hotspot/src/share/vm/opto/type.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/opto/type.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -48,7 +48,9 @@
 class   TypeF;
 class   TypeInt;
 class   TypeLong;
-class   TypeNarrowOop;
+class   TypeNarrowPtr;
+class     TypeNarrowOop;
+class     TypeNarrowKlass;
 class   TypeAry;
 class   TypeTuple;
 class   TypeVect;
@@ -81,6 +83,7 @@
     Long,                       // Long integer range (lo-hi)
     Half,                       // Placeholder half of doubleword
     NarrowOop,                  // Compressed oop pointer
+    NarrowKlass,                // Compressed klass pointer
 
     Tuple,                      // Method signature or object layout
     Array,                      // Array types
@@ -229,6 +232,7 @@
   // Returns true if this pointer points at memory which contains a
   // compressed oop references.
   bool is_ptr_to_narrowoop() const;
+  bool is_ptr_to_narrowklass() const;
 
   // Convenience access
   float getf() const;
@@ -252,6 +256,8 @@
   const TypeRawPtr *is_rawptr() const;           // Asserts is rawptr
   const TypeNarrowOop  *is_narrowoop() const;    // Java-style GC'd pointer
   const TypeNarrowOop  *isa_narrowoop() const;   // Returns NULL if not oop ptr type
+  const TypeNarrowKlass *is_narrowklass() const; // compressed klass pointer
+  const TypeNarrowKlass *isa_narrowklass() const;// Returns NULL if not oop ptr type
   const TypeOopPtr   *isa_oopptr() const;        // Returns NULL if not oop ptr type
   const TypeOopPtr   *is_oopptr() const;         // Java-style GC'd pointer
   const TypeInstPtr  *isa_instptr() const;       // Returns NULL if not InstPtr
@@ -278,6 +284,10 @@
   // of this pointer type.
   const TypeNarrowOop* make_narrowoop() const;
 
+  // Returns this compressed klass pointer or the equivalent
+  // compressed version of this pointer type.
+  const TypeNarrowKlass* make_narrowklass() const;
+
   // Special test for register pressure heuristic
   bool is_floatingpoint() const;        // True if Float or Double base type
 
@@ -670,7 +680,7 @@
 // Otherwise the _base will indicate which subset of pointers is affected,
 // and the class will be inherited from.
 class TypePtr : public Type {
-  friend class TypeNarrowOop;
+  friend class TypeNarrowPtr;
 public:
   enum PTR { TopPTR, AnyNull, Constant, Null, NotNull, BotPTR, lastPTR };
 protected:
@@ -781,6 +791,7 @@
   // Does the type exclude subclasses of the klass?  (Inexact == polymorphic.)
   bool          _klass_is_exact;
   bool          _is_ptr_to_narrowoop;
+  bool          _is_ptr_to_narrowklass;
 
   // If not InstanceTop or InstanceBot, indicates that this is
   // a particular instance of this type which is distinct.
@@ -825,6 +836,7 @@
   // Returns true if this pointer points at memory which contains a
   // compressed oop references.
   bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
+  bool is_ptr_to_narrowklass_nv() const { return _is_ptr_to_narrowklass; }
 
   bool is_known_instance()       const { return _instance_id > 0; }
   int  instance_id()             const { return _instance_id; }
@@ -1122,22 +1134,21 @@
 #endif
 };
 
-//------------------------------TypeNarrowOop----------------------------------
-// A compressed reference to some kind of Oop.  This type wraps around
-// a preexisting TypeOopPtr and forwards most of it's operations to
-// the underlying type.  It's only real purpose is to track the
-// oopness of the compressed oop value when we expose the conversion
-// between the normal and the compressed form.
-class TypeNarrowOop : public Type {
+class TypeNarrowPtr : public Type {
 protected:
   const TypePtr* _ptrtype; // Could be TypePtr::NULL_PTR
 
-  TypeNarrowOop( const TypePtr* ptrtype): Type(NarrowOop),
-    _ptrtype(ptrtype) {
+  TypeNarrowPtr(TYPES t, const TypePtr* ptrtype): _ptrtype(ptrtype),
+                                                  Type(t) {
     assert(ptrtype->offset() == 0 ||
            ptrtype->offset() == OffsetBot ||
            ptrtype->offset() == OffsetTop, "no real offsets");
   }
+
+  virtual const TypeNarrowPtr *isa_same_narrowptr(const Type *t) const = 0;
+  virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const = 0;
+  virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const = 0;
+  virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const = 0;
 public:
   virtual bool eq( const Type *t ) const;
   virtual int  hash() const;             // Type specific hashing
@@ -1153,19 +1164,89 @@
 
   virtual bool empty(void) const;        // TRUE if type is vacuous
 
+  // returns the equivalent ptr type for this compressed pointer
+  const TypePtr *get_ptrtype() const {
+    return _ptrtype;
+  }
+
+#ifndef PRODUCT
+  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
+#endif
+};
+
+//------------------------------TypeNarrowOop----------------------------------
+// A compressed reference to some kind of Oop.  This type wraps around
+// a preexisting TypeOopPtr and forwards most of it's operations to
+// the underlying type.  It's only real purpose is to track the
+// oopness of the compressed oop value when we expose the conversion
+// between the normal and the compressed form.
+class TypeNarrowOop : public TypeNarrowPtr {
+protected:
+  TypeNarrowOop( const TypePtr* ptrtype): TypeNarrowPtr(NarrowOop, ptrtype) {
+  }
+
+  virtual const TypeNarrowPtr *isa_same_narrowptr(const Type *t) const {
+    return t->isa_narrowoop();
+  }
+
+  virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const {
+    return t->is_narrowoop();
+  }
+
+  virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const {
+    return new TypeNarrowOop(t);
+  }
+
+  virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const {
+    return (const TypeNarrowPtr*)((new TypeNarrowOop(t))->hashcons());
+  }
+
+public:
+
   static const TypeNarrowOop *make( const TypePtr* type);
 
   static const TypeNarrowOop* make_from_constant(ciObject* con, bool require_constant = false) {
     return make(TypeOopPtr::make_from_constant(con, require_constant));
   }
 
-  // returns the equivalent ptr type for this compressed pointer
-  const TypePtr *get_ptrtype() const {
-    return _ptrtype;
+  static const TypeNarrowOop *BOTTOM;
+  static const TypeNarrowOop *NULL_PTR;
+
+#ifndef PRODUCT
+  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
+#endif
+};
+
+//------------------------------TypeNarrowKlass----------------------------------
+// A compressed reference to klass pointer.  This type wraps around a
+// preexisting TypeKlassPtr and forwards most of it's operations to
+// the underlying type.
+class TypeNarrowKlass : public TypeNarrowPtr {
+protected:
+  TypeNarrowKlass( const TypePtr* ptrtype): TypeNarrowPtr(NarrowKlass, ptrtype) {
   }
 
-  static const TypeNarrowOop *BOTTOM;
-  static const TypeNarrowOop *NULL_PTR;
+  virtual const TypeNarrowPtr *isa_same_narrowptr(const Type *t) const {
+    return t->isa_narrowklass();
+  }
+
+  virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const {
+    return t->is_narrowklass();
+  }
+
+  virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const {
+    return new TypeNarrowKlass(t);
+  }
+
+  virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const {
+    return (const TypeNarrowPtr*)((new TypeNarrowKlass(t))->hashcons());
+  }
+
+public:
+  static const TypeNarrowKlass *make( const TypePtr* type);
+
+  // static const TypeNarrowKlass *BOTTOM;
+  static const TypeNarrowKlass *NULL_PTR;
 
 #ifndef PRODUCT
   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
@@ -1221,6 +1302,14 @@
 #endif
 }
 
+inline bool Type::is_ptr_to_narrowklass() const {
+#ifdef _LP64
+  return (isa_oopptr() != NULL && is_oopptr()->is_ptr_to_narrowklass_nv());
+#else
+  return false;
+#endif
+}
+
 inline float Type::getf() const {
   assert( _base == FloatCon, "Not a FloatCon" );
   return ((TypeF*)this)->_f;
@@ -1346,6 +1435,15 @@
   return (_base == NarrowOop) ? (TypeNarrowOop*)this : NULL;
 }
 
+inline const TypeNarrowKlass *Type::is_narrowklass() const {
+  assert(_base == NarrowKlass, "Not a narrow oop" ) ;
+  return (TypeNarrowKlass*)this;
+}
+
+inline const TypeNarrowKlass *Type::isa_narrowklass() const {
+  return (_base == NarrowKlass) ? (TypeNarrowKlass*)this : NULL;
+}
+
 inline const TypeMetadataPtr *Type::is_metadataptr() const {
   // MetadataPtr is the first and CPCachePtr the last
   assert(_base == MetadataPtr, "Not a metadata pointer" ) ;
@@ -1367,7 +1465,8 @@
 
 inline const TypePtr* Type::make_ptr() const {
   return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype() :
-                                (isa_ptr() ? is_ptr() : NULL);
+    ((_base == NarrowKlass) ? is_narrowklass()->get_ptrtype() :
+     (isa_ptr() ? is_ptr() : NULL));
 }
 
 inline const TypeOopPtr* Type::make_oopptr() const {
@@ -1379,6 +1478,11 @@
                                 (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL);
 }
 
+inline const TypeNarrowKlass* Type::make_narrowklass() const {
+  return (_base == NarrowKlass) ? is_narrowklass() :
+                                (isa_ptr() ? TypeNarrowKlass::make(is_ptr()) : NULL);
+}
+
 inline bool Type::is_floatingpoint() const {
   if( (_base == FloatCon)  || (_base == FloatBot) ||
       (_base == DoubleCon) || (_base == DoubleBot) )
--- a/hotspot/src/share/vm/prims/forte.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/forte.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2012, 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
@@ -30,7 +30,7 @@
 class Forte : AllStatic {
  public:
    static void register_stub(const char* name, address start, address end)
-                                                 KERNEL_RETURN;
+                                                 NOT_JVMTI_RETURN;
                                                  // register internal VM stub
 };
 
--- a/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -2820,10 +2821,9 @@
 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
   JNIWrapper("Set" XSTR(Result) "Field"); \
 \
-  HS_DTRACE_PROBE_CDECL_N(hotspot_jni, Set##Result##Field__entry, \
-    ( JNIEnv*, jobject, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
-  HS_DTRACE_PROBE_N(hotspot_jni, Set##Result##Field__entry, \
-    ( env, obj, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
+  FP_SELECT_##Result( \
+    DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value), \
+    DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \
 \
   oop o = JNIHandles::resolve_non_null(obj); \
   Klass* k = o->klass(); \
@@ -3003,9 +3003,9 @@
   HOTSPOT_JNI_GETSTATICOBJECTFIELD_ENTRY(
                                          env, clazz, (uintptr_t) fieldID);
 #endif /* USDT2 */
-#ifndef JNICHECK_KERNEL
+#if INCLUDE_JNI_CHECK
   DEBUG_ONLY(Klass* param_k = jniCheck::validate_class(thread, clazz);)
-#endif // JNICHECK_KERNEL
+#endif // INCLUDE_JNI_CHECK
   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
   assert(id->is_static_field_id(), "invalid static field id");
   // Keep JVMTI addition small and only check enabled flag here.
@@ -3130,10 +3130,9 @@
 \
 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
   JNIWrapper("SetStatic" XSTR(Result) "Field"); \
-  HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
-    ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
-  HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
-    ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
+  FP_SELECT_##Result( \
+     DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value), \
+     DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \
 \
   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
   assert(id->is_static_field_id(), "invalid static field id"); \
@@ -3442,8 +3441,8 @@
   KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass)));
   Klass* ako = Klass::cast(ek())->array_klass(CHECK_NULL);
   KlassHandle ak = KlassHandle(THREAD, ako);
-  objArrayKlass::cast(ak())->initialize(CHECK_NULL);
-  objArrayOop result = objArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
+  ObjArrayKlass::cast(ak())->initialize(CHECK_NULL);
+  objArrayOop result = ObjArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
   oop initial_value = JNIHandles::resolve(initialElement);
   if (initial_value != NULL) {  // array already initialized with NULL
     for (int index = 0; index < length; index++) {
@@ -3502,7 +3501,7 @@
   objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
   oop v = JNIHandles::resolve(value);
   if (a->is_within_bounds(index)) {
-    if (v == NULL || v->is_a(objArrayKlass::cast(a->klass())->element_klass())) {
+    if (v == NULL || v->is_a(ObjArrayKlass::cast(a->klass())->element_klass())) {
       a->obj_at_put(index, v);
     } else {
       THROW(vmSymbols::java_lang_ArrayStoreException());
@@ -3787,7 +3786,7 @@
     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
   } else { \
     if (len > 0) { \
-      int sc = typeArrayKlass::cast(src->klass())->log2_element_size(); \
+      int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
       memcpy((u_char*) buf, \
              (u_char*) src->Tag##_at_addr(start), \
              len << sc);                          \
@@ -3822,7 +3821,7 @@
     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
   } else { \
     if (len > 0) { \
-      int sc = typeArrayKlass::cast(src->klass())->log2_element_size(); \
+      int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
       memcpy((u_char*) buf, \
              (u_char*) src->Tag##_at_addr(start), \
              len << sc);                          \
@@ -3871,7 +3870,7 @@
     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
   } else { \
     if (len > 0) { \
-      int sc = typeArrayKlass::cast(dst->klass())->log2_element_size(); \
+      int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
       memcpy((u_char*) dst->Tag##_at_addr(start), \
              (u_char*) buf, \
              len << sc);    \
@@ -3906,7 +3905,7 @@
     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
   } else { \
     if (len > 0) { \
-      int sc = typeArrayKlass::cast(dst->klass())->log2_element_size(); \
+      int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
       memcpy((u_char*) dst->Tag##_at_addr(start), \
              (u_char*) buf, \
              len << sc);    \
@@ -3951,6 +3950,7 @@
 // SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
 static Method* find_prefixed_native(KlassHandle k,
                                       Symbol* name, Symbol* signature, TRAPS) {
+#if INCLUDE_JVMTI
   ResourceMark rm(THREAD);
   Method* method;
   int name_len = name->utf8_length();
@@ -3982,6 +3982,7 @@
     name_len = trial_len;
     name_str = trial_name_str;
   }
+#endif // INCLUDE_JVMTI
   return NULL; // not found
 }
 
@@ -4251,7 +4252,7 @@
   if (a->is_objArray()) {
     type = T_OBJECT;
   } else {
-    type = typeArrayKlass::cast(a->klass())->element_type();
+    type = TypeArrayKlass::cast(a->klass())->element_type();
   }
   void* ret = arrayOop(a)->base(type);
 #ifndef USDT2
@@ -4975,11 +4976,9 @@
 
 // Returns the function structure
 struct JNINativeInterface_* jni_functions() {
-#ifndef JNICHECK_KERNEL
+#if INCLUDE_JNI_CHECK
   if (CheckJNICalls) return jni_functions_check();
-#else  // JNICHECK_KERNEL
-  if (CheckJNICalls) warning("-Xcheck:jni is not supported in kernel vm.");
-#endif // JNICHECK_KERNEL
+#endif // INCLUDE_JNI_CHECK
   return &jni_NativeInterface;
 }
 
--- a/hotspot/src/share/vm/prims/jniCheck.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jniCheck.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -290,7 +290,7 @@
 
   if (elementType != -1) {
     if (aOop->is_typeArray()) {
-      BasicType array_type = typeArrayKlass::cast(aOop->klass())->element_type();
+      BasicType array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
       if (array_type != elementType)
         ReportJNIFatalError(thr, fatal_element_type_mismatch);
       } else if (aOop->is_objArray()) {
--- a/hotspot/src/share/vm/prims/jniExport.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jniExport.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/prims/jvm.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvm.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1048,7 +1048,7 @@
   if (signers == NULL) return NULL;
 
   // copy of the signers array
-  Klass* element = objArrayKlass::cast(signers->klass())->element_klass();
+  Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass();
   objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);
   for (int index = 0; index < signers->length(); index++) {
     signers_copy->obj_at_put(index, signers->obj_at(index));
@@ -3302,10 +3302,10 @@
 
   if (k->oop_is_typeArray()) {
     // typeArray
-    result = typeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
+    result = TypeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
   } else if (k->oop_is_objArray()) {
     // objArray
-    objArrayKlass* oak = objArrayKlass::cast(k);
+    ObjArrayKlass* oak = ObjArrayKlass::cast(k);
     oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior)
     result = oak->allocate(length, CHECK_NULL);
   } else {
@@ -4193,7 +4193,7 @@
   }
 
   // check if threads is not an array of objects of Thread class
-  Klass* k = objArrayKlass::cast(ah->klass())->element_klass();
+  Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();
   if (k != SystemDictionary::Thread_klass()) {
     THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
   }
--- a/hotspot/src/share/vm/prims/jvmtiCodeBlobEvents.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiCodeBlobEvents.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/prims/jvmtiEnter.xsl	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiEnter.xsl	Wed Jul 05 18:26:11 2017 +0200
@@ -1,6 +1,6 @@
 <?xml version="1.0"?> 
 <!--
- Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2002, 2010, 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
@@ -37,6 +37,8 @@
   <xsl:call-template name="sourceHeader"/>
   <xsl:text>
 # include "precompiled.hpp"
+# include "utilities/macros.hpp"
+#if INCLUDE_JVMTI
 # include "prims/jvmtiEnter.hpp"
 # include "prims/jvmtiRawMonitor.hpp"
 # include "prims/jvmtiUtil.hpp"
@@ -247,6 +249,7 @@
 
   <xsl:text>
 };
+#endif // INCLUDE_JVMTI
 </xsl:text>
 </xsl:template>
 
@@ -469,7 +472,7 @@
 </xsl:text>
 
   <xsl:if test="not(contains(@jkernel,'yes'))">
-  <xsl:text>&#xA;#ifdef JVMTI_KERNEL &#xA;</xsl:text>
+  <xsl:text>&#xA;#if !INCLUDE_JVMTI &#xA;</xsl:text>
   <xsl:text>  return JVMTI_ERROR_NOT_AVAILABLE; &#xA;</xsl:text>
   <xsl:text>#else &#xA;</xsl:text>
   </xsl:if>
@@ -596,7 +599,7 @@
 </xsl:text>
 
   <xsl:if test="not(contains(@jkernel,'yes'))">
-  <xsl:text>#endif // JVMTI_KERNEL&#xA;</xsl:text>
+  <xsl:text>#endif // INCLUDE_JVMTI&#xA;</xsl:text>
   </xsl:if>
 
   <xsl:text>}&#xA;</xsl:text>
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -56,7 +56,9 @@
 
  private:
 
+#if INCLUDE_JVMTI
   static JvmtiEnvBase*     _head_environment;  // head of environment list
+#endif // INCLUDE_JVMTI
 
   static bool              _globally_initialized;
   static jvmtiPhase        _phase;
@@ -129,7 +131,10 @@
   friend class JvmtiEnvIterator;
   JvmtiEnv* next_environment()                     { return (JvmtiEnv*)_next; }
   void set_next_environment(JvmtiEnvBase* env)     { _next = env; }
-  static JvmtiEnv* head_environment()              { return (JvmtiEnv*)_head_environment; }
+  static JvmtiEnv* head_environment()              {
+    JVMTI_ONLY(return (JvmtiEnv*)_head_environment);
+    NOT_JVMTI(return NULL);
+  }
 
  public:
 
--- a/hotspot/src/share/vm/prims/jvmtiExport.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -46,21 +46,18 @@
 class JvmtiThreadState;
 class AttachOperation;
 
-#ifndef JVMTI_KERNEL
-#define JVMTI_SUPPORT_FLAG(key)                                         \
-  private:                                                              \
-  static bool  _##key;                                                  \
-  public:                                                               \
-  inline static void set_##key(bool on)       { _##key = (on != 0); }   \
-  inline static bool key()                    { return _##key; }
-#else  // JVMTI_KERNEL
 #define JVMTI_SUPPORT_FLAG(key)                                           \
   private:                                                                \
-  const static bool _##key = false;                                       \
+  static bool  _##key;                                                    \
   public:                                                                 \
-  inline static void set_##key(bool on)       { report_unsupported(on); } \
-  inline static bool key()                    { return _##key; }
-#endif // JVMTI_KERNEL
+  inline static void set_##key(bool on) {                                 \
+    JVMTI_ONLY(_##key = (on != 0));                                       \
+    NOT_JVMTI(report_unsupported(on));                                    \
+  }                                                                       \
+  inline static bool key() {                                              \
+    JVMTI_ONLY(return _##key);                                            \
+    NOT_JVMTI(return false);                                              \
+  }
 
 
 // This class contains the JVMTI interface for the rest of hotspot.
@@ -68,6 +65,8 @@
 class JvmtiExport : public AllStatic {
   friend class VMStructs;
  private:
+
+#if INCLUDE_JVMTI
   static int         _field_access_count;
   static int         _field_modification_count;
 
@@ -75,6 +74,7 @@
   static bool        _can_hotswap_or_post_breakpoint;
   static bool        _can_modify_any_class;
   static bool        _can_walk_any_space;
+#endif // INCLUDE_JVMTI
 
   JVMTI_SUPPORT_FLAG(can_get_source_debug_extension)
   JVMTI_SUPPORT_FLAG(can_maintain_original_method_order)
@@ -125,10 +125,18 @@
 
   // these should only be called by the friend class
   friend class JvmtiManageCapabilities;
-  inline static void set_can_modify_any_class(bool on)                 { _can_modify_any_class = (on != 0); }
-  inline static void set_can_access_local_variables(bool on)           { _can_access_local_variables = (on != 0); }
-  inline static void set_can_hotswap_or_post_breakpoint(bool on)       { _can_hotswap_or_post_breakpoint = (on != 0); }
-  inline static void set_can_walk_any_space(bool on)                   { _can_walk_any_space = (on != 0); }
+  inline static void set_can_modify_any_class(bool on) {
+    JVMTI_ONLY(_can_modify_any_class = (on != 0);)
+  }
+  inline static void set_can_access_local_variables(bool on) {
+    JVMTI_ONLY(_can_access_local_variables = (on != 0);)
+  }
+  inline static void set_can_hotswap_or_post_breakpoint(bool on) {
+    JVMTI_ONLY(_can_hotswap_or_post_breakpoint = (on != 0);)
+  }
+  inline static void set_can_walk_any_space(bool on) {
+    JVMTI_ONLY(_can_walk_any_space = (on != 0);)
+  }
 
   enum {
     JVMTI_VERSION_MASK   = 0x70000000,
@@ -144,7 +152,7 @@
   // posts a DynamicCodeGenerated event (internal/private implementation).
   // The public post_dynamic_code_generated* functions make use of the
   // internal implementation.  Also called from JvmtiDeferredEvent::post()
-  static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
+  static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) NOT_JVMTI_RETURN;
 
  private:
 
@@ -154,9 +162,9 @@
 
   static void post_compiled_method_load(JvmtiEnv* env, const jmethodID method, const jint length,
                                         const void *code_begin, const jint map_length,
-                                        const jvmtiAddrLocationMap* map) KERNEL_RETURN;
+                                        const jvmtiAddrLocationMap* map) NOT_JVMTI_RETURN;
   static void post_dynamic_code_generated(JvmtiEnv* env, const char *name, const void *code_begin,
-                                          const void *code_end) KERNEL_RETURN;
+                                          const void *code_end) NOT_JVMTI_RETURN;
 
   // The RedefineClasses() API breaks some invariants in the "regular"
   // system. For example, there are sanity checks when GC'ing nmethods
@@ -178,9 +186,8 @@
   static bool _has_redefined_a_class;
   friend class VM_RedefineClasses;
   inline static void set_has_redefined_a_class() {
-    _has_redefined_a_class = true;
+    JVMTI_ONLY(_has_redefined_a_class = true;)
   }
-
   // Flag to indicate if the compiler has recorded all dependencies. When the
   // can_redefine_classes capability is enabled in the OnLoad phase then the compiler
   // records all dependencies from startup. However if the capability is first
@@ -191,7 +198,8 @@
 
  public:
   inline static bool has_redefined_a_class() {
-    return _has_redefined_a_class;
+    JVMTI_ONLY(return _has_redefined_a_class);
+    NOT_JVMTI(return false);
   }
 
   inline static bool all_dependencies_are_recorded() {
@@ -204,120 +212,141 @@
 
 
   // let JVMTI know that the JVM_OnLoad code is running
-  static void enter_onload_phase();
+  static void enter_onload_phase() NOT_JVMTI_RETURN;
 
   // let JVMTI know that the VM isn't up yet (and JVM_OnLoad code isn't running)
-  static void enter_primordial_phase();
+  static void enter_primordial_phase() NOT_JVMTI_RETURN;
 
   // let JVMTI know that the VM isn't up yet but JNI is live
-  static void enter_start_phase();
+  static void enter_start_phase() NOT_JVMTI_RETURN;
 
   // let JVMTI know that the VM is fully up and running now
-  static void enter_live_phase();
+  static void enter_live_phase() NOT_JVMTI_RETURN;
 
   // ------ can_* conditions (below) are set at OnLoad and never changed ------------
-  inline static bool can_modify_any_class()                       { return _can_modify_any_class; }
-  inline static bool can_access_local_variables()                 { return _can_access_local_variables; }
-  inline static bool can_hotswap_or_post_breakpoint()             { return _can_hotswap_or_post_breakpoint; }
-  inline static bool can_walk_any_space()                         { return _can_walk_any_space; }
+  inline static bool can_modify_any_class()                       {
+    JVMTI_ONLY(return _can_modify_any_class);
+    NOT_JVMTI(return false);
+  }
+  inline static bool can_access_local_variables()                 {
+    JVMTI_ONLY(return _can_access_local_variables);
+    NOT_JVMTI(return false);
+  }
+  inline static bool can_hotswap_or_post_breakpoint()             {
+    JVMTI_ONLY(return _can_hotswap_or_post_breakpoint);
+    NOT_JVMTI(return false);
+  }
+  inline static bool can_walk_any_space()                         {
+    JVMTI_ONLY(return _can_walk_any_space);
+    NOT_JVMTI(return false);
+  }
 
   // field access management
-  static address  get_field_access_count_addr();
+  static address  get_field_access_count_addr() NOT_JVMTI_RETURN_(0);
 
   // field modification management
-  static address  get_field_modification_count_addr();
+  static address  get_field_modification_count_addr() NOT_JVMTI_RETURN_(0);
 
   // -----------------
 
-  static bool is_jvmti_version(jint version)                      { return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE; }
-  static bool is_jvmdi_version(jint version)                      { return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE; }
-  static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version);
+  static bool is_jvmti_version(jint version)                      {
+    JVMTI_ONLY(return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE);
+    NOT_JVMTI(return false);
+  }
+  static bool is_jvmdi_version(jint version)                      {
+    JVMTI_ONLY(return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE);
+    NOT_JVMTI(return false);
+  }
+  static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version) NOT_JVMTI_RETURN_(0);
   static void decode_version_values(jint version, int * major, int * minor,
-                                    int * micro);
+                                    int * micro) NOT_JVMTI_RETURN;
 
   // single stepping management methods
-  static void at_single_stepping_point(JavaThread *thread, Method* method, address location) KERNEL_RETURN;
-  static void expose_single_stepping(JavaThread *thread) KERNEL_RETURN;
-  static bool hide_single_stepping(JavaThread *thread) KERNEL_RETURN_(false);
+  static void at_single_stepping_point(JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN;
+  static void expose_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN;
+  static bool hide_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN_(false);
 
   // Methods that notify the debugger that something interesting has happened in the VM.
-  static void post_vm_start              ();
-  static void post_vm_initialized        ();
-  static void post_vm_death              ();
+  static void post_vm_start              () NOT_JVMTI_RETURN;
+  static void post_vm_initialized        () NOT_JVMTI_RETURN;
+  static void post_vm_death              () NOT_JVMTI_RETURN;
 
-  static void post_single_step           (JavaThread *thread, Method* method, address location) KERNEL_RETURN;
-  static void post_raw_breakpoint        (JavaThread *thread, Method* method, address location) KERNEL_RETURN;
+  static void post_single_step           (JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN;
+  static void post_raw_breakpoint        (JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN;
 
-  static void post_exception_throw       (JavaThread *thread, Method* method, address location, oop exception) KERNEL_RETURN;
-  static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) KERNEL_RETURN;
+  static void post_exception_throw       (JavaThread *thread, Method* method, address location, oop exception) NOT_JVMTI_RETURN;
+  static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) NOT_JVMTI_RETURN;
 
   static oop jni_GetField_probe          (JavaThread *thread, jobject jobj,
     oop obj, Klass* klass, jfieldID fieldID, bool is_static)
-    KERNEL_RETURN_(NULL);
+    NOT_JVMTI_RETURN_(NULL);
   static oop jni_GetField_probe_nh       (JavaThread *thread, jobject jobj,
     oop obj, Klass* klass, jfieldID fieldID, bool is_static)
-    KERNEL_RETURN_(NULL);
+    NOT_JVMTI_RETURN_(NULL);
   static void post_field_access_by_jni   (JavaThread *thread, oop obj,
-    Klass* klass, jfieldID fieldID, bool is_static) KERNEL_RETURN;
+    Klass* klass, jfieldID fieldID, bool is_static) NOT_JVMTI_RETURN;
   static void post_field_access          (JavaThread *thread, Method* method,
-    address location, KlassHandle field_klass, Handle object, jfieldID field) KERNEL_RETURN;
+    address location, KlassHandle field_klass, Handle object, jfieldID field) NOT_JVMTI_RETURN;
   static oop jni_SetField_probe          (JavaThread *thread, jobject jobj,
     oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
-    jvalue *value) KERNEL_RETURN_(NULL);
+    jvalue *value) NOT_JVMTI_RETURN_(NULL);
   static oop jni_SetField_probe_nh       (JavaThread *thread, jobject jobj,
     oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
-    jvalue *value) KERNEL_RETURN_(NULL);
+    jvalue *value) NOT_JVMTI_RETURN_(NULL);
   static void post_field_modification_by_jni(JavaThread *thread, oop obj,
     Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
     jvalue *value);
   static void post_raw_field_modification(JavaThread *thread, Method* method,
     address location, KlassHandle field_klass, Handle object, jfieldID field,
-    char sig_type, jvalue *value) KERNEL_RETURN;
+    char sig_type, jvalue *value) NOT_JVMTI_RETURN;
 
-  static void post_method_entry          (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN;
-  static void post_method_exit           (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN;
+  static void post_method_entry          (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN;
+  static void post_method_exit           (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN;
 
-  static void post_class_load            (JavaThread *thread, Klass* klass) KERNEL_RETURN;
-  static void post_class_unload          (Klass* klass) KERNEL_RETURN;
-  static void post_class_prepare         (JavaThread *thread, Klass* klass) KERNEL_RETURN;
+  static void post_class_load            (JavaThread *thread, Klass* klass) NOT_JVMTI_RETURN;
+  static void post_class_unload          (Klass* klass) NOT_JVMTI_RETURN;
+  static void post_class_prepare         (JavaThread *thread, Klass* klass) NOT_JVMTI_RETURN;
 
-  static void post_thread_start          (JavaThread *thread) KERNEL_RETURN;
-  static void post_thread_end            (JavaThread *thread) KERNEL_RETURN;
+  static void post_thread_start          (JavaThread *thread) NOT_JVMTI_RETURN;
+  static void post_thread_end            (JavaThread *thread) NOT_JVMTI_RETURN;
 
   // Support for java.lang.instrument agent loading.
   static bool _should_post_class_file_load_hook;
   inline static void set_should_post_class_file_load_hook(bool on)     { _should_post_class_file_load_hook = on;  }
-  inline static bool should_post_class_file_load_hook()           { return _should_post_class_file_load_hook; }
+  inline static bool should_post_class_file_load_hook()           {
+    JVMTI_ONLY(return _should_post_class_file_load_hook);
+    NOT_JVMTI(return false;)
+  }
   static void post_class_file_load_hook(Symbol* h_name, Handle class_loader,
                                         Handle h_protection_domain,
                                         unsigned char **data_ptr, unsigned char **end_ptr,
                                         unsigned char **cached_data_ptr,
-                                        jint *cached_length_ptr);
-  static void post_native_method_bind(Method* method, address* function_ptr) KERNEL_RETURN;
-  static void post_compiled_method_load(nmethod *nm) KERNEL_RETURN;
-  static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
+                                        jint *cached_length_ptr) NOT_JVMTI_RETURN;
+  static void post_native_method_bind(Method* method, address* function_ptr) NOT_JVMTI_RETURN;
+  static void post_compiled_method_load(nmethod *nm) NOT_JVMTI_RETURN;
+  static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) NOT_JVMTI_RETURN;
 
   // used to post a CompiledMethodUnload event
-  static void post_compiled_method_unload(jmethodID mid, const void *code_begin) KERNEL_RETURN;
+  static void post_compiled_method_unload(jmethodID mid, const void *code_begin) NOT_JVMTI_RETURN;
 
   // similiar to post_dynamic_code_generated except that it can be used to
   // post a DynamicCodeGenerated event while holding locks in the VM. Any event
   // posted using this function is recorded by the enclosing event collector
   // -- JvmtiDynamicCodeEventCollector.
-  static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) KERNEL_RETURN;
+  static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) NOT_JVMTI_RETURN;
 
-  static void post_garbage_collection_finish() KERNEL_RETURN;
-  static void post_garbage_collection_start() KERNEL_RETURN;
-  static void post_data_dump() KERNEL_RETURN;
-  static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
-  static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
-  static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) KERNEL_RETURN;
-  static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) KERNEL_RETURN;
-  static void post_object_free(JvmtiEnv* env, jlong tag) KERNEL_RETURN;
-  static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) KERNEL_RETURN;
-  static void record_vm_internal_object_allocation(oop object) KERNEL_RETURN;
+  static void post_garbage_collection_finish() NOT_JVMTI_RETURN;
+  static void post_garbage_collection_start() NOT_JVMTI_RETURN;
+  static void post_data_dump() NOT_JVMTI_RETURN;
+  static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
+  static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
+  static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) NOT_JVMTI_RETURN;
+  static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) NOT_JVMTI_RETURN;
+  static void post_object_free(JvmtiEnv* env, jlong tag) NOT_JVMTI_RETURN;
+  static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) NOT_JVMTI_RETURN;
+  static void record_vm_internal_object_allocation(oop object) NOT_JVMTI_RETURN;
   // Post objects collected by vm_object_alloc_event_collector.
-  static void post_vm_object_alloc(JavaThread *thread, oop object) KERNEL_RETURN;
+  static void post_vm_object_alloc(JavaThread *thread, oop object) NOT_JVMTI_RETURN;
   // Collects vm internal objects for later event posting.
   inline static void vm_object_alloc_event_collector(oop object) {
     if (should_post_vm_object_alloc()) {
@@ -331,21 +360,19 @@
     }
   }
 
-  static void cleanup_thread             (JavaThread* thread) KERNEL_RETURN;
-
-  static void oops_do(OopClosure* f) KERNEL_RETURN;
-  static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) KERNEL_RETURN;
-  static void gc_epilogue() KERNEL_RETURN;
+  static void cleanup_thread             (JavaThread* thread) NOT_JVMTI_RETURN;
 
-  static void transition_pending_onload_raw_monitors() KERNEL_RETURN;
+  static void oops_do(OopClosure* f) NOT_JVMTI_RETURN;
+  static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) NOT_JVMTI_RETURN;
+  static void gc_epilogue() NOT_JVMTI_RETURN;
 
-#ifndef SERVICES_KERNEL
+  static void transition_pending_onload_raw_monitors() NOT_JVMTI_RETURN;
+
   // attach support
-  static jint load_agent_library(AttachOperation* op, outputStream* out);
-#endif // SERVICES_KERNEL
+  static jint load_agent_library(AttachOperation* op, outputStream* out) NOT_JVMTI_RETURN_(JNI_ERR);
 
   // SetNativeMethodPrefix support
-  static char** get_all_native_method_prefixes(int* count_ptr);
+  static char** get_all_native_method_prefixes(int* count_ptr) NOT_JVMTI_RETURN_(NULL);
 };
 
 // Support class used by JvmtiDynamicCodeEventCollector and others. It
@@ -408,8 +435,8 @@
   void register_stub(const char* name, address start, address end);
 
  public:
-  JvmtiDynamicCodeEventCollector()  KERNEL_RETURN;
-  ~JvmtiDynamicCodeEventCollector() KERNEL_RETURN;
+  JvmtiDynamicCodeEventCollector()  NOT_JVMTI_RETURN;
+  ~JvmtiDynamicCodeEventCollector() NOT_JVMTI_RETURN;
   bool is_dynamic_code_event()   { return true; }
 
 };
@@ -441,8 +468,8 @@
   static void oops_do_for_all_threads(OopClosure* f);
 
  public:
-  JvmtiVMObjectAllocEventCollector()  KERNEL_RETURN;
-  ~JvmtiVMObjectAllocEventCollector() KERNEL_RETURN;
+  JvmtiVMObjectAllocEventCollector()  NOT_JVMTI_RETURN;
+  ~JvmtiVMObjectAllocEventCollector() NOT_JVMTI_RETURN;
   bool is_vm_object_alloc_event()   { return true; }
 
   bool is_enabled()                 { return _enable; }
@@ -472,16 +499,16 @@
   bool was_enabled()    { return _collector != NULL; }
 
  public:
-  NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
-  ~NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
+  NoJvmtiVMObjectAllocMark() NOT_JVMTI_RETURN;
+  ~NoJvmtiVMObjectAllocMark() NOT_JVMTI_RETURN;
 };
 
 
 // Base class for reporting GC events to JVMTI.
 class JvmtiGCMarker : public StackObj {
  public:
-  JvmtiGCMarker() KERNEL_RETURN;
-  ~JvmtiGCMarker() KERNEL_RETURN;
+  JvmtiGCMarker() NOT_JVMTI_RETURN;
+  ~JvmtiGCMarker() NOT_JVMTI_RETURN;
 };
 
 // JvmtiHideSingleStepping is a helper class for hiding
--- a/hotspot/src/share/vm/prims/jvmtiExtensions.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiExtensions.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/prims/jvmtiImpl.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -481,15 +481,15 @@
 
   // Factory methods
   static JvmtiDeferredEvent compiled_method_load_event(nmethod* nm)
-    KERNEL_RETURN_(JvmtiDeferredEvent());
+    NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
   static JvmtiDeferredEvent compiled_method_unload_event(nmethod* nm,
-      jmethodID id, const void* code) KERNEL_RETURN_(JvmtiDeferredEvent());
+      jmethodID id, const void* code) NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
   static JvmtiDeferredEvent dynamic_code_generated_event(
       const char* name, const void* begin, const void* end)
-          KERNEL_RETURN_(JvmtiDeferredEvent());
+          NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
 
   // Actually posts the event.
-  void post() KERNEL_RETURN;
+  void post() NOT_JVMTI_RETURN;
 };
 
 /**
@@ -520,13 +520,13 @@
   static volatile QueueNode* _pending_list;  // Uses CAS for read/update
 
   // Transfers events from the _pending_list to the _queue.
-  static void process_pending_events() KERNEL_RETURN;
+  static void process_pending_events() NOT_JVMTI_RETURN;
 
  public:
   // Must be holding Service_lock when calling these
-  static bool has_events() KERNEL_RETURN_(false);
-  static void enqueue(const JvmtiDeferredEvent& event) KERNEL_RETURN;
-  static JvmtiDeferredEvent dequeue() KERNEL_RETURN_(JvmtiDeferredEvent());
+  static bool has_events() NOT_JVMTI_RETURN_(false);
+  static void enqueue(const JvmtiDeferredEvent& event) NOT_JVMTI_RETURN;
+  static JvmtiDeferredEvent dequeue() NOT_JVMTI_RETURN_(JvmtiDeferredEvent());
 
   // Used to enqueue events without using a lock, for times (such as during
   // safepoint) when we can't or don't want to lock the Service_lock.
@@ -534,7 +534,7 @@
   // Events will be held off to the side until there's a call to
   // dequeue(), enqueue(), or process_pending_events() (all of which require
   // the holding of the Service_lock), and will be enqueued at that time.
-  static void add_pending_event(const JvmtiDeferredEvent&) KERNEL_RETURN;
+  static void add_pending_event(const JvmtiDeferredEvent&) NOT_JVMTI_RETURN;
 };
 
 // Utility macro that checks for NULL pointers:
--- a/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2606,7 +2606,7 @@
 
 
 void VM_RedefineClasses::adjust_array_vtable(Klass* k_oop) {
-  arrayKlass* ak = arrayKlass::cast(k_oop);
+  ArrayKlass* ak = ArrayKlass::cast(k_oop);
   bool trace_name_printed = false;
   ak->vtable()->adjust_method_entries(_matching_old_methods,
                                       _matching_new_methods,
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -495,9 +495,9 @@
 class MetadataOnStackMark : public StackObj {
   NOT_PRODUCT(static bool _is_active;)
  public:
-  MetadataOnStackMark();
-  ~MetadataOnStackMark();
-  static void record(Metadata* m);
+  MetadataOnStackMark() NOT_JVMTI_RETURN;
+  ~MetadataOnStackMark() NOT_JVMTI_RETURN;
+  static void record(Metadata* m) NOT_JVMTI_RETURN;
 };
 
 #endif // SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1075,7 +1075,7 @@
 
   // get base address of first element
   typeArrayOop array = typeArrayOop(obj);
-  BasicType type = typeArrayKlass::cast(array->klass())->element_type();
+  BasicType type = TypeArrayKlass::cast(array->klass())->element_type();
   void* elements = array->base(type);
 
   // jvmtiPrimitiveType is defined so this mapping is always correct
@@ -2750,7 +2750,7 @@
   objArrayOop array = objArrayOop(o);
 
   // array reference to its class
-  oop mirror = objArrayKlass::cast(array->klass())->java_mirror();
+  oop mirror = ObjArrayKlass::cast(array->klass())->java_mirror();
   if (!CallbackInvoker::report_class_reference(o, mirror)) {
     return false;
   }
@@ -2862,9 +2862,8 @@
           oop entry;
           if (tag.is_string()) {
             entry = pool->resolved_string_at(i);
-            // If the entry is non-null it it resolved.
+            // If the entry is non-null it is resolved.
             if (entry == NULL) continue;
-            assert(java_lang_String::is_instance(entry), "must be string");
           } else {
             entry = Klass::cast(pool->resolved_klass_at(i))->java_mirror();
           }
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
@@ -125,7 +125,7 @@
                                    jlong** tag_result_ptr);
 
   static void weak_oops_do(
-      BoolObjectClosure* is_alive, OopClosure* f) KERNEL_RETURN;
+      BoolObjectClosure* is_alive, OopClosure* f) NOT_JVMTI_RETURN;
 };
 
 #endif // SHARE_VM_PRIMS_JVMTITAGMAP_HPP
--- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -391,7 +391,7 @@
   static ByteSize earlyret_oop_offset()   { return byte_offset_of(JvmtiThreadState, _earlyret_oop); }
   static ByteSize earlyret_value_offset() { return byte_offset_of(JvmtiThreadState, _earlyret_value); }
 
-  void oops_do(OopClosure* f); // GC support
+  void oops_do(OopClosure* f) NOT_JVMTI_RETURN; // GC support
 
 public:
   void set_should_post_on_exceptions(bool val) { _thread->set_should_post_on_exceptions_flag(val ? JNI_TRUE : JNI_FALSE); }
--- a/hotspot/src/share/vm/prims/jvmtiUtil.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiUtil.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/prims/methodHandles.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -563,15 +563,6 @@
       return Klass::cast(SystemDictionary::Class_klass())->java_mirror();
     } else if (s == vmSymbols::string_signature()) {
       return Klass::cast(SystemDictionary::String_klass())->java_mirror();
-    } else {
-      int len = s->utf8_length();
-      if (s->byte_at(0) == 'L' && s->byte_at(len-1) == ';') {
-        TempNewSymbol cname = SymbolTable::probe((const char*)&s->bytes()[1], len-2);
-        if (cname == NULL)  return NULL;
-        Klass* wkk = SystemDictionary::find_well_known_klass(cname);
-        if (wkk == NULL)  return NULL;
-        return Klass::cast(wkk)->java_mirror();
-      }
     }
   }
   return NULL;
--- a/hotspot/src/share/vm/prims/methodHandles.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -196,7 +196,27 @@
 # include "methodHandles_ppc.hpp"
 #endif
 
-
+  // Tracing
+  static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
+  static void trace_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid) {
+    if (TraceMethodHandles) {
+      const char* name = vmIntrinsics::name_at(iid);
+      if (*name == '_')  name += 1;
+      const size_t len = strlen(name) + 50;
+      char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
+      const char* suffix = "";
+      if (is_signature_polymorphic(iid)) {
+        if (is_signature_polymorphic_static(iid))
+          suffix = "/static";
+        else
+          suffix = "/private";
+      }
+      jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
+      trace_method_handle(_masm, qname);
+      // Note:  Don't free the allocated char array because it's used
+      // during runtime.
+    }
+  }
 };
 
 
--- a/hotspot/src/share/vm/prims/nativeLookup.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/nativeLookup.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -328,6 +328,7 @@
 // native implementation again.
 // See SetNativeMethodPrefix in the JVM TI Spec for more details.
 address NativeLookup::lookup_entry_prefixed(methodHandle method, bool& in_base_library, TRAPS) {
+#if INCLUDE_JVMTI
   ResourceMark rm(THREAD);
 
   int prefix_count;
@@ -358,6 +359,7 @@
       }
     }
   }
+#endif // INCLUDE_JVMTI
   return NULL;
 }
 
--- a/hotspot/src/share/vm/prims/unsafe.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/prims/unsafe.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -802,7 +802,7 @@
     base  = arrayOopDesc::base_offset_in_bytes(T_OBJECT);
     scale = heapOopSize;
   } else if (k->oop_is_typeArray()) {
-    typeArrayKlass* tak = typeArrayKlass::cast(k);
+    TypeArrayKlass* tak = TypeArrayKlass::cast(k);
     base  = tak->array_header_in_bytes();
     assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
     scale = (1 << tak->log2_element_size());
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -156,7 +156,7 @@
 // Called with the queue locked and with at least one element
 CompileTask* AdvancedThresholdPolicy::select_task(CompileQueue* compile_queue) {
   CompileTask *max_task = NULL;
-  Method* max_method;
+  Method* max_method = NULL;
   jlong t = os::javaTimeMillis();
   // Iterate through the queue and find a method with a maximum rate.
   for (CompileTask* task = compile_queue->first(); task != NULL;) {
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1066,7 +1066,7 @@
   }
 }
 
-#ifndef KERNEL
+#if INCLUDE_ALTERNATE_GCS
 static void disable_adaptive_size_policy(const char* collector_name) {
   if (UseAdaptiveSizePolicy) {
     if (FLAG_IS_CMDLINE(UseAdaptiveSizePolicy)) {
@@ -1141,7 +1141,7 @@
     FLAG_SET_ERGO(bool, UseParNewGC, true);
   }
 
-  // Turn off AdaptiveSizePolicy for CMS until it is complete.
+  // Turn off AdaptiveSizePolicy by default for cms until it is complete.
   disable_adaptive_size_policy("UseConcMarkSweepGC");
 
   // In either case, adjust ParallelGCThreads and/or UseParNewGC
@@ -1283,7 +1283,7 @@
     tty->print_cr("ConcGCThreads: %u", ConcGCThreads);
   }
 }
-#endif // KERNEL
+#endif // INCLUDE_ALTERNATE_GCS
 
 void set_object_alignment() {
   // Object alignment.
@@ -1300,10 +1300,10 @@
   // Oop encoding heap max
   OopEncodingHeapMax = (uint64_t(max_juint) + 1) << LogMinObjAlignmentInBytes;
 
-#ifndef KERNEL
+#if INCLUDE_ALTERNATE_GCS
   // Set CMS global values
   CompactibleFreeListSpace::set_cms_values();
-#endif // KERNEL
+#endif // INCLUDE_ALTERNATE_GCS
 }
 
 bool verify_object_alignment() {
@@ -1423,10 +1423,9 @@
     FLAG_SET_DEFAULT(UseCompressedKlassPointers, false);
   } else {
     // Turn on UseCompressedKlassPointers too
-    // The compiler is broken for this so turn it on when the compiler is fixed.
-    // if (FLAG_IS_DEFAULT(UseCompressedKlassPointers)) {
-    //   FLAG_SET_ERGO(bool, UseCompressedKlassPointers, true);
-    // }
+    if (FLAG_IS_DEFAULT(UseCompressedKlassPointers)) {
+      FLAG_SET_ERGO(bool, UseCompressedKlassPointers, true);
+    }
     // Set the ClassMetaspaceSize to something that will not need to be
     // expanded, since it cannot be expanded.
     if (UseCompressedKlassPointers && FLAG_IS_DEFAULT(ClassMetaspaceSize)) {
@@ -1991,9 +1990,15 @@
   }
 #endif // SPARC
 
-  if (PrintNMTStatistics && MemTracker::tracking_level() == MemTracker::NMT_off) {
-    warning("PrintNMTStatistics is disabled, because native memory tracking is not enabled");
-    PrintNMTStatistics = false;
+  if (PrintNMTStatistics) {
+#if INCLUDE_NMT
+    if (MemTracker::tracking_level() == MemTracker::NMT_off) {
+#endif // INCLUDE_NMT
+      warning("PrintNMTStatistics is disabled, because native memory tracking is not enabled");
+      PrintNMTStatistics = false;
+#if INCLUDE_NMT
+    }
+#endif
   }
 
   return status;
@@ -2220,12 +2225,12 @@
           size_t len2 = strlen(pos+1) + 1; // options start after ':'.  Final zero must be copied.
           options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2, mtInternal), pos+1, len2);
         }
-#ifdef JVMTI_KERNEL
+#if !INCLUDE_JVMTI
         if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) {
-          warning("profiling and debugging agents are not supported with Kernel VM");
+          warning("profiling and debugging agents are not supported in this VM");
         } else
-#endif // JVMTI_KERNEL
-        add_init_library(name, options);
+#endif // !INCLUDE_JVMTI
+          add_init_library(name, options);
       }
     // -agentlib and -agentpath
     } else if (match_option(option, "-agentlib:", &tail) ||
@@ -2240,20 +2245,24 @@
         if(pos != NULL) {
           options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1, mtInternal), pos + 1);
         }
-#ifdef JVMTI_KERNEL
+#if !INCLUDE_JVMTI
         if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) {
-          warning("profiling and debugging agents are not supported with Kernel VM");
+          warning("profiling and debugging agents are not supported in this VM");
         } else
-#endif // JVMTI_KERNEL
+#endif // !INCLUDE_JVMTI
         add_init_agent(name, options, is_absolute_path);
 
       }
     // -javaagent
     } else if (match_option(option, "-javaagent:", &tail)) {
+#if !INCLUDE_JVMTI
+      warning("Instrumentation agents are not supported in this VM");
+#else
       if(tail != NULL) {
         char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1, mtInternal), tail);
         add_init_agent("instrument", options, false);
       }
+#endif // !INCLUDE_JVMTI
     // -Xnoclassgc
     } else if (match_option(option, "-Xnoclassgc", &tail)) {
       FLAG_SET_CMDLINE(bool, ClassUnloading, false);
@@ -2385,12 +2394,12 @@
           // EVM option, ignore silently for compatibility
     // -Xprof
     } else if (match_option(option, "-Xprof", &tail)) {
-#ifndef FPROF_KERNEL
+#if INCLUDE_FPROF
       _has_profile = true;
-#else // FPROF_KERNEL
+#else // INCLUDE_FPROF
       // do we have to exit?
-      warning("Kernel VM does not support flat profiling.");
-#endif // FPROF_KERNEL
+      warning("Flat profiling is not supported in this VM.");
+#endif // INCLUDE_FPROF
     // -Xaprof
     } else if (match_option(option, "-Xaprof", &tail)) {
       _has_alloc_profile = true;
@@ -2438,6 +2447,9 @@
 #if defined(KERNEL)
       vm_exit_during_initialization(
           "Dumping a shared archive is not supported on the Kernel JVM.", NULL);
+#elif !INCLUDE_CDS
+      vm_exit_during_initialization(
+          "Dumping a shared archive is not supported in this VM.", NULL);
 #else
       FLAG_SET_CMDLINE(bool, DumpSharedSpaces, true);
       set_mode_flags(_int);     // Prevent compilation, which creates objects
@@ -2490,7 +2502,11 @@
     // JNI hooks
     } else if (match_option(option, "-Xcheck", &tail)) {
       if (!strcmp(tail, ":jni")) {
+#if !INCLUDE_JNI_CHECK
+        warning("JNI CHECKING is not supported in this VM");
+#else
         CheckJNICalls = true;
+#endif // INCLUDE_JNI_CHECK
       } else if (is_bad_option(option, args->ignoreUnrecognized,
                                      "check")) {
         return JNI_EINVAL;
@@ -3045,7 +3061,11 @@
       vm_exit(0);
     }
     if (match_option(option, "-XX:NativeMemoryTracking", &tail)) {
+#if INCLUDE_NMT
       MemTracker::init_tracking_options(tail);
+#else
+      warning("Native Memory Tracking is not supported in this VM");
+#endif
     }
 
 
@@ -3108,6 +3128,21 @@
   UNSUPPORTED_OPTION(UseG1GC, "G1 GC");
 #endif
 
+#if !INCLUDE_ALTERNATE_GCS
+  if (UseParallelGC) {
+    warning("Parallel GC is not supported in this VM.  Using Serial GC.");
+  }
+  if (UseParallelOldGC) {
+    warning("Parallel Old GC is not supported in this VM.  Using Serial GC.");
+  }
+  if (UseConcMarkSweepGC) {
+    warning("Concurrent Mark Sweep GC is not supported in this VM.  Using Serial GC.");
+  }
+  if (UseParNewGC) {
+    warning("Par New GC is not supported in this VM.  Using Serial GC.");
+  }
+#endif // INCLUDE_ALTERNATE_GCS
+
 #ifndef PRODUCT
   if (TraceBytecodesAt != 0) {
     TraceBytecodes = true;
@@ -3156,9 +3191,9 @@
 #ifdef SERIALGC
   force_serial_gc();
 #endif // SERIALGC
-#ifdef KERNEL
+#if !INCLUDE_CDS
   no_shared_spaces();
-#endif // KERNEL
+#endif // INCLUDE_CDS
 
   // Set flags based on ergonomics.
   set_ergonomics_flags();
@@ -3180,9 +3215,10 @@
     }
   }
 
-#ifndef KERNEL
   // Set heap size based on available physical memory
   set_heap_size();
+
+#if INCLUDE_ALTERNATE_GCS
   // Set per-collector flags
   if (UseParallelGC || UseParallelOldGC) {
     set_parallel_gc_flags();
@@ -3193,7 +3229,7 @@
   } else if (UseG1GC) {
     set_g1_gc_flags();
   }
-#endif // KERNEL
+#endif // INCLUDE_ALTERNATE_GCS
 
 #ifdef SERIALGC
   assert(verify_serial_gc_flags(), "SerialGC unset");
--- a/hotspot/src/share/vm/runtime/arguments.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -233,6 +233,7 @@
         return_value = Handle(thread, result);
         assert(Universe::heap()->is_in_or_null(result), "must be heap pointer");
         if (TraceDeoptimization) {
+          ttyLocker ttyl;
           tty->print_cr("SAVED OOP RESULT " INTPTR_FORMAT " in thread " INTPTR_FORMAT, result, thread);
         }
       }
@@ -493,6 +494,7 @@
 
   if (array->frames() > 1) {
     if (VerifyStack && TraceDeoptimization) {
+      ttyLocker ttyl;
       tty->print_cr("Deoptimizing method containing inlining");
     }
   }
@@ -573,6 +575,7 @@
 
 #ifndef PRODUCT
   if (TraceDeoptimization) {
+    ttyLocker ttyl;
     tty->print_cr("DEOPT UNPACKING thread " INTPTR_FORMAT " vframeArray " INTPTR_FORMAT " mode %d", thread, array, exec_mode);
   }
 #endif
@@ -755,12 +758,12 @@
       InstanceKlass* ik = InstanceKlass::cast(k());
       obj = ik->allocate_instance(CHECK_(false));
     } else if (k->oop_is_typeArray()) {
-      typeArrayKlass* ak = typeArrayKlass::cast(k());
+      TypeArrayKlass* ak = TypeArrayKlass::cast(k());
       assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length");
       int len = sv->field_size() / type2size[ak->element_type()];
       obj = ak->allocate(len, CHECK_(false));
     } else if (k->oop_is_objArray()) {
-      objArrayKlass* ak = objArrayKlass::cast(k());
+      ObjArrayKlass* ak = ObjArrayKlass::cast(k());
       obj = ak->allocate(sv->field_size(), CHECK_(false));
     }
 
@@ -923,7 +926,7 @@
       FieldReassigner reassign(fr, reg_map, sv, obj());
       ik->do_nonstatic_fields(&reassign);
     } else if (k->oop_is_typeArray()) {
-      typeArrayKlass* ak = typeArrayKlass::cast(k());
+      TypeArrayKlass* ak = TypeArrayKlass::cast(k());
       reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type());
     } else if (k->oop_is_objArray()) {
       reassign_object_array_elements(fr, reg_map, sv, (objArrayOop) obj());
@@ -1322,9 +1325,9 @@
       if (TraceDeoptimization) {  // make noise on the tty
         tty->print("Uncommon trap occurred in");
         nm->method()->print_short_name(tty);
-        tty->print(" (@" INTPTR_FORMAT ") thread=%d reason=%s action=%s unloaded_class_index=%d",
+        tty->print(" (@" INTPTR_FORMAT ") thread=" UINTX_FORMAT " reason=%s action=%s unloaded_class_index=%d",
                    fr.pc(),
-                   (int) os::current_thread_id(),
+                   os::current_thread_id(),
                    trap_reason_name(reason),
                    trap_action_name(action),
                    unloaded_class_index);
--- a/hotspot/src/share/vm/runtime/dtraceJSDT.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/dtraceJSDT.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/fprofiler.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/fprofiler.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -65,15 +65,15 @@
   // For now, the only thread-specific region is the class loader.
   enum Region { noRegion, classLoaderRegion, extraRegion, maxRegion };
 
-  ThreadProfilerMark(Region)  KERNEL_RETURN;
-  ~ThreadProfilerMark()       KERNEL_RETURN;
+  ThreadProfilerMark(Region)  NOT_FPROF_RETURN;
+  ~ThreadProfilerMark()       NOT_FPROF_RETURN;
 
 private:
   ThreadProfiler* _pp;
   Region _r;
 };
 
-#ifndef FPROF_KERNEL
+#if INCLUDE_FPROF
 
 class IntervalData VALUE_OBJ_CLASS_SPEC {
   // Just to keep these things all together
@@ -119,29 +119,29 @@
   static void print_header(outputStream* st);
   void print_data(outputStream* st);
 };
-#endif // FPROF_KERNEL
+#endif // INCLUDE_FPROF
 
 class ThreadProfiler: public CHeapObj<mtInternal> {
 public:
-  ThreadProfiler()    KERNEL_RETURN;
-  ~ThreadProfiler()   KERNEL_RETURN;
+  ThreadProfiler()    NOT_FPROF_RETURN;
+  ~ThreadProfiler()   NOT_FPROF_RETURN;
 
   // Resets the profiler
-  void reset()        KERNEL_RETURN;
+  void reset()        NOT_FPROF_RETURN;
 
   // Activates the profiler for a certain thread
-  void engage()       KERNEL_RETURN;
+  void engage()       NOT_FPROF_RETURN;
 
   // Deactivates the profiler
-  void disengage()    KERNEL_RETURN;
+  void disengage()    NOT_FPROF_RETURN;
 
   // Prints the collected profiling information
-  void print(const char* thread_name) KERNEL_RETURN;
+  void print(const char* thread_name) NOT_FPROF_RETURN;
 
   // Garbage Collection Support
-  void oops_do(OopClosure* f)         KERNEL_RETURN;
+  void oops_do(OopClosure* f)         NOT_FPROF_RETURN;
 
-#ifndef FPROF_KERNEL
+#if INCLUDE_FPROF
 private:
   // for recording ticks.
   friend class ProfilerNode;
@@ -225,39 +225,39 @@
   IntervalData* interval_data_ref() {
     return &_interval_data;
   }
-#endif // FPROF_KERNEL
+#endif // INCLUDE_FPROF
 };
 
 class FlatProfiler: AllStatic {
 public:
-  static void reset() KERNEL_RETURN ;
-  static void engage(JavaThread* mainThread, bool fullProfile) KERNEL_RETURN ;
-  static void disengage() KERNEL_RETURN ;
-  static void print(int unused) KERNEL_RETURN ;
-  static bool is_active() KERNEL_RETURN_(false) ;
+  static void reset() NOT_FPROF_RETURN ;
+  static void engage(JavaThread* mainThread, bool fullProfile) NOT_FPROF_RETURN ;
+  static void disengage() NOT_FPROF_RETURN ;
+  static void print(int unused) NOT_FPROF_RETURN ;
+  static bool is_active() NOT_FPROF_RETURN_(false) ;
 
   // This is NULL if each thread has its own thread profiler,
   // else this is the single thread profiler used by all threads.
   // In particular it makes a difference during garbage collection,
   // where you only want to traverse each thread profiler once.
-  static ThreadProfiler* get_thread_profiler() KERNEL_RETURN_(NULL);
+  static ThreadProfiler* get_thread_profiler() NOT_FPROF_RETURN_(NULL);
 
   // Garbage Collection Support
-  static void oops_do(OopClosure* f) KERNEL_RETURN ;
+  static void oops_do(OopClosure* f) NOT_FPROF_RETURN ;
 
   // Support for disassembler to inspect the PCRecorder
 
   // Returns the start address for a given pc
   // NULL is returned if the PCRecorder is inactive
-  static address bucket_start_for(address pc) KERNEL_RETURN_(NULL);
+  static address bucket_start_for(address pc) NOT_FPROF_RETURN_(NULL);
 
   enum { MillisecsPerTick = 10 };   // ms per profiling ticks
 
   // Returns the number of ticks recorded for the bucket
   // pc belongs to.
-  static int bucket_count_for(address pc) KERNEL_RETURN_(0);
+  static int bucket_count_for(address pc) NOT_FPROF_RETURN_(0);
 
-#ifndef FPROF_KERNEL
+#if INCLUDE_FPROF
 
  private:
   static bool full_profile() {
@@ -324,7 +324,7 @@
   static void interval_reset();       // reset interval data.
   enum {interval_print_size = 10};
   static IntervalData* interval_data;
-#endif // FPROF_KERNEL
+#endif // INCLUDE_FPROF
 };
 
 #endif // SHARE_VM_RUNTIME_FPROFILER_HPP
--- a/hotspot/src/share/vm/runtime/globals.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1000,9 +1000,6 @@
   product(bool, ClassUnloading, true,                                       \
           "Do unloading of classes")                                        \
                                                                             \
-  diagnostic(bool, LinkWellKnownClasses, false,                             \
-          "Resolve a well known class as soon as its name is seen")         \
-                                                                            \
   develop(bool, DisableStartThread, false,                                  \
           "Disable starting of additional Java threads "                    \
           "(for debugging only)")                                           \
@@ -1066,9 +1063,6 @@
                                                                             \
   product(bool, MonitorInUseLists, false, "Track Monitors for Deflation")   \
                                                                             \
-  product(intx, Atomics, 0,                                                 \
-          "(Unsafe,Unstable) Diagnostic - Controls emission of atomics")    \
-                                                                            \
   product(intx, SyncFlags, 0, "(Unsafe,Unstable) Experimental Sync flags" ) \
                                                                             \
   product(intx, SyncVerbose, 0, "(Unstable)" )                              \
@@ -2332,7 +2326,7 @@
   develop(bool, CITimeEach, false,                                          \
           "display timing information after each successful compilation")   \
                                                                             \
-  develop(bool, CICountOSR, true,                                           \
+  develop(bool, CICountOSR, false,                                          \
           "use a separate counter when assigning ids to osr compilations")  \
                                                                             \
   develop(bool, CICompileNatives, true,                                     \
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -94,9 +94,9 @@
 typedef enum {
  RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_EXPERIMENTAL_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER, RUNTIME_LP64_PRODUCT_FLAG_MEMBER)
  RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER)
-#ifndef KERNEL
+#if INCLUDE_ALTERNATE_GCS
  G1_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_EXPERIMENTAL_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER)
-#endif
+#endif // INCLUDE_ALTERNATE_GCS
 #ifdef COMPILER1
  C1_FLAGS(C1_DEVELOP_FLAG_MEMBER, C1_PD_DEVELOP_FLAG_MEMBER, C1_PRODUCT_FLAG_MEMBER, C1_PD_PRODUCT_FLAG_MEMBER, C1_NOTPRODUCT_FLAG_MEMBER)
 #endif
@@ -187,7 +187,7 @@
                   RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
                   RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
                   RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE)
-#ifndef KERNEL
+#if INCLUDE_ALTERNATE_GCS
  G1_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
@@ -197,7 +197,7 @@
           RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE)
-#endif // KERNEL
+#endif // INCLUDE_ALTERNATE_GCS
 #ifdef COMPILER1
  C1_FLAGS(C1_DEVELOP_FLAG_MEMBER_WITH_TYPE,
           C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE,
--- a/hotspot/src/share/vm/runtime/init.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/init.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -114,9 +114,9 @@
   universe2_init();  // dependent on codeCache_init and stubRoutines_init1
   referenceProcessor_init();
   jni_handles_init();
-#ifndef VM_STRUCTS_KERNEL
+#if INCLUDE_VM_STRUCTS
   vmStructs_init();
-#endif // VM_STRUCTS_KERNEL
+#endif // INCLUDE_VM_STRUCTS
 
   vtableStubs_init();
   InlineCacheBuffer_init();
--- a/hotspot/src/share/vm/runtime/interfaceSupport.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/interfaceSupport.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/java.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/java.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/monitorChunk.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/monitorChunk.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/monitorChunk.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/monitorChunk.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/mutex.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/mutex.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/runtime/park.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/park.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/perfData.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/perfData.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -588,6 +588,10 @@
 
 PerfData* PerfDataList::find_by_name(const char* name) {
 
+  // if add_item hasn't been called the list won't be initialized
+  if (this == NULL)
+    return NULL;
+
   int i = _set->find((void*)name, PerfDataList::by_name);
 
   if (i >= 0 && i <= _set->length())
--- a/hotspot/src/share/vm/runtime/perfMemory.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/perfMemory.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -212,7 +212,7 @@
     return T_OBJECT;
   } else {
     assert(a->is_typeArray(), "just checking");
-    BasicType type = typeArrayKlass::cast(a->klass())->element_type();
+    BasicType type = TypeArrayKlass::cast(a->klass())->element_type();
     switch (type) {
       case T_BOOLEAN:
         value->z = typeArrayOop(a)->bool_at(index);
@@ -254,7 +254,7 @@
     if (value_type == T_OBJECT) {
       oop obj = (oop) value->l;
       if (obj != NULL) {
-        Klass* element_klass = objArrayKlass::cast(a->klass())->element_klass();
+        Klass* element_klass = ObjArrayKlass::cast(a->klass())->element_klass();
         if (!obj->is_a(element_klass)) {
           THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "array element type mismatch");
         }
@@ -263,7 +263,7 @@
     }
   } else {
     assert(a->is_typeArray(), "just checking");
-    BasicType array_type = typeArrayKlass::cast(a->klass())->element_type();
+    BasicType array_type = TypeArrayKlass::cast(a->klass())->element_type();
     if (array_type != value_type) {
       // The widen operation can potentially throw an exception, but cannot block,
       // so typeArrayOop a is safe if the call succeeds.
@@ -313,7 +313,7 @@
 
 
 oop Reflection:: basic_type_arrayklass_to_mirror(Klass* basic_type_arrayklass, TRAPS) {
-  BasicType type = typeArrayKlass::cast(basic_type_arrayklass)->element_type();
+  BasicType type = TypeArrayKlass::cast(basic_type_arrayklass)->element_type();
   return Universe::java_mirror(type);
 }
 
@@ -327,10 +327,10 @@
   }
   if (java_lang_Class::is_primitive(element_mirror)) {
     Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
-    return typeArrayKlass::cast(tak)->allocate(length, THREAD);
+    return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
   } else {
     Klass* k = java_lang_Class::as_Klass(element_mirror);
-    if (Klass::cast(k)->oop_is_array() && arrayKlass::cast(k)->dimension() >= MAX_DIM) {
+    if (Klass::cast(k)->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
       THROW_0(vmSymbols::java_lang_IllegalArgumentException());
     }
     return oopFactory::new_objArray(k, length, THREAD);
@@ -340,7 +340,7 @@
 
 arrayOop Reflection::reflect_new_multi_array(oop element_mirror, typeArrayOop dim_array, TRAPS) {
   assert(dim_array->is_typeArray(), "just checking");
-  assert(typeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
+  assert(TypeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
 
   if (element_mirror == NULL) {
     THROW_0(vmSymbols::java_lang_NullPointerException());
@@ -367,7 +367,7 @@
   } else {
     klass = java_lang_Class::as_Klass(element_mirror);
     if (Klass::cast(klass)->oop_is_array()) {
-      int k_dim = arrayKlass::cast(klass)->dimension();
+      int k_dim = ArrayKlass::cast(klass)->dimension();
       if (k_dim + len > MAX_DIM) {
         THROW_0(vmSymbols::java_lang_IllegalArgumentException());
       }
@@ -375,7 +375,7 @@
     }
   }
   klass = Klass::cast(klass)->array_klass(dim, CHECK_NULL);
-  oop obj = arrayKlass::cast(klass)->multi_allocate(len, dimensions, THREAD);
+  oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, THREAD);
   assert(obj->is_array(), "just checking");
   return arrayOop(obj);
 }
@@ -391,17 +391,17 @@
     return NULL;
   }
 
-  oop result = arrayKlass::cast(klass)->component_mirror();
+  oop result = ArrayKlass::cast(klass)->component_mirror();
 #ifdef ASSERT
   oop result2 = NULL;
-  if (arrayKlass::cast(klass)->dimension() == 1) {
+  if (ArrayKlass::cast(klass)->dimension() == 1) {
     if (Klass::cast(klass)->oop_is_typeArray()) {
       result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL);
     } else {
-      result2 = Klass::cast(objArrayKlass::cast(klass)->element_klass())->java_mirror();
+      result2 = Klass::cast(ObjArrayKlass::cast(klass)->element_klass())->java_mirror();
     }
   } else {
-    Klass* lower_dim = arrayKlass::cast(klass)->lower_dimension();
+    Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension();
     assert(Klass::cast(lower_dim)->oop_is_array(), "just checking");
     result2 = Klass::cast(lower_dim)->java_mirror();
   }
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -2705,7 +2705,7 @@
   int          jlsLen    = java_lang_String::length(src);
   jchar*       jlsPos    = (jlsLen == 0) ? NULL :
                                            jlsValue->char_at_addr(jlsOffset);
-  assert(typeArrayKlass::cast(jlsValue->klass())->element_type() == T_CHAR, "compressed string");
+  assert(TypeArrayKlass::cast(jlsValue->klass())->element_type() == T_CHAR, "compressed string");
   (void) UNICODE::as_utf8(jlsPos, jlsLen, (char *)dst, max_dtrace_string_size);
 }
 #endif // ndef HAVE_DTRACE_H
--- a/hotspot/src/share/vm/runtime/stubCodeGenerator.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/stubCodeGenerator.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -421,6 +421,7 @@
   case T_ARRAY:
   case T_OBJECT:
   case T_NARROWOOP:
+  case T_NARROWKLASS:
   case T_ADDRESS:
     // Currently unsupported
     return NULL;
--- a/hotspot/src/share/vm/runtime/task.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/task.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/thread.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -321,12 +321,14 @@
   // set up any platform-specific state.
   os::initialize_thread(this);
 
+#if INCLUDE_NMT
    // record thread's native stack, stack grows downward
   if (MemTracker::is_on()) {
     address stack_low_addr = stack_base() - stack_size();
     MemTracker::record_thread_stack(stack_low_addr, stack_size(), this,
       CURRENT_PC);
   }
+#endif // INCLUDE_NMT
 }
 
 
@@ -338,10 +340,12 @@
   // record_stack_base_and_size called. Although, we would like to ensure
   // that all started threads do call record_stack_base_and_size(), there is
   // not proper way to enforce that.
+#if INCLUDE_NMT
   if (_stack_base != NULL) {
     address low_stack_addr = stack_base() - stack_size();
     MemTracker::release_thread_stack(low_stack_addr, stack_size(), this);
   }
+#endif // INCLUDE_NMT
 
   // deallocate data structures
   delete resource_area();
@@ -1357,7 +1361,9 @@
   set_monitor_chunks(NULL);
   set_next(NULL);
   set_thread_state(_thread_new);
+#if INCLUDE_NMT
   set_recorder(NULL);
+#endif
   _terminated = _not_terminated;
   _privileged_stack_top = NULL;
   _array_for_gc = NULL;
@@ -2583,6 +2589,12 @@
   StackFrameStream fst(this, UseBiasedLocking);
   for(; !fst.is_done(); fst.next()) {
     if (fst.current()->should_be_deoptimized()) {
+      if (LogCompilation && xtty != NULL) {
+        nmethod* nm = fst.current()->cb()->as_nmethod_or_null();
+        xtty->elem("deoptimized thread='" UINTX_FORMAT "' compile_id='%d'",
+                   this->name(), nm != NULL ? nm->compile_id() : -1);
+      }
+
       Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
     }
   }
@@ -3523,7 +3535,9 @@
 #endif /* USDT2 */
 
   // record VM initialization completion time
+#if INCLUDE_MANAGEMENT
   Management::record_vm_init_completed();
+#endif // INCLUDE_MANAGEMENT
 
   // Compute system loader. Note that this has to occur after set_init_completed, since
   // valid exceptions may be thrown in the process.
@@ -3584,9 +3598,14 @@
   }
 
   // initialize compiler(s)
+#if defined(COMPILER1) || defined(COMPILER2)
   CompileBroker::compilation_init();
-
+#endif
+
+#if INCLUDE_MANAGEMENT
   Management::initialize(THREAD);
+#endif // INCLUDE_MANAGEMENT
+
   if (HAS_PENDING_EXCEPTION) {
     // management agent fails to start possibly due to
     // configuration problem and is responsible for printing
@@ -3756,6 +3775,7 @@
   AgentLibrary* agent;
 
   JvmtiExport::enter_onload_phase();
+
   for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
     OnLoadEntry_t  on_load_entry = lookup_agent_on_load(agent);
 
--- a/hotspot/src/share/vm/runtime/thread.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/thread.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -41,7 +41,11 @@
 #include "runtime/stubRoutines.hpp"
 #include "runtime/threadLocalStorage.hpp"
 #include "runtime/unhandledOops.hpp"
+
+#if INCLUDE_NMT
 #include "services/memRecorder.hpp"
+#endif // INCLUDE_NMT
+
 #include "trace/tracing.hpp"
 #include "utilities/exceptions.hpp"
 #include "utilities/top.hpp"
@@ -1038,6 +1042,7 @@
   bool do_not_unlock_if_synchronized()             { return _do_not_unlock_if_synchronized; }
   void set_do_not_unlock_if_synchronized(bool val) { _do_not_unlock_if_synchronized = val; }
 
+#if INCLUDE_NMT
   // native memory tracking
   inline MemRecorder* get_recorder() const          { return (MemRecorder*)_recorder; }
   inline void         set_recorder(MemRecorder* rc) { _recorder = (volatile MemRecorder*)rc; }
@@ -1045,6 +1050,7 @@
  private:
   // per-thread memory recorder
   volatile MemRecorder* _recorder;
+#endif // INCLUDE_NMT
 
   // Suspend/resume support for JavaThread
  private:
--- a/hotspot/src/share/vm/runtime/timer.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/timer.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -230,6 +230,15 @@
   return x;
 }
 
+#if INCLUDE_JVMTI
+  #define JVMTI_STRUCTS(static_field) \
+    static_field(JvmtiExport,                     _can_access_local_variables,                  bool)                                  \
+    static_field(JvmtiExport,                     _can_hotswap_or_post_breakpoint,              bool)                                  \
+    static_field(JvmtiExport,                     _can_post_on_exceptions,                      bool)                                  \
+    static_field(JvmtiExport,                     _can_walk_any_space,                          bool)
+#else
+  #define JVMTI_STRUCTS(static_field)
+#endif // INCLUDE_JVMTI
 
 typedef HashtableEntry<intptr_t, mtInternal>  IntptrHashtableEntry;
 typedef Hashtable<intptr_t, mtInternal>       IntptrHashtable;
@@ -268,12 +277,12 @@
   volatile_nonstatic_field(oopDesc,            _metadata._klass,                              Klass*)                                \
   volatile_nonstatic_field(oopDesc,            _metadata._compressed_klass,                   narrowOop)                             \
      static_field(oopDesc,                     _bs,                                           BarrierSet*)                           \
-  nonstatic_field(arrayKlass,                  _dimension,                                    int)                                   \
-  volatile_nonstatic_field(arrayKlass,         _higher_dimension,                             Klass*)                                \
-  volatile_nonstatic_field(arrayKlass,         _lower_dimension,                              Klass*)                                \
-  nonstatic_field(arrayKlass,                  _vtable_len,                                   int)                                   \
-  nonstatic_field(arrayKlass,                  _alloc_size,                                   juint)                                 \
-  nonstatic_field(arrayKlass,                  _component_mirror,                             oop)                                   \
+  nonstatic_field(ArrayKlass,                  _dimension,                                    int)                                   \
+  volatile_nonstatic_field(ArrayKlass,         _higher_dimension,                             Klass*)                                \
+  volatile_nonstatic_field(ArrayKlass,         _lower_dimension,                              Klass*)                                \
+  nonstatic_field(ArrayKlass,                  _vtable_len,                                   int)                                   \
+  nonstatic_field(ArrayKlass,                  _alloc_size,                                   juint)                                 \
+  nonstatic_field(ArrayKlass,                  _component_mirror,                             oop)                                   \
   nonstatic_field(CompiledICHolder,     _holder_method,                                Method*)                        \
   nonstatic_field(CompiledICHolder,     _holder_klass,                                 Klass*)                                \
   nonstatic_field(ConstantPool,         _tags,                                         Array<u1>*)                            \
@@ -379,13 +388,13 @@
   nonstatic_field(ConstMethod,          _signature_index,                              u2)                                    \
   nonstatic_field(ConstMethod,          _method_idnum,                                 u2)                                    \
   nonstatic_field(ConstMethod,          _generic_signature_index,                      u2)                                    \
-  nonstatic_field(objArrayKlass,               _element_klass,                                Klass*)                                \
-  nonstatic_field(objArrayKlass,               _bottom_klass,                                 Klass*)                                \
+  nonstatic_field(ObjArrayKlass,               _element_klass,                                Klass*)                                \
+  nonstatic_field(ObjArrayKlass,               _bottom_klass,                                 Klass*)                                \
   volatile_nonstatic_field(Symbol,             _refcount,                                     int)                                   \
   nonstatic_field(Symbol,                      _identity_hash,                                int)                                   \
   nonstatic_field(Symbol,                      _length,                                       unsigned short)                        \
   unchecked_nonstatic_field(Symbol,            _body,                                         sizeof(jbyte)) /* NOTE: no type */     \
-  nonstatic_field(typeArrayKlass,              _max_length,                                   int)                                   \
+  nonstatic_field(TypeArrayKlass,              _max_length,                                   int)                                   \
                                                                                                                                      \
   /***********************/                                                                                                          \
   /* Constant Pool Cache */                                                                                                          \
@@ -454,6 +463,8 @@
      static_field(Universe,                    _narrow_oop._base,                             address)                               \
      static_field(Universe,                    _narrow_oop._shift,                            int)                                   \
      static_field(Universe,                    _narrow_oop._use_implicit_null_checks,         bool)                                  \
+     static_field(Universe,                    _narrow_klass._base,                           address)                               \
+     static_field(Universe,                    _narrow_klass._shift,                          int)                                   \
                                                                                                                                      \
   /**********************************************************************************/                                               \
   /* Generation and Space hierarchies                                               */                                               \
@@ -1170,10 +1181,7 @@
   /* JVMTI */                                                                                                                        \
   /*************************/                                                                                                        \
                                                                                                                                      \
-  static_field(JvmtiExport,                     _can_access_local_variables,                  bool)                                  \
-  static_field(JvmtiExport,                     _can_hotswap_or_post_breakpoint,              bool)                                  \
-  static_field(JvmtiExport,                     _can_post_on_exceptions,                      bool)                                  \
-  static_field(JvmtiExport,                     _can_walk_any_space,                          bool)                                  \
+  JVMTI_STRUCTS(static_field)                                                                                                        \
                                                                                                                                      \
   /*************/                                                                                                                    \
   /* Arguments */                                                                                                                    \
@@ -1370,9 +1378,9 @@
   declare_toplevel_type(MetaspaceObj)                                     \
     declare_type(Metadata, MetaspaceObj)                                  \
     declare_type(Klass, Metadata)                                         \
-           declare_type(arrayKlass, Klass)                                \
-           declare_type(objArrayKlass, arrayKlass)                        \
-           declare_type(typeArrayKlass, arrayKlass)                       \
+           declare_type(ArrayKlass, Klass)                                \
+           declare_type(ObjArrayKlass, ArrayKlass)                        \
+           declare_type(TypeArrayKlass, ArrayKlass)                       \
       declare_type(InstanceKlass, Klass)                                  \
         declare_type(InstanceClassLoaderKlass, InstanceKlass)             \
         declare_type(InstanceMirrorKlass, InstanceKlass)                  \
@@ -1727,6 +1735,8 @@
   declare_c2_type(CMoveNNode, CMoveNode)                                  \
   declare_c2_type(EncodePNode, TypeNode)                                  \
   declare_c2_type(DecodeNNode, TypeNode)                                  \
+  declare_c2_type(EncodePKlassNode, TypeNode)                             \
+  declare_c2_type(DecodeNKlassNode, TypeNode)                             \
   declare_c2_type(ConstraintCastNode, TypeNode)                           \
   declare_c2_type(CastIINode, ConstraintCastNode)                         \
   declare_c2_type(CastPPNode, ConstraintCastNode)                         \
@@ -1823,6 +1833,7 @@
   declare_c2_type(StoreDNode, StoreNode)                                  \
   declare_c2_type(StorePNode, StoreNode)                                  \
   declare_c2_type(StoreNNode, StoreNode)                                  \
+  declare_c2_type(StoreNKlassNode, StoreNode)                             \
   declare_c2_type(StoreCMNode, StoreNode)                                 \
   declare_c2_type(LoadPLockedNode, LoadPNode)                             \
   declare_c2_type(SCMemProjNode, ProjNode)                                \
--- a/hotspot/src/share/vm/runtime/vmThread.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/vmThread.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/runtime/vm_version.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/vm_version.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -110,24 +110,26 @@
   #define VMLP ""
 #endif
 
-#ifdef KERNEL
-  #define VMTYPE "Kernel"
-#else // KERNEL
-#ifdef TIERED
-  #define VMTYPE "Server"
-#else // TIERED
-#ifdef ZERO
-#ifdef SHARK
-  #define VMTYPE "Shark"
-#else // SHARK
-  #define VMTYPE "Zero"
-#endif // SHARK
-#else // ZERO
-   #define VMTYPE COMPILER1_PRESENT("Client")   \
-                  COMPILER2_PRESENT("Server")
-#endif // ZERO
-#endif // TIERED
-#endif // KERNEL
+#ifndef VMTYPE
+  #ifdef KERNEL
+    #define VMTYPE "Kernel"
+  #else // KERNEL
+  #ifdef TIERED
+    #define VMTYPE "Server"
+  #else // TIERED
+  #ifdef ZERO
+  #ifdef SHARK
+    #define VMTYPE "Shark"
+  #else // SHARK
+    #define VMTYPE "Zero"
+  #endif // SHARK
+  #else // ZERO
+     #define VMTYPE COMPILER1_PRESENT("Client")   \
+                    COMPILER2_PRESENT("Server")
+  #endif // ZERO
+  #endif // TIERED
+  #endif // KERNEL
+#endif
 
 #ifndef HOTSPOT_VM_DISTRO
   #error HOTSPOT_VM_DISTRO must be defined
--- a/hotspot/src/share/vm/runtime/vm_version.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/runtime/vm_version.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/services/attachListener.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/attachListener.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -88,7 +88,7 @@
   // The result should be a [B
   oop res = (oop)result.get_jobject();
   assert(res->is_typeArray(), "just checking");
-  assert(typeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
+  assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
 
   // copy the bytes to the output stream
   typeArrayOop ba = typeArrayOop(res);
--- a/hotspot/src/share/vm/services/attachListener.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/attachListener.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
@@ -52,21 +52,21 @@
 
 class AttachListener: AllStatic {
  public:
-  static void init()  KERNEL_RETURN;
-  static void abort() KERNEL_RETURN;
+  static void init()  NOT_SERVICES_RETURN;
+  static void abort() NOT_SERVICES_RETURN;
 
   // invoke to perform clean-up tasks when all clients detach
-  static void detachall() KERNEL_RETURN;
+  static void detachall() NOT_SERVICES_RETURN;
 
   // indicates if the Attach Listener needs to be created at startup
-  static bool init_at_startup() KERNEL_RETURN_(false);
+  static bool init_at_startup() NOT_SERVICES_RETURN_(false);
 
   // indicates if we have a trigger to start the Attach Listener
-  static bool is_init_trigger() KERNEL_RETURN_(false);
+  static bool is_init_trigger() NOT_SERVICES_RETURN_(false);
 
-#ifdef SERVICES_KERNEL
+#if !INCLUDE_SERVICES
   static bool is_attach_supported()             { return false; }
-#else // SERVICES_KERNEL
+#else
  private:
   static volatile bool _initialized;
 
@@ -94,10 +94,10 @@
 
   // dequeue the next operation
   static AttachOperation* dequeue();
-#endif // SERVICES_KERNEL
+#endif // !INCLUDE_SERVICES
 };
 
-#ifndef SERVICES_KERNEL
+#if INCLUDE_SERVICES
 class AttachOperation: public CHeapObj<mtInternal> {
  public:
   enum {
@@ -151,6 +151,6 @@
   // complete operation by sending result code and any result data to the client
   virtual void complete(jint result, bufferedStream* result_stream) = 0;
 };
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
 
 #endif // SHARE_VM_SERVICES_ATTACHLISTENER_HPP
--- a/hotspot/src/share/vm/services/classLoadingService.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/classLoadingService.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -78,6 +78,7 @@
 
 #endif
 
+#if INCLUDE_MANAGEMENT
 // counters for classes loaded from class files
 PerfCounter*    ClassLoadingService::_classes_loaded_count = NULL;
 PerfCounter*    ClassLoadingService::_classes_unloaded_count = NULL;
@@ -239,3 +240,5 @@
   // FIXME: Exclude array klasses for now
   // Universe::basic_type_classes_do(&add_loaded_class);
 }
+
+#endif // INCLUDE_MANAGEMENT
--- a/hotspot/src/share/vm/services/classLoadingService.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/classLoadingService.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2010, 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
@@ -55,7 +55,7 @@
 
   static bool get_verbose() { return TraceClassLoading; }
   static bool set_verbose(bool verbose);
-  static void reset_trace_class_unloading();
+  static void reset_trace_class_unloading() NOT_MANAGEMENT_RETURN;
 
   static jlong loaded_class_count() {
     return _classes_loaded_count->get_value() + _shared_classes_loaded_count->get_value();
@@ -102,13 +102,16 @@
     return (UsePerfData ? _class_methods_size->get_value() : -1);
   }
 
-  static void notify_class_loaded(InstanceKlass* k, bool shared_class);
+  static void notify_class_loaded(InstanceKlass* k, bool shared_class)
+      NOT_MANAGEMENT_RETURN;
   // All unloaded classes are non-shared
-  static void notify_class_unloaded(InstanceKlass* k);
+  static void notify_class_unloaded(InstanceKlass* k) NOT_MANAGEMENT_RETURN;
   static void add_class_method_size(int size) {
+#if INCLUDE_MANAGEMENT
     if (UsePerfData) {
       _class_methods_size->inc(size);
     }
+#endif // INCLUDE_MANAGEMENT
   }
 };
 
--- a/hotspot/src/share/vm/services/diagnosticCommand.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -43,9 +43,9 @@
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<VMUptimeDCmd>(true, false));
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<SystemGCDCmd>(true, false));
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<RunFinalizationDCmd>(true, false));
-#ifndef SERVICES_KERNEL   // Heap dumping not supported
+#if INCLUDE_SERVICES // Heap dumping supported
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<HeapDumpDCmd>(true, false));
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassHistogramDCmd>(true, false));
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ThreadDumpDCmd>(true, false));
 
@@ -204,7 +204,7 @@
   // The result should be a [B
   oop res = (oop)result.get_jobject();
   assert(res->is_typeArray(), "just checking");
-  assert(typeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
+  assert(TypeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
 
   // copy the bytes to the output stream
   typeArrayOop ba = typeArrayOop(res);
@@ -252,7 +252,7 @@
                          vmSymbols::void_method_signature(), CHECK);
 }
 
-#ifndef SERVICES_KERNEL   // Heap dumping not supported
+#if INCLUDE_SERVICES // Heap dumping supported
 HeapDumpDCmd::HeapDumpDCmd(outputStream* output, bool heap) :
                            DCmdWithParser(output, heap),
   _filename("filename","Name of the dump file", "STRING",true),
@@ -292,7 +292,7 @@
     return 0;
   }
 }
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
 
 ClassHistogramDCmd::ClassHistogramDCmd(outputStream* output, bool heap) :
                                        DCmdWithParser(output, heap),
--- a/hotspot/src/share/vm/services/diagnosticCommand.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/diagnosticCommand.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -155,7 +155,7 @@
     virtual void execute(TRAPS);
 };
 
-#ifndef SERVICES_KERNEL   // Heap dumping not supported
+#if INCLUDE_SERVICES   // Heap dumping supported
 // See also: dump_heap in attachListener.cpp
 class HeapDumpDCmd : public DCmdWithParser {
 protected:
@@ -176,7 +176,7 @@
   static int num_arguments();
   virtual void execute(TRAPS);
 };
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
 
 // See also: inspeactheap in attachListener.cpp
 class ClassHistogramDCmd : public DCmdWithParser {
--- a/hotspot/src/share/vm/services/g1MemoryPool.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/g1MemoryPool.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2012, 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
--- a/hotspot/src/share/vm/services/g1MemoryPool.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/g1MemoryPool.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2012, 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
--- a/hotspot/src/share/vm/services/heapDumper.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/heapDumper.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -933,7 +933,7 @@
   k = klass->array_klass_or_null();
   while (k != NULL) {
     Klass* klass = Klass::cast(k);
-    assert(klass->oop_is_objArray(), "not an objArrayKlass");
+    assert(klass->oop_is_objArray(), "not an ObjArrayKlass");
 
     writer->write_u1(HPROF_GC_CLASS_DUMP);
     writer->write_classID(klass);
@@ -1016,7 +1016,7 @@
 
 // creates HPROF_GC_PRIM_ARRAY_DUMP record for the given type array
 void DumperSupport::dump_prim_array(DumpWriter* writer, typeArrayOop array) {
-  BasicType type = typeArrayKlass::cast(array->klass())->element_type();
+  BasicType type = TypeArrayKlass::cast(array->klass())->element_type();
 
   writer->write_u1(HPROF_GC_PRIM_ARRAY_DUMP);
   writer->write_objectID(array);
--- a/hotspot/src/share/vm/services/heapDumper.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/heapDumper.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -76,9 +76,9 @@
   // returns error message (resource allocated), or NULL if no error
   char* error_as_C_string() const;
 
-  static void dump_heap()    KERNEL_RETURN;
+  static void dump_heap()    NOT_SERVICES_RETURN;
 
-  static void dump_heap_from_oome()    KERNEL_RETURN;
+  static void dump_heap_from_oome()    NOT_SERVICES_RETURN;
 };
 
 #endif // SHARE_VM_SERVICES_HEAPDUMPER_HPP
--- a/hotspot/src/share/vm/services/lowMemoryDetector.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/lowMemoryDetector.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/services/management.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/management.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -72,12 +72,22 @@
 TimeStamp Management::_stamp;
 
 void management_init() {
+#if INCLUDE_MANAGEMENT
   Management::init();
   ThreadService::init();
   RuntimeService::init();
   ClassLoadingService::init();
+#else
+  ThreadService::init();
+  // Make sure the VM version is initialized
+  // This is normally called by RuntimeService::init().
+  // Since that is conditionalized out, we need to call it here.
+  Abstract_VM_Version::initialize();
+#endif // INCLUDE_MANAGEMENT
 }
 
+#if INCLUDE_MANAGEMENT
+
 void Management::init() {
   EXCEPTION_MARK;
 
@@ -112,10 +122,10 @@
 
   _optional_support.isBootClassPathSupported = 1;
   _optional_support.isObjectMonitorUsageSupported = 1;
-#ifndef SERVICES_KERNEL
+#if INCLUDE_SERVICES
   // This depends on the heap inspector
   _optional_support.isSynchronizerUsageSupported = 1;
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
   _optional_support.isThreadAllocatedMemorySupported = 1;
 
   // Registration of the diagnostic commands
@@ -426,7 +436,7 @@
 static void validate_thread_info_array(objArrayHandle infoArray_h, TRAPS) {
   // check if the element of infoArray is of type ThreadInfo class
   Klass* threadinfo_klass = Management::java_lang_management_ThreadInfo_klass(CHECK);
-  Klass* element_klass = objArrayKlass::cast(infoArray_h->klass())->element_klass();
+  Klass* element_klass = ObjArrayKlass::cast(infoArray_h->klass())->element_klass();
   if (element_klass != threadinfo_klass) {
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
               "infoArray element type is not ThreadInfo class");
@@ -1715,7 +1725,7 @@
     objArrayOop ta = objArrayOop(JNIHandles::resolve_non_null(names));
     objArrayHandle names_ah(THREAD, ta);
     // Make sure we have a String array
-    Klass* element_klass = objArrayKlass::cast(names_ah->klass())->element_klass();
+    Klass* element_klass = ObjArrayKlass::cast(names_ah->klass())->element_klass();
     if (element_klass != SystemDictionary::String_klass()) {
       THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
                  "Array element type is not String class", 0);
@@ -1891,7 +1901,7 @@
   objArrayHandle names_ah(THREAD, na);
 
   // Make sure we have a String array
-  Klass* element_klass = objArrayKlass::cast(names_ah->klass())->element_klass();
+  Klass* element_klass = ObjArrayKlass::cast(names_ah->klass())->element_klass();
   if (element_klass != SystemDictionary::String_klass()) {
     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
                "Array element type is not String class", 0);
@@ -2008,7 +2018,7 @@
 
   // check if the element of array is of type MemoryUsage class
   Klass* usage_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_0);
-  Klass* element_klass = objArrayKlass::cast(array_h->klass())->element_klass();
+  Klass* element_klass = ObjArrayKlass::cast(array_h->klass())->element_klass();
   if (element_klass != usage_klass) {
     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
                "The element type is not MemoryUsage class", 0);
@@ -2108,7 +2118,7 @@
 
 // Dump heap - Returns 0 if succeeds.
 JVM_ENTRY(jint, jmm_DumpHeap0(JNIEnv *env, jstring outputfile, jboolean live))
-#ifndef SERVICES_KERNEL
+#if INCLUDE_SERVICES
   ResourceMark rm(THREAD);
   oop on = JNIHandles::resolve_external_guard(outputfile);
   if (on == NULL) {
@@ -2126,9 +2136,9 @@
     THROW_MSG_(vmSymbols::java_io_IOException(), errmsg, -1);
   }
   return 0;
-#else  // SERVICES_KERNEL
+#else  // INCLUDE_SERVICES
   return -1;
-#endif // SERVICES_KERNEL
+#endif // INCLUDE_SERVICES
 JVM_END
 
 JVM_ENTRY(jobjectArray, jmm_GetDiagnosticCommands(JNIEnv *env))
@@ -2156,7 +2166,7 @@
   objArrayHandle cmds_ah(THREAD, ca);
 
   // Make sure we have a String array
-  Klass* element_klass = objArrayKlass::cast(cmds_ah->klass())->element_klass();
+  Klass* element_klass = ObjArrayKlass::cast(cmds_ah->klass())->element_klass();
   if (element_klass != SystemDictionary::String_klass()) {
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
                "Array element type is not String class");
@@ -2295,10 +2305,13 @@
   jmm_GetDiagnosticCommandArgumentsInfo,
   jmm_ExecuteDiagnosticCommand
 };
+#endif // INCLUDE_MANAGEMENT
 
 void* Management::get_jmm_interface(int version) {
+#if INCLUDE_MANAGEMENT
   if (version == JMM_VERSION_1_0) {
     return (void*) &jmm_interface;
   }
+#endif // INCLUDE_MANAGEMENT
   return NULL;
 }
--- a/hotspot/src/share/vm/services/management.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/management.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -58,16 +58,17 @@
   static void init();
   static void initialize(TRAPS);
 
-  static jlong ticks_to_ms(jlong ticks);
-  static jlong timestamp();
+  static jlong ticks_to_ms(jlong ticks) NOT_MANAGEMENT_RETURN_(0L);
+  static jlong timestamp() NOT_MANAGEMENT_RETURN_(0L);
 
-  static void  oops_do(OopClosure* f);
+  static void  oops_do(OopClosure* f) NOT_MANAGEMENT_RETURN;
   static void* get_jmm_interface(int version);
   static void  get_optional_support(jmmOptionalSupport* support);
 
   static void get_loaded_classes(JavaThread* cur_thread, GrowableArray<KlassHandle>* klass_handle_array);
 
-  static void  record_vm_startup_time(jlong begin, jlong duration);
+  static void  record_vm_startup_time(jlong begin, jlong duration)
+      NOT_MANAGEMENT_RETURN;
   static void  record_vm_init_completed() {
     // Initialize the timestamp to get the current time
     _vm_init_done_time->set_value(os::javaTimeMillis());
@@ -85,14 +86,19 @@
 
   // methods to return a Klass*.
   static Klass* java_lang_management_ThreadInfo_klass(TRAPS);
-  static Klass* java_lang_management_MemoryUsage_klass(TRAPS);
+  static Klass* java_lang_management_MemoryUsage_klass(TRAPS)
+      NOT_MANAGEMENT_RETURN_(NULL);
   static Klass* java_lang_management_MemoryPoolMXBean_klass(TRAPS);
   static Klass* java_lang_management_MemoryManagerMXBean_klass(TRAPS);
   static Klass* java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
-  static Klass* sun_management_Sensor_klass(TRAPS);
-  static Klass* sun_management_ManagementFactory_klass(TRAPS);
-  static Klass* sun_management_GarbageCollectorImpl_klass(TRAPS);
-  static Klass* com_sun_management_GcInfo_klass(TRAPS);
+  static Klass* sun_management_Sensor_klass(TRAPS)
+      NOT_MANAGEMENT_RETURN_(NULL);
+  static Klass* sun_management_ManagementFactory_klass(TRAPS)
+      NOT_MANAGEMENT_RETURN_(NULL);
+  static Klass* sun_management_GarbageCollectorImpl_klass(TRAPS)
+      NOT_MANAGEMENT_RETURN_(NULL);
+  static Klass* com_sun_management_GcInfo_klass(TRAPS)
+      NOT_MANAGEMENT_RETURN_(NULL);
 
   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS);
   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, objArrayHandle monitors_array, typeArrayHandle depths_array, objArrayHandle synchronizers_array, TRAPS);
--- a/hotspot/src/share/vm/services/memReporter.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/memReporter.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -30,6 +30,8 @@
 #include "services/memTracker.hpp"
 #include "utilities/ostream.hpp"
 
+#if INCLUDE_NMT
+
 /*
  * MemBaselineReporter reports data to this outputer class,
  * ReportOutputer is responsible for format, store and redirect
@@ -265,4 +267,6 @@
 };
 
 
+#endif // INCLUDE_NMT
+
 #endif // SHARE_VM_SERVICES_MEM_REPORTER_HPP
--- a/hotspot/src/share/vm/services/memTracker.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/memTracker.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -25,6 +25,80 @@
 #ifndef SHARE_VM_SERVICES_MEM_TRACKER_HPP
 #define SHARE_VM_SERVICES_MEM_TRACKER_HPP
 
+#include "utilities/macros.hpp"
+
+#if !INCLUDE_NMT
+
+#include "utilities/ostream.hpp"
+
+class BaselineOutputer : public StackObj {
+
+};
+
+class BaselineTTYOutputer : public BaselineOutputer {
+  public:
+    BaselineTTYOutputer(outputStream* st) { }
+};
+
+class MemTracker : AllStatic {
+  public:
+   enum ShutdownReason {
+      NMT_shutdown_none,     // no shutdown requested
+      NMT_shutdown_user,     // user requested shutdown
+      NMT_normal,            // normal shutdown, process exit
+      NMT_out_of_memory,     // shutdown due to out of memory
+      NMT_initialization,    // shutdown due to initialization failure
+      NMT_use_malloc_only,   // can not combine NMT with UseMallocOnly flag
+      NMT_error_reporting,   // shutdown by vmError::report_and_die()
+      NMT_out_of_generation, // running out of generation queue
+      NMT_sequence_overflow  // overflow the sequence number
+   };
+
+
+  public:
+   static inline void init_tracking_options(const char* option_line) { }
+   static inline bool is_on()   { return false; }
+   static const char* reason()  { return "Native memory tracking is not implemented"; }
+   static inline bool can_walk_stack() { return false; }
+
+   static inline void bootstrap_single_thread() { }
+   static inline void bootstrap_multi_thread() { }
+   static inline void start() { }
+
+   static inline void record_malloc(address addr, size_t size, MEMFLAGS flags,
+        address pc = 0, Thread* thread = NULL) { }
+   static inline void record_free(address addr, MEMFLAGS flags, Thread* thread = NULL) { }
+   static inline void record_realloc(address old_addr, address new_addr, size_t size,
+        MEMFLAGS flags, address pc = 0, Thread* thread = NULL) { }
+   static inline void record_arena_size(address addr, size_t size) { }
+   static inline void record_virtual_memory_reserve(address addr, size_t size,
+        address pc = 0, Thread* thread = NULL) { }
+   static inline void record_virtual_memory_commit(address addr, size_t size,
+        address pc = 0, Thread* thread = NULL) { }
+   static inline void record_virtual_memory_uncommit(address addr, size_t size,
+        Thread* thread = NULL) { }
+   static inline void record_virtual_memory_release(address addr, size_t size,
+        Thread* thread = NULL) { }
+   static inline void record_virtual_memory_type(address base, MEMFLAGS flags,
+        Thread* thread = NULL) { }
+   static inline bool baseline() { return false; }
+   static inline bool has_baseline() { return false; }
+
+   static void shutdown(ShutdownReason reason) { }
+   static inline bool shutdown_in_progress() {  }
+   static bool print_memory_usage(BaselineOutputer& out, size_t unit,
+            bool summary_only = true) { }
+   static bool compare_memory_usage(BaselineOutputer& out, size_t unit,
+            bool summary_only = true) { }
+
+   static inline void sync() { }
+   static inline void thread_exiting(JavaThread* thread) { }
+
+};
+
+
+#else // !INCLUDE_NMT
+
 #include "memory/allocation.hpp"
 #include "runtime/globals.hpp"
 #include "runtime/mutex.hpp"
@@ -411,4 +485,6 @@
   static enum ShutdownReason       _reason;
 };
 
+#endif // !INCLUDE_NMT
+
 #endif // SHARE_VM_SERVICES_MEM_TRACKER_HPP
--- a/hotspot/src/share/vm/services/memoryManager.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/memoryManager.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/services/runtimeService.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/runtimeService.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
@@ -35,6 +35,7 @@
 HS_DTRACE_PROBE_DECL(hs_private, safepoint__end);
 #endif /* !USDT2 */
 
+#if INCLUDE_MANAGEMENT
 TimeStamp RuntimeService::_app_timer;
 TimeStamp RuntimeService::_safepoint_timer;
 PerfCounter*  RuntimeService::_sync_time_ticks = NULL;
@@ -101,9 +102,9 @@
     memset((void*) capabilities, '0', len);
     capabilities[len-1] = '\0';
     capabilities[0] = AttachListener::is_attach_supported() ? '1' : '0';
-#ifdef KERNEL
+#if INCLUDE_SERVICES
     capabilities[1] = '1';
-#endif // KERNEL
+#endif // INCLUDE_SERVICES
     PerfDataManager::create_string_constant(SUN_RT, "jvmCapabilities",
                                             capabilities, CHECK);
   }
@@ -205,3 +206,5 @@
     _thread_interrupt_signaled_count->inc();
   }
 }
+
+#endif // INCLUDE_MANAGEMENT
--- a/hotspot/src/share/vm/services/runtimeService.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/runtimeService.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
@@ -53,15 +53,15 @@
   static double last_application_time_sec()    { return _app_timer.seconds(); }
 
   // callbacks
-  static void record_safepoint_begin();
-  static void record_safepoint_synchronized();
-  static void record_safepoint_end();
-  static void record_application_start();
+  static void record_safepoint_begin() NOT_MANAGEMENT_RETURN;
+  static void record_safepoint_synchronized() NOT_MANAGEMENT_RETURN;
+  static void record_safepoint_end() NOT_MANAGEMENT_RETURN;
+  static void record_application_start() NOT_MANAGEMENT_RETURN;
 
   // interruption events
-  static void record_interrupted_before_count();
-  static void record_interrupted_during_count();
-  static void record_thread_interrupt_signaled_count();
+  static void record_interrupted_before_count() NOT_MANAGEMENT_RETURN;
+  static void record_interrupted_during_count() NOT_MANAGEMENT_RETURN;
+  static void record_thread_interrupt_signaled_count() NOT_MANAGEMENT_RETURN;
 };
 
 #endif // SHARE_VM_SERVICES_RUNTIMESERVICE_HPP
--- a/hotspot/src/share/vm/services/threadService.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/services/threadService.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -250,7 +250,7 @@
 
   ResourceMark rm(THREAD);
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_StackTraceElement_array(), true, CHECK_NH);
-  objArrayKlass* ik = objArrayKlass::cast(k);
+  ObjArrayKlass* ik = ObjArrayKlass::cast(k);
   objArrayOop r = oopFactory::new_objArray(ik, num_threads, CHECK_NH);
   objArrayHandle result_obj(THREAD, r);
 
--- a/hotspot/src/share/vm/shark/sharkRuntime.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/shark/sharkRuntime.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -129,7 +129,7 @@
                                              int         ndims,
                                              int*        dims))
   Klass* klass = method(thread)->constants()->klass_at(index, CHECK);
-  oop obj = arrayKlass::cast(klass)->multi_allocate(ndims, dims, CHECK);
+  oop obj = ArrayKlass::cast(klass)->multi_allocate(ndims, dims, CHECK);
   thread->set_vm_result(obj);
 JRT_END
 
--- a/hotspot/src/share/vm/trace/tracing.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/trace/tracing.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/array.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/array.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, 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
--- a/hotspot/src/share/vm/utilities/decoder.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/decoder.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/decoder_elf.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/decoder_elf.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/src/share/vm/utilities/dtrace.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/dtrace.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,13 +33,17 @@
 #define DTRACE_ONLY(x) x
 #define NOT_DTRACE(x)
 
+#if defined(SOLARIS)
 // Work around dtrace tail call bug 6672627 until it is fixed in solaris 10.
 #define HS_DTRACE_WORKAROUND_TAIL_CALL_BUG() \
   do { volatile size_t dtrace_workaround_tail_call_bug = 1; } while (0)
 
-#if defined(SOLARIS)
+#define USDT1 1
+#elif defined(LINUX)
+#define HS_DTRACE_WORKAROUND_TAIL_CALL_BUG()
 #define USDT1 1
 #elif defined(__APPLE__)
+#define HS_DTRACE_WORKAROUND_TAIL_CALL_BUG()
 #define USDT2 1
 #include <sys/types.h>
 #include "dtracefiles/hotspot.h"
@@ -63,6 +68,11 @@
 #define DTRACE_PROBE3(a,b,c,d,e) {;}
 #define DTRACE_PROBE4(a,b,c,d,e,f) {;}
 #define DTRACE_PROBE5(a,b,c,d,e,f,g) {;}
+#define DTRACE_PROBE6(a,b,c,d,e,f,g,h) {;}
+#define DTRACE_PROBE7(a,b,c,d,e,f,g,h,i) {;}
+#define DTRACE_PROBE8(a,b,c,d,e,f,g,h,i,j) {;}
+#define DTRACE_PROBE9(a,b,c,d,e,f,g,h,i,j,k) {;}
+#define DTRACE_PROBE10(a,b,c,d,e,f,g,h,i,j,k,l) {;}
 
 #else /* USDT2 */
 
@@ -76,10 +86,18 @@
 #define HS_DTRACE_PROBE_FN(provider,name)\
   __dtrace_##provider##___##name
 
+#ifdef SOLARIS
+// Solaris dtrace needs actual extern function decls.
 #define HS_DTRACE_PROBE_DECL_N(provider,name,args) \
   DTRACE_ONLY(extern "C" void HS_DTRACE_PROBE_FN(provider,name) args)
 #define HS_DTRACE_PROBE_CDECL_N(provider,name,args) \
   DTRACE_ONLY(extern void HS_DTRACE_PROBE_FN(provider,name) args)
+#else
+// Systemtap dtrace compatible probes on GNU/Linux don't.
+// If dtrace is disabled this macro becomes NULL
+#define HS_DTRACE_PROBE_DECL_N(provider,name,args)
+#define HS_DTRACE_PROBE_CDECL_N(provider,name,args)
+#endif
 
 /* Dtrace probe declarations */
 #define HS_DTRACE_PROBE_DECL(provider,name) \
@@ -118,6 +136,8 @@
     uintptr_t,uintptr_t,uintptr_t))
 
 /* Dtrace probe definitions */
+#if defined(SOLARIS)
+// Solaris dtrace uses actual function calls.
 #define HS_DTRACE_PROBE_N(provider,name, args) \
   DTRACE_ONLY(HS_DTRACE_PROBE_FN(provider,name) args)
 
@@ -153,6 +173,33 @@
   HS_DTRACE_PROBE_N(provider,name,((uintptr_t)a0,(uintptr_t)a1,(uintptr_t)a2,\
     (uintptr_t)a3,(uintptr_t)a4,(uintptr_t)a5,(uintptr_t)a6,(uintptr_t)a7,\
     (uintptr_t)a8,(uintptr_t)a9))
+#else
+// Systemtap dtrace compatible probes on GNU/Linux use direct macros.
+// If dtrace is disabled this macro becomes NULL
+#define HS_DTRACE_PROBE(provider,name) HS_DTRACE_PROBE0(provider,name)
+#define HS_DTRACE_PROBE0(provider,name)\
+  DTRACE_PROBE(provider,name)
+#define HS_DTRACE_PROBE1(provider,name,a0)\
+  DTRACE_PROBE1(provider,name,a0)
+#define HS_DTRACE_PROBE2(provider,name,a0,a1)\
+  DTRACE_PROBE2(provider,name,a0,a1)
+#define HS_DTRACE_PROBE3(provider,name,a0,a1,a2)\
+  DTRACE_PROBE3(provider,name,a0,a1,a2)
+#define HS_DTRACE_PROBE4(provider,name,a0,a1,a2,a3)\
+  DTRACE_PROBE4(provider,name,a0,a1,a2,a3)
+#define HS_DTRACE_PROBE5(provider,name,a0,a1,a2,a3,a4)\
+  DTRACE_PROBE5(provider,name,a0,a1,a2,a3,a4)
+#define HS_DTRACE_PROBE6(provider,name,a0,a1,a2,a3,a4,a5)\
+  DTRACE_PROBE6(provider,name,a0,a1,a2,a3,a4,a5)
+#define HS_DTRACE_PROBE7(provider,name,a0,a1,a2,a3,a4,a5,a6)\
+  DTRACE_PROBE7(provider,name,a0,a1,a2,a3,a4,a5,a6)
+#define HS_DTRACE_PROBE8(provider,name,a0,a1,a2,a3,a4,a5,a6,a7)\
+  DTRACE_PROBE8(provider,name,a0,a1,a2,a3,a4,a5,a6,a7)
+#define HS_DTRACE_PROBE9(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)\
+  DTRACE_PROBE9(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)
+#define HS_DTRACE_PROBE10(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)\
+  DTRACE_PROBE10(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)
+#endif
 
 #endif /* !USDT2 */
 
--- a/hotspot/src/share/vm/utilities/elfFile.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/elfFile.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/elfFile.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/elfFile.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/elfStringTable.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/elfStringTable.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/elfStringTable.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/elfStringTable.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/elfSymbolTable.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/elfSymbolTable.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/elfSymbolTable.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/elfSymbolTable.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/globalDefinitions.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -111,11 +111,12 @@
       case T_DOUBLE:
       case T_LONG:
       case T_OBJECT:
-      case T_ADDRESS:   // random raw pointer
-      case T_METADATA:  // metadata pointer
-      case T_NARROWOOP: // compressed pointer
-      case T_CONFLICT:  // might as well support a bottom type
-      case T_VOID:      // padding or other unaddressed word
+      case T_ADDRESS:     // random raw pointer
+      case T_METADATA:    // metadata pointer
+      case T_NARROWOOP:   // compressed pointer
+      case T_NARROWKLASS: // compressed klass pointer
+      case T_CONFLICT:    // might as well support a bottom type
+      case T_VOID:        // padding or other unaddressed word
         // layout type must map to itself
         assert(vt == ft, "");
         break;
@@ -179,7 +180,7 @@
 
 
 // Map BasicType to signature character
-char type2char_tab[T_CONFLICT+1]={ 0, 0, 0, 0, 'Z', 'C', 'F', 'D', 'B', 'S', 'I', 'J', 'L', '[', 'V', 0, 0, 0, 0};
+char type2char_tab[T_CONFLICT+1]={ 0, 0, 0, 0, 'Z', 'C', 'F', 'D', 'B', 'S', 'I', 'J', 'L', '[', 'V', 0, 0, 0, 0, 0};
 
 // Map BasicType to Java type name
 const char* type2name_tab[T_CONFLICT+1] = {
@@ -198,6 +199,7 @@
   "*address*",
   "*narrowoop*",
   "*metadata*",
+  "*narrowklass*",
   "*conflict*"
 };
 
@@ -213,7 +215,7 @@
 
 
 // Map BasicType to size in words
-int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, -1};
+int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, 1, -1};
 
 BasicType type2field[T_CONFLICT+1] = {
   (BasicType)0,            // 0,
@@ -234,7 +236,8 @@
   T_ADDRESS,               // T_ADDRESS  = 15,
   T_NARROWOOP,             // T_NARROWOOP= 16,
   T_METADATA,              // T_METADATA = 17,
-  T_CONFLICT               // T_CONFLICT = 18,
+  T_NARROWKLASS,           // T_NARROWKLASS = 18,
+  T_CONFLICT               // T_CONFLICT = 19,
 };
 
 
@@ -257,30 +260,32 @@
   T_ADDRESS, // T_ADDRESS  = 15,
   T_NARROWOOP, // T_NARROWOOP  = 16,
   T_METADATA,  // T_METADATA   = 17,
-  T_CONFLICT // T_CONFLICT = 18,
+  T_NARROWKLASS, // T_NARROWKLASS  = 18,
+  T_CONFLICT // T_CONFLICT = 19,
 };
 
 
 int _type2aelembytes[T_CONFLICT+1] = {
-  0,                      // 0
-  0,                      // 1
-  0,                      // 2
-  0,                      // 3
-  T_BOOLEAN_aelem_bytes,  // T_BOOLEAN  =  4,
-  T_CHAR_aelem_bytes,     // T_CHAR     =  5,
-  T_FLOAT_aelem_bytes,    // T_FLOAT    =  6,
-  T_DOUBLE_aelem_bytes,   // T_DOUBLE   =  7,
-  T_BYTE_aelem_bytes,     // T_BYTE     =  8,
-  T_SHORT_aelem_bytes,    // T_SHORT    =  9,
-  T_INT_aelem_bytes,      // T_INT      = 10,
-  T_LONG_aelem_bytes,     // T_LONG     = 11,
-  T_OBJECT_aelem_bytes,   // T_OBJECT   = 12,
-  T_ARRAY_aelem_bytes,    // T_ARRAY    = 13,
-  0,                      // T_VOID     = 14,
-  T_OBJECT_aelem_bytes,   // T_ADDRESS  = 15,
-  T_NARROWOOP_aelem_bytes,// T_NARROWOOP= 16,
-  T_OBJECT_aelem_bytes,   // T_METADATA = 17,
-  0                       // T_CONFLICT = 18,
+  0,                         // 0
+  0,                         // 1
+  0,                         // 2
+  0,                         // 3
+  T_BOOLEAN_aelem_bytes,     // T_BOOLEAN  =  4,
+  T_CHAR_aelem_bytes,        // T_CHAR     =  5,
+  T_FLOAT_aelem_bytes,       // T_FLOAT    =  6,
+  T_DOUBLE_aelem_bytes,      // T_DOUBLE   =  7,
+  T_BYTE_aelem_bytes,        // T_BYTE     =  8,
+  T_SHORT_aelem_bytes,       // T_SHORT    =  9,
+  T_INT_aelem_bytes,         // T_INT      = 10,
+  T_LONG_aelem_bytes,        // T_LONG     = 11,
+  T_OBJECT_aelem_bytes,      // T_OBJECT   = 12,
+  T_ARRAY_aelem_bytes,       // T_ARRAY    = 13,
+  0,                         // T_VOID     = 14,
+  T_OBJECT_aelem_bytes,      // T_ADDRESS  = 15,
+  T_NARROWOOP_aelem_bytes,   // T_NARROWOOP= 16,
+  T_OBJECT_aelem_bytes,      // T_METADATA = 17,
+  T_NARROWKLASS_aelem_bytes, // T_NARROWKLASS= 18,
+  0                          // T_CONFLICT = 19,
 };
 
 #ifdef ASSERT
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -347,6 +347,14 @@
 extern int LogMinObjAlignment;
 extern int LogMinObjAlignmentInBytes;
 
+const int LogKlassAlignmentInBytes = 3;
+const int LogKlassAlignment        = LogKlassAlignmentInBytes - LogHeapWordSize;
+const int KlassAlignmentInBytes    = 1 << LogKlassAlignmentInBytes;
+const int KlassAlignment           = KlassAlignmentInBytes / HeapWordSize;
+
+// Klass encoding metaspace max size
+const uint64_t KlassEncodingMetaspaceMax = (uint64_t(max_juint) + 1) << LogKlassAlignmentInBytes;
+
 // Machine dependent stuff
 
 #ifdef TARGET_ARCH_x86
@@ -481,22 +489,23 @@
 
 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
 enum BasicType {
-  T_BOOLEAN  =  4,
-  T_CHAR     =  5,
-  T_FLOAT    =  6,
-  T_DOUBLE   =  7,
-  T_BYTE     =  8,
-  T_SHORT    =  9,
-  T_INT      = 10,
-  T_LONG     = 11,
-  T_OBJECT   = 12,
-  T_ARRAY    = 13,
-  T_VOID     = 14,
-  T_ADDRESS  = 15,
-  T_NARROWOOP= 16,
-  T_METADATA = 17,
-  T_CONFLICT = 18, // for stack value type with conflicting contents
-  T_ILLEGAL  = 99
+  T_BOOLEAN     =  4,
+  T_CHAR        =  5,
+  T_FLOAT       =  6,
+  T_DOUBLE      =  7,
+  T_BYTE        =  8,
+  T_SHORT       =  9,
+  T_INT         = 10,
+  T_LONG        = 11,
+  T_OBJECT      = 12,
+  T_ARRAY       = 13,
+  T_VOID        = 14,
+  T_ADDRESS     = 15,
+  T_NARROWOOP   = 16,
+  T_METADATA    = 17,
+  T_NARROWKLASS = 18,
+  T_CONFLICT    = 19, // for stack value type with conflicting contents
+  T_ILLEGAL     = 99
 };
 
 inline bool is_java_primitive(BasicType t) {
@@ -544,18 +553,19 @@
 
 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
 enum BasicTypeSize {
-  T_BOOLEAN_size = 1,
-  T_CHAR_size    = 1,
-  T_FLOAT_size   = 1,
-  T_DOUBLE_size  = 2,
-  T_BYTE_size    = 1,
-  T_SHORT_size   = 1,
-  T_INT_size     = 1,
-  T_LONG_size    = 2,
-  T_OBJECT_size  = 1,
-  T_ARRAY_size   = 1,
-  T_NARROWOOP_size = 1,
-  T_VOID_size    = 0
+  T_BOOLEAN_size     = 1,
+  T_CHAR_size        = 1,
+  T_FLOAT_size       = 1,
+  T_DOUBLE_size      = 2,
+  T_BYTE_size        = 1,
+  T_SHORT_size       = 1,
+  T_INT_size         = 1,
+  T_LONG_size        = 2,
+  T_OBJECT_size      = 1,
+  T_ARRAY_size       = 1,
+  T_NARROWOOP_size   = 1,
+  T_NARROWKLASS_size = 1,
+  T_VOID_size        = 0
 };
 
 
@@ -567,23 +577,24 @@
 
 // size in bytes
 enum ArrayElementSize {
-  T_BOOLEAN_aelem_bytes = 1,
-  T_CHAR_aelem_bytes    = 2,
-  T_FLOAT_aelem_bytes   = 4,
-  T_DOUBLE_aelem_bytes  = 8,
-  T_BYTE_aelem_bytes    = 1,
-  T_SHORT_aelem_bytes   = 2,
-  T_INT_aelem_bytes     = 4,
-  T_LONG_aelem_bytes    = 8,
+  T_BOOLEAN_aelem_bytes     = 1,
+  T_CHAR_aelem_bytes        = 2,
+  T_FLOAT_aelem_bytes       = 4,
+  T_DOUBLE_aelem_bytes      = 8,
+  T_BYTE_aelem_bytes        = 1,
+  T_SHORT_aelem_bytes       = 2,
+  T_INT_aelem_bytes         = 4,
+  T_LONG_aelem_bytes        = 8,
 #ifdef _LP64
-  T_OBJECT_aelem_bytes  = 8,
-  T_ARRAY_aelem_bytes   = 8,
+  T_OBJECT_aelem_bytes      = 8,
+  T_ARRAY_aelem_bytes       = 8,
 #else
-  T_OBJECT_aelem_bytes  = 4,
-  T_ARRAY_aelem_bytes   = 4,
+  T_OBJECT_aelem_bytes      = 4,
+  T_ARRAY_aelem_bytes       = 4,
 #endif
-  T_NARROWOOP_aelem_bytes = 4,
-  T_VOID_aelem_bytes    = 0
+  T_NARROWOOP_aelem_bytes   = 4,
+  T_NARROWKLASS_aelem_bytes = 4,
+  T_VOID_aelem_bytes        = 0
 };
 
 extern int _type2aelembytes[T_CONFLICT+1]; // maps a BasicType to nof bytes used by its array element
--- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/growableArray.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/growableArray.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
--- a/hotspot/src/share/vm/utilities/histogram.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/histogram.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/utilities/histogram.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/histogram.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/utilities/intHisto.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/intHisto.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/utilities/intHisto.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/intHisto.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/utilities/macros.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/macros.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -34,26 +34,131 @@
 // Makes a string of the macro expansion of a
 #define XSTR(a) STR(a)
 
-// KERNEL variant
-#ifdef KERNEL
-#define COMPILER1
-#define SERIALGC
+// -DINCLUDE_<something>=0 | 1 can be specified on the command line to include
+// or exclude functionality.
+
+#ifndef INCLUDE_JVMTI
+#define INCLUDE_JVMTI 1
+#endif  // INCLUDE_JVMTI
+
+#if INCLUDE_JVMTI
+#define JVMTI_ONLY(x) x
+#define NOT_JVMTI(x)
+#define NOT_JVMTI_RETURN
+#define NOT_JVMTI_RETURN_(code) /* next token must be ; */
+#else
+#define JVMTI_ONLY(x)
+#define NOT_JVMTI(x) x
+#define NOT_JVMTI_RETURN { return; }
+#define NOT_JVMTI_RETURN_(code) { return code; }
+#endif // INCLUDE_JVMTI
+
+#ifndef INCLUDE_FPROF
+#define INCLUDE_FPROF 1
+#endif
+
+#if INCLUDE_FPROF
+#define NOT_FPROF_RETURN        /* next token must be ; */
+#define NOT_FPROF_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_FPROF_RETURN                {}
+#define NOT_FPROF_RETURN_(code) { return code; }
+#endif // INCLUDE_FPROF
+
+#ifndef INCLUDE_VM_STRUCTS
+#define INCLUDE_VM_STRUCTS 1
+#endif
+
+#if INCLUDE_VM_STRUCTS
+#define NOT_VM_STRUCTS_RETURN        /* next token must be ; */
+#define NOT_VM_STRUCTS_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_VM_STRUCTS_RETURN           {}
+#define NOT_VM_STRUCTS_RETURN_(code) { return code; }
+#endif // INCLUDE_VM_STRUCTS
+
+#ifndef INCLUDE_JNI_CHECK
+#define INCLUDE_JNI_CHECK 1
+#endif
+
+#if INCLUDE_JNI_CHECK
+#define NOT_JNI_CHECK_RETURN        /* next token must be ; */
+#define NOT_JNI_CHECK_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_JNI_CHECK_RETURN            {}
+#define NOT_JNI_CHECK_RETURN_(code) { return code; }
+#endif // INCLUDE_JNI_CHECK
+
+#ifndef INCLUDE_SERVICES
+#define INCLUDE_SERVICES 1
+#endif
 
-#define JVMTI_KERNEL
-#define FPROF_KERNEL
-#define VM_STRUCTS_KERNEL
-#define JNICHECK_KERNEL
-#define SERVICES_KERNEL
+#if INCLUDE_SERVICES
+#define NOT_SERVICES_RETURN        /* next token must be ; */
+#define NOT_SERVICES_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_SERVICES_RETURN             {}
+#define NOT_SERVICES_RETURN_(code) { return code; }
+#endif // INCLUDE_SERVICES
+
+#ifndef INCLUDE_CDS
+#define INCLUDE_CDS 1
+#endif
+
+#if INCLUDE_CDS
+#define CDS_ONLY(x) x
+#define NOT_CDS(x)
+#define NOT_CDS_RETURN        /* next token must be ; */
+#define NOT_CDS_RETURN_(code) /* next token must be ; */
+#else
+#define CDS_ONLY(x)
+#define NOT_CDS(x) x
+#define NOT_CDS_RETURN          {}
+#define NOT_CDS_RETURN_(code) { return code; }
+#endif // INCLUDE_CDS
+
+#ifndef INCLUDE_MANAGEMENT
+#define INCLUDE_MANAGEMENT 1
+#endif // INCLUDE_MANAGEMENT
 
-#define KERNEL_RETURN        {}
-#define KERNEL_RETURN_(code) { return code; }
+#if INCLUDE_MANAGEMENT
+#define NOT_MANAGEMENT_RETURN        /* next token must be ; */
+#define NOT_MANAGEMENT_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_MANAGEMENT_RETURN        {}
+#define NOT_MANAGEMENT_RETURN_(code) { return code; }
+#endif // INCLUDE_MANAGEMENT
 
-#else  // KERNEL
+/*
+ * When INCLUDE_ALTERNATE_GCS is false the only garbage collectors
+ * included in the JVM are defaultNewGeneration and markCompact.
+ *
+ * When INCLUDE_ALTERNATE_GCS is true all garbage collectors are
+ * included in the JVM.
+ */
+#ifndef INCLUDE_ALTERNATE_GCS
+#define INCLUDE_ALTERNATE_GCS 1
+#endif // INCLUDE_ALTERNATE_GCS
 
-#define KERNEL_RETURN        /* next token must be ; */
-#define KERNEL_RETURN_(code) /* next token must be ; */
+#if INCLUDE_ALTERNATE_GCS
+#define NOT_ALTERNATE_GCS_RETURN        /* next token must be ; */
+#define NOT_ALTERNATE_GCS_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_ALTERNATE_GCS_RETURN        {}
+#define NOT_ALTERNATE_GCS_RETURN_(code) { return code; }
+#endif // INCLUDE_ALTERNATE_GCS
 
-#endif // KERNEL
+#ifndef INCLUDE_NMT
+#define INCLUDE_NMT 1
+#endif // INCLUDE_NMT
+
+#if INCLUDE_NMT
+#define NOT_NMT_RETURN        /* next token must be ; */
+#define NOT_NMT_RETURN_(code) /* next token must be ; */
+#else
+#define NOT_NMT_RETURN        {}
+#define NOT_NMT_RETURN_(code) { return code; }
+#endif // INCLUDE_NMT
 
 // COMPILER1 variant
 #ifdef COMPILER1
--- a/hotspot/src/share/vm/utilities/ostream.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/ostream.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -759,7 +759,7 @@
     if (has_log) {
       _log_file->bol();
       // output a hint where this output is coming from:
-      _log_file->print_cr("<writer thread='"INTX_FORMAT"'/>", writer_id);
+      _log_file->print_cr("<writer thread='" UINTX_FORMAT "'/>", writer_id);
     }
     _last_writer = writer_id;
   }
--- a/hotspot/src/share/vm/utilities/preserveException.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/preserveException.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
--- a/hotspot/src/share/vm/utilities/stack.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/stack.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, 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
--- a/hotspot/src/share/vm/utilities/stack.inline.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/stack.inline.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, 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
--- a/hotspot/src/share/vm/utilities/taskqueue.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/taskqueue.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/utilities/vmError.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/vmError.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
--- a/hotspot/src/share/vm/utilities/workgroup.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/workgroup.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, 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
--- a/hotspot/src/share/vm/utilities/workgroup.hpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/src/share/vm/utilities/workgroup.hpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
--- a/hotspot/test/compiler/6859338/Test6859338.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/test/compiler/6859338/Test6859338.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, 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
--- a/hotspot/test/compiler/7116216/StackOverflow.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/test/compiler/7116216/StackOverflow.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
--- a/hotspot/test/runtime/7194254/Test7194254.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/test/runtime/7194254/Test7194254.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,7 +27,7 @@
  * @summary Creates several threads with different java priorities and checks
  *      whether jstack reports correct priorities for them.
  *
- * @run main T7194254
+ * @run main Test7194254
  */
 
 import java.io.BufferedReader;
--- a/hotspot/test/runtime/7196045/Test7196045.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/hotspot/test/runtime/7196045/Test7196045.java	Wed Jul 05 18:26:11 2017 +0200
@@ -26,7 +26,7 @@
  * @test
  * @bug 7196045
  * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API.
- * @run main/othervm
+ * @run main/othervm Test7196045
  */
 
 import java.lang.management.ManagementFactory;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/7170638/SDTProbesGNULinuxTest.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,68 @@
+# 
+#  Copyright (c) 2012, Red Hat, Inc.
+#  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.
+# 
+
+# @test SDTProbesGNULinuxTest.sh
+# @bug 7170638
+# @summary Test SDT probes available on GNU/Linux when DTRACE_ENABLED
+# @run shell SDTProbesGNULinuxTest.sh
+
+# This test only matters on GNU/Linux, others trivially PASS.
+OS=`uname -s`
+case "$OS" in
+  Linux )
+    ;;
+  *)
+    echo "Not testing on anything but GNU/Linux. PASSED"
+    exit 0;
+    ;;
+esac
+
+# Where is our java (parent) directory? 
+if [ "${TESTJAVA}" = "" ]; then
+  PARENT=$(dirname $(readlink -f $(which java)))
+  TESTJAVA=`dirname ${PARENT}`
+  echo "TESTJAVA directory not set, using " ${TESTJAVA}
+fi
+
+# This test only matters when build with DTRACE_ENABLED. 
+${TESTJAVA}/bin/java -XX:+ExtendedDTraceProbes -version
+if [ "$?" != "0" ]; then
+  echo "Not build using DTRACE_ENABLED. PASSED"
+  exit 0
+fi
+
+# Test all available libjvm.so variants
+for libjvm in $(find ${TESTJAVA} -name libjvm.so); do
+  echo "Testing ${libjvm}"
+  # Check whether the SDT probes are compiled in.
+  readelf -S ${libjvm} | grep '.note.stapsdt'
+  if [ "$?" != "0" ]; then
+    echo "Failed: ${libjvm} doesn't contain SDT probes."
+    exit 1
+  fi
+  # We could iterate over all SDT probes and test them individually
+  # with readelf -n, but older readelf versions don't understand them.
+done
+
+echo "Passed."
+exit 0
--- a/jaxp/.hgtags	Wed Jul 05 18:25:14 2017 +0200
+++ b/jaxp/.hgtags	Wed Jul 05 18:26:11 2017 +0200
@@ -181,3 +181,4 @@
 7c9475c7618cb131bcd7470f859bf43c5e5f9905 jdk8-b57
 1cb19abb3f7b40bf233b349cd2f51f02d37a9f5b jdk8-b58
 af9e8b0f1900b631a8a0fcccff9f1514fe58c808 jdk8-b59
+2d1dff5310daaf226421a8c92823cb8afcf35f31 jdk8-b60
--- a/jaxws/.hgtags	Wed Jul 05 18:25:14 2017 +0200
+++ b/jaxws/.hgtags	Wed Jul 05 18:26:11 2017 +0200
@@ -181,3 +181,4 @@
 b51b611209f159f94dd2ce3dc2c56daa6d6ac1df jdk8-b57
 cac4c393706343df778a13dc6c84cad0f8c237c9 jdk8-b58
 ae107401be116f9e384d3a23192f543828e03da5 jdk8-b59
+5c5a65ad5291b7cefcdc308f627cf2b195cf2b69 jdk8-b60
--- a/jdk/.hgtags	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/.hgtags	Wed Jul 05 18:26:11 2017 +0200
@@ -181,3 +181,4 @@
 51594d095a4bcffac4a314bf6e148214501399e0 jdk8-b57
 d94613ac03d8de375ef60493e2bb76dbd30d875d jdk8-b58
 abad1f417bd3df4296631fc943cd3b7f5062c88a jdk8-b59
+cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60
--- a/jdk/make/java/java/FILES_java.gmk	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/java/java/FILES_java.gmk	Wed Jul 05 18:26:11 2017 +0200
@@ -213,6 +213,7 @@
             sun/util/locale/provider/DateFormatSymbolsProviderImpl.java \
             sun/util/locale/provider/DecimalFormatSymbolsProviderImpl.java \
             sun/util/locale/provider/DictionaryBasedBreakIterator.java \
+            sun/util/locale/provider/FallbackLocaleProviderAdapter.java \
             sun/util/locale/provider/HostLocaleProviderAdapter.java \
             sun/util/locale/provider/HostLocaleProviderAdapterImpl.java \
             sun/util/locale/provider/JRELocaleConstants.java \
@@ -235,6 +236,7 @@
     java/util/Observer.java \
     java/util/Properties.java \
         java/util/InvalidPropertiesFormatException.java \
+	sun/util/spi/XmlPropertiesProvider.java \
     java/util/PropertyPermission.java \
     java/util/PropertyResourceBundle.java \
     java/util/Random.java \
--- a/jdk/make/java/nio/mapfile-bsd	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/java/nio/mapfile-bsd	Wed Jul 05 18:26:11 2017 +0200
@@ -108,6 +108,7 @@
 		Java_sun_nio_ch_Net_setInterface6;
 		Java_sun_nio_ch_Net_getInterface6;
 		Java_sun_nio_ch_Net_shutdown;
+		Java_sun_nio_ch_Net_poll;
                 Java_sun_nio_ch_PollArrayWrapper_interrupt;
                 Java_sun_nio_ch_PollArrayWrapper_poll0;
                 Java_sun_nio_ch_ServerSocketChannelImpl_accept0;
--- a/jdk/make/java/nio/mapfile-linux	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/java/nio/mapfile-linux	Wed Jul 05 18:26:11 2017 +0200
@@ -116,6 +116,7 @@
 		Java_sun_nio_ch_Net_setInterface6;
 		Java_sun_nio_ch_Net_getInterface6;
 		Java_sun_nio_ch_Net_shutdown;
+		Java_sun_nio_ch_Net_poll;
                 Java_sun_nio_ch_PollArrayWrapper_interrupt;
                 Java_sun_nio_ch_PollArrayWrapper_poll0;
                 Java_sun_nio_ch_ServerSocketChannelImpl_accept0;
--- a/jdk/make/java/nio/mapfile-solaris	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/java/nio/mapfile-solaris	Wed Jul 05 18:26:11 2017 +0200
@@ -104,6 +104,7 @@
 		Java_sun_nio_ch_Net_setInterface6;
 		Java_sun_nio_ch_Net_getInterface6;
 		Java_sun_nio_ch_Net_shutdown;
+		Java_sun_nio_ch_Net_poll;
                 Java_sun_nio_ch_PollArrayWrapper_interrupt;
                 Java_sun_nio_ch_PollArrayWrapper_poll0;
                 Java_sun_nio_ch_ServerSocketChannelImpl_accept0;
--- a/jdk/make/javax/crypto/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/javax/crypto/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -158,7 +158,12 @@
 #
 
 ifdef OPENJDK
-all: build-jar install-jar build-policy install-limited
+ifdef UNLIMITED_CRYPTO
+POLICY = install-unlimited
+else
+POLICY = install-limited
+endif
+all: build-jar install-jar build-policy $(POLICY)
 else  # OPENJDK
 ifeq ($(strip $(FILES_java)),)
 all:
--- a/jdk/make/sun/osxapp/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/sun/osxapp/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -28,6 +28,11 @@
 PRODUCT = sun
 include $(BUILDDIR)/common/Defs.gmk
 
+GEN_DIR=$(GENSRCDIR)/sun/osxapp
+ICON_DATA = $(GEN_DIR)/AWTIconData.h
+
+CLASSES_INIT += $(ICON_DATA)
+
 #
 # Files
 #
@@ -63,6 +68,7 @@
 	-framework QuartzCore
 
 CPPFLAGS += \
+        -I$(GEN_DIR) \
         $(call NativeSrcDirList,-I,/native/sun/osxapp)
 
 
@@ -70,6 +76,34 @@
   CPPFLAGS += -DINTERNAL_BUILD
 endif
 
-clean clobber::
+TEMPDIR_CLASSES = $(TEMPDIR)/classes
+
+$(TEMPDIR_CLASSES)/sun/osxapp/ToBin.class: ToBin.java
+	@$(prep-target)
+	$(BOOT_JAVAC_CMD) -d $(TEMPDIR_CLASSES) $<
+
+ifdef OPENJDK
+    ICONS_PATH_PREFIX=$(PLATFORM_SRC_MACOS)
+else
+    ICONS_PATH_PREFIX=$(CLOSED_SRC)/macosx
+endif
+
+generated.clean:
+	$(RM) -r $(GEN_DIR)/*.h
 
-.PHONY:
+ICONPATH=$(ICONS_PATH_PREFIX)/native/sun/osxapp/resource/icons
+ICON = $(ICONPATH)/JavaApp.icns
+
+$(GEN_DIR)/AWTIconData.h: $(TEMPDIR_CLASSES)/sun/osxapp/ToBin.class $(ICON) 
+	$(prep-target)
+	$(RM) $(ICON_DATA)
+	$(ECHO) "static unsigned char sAWTIconData[] = { " >> $(ICON_DATA);  \
+	$(CAT) $(ICON) | \
+	    $(BOOT_JAVA_CMD) -cp $(TEMPDIR_CLASSES) -Djava.awt.headless=true \
+	    sun.osxapp.ToBin >> $(ICON_DATA); \
+	$(ECHO) "};" >> $(ICON_DATA);
+
+
+clean clobber:: generated.clean
+
+.PHONY: generated.clean
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/sun/osxapp/ToBin.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.osxapp;
+
+import java.io.*;
+
+public class ToBin {
+    public static void main(String[] args) throws Exception {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        int nRead;
+        byte[] data = new byte[4096];
+
+        while ((nRead = System.in.read(data, 0, data.length)) != -1) {
+            baos.write(data, 0, nRead);
+        }
+
+        baos.flush();
+
+        byte[] buf = baos.toByteArray();
+        for (int i = 0; i < buf.length; i++) {
+            System.out.print(String.format("0x%1$02X", buf[i]) + ", ");
+            if (i % 20 == 0) {
+                System.out.println();
+            }
+        }
+    }
+}
--- a/jdk/make/sun/util/Makefile	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/make/sun/util/Makefile	Wed Jul 05 18:26:11 2017 +0200
@@ -41,3 +41,20 @@
 #
 include $(BUILDDIR)/common/Classes.gmk
 
+#
+# Rules for XML properties provider configuration file
+#
+SERVICEDIR = $(CLASSBINDIR)/META-INF/services
+FILES_copy = $(SERVICEDIR)/sun.util.spi.XmlPropertiesProvider
+
+copy-files: $(FILES_copy)
+
+$(SERVICEDIR)/%: $(SHARE_SRC)/classes/sun/util/xml/META-INF/services/%
+	$(install-file)
+
+build: copy-files
+
+clean::
+	$(RM) $(FILES_copy)
+
+
--- a/jdk/src/macosx/classes/sun/lwawt/LWCanvasPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCanvasPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -26,26 +26,27 @@
 
 package sun.lwawt;
 
+import java.awt.AWTException;
 import java.awt.BufferCapabilities;
-import java.awt.Canvas;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.GraphicsConfiguration;
 import java.awt.Image;
 import java.awt.peer.CanvasPeer;
 
 import javax.swing.JComponent;
 
-final class LWCanvasPeer extends LWComponentPeer<Component, JComponent>
-        implements CanvasPeer {
+class LWCanvasPeer<T extends Component, D extends JComponent>
+        extends LWComponentPeer<T, D> implements CanvasPeer {
 
-    LWCanvasPeer(final Canvas target, PlatformComponent platformComponent) {
+    LWCanvasPeer(final T target, final PlatformComponent platformComponent) {
         super(target, platformComponent);
     }
-
     // ---- PEER METHODS ---- //
 
     @Override
-    public void createBuffers(int numBuffers, BufferCapabilities caps) {
+    public void createBuffers(int numBuffers, BufferCapabilities caps)
+            throws AWTException {
         // TODO
     }
 
@@ -67,10 +68,20 @@
     }
 
     @Override
-    public GraphicsConfiguration getAppropriateGraphicsConfiguration(
+    public final GraphicsConfiguration getAppropriateGraphicsConfiguration(
             GraphicsConfiguration gc)
     {
         // TODO
         return gc;
     }
+
+    @Override
+    public final Dimension getPreferredSize() {
+        return getMinimumSize();
+    }
+
+    @Override
+    public final Dimension getMinimumSize() {
+        return getBounds().getSize();
+    }
 }
--- a/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -186,6 +186,11 @@
         }
 
         @Override
+        public Dimension getPreferredSize() {
+            return getCurrentButton().getPreferredSize();
+        }
+
+        @Override
         @Transient
         public Dimension getMinimumSize() {
             return getCurrentButton().getMinimumSize();
--- a/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -123,7 +123,7 @@
     //   private volatile boolean paintPending;
     private volatile boolean isLayouting;
 
-    private D delegate = null;
+    private final D delegate;
     private Container delegateContainer;
     private Component delegateDropTarget;
     private final Object dropTargetLock = new Object();
@@ -133,6 +133,11 @@
 
     private final PlatformComponent platformComponent;
 
+    /**
+     * Character with reasonable value between the minimum width and maximum.
+     */
+    static final char WIDE_CHAR = '0';
+
     private final class DelegateContainer extends Container {
         {
             enableEvents(0xFFFFFFFF);
@@ -267,9 +272,7 @@
     }
 
     protected final D getDelegate() {
-        synchronized (getStateLock()) {
-            return delegate;
-        }
+        return delegate;
     }
 
     protected Component getDelegateFocusOwner() {
@@ -698,26 +701,23 @@
     }
 
     @Override
-    public FontMetrics getFontMetrics(Font f) {
+    public FontMetrics getFontMetrics(final Font f) {
         // Borrow the metrics from the top-level window
 //        return getWindowPeer().getFontMetrics(f);
         // Obtain the metrics from the offscreen window where this peer is
         // mostly drawn to.
         // TODO: check for "use platform metrics" settings
-        Graphics g = getWindowPeer().getGraphics();
-        try {
-            if (g != null) {
+        final Graphics g = getOnscreenGraphics();
+        if (g != null) {
+            try {
                 return g.getFontMetrics(f);
-            } else {
-                synchronized (getDelegateLock()) {
-                    return delegateContainer.getFontMetrics(f);
-                }
-            }
-        } finally {
-            if (g != null) {
+            } finally {
                 g.dispose();
             }
         }
+        synchronized (getDelegateLock()) {
+            return delegateContainer.getFontMetrics(f);
+        }
     }
 
     @Override
@@ -847,31 +847,46 @@
     }
 
     /**
-     * Should be overridden in subclasses to forward the request
-     * to the Swing helper component, if required.
+     * Determines the preferred size of the component. By default forwards the
+     * request to the Swing helper component. Should be overridden in subclasses
+     * if required.
      */
     @Override
     public Dimension getPreferredSize() {
-        // It looks like a default implementation for all toolkits
-        return getMinimumSize();
+        final Dimension size;
+        synchronized (getDelegateLock()) {
+            size = getDelegate().getPreferredSize();
+        }
+        return validateSize(size);
     }
 
-    /*
-     * Should be overridden in subclasses to forward the request
-     * to the Swing helper component.
+    /**
+     * Determines the minimum size of the component. By default forwards the
+     * request to the Swing helper component. Should be overridden in subclasses
+     * if required.
      */
     @Override
     public Dimension getMinimumSize() {
-        D delegate = getDelegate();
+        final Dimension size;
+        synchronized (getDelegateLock()) {
+            size = getDelegate().getMinimumSize();
+        }
+        return validateSize(size);
+    }
 
-        if (delegate == null) {
-            // Is it a correct default value?
-            return getBounds().getSize();
-        } else {
-            synchronized (getDelegateLock()) {
-                return delegate.getMinimumSize();
-            }
+    /**
+     * In some situations delegates can return empty minimum/preferred size.
+     * (For example: empty JLabel, etc), but awt components never should be
+     * empty. In the XPeers or WPeers we use some magic constants, but here we
+     * try to use something more useful,
+     */
+    private Dimension validateSize(final Dimension size) {
+        if (size.width == 0 || size.height == 0) {
+            final FontMetrics fm = getFontMetrics(getFont());
+            size.width = fm.charWidth(WIDE_CHAR);
+            size.height = fm.getHeight();
         }
+        return size;
     }
 
     @Override
--- a/jdk/src/macosx/classes/sun/lwawt/LWContainerPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWContainerPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -41,7 +41,7 @@
 import javax.swing.JComponent;
 
 abstract class LWContainerPeer<T extends Container, D extends JComponent>
-    extends LWComponentPeer<T, D>
+    extends LWCanvasPeer<T, D>
     implements ContainerPeer
 {
     // List of child peers sorted by z-order from bottom-most
--- a/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -26,37 +26,26 @@
 
 package sun.lwawt;
 
-import java.awt.Dimension;
-import java.awt.FontMetrics;
 import java.awt.Label;
 import java.awt.peer.LabelPeer;
 
 import javax.swing.JLabel;
 import javax.swing.SwingConstants;
 
-import javax.tools.annotation.GenerateNativeHeader;
-
 /**
  * Lightweight implementation of {@link LabelPeer}. Delegates most of the work
  * to the {@link JLabel}.
  */
-/* No native methods here, but the constants are needed in the supporting JNI code */
-@GenerateNativeHeader
 final class LWLabelPeer extends LWComponentPeer<Label, JLabel>
         implements LabelPeer {
 
-    private static final int TEXT_XPAD = 5;
-    private static final int TEXT_YPAD = 1;
-
     LWLabelPeer(final Label target, final PlatformComponent platformComponent) {
         super(target, platformComponent);
     }
 
     @Override
     protected JLabel createDelegate() {
-        final JLabel label = new JLabel();
-        label.setVerticalAlignment(SwingConstants.TOP);
-        return label;
+        return new JLabel();
     }
 
     @Override
@@ -80,24 +69,6 @@
         }
     }
 
-    @Override
-    public Dimension getMinimumSize() {
-        int w = TEXT_XPAD;
-        int h = TEXT_YPAD;
-        final FontMetrics fm = getFontMetrics(getFont());
-        if (fm != null) {
-            final String text;
-            synchronized (getDelegateLock()) {
-                text = getDelegate().getText();
-            }
-            if (text != null) {
-                w += fm.stringWidth(text);
-            }
-            h += fm.getHeight();
-        }
-        return new Dimension(w, h);
-    }
-
     /**
      * Converts {@code Label} alignment constant to the {@code JLabel} constant.
      * If wrong Label alignment provided returns default alignment.
--- a/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -32,10 +32,22 @@
 import java.awt.peer.ListPeer;
 import java.util.Arrays;
 
-final class LWListPeer
-        extends LWComponentPeer<List, LWListPeer.ScrollableJList>
+/**
+ * Lightweight implementation of {@link ListPeer}.
+ */
+final class LWListPeer extends LWComponentPeer<List, LWListPeer.ScrollableJList>
         implements ListPeer {
 
+    /**
+     * The default number of visible rows.
+     */
+    private static final int DEFAULT_VISIBLE_ROWS = 4; // From java.awt.List,
+
+    /**
+     * This text is used for cell bounds calculation.
+     */
+    private static final String TEXT = "0123456789abcde";
+
     LWListPeer(final List target, final PlatformComponent platformComponent) {
         super(target, platformComponent);
         if (!getTarget().isBackgroundSet()) {
@@ -135,6 +147,16 @@
     }
 
     @Override
+    public Dimension getPreferredSize() {
+        return getMinimumSize();
+    }
+
+    @Override
+    public Dimension getMinimumSize() {
+        return getMinimumSize(DEFAULT_VISIBLE_ROWS);
+    }
+
+    @Override
     public Dimension getPreferredSize(final int rows) {
         return getMinimumSize(rows);
     }
@@ -142,16 +164,26 @@
     @Override
     public Dimension getMinimumSize(final int rows) {
         synchronized (getDelegateLock()) {
-            final int margin = 2;
-            final int space = 1;
+            final Dimension size = getCellSize();
+            size.height *= rows;
+            // Always take vertical scrollbar into account.
+            final JScrollBar vbar = getDelegate().getVerticalScrollBar();
+            size.width += vbar != null ? vbar.getMinimumSize().width : 0;
+            // JScrollPane and JList insets
+            final Insets pi = getDelegate().getInsets();
+            final Insets vi = getDelegate().getView().getInsets();
+            size.width += pi.left + pi.right + vi.left + vi.right;
+            size.height += pi.top + pi.bottom + vi.top + vi.bottom;
+            return size;
+        }
+    }
 
-            // TODO: count ScrollPane's scrolling elements if any.
-            final FontMetrics fm = getFontMetrics(getFont());
-            final int itemHeight = (fm.getHeight() - fm.getLeading()) + (2 * space);
-
-            return new Dimension(20 + (fm == null ? 10 * 15 : fm.stringWidth("0123456789abcde")),
-                    (fm == null ? 10 : itemHeight) * rows + (2 * margin));
-        }
+    private Dimension getCellSize() {
+        final JList<String> jList = getDelegate().getView();
+        final ListCellRenderer<? super String> cr = jList.getCellRenderer();
+        final Component cell = cr.getListCellRendererComponent(jList, TEXT, 0,
+                                                               false, false);
+        return cell.getPreferredSize();
     }
 
     private void revalidate() {
@@ -165,10 +197,10 @@
 
         private boolean skipStateChangedEvent;
 
-        private DefaultListModel<Object> model =
-                new DefaultListModel<Object>() {
+        private final DefaultListModel<String> model =
+                new DefaultListModel<String>() {
                     @Override
-                    public void add(final int index, final Object element) {
+                    public void add(final int index, final String element) {
                         if (index == -1) {
                             addElement(element);
                         } else {
@@ -181,7 +213,7 @@
 
         ScrollableJList() {
             getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
-            final JList<Object> list = new JListDelegate();
+            final JList<String> list = new JListDelegate();
             list.addListSelectionListener(this);
 
             getViewport().setView(list);
@@ -223,11 +255,11 @@
             }
         }
 
-        public JList getView() {
-            return (JList) getViewport().getView();
+        public JList<String> getView() {
+            return (JList<String>) getViewport().getView();
         }
 
-        public DefaultListModel<Object> getModel() {
+        public DefaultListModel<String> getModel() {
             return model;
         }
 
@@ -254,7 +286,7 @@
             }
         }
 
-        private final class JListDelegate extends JList<Object> {
+        private final class JListDelegate extends JList<String> {
 
             JListDelegate() {
                 super(ScrollableJList.this.model);
@@ -272,7 +304,7 @@
                     final int index = locationToIndex(e.getPoint());
                     if (0 <= index && index < getModel().getSize()) {
                         LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED,
-                            getModel().getElementAt(index).toString(), e.getWhen(), e.getModifiers()));
+                            getModel().getElementAt(index), e.getWhen(), e.getModifiers()));
                     }
                 }
             }
@@ -281,10 +313,10 @@
             protected void processKeyEvent(final KeyEvent e) {
                 super.processKeyEvent(e);
                 if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_ENTER) {
-                    final Object selectedValue = getSelectedValue();
+                    final String selectedValue = getSelectedValue();
                     if(selectedValue != null){
                         LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED,
-                            selectedValue.toString(), e.getWhen(), e.getModifiers()));
+                            selectedValue, e.getWhen(), e.getModifiers()));
                     }
                 }
             }
--- a/jdk/src/macosx/classes/sun/lwawt/LWPanelPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWPanelPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -26,7 +26,6 @@
 
 package sun.lwawt;
 
-import java.awt.Dimension;
 import java.awt.Panel;
 import java.awt.peer.PanelPeer;
 
@@ -43,9 +42,4 @@
     public JPanel createDelegate() {
         return new JPanel();
     }
-
-    @Override
-    public Dimension getMinimumSize() {
-        return getBounds().getSize();
-    }
 }
--- a/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,7 +27,6 @@
 package sun.lwawt;
 
 import java.awt.Adjustable;
-import java.awt.Dimension;
 import java.awt.Scrollbar;
 import java.awt.event.AdjustmentEvent;
 import java.awt.event.AdjustmentListener;
@@ -93,13 +92,6 @@
         }
     }
 
-    @Override
-    public Dimension getPreferredSize() {
-        synchronized (getDelegateLock()) {
-            return getDelegate().getPreferredSize();
-        }
-    }
-
     // Peer also registered as a listener for ComponentDelegate component
     @Override
     public void adjustmentValueChanged(final AdjustmentEvent e) {
--- a/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -29,6 +29,7 @@
 import java.awt.Component;
 import java.awt.Cursor;
 import java.awt.Dimension;
+import java.awt.Insets;
 import java.awt.Point;
 import java.awt.TextArea;
 import java.awt.event.TextEvent;
@@ -41,11 +42,22 @@
 import javax.swing.text.Document;
 import javax.swing.text.JTextComponent;
 
+/**
+ * Lightweight implementation of {@link TextAreaPeer}. Delegates most of the
+ * work to the {@link JTextArea} inside JScrollPane.
+ */
 final class LWTextAreaPeer
         extends LWTextComponentPeer<TextArea, LWTextAreaPeer.ScrollableJTextArea>
         implements TextAreaPeer {
 
+    /**
+     * The default number of visible columns.
+     */
     private static final int DEFAULT_COLUMNS = 60;
+
+    /**
+     * The default number of visible rows.
+     */
     private static final int DEFAULT_ROWS = 10;
 
     LWTextAreaPeer(final TextArea target,
@@ -87,26 +99,41 @@
     }
 
     @Override
+    public Dimension getPreferredSize() {
+        return getMinimumSize();
+    }
+
+    @Override
     public Dimension getMinimumSize() {
         return getMinimumSize(DEFAULT_ROWS, DEFAULT_COLUMNS);
     }
 
     @Override
-    public Dimension getMinimumSize(final int rows, final int columns) {
-        return getPreferredSize(rows, columns);
+    public Dimension getPreferredSize(final int rows, final int columns) {
+        return getMinimumSize(rows, columns);
     }
 
     @Override
-    public Dimension getPreferredSize(final int rows, final int columns) {
-        final Dimension size = super.getPreferredSize(rows, columns);
+    public Dimension getMinimumSize(final int rows, final int columns) {
+        final Dimension size = super.getMinimumSize(rows, columns);
         synchronized (getDelegateLock()) {
-            final JScrollBar vbar = getDelegate().getVerticalScrollBar();
-            final JScrollBar hbar = getDelegate().getHorizontalScrollBar();
-            final int scrollbarW = vbar != null ? vbar.getWidth() : 0;
-            final int scrollbarH = hbar != null ? hbar.getHeight() : 0;
-            return new Dimension(size.width + scrollbarW,
-                                 size.height + scrollbarH);
+            // JScrollPane insets
+            final Insets pi = getDelegate().getInsets();
+            size.width += pi.left + pi.right;
+            size.height += pi.top + pi.bottom;
+            // Take scrollbars into account.
+            final int vsbPolicy = getDelegate().getVerticalScrollBarPolicy();
+            if (vsbPolicy == ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS) {
+                final JScrollBar vbar = getDelegate().getVerticalScrollBar();
+                size.width += vbar != null ? vbar.getMinimumSize().width : 0;
+            }
+            final int hsbPolicy = getDelegate().getHorizontalScrollBarPolicy();
+            if (hsbPolicy == ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) {
+                final JScrollBar hbar = getDelegate().getHorizontalScrollBar();
+                size.height += hbar != null ? hbar.getMinimumSize().height : 0;
+            }
         }
+        return size;
     }
 
     @Override
--- a/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -48,10 +48,7 @@
         extends LWComponentPeer<T, D>
         implements DocumentListener, TextComponentPeer, InputMethodListener {
 
-    /**
-     * Character with reasonable value between the minimum width and maximum.
-     */
-    protected static final char WIDE_CHAR = 'w';
+
     private volatile boolean firstChangeSkipped;
 
     LWTextComponentPeer(final T target,
@@ -95,18 +92,16 @@
      */
     abstract JTextComponent getTextComponent();
 
-    public Dimension getPreferredSize(final int rows, final int columns) {
+    public Dimension getMinimumSize(final int rows, final int columns) {
         final Insets insets;
         synchronized (getDelegateLock()) {
-            insets = getDelegate().getInsets();
+            insets = getTextComponent().getInsets();
         }
         final int borderHeight = insets.top + insets.bottom;
         final int borderWidth = insets.left + insets.right;
         final FontMetrics fm = getFontMetrics(getFont());
-        final int charWidth = (fm != null) ? fm.charWidth(WIDE_CHAR) : 10;
-        final int itemHeight = (fm != null) ? fm.getHeight() : 10;
-        return new Dimension(columns * charWidth + borderWidth,
-                             rows * itemHeight + borderHeight);
+        return new Dimension(fm.charWidth(WIDE_CHAR) * columns + borderWidth,
+                             fm.getHeight() * rows + borderHeight);
     }
 
     @Override
@@ -187,6 +182,7 @@
         }
     }
 
+    //TODO IN XAWT we just return true..
     @Override
     public final boolean isFocusable() {
         return getTarget().isFocusable();
--- a/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -37,16 +37,10 @@
 import javax.swing.JPasswordField;
 import javax.swing.text.JTextComponent;
 
-import javax.tools.annotation.GenerateNativeHeader;
-
-/* No native methods here, but the constants are needed in the supporting JNI code */
-@GenerateNativeHeader
 final class LWTextFieldPeer
         extends LWTextComponentPeer<TextField, JPasswordField>
         implements TextFieldPeer, ActionListener {
 
-    private static final int DEFAULT_COLUMNS = 1;
-
     LWTextFieldPeer(final TextField target,
                     final PlatformComponent platformComponent) {
         super(target, platformComponent);
@@ -83,17 +77,12 @@
 
     @Override
     public Dimension getPreferredSize(final int columns) {
-        return getPreferredSize(1, columns);
+        return getMinimumSize(columns);
     }
 
     @Override
     public Dimension getMinimumSize(final int columns) {
-        return getPreferredSize(columns);
-    }
-
-    @Override
-    public Dimension getMinimumSize() {
-        return getMinimumSize(DEFAULT_COLUMNS);
+        return getMinimumSize(1, columns);
     }
 
     @Override
--- a/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java	Wed Jul 05 18:26:11 2017 +0200
@@ -310,7 +310,7 @@
     @Override
     public CanvasPeer createCanvas(Canvas target) {
         PlatformComponent platformComponent = createPlatformComponent();
-        LWCanvasPeer peer = new LWCanvasPeer(target, platformComponent);
+        LWCanvasPeer<?, ?> peer = new LWCanvasPeer<>(target, platformComponent);
         targetCreatedPeer(target, peer);
         peer.initialize();
         return peer;
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java	Wed Jul 05 18:26:11 2017 +0200
@@ -160,6 +160,9 @@
 
             if(isDeadChar){
                 testChar = (char) out[2];
+                if(testChar == 0){
+                    return;
+                }
             }
 
             jkeyCode = out[0];
--- a/jdk/src/macosx/native/apple/security/KeystoreImpl.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/apple/security/KeystoreImpl.m	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -337,7 +337,6 @@
             // Call back to the Java object to create Java objects corresponding to this security object.
             jlong nativeKeyRef = ptr_to_jlong(privateKeyRef);
             JNFCallVoidMethod(env, keyStore, jm_createKeyEntry, alias, creationDate, nativeKeyRef, certRefArray, javaCertArray);
-            break;
         }
     } while (searchResult == noErr);
 
--- a/jdk/src/macosx/native/sun/awt/AWTEvent.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/awt/AWTEvent.m	Wed Jul 05 18:26:11 2017 +0200
@@ -383,6 +383,7 @@
 {
     TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
     CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
+    if (uchr == nil) { return; }
     const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);
     // Carbon modifiers should be used instead of NSEvent modifiers
     UInt32 modifierKeyState = (GetCurrentEventKeyModifiers() >> 8) & 0xFF;
@@ -563,18 +564,18 @@
     const struct _nsKeyToJavaModifier* cur;
 
     for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
-        jint mask = isExtMods? cur->javaExtMask : cur->javaMask; 
+        jint mask = isExtMods? cur->javaExtMask : cur->javaMask;
         if ((mask & javaModifiers) != 0) {
             nsFlags |= cur->nsMask;
         }
     }
 
     // special case
-    jint mask = isExtMods? java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK : 
+    jint mask = isExtMods? java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK :
                            java_awt_event_InputEvent_ALT_GRAPH_MASK;
 
     if ((mask & javaModifiers) != 0) {
-        nsFlags |= NSAlternateKeyMask;      
+        nsFlags |= NSAlternateKeyMask;
     }
 
     return nsFlags;
--- a/jdk/src/macosx/native/sun/awt/AWTView.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/awt/AWTView.m	Wed Jul 05 18:26:11 2017 +0200
@@ -279,7 +279,10 @@
         return;
     }
 
-    if (![self hasMarkedText] && fKeyEventsNeeded) {
+    NSString *eventCharacters = [event characters];
+    BOOL isDeadKey = (eventCharacters != nil && [eventCharacters length] == 0);
+
+    if ((![self hasMarkedText] && fKeyEventsNeeded) || isDeadKey) {
         [self deliverJavaKeyEventHelper: event];
     }
 
--- a/jdk/src/macosx/native/sun/awt/CTextPipe.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/awt/CTextPipe.m	Wed Jul 05 18:26:11 2017 +0200
@@ -142,8 +142,11 @@
     // get our baseline transform and font
     CGContextRef cgRef = qsdo->cgRef;
     CGAffineTransform ctmText = CGContextGetTextMatrix(cgRef);
-    //CGFontRef cgFont = CGContextGetFont(cgRef);
 
+    /* Save and restore of graphics context is done before the iteration.  
+       This seems to work using our test case (see bug ID 7158350) so we are restoring it at
+       the end of the for loop.  If we find out that save/restore outside the loop
+       doesn't work on all cases then we will move the Save/Restore inside the loop.*/
     CGContextSaveGState(cgRef);
     CGAffineTransform invTx = CGAffineTransformInvert(strike->fTx);
 
@@ -210,13 +213,9 @@
         pt.x += advances[i].width;
         pt.y += advances[i].height;
 
-        // reset the font on the context after striking a unicode with CoreText
-        if (uniChar != 0)
-        {
-           // CGContextSetFont(cgRef, cgFont);
-            CGContextSaveGState(cgRef);
-        }
     }
+    // reset the font on the context after striking a unicode with CoreText
+    CGContextRestoreGState(cgRef);
 }
 
 // Using the Quartz Surface Data context, draw a hot-substituted character run
--- a/jdk/src/macosx/native/sun/awt/InitIDs.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/awt/InitIDs.m	Wed Jul 05 18:26:11 2017 +0200
@@ -47,7 +47,10 @@
 {
 }
 
-
+JNIEXPORT void JNICALL Java_java_awt_Choice_initIDs
+(JNIEnv *env, jclass cls)
+{
+}
 
 JNIEXPORT void JNICALL Java_java_awt_Color_initIDs
 (JNIEnv *env, jclass cls)
--- a/jdk/src/macosx/native/sun/awt/LWCToolkit.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/awt/LWCToolkit.m	Wed Jul 05 18:26:11 2017 +0200
@@ -33,6 +33,7 @@
 #import "ThreadUtilities.h"
 #import "AWT_debug.h"
 #import "CSystemColors.h"
+#import  "NSApplicationAWT.h"
 
 #import "sun_lwawt_macosx_LWCToolkit.h"
 
@@ -47,7 +48,7 @@
     return eventCount;
 }
 
-+ (void) eventCountPlusPlus{
++ (void) eventCountPlusPlus{    
     eventCount++;
 }
 
@@ -79,7 +80,6 @@
 
 @end
 
-
 /*
  * Class:     sun_lwawt_macosx_LWCToolkit
  * Method:    nativeSyncQueue
@@ -90,12 +90,22 @@
 {
     int currentEventNum = [AWTToolkit getEventCount];
 
-    [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){}];
-
+    NSApplication* sharedApp = [NSApplication sharedApplication];
+    if ([sharedApp isKindOfClass:[NSApplicationAWT class]]) {
+        NSApplicationAWT* theApp = (NSApplicationAWT*)sharedApp;
+        [theApp postDummyEvent];
+        [theApp waitForDummyEvent];
+    } else {
+        // could happen if we are embedded inside SWT application,
+        // in this case just spin a single empty block through 
+        // the event loop to give it a chance to process pending events
+        [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){}];
+    }
+    
     if (([AWTToolkit getEventCount] - currentEventNum) != 0) {
         return JNI_TRUE;
     }
-
+        
     return JNI_FALSE;
 }
 
--- a/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.h	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.h	Wed Jul 05 18:26:11 2017 +0200
@@ -29,11 +29,15 @@
 @interface NSApplicationAWT : NSApplication {
     NSString *fApplicationName;
     NSWindow *eventTransparentWindow;
+    NSTimeInterval dummyEventTimestamp;
+    NSConditionLock* seenDummyEventLock;
 }
 
 - (void) finishLaunching;
 - (void) registerWithProcessManager;
 - (void) setDockIconWithEnv:(JNIEnv *)env;
+- (void) postDummyEvent;
+- (void) waitForDummyEvent;
 
 + (void) runAWTLoopWithApp:(NSApplication*)app;
 
--- a/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.m	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.m	Wed Jul 05 18:26:11 2017 +0200
@@ -31,6 +31,7 @@
 #import "PropertiesUtilities.h"
 #import "ThreadUtilities.h"
 #import "QueuingApplicationDelegate.h"
+#import "AWTIconData.h"
 
 
 static BOOL sUsingDefaultNIB = YES;
@@ -52,6 +53,9 @@
 
 AWT_ASSERT_APPKIT_THREAD;
     fApplicationName = nil;
+    dummyEventTimestamp = 0.0;
+    seenDummyEventLock = nil;
+
 
     // NSApplication will call _RegisterApplication with the application's bundle, but there may not be one.
     // So, we need to call it ourselves to ensure the app is set up properly.
@@ -255,25 +259,26 @@
         theIconPath = [PropertiesUtilities javaSystemPropertyForKey:@"apple.awt.application.icon" withEnv:env];
     }
 
-    // If the icon file wasn't specified as an argument and we need to get an icon
-    // we'll use the generic java app icon.
-    NSString *defaultIconPath = [NSString stringWithFormat:@"%@%@", SHARED_FRAMEWORK_BUNDLE, @"/Resources/GenericApp.icns"];
-    if (theIconPath == nil) {
+    // Use the path specified to get the icon image
+    NSImage* iconImage = nil;
+    if (theIconPath != nil) {
+        iconImage = [[NSImage alloc] initWithContentsOfFile:theIconPath];
+    } 
+
+    // If no icon file was specified or we failed to get the icon image
+    // and there is no bundle's icon, then use the default icon
+    if (iconImage == nil) {
         NSString* bundleIcon = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIconFile"];
         if (bundleIcon == nil) {
-            theIconPath = defaultIconPath;
+            NSData* iconData;
+            iconData = [[NSData alloc] initWithBytesNoCopy: sAWTIconData length: sizeof(sAWTIconData) freeWhenDone: NO];
+            iconImage = [[NSImage alloc] initWithData: iconData];
+            [iconData release];
         }
     }
 
-    // Set up the dock icon if we have an icon name.
-    if (theIconPath != nil) {
-        NSImage *iconImage = [[NSImage alloc] initWithContentsOfFile:theIconPath];
-
-        // If we failed for some reason fall back to the default icon.
-        if (iconImage == nil) {
-            iconImage = [[NSImage alloc] initWithContentsOfFile:defaultIconPath];
-        }
-
+    // Set up the dock icon if we have an icon image.
+    if (iconImage != nil) {
         [NSApp setApplicationIconImage:iconImage];
         [iconImage release];
     }
@@ -328,6 +333,45 @@
     return event;
 }
 
+// NSTimeInterval has microseconds precision
+#define TS_EQUAL(ts1, ts2) (fabs((ts1) - (ts2)) < 1e-6)
+
+- (void)sendEvent:(NSEvent *)event
+{
+    if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp)) {
+        [seenDummyEventLock lockWhenCondition:NO];
+        [seenDummyEventLock unlockWithCondition:YES];
+    } else {
+        [super sendEvent:event];
+    }
+}
+
+- (void)postDummyEvent {
+    seenDummyEventLock = [[NSConditionLock alloc] initWithCondition:NO];
+    dummyEventTimestamp = [NSProcessInfo processInfo].systemUptime;
+    
+    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
+    NSEvent* event = [NSEvent otherEventWithType: NSApplicationDefined
+                                        location: NSMakePoint(0,0)
+                                   modifierFlags: 0
+                                       timestamp: dummyEventTimestamp
+                                    windowNumber: 0
+                                         context: nil
+                                         subtype: 0
+                                           data1: 0
+                                           data2: 0];
+    [NSApp postEvent: event atStart: NO];
+    [pool drain];
+}
+
+- (void)waitForDummyEvent {
+    [seenDummyEventLock lockWhenCondition:YES];
+    [seenDummyEventLock unlock];
+    [seenDummyEventLock release];
+
+    seenDummyEventLock = nil;
+}
+
 @end
 
 
Binary file jdk/src/macosx/native/sun/osxapp/resource/icons/JavaApp.icns has changed
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1064,12 +1064,17 @@
 
             if (storeKey) {
                 if (encKeys == null) {
-                    if (!privCredSet.contains(ktab)) {
-                        privCredSet.add(ktab);
-                        // Compatibility; also add keys to privCredSet
-                        for (KerberosKey key: ktab.getKeys(kerbClientPrinc)) {
-                            privCredSet.add(new Krb5Util.KeysFromKeyTab(key));
+                    if (ktab != null) {
+                        if (!privCredSet.contains(ktab)) {
+                            privCredSet.add(ktab);
+                            // Compatibility; also add keys to privCredSet
+                            for (KerberosKey key: ktab.getKeys(kerbClientPrinc)) {
+                                privCredSet.add(new Krb5Util.KeysFromKeyTab(key));
+                            }
                         }
+                    } else {
+                        succeeded = false;
+                        throw new LoginException("No key to store");
                     }
                 } else {
                     for (int i = 0; i < kerbKeys.length; i ++) {
--- a/jdk/src/share/classes/java/awt/Choice.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/awt/Choice.java	Wed Jul 05 18:26:11 2017 +0200
@@ -104,7 +104,16 @@
     /*
      * JDK 1.1 serialVersionUID
      */
-     private static final long serialVersionUID = -4075310674757313071L;
+    private static final long serialVersionUID = -4075310674757313071L;
+
+    static {
+        /* ensure that the necessary native libraries are loaded */
+        Toolkit.loadLibraries();
+        /* initialize JNI field and method ids */
+        if (!GraphicsEnvironment.isHeadless()) {
+            initIDs();
+        }
+    }
 
     /**
      * Creates a new choice menu. The menu initially has no items in it.
@@ -711,6 +720,10 @@
       }
     }
 
+    /**
+     * Initialize JNI field and method IDs
+     */
+    private static native void initIDs();
 
 /////////////////
 // Accessibility support
--- a/jdk/src/share/classes/java/io/FilePermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/io/FilePermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -76,7 +76,7 @@
  * <P>
  * Be careful when granting FilePermissions. Think about the implications
  * of granting read and especially write access to various files and
- * directories. The "&lt;&lt;ALL FILES>>" permission with write action is
+ * directories. The "&lt;&lt;ALL FILES&gt;&gt;" permission with write action is
  * especially dangerous. This grants permission to write to the entire
  * file system. One thing this effectively allows is replacement of the
  * system binary, including the JVM runtime environment.
@@ -180,9 +180,7 @@
      * @param mask the actions mask to use.
      *
      */
-    private void init(int mask)
-    {
-
+    private void init(int mask) {
         if ((mask & ALL) != mask)
                 throw new IllegalArgumentException("invalid actions mask");
 
@@ -274,9 +272,7 @@
      *          If actions is <code>null</code>, empty or contains an action
      *          other than the specified possible actions.
      */
-
-    public FilePermission(String path, String actions)
-    {
+    public FilePermission(String path, String actions) {
         super(path);
         init(getMask(actions));
     }
@@ -293,8 +289,7 @@
      */
 
     // package private for use by the FilePermissionCollection add method
-    FilePermission(String path, int mask)
-    {
+    FilePermission(String path, int mask) {
         super(path);
         init(mask);
     }
@@ -337,7 +332,6 @@
      * this FilePermission's path also implies that FilePermission's path.
      *
      * @param that the FilePermission to check against.
-     * @param exact return immediately if the masks are not equal
      * @return the effective mask
      */
     boolean impliesIgnoreMask(FilePermission that) {
@@ -412,7 +406,6 @@
      *
      * @return a hash code value for this object.
      */
-
     public int hashCode() {
         return this.cpath.hashCode();
     }
@@ -424,7 +417,6 @@
      * @return the actions mask.
      */
     private static int getMask(String actions) {
-
         int mask = NONE;
 
         // Null action valid?
@@ -552,7 +544,6 @@
      *
      * @return the actions mask.
      */
-
     int getMask() {
         return mask;
     }
@@ -564,8 +555,7 @@
      *
      * @return the canonical string representation of the actions.
      */
-    private static String getActions(int mask)
-    {
+    private static String getActions(int mask) {
         StringBuilder sb = new StringBuilder();
         boolean comma = false;
 
@@ -610,15 +600,13 @@
      *
      * @return the canonical string representation of the actions.
      */
-    public String getActions()
-    {
+    public String getActions() {
         if (actions == null)
             actions = getActions(this.mask);
 
         return actions;
     }
 
-
     /**
      * Returns a new PermissionCollection object for storing FilePermission
      * objects.
@@ -650,7 +638,6 @@
      * @return a new PermissionCollection object suitable for storing
      * FilePermissions.
      */
-
     public PermissionCollection newPermissionCollection() {
         return new FilePermissionCollection();
     }
@@ -712,22 +699,20 @@
  */
 
 final class FilePermissionCollection extends PermissionCollection
-implements Serializable {
-
+    implements Serializable
+{
     // Not serialized; see serialization section at end of class
     private transient List<Permission> perms;
 
     /**
-     * Create an empty FilePermissions object.
-     *
+     * Create an empty FilePermissionCollection object.
      */
-
     public FilePermissionCollection() {
         perms = new ArrayList<>();
     }
 
     /**
-     * Adds a permission to the FilePermissions. The key for the hash is
+     * Adds a permission to the FilePermissionCollection. The key for the hash is
      * permission.path.
      *
      * @param permission the Permission object to add.
@@ -738,9 +723,7 @@
      * @exception SecurityException - if this FilePermissionCollection object
      *                                has been marked readonly
      */
-
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (! (permission instanceof FilePermission))
             throw new IllegalArgumentException("invalid permission: "+
                                                permission);
@@ -757,16 +740,14 @@
      * Check and see if this set of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
-
-    public boolean implies(Permission permission)
-    {
+    public boolean implies(Permission permission) {
         if (! (permission instanceof FilePermission))
-                return false;
+            return false;
 
         FilePermission fp = (FilePermission) permission;
 
@@ -795,7 +776,6 @@
      *
      * @return an enumeration of all the FilePermission objects.
      */
-
     public Enumeration<Permission> elements() {
         // Convert Iterator into Enumeration
         synchronized (this) {
@@ -841,8 +821,9 @@
     /*
      * Reads in a Vector of FilePermissions and saves them in the perms field.
      */
-    private void readObject(ObjectInputStream in) throws IOException,
-    ClassNotFoundException {
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
         // Don't call defaultReadObject()
 
         // Read in serialized fields
--- a/jdk/src/share/classes/java/io/ObjectOutputStream.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/io/ObjectOutputStream.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, 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
@@ -484,7 +484,7 @@
      * stream.  The state is reset to be the same as a new ObjectOutputStream.
      * The current point in the stream is marked as reset so the corresponding
      * ObjectInputStream will be reset at the same point.  Objects previously
-     * written to the stream will not be refered to as already being in the
+     * written to the stream will not be referred to as already being in the
      * stream.  They will be written to the stream again.
      *
      * @throws  IOException if reset() is invoked while serializing an object.
--- a/jdk/src/share/classes/java/io/PrintWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/io/PrintWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -784,7 +784,7 @@
      *         <tt>null</tt> argument depends on the <a
      *         href="../util/Formatter.html#syntax">conversion</a>.
      *
-     * @throws  IllegalFormatException
+     * @throws  java.util.IllegalFormatException
      *          If a format string contains an illegal syntax, a format
      *          specifier that is incompatible with the given arguments,
      *          insufficient arguments given the format string, or other
@@ -835,7 +835,7 @@
      *         <tt>null</tt> argument depends on the <a
      *         href="../util/Formatter.html#syntax">conversion</a>.
      *
-     * @throws  IllegalFormatException
+     * @throws  java.util.IllegalFormatException
      *          If a format string contains an illegal syntax, a format
      *          specifier that is incompatible with the given arguments,
      *          insufficient arguments given the format string, or other
@@ -879,7 +879,7 @@
      *         <tt>null</tt> argument depends on the <a
      *         href="../util/Formatter.html#syntax">conversion</a>.
      *
-     * @throws  IllegalFormatException
+     * @throws  java.util.IllegalFormatException
      *          If a format string contains an illegal syntax, a format
      *          specifier that is incompatible with the given arguments,
      *          insufficient arguments given the format string, or other
@@ -939,7 +939,7 @@
      *         <tt>null</tt> argument depends on the <a
      *         href="../util/Formatter.html#syntax">conversion</a>.
      *
-     * @throws  IllegalFormatException
+     * @throws  java.util.IllegalFormatException
      *          If a format string contains an illegal syntax, a format
      *          specifier that is incompatible with the given arguments,
      *          insufficient arguments given the format string, or other
--- a/jdk/src/share/classes/java/io/Reader.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/io/Reader.java	Wed Jul 05 18:26:11 2017 +0200
@@ -91,7 +91,7 @@
      *         -1 if this source of characters is at its end
      * @throws IOException if an I/O error occurs
      * @throws NullPointerException if target is null
-     * @throws ReadOnlyBufferException if target is a read only buffer
+     * @throws java.nio.ReadOnlyBufferException if target is a read only buffer
      * @since 1.5
      */
     public int read(java.nio.CharBuffer target) throws IOException {
--- a/jdk/src/share/classes/java/lang/Class.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/Class.java	Wed Jul 05 18:26:11 2017 +0200
@@ -2970,7 +2970,7 @@
     /**
      * Returns a map from simple name to enum constant.  This package-private
      * method is used internally by Enum to implement
-     *     public static <T extends Enum<T>> T valueOf(Class<T>, String)
+     * {@code public static <T extends Enum<T>> T valueOf(Class<T>, String)}
      * efficiently.  Note that the map is returned by this method is
      * created lazily on first use.  Typically it won't ever get created.
      */
--- a/jdk/src/share/classes/java/lang/InheritableThreadLocal.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/InheritableThreadLocal.java	Wed Jul 05 18:26:11 2017 +0200
@@ -76,7 +76,6 @@
      *
      * @param t the current thread
      * @param firstValue value for the initial entry of the table.
-     * @param map the map to store.
      */
     void createMap(Thread t, T firstValue) {
         t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
--- a/jdk/src/share/classes/java/lang/Integer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/Integer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -752,7 +752,7 @@
      * -128 and 127 (inclusive) as required by JLS.
      *
      * The cache is initialized on first usage.  The size of the cache
-     * may be controlled by the -XX:AutoBoxCacheMax=<size> option.
+     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
      * During VM initialization, java.lang.Integer.IntegerCache.high property
      * may be set and saved in the private system properties in the
      * sun.misc.VM class.
--- a/jdk/src/share/classes/java/lang/Package.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/Package.java	Wed Jul 05 18:26:11 2017 +0200
@@ -316,7 +316,7 @@
      * attributes are defined in the manifests that accompany
      * the classes.
      *
-     * @param class the class to get the package of.
+     * @param c the class to get the package of.
      * @return the package of the class. It may be null if no package
      *          information is available from the archive or codebase.  */
     static Package getPackage(Class<?> c) {
@@ -411,14 +411,13 @@
     /**
      * Construct a package instance with the specified version
      * information.
-     * @param pkgName the name of the package
+     * @param name the name of the package
      * @param spectitle the title of the specification
      * @param specversion the version of the specification
      * @param specvendor the organization that maintains the specification
      * @param impltitle the title of the implementation
      * @param implversion the version of the implementation
      * @param implvendor the organization that maintains the implementation
-     * @return a new package for containing the specified information.
      */
     Package(String name,
             String spectitle, String specversion, String specvendor,
--- a/jdk/src/share/classes/java/lang/StrictMath.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/StrictMath.java	Wed Jul 05 18:26:11 2017 +0200
@@ -365,7 +365,7 @@
      * @param a the value to be floored or ceiled
      * @param negativeBoundary result for values in (-1, 0)
      * @param positiveBoundary result for values in (0, 1)
-     * @param increment value to add when the argument is non-integral
+     * @param sign the sign of the result
      */
     private static double floorOrCeil(double a,
                                       double negativeBoundary,
@@ -811,7 +811,7 @@
      * @param value the long value
      * @return the argument as an int
      * @throws ArithmeticException if the {@code argument} overflows an int
-     * @see Math#toIntExact(int)
+     * @see Math#toIntExact(long)
      * @since 1.8
      */
     public static int toIntExact(long value) {
--- a/jdk/src/share/classes/java/lang/String.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/String.java	Wed Jul 05 18:26:11 2017 +0200
@@ -2782,7 +2782,7 @@
      *         <tt>null</tt> argument depends on the <a
      *         href="../util/Formatter.html#syntax">conversion</a>.
      *
-     * @throws  IllegalFormatException
+     * @throws  java.util.IllegalFormatException
      *          If a format string contains an illegal syntax, a format
      *          specifier that is incompatible with the given arguments,
      *          insufficient arguments given the format string, or other
@@ -2826,7 +2826,7 @@
      *         <tt>null</tt> argument depends on the <a
      *         href="../util/Formatter.html#syntax">conversion</a>.
      *
-     * @throws  IllegalFormatException
+     * @throws  java.util.IllegalFormatException
      *          If a format string contains an illegal syntax, a format
      *          specifier that is incompatible with the given arguments,
      *          insufficient arguments given the format string, or other
--- a/jdk/src/share/classes/java/lang/System.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/System.java	Wed Jul 05 18:26:11 2017 +0200
@@ -545,7 +545,7 @@
      * <tr><td><code>java.version</code></td>
      *     <td>Java Runtime Environment version</td></tr>
      * <tr><td><code>java.vendor</code></td>
-     *     <td>Java Runtime Environment vendor</td></tr
+     *     <td>Java Runtime Environment vendor</td></tr>
      * <tr><td><code>java.vendor.url</code></td>
      *     <td>Java vendor URL</td></tr>
      * <tr><td><code>java.home</code></td>
--- a/jdk/src/share/classes/java/lang/ThreadGroup.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/ThreadGroup.java	Wed Jul 05 18:26:11 2017 +0200
@@ -918,9 +918,6 @@
      *
      * @param  t
      *         the Thread whose start method was invoked
-     *
-     * @param  failed
-     *         true if the thread could not be started successfully
      */
     void threadStartFailed(Thread t) {
         synchronized(this) {
--- a/jdk/src/share/classes/java/lang/ThreadLocal.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/ThreadLocal.java	Wed Jul 05 18:26:11 2017 +0200
@@ -47,8 +47,8 @@
  *     private static final AtomicInteger nextId = new AtomicInteger(0);
  *
  *     // Thread local variable containing each thread's ID
- *     private static final ThreadLocal&lt;Integer> threadId =
- *         new ThreadLocal&lt;Integer>() {
+ *     private static final ThreadLocal&lt;Integer&gt; threadId =
+ *         new ThreadLocal&lt;Integer&gt;() {
  *             &#64;Override protected Integer initialValue() {
  *                 return nextId.getAndIncrement();
  *         }
@@ -222,7 +222,6 @@
      *
      * @param t the current thread
      * @param firstValue value for the initial entry of the map
-     * @param map the map to store.
      */
     void createMap(Thread t, T firstValue) {
         t.threadLocals = new ThreadLocalMap(this, firstValue);
--- a/jdk/src/share/classes/java/lang/management/ThreadInfo.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/lang/management/ThreadInfo.java	Wed Jul 05 18:26:11 2017 +0200
@@ -147,8 +147,9 @@
      * @param waitedCount   Number of times waited on a lock
      * @param waitedTime    Approx time waited on a lock
      * @param stackTrace    Thread stack trace
-     * @param lockedMonitors List of locked monitors
-     * @param lockedSynchronizers List of locked synchronizers
+     * @param monitors      List of locked monitors
+     * @param stackDepths   List of stack depths
+     * @param synchronizers List of locked synchronizers
      */
     private ThreadInfo(Thread t, int state, Object lockObj, Thread lockOwner,
                        long blockedCount, long blockedTime,
--- a/jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -48,11 +48,6 @@
     protected InetAddress connectedAddress = null;
     private int connectedPort = -1;
 
-    /* cached socket options */
-    private int multicastInterface = 0;
-    private boolean loopbackMode = true;
-    private int ttl = -1;
-
     private static final String os = AccessController.doPrivileged(
         new sun.security.action.GetPropertyAction("os.name")
     );
@@ -104,7 +99,7 @@
     /**
      * Sends a datagram packet. The packet contains the data and the
      * destination address to send the packet to.
-     * @param packet to be sent.
+     * @param p the packet to be sent.
      */
     protected abstract void send(DatagramPacket p) throws IOException;
 
@@ -135,13 +130,13 @@
 
     /**
      * Peek at the packet to see who it is from.
-     * @param return the address which the packet came from.
+     * @param i the address to populate with the sender address
      */
     protected abstract int peek(InetAddress i) throws IOException;
     protected abstract int peekData(DatagramPacket p) throws IOException;
     /**
      * Receive the datagram packet.
-     * @param Packet Received.
+     * @param p the packet to receive into
      */
     protected synchronized void receive(DatagramPacket p)
         throws IOException {
@@ -153,7 +148,7 @@
 
     /**
      * Set the TTL (time-to-live) option.
-     * @param TTL to be set.
+     * @param ttl TTL to be set.
      */
     protected abstract void setTimeToLive(int ttl) throws IOException;
 
@@ -164,7 +159,7 @@
 
     /**
      * Set the TTL (time-to-live) option.
-     * @param TTL to be set.
+     * @param ttl TTL to be set.
      */
     @Deprecated
     protected abstract void setTTL(byte ttl) throws IOException;
@@ -177,7 +172,7 @@
 
     /**
      * Join the multicast group.
-     * @param multicast address to join.
+     * @param inetaddr multicast address to join.
      */
     protected void join(InetAddress inetaddr) throws IOException {
         join(inetaddr, null);
@@ -185,14 +180,14 @@
 
     /**
      * Leave the multicast group.
-     * @param multicast address to leave.
+     * @param inetaddr multicast address to leave.
      */
     protected void leave(InetAddress inetaddr) throws IOException {
         leave(inetaddr, null);
     }
     /**
      * Join the multicast group.
-     * @param multicast address to join.
+     * @param mcastaddr multicast address to join.
      * @param netIf specifies the local interface to receive multicast
      *        datagram packets
      * @throws  IllegalArgumentException if mcastaddr is null or is a
@@ -212,7 +207,7 @@
 
     /**
      * Leave the multicast group.
-     * @param multicast address to leave.
+     * @param mcastaddr  multicast address to leave.
      * @param netIf specified the local interface to leave the group at
      * @throws  IllegalArgumentException if mcastaddr is null or is a
      *          SocketAddress subclass not supported by this socket
--- a/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -368,7 +368,7 @@
     /**
      * Binds the socket to the specified address of the specified local port.
      * @param address the address
-     * @param port the port
+     * @param lport the port
      */
     protected synchronized void bind(InetAddress address, int lport)
         throws IOException
--- a/jdk/src/share/classes/java/net/DatagramSocket.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/DatagramSocket.java	Wed Jul 05 18:26:11 2017 +0200
@@ -105,7 +105,7 @@
      * Connects this socket to a remote socket address (IP address + port number).
      * Binds socket if not already bound.
      * <p>
-     * @param   addr    The remote address.
+     * @param   address The remote address.
      * @param   port    The remote port
      * @throws  SocketException if binding the socket fails.
      */
--- a/jdk/src/share/classes/java/net/Inet4Address.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/Inet4Address.java	Wed Jul 05 18:26:11 2017 +0200
@@ -177,7 +177,6 @@
      * a loopback address; or false otherwise.
      * @since 1.4
      */
-    private static final int loopback = 2130706433; /* 127.0.0.1 */
     public boolean isLoopbackAddress() {
         /* 127.x.x.x */
         byte[] byteAddr = getAddress();
--- a/jdk/src/share/classes/java/net/SocketInputStream.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/SocketInputStream.java	Wed Jul 05 18:26:11 2017 +0200
@@ -112,7 +112,7 @@
      * <i>length</i> bytes of data.
      * @param b the buffer into which the data is read
      * @param off the start offset of the data
-     * @param len the maximum number of bytes read
+     * @param length the maximum number of bytes read
      * @return the actual number of bytes read, -1 is
      *          returned when the end of the stream is reached.
      * @exception IOException If an I/O error has occurred.
@@ -209,7 +209,7 @@
 
     /**
      * Skips n bytes of input.
-     * @param n the number of bytes to skip
+     * @param numbytes the number of bytes to skip
      * @return  the actual number of bytes skipped.
      * @exception IOException If an I/O error has occurred.
      */
--- a/jdk/src/share/classes/java/net/SocketPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/SocketPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -138,7 +138,7 @@
  */
 
 public final class SocketPermission extends Permission
-implements java.io.Serializable
+    implements java.io.Serializable
 {
     private static final long serialVersionUID = -7204263841984476862L;
 
@@ -232,8 +232,7 @@
         trustNameService = tmp.booleanValue();
     }
 
-    private static synchronized Debug getDebug()
-    {
+    private static synchronized Debug getDebug() {
         if (!debugInit) {
             debug = Debug.getInstance("access");
             debugInit = true;
@@ -288,8 +287,7 @@
         defaultDeny = true;
     }
 
-    private static String getHost(String host)
-    {
+    private static String getHost(String host) {
         if (host.equals("")) {
             return "localhost";
         } else {
@@ -679,8 +677,8 @@
     }
 
     private boolean authorizedIPv4(String cname, byte[] addr) {
-            String authHost = "";
-            InetAddress auth;
+        String authHost = "";
+        InetAddress auth;
 
         try {
             authHost = "auth." +
@@ -708,8 +706,8 @@
     }
 
     private boolean authorizedIPv6(String cname, byte[] addr) {
-            String authHost = "";
-            InetAddress auth;
+        String authHost = "";
+        InetAddress auth;
 
         try {
             StringBuffer sb = new StringBuffer(39);
@@ -810,7 +808,6 @@
      * @return true if the specified permission is implied by this object,
      * false if not.
      */
-
     public boolean implies(Permission p) {
         int i,j;
 
@@ -844,12 +841,11 @@
      *      to find a match based on the IP addresses in both objects.
      * <li> Attempt to match on the canonical hostnames of both objects.
      * </ul>
-     * @param p the incoming permission request
+     * @param that the incoming permission request
      *
      * @return true if "permission" is a proper subset of the current object,
      * false if not.
      */
-
     boolean impliesIgnoreMask(SocketPermission that) {
         int i,j;
 
@@ -1229,7 +1225,7 @@
  */
 
 final class SocketPermissionCollection extends PermissionCollection
-implements Serializable
+    implements Serializable
 {
     // Not serialized; see serialization section at end of class
     private transient List<SocketPermission> perms;
@@ -1255,9 +1251,7 @@
      * @exception SecurityException - if this SocketPermissionCollection object
      *                                has been marked readonly
      */
-
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (! (permission instanceof SocketPermission))
             throw new IllegalArgumentException("invalid permission: "+
                                                permission);
@@ -1276,7 +1270,7 @@
      * Check and see if this collection of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if "permission" is a proper subset of a permission in
      * the collection, false if not.
@@ -1369,8 +1363,9 @@
     /*
      * Reads in a Vector of SocketPermissions and saves them in the perms field.
      */
-    private void readObject(ObjectInputStream in) throws IOException,
-    ClassNotFoundException {
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
         // Don't call in.defaultReadObject()
 
         // Read in serialized fields
--- a/jdk/src/share/classes/java/net/SocksSocketImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/SocksSocketImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -644,7 +644,7 @@
      * means "accept incoming connection from", so the SocketAddress is the
      * the one of the host we do accept connection from.
      *
-     * @param      addr   the Socket address of the remote host.
+     * @param      saddr   the Socket address of the remote host.
      * @exception  IOException  if an I/O error occurs when binding this socket.
      */
     protected synchronized void socksBind(InetSocketAddress saddr) throws IOException {
--- a/jdk/src/share/classes/java/net/URLConnection.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/net/URLConnection.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1241,10 +1241,9 @@
 
     /**
      * Gets the Content Handler appropriate for this connection.
-     * @param connection the connection to use.
      */
     synchronized ContentHandler getContentHandler()
-    throws UnknownServiceException
+        throws UnknownServiceException
     {
         String contentType = stripOffParameters(getContentType());
         ContentHandler handler = null;
--- a/jdk/src/share/classes/java/nio/X-Buffer.java.template	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/X-Buffer.java.template	Wed Jul 05 18:26:11 2017 +0200
@@ -741,6 +741,8 @@
     public $Type$Buffer put($Type$Buffer src) {
         if (src == this)
             throw new IllegalArgumentException();
+        if (isReadOnly())
+            throw new ReadOnlyBufferException();
         int n = src.remaining();
         if (n > remaining())
             throw new BufferOverflowException();
@@ -888,6 +890,8 @@
      */
     public $Type$Buffer put(String src, int start, int end) {
         checkBounds(start, end - start, src.length());
+        if (isReadOnly())
+            throw new ReadOnlyBufferException();
         if (end - start > remaining())
             throw new BufferOverflowException();
         for (int i = start; i < end; i++)
--- a/jdk/src/share/classes/java/nio/channels/Channels.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/channels/Channels.java	Wed Jul 05 18:26:11 2017 +0200
@@ -84,7 +84,7 @@
     /**
      * Write all remaining bytes in buffer to the given channel.
      *
-     * @throws  IllegalBlockingException
+     * @throws  IllegalBlockingModeException
      *          If the channel is selectable and configured non-blocking.
      */
     private static void writeFully(WritableByteChannel ch, ByteBuffer bb)
--- a/jdk/src/share/classes/java/nio/file/FileSystem.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/file/FileSystem.java	Wed Jul 05 18:26:11 2017 +0200
@@ -347,7 +347,7 @@
      *   <td><tt>C:&#92;&#92;*</tt>
      *   <td>Matches <tt>C:&#92;foo</tt> and <tt>C:&#92;bar</tt> on the Windows
      *   platform (note that the backslash is escaped; as a string literal in the
-     *   Java Language the pattern would be <tt>"C:&#92;&#92;&#92;&#92*"</tt>) </td>
+     *   Java Language the pattern would be <tt>"C:&#92;&#92;&#92;&#92;*"</tt>) </td>
      * </tr>
      *
      * </table>
--- a/jdk/src/share/classes/java/nio/file/Files.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/file/Files.java	Wed Jul 05 18:26:11 2017 +0200
@@ -510,7 +510,7 @@
      * <pre>
      *     DirectoryStream.Filter&lt;Path&gt; filter = new DirectoryStream.Filter&lt;Path&gt;() {
      *         public boolean accept(Path file) throws IOException {
-     *             return (Files.size(file) > 8192L);
+     *             return (Files.size(file) &gt; 8192L);
      *         }
      *     };
      *     Path dir = ...
@@ -1592,7 +1592,7 @@
      *     Path path = ...
      *     AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);
      *     if (view != null) {
-     *         List&lt;AclEntry&gt acl = view.getAcl();
+     *         List&lt;AclEntry&gt; acl = view.getAcl();
      *         :
      *     }
      * </pre>
--- a/jdk/src/share/classes/java/nio/file/Path.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/file/Path.java	Wed Jul 05 18:26:11 2017 +0200
@@ -522,7 +522,7 @@
      *
      * @return  a {@code Path} object representing the absolute path
      *
-     * @throws  IOError
+     * @throws  java.io.IOError
      *          if an I/O error occurs
      * @throws  SecurityException
      *          In the case of the default provider, a security manager
--- a/jdk/src/share/classes/java/nio/file/attribute/AclFileAttributeView.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/file/attribute/AclFileAttributeView.java	Wed Jul 05 18:26:11 2017 +0200
@@ -85,7 +85,7 @@
  *         .build();
  *
  *     // read ACL, insert ACE, re-write ACL
- *     List&lt;AclEntry&gt acl = view.getAcl();
+ *     List&lt;AclEntry&gt; acl = view.getAcl();
  *     acl.add(0, entry);   // insert before any DENY entries
  *     view.setAcl(acl);
  * </pre>
--- a/jdk/src/share/classes/java/nio/file/attribute/FileTime.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/nio/file/attribute/FileTime.java	Wed Jul 05 18:26:11 2017 +0200
@@ -310,7 +310,7 @@
         private final long days;
 
         /**
-         * The excess (in nanoseconds); can be negative if days <= 0.
+         * The excess (in nanoseconds); can be negative if days &lt;= 0.
          */
         private final long excessNanos;
 
--- a/jdk/src/share/classes/java/security/AllPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/security/AllPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -62,9 +62,7 @@
     /**
      * Creates a new AllPermission object.
      */
-
-    public AllPermission()
-    {
+    public AllPermission() {
         super("<all permissions>");
     }
 
@@ -77,8 +75,7 @@
      * @param name ignored
      * @param actions ignored.
      */
-    public AllPermission(String name, String actions)
-    {
+    public AllPermission(String name, String actions) {
         this();
     }
 
@@ -120,8 +117,7 @@
      *
      * @return the actions.
      */
-    public String getActions()
-    {
+    public String getActions() {
         return "<all actions>";
     }
 
@@ -133,7 +129,6 @@
      * @return a new PermissionCollection object suitable for
      * storing AllPermissions.
      */
-
     public PermissionCollection newPermissionCollection() {
         return new AllPermissionCollection();
     }
@@ -157,8 +152,8 @@
  */
 
 final class AllPermissionCollection
-extends PermissionCollection
-implements java.io.Serializable
+    extends PermissionCollection
+    implements java.io.Serializable
 {
 
     // use serialVersionUID from JDK 1.2.2 for interoperability
@@ -188,8 +183,7 @@
      *                                has been marked readonly
      */
 
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (! (permission instanceof AllPermission))
             throw new IllegalArgumentException("invalid permission: "+
                                                permission);
@@ -203,13 +197,12 @@
      * Check and see if this set of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return always returns true.
      */
 
-    public boolean implies(Permission permission)
-    {
+    public boolean implies(Permission permission) {
         return all_allowed; // No sync; staleness OK
     }
 
@@ -219,8 +212,7 @@
      *
      * @return an enumeration of all the AllPermission objects.
      */
-    public Enumeration<Permission> elements()
-    {
+    public Enumeration<Permission> elements() {
         return new Enumeration<Permission>() {
             private boolean hasMore = all_allowed;
 
--- a/jdk/src/share/classes/java/security/BasicPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/security/BasicPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -68,7 +68,7 @@
  */
 
 public abstract class BasicPermission extends Permission
-implements java.io.Serializable
+    implements java.io.Serializable
 {
 
     private static final long serialVersionUID = 6279438298436773498L;
@@ -84,10 +84,8 @@
 
     /**
      * initialize a BasicPermission object. Common to all constructors.
-     *
      */
-    private void init(String name)
-    {
+    private void init(String name) {
         if (name == null)
             throw new NullPointerException("name can't be null");
 
@@ -129,9 +127,7 @@
      * @throws NullPointerException if <code>name</code> is <code>null</code>.
      * @throws IllegalArgumentException if <code>name</code> is empty.
      */
-
-    public BasicPermission(String name)
-    {
+    public BasicPermission(String name) {
         super(name);
         init(name);
     }
@@ -148,8 +144,7 @@
      * @throws NullPointerException if <code>name</code> is <code>null</code>.
      * @throws IllegalArgumentException if <code>name</code> is empty.
      */
-    public BasicPermission(String name, String actions)
-    {
+    public BasicPermission(String name, String actions) {
         super(name);
         init(name);
     }
@@ -238,8 +233,7 @@
      *
      * @return the empty string "".
      */
-    public String getActions()
-    {
+    public String getActions() {
         return "";
     }
 
@@ -296,7 +290,6 @@
  *
  * @see java.security.Permission
  * @see java.security.Permissions
- * @see java.security.PermissionsImpl
  *
  *
  * @author Roland Schemers
@@ -305,8 +298,8 @@
  */
 
 final class BasicPermissionCollection
-extends PermissionCollection
-implements java.io.Serializable
+    extends PermissionCollection
+    implements java.io.Serializable
 {
 
     private static final long serialVersionUID = 739301742472979399L;
@@ -360,9 +353,7 @@
      * @exception SecurityException - if this BasicPermissionCollection object
      *                                has been marked readonly
      */
-
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (! (permission instanceof BasicPermission))
             throw new IllegalArgumentException("invalid permission: "+
                                                permission);
@@ -398,16 +389,14 @@
      * Check and see if this set of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
-
-    public boolean implies(Permission permission)
-    {
+    public boolean implies(Permission permission) {
         if (! (permission instanceof BasicPermission))
-                return false;
+            return false;
 
         BasicPermission bp = (BasicPermission) permission;
 
@@ -468,7 +457,6 @@
      *
      * @return an enumeration of all the BasicPermission objects.
      */
-
     public Enumeration<Permission> elements() {
         // Convert Iterator of Map values into an Enumeration
         synchronized (this) {
--- a/jdk/src/share/classes/java/security/CodeSource.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/security/CodeSource.java	Wed Jul 05 18:26:11 2017 +0200
@@ -207,7 +207,7 @@
      * Returns the code signers associated with this CodeSource.
      * <p>
      * If this CodeSource object was created using the
-     * {@link #CodeSource(URL url, Certificate[] certs)}
+     * {@link #CodeSource(URL url, java.security.cert.Certificate[] certs)}
      * constructor then its certificate chains are extracted and used to
      * create an array of CodeSigner objects. Note that only X.509 certificates
      * are examined - all other certificate types are ignored.
--- a/jdk/src/share/classes/java/security/KeyStore.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/security/KeyStore.java	Wed Jul 05 18:26:11 2017 +0200
@@ -32,6 +32,7 @@
 import java.util.*;
 import javax.crypto.SecretKey;
 
+import javax.security.auth.DestroyFailedException;
 import javax.security.auth.callback.*;
 
 /**
@@ -278,8 +279,7 @@
          * @exception DestroyFailedException if this method was unable
          *      to clear the password
          */
-        public synchronized void destroy()
-                throws javax.security.auth.DestroyFailedException {
+        public synchronized void destroy() throws DestroyFailedException {
             destroyed = true;
             if (password != null) {
                 Arrays.fill(password, ' ');
--- a/jdk/src/share/classes/java/security/cert/PKIXRevocationChecker.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/security/cert/PKIXRevocationChecker.java	Wed Jul 05 18:26:11 2017 +0200
@@ -50,7 +50,7 @@
  * status of certificates with OCSP and CRLs. By default, OCSP is the
  * preferred mechanism for checking revocation status, with CRLs as the
  * fallback mechanism. However, this preference can be switched to CRLs with
- * the {@link Option.PREFER_CRLS} option.
+ * the {@link Option#PREFER_CRLS PREFER_CRLS} option.
  *
  * <p>A {@code PKIXRevocationChecker} is obtained by calling the
  * {@link CertPathValidator#getRevocationChecker getRevocationChecker} method
--- a/jdk/src/share/classes/java/sql/CallableStatement.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/sql/CallableStatement.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1562,7 +1562,7 @@
      * @param parameterName the name of the parameter
      * @return the parameter value in full precision.  If the value is
      * SQL <code>NULL</code>, the result is <code>null</code>.
-     * @exception SQLExceptionif parameterName does not correspond to a named
+     * @exception SQLException if parameterName does not correspond to a named
      * parameter;  if a database access error occurs or
      * this method is called on a closed <code>CallableStatement</code>
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
--- a/jdk/src/share/classes/java/text/CollationElementIterator.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/CollationElementIterator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -119,7 +119,7 @@
      * on the predefined collation rules.  If the source string is empty,
      * NULLORDER will be returned on the calls to next().
      * @param sourceText the source string.
-     * @param order the collation object.
+     * @param owner the collation object.
      */
     CollationElementIterator(String sourceText, RuleBasedCollator owner) {
         this.owner = owner;
@@ -137,7 +137,7 @@
      * on the predefined collation rules.  If the source string is empty,
      * NULLORDER will be returned on the calls to next().
      * @param sourceText the source string.
-     * @param order the collation object.
+     * @param owner the collation object.
      */
     CollationElementIterator(CharacterIterator sourceText, RuleBasedCollator owner) {
         this.owner = owner;
--- a/jdk/src/share/classes/java/text/DecimalFormat.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/DecimalFormat.java	Wed Jul 05 18:26:11 2017 +0200
@@ -529,9 +529,25 @@
     @Override
     public StringBuffer format(double number, StringBuffer result,
                                FieldPosition fieldPosition) {
-        fieldPosition.setBeginIndex(0);
-        fieldPosition.setEndIndex(0);
-
+        // If fieldPosition is a DontCareFieldPosition instance we can
+        // try to go to fast-path code.
+        boolean tryFastPath = false;
+        if (fieldPosition == DontCareFieldPosition.INSTANCE)
+            tryFastPath = true;
+        else {
+            fieldPosition.setBeginIndex(0);
+            fieldPosition.setEndIndex(0);
+        }
+
+        if (tryFastPath) {
+            String tempResult = fastFormat(number);
+            if (tempResult != null) {
+                result.append(tempResult);
+                return result;
+            }
+        }
+
+        // if fast-path could not work, we fallback to standard code.
         return format(number, result, fieldPosition.getFieldDelegate());
     }
 
@@ -869,6 +885,720 @@
         return delegate.getIterator(sb.toString());
     }
 
+    // ==== Begin fast-path formating logic for double =========================
+
+    /* Fast-path formatting will be used for format(double ...) methods iff a
+     * number of conditions are met (see checkAndSetFastPathStatus()):
+     * - Only if instance properties meet the right predefined conditions.
+     * - The abs value of the double to format is <= Integer.MAX_VALUE.
+     *
+     * The basic approach is to split the binary to decimal conversion of a
+     * double value into two phases:
+     * * The conversion of the integer portion of the double.
+     * * The conversion of the fractional portion of the double
+     *   (limited to two or three digits).
+     *
+     * The isolation and conversion of the integer portion of the double is
+     * straightforward. The conversion of the fraction is more subtle and relies
+     * on some rounding properties of double to the decimal precisions in
+     * question.  Using the terminology of BigDecimal, this fast-path algorithm
+     * is applied when a double value has a magnitude less than Integer.MAX_VALUE
+     * and rounding is to nearest even and the destination format has two or
+     * three digits of *scale* (digits after the decimal point).
+     *
+     * Under a rounding to nearest even policy, the returned result is a digit
+     * string of a number in the (in this case decimal) destination format
+     * closest to the exact numerical value of the (in this case binary) input
+     * value.  If two destination format numbers are equally distant, the one
+     * with the last digit even is returned.  To compute such a correctly rounded
+     * value, some information about digits beyond the smallest returned digit
+     * position needs to be consulted.
+     *
+     * In general, a guard digit, a round digit, and a sticky *bit* are needed
+     * beyond the returned digit position.  If the discarded portion of the input
+     * is sufficiently large, the returned digit string is incremented.  In round
+     * to nearest even, this threshold to increment occurs near the half-way
+     * point between digits.  The sticky bit records if there are any remaining
+     * trailing digits of the exact input value in the new format; the sticky bit
+     * is consulted only in close to half-way rounding cases.
+     *
+     * Given the computation of the digit and bit values, rounding is then
+     * reduced to a table lookup problem.  For decimal, the even/odd cases look
+     * like this:
+     *
+     * Last   Round   Sticky
+     * 6      5       0      => 6   // exactly halfway, return even digit.
+     * 6      5       1      => 7   // a little bit more than halfway, round up.
+     * 7      5       0      => 8   // exactly halfway, round up to even.
+     * 7      5       1      => 8   // a little bit more than halfway, round up.
+     * With analogous entries for other even and odd last-returned digits.
+     *
+     * However, decimal negative powers of 5 smaller than 0.5 are *not* exactly
+     * representable as binary fraction.  In particular, 0.005 (the round limit
+     * for a two-digit scale) and 0.0005 (the round limit for a three-digit
+     * scale) are not representable. Therefore, for input values near these cases
+     * the sticky bit is known to be set which reduces the rounding logic to:
+     *
+     * Last   Round   Sticky
+     * 6      5       1      => 7   // a little bit more than halfway, round up.
+     * 7      5       1      => 8   // a little bit more than halfway, round up.
+     *
+     * In other words, if the round digit is 5, the sticky bit is known to be
+     * set.  If the round digit is something other than 5, the sticky bit is not
+     * relevant.  Therefore, some of the logic about whether or not to increment
+     * the destination *decimal* value can occur based on tests of *binary*
+     * computations of the binary input number.
+     */
+
+    /**
+     * Check validity of using fast-path for this instance. If fast-path is valid
+     * for this instance, sets fast-path state as true and initializes fast-path
+     * utility fields as needed.
+     *
+     * This method is supposed to be called rarely, otherwise that will break the
+     * fast-path performance. That means avoiding frequent changes of the
+     * properties of the instance, since for most properties, each time a change
+     * happens, a call to this method is needed at the next format call.
+     *
+     * FAST-PATH RULES:
+     *  Similar to the default DecimalFormat instantiation case.
+     *  More precisely:
+     *  - HALF_EVEN rounding mode,
+     *  - isGroupingUsed() is true,
+     *  - groupingSize of 3,
+     *  - multiplier is 1,
+     *  - Decimal separator not mandatory,
+     *  - No use of exponential notation,
+     *  - minimumIntegerDigits is exactly 1 and maximumIntegerDigits at least 10
+     *  - For number of fractional digits, the exact values found in the default case:
+     *     Currency : min = max = 2.
+     *     Decimal  : min = 0. max = 3.
+     *
+     */
+    private void checkAndSetFastPathStatus() {
+
+        boolean fastPathWasOn = isFastPath;
+
+        if ((roundingMode == RoundingMode.HALF_EVEN) &&
+            (isGroupingUsed()) &&
+            (groupingSize == 3) &&
+            (multiplier == 1) &&
+            (!decimalSeparatorAlwaysShown) &&
+            (!useExponentialNotation)) {
+
+            // The fast-path algorithm is semi-hardcoded against
+            //  minimumIntegerDigits and maximumIntegerDigits.
+            isFastPath = ((minimumIntegerDigits == 1) &&
+                          (maximumIntegerDigits >= 10));
+
+            // The fast-path algorithm is hardcoded against
+            //  minimumFractionDigits and maximumFractionDigits.
+            if (isFastPath) {
+                if (isCurrencyFormat) {
+                    if ((minimumFractionDigits != 2) ||
+                        (maximumFractionDigits != 2))
+                        isFastPath = false;
+                } else if ((minimumFractionDigits != 0) ||
+                           (maximumFractionDigits != 3))
+                    isFastPath = false;
+            }
+        } else
+            isFastPath = false;
+
+        // Since some instance properties may have changed while still falling
+        // in the fast-path case, we need to reinitialize fastPathData anyway.
+        if (isFastPath) {
+            // We need to instantiate fastPathData if not already done.
+            if (fastPathData == null)
+                fastPathData = new FastPathData();
+
+            // Sets up the locale specific constants used when formatting.
+            // '0' is our default representation of zero.
+            fastPathData.zeroDelta = symbols.getZeroDigit() - '0';
+            fastPathData.groupingChar = symbols.getGroupingSeparator();
+
+            // Sets up fractional constants related to currency/decimal pattern.
+            fastPathData.fractionalMaxIntBound = (isCurrencyFormat) ? 99 : 999;
+            fastPathData.fractionalScaleFactor = (isCurrencyFormat) ? 100.0d : 1000.0d;
+
+            // Records the need for adding prefix or suffix
+            fastPathData.positiveAffixesRequired =
+                (positivePrefix.length() != 0) || (positiveSuffix.length() != 0);
+            fastPathData.negativeAffixesRequired =
+                (negativePrefix.length() != 0) || (negativeSuffix.length() != 0);
+
+            // Creates a cached char container for result, with max possible size.
+            int maxNbIntegralDigits = 10;
+            int maxNbGroups = 3;
+            int containerSize =
+                Math.max(positivePrefix.length(), negativePrefix.length()) +
+                maxNbIntegralDigits + maxNbGroups + 1 + maximumFractionDigits +
+                Math.max(positiveSuffix.length(), negativeSuffix.length());
+
+            fastPathData.fastPathContainer = new char[containerSize];
+
+            // Sets up prefix and suffix char arrays constants.
+            fastPathData.charsPositiveSuffix = positiveSuffix.toCharArray();
+            fastPathData.charsNegativeSuffix = negativeSuffix.toCharArray();
+            fastPathData.charsPositivePrefix = positivePrefix.toCharArray();
+            fastPathData.charsNegativePrefix = negativePrefix.toCharArray();
+
+            // Sets up fixed index positions for integral and fractional digits.
+            // Sets up decimal point in cached result container.
+            int longestPrefixLength =
+                Math.max(positivePrefix.length(), negativePrefix.length());
+            int decimalPointIndex =
+                maxNbIntegralDigits + maxNbGroups + longestPrefixLength;
+
+            fastPathData.integralLastIndex    = decimalPointIndex - 1;
+            fastPathData.fractionalFirstIndex = decimalPointIndex + 1;
+            fastPathData.fastPathContainer[decimalPointIndex] =
+                isCurrencyFormat ?
+                symbols.getMonetaryDecimalSeparator() :
+                symbols.getDecimalSeparator();
+
+        } else if (fastPathWasOn) {
+            // Previous state was fast-path and is no more.
+            // Resets cached array constants.
+            fastPathData.fastPathContainer = null;
+            fastPathData.charsPositiveSuffix = null;
+            fastPathData.charsNegativeSuffix = null;
+            fastPathData.charsPositivePrefix = null;
+            fastPathData.charsNegativePrefix = null;
+        }
+
+        fastPathCheckNeeded = false;
+    }
+
+    /**
+     * Returns true if rounding-up must be done on {@code scaledFractionalPartAsInt},
+     * false otherwise.
+     *
+     * This is a utility method that takes correct half-even rounding decision on
+     * passed fractional value at the scaled decimal point (2 digits for currency
+     * case and 3 for decimal case), when the approximated fractional part after
+     * scaled decimal point is exactly 0.5d.  This is done by means of exact
+     * calculations on the {@code fractionalPart} floating-point value.
+     *
+     * This method is supposed to be called by private {@code fastDoubleFormat}
+     * method only.
+     *
+     * The algorithms used for the exact calculations are :
+     *
+     * The <b><i>FastTwoSum</i></b> algorithm, from T.J.Dekker, described in the
+     * papers  "<i>A  Floating-Point   Technique  for  Extending  the  Available
+     * Precision</i>"  by Dekker, and  in "<i>Adaptive  Precision Floating-Point
+     * Arithmetic and Fast Robust Geometric Predicates</i>" from J.Shewchuk.
+     *
+     * A modified version of <b><i>Sum2S</i></b> cascaded summation described in
+     * "<i>Accurate Sum and Dot Product</i>" from Takeshi Ogita and All.  As
+     * Ogita says in this paper this is an equivalent of the Kahan-Babuska's
+     * summation algorithm because we order the terms by magnitude before summing
+     * them. For this reason we can use the <i>FastTwoSum</i> algorithm rather
+     * than the more expensive Knuth's <i>TwoSum</i>.
+     *
+     * We do this to avoid a more expensive exact "<i>TwoProduct</i>" algorithm,
+     * like those described in Shewchuk's paper above. See comments in the code
+     * below.
+     *
+     * @param  fractionalPart The  fractional value  on which  we  take rounding
+     * decision.
+     * @param scaledFractionalPartAsInt The integral part of the scaled
+     * fractional value.
+     *
+     * @return the decision that must be taken regarding half-even rounding.
+     */
+    private boolean exactRoundUp(double fractionalPart,
+                                 int scaledFractionalPartAsInt) {
+
+        /* exactRoundUp() method is called by fastDoubleFormat() only.
+         * The precondition expected to be verified by the passed parameters is :
+         * scaledFractionalPartAsInt ==
+         *     (int) (fractionalPart * fastPathData.fractionalScaleFactor).
+         * This is ensured by fastDoubleFormat() code.
+         */
+
+        /* We first calculate roundoff error made by fastDoubleFormat() on
+         * the scaled fractional part. We do this with exact calculation on the
+         * passed fractionalPart. Rounding decision will then be taken from roundoff.
+         */
+
+        /* ---- TwoProduct(fractionalPart, scale factor (i.e. 1000.0d or 100.0d)).
+         *
+         * The below is an optimized exact "TwoProduct" calculation of passed
+         * fractional part with scale factor, using Ogita's Sum2S cascaded
+         * summation adapted as Kahan-Babuska equivalent by using FastTwoSum
+         * (much faster) rather than Knuth's TwoSum.
+         *
+         * We can do this because we order the summation from smallest to
+         * greatest, so that FastTwoSum can be used without any additional error.
+         *
+         * The "TwoProduct" exact calculation needs 17 flops. We replace this by
+         * a cascaded summation of FastTwoSum calculations, each involving an
+         * exact multiply by a power of 2.
+         *
+         * Doing so saves overall 4 multiplications and 1 addition compared to
+         * using traditional "TwoProduct".
+         *
+         * The scale factor is either 100 (currency case) or 1000 (decimal case).
+         * - when 1000, we replace it by (1024 - 16 - 8) = 1000.
+         * - when 100,  we replace it by (128  - 32 + 4) =  100.
+         * Every multiplication by a power of 2 (1024, 128, 32, 16, 8, 4) is exact.
+         *
+         */
+        double approxMax;    // Will always be positive.
+        double approxMedium; // Will always be negative.
+        double approxMin;
+
+        double fastTwoSumApproximation = 0.0d;
+        double fastTwoSumRoundOff = 0.0d;
+        double bVirtual = 0.0d;
+
+        if (isCurrencyFormat) {
+            // Scale is 100 = 128 - 32 + 4.
+            // Multiply by 2**n is a shift. No roundoff. No error.
+            approxMax    = fractionalPart * 128.00d;
+            approxMedium = - (fractionalPart * 32.00d);
+            approxMin    = fractionalPart * 4.00d;
+        } else {
+            // Scale is 1000 = 1024 - 16 - 8.
+            // Multiply by 2**n is a shift. No roundoff. No error.
+            approxMax    = fractionalPart * 1024.00d;
+            approxMedium = - (fractionalPart * 16.00d);
+            approxMin    = - (fractionalPart * 8.00d);
+        }
+
+        // Shewchuk/Dekker's FastTwoSum(approxMedium, approxMin).
+        assert(-approxMedium >= Math.abs(approxMin));
+        fastTwoSumApproximation = approxMedium + approxMin;
+        bVirtual = fastTwoSumApproximation - approxMedium;
+        fastTwoSumRoundOff = approxMin - bVirtual;
+        double approxS1 = fastTwoSumApproximation;
+        double roundoffS1 = fastTwoSumRoundOff;
+
+        // Shewchuk/Dekker's FastTwoSum(approxMax, approxS1);
+        assert(approxMax >= Math.abs(approxS1));
+        fastTwoSumApproximation = approxMax + approxS1;
+        bVirtual = fastTwoSumApproximation - approxMax;
+        fastTwoSumRoundOff = approxS1 - bVirtual;
+        double roundoff1000 = fastTwoSumRoundOff;
+        double approx1000 = fastTwoSumApproximation;
+        double roundoffTotal = roundoffS1 + roundoff1000;
+
+        // Shewchuk/Dekker's FastTwoSum(approx1000, roundoffTotal);
+        assert(approx1000 >= Math.abs(roundoffTotal));
+        fastTwoSumApproximation = approx1000 + roundoffTotal;
+        bVirtual = fastTwoSumApproximation - approx1000;
+
+        // Now we have got the roundoff for the scaled fractional
+        double scaledFractionalRoundoff = roundoffTotal - bVirtual;
+
+        // ---- TwoProduct(fractionalPart, scale (i.e. 1000.0d or 100.0d)) end.
+
+        /* ---- Taking the rounding decision
+         *
+         * We take rounding decision based on roundoff and half-even rounding
+         * rule.
+         *
+         * The above TwoProduct gives us the exact roundoff on the approximated
+         * scaled fractional, and we know that this approximation is exactly
+         * 0.5d, since that has already been tested by the caller
+         * (fastDoubleFormat).
+         *
+         * Decision comes first from the sign of the calculated exact roundoff.
+         * - Since being exact roundoff, it cannot be positive with a scaled
+         *   fractional less than 0.5d, as well as negative with a scaled
+         *   fractional greater than 0.5d. That leaves us with following 3 cases.
+         * - positive, thus scaled fractional == 0.500....0fff ==> round-up.
+         * - negative, thus scaled fractional == 0.499....9fff ==> don't round-up.
+         * - is zero,  thus scaled fractioanl == 0.5 ==> half-even rounding applies :
+         *    we round-up only if the integral part of the scaled fractional is odd.
+         *
+         */
+        if (scaledFractionalRoundoff > 0.0) {
+            return true;
+        } else if (scaledFractionalRoundoff < 0.0) {
+            return false;
+        } else if ((scaledFractionalPartAsInt & 1) != 0) {
+            return true;
+        }
+
+        return false;
+
+        // ---- Taking the rounding decision end
+    }
+
+    /**
+     * Collects integral digits from passed {@code number}, while setting
+     * grouping chars as needed. Updates {@code firstUsedIndex} accordingly.
+     *
+     * Loops downward starting from {@code backwardIndex} position (inclusive).
+     *
+     * @param number  The int value from which we collect digits.
+     * @param digitsBuffer The char array container where digits and grouping chars
+     *  are stored.
+     * @param backwardIndex the position from which we start storing digits in
+     *  digitsBuffer.
+     *
+     */
+    private void collectIntegralDigits(int number,
+                                       char[] digitsBuffer,
+                                       int backwardIndex) {
+        int index = backwardIndex;
+        int q;
+        int r;
+        while (number > 999) {
+            // Generates 3 digits per iteration.
+            q = number / 1000;
+            r = number - (q << 10) + (q << 4) + (q << 3); // -1024 +16 +8 = 1000.
+            number = q;
+
+            digitsBuffer[index--] = DigitArrays.DigitOnes1000[r];
+            digitsBuffer[index--] = DigitArrays.DigitTens1000[r];
+            digitsBuffer[index--] = DigitArrays.DigitHundreds1000[r];
+            digitsBuffer[index--] = fastPathData.groupingChar;
+        }
+
+        // Collects last 3 or less digits.
+        digitsBuffer[index] = DigitArrays.DigitOnes1000[number];
+        if (number > 9) {
+            digitsBuffer[--index]  = DigitArrays.DigitTens1000[number];
+            if (number > 99)
+                digitsBuffer[--index]   = DigitArrays.DigitHundreds1000[number];
+        }
+
+        fastPathData.firstUsedIndex = index;
+    }
+
+    /**
+     * Collects the 2 (currency) or 3 (decimal) fractional digits from passed
+     * {@code number}, starting at {@code startIndex} position
+     * inclusive.  There is no punctuation to set here (no grouping chars).
+     * Updates {@code fastPathData.lastFreeIndex} accordingly.
+     *
+     *
+     * @param number  The int value from which we collect digits.
+     * @param digitsBuffer The char array container where digits are stored.
+     * @param startIndex the position from which we start storing digits in
+     *  digitsBuffer.
+     *
+     */
+    private void collectFractionalDigits(int number,
+                                         char[] digitsBuffer,
+                                         int startIndex) {
+        int index = startIndex;
+
+        char digitOnes = DigitArrays.DigitOnes1000[number];
+        char digitTens = DigitArrays.DigitTens1000[number];
+
+        if (isCurrencyFormat) {
+            // Currency case. Always collects fractional digits.
+            digitsBuffer[index++] = digitTens;
+            digitsBuffer[index++] = digitOnes;
+        } else if (number != 0) {
+            // Decimal case. Hundreds will always be collected
+            digitsBuffer[index++] = DigitArrays.DigitHundreds1000[number];
+
+            // Ending zeros won't be collected.
+            if (digitOnes != '0') {
+                digitsBuffer[index++] = digitTens;
+                digitsBuffer[index++] = digitOnes;
+            } else if (digitTens != '0')
+                digitsBuffer[index++] = digitTens;
+
+        } else
+            // This is decimal pattern and fractional part is zero.
+            // We must remove decimal point from result.
+            index--;
+
+        fastPathData.lastFreeIndex = index;
+    }
+
+    /**
+     * Internal utility.
+     * Adds the passed {@code prefix} and {@code suffix} to {@code container}.
+     *
+     * @param container  Char array container which to prepend/append the
+     *  prefix/suffix.
+     * @param prefix     Char sequence to prepend as a prefix.
+     * @param suffix     Char sequence to append as a suffix.
+     *
+     */
+    //    private void addAffixes(boolean isNegative, char[] container) {
+    private void addAffixes(char[] container, char[] prefix, char[] suffix) {
+
+        // We add affixes only if needed (affix length > 0).
+        int pl = prefix.length;
+        int sl = suffix.length;
+        if (pl != 0) prependPrefix(prefix, pl, container);
+        if (sl != 0) appendSuffix(suffix, sl, container);
+
+    }
+
+    /**
+     * Prepends the passed {@code prefix} chars to given result
+     * {@code container}.  Updates {@code fastPathData.firstUsedIndex}
+     * accordingly.
+     *
+     * @param prefix The prefix characters to prepend to result.
+     * @param len The number of chars to prepend.
+     * @param container Char array container which to prepend the prefix
+     */
+    private void prependPrefix(char[] prefix,
+                               int len,
+                               char[] container) {
+
+        fastPathData.firstUsedIndex -= len;
+        int startIndex = fastPathData.firstUsedIndex;
+
+        // If prefix to prepend is only 1 char long, just assigns this char.
+        // If prefix is less or equal 4, we use a dedicated algorithm that
+        //  has shown to run faster than System.arraycopy.
+        // If more than 4, we use System.arraycopy.
+        if (len == 1)
+            container[startIndex] = prefix[0];
+        else if (len <= 4) {
+            int dstLower = startIndex;
+            int dstUpper = dstLower + len - 1;
+            int srcUpper = len - 1;
+            container[dstLower] = prefix[0];
+            container[dstUpper] = prefix[srcUpper];
+
+            if (len > 2)
+                container[++dstLower] = prefix[1];
+            if (len == 4)
+                container[--dstUpper] = prefix[2];
+        } else
+            System.arraycopy(prefix, 0, container, startIndex, len);
+    }
+
+    /**
+     * Appends the passed {@code suffix} chars to given result
+     * {@code container}.  Updates {@code fastPathData.lastFreeIndex}
+     * accordingly.
+     *
+     * @param suffix The suffix characters to append to result.
+     * @param len The number of chars to append.
+     * @param container Char array container which to append the suffix
+     */
+    private void appendSuffix(char[] suffix,
+                              int len,
+                              char[] container) {
+
+        int startIndex = fastPathData.lastFreeIndex;
+
+        // If suffix to append is only 1 char long, just assigns this char.
+        // If suffix is less or equal 4, we use a dedicated algorithm that
+        //  has shown to run faster than System.arraycopy.
+        // If more than 4, we use System.arraycopy.
+        if (len == 1)
+            container[startIndex] = suffix[0];
+        else if (len <= 4) {
+            int dstLower = startIndex;
+            int dstUpper = dstLower + len - 1;
+            int srcUpper = len - 1;
+            container[dstLower] = suffix[0];
+            container[dstUpper] = suffix[srcUpper];
+
+            if (len > 2)
+                container[++dstLower] = suffix[1];
+            if (len == 4)
+                container[--dstUpper] = suffix[2];
+        } else
+            System.arraycopy(suffix, 0, container, startIndex, len);
+
+        fastPathData.lastFreeIndex += len;
+    }
+
+    /**
+     * Converts digit chars from {@code digitsBuffer} to current locale.
+     *
+     * Must be called before adding affixes since we refer to
+     * {@code fastPathData.firstUsedIndex} and {@code fastPathData.lastFreeIndex},
+     * and do not support affixes (for speed reason).
+     *
+     * We loop backward starting from last used index in {@code fastPathData}.
+     *
+     * @param digitsBuffer The char array container where the digits are stored.
+     */
+    private void localizeDigits(char[] digitsBuffer) {
+
+        // We will localize only the digits, using the groupingSize,
+        // and taking into account fractional part.
+
+        // First take into account fractional part.
+        int digitsCounter =
+            fastPathData.lastFreeIndex - fastPathData.fractionalFirstIndex;
+
+        // The case when there is no fractional digits.
+        if (digitsCounter < 0)
+            digitsCounter = groupingSize;
+
+        // Only the digits remains to localize.
+        for (int cursor = fastPathData.lastFreeIndex - 1;
+             cursor >= fastPathData.firstUsedIndex;
+             cursor--) {
+            if (digitsCounter != 0) {
+                // This is a digit char, we must localize it.
+                digitsBuffer[cursor] += fastPathData.zeroDelta;
+                digitsCounter--;
+            } else {
+                // Decimal separator or grouping char. Reinit counter only.
+                digitsCounter = groupingSize;
+            }
+        }
+    }
+
+    /**
+     * This is the main entry point for the fast-path format algorithm.
+     *
+     * At this point we are sure to be in the expected conditions to run it.
+     * This algorithm builds the formatted result and puts it in the dedicated
+     * {@code fastPathData.fastPathContainer}.
+     *
+     * @param d the double value to be formatted.
+     * @param negative Flag precising if {@code d} is negative.
+     */
+    private void fastDoubleFormat(double d,
+                                  boolean negative) {
+
+        char[] container = fastPathData.fastPathContainer;
+
+        /*
+         * The principle of the algorithm is to :
+         * - Break the passed double into its integral and fractional parts
+         *    converted into integers.
+         * - Then decide if rounding up must be applied or not by following
+         *    the half-even rounding rule, first using approximated scaled
+         *    fractional part.
+         * - For the difficult cases (approximated scaled fractional part
+         *    being exactly 0.5d), we refine the rounding decision by calling
+         *    exactRoundUp utility method that both calculates the exact roundoff
+         *    on the approximation and takes correct rounding decision.
+         * - We round-up the fractional part if needed, possibly propagating the
+         *    rounding to integral part if we meet a "all-nine" case for the
+         *    scaled fractional part.
+         * - We then collect digits from the resulting integral and fractional
+         *   parts, also setting the required grouping chars on the fly.
+         * - Then we localize the collected digits if needed, and
+         * - Finally prepend/append prefix/suffix if any is needed.
+         */
+
+        // Exact integral part of d.
+        int integralPartAsInt = (int) d;
+
+        // Exact fractional part of d (since we subtract it's integral part).
+        double exactFractionalPart = d - (double) integralPartAsInt;
+
+        // Approximated scaled fractional part of d (due to multiplication).
+        double scaledFractional =
+            exactFractionalPart * fastPathData.fractionalScaleFactor;
+
+        // Exact integral part of scaled fractional above.
+        int fractionalPartAsInt = (int) scaledFractional;
+
+        // Exact fractional part of scaled fractional above.
+        scaledFractional = scaledFractional - (double) fractionalPartAsInt;
+
+        // Only when scaledFractional is exactly 0.5d do we have to do exact
+        // calculations and take fine-grained rounding decision, since
+        // approximated results above may lead to incorrect decision.
+        // Otherwise comparing against 0.5d (strictly greater or less) is ok.
+        boolean roundItUp = false;
+        if (scaledFractional >= 0.5d) {
+            if (scaledFractional == 0.5d)
+                // Rounding need fine-grained decision.
+                roundItUp = exactRoundUp(exactFractionalPart, fractionalPartAsInt);
+            else
+                roundItUp = true;
+
+            if (roundItUp) {
+                // Rounds up both fractional part (and also integral if needed).
+                if (fractionalPartAsInt < fastPathData.fractionalMaxIntBound) {
+                    fractionalPartAsInt++;
+                } else {
+                    // Propagates rounding to integral part since "all nines" case.
+                    fractionalPartAsInt = 0;
+                    integralPartAsInt++;
+                }
+            }
+        }
+
+        // Collecting digits.
+        collectFractionalDigits(fractionalPartAsInt, container,
+                                fastPathData.fractionalFirstIndex);
+        collectIntegralDigits(integralPartAsInt, container,
+                              fastPathData.integralLastIndex);
+
+        // Localizing digits.
+        if (fastPathData.zeroDelta != 0)
+            localizeDigits(container);
+
+        // Adding prefix and suffix.
+        if (negative) {
+            if (fastPathData.negativeAffixesRequired)
+                addAffixes(container,
+                           fastPathData.charsNegativePrefix,
+                           fastPathData.charsNegativeSuffix);
+        } else if (fastPathData.positiveAffixesRequired)
+            addAffixes(container,
+                       fastPathData.charsPositivePrefix,
+                       fastPathData.charsPositiveSuffix);
+    }
+
+    /**
+     * A fast-path shortcut of format(double) to be called by NumberFormat, or by
+     * format(double, ...) public methods.
+     *
+     * If instance can be applied fast-path and passed double is not NaN or
+     * Infinity, is in the integer range, we call {@code fastDoubleFormat}
+     * after changing {@code d} to its positive value if necessary.
+     *
+     * Otherwise returns null by convention since fast-path can't be exercized.
+     *
+     * @param d The double value to be formatted
+     *
+     * @return the formatted result for {@code d} as a string.
+     */
+    String fastFormat(double d) {
+        // (Re-)Evaluates fast-path status if needed.
+        if (fastPathCheckNeeded)
+            checkAndSetFastPathStatus();
+
+        if (!isFastPath )
+            // DecimalFormat instance is not in a fast-path state.
+            return null;
+
+        if (!Double.isFinite(d))
+            // Should not use fast-path for Infinity and NaN.
+            return null;
+
+        // Extracts and records sign of double value, possibly changing it
+        // to a positive one, before calling fastDoubleFormat().
+        boolean negative = false;
+        if (d < 0.0d) {
+            negative = true;
+            d = -d;
+        } else if (d == 0.0d) {
+            negative = (Math.copySign(1.0d, d) == -1.0d);
+            d = +0.0d;
+        }
+
+        if (d > MAX_INT_AS_DOUBLE)
+            // Filters out values that are outside expected fast-path range
+            return null;
+        else
+            fastDoubleFormat(d, negative);
+
+        // Returns a new string from updated fastPathContainer.
+        return new String(fastPathData.fastPathContainer,
+                          fastPathData.firstUsedIndex,
+                          fastPathData.lastFreeIndex - fastPathData.firstUsedIndex);
+
+    }
+
+    // ======== End fast-path formating logic for double =========================
+
     /**
      * Complete the formatting of a finite number.  On entry, the digitList must
      * be filled in with the correct digits.
@@ -1168,8 +1898,7 @@
         if (isNegative) {
             append(result, negativeSuffix, delegate,
                    getNegativeSuffixFieldPositions(), Field.SIGN);
-        }
-        else {
+        } else {
             append(result, positiveSuffix, delegate,
                    getPositiveSuffixFieldPositions(), Field.SIGN);
         }
@@ -1557,8 +2286,7 @@
                         sawExponent = true;
                     }
                     break; // Whether we fail or succeed, we exit this loop
-                }
-                else {
+                } else {
                     break;
                 }
             }
@@ -1653,6 +2381,7 @@
             // don't allow multiple references
             symbols = (DecimalFormatSymbols) newSymbols.clone();
             expandAffixes();
+            fastPathCheckNeeded = true;
         } catch (Exception foo) {
             // should never happen
         }
@@ -1674,6 +2403,7 @@
         positivePrefix = newValue;
         posPrefixPattern = null;
         positivePrefixFieldPositions = null;
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1688,8 +2418,7 @@
         if (positivePrefixFieldPositions == null) {
             if (posPrefixPattern != null) {
                 positivePrefixFieldPositions = expandAffix(posPrefixPattern);
-            }
-            else {
+            } else {
                 positivePrefixFieldPositions = EmptyFieldPositionArray;
             }
         }
@@ -1711,6 +2440,7 @@
     public void setNegativePrefix (String newValue) {
         negativePrefix = newValue;
         negPrefixPattern = null;
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1725,8 +2455,7 @@
         if (negativePrefixFieldPositions == null) {
             if (negPrefixPattern != null) {
                 negativePrefixFieldPositions = expandAffix(negPrefixPattern);
-            }
-            else {
+            } else {
                 negativePrefixFieldPositions = EmptyFieldPositionArray;
             }
         }
@@ -1748,6 +2477,7 @@
     public void setPositiveSuffix (String newValue) {
         positiveSuffix = newValue;
         posSuffixPattern = null;
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1762,8 +2492,7 @@
         if (positiveSuffixFieldPositions == null) {
             if (posSuffixPattern != null) {
                 positiveSuffixFieldPositions = expandAffix(posSuffixPattern);
-            }
-            else {
+            } else {
                 positiveSuffixFieldPositions = EmptyFieldPositionArray;
             }
         }
@@ -1785,6 +2514,7 @@
     public void setNegativeSuffix (String newValue) {
         negativeSuffix = newValue;
         negSuffixPattern = null;
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1799,8 +2529,7 @@
         if (negativeSuffixFieldPositions == null) {
             if (negSuffixPattern != null) {
                 negativeSuffixFieldPositions = expandAffix(negSuffixPattern);
-            }
-            else {
+            } else {
                 negativeSuffixFieldPositions = EmptyFieldPositionArray;
             }
         }
@@ -1834,6 +2563,16 @@
         multiplier = newValue;
         bigDecimalMultiplier = null;
         bigIntegerMultiplier = null;
+        fastPathCheckNeeded = true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setGroupingUsed(boolean newValue) {
+        super.setGroupingUsed(newValue);
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1860,6 +2599,7 @@
      */
     public void setGroupingSize (int newValue) {
         groupingSize = (byte)newValue;
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1878,6 +2618,7 @@
      */
     public void setDecimalSeparatorAlwaysShown(boolean newValue) {
         decimalSeparatorAlwaysShown = newValue;
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -1908,6 +2649,20 @@
         DecimalFormat other = (DecimalFormat) super.clone();
         other.symbols = (DecimalFormatSymbols) symbols.clone();
         other.digitList = (DigitList) digitList.clone();
+
+        // Fast-path is almost stateless algorithm. The only logical state is the
+        // isFastPath flag. In addition fastPathCheckNeeded is a sentinel flag
+        // that forces recalculation of all fast-path fields when set to true.
+        //
+        // There is thus no need to clone all the fast-path fields.
+        // We just only need to set fastPathCheckNeeded to true when cloning,
+        // and init fastPathData to null as if it were a truly new instance.
+        // Every fast-path field will be recalculated (only once) at next usage of
+        // fast-path algorithm.
+        other.fastPathCheckNeeded = true;
+        other.isFastPath = false;
+        other.fastPathData = null;
+
         return other;
     }
 
@@ -1917,8 +2672,10 @@
     @Override
     public boolean equals(Object obj)
     {
-        if (obj == null) return false;
-        if (!super.equals(obj)) return false; // super does class check
+        if (obj == null)
+            return false;
+        if (!super.equals(obj))
+            return false; // super does class check
         DecimalFormat other = (DecimalFormat) obj;
         return ((posPrefixPattern == other.posPrefixPattern &&
                  positivePrefix.equals(other.positivePrefix))
@@ -2206,8 +2963,7 @@
                 || affix.indexOf(symbols.getPatternSeparator()) >= 0
                 || affix.indexOf(symbols.getMinusSign()) >= 0
                 || affix.indexOf(CURRENCY_SIGN) >= 0;
-        }
-        else {
+        } else {
             needQuote = affix.indexOf(PATTERN_ZERO_DIGIT) >= 0
                 || affix.indexOf(PATTERN_GROUPING_SEPARATOR) >= 0
                 || affix.indexOf(PATTERN_DECIMAL_SEPARATOR) >= 0
@@ -2694,6 +3450,7 @@
             super.setMinimumIntegerDigits((minimumIntegerDigits > DOUBLE_INTEGER_DIGITS) ?
                 DOUBLE_INTEGER_DIGITS : minimumIntegerDigits);
         }
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -2714,6 +3471,7 @@
             super.setMaximumIntegerDigits((maximumIntegerDigits > DOUBLE_INTEGER_DIGITS) ?
                 DOUBLE_INTEGER_DIGITS : maximumIntegerDigits);
         }
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -2734,6 +3492,7 @@
             super.setMinimumFractionDigits((minimumFractionDigits > DOUBLE_FRACTION_DIGITS) ?
                 DOUBLE_FRACTION_DIGITS : minimumFractionDigits);
         }
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -2754,6 +3513,7 @@
             super.setMaximumFractionDigits((maximumFractionDigits > DOUBLE_FRACTION_DIGITS) ?
                 DOUBLE_FRACTION_DIGITS : maximumFractionDigits);
         }
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -2843,6 +3603,7 @@
                 expandAffixes();
             }
         }
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -2873,6 +3634,7 @@
 
         this.roundingMode = roundingMode;
         digitList.setRoundingMode(roundingMode);
+        fastPathCheckNeeded = true;
     }
 
     /**
@@ -2924,9 +3686,18 @@
         stream.defaultReadObject();
         digitList = new DigitList();
 
+        // We force complete fast-path reinitialization when the instance is
+        // deserialized. See clone() comment on fastPathCheckNeeded.
+        fastPathCheckNeeded = true;
+        isFastPath = false;
+        fastPathData = null;
+
         if (serialVersionOnStream < 4) {
             setRoundingMode(RoundingMode.HALF_EVEN);
+        } else {
+            setRoundingMode(getRoundingMode());
         }
+
         // We only need to check the maximum counts because NumberFormat
         // .readObject has already ensured that the maximum is greater than the
         // minimum count.
@@ -3195,6 +3966,77 @@
      */
     private RoundingMode roundingMode = RoundingMode.HALF_EVEN;
 
+    // ------ DecimalFormat fields for fast-path for double algorithm  ------
+
+    /**
+     * Helper inner utility class for storing the data used in the fast-path
+     * algorithm. Almost all fields related to fast-path are encapsulated in
+     * this class.
+     *
+     * Any {@code DecimalFormat} instance has a {@code fastPathData}
+     * reference field that is null unless both the properties of the instance
+     * are such that the instance is in the "fast-path" state, and a format call
+     * has been done at least once while in this state.
+     *
+     * Almost all fields are related to the "fast-path" state only and don't
+     * change until one of the instance properties is changed.
+     *
+     * {@code firstUsedIndex} and {@code lastFreeIndex} are the only
+     * two fields that are used and modified while inside a call to
+     * {@code fastDoubleFormat}.
+     *
+     */
+    private static class FastPathData {
+        // --- Temporary fields used in fast-path, shared by several methods.
+
+        /** The first unused index at the end of the formatted result. */
+        int lastFreeIndex;
+
+        /** The first used index at the beginning of the formatted result */
+        int firstUsedIndex;
+
+        // --- State fields related to fast-path status. Changes due to a
+        //     property change only. Set by checkAndSetFastPathStatus() only.
+
+        /** Difference between locale zero and default zero representation. */
+        int  zeroDelta;
+
+        /** Locale char for grouping separator. */
+        char groupingChar;
+
+        /**  Fixed index position of last integral digit of formatted result */
+        int integralLastIndex;
+
+        /**  Fixed index position of first fractional digit of formatted result */
+        int fractionalFirstIndex;
+
+        /** Fractional constants depending on decimal|currency state */
+        double fractionalScaleFactor;
+        int fractionalMaxIntBound;
+
+
+        /** The char array buffer that will contain the formatted result */
+        char[] fastPathContainer;
+
+        /** Suffixes recorded as char array for efficiency. */
+        char[] charsPositivePrefix;
+        char[] charsNegativePrefix;
+        char[] charsPositiveSuffix;
+        char[] charsNegativeSuffix;
+        boolean positiveAffixesRequired = true;
+        boolean negativeAffixesRequired = true;
+    }
+
+    /** The format fast-path status of the instance. Logical state. */
+    private transient boolean isFastPath = false;
+
+    /** Flag stating need of check and reinit fast-path status on next format call. */
+    private transient boolean fastPathCheckNeeded = true;
+
+    /** DecimalFormat reference to its FastPathData */
+    private transient FastPathData fastPathData;
+
+
     //----------------------------------------------------------------------
 
     static final int currentSerialVersion = 4;
@@ -3228,6 +4070,54 @@
     // CONSTANTS
     //----------------------------------------------------------------------
 
+    // ------ Fast-Path for double Constants ------
+
+    /** Maximum valid integer value for applying fast-path algorithm */
+    private static final double MAX_INT_AS_DOUBLE = (double) Integer.MAX_VALUE;
+
+    /**
+     * The digit arrays used in the fast-path methods for collecting digits.
+     * Using 3 constants arrays of chars ensures a very fast collection of digits
+     */
+    private static class DigitArrays {
+        static final char[] DigitOnes1000 = new char[1000];
+        static final char[] DigitTens1000 = new char[1000];
+        static final char[] DigitHundreds1000 = new char[1000];
+
+        // initialize on demand holder class idiom for arrays of digits
+        static {
+            int tenIndex = 0;
+            int hundredIndex = 0;
+            char digitOne = '0';
+            char digitTen = '0';
+            char digitHundred = '0';
+            for (int i = 0;  i < 1000; i++ ) {
+
+                DigitOnes1000[i] = digitOne;
+                if (digitOne == '9')
+                    digitOne = '0';
+                else
+                    digitOne++;
+
+                DigitTens1000[i] = digitTen;
+                if (i == (tenIndex + 9)) {
+                    tenIndex += 10;
+                    if (digitTen == '9')
+                        digitTen = '0';
+                    else
+                        digitTen++;
+                }
+
+                DigitHundreds1000[i] = digitHundred;
+                if (i == (hundredIndex + 99)) {
+                    digitHundred++;
+                    hundredIndex += 100;
+                }
+            }
+        }
+    }
+    // ------ Fast-Path for double Constants end ------
+
     // Constants for characters used in programmatic (unlocalized) patterns.
     private static final char       PATTERN_ZERO_DIGIT         = '0';
     private static final char       PATTERN_GROUPING_SEPARATOR = ',';
--- a/jdk/src/share/classes/java/text/DigitList.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/DigitList.java	Wed Jul 05 18:26:11 2017 +0200
@@ -62,7 +62,7 @@
  * derived by placing all the digits of the list to the right of the
  * decimal point, by 10^exponent.
  *
- * @see  Locale
+ * @see  java.util.Locale
  * @see  Format
  * @see  NumberFormat
  * @see  DecimalFormat
--- a/jdk/src/share/classes/java/text/Format.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/Format.java	Wed Jul 05 18:26:11 2017 +0200
@@ -370,7 +370,7 @@
      * Delegates should NOT assume that the <code>Format</code> will notify
      * the delegate of fields in any particular order.
      *
-     * @see FieldPosition.Delegate
+     * @see FieldPosition#getFieldDelegate
      * @see CharacterIteratorFieldDelegate
      */
     interface FieldDelegate {
--- a/jdk/src/share/classes/java/text/NumberFormat.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/NumberFormat.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, 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
@@ -286,10 +286,21 @@
      * @see java.text.Format#format
      */
     public final String format(double number) {
+        // Use fast-path for double result if that works
+        String result = fastFormat(number);
+        if (result != null)
+            return result;
+
         return format(number, new StringBuffer(),
                       DontCareFieldPosition.INSTANCE).toString();
     }
 
+    /*
+     * fastFormat() is supposed to be implemented in concrete subclasses only.
+     * Default implem always returns null.
+     */
+    String fastFormat(double number) { return null; }
+
    /**
      * Specialization of format.
      * @exception        ArithmeticException if rounding is needed with rounding
--- a/jdk/src/share/classes/java/text/RBCollationTables.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/RBCollationTables.java	Wed Jul 05 18:26:11 2017 +0200
@@ -192,13 +192,12 @@
       *
       * @see CollationElementIterator#getMaxExpansion
       */
-    int getMaxExpansion(int order)
-    {
+    int getMaxExpansion(int order) {
         int result = 1;
 
         if (expandTable != null) {
             // Right now this does a linear search through the entire
-            // expandsion table.  If a collator had a large number of expansions,
+            // expansion table.  If a collator had a large number of expansions,
             // this could cause a performance problem, but in practise that
             // rarely happens
             for (int i = 0; i < expandTable.size(); i++) {
@@ -215,20 +214,19 @@
     }
 
     /**
-     *  Get the entry of hash table of the expanding string in the collation
-     *  table.
-     *  @param idx the index of the expanding string value list
+     * Get the entry of hash table of the expanding string in the collation
+     * table.
+     * @param idx the index of the expanding string value list
      */
-    final int[] getExpandValueList(int order) {
-        return expandTable.elementAt(order - EXPANDCHARINDEX);
+    final int[] getExpandValueList(int idx) {
+        return expandTable.elementAt(idx - EXPANDCHARINDEX);
     }
 
     /**
-     *  Get the comarison order of a character from the collation table.
-     *  @return the comparison order of a character.
+     * Get the comarison order of a character from the collation table.
+     * @return the comparison order of a character.
      */
-    int getUnicodeOrder(int ch)
-    {
+    int getUnicodeOrder(int ch) {
         return mapping.elementAt(ch);
     }
 
--- a/jdk/src/share/classes/java/text/RBTableBuilder.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/RBTableBuilder.java	Wed Jul 05 18:26:11 2017 +0200
@@ -71,7 +71,7 @@
      * This is the main function that actually builds the tables and
      * stores them back in the RBCollationTables object.  It is called
      * ONLY by the RBCollationTables constructor.
-     * @see java.util.RuleBasedCollator#RuleBasedCollator
+     * @see RuleBasedCollator#RuleBasedCollator
      * @exception ParseException If the rules format is incorrect.
      */
 
--- a/jdk/src/share/classes/java/text/SimpleDateFormat.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/text/SimpleDateFormat.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1787,7 +1787,7 @@
      * timeFields. Returns -start (for ParsePosition) if failed.
      * @param text the time text to be parsed.
      * @param start where to start parsing.
-     * @param ch the pattern character for the date field text to be parsed.
+     * @param patternCharIndex the index of the pattern character.
      * @param count the count of a pattern character.
      * @param obeyCount if true, then the next field directly abuts this one,
      * and we should use the count to know when to stop parsing.
--- a/jdk/src/share/classes/java/util/Calendar.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/Calendar.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1788,7 +1788,6 @@
      *
      * @return a bit mask of selected fields
      * @see #isExternallySet(int)
-     * @see #setInternallySetState(int)
      */
     final int selectFields() {
         // This implementation has been taken from the GregorianCalendar class.
--- a/jdk/src/share/classes/java/util/Currency.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/Currency.java	Wed Jul 05 18:26:11 2017 +0200
@@ -665,7 +665,7 @@
      *
      * @param pattern regex pattern for the properties
      * @param ctry country code
-     * @param data currency data.  This is a comma separated string that
+     * @param curdata currency data.  This is a comma separated string that
      *    consists of "three-letter alphabet code", "three-digit numeric code",
      *    and "one-digit (0,1,2, or 3) default fraction digit".
      *    For example, "JPZ,392,0".
--- a/jdk/src/share/classes/java/util/Formatter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/Formatter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -918,7 +918,7 @@
  *     <p> If the {@code '0'} flag is given then the output will be padded
  *     with leading zeros to the field width following any indication of sign.
  *
- *     <p> If {@code '('}, {@code '+'}, '&nbsp&nbsp;', or {@code ','} flags
+ *     <p> If {@code '('}, {@code '+'}, '&nbsp;&nbsp;', or {@code ','} flags
  *     are given then a {@link FormatFlagsConversionMismatchException} will be
  *     thrown.
  *
--- a/jdk/src/share/classes/java/util/JapaneseImperialCalendar.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/JapaneseImperialCalendar.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1932,7 +1932,7 @@
      * Computes the fixed date under either the Gregorian or the
      * Julian calendar, using the given year and the specified calendar fields.
      *
-     * @param cal the CalendarSystem to be used for the date calculation
+     * @param era era index
      * @param year the normalized year number, with 0 indicating the
      * year 1 BCE, -1 indicating 2 BCE, etc.
      * @param fieldMask the calendar fields to be used for the date calculation
@@ -2141,7 +2141,7 @@
      * Returns the length of the specified month in the specified
      * Gregorian year. The year number must be normalized.
      *
-     * @see #isLeapYear(int)
+     * @see GregorianCalendar#isLeapYear(int)
      */
     private int monthLength(int month, int gregorianYear) {
         return CalendarUtils.isGregorianLeapYear(gregorianYear) ?
@@ -2152,7 +2152,7 @@
      * Returns the length of the specified month in the year provided
      * by internalGet(YEAR).
      *
-     * @see #isLeapYear(int)
+     * @see GregorianCalendar#isLeapYear(int)
      */
     private int monthLength(int month) {
         assert jdate.isNormalized();
--- a/jdk/src/share/classes/java/util/JumboEnumSet.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/JumboEnumSet.java	Wed Jul 05 18:26:11 2017 +0200
@@ -345,7 +345,7 @@
      * the same size, and every member of the given set is contained in
      * this set.
      *
-     * @param e object to be compared for equality with this set
+     * @param o object to be compared for equality with this set
      * @return <tt>true</tt> if the specified object is equal to this set
      */
     public boolean equals(Object o) {
--- a/jdk/src/share/classes/java/util/Locale.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/Locale.java	Wed Jul 05 18:26:11 2017 +0200
@@ -55,6 +55,7 @@
 import sun.util.locale.InternalLocaleBuilder;
 import sun.util.locale.LanguageTag;
 import sun.util.locale.LocaleExtensions;
+import sun.util.locale.LocaleMatcher;
 import sun.util.locale.LocaleObjectCache;
 import sun.util.locale.LocaleSyntaxException;
 import sun.util.locale.LocaleUtils;
@@ -71,10 +72,11 @@
  * according to the customs and conventions of the user's native country,
  * region, or culture.
  *
- * <p> The <code>Locale</code> class implements identifiers
- * interchangeable with BCP 47 (IETF BCP 47, "Tags for Identifying
- * Languages"), with support for the LDML (UTS#35, "Unicode Locale
- * Data Markup Language") BCP 47-compatible extensions for locale data
+ * <p> The {@code Locale} class implements IETF BCP 47 which is composed of
+ * <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 "Matching of Language
+ * Tags"</a> and <a href="http://tools.ietf.org/html/rfc5646">RFC 5646 "Tags
+ * for Identifying Languages"</a> with support for the LDML (UTS#35, "Unicode
+ * Locale Data Markup Language") BCP 47-compatible extensions for locale data
  * exchange.
  *
  * <p> A <code>Locale</code> object logically consists of the fields
@@ -267,6 +269,77 @@
  * </pre>
  * </blockquote>
  *
+ * <h4><a name="LocaleMatching">Locale Matching</a></h4>
+ *
+ * <p>If an application or a system is internationalized and provides localized
+ * resources for multiple locales, it sometimes needs to find one or more
+ * locales (or language tags) which meet each user's specific preferences. Note
+ * that a term "language tag" is used interchangeably with "locale" in this
+ * locale matching documentation.
+ *
+ * <p>In order to do matching a user's preferred locales to a set of language
+ * tags, <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 Matching of
+ * Language Tags</a> defines two mechanisms: filtering and lookup.
+ * <em>Filtering</em> is used to get all matching locales, whereas
+ * <em>lookup</em> is to choose the best matching locale.
+ * Matching is done case-insensitively. These matching mechanisms are described
+ * in the following sections.
+ *
+ * <p>A user's preference is called a <em>Language Priority List</em> and is
+ * expressed as a list of language ranges. There are syntactically two types of
+ * language ranges: basic and extended. See
+ * {@link Locale.LanguageRange Locale.LanguageRange} for details.
+ *
+ * <h5>Filtering</h5>
+ *
+ * <p>The filtering operation returns all matching language tags. It is defined
+ * in RFC 4647 as follows:
+ * "In filtering, each language range represents the least specific language
+ * tag (that is, the language tag with fewest number of subtags) that is an
+ * acceptable match. All of the language tags in the matching set of tags will
+ * have an equal or greater number of subtags than the language range. Every
+ * non-wildcard subtag in the language range will appear in every one of the
+ * matching language tags."
+ *
+ * <p>There are two types of filtering: filtering for basic language ranges
+ * (called "basic filtering") and filtering for extended language ranges
+ * (called "extended filtering"). They may return different results by what
+ * kind of language ranges are included in the given Language Priority List.
+ * {@link Locale.FilteringMode} is a parameter to specify how filtering should
+ * be done.
+ *
+ * <h5>Lookup</h5>
+ *
+ * <p>The lookup operation returns the best matching language tags. It is
+ * defined in RFC 4647 as follows:
+ * "By contrast with filtering, each language range represents the most
+ * specific tag that is an acceptable match.  The first matching tag found,
+ * according to the user's priority, is considered the closest match and is the
+ * item returned."
+ *
+ * <p>For example, if a Language Priority List consists of two language ranges,
+ * {@code "zh-Hant-TW"} and {@code "en-US"}, in prioritized order, lookup
+ * method progressively searches the language tags below in order to find the
+ * best matching language tag.
+ * <blockquote>
+ * <pre>
+ *    1. zh-Hant-TW
+ *    2. zh-Hant
+ *    3. zh
+ *    4. en-US
+ *    5. en
+ * </pre>
+ * </blockquote>
+ * If there is a language tag which matches completely to a language range
+ * above, the language tag is returned.
+ *
+ * <p>{@code "*"} is the special language range, and it is ignored in lookup.
+ *
+ * <p>If multiple language tags match as a result of the subtag {@code '*'}
+ * included in a language range, the first matching language tag returned by
+ * an {@link Iterator} over a {@link Collection} of language tags is treated as
+ * the best matching one.
+ *
  * <h4>Use of Locale</h4>
  *
  * <p>Once you've created a <code>Locale</code> you can query it for information
@@ -1419,7 +1492,7 @@
      *    // returns "ja-JP-u-ca-japanese-x-lvariant-JP"
      *    Locale.forLanguageTag("th-TH-x-lvariant-TH").toLanguageTag();
      *    // returns "th-TH-u-nu-thai-x-lvariant-TH"
-     * <pre></ul>
+     * </pre></ul>
      *
      * <p>This implements the 'Language-Tag' production of BCP47, and
      * so supports grandfathered (regular and irregular) as well as
@@ -2070,7 +2143,7 @@
      * @param in the <code>ObjectInputStream</code> to read
      * @throws IOException
      * @throws ClassNotFoundException
-     * @throws IllformdLocaleException
+     * @throws IllformedLocaleException
      * @since 1.7
      */
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
@@ -2574,4 +2647,611 @@
             return Locale.getInstance(baseloc, extensions);
         }
     }
+
+    /**
+     * This enum provides constants to select a filtering mode for locale
+     * matching. Refer to <a href="http://tools.ietf.org/html/rfc4647">RFC 4647
+     * Matching of Language Tags</a> for details.
+     *
+     * <p>As an example, think of two Language Priority Lists each of which
+     * includes only one language range and a set of following language tags:
+     *
+     * <pre>
+     *    de (German)
+     *    de-DE (German, Germany)
+     *    de-Deva (German, in Devanagari script)
+     *    de-Deva-DE (German, in Devanagari script, Germany)
+     *    de-DE-1996 (German, Germany, orthography of 1996)
+     *    de-Latn-DE (German, in Latin script, Germany)
+     *    de-Latn-DE-1996 (German, in Latin script, Germany, orthography of 1996)
+     * </pre>
+     *
+     * The filtering method will behave as follows:
+     *
+     * <table cellpadding=2>
+     * <tr>
+     * <th>Filtering Mode</th>
+     * <th>Language Priority List: {@code "de-DE"}</th>
+     * <th>Language Priority List: {@code "de-*-DE"}</th>
+     * </tr>
+     * <tr>
+     * <td valign=top>
+     * {@link FilteringMode#AUTOSELECT_FILTERING AUTOSELECT_FILTERING}
+     * </td>
+     * <td valign=top>
+     * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
+     * {@code "de-DE-1996"}.
+     * </td>
+     * <td valign=top>
+     * Performs <em>extended</em> filtering and returns {@code "de-DE"},
+     * {@code "de-Deva-DE"}, {@code "de-DE-1996"}, {@code "de-Latn-DE"}, and
+     * {@code "de-Latn-DE-1996"}.
+     * </td>
+     * </tr>
+     * <tr>
+     * <td valign=top>
+     * {@link FilteringMode#EXTENDED_FILTERING EXTENDED_FILTERING}
+     * </td>
+     * <td valign=top>
+     * Performs <em>extended</em> filtering and returns {@code "de-DE"},
+     * {@code "de-Deva-DE"}, {@code "de-DE-1996"}, {@code "de-Latn-DE"}, and
+     * {@code "de-Latn-DE-1996"}.
+     * </td>
+     * <td valign=top>Same as above.</td>
+     * </tr>
+     * <tr>
+     * <td valign=top>
+     * {@link FilteringMode#IGNORE_EXTENDED_RANGES IGNORE_EXTENDED_RANGES}
+     * </td>
+     * <td valign=top>
+     * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
+     * {@code "de-DE-1996"}.
+     * </td>
+     * <td valign=top>
+     * Performs <em>basic</em> filtering and returns {@code null} because
+     * nothing matches.
+     * </td>
+     * </tr>
+     * <tr>
+     * <td valign=top>
+     * {@link FilteringMode#MAP_EXTENDED_RANGES MAP_EXTENDED_RANGES}
+     * </td>
+     * <td valign=top>Same as above.</td>
+     * <td valign=top>
+     * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
+     * {@code "de-DE-1996"} because {@code "de-*-DE"} is mapped to
+     * {@code "de-DE"}.
+     * </td>
+     * </tr>
+     * <tr>
+     * <td valign=top>
+     * {@link FilteringMode#REJECT_EXTENDED_RANGES REJECT_EXTENDED_RANGES}
+     * </td>
+     * <td valign=top>Same as above.</td>
+     * <td valign=top>
+     * Throws {@link IllegalArgumentException} because {@code "de-*-DE"} is
+     * not a valid basic language range.
+     * </td>
+     * </tr>
+     * </table>
+     *
+     * @see #filter(List, Collection, FilteringMode)
+     * @see #filterTags(List, Collection, FilteringMode)
+     *
+     * @since 1.8
+     */
+    public static enum FilteringMode {
+        /**
+         * Specifies automatic filtering mode based on the given Language
+         * Priority List consisting of language ranges. If all of the ranges
+         * are basic, basic filtering is selected. Otherwise, extended
+         * filtering is selected.
+         */
+        AUTOSELECT_FILTERING,
+
+        /**
+         * Specifies extended filtering.
+         */
+        EXTENDED_FILTERING,
+
+        /**
+         * Specifies basic filtering: Note that any extended language ranges
+         * included in the given Language Priority List are ignored.
+         */
+        IGNORE_EXTENDED_RANGES,
+
+        /**
+         * Specifies basic filtering: If any extended language ranges are
+         * included in the given Language Priority List, they are mapped to the
+         * basic language range. Specifically, a language range starting with a
+         * subtag {@code "*"} is treated as a language range {@code "*"}. For
+         * example, {@code "*-US"} is treated as {@code "*"}. If {@code "*"} is
+         * not the first subtag, {@code "*"} and extra {@code "-"} are removed.
+         * For example, {@code "ja-*-JP"} is mapped to {@code "ja-JP"}.
+         */
+        MAP_EXTENDED_RANGES,
+
+        /**
+         * Specifies basic filtering: If any extended language ranges are
+         * included in the given Language Priority List, the list is rejected
+         * and the filtering method throws {@link IllegalArgumentException}.
+         */
+        REJECT_EXTENDED_RANGES
+    };
+
+    /**
+     * This class expresses a <em>Language Range</em> defined in
+     * <a href="http://tools.ietf.org/html/rfc4647">RFC 4647 Matching of
+     * Language Tags</a>. A language range is an identifier which is used to
+     * select language tag(s) meeting specific requirements by using the
+     * mechanisms described in <a href="Locale.html#LocaleMatching">Locale
+     * Matching</a>. A list which represents a user's preferences and consists
+     * of language ranges is called a <em>Language Priority List</em>.
+     *
+     * <p>There are two types of language ranges: basic and extended. In RFC
+     * 4647, the syntax of language ranges is expressed in
+     * <a href="http://tools.ietf.org/html/rfc4234">ABNF</a> as follows:
+     * <blockquote>
+     * <pre>
+     *     basic-language-range    = (1*8ALPHA *("-" 1*8alphanum)) / "*"
+     *     extended-language-range = (1*8ALPHA / "*")
+     *                               *("-" (1*8alphanum / "*"))
+     *     alphanum                = ALPHA / DIGIT
+     * </pre>
+     * </blockquote>
+     * For example, {@code "en"} (English), {@code "ja-JP"} (Japanese, Japan),
+     * {@code "*"} (special language range which matches any language tag) are
+     * basic language ranges, whereas {@code "*-CH"} (any languages,
+     * Switzerland), {@code "es-*"} (Spanish, any regions), and
+     * {@code "zh-Hant-*"} (Traditional Chinese, any regions) are extended
+     * language ranges.
+     *
+     * @see #filter
+     * @see #filterTags
+     * @see #lookup
+     * @see #lookupTag
+     *
+     * @since 1.8
+     */
+    public static final class LanguageRange {
+
+       /**
+        * A constant holding the maximum value of weight, 1.0, which indicates
+        * that the language range is a good fit for the user.
+        */
+        public static final double MAX_WEIGHT = 1.0;
+
+       /**
+        * A constant holding the minimum value of weight, 0.0, which indicates
+        * that the language range is not a good fit for the user.
+        */
+        public static final double MIN_WEIGHT = 0.0;
+
+        private final String range;
+        private final double weight;
+
+        private volatile int hash = 0;
+
+        /**
+         * Constructs a {@code LanguageRange} using the given {@code range}.
+         * Note that no validation is done against the IANA Language Subtag
+         * Registry at time of construction.
+         *
+         * <p>This is equivalent to {@code LanguageRange(range, MAX_WEIGHT)}.
+         *
+         * @param range a language range
+         * @throws NullPointerException if the given {@code range} is
+         *     {@code null}
+         */
+        public LanguageRange(String range) {
+            this(range, MAX_WEIGHT);
+        }
+
+        /**
+         * Constructs a {@code LanguageRange} using the given {@code range} and
+         * {@code weight}. Note that no validation is done against the IANA
+         * Language Subtag Registry at time of construction.
+         *
+         * @param range  a language range
+         * @param weight a weight value between {@code MIN_WEIGHT} and
+         *     {@code MAX_WEIGHT}
+         * @throws NullPointerException if the given {@code range} is
+         *     {@code null}
+         * @throws IllegalArgumentException if the given {@code weight} is less
+         *     than {@code MIN_WEIGHT} or greater than {@code MAX_WEIGHT}
+         */
+        public LanguageRange(String range, double weight) {
+            if (range == null) {
+                throw new NullPointerException();
+            }
+            if (weight < MIN_WEIGHT || weight > MAX_WEIGHT) {
+                throw new IllegalArgumentException("weight=" + weight);
+            }
+
+            range = range.toLowerCase();
+
+            // Do syntax check.
+            boolean isIllFormed = false;
+            String[] subtags = range.split("-");
+            if (isSubtagIllFormed(subtags[0], true)
+                || range.endsWith("-")) {
+                isIllFormed = true;
+            } else {
+                for (int i = 1; i < subtags.length; i++) {
+                    if (isSubtagIllFormed(subtags[i], false)) {
+                        isIllFormed = true;
+                    }
+                    break;
+                }
+            }
+            if (isIllFormed) {
+                throw new IllegalArgumentException("range=" + range);
+            }
+
+            this.range = range;
+            this.weight = weight;
+        }
+
+        private static boolean isSubtagIllFormed(String subtag,
+                                                 boolean isFirstSubtag) {
+            if (subtag.equals("") || subtag.length() > 8) {
+                return true;
+            } else if (subtag.equals("*")) {
+                return false;
+            }
+            char[] charArray = subtag.toCharArray();
+            if (isFirstSubtag) { // ALPHA
+                for (char c : charArray) {
+                    if (c < 'a' || c > 'z') {
+                        return true;
+                    }
+                }
+            } else { // ALPHA / DIGIT
+                for (char c : charArray) {
+                    if (c < '0' || (c > '9' && c < 'a') || c > 'z') {
+                        return true;
+                    }
+                }
+            }
+            return false;
+        }
+
+        /**
+         * Returns the language range of this {@code LanguageRange}.
+         *
+         * @return the language range.
+         */
+        public String getRange() {
+            return range;
+        }
+
+        /**
+         * Returns the weight of this {@code LanguageRange}.
+         *
+         * @return the weight value.
+         */
+        public double getWeight() {
+            return weight;
+        }
+
+        /**
+         * Parses the given {@code ranges} to generate a Language Priority List.
+         *
+         * <p>This method performs a syntactic check for each language range in
+         * the given {@code ranges} but doesn't do validation using the IANA
+         * Language Subtag Registry.
+         *
+         * <p>The {@code ranges} to be given can take one of the following
+         * forms:
+         *
+         * <pre>
+         *   "Accept-Language: ja,en;q=0.4"  (weighted list with Accept-Language prefix)
+         *   "ja,en;q=0.4"                   (weighted list)
+         *   "ja,en"                         (prioritized list)
+         * </pre>
+         *
+         * In a weighted list, each language range is given a weight value.
+         * The weight value is identical to the "quality value" in
+         * <a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>, and it
+         * expresses how much the user prefers  the language. A weight value is
+         * specified after a corresponding language range followed by
+         * {@code ";q="}, and the default weight value is {@code MAX_WEIGHT}
+         * when it is omitted.
+         *
+         * <p>Unlike a weighted list, language ranges in a prioritized list
+         * are sorted in the descending order based on its priority. The first
+         * language range has the highest priority and meets the user's
+         * preference most.
+         *
+         * <p>In either case, language ranges are sorted in descending order in
+         * the Language Priority List based on priority or weight. If a
+         * language range appears in the given {@code ranges} more than once,
+         * only the first one is included on the Language Priority List.
+         *
+         * <p>The returned list consists of language ranges from the given
+         * {@code ranges} and their equivalents found in the IANA Language
+         * Subtag Registry. For example, if the given {@code ranges} is
+         * {@code "Accept-Language: iw,en-us;q=0.7,en;q=0.3"}, the elements in
+         * the list to be returned are:
+         *
+         * <pre>
+         *  <b>Range</b>                                   <b>Weight</b>
+         *    "iw" (older tag for Hebrew)             1.0
+         *    "he" (new preferred code for Hebrew)    1.0
+         *    "en-us" (English, United States)        0.7
+         *    "en" (English)                          0.3
+         * </pre>
+         *
+         * Two language ranges, {@code "iw"} and {@code "he"}, have the same
+         * highest priority in the list. By adding {@code "he"} to the user's
+         * Language Priority List, locale-matching method can find Hebrew as a
+         * matching locale (or language tag) even if the application or system
+         * offers only {@code "he"} as a supported locale (or language tag).
+         *
+         * @param ranges a list of comma-separated language ranges or a list of
+         *     language ranges in the form of the "Accept-Language" header
+         *     defined in <a href="http://tools.ietf.org/html/rfc2616">RFC
+         *     2616</a>
+         * @return a Language Priority List consisting of language ranges
+         *     included in the given {@code ranges} and their equivalent
+         *     language ranges if available. The list is modifiable.
+         * @throws NullPointerException if {@code ranges} is null
+         * @throws IllegalArgumentException if a language range or a weight
+         *     found in the given {@code ranges} is ill-formed
+         */
+        public static List<LanguageRange> parse(String ranges) {
+            return LocaleMatcher.parse(ranges);
+        }
+
+        /**
+         * Parses the given {@code ranges} to generate a Language Priority
+         * List, and then customizes the list using the given {@code map}.
+         * This method is equivalent to
+         * {@code mapEquivalents(parse(ranges), map)}.
+         *
+         * @param ranges a list of comma-separated language ranges or a list
+         *     of language ranges in the form of the "Accept-Language" header
+         *     defined in <a href="http://tools.ietf.org/html/rfc2616">RFC
+         *     2616</a>
+         * @param map a map containing information to customize language ranges
+         * @return a Language Priority List with customization. The list is
+         * @throws NullPointerException if {@code ranges} is null
+         * @throws IllegalArgumentException if a language range or a weight
+         *     found in the given {@code ranges} is ill-formed
+         * @see #parse(String)
+         * @see #mapEquivalents
+         */
+        public static List<LanguageRange> parse(String ranges,
+                                                Map<String, List<String>> map) {
+            return mapEquivalents(parse(ranges), map);
+        }
+
+        /**
+         * Generates a new customized Language Priority List using the given
+         * {@code priorityList} and {@code map}. If the given {@code map} is
+         * empty, this method returns a copy of the given {@code priorityList}.
+         *
+         * <p>In the map, a key represents a language range whereas a value is
+         * a list of equivalents of it. {@code '*'} cannot be used in the map.
+         * Each equivalent language range has the same weight value as its
+         * original language range.
+         *
+         * <pre>
+         *  An example of map:
+         *    <b>Key</b>                            <b>Value</b>
+         *      "zh" (Chinese)                 "zh",
+         *                                     "zh-Hans"(Simplified Chinese)
+         *      "zh-HK" (Chinese, Hong Kong)   "zh-HK"
+         *      "zh-TW" (Chinese, Taiwan)      "zh-TW"
+         * </pre>
+         *
+         * The customization is performed after modification using the IANA
+         * Language Subtag Registry.
+         *
+         * <p>For example, if a user's Language Priority List consists of five
+         * language ranges ({@code "zh"}, {@code "zh-CN"}, {@code "en"},
+         * {@code "zh-TW"}, and {@code "zh-HK"}), the newly generated Language
+         * Priority List which is customized using the above map example will
+         * consists of {@code "zh"}, {@code "zh-Hans"}, {@code "zh-CN"},
+         * {@code "zh-Hans-CN"}, {@code "en"}, {@code "zh-TW"}, and
+         * {@code "zh-HK"}.
+         *
+         * <p>{@code "zh-HK"} and {@code "zh-TW"} aren't converted to
+         * {@code "zh-Hans-HK"} nor {@code "zh-Hans-TW"} even if they are
+         * included in the Language Priority List. In this example, mapping
+         * is used to clearly distinguish Simplified Chinese and Traditional
+         * Chinese.
+         *
+         * <p>If the {@code "zh"}-to-{@code "zh"} mapping isn't included in the
+         * map, a simple replacement will be performed and the customized list
+         * won't include {@code "zh"} and {@code "zh-CN"}.
+         *
+         * @param priorityList user's Language Priority List
+         * @param map a map containing information to customize language ranges
+         * @return a new Language Priority List with customization. The list is
+         *     modifiable.
+         * @throws NullPointerException if {@code priorityList} is {@code null}
+         * @see #parse(String, Map)
+         */
+        public static List<LanguageRange> mapEquivalents(
+                                              List<LanguageRange>priorityList,
+                                              Map<String, List<String>> map) {
+            return LocaleMatcher.mapEquivalents(priorityList, map);
+        }
+
+        /**
+         * Returns a hash code value for the object.
+         *
+         * @return  a hash code value for this object.
+         */
+        @Override
+        public int hashCode() {
+            if (hash == 0) {
+                int result = 17;
+                result = 37*result + range.hashCode();
+                long bitsWeight = Double.doubleToLongBits(weight);
+                result = 37*result + (int)(bitsWeight ^ (bitsWeight >>> 32));
+                hash = result;
+            }
+            return hash;
+        }
+
+        /**
+         * Compares this object to the specified object. The result is true if
+         * and only if the argument is not {@code null} and is a
+         * {@code LanguageRange} object that contains the same {@code range}
+         * and {@code weight} values as this object.
+         *
+         * @param obj the object to compare with
+         * @return  {@code true} if this object's {@code range} and
+         *     {@code weight} are the same as the {@code obj}'s; {@code false}
+         *     otherwise.
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (!(obj instanceof LanguageRange)) {
+                return false;
+            }
+            LanguageRange other = (LanguageRange)obj;
+            return hash == other.hash
+                   && range.equals(other.range)
+                   && weight == other.weight;
+        }
+    }
+
+    /**
+     * Returns a list of matching {@code Locale} instances using the filtering
+     * mechanism defined in RFC 4647.
+     *
+     * @param priorityList user's Language Priority List in which each language
+     *     tag is sorted in descending order based on priority or weight
+     * @param locales {@code Locale} instances used for matching
+     * @param mode filtering mode
+     * @return a list of {@code Locale} instances for matching language tags
+     *     sorted in descending order based on priority or weight, or an empty
+     *     list if nothing matches. The list is modifiable.
+     * @throws NullPointerException if {@code priorityList} or {@code locales}
+     *     is {@code null}
+     * @throws IllegalArgumentException if one or more extended language ranges
+     *     are included in the given list when
+     *     {@link FilteringMode#REJECT_EXTENDED_RANGES} is specified
+     *
+     * @since 1.8
+     */
+    public static List<Locale> filter(List<LanguageRange> priorityList,
+                                      Collection<Locale> locales,
+                                      FilteringMode mode) {
+        return LocaleMatcher.filter(priorityList, locales, mode);
+    }
+
+    /**
+     * Returns a list of matching {@code Locale} instances using the filtering
+     * mechanism defined in RFC 4647. This is equivalent to
+     * {@link #filter(List, Collection, FilteringMode)} when {@code mode} is
+     * {@link FilteringMode#AUTOSELECT_FILTERING}.
+     *
+     * @param priorityList user's Language Priority List in which each language
+     *     tag is sorted in descending order based on priority or weight
+     * @param locales {@code Locale} instances used for matching
+     * @return a list of {@code Locale} instances for matching language tags
+     *     sorted in descending order based on priority or weight, or an empty
+     *     list if nothing matches. The list is modifiable.
+     * @throws NullPointerException if {@code priorityList} or {@code locales}
+     *     is {@code null}
+     *
+     * @since 1.8
+     */
+    public static List<Locale> filter(List<LanguageRange> priorityList,
+                                      Collection<Locale> locales) {
+        return filter(priorityList, locales, FilteringMode.AUTOSELECT_FILTERING);
+    }
+
+    /**
+     * Returns a list of matching languages tags using the basic filtering
+     * mechanism defined in RFC 4647.
+     *
+     * @param priorityList user's Language Priority List in which each language
+     *     tag is sorted in descending order based on priority or weight
+     * @param tags language tags
+     * @param mode filtering mode
+     * @return a list of matching language tags sorted in descending order
+     *     based on priority or weight, or an empty list if nothing matches.
+     *     The list is modifiable.
+     * @throws NullPointerException if {@code priorityList} or {@code tags} is
+     *     {@code null}
+     * @throws IllegalArgumentException if one or more extended language ranges
+     *     are included in the given list when
+     *     {@link FilteringMode#REJECT_EXTENDED_RANGES} is specified
+     *
+     * @since 1.8
+     */
+    public static List<String> filterTags(List<LanguageRange> priorityList,
+                                          Collection<String> tags,
+                                          FilteringMode mode) {
+        return LocaleMatcher.filterTags(priorityList, tags, mode);
+    }
+
+    /**
+     * Returns a list of matching languages tags using the basic filtering
+     * mechanism defined in RFC 4647. This is equivalent to
+     * {@link #filterTags(List, Collection, FilteringMode)} when {@code mode}
+     * is {@link FilteringMode#AUTOSELECT_FILTERING}.
+     *
+     * @param priorityList user's Language Priority List in which each language
+     *     tag is sorted in descending order based on priority or weight
+     * @param tags language tags
+     * @return a list of matching language tags sorted in descending order
+     *     based on priority or weight, or an empty list if nothing matches.
+     *     The list is modifiable.
+     * @throws NullPointerException if {@code priorityList} or {@code tags} is
+     *     {@code null}
+     *
+     * @since 1.8
+     */
+    public static List<String> filterTags(List<LanguageRange> priorityList,
+                                          Collection<String> tags) {
+        return filterTags(priorityList, tags, FilteringMode.AUTOSELECT_FILTERING);
+    }
+
+    /**
+     * Returns a {@code Locale} instance for the best-matching language
+     * tag using the lookup mechanism defined in RFC 4647.
+     *
+     * @param priorityList user's Language Priority List in which each language
+     *     tag is sorted in descending order based on priority or weight
+     * @param locales {@code Locale} instances used for matching
+     * @return the best matching <code>Locale</code> instance chosen based on
+     *     priority or weight, or {@code null} if nothing matches.
+     * @throws NullPointerException if {@code priorityList} or {@code tags} is
+     *     {@code null}
+     *
+     * @since 1.8
+     */
+    public static Locale lookup(List<LanguageRange> priorityList,
+                                Collection<Locale> locales) {
+        return LocaleMatcher.lookup(priorityList, locales);
+    }
+
+    /**
+     * Returns the best-matching language tag using the lookup mechanism
+     * defined in RFC 4647.
+     *
+     * @param priorityList user's Language Priority List in which each language
+     *     tag is sorted in descending order based on priority or weight
+     * @param tags language tangs used for matching
+     * @return the best matching language tag chosen based on priority or
+     *     weight, or {@code null} if nothing matches.
+     * @throws NullPointerException if {@code priorityList} or {@code tags} is
+     *     {@code null}
+     *
+     * @since 1.8
+     */
+    public static String lookupTag(List<LanguageRange> priorityList,
+                                   Collection<String> tags) {
+        return LocaleMatcher.lookupTag(priorityList, tags);
+    }
+
 }
--- a/jdk/src/share/classes/java/util/Properties.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/Properties.java	Wed Jul 05 18:26:11 2017 +0200
@@ -34,7 +34,10 @@
 import java.io.Writer;
 import java.io.OutputStreamWriter;
 import java.io.BufferedWriter;
-import java.lang.reflect.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import sun.util.spi.XmlPropertiesProvider;
 
 /**
  * The {@code Properties} class represents a persistent set of
@@ -866,7 +869,7 @@
     {
         if (in == null)
             throw new NullPointerException();
-        XMLUtils.load(this, in);
+        XmlSupport.load(this, in);
         in.close();
     }
 
@@ -934,7 +937,7 @@
     {
         if (os == null)
             throw new NullPointerException();
-        XMLUtils.save(this, os, comment, encoding);
+        XmlSupport.save(this, os, comment, encoding);
     }
 
     /**
@@ -1113,59 +1116,82 @@
         '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
     };
 
+    /**
+     * Supporting class for loading/storing properties in XML format.
+     *
+     * <p> The {@code load} and {@code store} methods defined here delegate to a
+     * system-wide {@code XmlPropertiesProvider}. On first invocation of either
+     * method then the system-wide provider is located as follows: </p>
+     *
+     * <ol>
+     *   <li> If the system property {@code sun.util.spi.XmlPropertiesProvider}
+     *   is defined then it is taken to be the full-qualified name of a concrete
+     *   provider class. The class is loaded with the system class loader as the
+     *   initiating loader. If it cannot be loaded or instantiated using a zero
+     *   argument constructor then an unspecified error is thrown. </li>
+     *
+     *   <li> If the system property is not defined then the service-provider
+     *   loading facility defined by the {@link ServiceLoader} class is used to
+     *   locate a provider with the system class loader as the initiating
+     *   loader and {@code sun.util.spi.XmlPropertiesProvider} as the service
+     *   type. If this process fails then an unspecified error is thrown. If
+     *   there is more than one service provider installed then it is
+     *   not specified as to which provider will be used. </li>
+     *
+     *   <li> If the provider is not found by the above means then a system
+     *   default provider will be instantiated and used. </li>
+     * </ol>
+     */
+    private static class XmlSupport {
 
-    private static class XMLUtils {
-        private static Method load = null;
-        private static Method save = null;
-        static {
+        private static XmlPropertiesProvider loadProviderFromProperty(ClassLoader cl) {
+            String cn = System.getProperty("sun.util.spi.XmlPropertiesProvider");
+            if (cn == null)
+                return null;
             try {
-                // reference sun.util.xml.Utils reflectively
-                // to allow the Properties class be compiled in
-                // the absence of XML
-                Class<?> c = Class.forName("sun.util.xml.XMLUtils", true, null);
-                load = c.getMethod("load", Properties.class, InputStream.class);
-                save = c.getMethod("save", Properties.class, OutputStream.class,
-                                   String.class, String.class);
-            } catch (ClassNotFoundException cnf) {
-                throw new AssertionError(cnf);
-            } catch (NoSuchMethodException e) {
-                throw new AssertionError(e);
+                Class<?> c = Class.forName(cn, true, cl);
+                return (XmlPropertiesProvider)c.newInstance();
+            } catch (ClassNotFoundException |
+                     IllegalAccessException |
+                     InstantiationException x) {
+                throw new ServiceConfigurationError(null, x);
             }
         }
 
-        static void invoke(Method m, Object... args) throws IOException {
-            try {
-                m.invoke(null, args);
-            } catch (IllegalAccessException e) {
-                throw new AssertionError(e);
-            } catch (InvocationTargetException e) {
-                Throwable t = e.getCause();
-                if (t instanceof RuntimeException)
-                    throw (RuntimeException)t;
+        private static XmlPropertiesProvider loadProviderAsService(ClassLoader cl) {
+            Iterator<XmlPropertiesProvider> iterator =
+                 ServiceLoader.load(XmlPropertiesProvider.class, cl).iterator();
+            return iterator.hasNext() ? iterator.next() : null;
+        }
 
-                if (t instanceof IOException) {
-                    throw (IOException)t;
-                } else {
-                    throw new AssertionError(t);
-                }
-            }
+        private static XmlPropertiesProvider loadProvider() {
+            return AccessController.doPrivileged(
+                new PrivilegedAction<XmlPropertiesProvider>() {
+                    public XmlPropertiesProvider run() {
+                        ClassLoader cl = ClassLoader.getSystemClassLoader();
+                        XmlPropertiesProvider provider = loadProviderFromProperty(cl);
+                        if (provider != null)
+                            return provider;
+                        provider = loadProviderAsService(cl);
+                        if (provider != null)
+                            return provider;
+                        throw new InternalError("No fallback");
+                }});
         }
 
+        private static final XmlPropertiesProvider PROVIDER = loadProvider();
+
         static void load(Properties props, InputStream in)
             throws IOException, InvalidPropertiesFormatException
         {
-            if (load == null)
-                throw new InternalError("sun.util.xml.XMLUtils not found");
-            invoke(load, props, in);
+            PROVIDER.load(props, in);
         }
 
         static void save(Properties props, OutputStream os, String comment,
                          String encoding)
             throws IOException
         {
-            if (save == null)
-                throw new InternalError("sun.util.xml.XMLUtils not found");
-            invoke(save, props, os, comment, encoding);
+            PROVIDER.store(props, os, comment, encoding);
         }
     }
 }
--- a/jdk/src/share/classes/java/util/PropertyPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/PropertyPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -130,18 +130,15 @@
      * @param mask the actions mask to use.
      *
      */
-
-    private void init(int mask)
-    {
-
+    private void init(int mask) {
         if ((mask & ALL) != mask)
-                throw new IllegalArgumentException("invalid actions mask");
+            throw new IllegalArgumentException("invalid actions mask");
 
         if (mask == NONE)
-                throw new IllegalArgumentException("invalid actions mask");
+            throw new IllegalArgumentException("invalid actions mask");
 
         if (getName() == null)
-                throw new NullPointerException("name can't be null");
+            throw new NullPointerException("name can't be null");
 
         this.mask = mask;
     }
@@ -160,9 +157,7 @@
      * @throws IllegalArgumentException if <code>name</code> is empty or if
      * <code>actions</code> is invalid.
      */
-
-    public PropertyPermission(String name, String actions)
-    {
+    public PropertyPermission(String name, String actions) {
         super(name,actions);
         init(getMask(actions));
     }
@@ -196,7 +191,6 @@
         return ((this.mask & that.mask) == that.mask) && super.implies(that);
     }
 
-
     /**
      * Checks two PropertyPermission objects for equality. Checks that <i>obj</i> is
      * a PropertyPermission, and has the same name and actions as this object.
@@ -226,16 +220,14 @@
      *
      * @return a hash code value for this object.
      */
-
     public int hashCode() {
         return this.getName().hashCode();
     }
 
-
     /**
      * Converts an actions String to an actions mask.
      *
-     * @param action the action string.
+     * @param actions the action string.
      * @return the actions mask.
      */
     private static int getMask(String actions) {
@@ -332,8 +324,7 @@
      *
      * @return the canonical string representation of the actions.
      */
-    static String getActions(int mask)
-    {
+    static String getActions(int mask) {
         StringBuilder sb = new StringBuilder();
         boolean comma = false;
 
@@ -359,8 +350,7 @@
      *
      * @return the canonical string representation of the actions.
      */
-    public String getActions()
-    {
+    public String getActions() {
         if (actions == null)
             actions = getActions(this.mask);
 
@@ -373,7 +363,6 @@
      *
      * @return the actions mask.
      */
-
     int getMask() {
         return mask;
     }
@@ -386,7 +375,6 @@
      * @return a new PermissionCollection object suitable for storing
      * PropertyPermissions.
      */
-
     public PermissionCollection newPermissionCollection() {
         return new PropertyPermissionCollection();
     }
@@ -436,7 +424,7 @@
  * @serial include
  */
 final class PropertyPermissionCollection extends PermissionCollection
-implements Serializable
+    implements Serializable
 {
 
     /**
@@ -454,10 +442,8 @@
     private boolean all_allowed;
 
     /**
-     * Create an empty PropertyPermissions object.
-     *
+     * Create an empty PropertyPermissionCollection object.
      */
-
     public PropertyPermissionCollection() {
         perms = new HashMap<>(32);     // Capacity for default policy
         all_allowed = false;
@@ -475,9 +461,7 @@
      * @exception SecurityException - if this PropertyPermissionCollection
      *                                object has been marked readonly
      */
-
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (! (permission instanceof PropertyPermission))
             throw new IllegalArgumentException("invalid permission: "+
                                                permission);
@@ -514,14 +498,12 @@
      * Check and see if this set of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
-
-    public boolean implies(Permission permission)
-    {
+    public boolean implies(Permission permission) {
         if (! (permission instanceof PropertyPermission))
                 return false;
 
@@ -655,8 +637,9 @@
      * Reads in a Hashtable of PropertyPermissions and saves them in the
      * perms field. Reads in all_allowed.
      */
-    private void readObject(ObjectInputStream in) throws IOException,
-    ClassNotFoundException {
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
         // Don't call defaultReadObject()
 
         // Read in serialized fields
--- a/jdk/src/share/classes/java/util/RegularEnumSet.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/RegularEnumSet.java	Wed Jul 05 18:26:11 2017 +0200
@@ -289,7 +289,7 @@
      * the same size, and every member of the given set is contained in
      * this set.
      *
-     * @param e object to be compared for equality with this set
+     * @param o object to be compared for equality with this set
      * @return <tt>true</tt> if the specified object is equal to this set
      */
     public boolean equals(Object o) {
--- a/jdk/src/share/classes/java/util/Scanner.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/Scanner.java	Wed Jul 05 18:26:11 2017 +0200
@@ -568,9 +568,8 @@
      * Constructs a <code>Scanner</code> that returns values scanned
      * from the specified source delimited by the specified pattern.
      *
-     * @param  source A character source implementing the Readable interface
+     * @param source A character source implementing the Readable interface
      * @param pattern A delimiting pattern
-     * @return A scanner with the specified source and pattern
      */
     private Scanner(Readable source, Pattern pattern) {
         assert source != null : "source should not be null";
--- a/jdk/src/share/classes/java/util/ServiceLoader.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/ServiceLoader.java	Wed Jul 05 18:26:11 2017 +0200
@@ -213,7 +213,7 @@
     }
 
     private ServiceLoader(Class<S> svc, ClassLoader cl) {
-        service = svc;
+        service = Objects.requireNonNull(svc, "Service interface cannot be null");
         loader = cl;
         reload();
     }
--- a/jdk/src/share/classes/java/util/TimeZone.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/TimeZone.java	Wed Jul 05 18:26:11 2017 +0200
@@ -221,7 +221,7 @@
      * @param date the milliseconds (since January 1, 1970,
      * 00:00:00.000 GMT) at which the time zone offset and daylight
      * saving amount are found
-     * @param offset an array of int where the raw GMT offset
+     * @param offsets an array of int where the raw GMT offset
      * (offset[0]) and daylight saving amount (offset[1]) are stored,
      * or null if those values are not needed. The method assumes that
      * the length of the given array is two or larger.
--- a/jdk/src/share/classes/java/util/logging/Logging.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/logging/Logging.java	Wed Jul 05 18:26:11 2017 +0200
@@ -41,8 +41,8 @@
  * @since 1.5
  *
  * @see javax.management
- * @see java.util.Logger
- * @see java.util.LogManager
+ * @see Logger
+ * @see LogManager
  */
 class Logging implements LoggingMXBean {
 
--- a/jdk/src/share/classes/java/util/prefs/XmlSupport.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/java/util/prefs/XmlSupport.java	Wed Jul 05 18:26:11 2017 +0200
@@ -92,7 +92,7 @@
      * @throws BackingStoreException if preference data cannot be read from
      *         backing store.
      * @throws IllegalStateException if this node (or an ancestor) has been
-     *         removed with the {@link #removeNode()} method.
+     *         removed with the {@link Preferences#removeNode()} method.
      */
     static void export(OutputStream os, final Preferences p, boolean subTree)
         throws IOException, BackingStoreException {
--- a/jdk/src/share/classes/javax/crypto/CryptoAllPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/crypto/CryptoAllPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -136,8 +136,7 @@
      * @exception SecurityException - if this CryptoAllPermissionCollection
      * object has been marked readonly
      */
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (isReadOnly())
             throw new SecurityException("attempt to add a Permission to " +
                                         "a readonly PermissionCollection");
@@ -152,13 +151,12 @@
      * Check and see if this set of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if the given permission is implied by this
      * CryptoAllPermissionCollection.
      */
-    public boolean implies(Permission permission)
-    {
+    public boolean implies(Permission permission) {
         if (!(permission instanceof CryptoPermission)) {
             return false;
         }
--- a/jdk/src/share/classes/javax/crypto/CryptoPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/crypto/CryptoPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -471,8 +471,8 @@
  * @author Sharon Liu
  */
 final class CryptoPermissionCollection extends PermissionCollection
-implements Serializable {
-
+    implements Serializable
+{
     private static final long serialVersionUID = -511215555898802763L;
 
     private Vector<Permission> permissions;
@@ -493,8 +493,7 @@
      * @exception SecurityException - if this CryptoPermissionCollection
      * object has been marked <i>readOnly</i>.
      */
-    public void add(Permission permission)
-    {
+    public void add(Permission permission) {
         if (isReadOnly())
             throw new SecurityException("attempt to add a Permission " +
                                         "to a readonly PermissionCollection");
@@ -506,10 +505,10 @@
     }
 
     /**
-      * Check and see if this CryptoPermission object implies
-      * the given Permission object.
+     * Check and see if this CryptoPermission object implies
+     * the given Permission object.
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if the given permission  is implied by this
      * CryptoPermissionCollection, false if not.
@@ -538,8 +537,7 @@
      * @return an enumeration of all the CryptoPermission objects.
      */
 
-    public Enumeration<Permission> elements()
-    {
+    public Enumeration<Permission> elements() {
         return permissions.elements();
     }
 }
--- a/jdk/src/share/classes/javax/crypto/CryptoPolicyParser.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/crypto/CryptoPolicyParser.java	Wed Jul 05 18:26:11 2017 +0200
@@ -54,7 +54,7 @@
  * @author Sharon Liu
  *
  * @see java.security.Permissions
- * @see java.security.spec.AlgrithomParameterSpec
+ * @see java.security.spec.AlgorithmParameterSpec
  * @see javax.crypto.CryptoPermission
  * @see javax.crypto.CryptoAllPermission
  * @see javax.crypto.CryptoPermissions
--- a/jdk/src/share/classes/javax/crypto/NullCipherSpi.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/crypto/NullCipherSpi.java	Wed Jul 05 18:26:11 2017 +0200
@@ -33,7 +33,7 @@
  * tranform the plaintext.
  *
  * @author  Li Gong
- * @see Nullcipher
+ * @see NullCipher
  *
  * @since 1.4
  */
--- a/jdk/src/share/classes/javax/management/loading/MLet.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/management/loading/MLet.java	Wed Jul 05 18:26:11 2017 +0200
@@ -798,7 +798,7 @@
       * Allows the m-let to perform any operations it needs before being unregistered
       * by the MBean server.
       *
-      * @exception java.langException This exception should be caught
+      * @exception java.lang.Exception This exception should be caught
       * by the MBean server and re-thrown as an
       * MBeanRegistrationException.
       */
--- a/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java	Wed Jul 05 18:26:11 2017 +0200
@@ -189,7 +189,7 @@
          *          May be null if the property is write-only.
          * @param setter The method used for writing the attribute value.
          *          May be null if the attribute is read-only.
-         * @exception IntrospectionException There is a consistency
+         * @exception javax.management.IntrospectionException There is a consistency
          * problem in the definition of this attribute.
          *
          */
@@ -233,7 +233,7 @@
          * it is null, then a default descriptor will be created.  If
          * the descriptor does not contain the field "displayName" this field is added
          * in the descriptor with its default value.
-         * @exception IntrospectionException There is a consistency
+         * @exception javax.management.IntrospectionException There is a consistency
          * problem in the definition of this attribute.
          * @exception RuntimeOperationsException Wraps an
          * IllegalArgumentException. The descriptor is invalid, or descriptor
--- a/jdk/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/management/openmbean/CompositeDataInvocationHandler.java	Wed Jul 05 18:26:11 2017 +0200
@@ -124,11 +124,6 @@
        <p>Construct a handler backed by the given {@code
        CompositeData}.</p>
 
-       @param mbsc the {@code MBeanServerConnection} related to this
-       {@code CompositeData}.  This is only relevant if a method in
-       the interface for which this is an invocation handler returns
-       a type that is an MXBean interface.  Otherwise, it can be null.
-
        @param compositeData the {@code CompositeData} that will supply
        information to getters.
 
--- a/jdk/src/share/classes/javax/naming/spi/NamingManager.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/naming/spi/NamingManager.java	Wed Jul 05 18:26:11 2017 +0200
@@ -416,7 +416,7 @@
      *                  specified.
      *                  See the <code>getObjectInstance</code> method for
      *                  details.
-     * @param ctx       The context relative to which <code>name</code> is
+     * @param nameCtx   The context relative to which <code>name</code> is
      *                  specified, or null for the default initial context.
      *                  See the <code>getObjectInstance</code> method for
      *                  details.
--- a/jdk/src/share/classes/javax/security/auth/kerberos/DelegationPermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/DelegationPermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -178,7 +178,6 @@
      *
      * @return a hash code value for this object.
      */
-
     public int hashCode() {
         return getName().hashCode();
     }
@@ -278,12 +277,11 @@
      * Check and see if this collection of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if "permission" is a proper subset of a permission in
      * the collection, false if not.
      */
-
     public boolean implies(Permission permission) {
         if (! (permission instanceof DelegationPermission))
                 return false;
@@ -310,7 +308,6 @@
      * @exception SecurityException - if this PermissionCollection object
      *                                has been marked readonly
      */
-
     public void add(Permission permission) {
         if (! (permission instanceof DelegationPermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -329,7 +326,6 @@
      *
      * @return an enumeration of all the DelegationPermission objects.
      */
-
     public Enumeration<Permission> elements() {
         // Convert Iterator into Enumeration
         synchronized (this) {
@@ -376,8 +372,9 @@
      * Reads in a Vector of DelegationPermissions and saves them in the perms field.
      */
     @SuppressWarnings("unchecked")
-    private void readObject(ObjectInputStream in) throws IOException,
-    ClassNotFoundException {
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
         // Don't call defaultReadObject()
 
         // Read in serialized fields
--- a/jdk/src/share/classes/javax/security/auth/kerberos/ServicePermission.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/ServicePermission.java	Wed Jul 05 18:26:11 2017 +0200
@@ -259,7 +259,6 @@
      * Always returns present actions in the following order:
      * initiate, accept.
      */
-
     public String getActions() {
         if (actions == null)
             actions = getActions(this.mask);
@@ -280,7 +279,6 @@
      * @return a new PermissionCollection object suitable for storing
      * ServicePermissions.
      */
-
     public PermissionCollection newPermissionCollection() {
         return new KrbServicePermissionCollection();
     }
@@ -290,7 +288,6 @@
      *
      * @return the actions mask.
      */
-
     int getMask() {
         return mask;
     }
@@ -301,7 +298,6 @@
      * @param action the action string
      * @return the action mask
      */
-
     private static int getMask(String action) {
 
         if (action == null) {
@@ -468,12 +464,11 @@
      * Check and see if this collection of permissions implies the permissions
      * expressed in "permission".
      *
-     * @param p the Permission object to compare
+     * @param permission the Permission object to compare
      *
      * @return true if "permission" is a proper subset of a permission in
      * the collection, false if not.
      */
-
     public boolean implies(Permission permission) {
         if (! (permission instanceof ServicePermission))
                 return false;
@@ -517,7 +512,6 @@
      * @exception SecurityException - if this PermissionCollection object
      *                                has been marked readonly
      */
-
     public void add(Permission permission) {
         if (! (permission instanceof ServicePermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -584,8 +578,9 @@
      * Reads in a Vector of ServicePermissions and saves them in the perms field.
      */
     @SuppressWarnings("unchecked")
-    private void readObject(ObjectInputStream in) throws IOException,
-    ClassNotFoundException {
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException
+    {
         // Don't call defaultReadObject()
 
         // Read in serialized fields
--- a/jdk/src/share/classes/javax/sql/ConnectionPoolDataSource.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/sql/ConnectionPoolDataSource.java	Wed Jul 05 18:26:11 2017 +0200
@@ -48,7 +48,7 @@
    *         connection to the database that this
    *         <code>ConnectionPoolDataSource</code> object represents
    * @exception SQLException if a database access error occurs
-   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+   * @exception java.sql.SQLFeatureNotSupportedException if the JDBC driver does not support
    * this method
    * @since 1.4
    */
@@ -64,7 +64,7 @@
    *         connection to the database that this
    *         <code>ConnectionPoolDataSource</code> object represents
    * @exception SQLException if a database access error occurs
-   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+   * @exception java.sql.SQLFeatureNotSupportedException if the JDBC driver does not support
    * this method
    * @since 1.4
    */
--- a/jdk/src/share/classes/javax/sql/PooledConnection.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/sql/PooledConnection.java	Wed Jul 05 18:26:11 2017 +0200
@@ -102,7 +102,7 @@
    * @return  a <code>Connection</code> object that is a handle to
    *          this <code>PooledConnection</code> object
    * @exception SQLException if a database access error occurs
-   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+   * @exception java.sql.SQLFeatureNotSupportedException if the JDBC driver does not support
    * this method
    * @since 1.4
    */
@@ -117,7 +117,7 @@
    * information.
    *
    * @exception SQLException if a database access error occurs
-   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+   * @exception java.sql.SQLFeatureNotSupportedException if the JDBC driver does not support
    * this method
    * @since 1.4
    */
--- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java	Wed Jul 05 18:26:11 2017 +0200
@@ -293,7 +293,7 @@
      *           SyncProvider.DATASOURCE_TABLE_LOCK,
      *           SyncProvider.DATASOURCE_DB_LOCK
      * </pre>
-     * @throws SyncProviderExceptiom if an error occurs determining the data
+     * @throws SyncProviderException if an error occurs determining the data
      *        source locking level.
      * @see #setDataSourceLock
 
--- a/jdk/src/share/classes/javax/swing/ToolTipManager.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/swing/ToolTipManager.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -217,6 +217,25 @@
         return exitTimer.getInitialDelay();
     }
 
+    // Returns GraphicsConfiguration instance that toFind belongs to or null
+    // if drawing point is set to a point beyond visible screen area (e.g.
+    // Point(20000, 20000))
+    private GraphicsConfiguration getDrawingGC(Point toFind) {
+        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        GraphicsDevice devices[] = env.getScreenDevices();
+        for (GraphicsDevice device : devices) {
+            GraphicsConfiguration configs[] = device.getConfigurations();
+            for (GraphicsConfiguration config : configs) {
+                Rectangle rect = config.getBounds();
+                if (rect.contains(toFind)) {
+                    return config;
+                }
+            }
+        }
+
+        return null;
+    }
+
     void showTipWindow() {
         if(insideComponent == null || !insideComponent.isShowing())
             return;
@@ -231,9 +250,25 @@
         if (enabled) {
             Dimension size;
             Point screenLocation = insideComponent.getLocationOnScreen();
-            Point location = new Point();
-            GraphicsConfiguration gc;
-            gc = insideComponent.getGraphicsConfiguration();
+            Point location;
+
+            Point toFind;
+            if (preferredLocation != null) {
+                toFind = new Point(screenLocation.x + preferredLocation.x,
+                        screenLocation.y + preferredLocation.y);
+            } else {
+                toFind = mouseEvent.getLocationOnScreen();
+            }
+
+            GraphicsConfiguration gc = getDrawingGC(toFind);
+            if (gc == null) {
+                toFind = mouseEvent.getLocationOnScreen();
+                gc = getDrawingGC(toFind);
+                if (gc == null) {
+                    gc = insideComponent.getGraphicsConfiguration();
+                }
+            }
+
             Rectangle sBounds = gc.getBounds();
             Insets screenInsets = Toolkit.getDefaultToolkit()
                                              .getScreenInsets(gc);
@@ -253,14 +288,13 @@
             size = tip.getPreferredSize();
 
             if(preferredLocation != null) {
-                location.x = screenLocation.x + preferredLocation.x;
-                location.y = screenLocation.y + preferredLocation.y;
+                location = toFind;
         if (!leftToRight) {
             location.x -= size.width;
         }
             } else {
-                location.x = screenLocation.x + mouseEvent.getX();
-                location.y = screenLocation.y + mouseEvent.getY() + 20;
+                location = new Point(screenLocation.x + mouseEvent.getX(),
+                        screenLocation.y + mouseEvent.getY() + 20);
         if (!leftToRight) {
             if(location.x - size.width>=0) {
                 location.x -= size.width;
--- a/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java	Wed Jul 05 18:26:11 2017 +0200
@@ -57,6 +57,8 @@
     RecentSwatchPanel recentSwatchPanel;
     MouseListener mainSwatchListener;
     MouseListener recentSwatchListener;
+    private KeyListener mainSwatchKeyListener;
+    private KeyListener recentSwatchKeyListener;
 
     public DefaultSwatchChooserPanel() {
         super();
@@ -151,10 +153,14 @@
         recentSwatchPanel.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,
                                             recentStr);
 
+        mainSwatchKeyListener = new MainSwatchKeyListener();
         mainSwatchListener = new MainSwatchListener();
         swatchPanel.addMouseListener(mainSwatchListener);
+        swatchPanel.addKeyListener(mainSwatchKeyListener);
         recentSwatchListener = new RecentSwatchListener();
+        recentSwatchKeyListener = new RecentSwatchKeyListener();
         recentSwatchPanel.addMouseListener(recentSwatchListener);
+        recentSwatchPanel.addKeyListener(recentSwatchKeyListener);
 
         JPanel mainHolder = new JPanel(new BorderLayout());
         Border border = new CompoundBorder( new LineBorder(Color.black),
@@ -196,11 +202,17 @@
     public void uninstallChooserPanel(JColorChooser enclosingChooser) {
         super.uninstallChooserPanel(enclosingChooser);
         swatchPanel.removeMouseListener(mainSwatchListener);
+        swatchPanel.removeKeyListener(mainSwatchKeyListener);
         recentSwatchPanel.removeMouseListener(recentSwatchListener);
+        recentSwatchPanel.removeKeyListener(recentSwatchKeyListener);
+
         swatchPanel = null;
         recentSwatchPanel = null;
         mainSwatchListener = null;
+        mainSwatchKeyListener = null;
         recentSwatchListener = null;
+        recentSwatchKeyListener = null;
+
         removeAll();  // strip out all the sub-components
     }
 
@@ -209,11 +221,32 @@
     }
 
 
+    private class RecentSwatchKeyListener extends KeyAdapter {
+        public void keyPressed(KeyEvent e) {
+            if (KeyEvent.VK_SPACE == e.getKeyCode()) {
+                Color color = recentSwatchPanel.getSelectedColor();
+                setSelectedColor(color);
+            }
+        }
+    }
+
+    private class MainSwatchKeyListener extends KeyAdapter {
+        public void keyPressed(KeyEvent e) {
+            if (KeyEvent.VK_SPACE == e.getKeyCode()) {
+                Color color = swatchPanel.getSelectedColor();
+                setSelectedColor(color);
+                recentSwatchPanel.setMostRecentColor(color);
+            }
+        }
+    }
+
     class RecentSwatchListener extends MouseAdapter implements Serializable {
         public void mousePressed(MouseEvent e) {
             if (isEnabled()) {
                 Color color = recentSwatchPanel.getColorForLocation(e.getX(), e.getY());
+                recentSwatchPanel.setSelectedColorFromLocation(e.getX(), e.getY());
                 setSelectedColor(color);
+                recentSwatchPanel.requestFocusInWindow();
             }
         }
     }
@@ -223,7 +256,9 @@
             if (isEnabled()) {
                 Color color = swatchPanel.getColorForLocation(e.getX(), e.getY());
                 setSelectedColor(color);
+                swatchPanel.setSelectedColorFromLocation(e.getX(), e.getY());
                 recentSwatchPanel.setMostRecentColor(color);
+                swatchPanel.requestFocusInWindow();
             }
         }
     }
@@ -239,18 +274,81 @@
     protected Dimension numSwatches;
     protected Dimension gap;
 
+    private int selRow;
+    private int selCol;
+
     public SwatchPanel() {
         initValues();
         initColors();
         setToolTipText(""); // register for events
         setOpaque(true);
         setBackground(Color.white);
-        setRequestFocusEnabled(false);
+        setFocusable(true);
         setInheritsPopupMenu(true);
+
+        addFocusListener(new FocusAdapter() {
+            public void focusGained(FocusEvent e) {
+                repaint();
+            }
+
+            public void focusLost(FocusEvent e) {
+                repaint();
+            }
+        });
+
+        addKeyListener(new KeyAdapter() {
+            public void keyPressed(KeyEvent e) {
+                int typed = e.getKeyCode();
+                switch (typed) {
+                    case KeyEvent.VK_UP:
+                        if (selRow > 0) {
+                            selRow--;
+                            repaint();
+                        }
+                        break;
+                    case KeyEvent.VK_DOWN:
+                        if (selRow < numSwatches.height - 1) {
+                            selRow++;
+                            repaint();
+                        }
+                        break;
+                    case KeyEvent.VK_LEFT:
+                        if (selCol > 0 && SwatchPanel.this.getComponentOrientation().isLeftToRight()) {
+                            selCol--;
+                            repaint();
+                        } else if (selCol < numSwatches.width - 1
+                                && !SwatchPanel.this.getComponentOrientation().isLeftToRight()) {
+                            selCol++;
+                            repaint();
+                        }
+                        break;
+                    case KeyEvent.VK_RIGHT:
+                        if (selCol < numSwatches.width - 1
+                                && SwatchPanel.this.getComponentOrientation().isLeftToRight()) {
+                            selCol++;
+                            repaint();
+                        } else if (selCol > 0 && !SwatchPanel.this.getComponentOrientation().isLeftToRight()) {
+                            selCol--;
+                            repaint();
+                        }
+                        break;
+                    case KeyEvent.VK_HOME:
+                        selCol = 0;
+                        selRow = 0;
+                        repaint();
+                        break;
+                    case KeyEvent.VK_END:
+                        selCol = numSwatches.width - 1;
+                        selRow = numSwatches.height - 1;
+                        repaint();
+                        break;
+                }
+            }
+        });
     }
 
-    public boolean isFocusTraversable() {
-        return false;
+    public Color getSelectedColor() {
+        return getColorForCell(selCol, selRow);
     }
 
     protected void initValues() {
@@ -263,11 +361,10 @@
          for (int row = 0; row < numSwatches.height; row++) {
             int y = row * (swatchSize.height + gap.height);
             for (int column = 0; column < numSwatches.width; column++) {
-
-              g.setColor( getColorForCell(column, row) );
+                Color c = getColorForCell(column, row);
+                g.setColor(c);
                 int x;
-                if ((!this.getComponentOrientation().isLeftToRight()) &&
-                    (this instanceof RecentSwatchPanel)) {
+                if (!this.getComponentOrientation().isLeftToRight()) {
                     x = (numSwatches.width - column - 1) * (swatchSize.width + gap.width);
                 } else {
                     x = column * (swatchSize.width + gap.width);
@@ -276,6 +373,20 @@
                 g.setColor(Color.black);
                 g.drawLine( x+swatchSize.width-1, y, x+swatchSize.width-1, y+swatchSize.height-1);
                 g.drawLine( x, y+swatchSize.height-1, x+swatchSize.width-1, y+swatchSize.height-1);
+
+                if (selRow == row && selCol == column && this.isFocusOwner()) {
+                    Color c2 = new Color(c.getRed() < 125 ? 255 : 0,
+                            c.getGreen() < 125 ? 255 : 0,
+                            c.getBlue() < 125 ? 255 : 0);
+                    g.setColor(c2);
+
+                    g.drawLine(x, y, x + swatchSize.width - 1, y);
+                    g.drawLine(x, y, x, y + swatchSize.height - 1);
+                    g.drawLine(x + swatchSize.width - 1, y, x + swatchSize.width - 1, y + swatchSize.height - 1);
+                    g.drawLine(x, y + swatchSize.height - 1, x + swatchSize.width - 1, y + swatchSize.height - 1);
+                    g.drawLine(x, y, x + swatchSize.width - 1, y + swatchSize.height - 1);
+                    g.drawLine(x, y + swatchSize.height - 1, x + swatchSize.width - 1, y);
+                }
             }
          }
     }
@@ -296,10 +407,19 @@
         return color.getRed()+", "+ color.getGreen() + ", " + color.getBlue();
     }
 
+    public void setSelectedColorFromLocation(int x, int y) {
+        if (!this.getComponentOrientation().isLeftToRight()) {
+            selCol = numSwatches.width - x / (swatchSize.width + gap.width) - 1;
+        } else {
+            selCol = x / (swatchSize.width + gap.width);
+        }
+        selRow = y / (swatchSize.height + gap.height);
+        repaint();
+    }
+
     public Color getColorForLocation( int x, int y ) {
         int column;
-        if ((!this.getComponentOrientation().isLeftToRight()) &&
-            (this instanceof RecentSwatchPanel)) {
+        if (!this.getComponentOrientation().isLeftToRight()) {
             column = numSwatches.width - x / (swatchSize.width + gap.width) - 1;
         } else {
             column = x / (swatchSize.width + gap.width);
--- a/jdk/src/share/classes/sun/net/www/http/HttpClient.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/net/www/http/HttpClient.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2012, 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
@@ -36,6 +36,7 @@
 import sun.net.www.ParseUtil;
 import sun.net.www.protocol.http.HttpURLConnection;
 import sun.util.logging.PlatformLogger;
+import static sun.net.www.protocol.http.HttpURLConnection.TunnelState.*;
 
 /**
  * @author Herb Jellinek
@@ -244,16 +245,17 @@
      */
     public static HttpClient New(URL url)
     throws IOException {
-        return HttpClient.New(url, Proxy.NO_PROXY, -1, true);
+        return HttpClient.New(url, Proxy.NO_PROXY, -1, true, null);
     }
 
     public static HttpClient New(URL url, boolean useCache)
         throws IOException {
-        return HttpClient.New(url, Proxy.NO_PROXY, -1, useCache);
+        return HttpClient.New(url, Proxy.NO_PROXY, -1, useCache, null);
     }
 
-    public static HttpClient New(URL url, Proxy p, int to, boolean useCache)
-        throws IOException {
+    public static HttpClient New(URL url, Proxy p, int to, boolean useCache,
+        HttpURLConnection httpuc) throws IOException
+    {
         if (p == null) {
             p = Proxy.NO_PROXY;
         }
@@ -261,6 +263,13 @@
         /* see if one's already around */
         if (useCache) {
             ret = kac.get(url, null);
+            if (ret != null && httpuc != null &&
+                httpuc.streaming() &&
+                httpuc.getRequestMethod() == "POST") {
+                if (!ret.available())
+                    ret = null;
+            }
+
             if (ret != null) {
                 if ((ret.proxy != null && ret.proxy.equals(p)) ||
                     (ret.proxy == null && p == null)) {
@@ -268,6 +277,8 @@
                         ret.cachedHttpClient = true;
                         assert ret.inCache;
                         ret.inCache = false;
+                        if (httpuc != null && ret.needsTunneling())
+                            httpuc.setTunnelState(TUNNELING);
                         PlatformLogger logger = HttpURLConnection.getHttpLogger();
                         if (logger.isLoggable(PlatformLogger.FINEST)) {
                             logger.finest("KeepAlive stream retrieved from the cache, " + ret);
@@ -302,20 +313,25 @@
         return ret;
     }
 
-    public static HttpClient New(URL url, Proxy p, int to) throws IOException {
-        return New(url, p, to, true);
+    public static HttpClient New(URL url, Proxy p, int to,
+        HttpURLConnection httpuc) throws IOException
+    {
+        return New(url, p, to, true, httpuc);
     }
 
     public static HttpClient New(URL url, String proxyHost, int proxyPort,
                                  boolean useCache)
         throws IOException {
-        return New(url, newHttpProxy(proxyHost, proxyPort, "http"), -1, useCache);
+        return New(url, newHttpProxy(proxyHost, proxyPort, "http"),
+            -1, useCache, null);
     }
 
     public static HttpClient New(URL url, String proxyHost, int proxyPort,
-                                 boolean useCache, int to)
+                                 boolean useCache, int to,
+                                 HttpURLConnection httpuc)
         throws IOException {
-        return New(url, newHttpProxy(proxyHost, proxyPort, "http"), to, useCache);
+        return New(url, newHttpProxy(proxyHost, proxyPort, "http"),
+            to, useCache, httpuc);
     }
 
     /* return it to the cache as still usable, if:
@@ -344,6 +360,34 @@
         }
     }
 
+    protected synchronized boolean available() throws IOException {
+        boolean available = true;
+        int old = serverSocket.getSoTimeout();
+        serverSocket.setSoTimeout(1);
+        BufferedInputStream tmpbuf =
+            new BufferedInputStream(serverSocket.getInputStream());
+
+        PlatformLogger logger = HttpURLConnection.getHttpLogger();
+        try {
+            int r = tmpbuf.read();
+            if (r == -1) {
+                if (logger.isLoggable(PlatformLogger.FINEST)) {
+                    logger.finest("HttpClient.available(): " +
+                        "read returned -1: not available");
+                }
+                available = false;
+            }
+        } catch (SocketTimeoutException e) {
+            if (logger.isLoggable(PlatformLogger.FINEST)) {
+                logger.finest("HttpClient.available(): " +
+                    "SocketTimeout: its available");
+            }
+        } finally {
+            serverSocket.setSoTimeout(old);
+        }
+        return available;
+    }
+
     protected synchronized void putInKeepAliveCache() {
         if (inCache) {
             assert false : "Duplicate put to keep alive cache";
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2012, 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
@@ -351,7 +351,7 @@
     private HttpClient reuseClient = null;
 
     /* Tunnel states */
-    enum TunnelState {
+    public enum TunnelState {
         /* No tunnel */
         NONE,
 
@@ -662,7 +662,7 @@
      */
     protected void setNewClient (URL url, boolean useCache)
         throws IOException {
-        http = HttpClient.New(url, null, -1, useCache, connectTimeout);
+        http = HttpClient.New(url, null, -1, useCache, connectTimeout, this);
         http.setReadTimeout(readTimeout);
     }
 
@@ -703,7 +703,8 @@
                                            String proxyHost, int proxyPort,
                                            boolean useCache)
         throws IOException {
-        http = HttpClient.New (url, proxyHost, proxyPort, useCache, connectTimeout);
+        http = HttpClient.New (url, proxyHost, proxyPort, useCache,
+            connectTimeout, this);
         http.setReadTimeout(readTimeout);
     }
 
@@ -994,14 +995,14 @@
     // subclass HttpsClient will overwrite & return an instance of HttpsClient
     protected HttpClient getNewHttpClient(URL url, Proxy p, int connectTimeout)
         throws IOException {
-        return HttpClient.New(url, p, connectTimeout);
+        return HttpClient.New(url, p, connectTimeout, this);
     }
 
     // subclass HttpsClient will overwrite & return an instance of HttpsClient
     protected HttpClient getNewHttpClient(URL url, Proxy p,
                                           int connectTimeout, boolean useCache)
         throws IOException {
-        return HttpClient.New(url, p, connectTimeout, useCache);
+        return HttpClient.New(url, p, connectTimeout, useCache, this);
     }
 
     private void expect100Continue() throws IOException {
@@ -1144,7 +1145,7 @@
         }
     }
 
-    private boolean streaming () {
+    public boolean streaming () {
         return (fixedContentLength != -1) || (fixedContentLengthLong != -1) ||
                (chunkLength != -1);
     }
@@ -1739,7 +1740,7 @@
      *
      * @param  the state
      */
-    void setTunnelState(TunnelState tunnelState) {
+    public void setTunnelState(TunnelState tunnelState) {
         this.tunnelState = tunnelState;
     }
 
--- a/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1059,6 +1059,28 @@
         return translateReadyOps(ops, 0, sk);
     }
 
+    // package-private
+    int poll(int events, long timeout) throws IOException {
+        assert Thread.holdsLock(blockingLock()) && !isBlocking();
+
+        synchronized (readLock) {
+            int n = 0;
+            try {
+                begin();
+                synchronized (stateLock) {
+                    if (!isOpen())
+                        return 0;
+                    readerThread = NativeThread.current();
+                }
+                n = Net.poll(fd, events, timeout);
+            } finally {
+                readerThread = 0;
+                end(n > 0);
+            }
+            return n;
+        }
+    }
+
     /**
      * Translates an interest operation set into a native poll event set
      */
--- a/jdk/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java	Wed Jul 05 18:26:11 2017 +0200
@@ -176,40 +176,31 @@
             return dc.receive(bb);
         }
 
-        // Implement timeout with a selector
-        SelectionKey sk = null;
-        Selector sel = null;
         dc.configureBlocking(false);
         try {
             int n;
             SocketAddress sender;
             if ((sender = dc.receive(bb)) != null)
                 return sender;
-            sel = Util.getTemporarySelector(dc);
-            sk = dc.register(sel, SelectionKey.OP_READ);
             long to = timeout;
             for (;;) {
                 if (!dc.isOpen())
                      throw new ClosedChannelException();
                 long st = System.currentTimeMillis();
-                int ns = sel.select(to);
-                if (ns > 0 && sk.isReadable()) {
+                int result = dc.poll(PollArrayWrapper.POLLIN, to);
+                if (result > 0 &&
+                        ((result & PollArrayWrapper.POLLIN) != 0)) {
                     if ((sender = dc.receive(bb)) != null)
                         return sender;
                 }
-                sel.selectedKeys().remove(sk);
                 to -= System.currentTimeMillis() - st;
                 if (to <= 0)
                     throw new SocketTimeoutException();
 
             }
         } finally {
-            if (sk != null)
-                sk.cancel();
             if (dc.isOpen())
                 dc.configureBlocking(true);
-            if (sel != null)
-                Util.releaseTemporarySelector(sel);
         }
     }
 
--- a/jdk/src/share/classes/sun/nio/ch/Net.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/Net.java	Wed Jul 05 18:26:11 2017 +0200
@@ -409,6 +409,9 @@
                                              int level, int opt, int arg)
         throws IOException;
 
+    static native int poll(FileDescriptor fd, int events, long timeout)
+        throws IOException;
+
     // -- Multicast support --
 
 
--- a/jdk/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java	Wed Jul 05 18:26:11 2017 +0200
@@ -102,37 +102,26 @@
                     return sc.socket();
                 }
 
-                // Implement timeout with a selector
-                SelectionKey sk = null;
-                Selector sel = null;
                 ssc.configureBlocking(false);
                 try {
                     SocketChannel sc;
                     if ((sc = ssc.accept()) != null)
                         return sc.socket();
-                    sel = Util.getTemporarySelector(ssc);
-                    sk = ssc.register(sel, SelectionKey.OP_ACCEPT);
                     long to = timeout;
                     for (;;) {
                         if (!ssc.isOpen())
                             throw new ClosedChannelException();
                         long st = System.currentTimeMillis();
-                        int ns = sel.select(to);
-                        if (ns > 0 &&
-                            sk.isAcceptable() && ((sc = ssc.accept()) != null))
+                        int result = ssc.poll(PollArrayWrapper.POLLIN, to);
+                        if (result > 0 && ((sc = ssc.accept()) != null))
                             return sc.socket();
-                        sel.selectedKeys().remove(sk);
                         to -= System.currentTimeMillis() - st;
                         if (to <= 0)
                             throw new SocketTimeoutException();
                     }
                 } finally {
-                    if (sk != null)
-                        sk.cancel();
                     if (ssc.isOpen())
                         ssc.configureBlocking(true);
-                    if (sel != null)
-                        Util.releaseTemporarySelector(sel);
                 }
 
             } catch (Exception x) {
--- a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -324,6 +324,28 @@
         return translateReadyOps(ops, 0, sk);
     }
 
+    // package-private
+    int poll(int events, long timeout) throws IOException {
+        assert Thread.holdsLock(blockingLock()) && !isBlocking();
+
+        synchronized (lock) {
+            int n = 0;
+            try {
+                begin();
+                synchronized (stateLock) {
+                    if (!isOpen())
+                        return 0;
+                    thread = NativeThread.current();
+                }
+                n = Net.poll(fd, events, timeout);
+            } finally {
+                thread = 0;
+                end(n > 0);
+            }
+            return n;
+        }
+    }
+
     /**
      * Translates an interest operation set into a native poll event set
      */
--- a/jdk/src/share/classes/sun/nio/ch/SocketAdaptor.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/SocketAdaptor.java	Wed Jul 05 18:26:11 2017 +0200
@@ -97,25 +97,19 @@
                     return;
                 }
 
-                // Implement timeout with a selector
-                SelectionKey sk = null;
-                Selector sel = null;
                 sc.configureBlocking(false);
                 try {
                     if (sc.connect(remote))
                         return;
-                    sel = Util.getTemporarySelector(sc);
-                    sk = sc.register(sel, SelectionKey.OP_CONNECT);
                     long to = timeout;
                     for (;;) {
                         if (!sc.isOpen())
                             throw new ClosedChannelException();
                         long st = System.currentTimeMillis();
-                        int ns = sel.select(to);
-                        if (ns > 0 &&
-                            sk.isConnectable() && sc.finishConnect())
+
+                        int result = sc.poll(PollArrayWrapper.POLLCONN, to);
+                        if (result > 0 && sc.finishConnect())
                             break;
-                        sel.selectedKeys().remove(sk);
                         to -= System.currentTimeMillis() - st;
                         if (to <= 0) {
                             try {
@@ -125,12 +119,8 @@
                         }
                     }
                 } finally {
-                    if (sk != null)
-                        sk.cancel();
                     if (sc.isOpen())
                         sc.configureBlocking(true);
-                    if (sel != null)
-                        Util.releaseTemporarySelector(sel);
                 }
 
             } catch (Exception x) {
@@ -199,39 +189,29 @@
                     throw new IllegalBlockingModeException();
                 if (timeout == 0)
                     return sc.read(bb);
+                sc.configureBlocking(false);
 
-                // Implement timeout with a selector
-                SelectionKey sk = null;
-                Selector sel = null;
-                sc.configureBlocking(false);
                 try {
                     int n;
                     if ((n = sc.read(bb)) != 0)
                         return n;
-                    sel = Util.getTemporarySelector(sc);
-                    sk = sc.register(sel, SelectionKey.OP_READ);
                     long to = timeout;
                     for (;;) {
                         if (!sc.isOpen())
                             throw new ClosedChannelException();
                         long st = System.currentTimeMillis();
-                        int ns = sel.select(to);
-                        if (ns > 0 && sk.isReadable()) {
+                        int result = sc.poll(PollArrayWrapper.POLLIN, to);
+                        if (result > 0) {
                             if ((n = sc.read(bb)) != 0)
                                 return n;
                         }
-                        sel.selectedKeys().remove(sk);
                         to -= System.currentTimeMillis() - st;
                         if (to <= 0)
                             throw new SocketTimeoutException();
                     }
                 } finally {
-                    if (sk != null)
-                        sk.cancel();
                     if (sc.isOpen())
                         sc.configureBlocking(true);
-                    if (sel != null)
-                        Util.releaseTemporarySelector(sel);
                 }
 
             }
--- a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -914,6 +914,28 @@
         return translateReadyOps(ops, 0, sk);
     }
 
+    // package-private
+    int poll(int events, long timeout) throws IOException {
+        assert Thread.holdsLock(blockingLock()) && !isBlocking();
+
+        synchronized (readLock) {
+            int n = 0;
+            try {
+                begin();
+                synchronized (stateLock) {
+                    if (!isOpen())
+                        return 0;
+                    readerThread = NativeThread.current();
+                }
+                n = Net.poll(fd, events, timeout);
+            } finally {
+                readerCleanup();
+                end(n > 0);
+            }
+            return n;
+        }
+    }
+
     /**
      * Translates an interest operation set into a native poll event set
      */
--- a/jdk/src/share/classes/sun/nio/ch/Util.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/Util.java	Wed Jul 05 18:26:11 2017 +0200
@@ -218,66 +218,6 @@
         ((DirectBuffer)buf).cleaner().clean();
     }
 
-    private static class SelectorWrapper {
-        private Selector sel;
-        private SelectorWrapper (Selector sel) {
-            this.sel = sel;
-            Cleaner.create(this, new Closer(sel));
-        }
-        private static class Closer implements Runnable {
-            private Selector sel;
-            private Closer (Selector sel) {
-                this.sel = sel;
-            }
-            public void run () {
-                try {
-                    sel.close();
-                } catch (Throwable th) {
-                    throw new Error(th);
-                }
-            }
-        }
-        public Selector get() { return sel;}
-    }
-
-    // Per-thread cached selector
-    private static ThreadLocal<SoftReference<SelectorWrapper>> localSelector
-        = new ThreadLocal<SoftReference<SelectorWrapper>>();
-    // Hold a reference to the selWrapper object to prevent it from
-    // being cleaned when the temporary selector wrapped is on lease.
-    private static ThreadLocal<SelectorWrapper> localSelectorWrapper
-        = new ThreadLocal<SelectorWrapper>();
-
-    // When finished, invoker must ensure that selector is empty
-    // by cancelling any related keys and explicitly releasing
-    // the selector by invoking releaseTemporarySelector()
-    static Selector getTemporarySelector(SelectableChannel sc)
-        throws IOException
-    {
-        SoftReference<SelectorWrapper> ref = localSelector.get();
-        SelectorWrapper selWrapper = null;
-        Selector sel = null;
-        if (ref == null
-            || ((selWrapper = ref.get()) == null)
-            || ((sel = selWrapper.get()) == null)
-            || (sel.provider() != sc.provider())) {
-            sel = sc.provider().openSelector();
-            selWrapper = new SelectorWrapper(sel);
-            localSelector.set(new SoftReference<SelectorWrapper>(selWrapper));
-        }
-        localSelectorWrapper.set(selWrapper);
-        return sel;
-    }
-
-    static void releaseTemporarySelector(Selector sel)
-        throws IOException
-    {
-        // Selector should be empty
-        sel.selectNow();                // Flush cancelled keys
-        assert sel.keys().isEmpty() : "Temporary selector not empty";
-        localSelectorWrapper.set(null);
-    }
-
 
     // -- Random stuff --
 
--- a/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java	Wed Jul 05 18:26:11 2017 +0200
@@ -193,9 +193,9 @@
             } else { // DES, DESede, Blowfish
                 blockSize = 8;
             }
-            this.blockMode =
-                (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
         }
+        this.blockMode =
+            (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
         String defPadding = (blockSize == 0 ? "NoPadding" : "PKCS5Padding");
         String paddingStr =
                 (algoParts.length > 2 ? algoParts[2] : defPadding);
--- a/jdk/src/share/classes/sun/security/provider/DSAKeyPairGenerator.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/DSAKeyPairGenerator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -82,7 +82,9 @@
     }
 
     public void initialize(int modlen, SecureRandom random) {
-        initialize(modlen, false, random);
+        // generate new parameters when no precomputed ones available.
+        initialize(modlen, true, random);
+        this.forceNewParameters = false;
     }
 
     /**
--- a/jdk/src/share/classes/sun/security/provider/DSAParameterGenerator.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/DSAParameterGenerator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -116,12 +116,13 @@
             throw new InvalidAlgorithmParameterException("Invalid parameter");
         }
         DSAGenParameterSpec dsaGenParams = (DSAGenParameterSpec) genParamSpec;
-        if (dsaGenParams.getPrimePLength() > 2048) {
+        int primePLen = dsaGenParams.getPrimePLength();
+        if (primePLen > 2048) {
             throw new InvalidParameterException
-                ("Prime size should be 512 - 1024, or 2048");
+                ("No support for prime size " + primePLen);
         }
         // directly initialize using the already validated values
-        this.valueL = dsaGenParams.getPrimePLength();
+        this.valueL = primePLen;
         this.valueN = dsaGenParams.getSubprimeQLength();
         this.seedLen = dsaGenParams.getSeedLength();
         this.random = random;
--- a/jdk/src/share/classes/sun/security/provider/ParameterCache.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/ParameterCache.java	Wed Jul 05 18:26:11 2017 +0200
@@ -146,9 +146,14 @@
                    InvalidAlgorithmParameterException {
         AlgorithmParameterGenerator gen =
                 AlgorithmParameterGenerator.getInstance("DSA");
-        DSAGenParameterSpec genParams =
-            new DSAGenParameterSpec(primeLen, subprimeLen);
-        gen.init(genParams, random);
+        // Use init(int size, SecureRandom random) for legacy DSA key sizes
+        if (primeLen < 1024) {
+            gen.init(primeLen, random);
+        } else {
+            DSAGenParameterSpec genParams =
+                new DSAGenParameterSpec(primeLen, subprimeLen);
+            gen.init(genParams, random);
+        }
         AlgorithmParameters params = gen.generateParameters();
         DSAParameterSpec spec = params.getParameterSpec(DSAParameterSpec.class);
         return spec;
@@ -159,8 +164,9 @@
         dsaCache = new ConcurrentHashMap<Integer,DSAParameterSpec>();
 
         /*
-         * We support precomputed parameter for 512, 768 and 1024 bit
-         * moduli. In this file we provide both the seed and counter
+         * We support precomputed parameter for legacy 512, 768 bit moduli,
+         * and (L, N) combinations of (1024, 160), (2048, 224), (2048, 256).
+         * In this file we provide both the seed and counter
          * value of the generation process for each of these seeds,
          * for validation purposes. We also include the test vectors
          * from the DSA specification, FIPS 186, and the FIPS 186
--- a/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, 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
@@ -132,7 +132,7 @@
      */
     final void write(HandshakeOutStream s) throws IOException {
         int len = messageLength();
-        if (len > (1 << 24)) {
+        if (len >= Record.OVERFLOW_OF_INT24) {
             throw new SSLException("Handshake message too big"
                 + ", type = " + messageType() + ", len = " + len);
         }
--- a/jdk/src/share/classes/sun/security/ssl/HandshakeOutStream.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/ssl/HandshakeOutStream.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, 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
@@ -153,10 +153,12 @@
      */
 
     void putInt8(int i) throws IOException {
+        checkOverflow(i, Record.OVERFLOW_OF_INT08);
         r.write(i);
     }
 
     void putInt16(int i) throws IOException {
+        checkOverflow(i, Record.OVERFLOW_OF_INT16);
         if (r.availableDataBytes() < 2) {
             flush();
         }
@@ -165,6 +167,7 @@
     }
 
     void putInt24(int i) throws IOException {
+        checkOverflow(i, Record.OVERFLOW_OF_INT24);
         if (r.availableDataBytes() < 3) {
             flush();
         }
@@ -191,6 +194,8 @@
         if (b == null) {
             putInt8(0);
             return;
+        } else {
+            checkOverflow(b.length, Record.OVERFLOW_OF_INT08);
         }
         putInt8(b.length);
         write(b, 0, b.length);
@@ -200,6 +205,8 @@
         if (b == null) {
             putInt16(0);
             return;
+        } else {
+            checkOverflow(b.length, Record.OVERFLOW_OF_INT16);
         }
         putInt16(b.length);
         write(b, 0, b.length);
@@ -209,8 +216,19 @@
         if (b == null) {
             putInt24(0);
             return;
+        } else {
+            checkOverflow(b.length, Record.OVERFLOW_OF_INT24);
         }
         putInt24(b.length);
         write(b, 0, b.length);
     }
+
+    private void checkOverflow(int length, int overflow) {
+        if (length >= overflow) {
+            // internal_error alert will be triggered
+            throw new RuntimeException(
+                    "Field length overflow, the field length (" +
+                    length + ") should be less than " + overflow);
+        }
+    }
 }
--- a/jdk/src/share/classes/sun/security/ssl/Record.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/security/ssl/Record.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, 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
@@ -110,4 +110,10 @@
                                     + maxPadding        // padding
                                     + trailerSize;      // MAC
 
+    /*
+     * The overflow values of integers of 8, 16 and 24 bits.
+     */
+    static final int OVERFLOW_OF_INT08 = (1 << 8);
+    static final int OVERFLOW_OF_INT16 = (1 << 16);
+    static final int OVERFLOW_OF_INT24 = (1 << 24);
 }
--- a/jdk/src/share/classes/sun/text/SupplementaryCharacterData.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/text/SupplementaryCharacterData.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, 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
@@ -32,6 +32,11 @@
 public final class SupplementaryCharacterData implements Cloneable {
 
     /**
+     * A token used as a character-category value to identify ignore characters
+     */
+    private static final byte IGNORE = -1;
+
+    /**
      * An array for supplementary characters and values.
      * Lower one byte is used to keep a byte-value.
      * Upper three bytes are used to keep the first supplementary character
@@ -78,7 +83,8 @@
             } else if (index > (end-1)) {
                 i = k;
             } else {
-                return dataTable[k] & 0xFF;
+                int v = dataTable[k] & 0xFF;
+                return (v == 0xFF) ? IGNORE : v;
             }
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/locale/LocaleEquivalentMaps.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.util.locale;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Locale equivalent map for BCP47 Locale matching
+ */
+final class LocaleEquivalentMaps {
+
+    static final Map<String, String> singleEquivMap;
+    static final Map<String, String[]> multiEquivsMap;
+    static final Map<String, String> regionVariantEquivMap;
+
+    static {
+        singleEquivMap = new HashMap<>();
+        multiEquivsMap = new HashMap<>();
+        regionVariantEquivMap = new HashMap<>();
+
+        // This is an auto-generated file and should not be manually edited.
+        //   LSR Revision: 2012-09-04
+        singleEquivMap.put("ami", "i-ami");
+        singleEquivMap.put("art-lojban", "jbo");
+        singleEquivMap.put("ase", "sgn-us");
+        singleEquivMap.put("ayx", "nun");
+        singleEquivMap.put("bfi", "sgn-gb");
+        singleEquivMap.put("bjd", "drl");
+        singleEquivMap.put("bnn", "i-bnn");
+        singleEquivMap.put("bzs", "sgn-br");
+        singleEquivMap.put("cjr", "mom");
+        singleEquivMap.put("cka", "cmr");
+        singleEquivMap.put("cmk", "xch");
+        singleEquivMap.put("cmn-hans", "zh-cmn-hans");
+        singleEquivMap.put("cmn-hant", "zh-cmn-hant");
+        singleEquivMap.put("cmr", "cka");
+        singleEquivMap.put("csn", "sgn-co");
+        singleEquivMap.put("dev", "gav");
+        singleEquivMap.put("drh", "khk");
+        singleEquivMap.put("drl", "bjd");
+        singleEquivMap.put("dse", "sgn-nl");
+        singleEquivMap.put("dsl", "sgn-dk");
+        singleEquivMap.put("fsl", "sgn-fr");
+        singleEquivMap.put("gan", "zh-gan");
+        singleEquivMap.put("gav", "dev");
+        singleEquivMap.put("gsg", "sgn-de");
+        singleEquivMap.put("gss", "sgn-gr");
+        singleEquivMap.put("he", "iw");
+        singleEquivMap.put("hle", "sca");
+        singleEquivMap.put("hrr", "jal");
+        singleEquivMap.put("hsn", "zh-xiang");
+        singleEquivMap.put("i-ami", "ami");
+        singleEquivMap.put("i-bnn", "bnn");
+        singleEquivMap.put("i-klingon", "tlh");
+        singleEquivMap.put("i-lux", "lb");
+        singleEquivMap.put("i-navajo", "nv");
+        singleEquivMap.put("i-pwn", "pwn");
+        singleEquivMap.put("i-tao", "tao");
+        singleEquivMap.put("i-tay", "tay");
+        singleEquivMap.put("i-tsu", "tsu");
+        singleEquivMap.put("ibi", "opa");
+        singleEquivMap.put("id", "in");
+        singleEquivMap.put("in", "id");
+        singleEquivMap.put("ise", "sgn-it");
+        singleEquivMap.put("isg", "sgn-ie");
+        singleEquivMap.put("iw", "he");
+        singleEquivMap.put("jal", "hrr");
+        singleEquivMap.put("jbo", "art-lojban");
+        singleEquivMap.put("ji", "yi");
+        singleEquivMap.put("jsl", "sgn-jp");
+        singleEquivMap.put("jv", "jw");
+        singleEquivMap.put("jw", "jv");
+        singleEquivMap.put("kgh", "kml");
+        singleEquivMap.put("khk", "drh");
+        singleEquivMap.put("kml", "kgh");
+        singleEquivMap.put("lb", "i-lux");
+        singleEquivMap.put("lcq", "ppr");
+        singleEquivMap.put("lrr", "yma");
+        singleEquivMap.put("mfs", "sgn-mx");
+        singleEquivMap.put("mo", "ro");
+        singleEquivMap.put("mom", "cjr");
+        singleEquivMap.put("nan", "zh-min-nan");
+        singleEquivMap.put("nb", "no-bok");
+        singleEquivMap.put("ncs", "sgn-ni");
+        singleEquivMap.put("nn", "no-nyn");
+        singleEquivMap.put("no-bok", "nb");
+        singleEquivMap.put("no-nyn", "nn");
+        singleEquivMap.put("nsl", "sgn-no");
+        singleEquivMap.put("nun", "ayx");
+        singleEquivMap.put("nv", "i-navajo");
+        singleEquivMap.put("opa", "ibi");
+        singleEquivMap.put("ppr", "lcq");
+        singleEquivMap.put("psr", "sgn-pt");
+        singleEquivMap.put("pwn", "i-pwn");
+        singleEquivMap.put("ras", "tie");
+        singleEquivMap.put("ro", "mo");
+        singleEquivMap.put("sca", "hle");
+        singleEquivMap.put("sfb", "sgn-be-fr");
+        singleEquivMap.put("sfs", "sgn-za");
+        singleEquivMap.put("sgg", "sgn-ch-de");
+        singleEquivMap.put("sgn-be-fr", "sfb");
+        singleEquivMap.put("sgn-be-nl", "vgt");
+        singleEquivMap.put("sgn-br", "bzs");
+        singleEquivMap.put("sgn-ch-de", "sgg");
+        singleEquivMap.put("sgn-co", "csn");
+        singleEquivMap.put("sgn-de", "gsg");
+        singleEquivMap.put("sgn-dk", "dsl");
+        singleEquivMap.put("sgn-es", "ssp");
+        singleEquivMap.put("sgn-fr", "fsl");
+        singleEquivMap.put("sgn-gb", "bfi");
+        singleEquivMap.put("sgn-gr", "gss");
+        singleEquivMap.put("sgn-ie", "isg");
+        singleEquivMap.put("sgn-it", "ise");
+        singleEquivMap.put("sgn-jp", "jsl");
+        singleEquivMap.put("sgn-mx", "mfs");
+        singleEquivMap.put("sgn-ni", "ncs");
+        singleEquivMap.put("sgn-nl", "dse");
+        singleEquivMap.put("sgn-no", "nsl");
+        singleEquivMap.put("sgn-pt", "psr");
+        singleEquivMap.put("sgn-se", "swl");
+        singleEquivMap.put("sgn-us", "ase");
+        singleEquivMap.put("sgn-za", "sfs");
+        singleEquivMap.put("ssp", "sgn-es");
+        singleEquivMap.put("swl", "sgn-se");
+        singleEquivMap.put("tao", "i-tao");
+        singleEquivMap.put("tay", "i-tay");
+        singleEquivMap.put("tie", "ras");
+        singleEquivMap.put("tkk", "twm");
+        singleEquivMap.put("tlh", "i-klingon");
+        singleEquivMap.put("tlw", "weo");
+        singleEquivMap.put("tsu", "i-tsu");
+        singleEquivMap.put("twm", "tkk");
+        singleEquivMap.put("vgt", "sgn-be-nl");
+        singleEquivMap.put("weo", "tlw");
+        singleEquivMap.put("wuu", "zh-wuu");
+        singleEquivMap.put("xch", "cmk");
+        singleEquivMap.put("yi", "ji");
+        singleEquivMap.put("yma", "lrr");
+        singleEquivMap.put("yue", "zh-yue");
+        singleEquivMap.put("zh-cmn-hans", "cmn-hans");
+        singleEquivMap.put("zh-cmn-hant", "cmn-hant");
+        singleEquivMap.put("zh-gan", "gan");
+        singleEquivMap.put("zh-min-nan", "nan");
+        singleEquivMap.put("zh-wuu", "wuu");
+        singleEquivMap.put("zh-xiang", "hsn");
+        singleEquivMap.put("zh-yue", "yue");
+
+        multiEquivsMap.put("ccq", new String[] {"rki", "ybd"});
+        multiEquivsMap.put("cmn", new String[] {"zh-guoyu", "zh-cmn"});
+        multiEquivsMap.put("drw", new String[] {"prs", "tnf"});
+        multiEquivsMap.put("hak", new String[] {"i-hak", "zh-hakka"});
+        multiEquivsMap.put("i-hak", new String[] {"hak", "zh-hakka"});
+        multiEquivsMap.put("mry", new String[] {"mst", "myt"});
+        multiEquivsMap.put("mst", new String[] {"mry", "myt"});
+        multiEquivsMap.put("myt", new String[] {"mry", "mst"});
+        multiEquivsMap.put("prs", new String[] {"drw", "tnf"});
+        multiEquivsMap.put("rki", new String[] {"ccq", "ybd"});
+        multiEquivsMap.put("tnf", new String[] {"prs", "drw"});
+        multiEquivsMap.put("ybd", new String[] {"rki", "ccq"});
+        multiEquivsMap.put("zh-cmn", new String[] {"cmn", "zh-guoyu"});
+        multiEquivsMap.put("zh-guoyu", new String[] {"cmn", "zh-cmn"});
+        multiEquivsMap.put("zh-hakka", new String[] {"hak", "i-hak"});
+
+        regionVariantEquivMap.put("-alalc97", "-heploc");
+        regionVariantEquivMap.put("-bu", "-mm");
+        regionVariantEquivMap.put("-cd", "-zr");
+        regionVariantEquivMap.put("-dd", "-de");
+        regionVariantEquivMap.put("-de", "-dd");
+        regionVariantEquivMap.put("-fr", "-fx");
+        regionVariantEquivMap.put("-fx", "-fr");
+        regionVariantEquivMap.put("-heploc", "-alalc97");
+        regionVariantEquivMap.put("-mm", "-bu");
+        regionVariantEquivMap.put("-tl", "-tp");
+        regionVariantEquivMap.put("-tp", "-tl");
+        regionVariantEquivMap.put("-yd", "-ye");
+        regionVariantEquivMap.put("-ye", "-yd");
+        regionVariantEquivMap.put("-zr", "-cd");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/locale/LocaleMatcher.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,455 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.util.locale;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Locale.*;
+import static java.util.Locale.FilteringMode.*;
+import static java.util.Locale.LanguageRange.*;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Implementation for BCP47 Locale matching
+ *
+ */
+public final class LocaleMatcher {
+
+    public static List<Locale> filter(List<LanguageRange> priorityList,
+                                      Collection<Locale> locales,
+                                      FilteringMode mode) {
+        if (priorityList.isEmpty() || locales.isEmpty()) {
+            return new ArrayList<>(); // need to return a empty mutable List
+        }
+
+        // Create a list of language tags to be matched.
+        List<String> tags = new ArrayList<>();
+        for (Locale locale : locales) {
+            tags.add(locale.toLanguageTag());
+        }
+
+        // Filter language tags.
+        List<String> filteredTags = filterTags(priorityList, tags, mode);
+
+        // Create a list of matching locales.
+        List<Locale> filteredLocales = new ArrayList<>(filteredTags.size());
+        for (String tag : filteredTags) {
+              filteredLocales.add(Locale.forLanguageTag(tag));
+        }
+
+        return filteredLocales;
+    }
+
+    public static List<String> filterTags(List<LanguageRange> priorityList,
+                                          Collection<String> tags,
+                                          FilteringMode mode) {
+        if (priorityList.isEmpty() || tags.isEmpty()) {
+            return new ArrayList<>(); // need to return a empty mutable List
+        }
+
+        ArrayList<LanguageRange> list;
+        if (mode == EXTENDED_FILTERING) {
+            return filterExtended(priorityList, tags);
+        } else {
+            list = new ArrayList<>();
+            for (LanguageRange lr : priorityList) {
+                String range = lr.getRange();
+                if (range.startsWith("*-")
+                    || range.indexOf("-*") != -1) { // Extended range
+                    if (mode == AUTOSELECT_FILTERING) {
+                        return filterExtended(priorityList, tags);
+                    } else if (mode == MAP_EXTENDED_RANGES) {
+                        if (range.charAt(0) == '*') {
+                            range = "*";
+                        } else {
+                            range = range.replaceAll("-[*]", "");
+                        }
+                        list.add(new LanguageRange(range, lr.getWeight()));
+                    } else if (mode == REJECT_EXTENDED_RANGES) {
+                        throw new IllegalArgumentException("An extended range \""
+                                      + range
+                                      + "\" found in REJECT_EXTENDED_RANGES mode.");
+                    }
+                } else { // Basic range
+                    list.add(lr);
+                }
+            }
+
+            return filterBasic(list, tags);
+        }
+    }
+
+    private static List<String> filterBasic(List<LanguageRange> priorityList,
+                                            Collection<String> tags) {
+        List<String> list = new ArrayList<>();
+        for (LanguageRange lr : priorityList) {
+            String range = lr.getRange();
+            if (range.equals("*")) {
+                return new ArrayList<String>(tags);
+            } else {
+                for (String tag : tags) {
+                    tag = tag.toLowerCase();
+                    if (tag.startsWith(range)) {
+                        int len = range.length();
+                        if ((tag.length() == len || tag.charAt(len) == '-')
+                            && !list.contains(tag)) {
+                            list.add(tag);
+                        }
+                    }
+                }
+            }
+        }
+
+        return list;
+    }
+
+    private static List<String> filterExtended(List<LanguageRange> priorityList,
+                                               Collection<String> tags) {
+        List<String> list = new ArrayList<>();
+        for (LanguageRange lr : priorityList) {
+            String range = lr.getRange();
+            if (range.equals("*")) {
+                return new ArrayList<String>(tags);
+            }
+            String[] rangeSubtags = range.split("-");
+            for (String tag : tags) {
+                tag = tag.toLowerCase();
+                String[] tagSubtags = tag.split("-");
+                if (!rangeSubtags[0].equals(tagSubtags[0])
+                    && !rangeSubtags[0].equals("*")) {
+                    continue;
+                }
+
+                int rangeIndex = 1;
+                int tagIndex = 1;
+
+                while (rangeIndex < rangeSubtags.length
+                       && tagIndex < tagSubtags.length) {
+                   if (rangeSubtags[rangeIndex].equals("*")) {
+                       rangeIndex++;
+                   } else if (rangeSubtags[rangeIndex].equals(tagSubtags[tagIndex])) {
+                       rangeIndex++;
+                       tagIndex++;
+                   } else if (tagSubtags[tagIndex].length() == 1
+                              && !tagSubtags[tagIndex].equals("*")) {
+                       break;
+                   } else {
+                       tagIndex++;
+                   }
+               }
+
+               if (rangeSubtags.length == rangeIndex && !list.contains(tag)) {
+                   list.add(tag);
+               }
+            }
+        }
+
+        return list;
+    }
+
+    public static Locale lookup(List<LanguageRange> priorityList,
+                                Collection<Locale> locales) {
+        if (priorityList.isEmpty() || locales.isEmpty()) {
+            return null;
+        }
+
+        // Create a list of language tags to be matched.
+        List<String> tags = new ArrayList<>();
+        for (Locale locale : locales) {
+            tags.add(locale.toLanguageTag());
+        }
+
+        // Look up a language tags.
+        String lookedUpTag = lookupTag(priorityList, tags);
+
+        if (lookedUpTag == null) {
+            return null;
+        } else {
+            return Locale.forLanguageTag(lookedUpTag);
+        }
+    }
+
+    public static String lookupTag(List<LanguageRange> priorityList,
+                                   Collection<String> tags) {
+        if (priorityList.isEmpty() || tags.isEmpty()) {
+            return null;
+        }
+
+        for (LanguageRange lr : priorityList) {
+            String range = lr.getRange();
+
+            // Special language range ("*") is ignored in lookup.
+            if (range.equals("*")) {
+                continue;
+            }
+
+            String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*");
+            while (rangeForRegex.length() > 0) {
+                for (String tag : tags) {
+                    tag = tag.toLowerCase();
+                    if (tag.matches(rangeForRegex)) {
+                        return tag;
+                    }
+                }
+
+                // Truncate from the end....
+                int index = rangeForRegex.lastIndexOf('-');
+                if (index >= 0) {
+                    rangeForRegex = rangeForRegex.substring(0, index);
+
+                    // if range ends with an extension key, truncate it.
+                    if (rangeForRegex.lastIndexOf('-') == rangeForRegex.length()-2) {
+                        rangeForRegex =
+                            rangeForRegex.substring(0, rangeForRegex.length()-2);
+                    }
+                } else {
+                    rangeForRegex = "";
+                }
+            }
+        }
+
+        return null;
+    }
+
+    public static List<LanguageRange> parse(String ranges) {
+        ranges = ranges.replaceAll(" ", "").toLowerCase();
+        if (ranges.startsWith("accept-language:")) {
+            ranges = ranges.substring(16); // delete unnecessary prefix
+        }
+
+        String[] langRanges = ranges.split(",");
+        List<LanguageRange> list = new ArrayList<>(langRanges.length);
+        List<String> tempList = new ArrayList<>();
+        int numOfRanges = 0;
+
+        for (String range : langRanges) {
+            int index;
+            String r;
+            double w;
+
+            if ((index = range.indexOf(";q=")) == -1) {
+                r = range;
+                w = MAX_WEIGHT;
+            } else {
+                r = range.substring(0, index);
+                index += 3;
+                try {
+                    w = Double.parseDouble(range.substring(index));
+                }
+                catch (Exception e) {
+                    throw new IllegalArgumentException("weight=\""
+                                  + range.substring(index)
+                                  + "\" for language range \"" + r + "\"");
+                }
+
+                if (w < MIN_WEIGHT || w > MAX_WEIGHT) {
+                    throw new IllegalArgumentException("weight=" + w
+                                  + " for language range \"" + r
+                                  + "\". It must be between " + MIN_WEIGHT
+                                  + " and " + MAX_WEIGHT + ".");
+                }
+            }
+
+            if (!tempList.contains(r)) {
+                LanguageRange lr = new LanguageRange(r, w);
+                index = numOfRanges;
+                for (int j = 0; j < numOfRanges; j++) {
+                    if (list.get(j).getWeight() < w) {
+                        index = j;
+                        break;
+                    }
+                }
+                list.add(index, lr);
+                numOfRanges++;
+                tempList.add(r);
+
+                // Check if the range has an equivalent using IANA LSR data.
+                // If yes, add it to the User's Language Priority List as well.
+
+                // aa-XX -> aa-YY
+                String equivalent;
+                if ((equivalent = getEquivalentForRegionAndVariant(r)) != null
+                    && !tempList.contains(equivalent)) {
+                    list.add(index+1, new LanguageRange(equivalent, w));
+                    numOfRanges++;
+                    tempList.add(equivalent);
+                }
+
+                String[] equivalents;
+                if ((equivalents = getEquivalentsForLanguage(r)) != null) {
+                    for (String equiv: equivalents) {
+                        // aa-XX -> bb-XX(, cc-XX)
+                        if (!tempList.contains(equiv)) {
+                            list.add(index+1, new LanguageRange(equiv, w));
+                            numOfRanges++;
+                            tempList.add(equiv);
+                        }
+
+                        // bb-XX -> bb-YY(, cc-YY)
+                        equivalent = getEquivalentForRegionAndVariant(equiv);
+                        if (equivalent != null
+                            && !tempList.contains(equivalent)) {
+                            list.add(index+1, new LanguageRange(equivalent, w));
+                            numOfRanges++;
+                            tempList.add(equivalent);
+                        }
+                    }
+                }
+            }
+        }
+
+        return list;
+    }
+
+    private static String[] getEquivalentsForLanguage(String range) {
+        String r = range;
+
+        while (r.length() > 0) {
+            if (LocaleEquivalentMaps.singleEquivMap.containsKey(r)) {
+                String equiv = LocaleEquivalentMaps.singleEquivMap.get(r);
+                // Return immediately for performance if the first matching
+                // subtag is found.
+                return new String[] {range.replaceFirst(r, equiv)};
+            } else if (LocaleEquivalentMaps.multiEquivsMap.containsKey(r)) {
+                String[] equivs = LocaleEquivalentMaps.multiEquivsMap.get(r);
+                for (int i = 0; i < equivs.length; i++) {
+                    equivs[i] = range.replaceFirst(r, equivs[i]);
+                }
+                return equivs;
+            }
+
+            // Truncate the last subtag simply.
+            int index = r.lastIndexOf('-');
+            if (index == -1) {
+                break;
+            }
+            r = r.substring(0, index);
+        }
+
+        return null;
+    }
+
+    private static String getEquivalentForRegionAndVariant(String range) {
+        int extensionKeyIndex = getExtentionKeyIndex(range);
+
+        for (String subtag : LocaleEquivalentMaps.regionVariantEquivMap.keySet()) {
+            int index;
+            if ((index = range.indexOf(subtag)) != -1) {
+                // Check if the matching text is a valid region or variant.
+                if (extensionKeyIndex != Integer.MIN_VALUE
+                    && index > extensionKeyIndex) {
+                    continue;
+                }
+
+                int len = index + subtag.length();
+                if (range.length() == len || range.charAt(len) == '-') {
+                    return range.replaceFirst(subtag, LocaleEquivalentMaps.regionVariantEquivMap.get(subtag));
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private static int getExtentionKeyIndex(String s) {
+        char[] c = s.toCharArray();
+        int index = Integer.MIN_VALUE;
+        for (int i = 1; i < c.length; i++) {
+            if (c[i] == '-') {
+                if (i - index == 2) {
+                    return index;
+                } else {
+                    index = i;
+                }
+            }
+        }
+        return Integer.MIN_VALUE;
+    }
+
+    public static List<LanguageRange> mapEquivalents(
+                                          List<LanguageRange>priorityList,
+                                          Map<String, List<String>> map) {
+        if (priorityList.isEmpty()) {
+            return new ArrayList<>(); // need to return a empty mutable List
+        }
+        if (map == null || map.isEmpty()) {
+            return new ArrayList<LanguageRange>(priorityList);
+        }
+
+        // Create a map, key=originalKey.toLowerCaes(), value=originalKey
+        Map<String, String> keyMap = new HashMap<>();
+        for (String key : map.keySet()) {
+            keyMap.put(key.toLowerCase(), key);
+        }
+
+        List<LanguageRange> list = new ArrayList<>();
+        for (LanguageRange lr : priorityList) {
+            String range = lr.getRange();
+            String r = range;
+            boolean hasEquivalent = false;
+
+            while (r.length() > 0) {
+                if (keyMap.containsKey(r)) {
+                    hasEquivalent = true;
+                    List<String> equivalents = map.get(keyMap.get(r));
+                    if (equivalents != null) {
+                        int len = r.length();
+                        for (String equivalent : equivalents) {
+                            list.add(new LanguageRange(equivalent.toLowerCase()
+                                     + range.substring(len),
+                                     lr.getWeight()));
+                        }
+                    }
+                    // Return immediately if the first matching subtag is found.
+                    break;
+                }
+
+                // Truncate the last subtag simply.
+                int index = r.lastIndexOf('-');
+                if (index == -1) {
+                    break;
+                }
+                r = r.substring(0, index);
+            }
+
+            if (!hasEquivalent) {
+                list.add(lr);
+            }
+        }
+
+        return list;
+    }
+
+    private LocaleMatcher() {}
+
+}
--- a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataProviderImpl.java	Wed Jul 05 18:26:11 2017 +0200
@@ -137,7 +137,7 @@
 
     @Override
     public boolean isSupportedLocale(Locale locale) {
-        if (locale == Locale.ROOT) {
+        if (Locale.ROOT.equals(locale)) {
             return true;
         }
         String calendarType = null;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/FallbackLocaleProviderAdapter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.util.locale.provider;
+
+/**
+ * FallbackProviderAdapter implementation.
+ *
+ * @author Naoto Sato
+ */
+public class FallbackLocaleProviderAdapter extends JRELocaleProviderAdapter {
+
+    /**
+     * Returns the type of this LocaleProviderAdapter
+     */
+    @Override
+    public LocaleProviderAdapter.Type getAdapterType() {
+        return Type.FALLBACK;
+    }
+}
--- a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -71,7 +71,7 @@
      */
     @Override
     public LocaleProviderAdapter.Type getAdapterType() {
-        return LocaleProviderAdapter.Type.JRE;
+        return Type.JRE;
     }
 
     /**
@@ -125,7 +125,7 @@
     public BreakIteratorProvider getBreakIteratorProvider() {
         if (breakIteratorProvider == null) {
             BreakIteratorProvider provider = new BreakIteratorProviderImpl(getAdapterType(),
-                                                            getLanguateTagSet("FormatData"));
+                                                            getLanguageTagSet("FormatData"));
             synchronized (this) {
                 if (breakIteratorProvider == null) {
                     breakIteratorProvider = provider;
@@ -139,7 +139,7 @@
     public CollatorProvider getCollatorProvider() {
         if (collatorProvider == null) {
             CollatorProvider provider = new CollatorProviderImpl(getAdapterType(),
-                                                getLanguateTagSet("CollationData"));
+                                                getLanguageTagSet("CollationData"));
             synchronized (this) {
                 if (collatorProvider == null) {
                     collatorProvider = provider;
@@ -153,7 +153,7 @@
     public DateFormatProvider getDateFormatProvider() {
         if (dateFormatProvider == null) {
             DateFormatProvider provider = new DateFormatProviderImpl(getAdapterType(),
-                                                    getLanguateTagSet("FormatData"));
+                                                    getLanguageTagSet("FormatData"));
             synchronized (this) {
                 if (dateFormatProvider == null) {
                     dateFormatProvider = provider;
@@ -167,7 +167,7 @@
     public DateFormatSymbolsProvider getDateFormatSymbolsProvider() {
         if (dateFormatSymbolsProvider == null) {
             DateFormatSymbolsProvider provider = new DateFormatSymbolsProviderImpl(getAdapterType(),
-                                                                getLanguateTagSet("FormatData"));
+                                                                getLanguageTagSet("FormatData"));
             synchronized (this) {
                 if (dateFormatSymbolsProvider == null) {
                     dateFormatSymbolsProvider = provider;
@@ -180,7 +180,7 @@
     @Override
     public DecimalFormatSymbolsProvider getDecimalFormatSymbolsProvider() {
         if (decimalFormatSymbolsProvider == null) {
-            DecimalFormatSymbolsProvider provider = new DecimalFormatSymbolsProviderImpl(getAdapterType(), getLanguateTagSet("FormatData"));
+            DecimalFormatSymbolsProvider provider = new DecimalFormatSymbolsProviderImpl(getAdapterType(), getLanguageTagSet("FormatData"));
             synchronized (this) {
                 if (decimalFormatSymbolsProvider == null) {
                     decimalFormatSymbolsProvider = provider;
@@ -194,7 +194,7 @@
     public NumberFormatProvider getNumberFormatProvider() {
         if (numberFormatProvider == null) {
             NumberFormatProvider provider = new NumberFormatProviderImpl(getAdapterType(),
-                                                        getLanguateTagSet("FormatData"));
+                                                        getLanguageTagSet("FormatData"));
             synchronized (this) {
                 if (numberFormatProvider == null) {
                     numberFormatProvider = provider;
@@ -211,7 +211,7 @@
     public CurrencyNameProvider getCurrencyNameProvider() {
         if (currencyNameProvider == null) {
             CurrencyNameProvider provider = new CurrencyNameProviderImpl(getAdapterType(),
-                                            getLanguateTagSet("CurrencyNames"));
+                                            getLanguageTagSet("CurrencyNames"));
             synchronized (this) {
                 if (currencyNameProvider == null) {
                     currencyNameProvider = provider;
@@ -225,7 +225,7 @@
     public LocaleNameProvider getLocaleNameProvider() {
         if (localeNameProvider == null) {
             LocaleNameProvider provider = new LocaleNameProviderImpl(getAdapterType(),
-                                                    getLanguateTagSet("LocaleNames"));
+                                                    getLanguageTagSet("LocaleNames"));
             synchronized (this) {
                 if (localeNameProvider == null) {
                     localeNameProvider = provider;
@@ -239,7 +239,7 @@
     public TimeZoneNameProvider getTimeZoneNameProvider() {
         if (timeZoneNameProvider == null) {
             TimeZoneNameProvider provider = new TimeZoneNameProviderImpl(getAdapterType(),
-                                                    getLanguateTagSet("TimeZoneNames"));
+                                                    getLanguageTagSet("TimeZoneNames"));
             synchronized (this) {
                 if (timeZoneNameProvider == null) {
                     timeZoneNameProvider = provider;
@@ -253,8 +253,8 @@
     public CalendarDataProvider getCalendarDataProvider() {
         if (calendarDataProvider == null) {
             Set<String> set = new HashSet<>();
-            set.addAll(getLanguateTagSet("FormatData"));
-            set.addAll(getLanguateTagSet("CalendarData"));
+            set.addAll(getLanguageTagSet("FormatData"));
+            set.addAll(getLanguageTagSet("CalendarData"));
             CalendarDataProvider provider = new CalendarDataProviderImpl(getAdapterType(),
                                                                          set);
             synchronized (this) {
@@ -302,7 +302,7 @@
         return AvailableJRELocales.localeList.clone();
     }
 
-    public Set<String> getLanguateTagSet(String category) {
+    public Set<String> getLanguageTagSet(String category) {
         Set<String> tagset = langtagSets.get(category);
         if (tagset == null) {
             tagset = createLanguageTagSet(category);
@@ -328,6 +328,10 @@
             }
             tagset.add(token);
         }
+
+        // ensure en-US is there (mandated by the spec, e.g. Collator.getAvailableLocales())
+        tagset.add("en-US");
+
         return tagset;
     }
 
--- a/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -59,7 +59,8 @@
         JRE("sun.util.resources", "sun.text.resources"),
         CLDR("sun.util.resources.cldr", "sun.text.resources.cldr"),
         SPI,
-        HOST;
+        HOST,
+        FALLBACK("sun.util.resources", "sun.text.resources");
 
         private final String UTIL_RESOURCES_PACKAGE;
         private final String TEXT_RESOURCES_PACKAGE;
@@ -111,41 +112,49 @@
      */
     private static LocaleProviderAdapter hostLocaleProviderAdapter = null;
 
+    /**
+     * FALLBACK Locale Data Adapter instance. It's basically the same with JRE, but only kicks
+     * in for the root locale.
+     */
+    private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null;
+
     static {
         String order = AccessController.doPrivileged(
                            new sun.security.action.GetPropertyAction("java.locale.providers"));
-                    // Override adapterPreference with the properties one
-                    if (order != null && order.length() != 0) {
-                        String[] types = order.split(",");
-                        List<Type> typeList = new ArrayList<>();
-                        for (String type : types) {
-                            try {
-                            Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
+        // Override adapterPreference with the properties one
+        if (order != null && order.length() != 0) {
+            String[] types = order.split(",");
+            List<Type> typeList = new ArrayList<>();
+            for (String type : types) {
+                try {
+                    Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
 
-                                // load adapter if necessary
-                                switch (aType) {
-                                case CLDR:
-                        cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
-                                    break;
-                                case HOST:
-                        hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
-                                    break;
-                                }
-                                typeList.add(aType);
-                } catch (// could be caused by the user specifying wrong
-                                     // provider name or format in the system property
-                                     IllegalArgumentException |
-                                     UnsupportedOperationException e) {
-                                LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
-                            }
-                        }
+                    // load adapter if necessary
+                    switch (aType) {
+                        case CLDR:
+                            cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
+                            break;
+                        case HOST:
+                            hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
+                            break;
+                    }
+                    typeList.add(aType);
+                } catch (IllegalArgumentException | UnsupportedOperationException e) {
+                    // could be caused by the user specifying wrong
+                    // provider name or format in the system property
+                    LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
+                }
+            }
 
-                        if (!typeList.contains(Type.JRE)) {
-                            // Append JRE as the last resort.
-                            typeList.add(Type.JRE);
-                        }
-                        adapterPreference = typeList.toArray(new Type[0]);
-                    }
+            if (!typeList.isEmpty()) {
+                if (!typeList.contains(Type.JRE)) {
+                    // Append FALLBACK as the last resort.
+                    fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
+                    typeList.add(Type.FALLBACK);
+                }
+                adapterPreference = typeList.toArray(new Type[0]);
+            }
+        }
     }
 
 
@@ -162,6 +171,8 @@
             return spiLocaleProviderAdapter;
         case HOST:
             return hostLocaleProviderAdapter;
+        case FALLBACK:
+            return fallbackLocaleProviderAdapter;
         default:
             throw new InternalError("unknown locale data adapter type");
         }
@@ -173,7 +184,7 @@
 
     public static LocaleProviderAdapter getResourceBundleBased() {
         for (Type type : getAdapterPreference()) {
-            if (type == Type.JRE || type == Type.CLDR) {
+            if (type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK) {
                 return forType(type);
             }
         }
@@ -218,8 +229,8 @@
             }
         }
 
-        // returns the adapter for JRE as the last resort
-        return jreLocaleProviderAdapter;
+        // returns the adapter for FALLBACK as the last resort
+        return fallbackLocaleProviderAdapter;
     }
 
     private static LocaleProviderAdapter findAdapter(Class<? extends LocaleServiceProvider> providerClass,
@@ -238,18 +249,24 @@
 
     /**
      * A utility method for implementing the default LocaleServiceProvider.isSupportedLocale
-     * for the JRE and CLDR adapters.
+     * for the JRE, CLDR, and FALLBACK adapters.
      */
     static boolean isSupportedLocale(Locale locale, LocaleProviderAdapter.Type type, Set<String> langtags) {
-        assert type == Type.JRE || type == Type.CLDR;
-        if (locale == Locale.ROOT) {
+        assert type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK;
+        if (Locale.ROOT.equals(locale)) {
             return true;
         }
+
+        if (type == Type.FALLBACK) {
+            // no other locales except ROOT are supported for FALLBACK
+            return false;
+        }
+
         locale = locale.stripExtensions();
         if (langtags.contains(locale.toLanguageTag())) {
             return true;
         }
-        if (type == LocaleProviderAdapter.Type.JRE) {
+        if (type == Type.JRE) {
             String oldname = locale.toString().replace('_', '-');
             return langtags.contains(oldname);
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/spi/XmlPropertiesProvider.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.util.spi;
+
+import java.util.Properties;
+import java.util.InvalidPropertiesFormatException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * Service-provider class for loading and storing {@link Properites} in XML
+ * format.
+ *
+ * @see Properties#loadFromXML
+ * @see Properties#storeToXML
+ */
+
+public abstract class XmlPropertiesProvider {
+
+    /**
+     * Initializes a new instance of this class.
+     */
+    protected XmlPropertiesProvider() {
+        // do nothing for now
+    }
+
+    /**
+     * Loads all of the properties represented by the XML document on the
+     * specified input stream into a properties table.
+     *
+     * @param props the properties table to populate
+     * @param in the input stream from which to read the XML document
+     * @throws IOException if reading from the specified input stream fails
+     * @throws InvalidPropertiesFormatException Data on input stream does not
+     *         constitute a valid XML document with the mandated document type.
+     *
+     * @see Properties#loadFromXML
+     */
+    public abstract void load(Properties props, InputStream in)
+        throws IOException, InvalidPropertiesFormatException;
+
+    /**
+     * Emits an XML document representing all of the properties in a given
+     * table.
+     *
+     * @param props the properies to store
+     * @param out the output stream on which to emit the XML document.
+     * @param comment  a description of the property list, can be @{code null}
+     * @param encoding the name of a supported character encoding
+     *
+     * @throws IOException if writing to the specified output stream fails
+     * @throws NullPointerException if {@code out} is null.
+     * @throws ClassCastException  if this {@code Properties} object
+     *         contains any keys or values that are not
+     *         {@code Strings}.
+     *
+     * @see Properties#storeToXML
+     */
+    public abstract void store(Properties props, OutputStream out,
+                               String comment, String encoding)
+        throws IOException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/xml/META-INF/services/sun.util.spi.XmlPropertiesProvider	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,1 @@
+sun.util.xml.PlatformXmlPropertiesProvider
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/xml/PlatformXmlPropertiesProvider.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2003, 2011, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package sun.util.xml;
+
+import java.io.*;
+import java.util.*;
+import org.xml.sax.*;
+import org.w3c.dom.*;
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+
+import sun.util.spi.XmlPropertiesProvider;
+
+/**
+ * A {@code XmlPropertiesProvider} implementation that uses the JAXP API
+ * for parsing.
+ *
+ * @author  Michael McCloskey
+ * @since   1.3
+ */
+public class PlatformXmlPropertiesProvider extends XmlPropertiesProvider {
+
+    // XML loading and saving methods for Properties
+
+    // The required DTD URI for exported properties
+    private static final String PROPS_DTD_URI =
+    "http://java.sun.com/dtd/properties.dtd";
+
+    private static final String PROPS_DTD =
+    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+    "<!-- DTD for properties -->"                +
+    "<!ELEMENT properties ( comment?, entry* ) >"+
+    "<!ATTLIST properties"                       +
+        " version CDATA #FIXED \"1.0\">"         +
+    "<!ELEMENT comment (#PCDATA) >"              +
+    "<!ELEMENT entry (#PCDATA) >"                +
+    "<!ATTLIST entry "                           +
+        " key CDATA #REQUIRED>";
+
+    /**
+     * Version number for the format of exported properties files.
+     */
+    private static final String EXTERNAL_XML_VERSION = "1.0";
+
+    @Override
+    public void load(Properties props, InputStream in)
+        throws IOException, InvalidPropertiesFormatException
+    {
+        Document doc = null;
+        try {
+            doc = getLoadingDoc(in);
+        } catch (SAXException saxe) {
+            throw new InvalidPropertiesFormatException(saxe);
+        }
+        Element propertiesElement = doc.getDocumentElement();
+        String xmlVersion = propertiesElement.getAttribute("version");
+        if (xmlVersion.compareTo(EXTERNAL_XML_VERSION) > 0)
+            throw new InvalidPropertiesFormatException(
+                "Exported Properties file format version " + xmlVersion +
+                " is not supported. This java installation can read" +
+                " versions " + EXTERNAL_XML_VERSION + " or older. You" +
+                " may need to install a newer version of JDK.");
+        importProperties(props, propertiesElement);
+    }
+
+    static Document getLoadingDoc(InputStream in)
+        throws SAXException, IOException
+    {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setIgnoringElementContentWhitespace(true);
+        dbf.setValidating(true);
+        dbf.setCoalescing(true);
+        dbf.setIgnoringComments(true);
+        try {
+            DocumentBuilder db = dbf.newDocumentBuilder();
+            db.setEntityResolver(new Resolver());
+            db.setErrorHandler(new EH());
+            InputSource is = new InputSource(in);
+            return db.parse(is);
+        } catch (ParserConfigurationException x) {
+            throw new Error(x);
+        }
+    }
+
+    static void importProperties(Properties props, Element propertiesElement) {
+        NodeList entries = propertiesElement.getChildNodes();
+        int numEntries = entries.getLength();
+        int start = numEntries > 0 &&
+            entries.item(0).getNodeName().equals("comment") ? 1 : 0;
+        for (int i=start; i<numEntries; i++) {
+            Element entry = (Element)entries.item(i);
+            if (entry.hasAttribute("key")) {
+                Node n = entry.getFirstChild();
+                String val = (n == null) ? "" : n.getNodeValue();
+                props.setProperty(entry.getAttribute("key"), val);
+            }
+        }
+    }
+
+    @Override
+    public void store(Properties props, OutputStream os, String comment,
+                      String encoding)
+        throws IOException
+    {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        DocumentBuilder db = null;
+        try {
+            db = dbf.newDocumentBuilder();
+        } catch (ParserConfigurationException pce) {
+            assert(false);
+        }
+        Document doc = db.newDocument();
+        Element properties =  (Element)
+            doc.appendChild(doc.createElement("properties"));
+
+        if (comment != null) {
+            Element comments = (Element)properties.appendChild(
+                doc.createElement("comment"));
+            comments.appendChild(doc.createTextNode(comment));
+        }
+
+        synchronized (props) {
+            for (String key : props.stringPropertyNames()) {
+                Element entry = (Element)properties.appendChild(
+                    doc.createElement("entry"));
+                entry.setAttribute("key", key);
+                entry.appendChild(doc.createTextNode(props.getProperty(key)));
+            }
+        }
+        emitDocument(doc, os, encoding);
+    }
+
+    static void emitDocument(Document doc, OutputStream os, String encoding)
+        throws IOException
+    {
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer t = null;
+        try {
+            t = tf.newTransformer();
+            t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, PROPS_DTD_URI);
+            t.setOutputProperty(OutputKeys.INDENT, "yes");
+            t.setOutputProperty(OutputKeys.METHOD, "xml");
+            t.setOutputProperty(OutputKeys.ENCODING, encoding);
+        } catch (TransformerConfigurationException tce) {
+            assert(false);
+        }
+        DOMSource doms = new DOMSource(doc);
+        StreamResult sr = new StreamResult(os);
+        try {
+            t.transform(doms, sr);
+        } catch (TransformerException te) {
+            throw new IOException(te);
+        }
+    }
+
+    private static class Resolver implements EntityResolver {
+        public InputSource resolveEntity(String pid, String sid)
+            throws SAXException
+        {
+            if (sid.equals(PROPS_DTD_URI)) {
+                InputSource is;
+                is = new InputSource(new StringReader(PROPS_DTD));
+                is.setSystemId(PROPS_DTD_URI);
+                return is;
+            }
+            throw new SAXException("Invalid system identifier: " + sid);
+        }
+    }
+
+    private static class EH implements ErrorHandler {
+        public void error(SAXParseException x) throws SAXException {
+            throw x;
+        }
+        public void fatalError(SAXParseException x) throws SAXException {
+            throw x;
+        }
+        public void warning(SAXParseException x) throws SAXException {
+            throw x;
+        }
+    }
+
+}
--- a/jdk/src/share/classes/sun/util/xml/XMLUtils.java	Wed Jul 05 18:25:14 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2003, 2011, 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.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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.
- */
-
-package sun.util.xml;
-
-import java.io.*;
-import java.util.*;
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-import org.w3c.dom.*;
-import javax.xml.parsers.*;
-import javax.xml.transform.*;
-import javax.xml.transform.dom.*;
-import javax.xml.transform.stream.*;
-
-/**
- * A class used to aid in Properties load and save in XML. Keeping this
- * code outside of Properties helps reduce the number of classes loaded
- * when Properties is loaded.
- *
- * @author  Michael McCloskey
- * @since   1.3
- */
-public class XMLUtils {
-
-    // XML loading and saving methods for Properties
-
-    // The required DTD URI for exported properties
-    private static final String PROPS_DTD_URI =
-    "http://java.sun.com/dtd/properties.dtd";
-
-    private static final String PROPS_DTD =
-    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
-    "<!-- DTD for properties -->"                +
-    "<!ELEMENT properties ( comment?, entry* ) >"+
-    "<!ATTLIST properties"                       +
-        " version CDATA #FIXED \"1.0\">"         +
-    "<!ELEMENT comment (#PCDATA) >"              +
-    "<!ELEMENT entry (#PCDATA) >"                +
-    "<!ATTLIST entry "                           +
-        " key CDATA #REQUIRED>";
-
-    /**
-     * Version number for the format of exported properties files.
-     */
-    private static final String EXTERNAL_XML_VERSION = "1.0";
-
-    public static void load(Properties props, InputStream in)
-        throws IOException, InvalidPropertiesFormatException
-    {
-        Document doc = null;
-        try {
-            doc = getLoadingDoc(in);
-        } catch (SAXException saxe) {
-            throw new InvalidPropertiesFormatException(saxe);
-        }
-        Element propertiesElement = doc.getDocumentElement();
-        String xmlVersion = propertiesElement.getAttribute("version");
-        if (xmlVersion.compareTo(EXTERNAL_XML_VERSION) > 0)
-            throw new InvalidPropertiesFormatException(
-                "Exported Properties file format version " + xmlVersion +
-                " is not supported. This java installation can read" +
-                " versions " + EXTERNAL_XML_VERSION + " or older. You" +
-                " may need to install a newer version of JDK.");
-        importProperties(props, propertiesElement);
-    }
-
-    static Document getLoadingDoc(InputStream in)
-        throws SAXException, IOException
-    {
-        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-        dbf.setIgnoringElementContentWhitespace(true);
-        dbf.setValidating(true);
-        dbf.setCoalescing(true);
-        dbf.setIgnoringComments(true);
-        try {
-            DocumentBuilder db = dbf.newDocumentBuilder();
-            db.setEntityResolver(new Resolver());
-            db.setErrorHandler(new EH());
-            InputSource is = new InputSource(in);
-            return db.parse(is);
-        } catch (ParserConfigurationException x) {
-            throw new Error(x);
-        }
-    }
-
-    static void importProperties(Properties props, Element propertiesElement) {
-        NodeList entries = propertiesElement.getChildNodes();
-        int numEntries = entries.getLength();
-        int start = numEntries > 0 &&
-            entries.item(0).getNodeName().equals("comment") ? 1 : 0;
-        for (int i=start; i<numEntries; i++) {
-            Element entry = (Element)entries.item(i);
-            if (entry.hasAttribute("key")) {
-                Node n = entry.getFirstChild();
-                String val = (n == null) ? "" : n.getNodeValue();
-                props.setProperty(entry.getAttribute("key"), val);
-            }
-        }
-    }
-
-    public static void save(Properties props, OutputStream os, String comment,
-                     String encoding)
-        throws IOException
-    {
-        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-        DocumentBuilder db = null;
-        try {
-            db = dbf.newDocumentBuilder();
-        } catch (ParserConfigurationException pce) {
-            assert(false);
-        }
-        Document doc = db.newDocument();
-        Element properties =  (Element)
-            doc.appendChild(doc.createElement("properties"));
-
-        if (comment != null) {
-            Element comments = (Element)properties.appendChild(
-                doc.createElement("comment"));
-            comments.appendChild(doc.createTextNode(comment));
-        }
-
-        synchronized (props) {
-            for (String key : props.stringPropertyNames()) {
-                Element entry = (Element)properties.appendChild(
-                    doc.createElement("entry"));
-                entry.setAttribute("key", key);
-                entry.appendChild(doc.createTextNode(props.getProperty(key)));
-            }
-        }
-        emitDocument(doc, os, encoding);
-    }
-
-    static void emitDocument(Document doc, OutputStream os, String encoding)
-        throws IOException
-    {
-        TransformerFactory tf = TransformerFactory.newInstance();
-        Transformer t = null;
-        try {
-            t = tf.newTransformer();
-            t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, PROPS_DTD_URI);
-            t.setOutputProperty(OutputKeys.INDENT, "yes");
-            t.setOutputProperty(OutputKeys.METHOD, "xml");
-            t.setOutputProperty(OutputKeys.ENCODING, encoding);
-        } catch (TransformerConfigurationException tce) {
-            assert(false);
-        }
-        DOMSource doms = new DOMSource(doc);
-        StreamResult sr = new StreamResult(os);
-        try {
-            t.transform(doms, sr);
-        } catch (TransformerException te) {
-            IOException ioe = new IOException();
-            ioe.initCause(te);
-            throw ioe;
-        }
-    }
-
-    private static class Resolver implements EntityResolver {
-        public InputSource resolveEntity(String pid, String sid)
-            throws SAXException
-        {
-            if (sid.equals(PROPS_DTD_URI)) {
-                InputSource is;
-                is = new InputSource(new StringReader(PROPS_DTD));
-                is.setSystemId(PROPS_DTD_URI);
-                return is;
-            }
-            throw new SAXException("Invalid system identifier: " + sid);
-        }
-    }
-
-    private static class EH implements ErrorHandler {
-        public void error(SAXParseException x) throws SAXException {
-            throw x;
-        }
-        public void fatalError(SAXParseException x) throws SAXException {
-            throw x;
-        }
-        public void warning(SAXParseException x) throws SAXException {
-            throw x;
-        }
-    }
-
-}
--- a/jdk/src/share/test/pack200/pack.conf	Wed Jul 05 18:25:14 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-# Copyright (c) 2003, 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.  Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# 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.
-#
-#
-# The config file for the packer, define all the test properties here.
-pack.effort=1
-pack.unknown.attribute=error
-pack.deflate.hint=false
-pack.keep.class.order=true
-pack.verbose=1
-
--- a/jdk/src/solaris/classes/sun/java2d/xr/XRDrawImage.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/classes/sun/java2d/xr/XRDrawImage.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,6 +27,7 @@
 
 import java.awt.*;
 import java.awt.geom.*;
+import java.awt.image.*;
 
 import sun.java2d.*;
 import sun.java2d.loops.*;
@@ -45,8 +46,8 @@
         SurfaceData srcData = dstData.getSourceSurfaceData(img,
                 SunGraphics2D.TRANSFORM_GENERIC, sg.imageComp, bgColor);
 
-        if (srcData != null && !isBgOperation(srcData, bgColor))  { // TODO: Do we bail out on bgBlits?
-        //      && srcData instanceof XRSurfaceData) {
+        if (srcData != null && !isBgOperation(srcData, bgColor)
+                && interpType <= AffineTransformOp.TYPE_BILINEAR) {
             SurfaceType srcType = srcData.getSurfaceType();
             SurfaceType dstType = dstData.getSurfaceType();
 
--- a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java	Wed Jul 05 18:26:11 2017 +0200
@@ -68,7 +68,7 @@
     static final short REVENT_OFFSET = 6;
 
     // Special value to indicate that an update should be ignored
-    static final byte  CANCELLED     = (byte)-1;
+    static final byte  IGNORE        = (byte)-1;
 
     // Maximum number of open file descriptors
     static final int   OPEN_MAX      = IOUtil.fdLimit();
@@ -192,15 +192,15 @@
 
             // events are stored as bytes for efficiency reasons
             byte b = (byte)mask;
-            assert (b == mask) && (b != CANCELLED);
+            assert (b == mask) && (b != IGNORE);
             setUpdateEvents(fd, b);
         }
     }
 
     void release(int fd) {
         synchronized (updateLock) {
-            // cancel any pending update for this file descriptor
-            setUpdateEvents(fd, CANCELLED);
+            // ignore any pending update for this file descriptor
+            setUpdateEvents(fd, IGNORE);
 
             // remove from /dev/poll
             if (registered.get(fd)) {
@@ -236,32 +236,40 @@
             while (j < updateCount) {
                 int fd = updateDescriptors[j];
                 short events = getUpdateEvents(fd);
-                boolean isRegistered = registered.get(fd);
+                boolean wasRegistered = registered.get(fd);
 
                 // events = 0 => POLLREMOVE or do-nothing
-                if (events != CANCELLED) {
+                if (events != IGNORE) {
                     if (events == 0) {
-                        if (isRegistered) {
+                        if (wasRegistered) {
                             events = POLLREMOVE;
                             registered.clear(fd);
                         } else {
-                            events = CANCELLED;
+                            events = IGNORE;
                         }
                     } else {
-                        if (!isRegistered) {
+                        if (!wasRegistered) {
                             registered.set(fd);
                         }
                     }
                 }
 
                 // populate pollfd array with updated event
-                if (events != CANCELLED) {
+                if (events != IGNORE) {
+                    // insert POLLREMOVE if changing events
+                    if (wasRegistered && events != POLLREMOVE) {
+                        putPollFD(pollArray, index, fd, POLLREMOVE);
+                        index++;
+                    }
                     putPollFD(pollArray, index, fd, events);
                     index++;
-                    if (index >= NUM_POLLFDS) {
+                    if (index >= (NUM_POLLFDS-1)) {
                         registerMultiple(wfd, pollArray.address(), index);
                         index = 0;
                     }
+
+                    // events for this fd now up to date
+                    setUpdateEvents(fd, IGNORE);
                 }
                 j++;
             }
--- a/jdk/src/solaris/classes/sun/nio/fs/LinuxFileStore.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/classes/sun/nio/fs/LinuxFileStore.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, 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
@@ -145,6 +145,9 @@
             }
             return xattrEnabled;
         }
+        // POSIX attributes not supported on FAT
+        if (type == PosixFileAttributeView.class && entry().fstype().equals("vfat"))
+            return false;
         return super.supportsFileAttributeView(type);
     }
 
--- a/jdk/src/solaris/native/java/net/Inet4AddressImpl.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/Inet4AddressImpl.c	Wed Jul 05 18:26:11 2017 +0200
@@ -647,9 +647,10 @@
 #ifdef __linux__
         if (errno != EINVAL && errno != EHOSTUNREACH)
           /*
-           * On some Linuxes, when bound to the loopback interface, sendto
-           * will fail and errno will be set to EINVAL or EHOSTUNREACH.
-           * When that happens, don't throw an exception, just return false.
+           * On some Linux versions, when a socket is bound to the loopback
+           * interface, sendto will fail and errno will be set to
+           * EINVAL or EHOSTUNREACH. When that happens, don't throw an
+           * exception, just return false.
            */
 #endif /*__linux__ */
           NET_ThrowNew(env, errno, "Can't send ICMP packet");
@@ -813,9 +814,10 @@
         case EINVAL:
         case EHOSTUNREACH:
           /*
-           * On some Linuxes, when bound to the loopback interface, connect
-           * will fail and errno will be set to EINVAL or EHOSTUNREACH.
-           * When that happens, don't throw an exception, just return false.
+           * On some Linux versions, when a socket is bound to the loopback
+           * interface, connect will fail and errno will be set to EINVAL
+           * or EHOSTUNREACH.  When that happens, don't throw an exception,
+           * just return false.
            */
 #endif /* __linux__ */
           close(fd);
--- a/jdk/src/solaris/native/java/net/Inet6AddressImpl.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/Inet6AddressImpl.c	Wed Jul 05 18:26:11 2017 +0200
@@ -336,13 +336,7 @@
                 }
                 (*env)->SetByteArrayRegion(env, ipaddress, 0, 16,
                                            (jbyte *)&(((struct sockaddr_in6*)iterator->ai_addr)->sin6_addr));
-#ifdef __linux__
-                if (!kernelIsV22()) {
-                    scope = ((struct sockaddr_in6*)iterator->ai_addr)->sin6_scope_id;
-                }
-#else
                 scope = ((struct sockaddr_in6*)iterator->ai_addr)->sin6_scope_id;
-#endif
                 if (scope != 0) { /* zero is default value, no need to set */
                     (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope);
                     (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
@@ -507,8 +501,9 @@
 #ifdef __linux__
         if (errno != EINVAL && errno != EHOSTUNREACH)
           /*
-           * On some Linuxes, when bound to the loopback interface, sendto
-           * will fail and errno will be set to EINVAL or EHOSTUNREACH.
+           * On some Linux versions, when a socket is  bound to the
+           * loopback interface, sendto will fail and errno will be
+           * set to EINVAL or EHOSTUNREACH.
            * When that happens, don't throw an exception, just return false.
            */
 #endif /*__linux__ */
@@ -623,7 +618,7 @@
      * If we can create a RAW socket, then when can use the ICMP ECHO_REQUEST
      * otherwise we'll try a tcp socket to the Echo port (7).
      * Note that this is empiric, and not connecting could mean it's blocked
-     * or the echo servioe has been disabled.
+     * or the echo service has been disabled.
      */
 
     fd = JVM_Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
@@ -680,9 +675,10 @@
         case EINVAL:
         case EHOSTUNREACH:
           /*
-           * On some Linuxes, when bound to the loopback interface, connect
-           * will fail and errno will be set to EINVAL or EHOSTUNREACH.
-           * When that happens, don't throw an exception, just return false.
+           * On some Linux versions, when  a socket is bound to the
+           * loopback interface, connect will fail and errno will
+           * be set to EINVAL or EHOSTUNREACH.  When that happens,
+           * don't throw an exception, just return false.
            */
 #endif /* __linux__ */
           close(fd);
--- a/jdk/src/solaris/native/java/net/NetworkInterface.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/NetworkInterface.c	Wed Jul 05 18:26:11 2017 +0200
@@ -769,14 +769,14 @@
         return NULL;
     }
 
-    /* return partial list if exception occure in the middle of process ???*/
+    /* return partial list if an exception occurs in the middle of process ???*/
 
     /*
      * If IPv6 is available then enumerate IPv6 addresses.
      */
 #ifdef AF_INET6
 
-        /* User can disable ipv6 expicitly by -Djava.net.preferIPv4Stack=true,
+        /* User can disable ipv6 explicitly by -Djava.net.preferIPv4Stack=true,
          * so we have to call ipv6_available()
          */
         if (ipv6_available()) {
@@ -887,7 +887,7 @@
     addrP->next = 0;
     if (family == AF_INET) {
       /*
-       * Deal with brodcast addr & subnet mask
+       * Deal with broadcast addr & subnet mask
        */
        struct sockaddr * brdcast_to = (struct sockaddr *) ((char *) addrP + sizeof(netaddr) + addr_size);
        addrP->brdcast = getBroadcast(env, sock, name,  brdcast_to );
@@ -898,7 +898,7 @@
      }
 
     /**
-     * Deal with virtual interface with colon notaion e.g. eth0:1
+     * Deal with virtual interface with colon notation e.g. eth0:1
      */
     name_colonP = strchr(name, ':');
     if (name_colonP != NULL) {
@@ -1327,13 +1327,13 @@
    }
 
      /**
-      * Solaris requires that we have IPv6 socket to query an
-      * interface without IPv4 address - check it here
-      * POSIX 1 require the kernell to return ENOTTY if the call is
-      * unappropriate for device e.g. NETMASK for device having IPv6
-      * only address but not all devices follows the standart so
-      * fallback on any error.  It's not an ecology friendly but more
-      * reliable.
+      * Solaris requires that we have an IPv6 socket to query an
+      * interface without an IPv4 address - check it here.
+      * POSIX 1 require the kernel to return ENOTTY if the call is
+      * inappropriate for a device e.g. the NETMASK for a device having IPv6
+      * only address but not all devices follow the standard so
+      * fall back on any error. It's not an ecologically friendly gesture
+      * but more reliable.
       */
 
     if (! alreadyV6 ){
@@ -1359,7 +1359,7 @@
 
 /*
  * Enumerates and returns all IPv4 interfaces
- * (linux verison)
+ * (linux verision)
  */
 
 static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) {
--- a/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Wed Jul 05 18:26:11 2017 +0200
@@ -73,16 +73,6 @@
 static jfieldID pdsi_connectedAddress;
 static jfieldID pdsi_connectedPort;
 
-#ifdef __linux__
-static jboolean isOldKernel;
-#endif
-
-#if defined(__linux__) && defined(AF_INET6)
-static jfieldID pdsi_multicastInterfaceID;
-static jfieldID pdsi_loopbackID;
-static jfieldID pdsi_ttlID;
-#endif
-
 extern void setDefaultScopeID(JNIEnv *env, struct sockaddr *him);
 extern int getDefaultScopeID(JNIEnv *env);
 
@@ -174,41 +164,6 @@
     Java_java_net_Inet6Address_init(env, 0);
     Java_java_net_NetworkInterface_init(env, 0);
 
-#ifdef __linux__
-    /*
-     * We need to determine if this is a 2.2 kernel.
-     */
-    if (uname(&sysinfo) == 0) {
-        sysinfo.release[3] = '\0';
-        isOldKernel = (strcmp(sysinfo.release, "2.2") == 0);
-    } else {
-        /*
-         * uname failed - move to plan B and examine /proc/version
-         * If this fails assume that /proc has changed and that
-         * this must be new /proc format and hence new kernel.
-         */
-        FILE *fP;
-        isOldKernel = JNI_FALSE;
-        if ((fP = fopen("/proc/version", "r")) != NULL) {
-            char ver[25];
-            if (fgets(ver, sizeof(ver), fP) != NULL) {
-                isOldKernel = (strstr(ver, "2.2.") != NULL);
-            }
-            fclose(fP);
-        }
-    }
-
-#ifdef AF_INET6
-    pdsi_multicastInterfaceID = (*env)->GetFieldID(env, cls, "multicastInterface", "I");
-    CHECK_NULL(pdsi_multicastInterfaceID);
-    pdsi_loopbackID = (*env)->GetFieldID(env, cls, "loopbackMode", "Z");
-    CHECK_NULL(pdsi_loopbackID);
-    pdsi_ttlID = (*env)->GetFieldID(env, cls, "ttl", "I");
-    CHECK_NULL(pdsi_ttlID);
-#endif
-
-#endif
-
 }
 
 /*
@@ -257,7 +212,7 @@
         return;
     }
 
-    /* intialize the local port */
+    /* initialize the local port */
     if (localport == 0) {
         /* Now that we're a connected socket, let's extract the port number
          * that the system chose for us and store it in the Socket object.
@@ -308,20 +263,14 @@
       return;
     }
 
-#ifdef __linux__
-    if (isOldKernel) {
-        int t = 0;
-        setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, (char*) &t, sizeof(int));
-    } else
-#endif
     setDefaultScopeID(env, (struct sockaddr *)&rmtaddr);
-    {
-        if (JVM_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
-            NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException",
-                            "Connect failed");
-            return;
-        }
+
+    if (JVM_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
+        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException",
+                        "Connect failed");
+        return;
     }
+
 }
 
 /*
@@ -347,12 +296,6 @@
     fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
 
 #if defined(__linux__) || defined(_ALLBSD_SOURCE)
-#ifdef __linux__
-    if (isOldKernel) {
-        int t = 1;
-        setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, (char*) &t, sizeof(int));
-    } else {
-#endif /* __linux__ */
         memset(&addr, 0, sizeof(addr));
 #ifdef AF_INET6
         if (ipv6_available()) {
@@ -369,14 +312,10 @@
         JVM_Connect(fd, (struct sockaddr *)&addr, len);
 
 #ifdef __linux__
-        // After disconnecting a UDP socket, Linux kernel will set
-        // local port to zero if the port number comes from implicit
-        // bind. Successive send/recv on the same socket will fail.
-        // So bind again with former port number here.
         int localPort = 0;
-        if (JVM_GetSockName(fd, (struct sockaddr *)&addr, &len) == -1) {
+        if (JVM_GetSockName(fd, (struct sockaddr *)&addr, &len) == -1)
             return;
-        }
+
         localPort = NET_GetPortFromSockaddr((struct sockaddr *)&addr);
         if (localPort == 0) {
             localPort = (*env)->GetIntField(env, this, pdsi_localPortID);
@@ -388,9 +327,10 @@
             {
                 ((struct sockaddr_in*)&addr)->sin_port = htons(localPort);
             }
+
             NET_Bind(fd, (struct sockaddr *)&addr, len);
         }
-    }
+
 #endif
 #else
     JVM_Connect(fd, 0, 0);
@@ -448,11 +388,7 @@
     packetBufferOffset = (*env)->GetIntField(env, packet, dp_offsetID);
     packetBufferLen = (*env)->GetIntField(env, packet, dp_lengthID);
 
-#ifdef __linux__
-    if (connected && !isOldKernel) {
-#else
     if (connected) {
-#endif
         /* arg to NET_Sendto () null in this case */
         len = 0;
         rmtaddrP = 0;
@@ -466,14 +402,14 @@
 
     if (packetBufferLen > MAX_BUFFER_LEN) {
         /* When JNI-ifying the JDK's IO routines, we turned
-         * read's and write's of byte arrays of size greater
+         * reads and writes of byte arrays of size greater
          * than 2048 bytes into several operations of size 2048.
          * This saves a malloc()/memcpy()/free() for big
          * buffers.  This is OK for file IO and TCP, but that
          * strategy violates the semantics of a datagram protocol.
          * (one big send) != (several smaller sends).  So here
-         * we *must* alloc the buffer.  Note it needn't be bigger
-         * than 65,536 (0xFFFF) the max size of an IP packet.
+         * we *must* allocate the buffer.  Note it needn't be bigger
+         * than 65,536 (0xFFFF), the max size of an IP packet.
          * Anything bigger should be truncated anyway.
          *
          * We may want to use a smarter allocation scheme at some
@@ -621,7 +557,7 @@
 #else
     family = AF_INET;
 #endif
-    if (family == AF_INET) { /* this api can't handle IPV6 addresses */
+    if (family == AF_INET) { /* this API can't handle IPV6 addresses */
         int address = (*env)->GetIntField(env, iaObj, ia_addressID);
         (*env)->SetIntField(env, addressObj, ia_addressID, address);
     }
@@ -695,14 +631,14 @@
     if (packetBufferLen > MAX_BUFFER_LEN) {
 
         /* When JNI-ifying the JDK's IO routines, we turned
-         * read's and write's of byte arrays of size greater
+         * reads and writes of byte arrays of size greater
          * than 2048 bytes into several operations of size 2048.
          * This saves a malloc()/memcpy()/free() for big
          * buffers.  This is OK for file IO and TCP, but that
          * strategy violates the semantics of a datagram protocol.
          * (one big send) != (several smaller sends).  So here
-         * we *must* alloc the buffer.  Note it needn't be bigger
-         * than 65,536 (0xFFFF) the max size of an IP packet.
+         * we *must* allocate the buffer.  Note it needn't be bigger
+         * than 65,536 (0xFFFF), the max size of an IP packet.
          * anything bigger is truncated anyway.
          *
          * We may want to use a smarter allocation scheme at some
@@ -855,14 +791,14 @@
     if (packetBufferLen > MAX_BUFFER_LEN) {
 
         /* When JNI-ifying the JDK's IO routines, we turned
-         * read's and write's of byte arrays of size greater
+         * reads and writes of byte arrays of size greater
          * than 2048 bytes into several operations of size 2048.
          * This saves a malloc()/memcpy()/free() for big
          * buffers.  This is OK for file IO and TCP, but that
          * strategy violates the semantics of a datagram protocol.
          * (one big send) != (several smaller sends).  So here
-         * we *must* alloc the buffer.  Note it needn't be bigger
-         * than 65,536 (0xFFFF) the max size of an IP packet.
+         * we *must* allocate the buffer.  Note it needn't be bigger
+         * than 65,536 (0xFFFF) the max size of an IP packet,
          * anything bigger is truncated anyway.
          *
          * We may want to use a smarter allocation scheme at some
@@ -883,24 +819,6 @@
         fullPacket = &(BUF[0]);
     }
 
-#ifdef __linux__
-    /*
-     * On Linux with the 2.2 kernel we simulate connected datagrams by
-     * discarding packets
-     */
-    if (isOldKernel) {
-        connected = (*env)->GetBooleanField(env, this, pdsi_connected);
-        if (connected) {
-            connectedAddress = (*env)->GetObjectField(env, this, pdsi_connectedAddress);
-            connectedPort = (*env)->GetIntField(env, this, pdsi_connectedPort);
-
-            if (timeout) {
-                prevTime = JVM_CurrentTimeMillis(env, 0);
-            }
-        }
-    }
-#endif
-
     do {
         retry = JNI_FALSE;
 
@@ -933,14 +851,6 @@
             }
         }
 
-        /*
-         * Security Note: For Linux 2.2 with connected datagrams ensure that
-         * you receive into the stack/heap allocated buffer - do not attempt
-         * to receive directly into DatagramPacket's byte array.
-         * (ie: if the virtual machine support pinning don't use
-         * GetByteArrayElements or a JNI critical section and receive
-         * directly into the byte array)
-         */
         len = SOCKADDR_LEN;
         n = NET_RecvFrom(fd, fullPacket, packetBufferLen, 0,
                          (struct sockaddr *)&remote_addr, &len);
@@ -971,47 +881,6 @@
             jobject packetAddress;
 
             /*
-             * If we are connected then we know that the datagram that we have
-             * received is from the address that we are connected too. However
-             * on Linux with 2.2 kernel we have to simulate this behaviour by
-             * discarding any datagrams that aren't from the connected address.
-             */
-#ifdef __linux__
-            if (isOldKernel && connected) {
-
-                if (NET_GetPortFromSockaddr((struct sockaddr *)&remote_addr) != connectedPort ||
-                    !NET_SockaddrEqualsInetAddress(env, (struct sockaddr *)&remote_addr, connectedAddress)) {
-
-                    /*
-                     * Discard the datagram as it's not from the connected
-                     * address
-                     */
-                    retry = JNI_TRUE;
-
-                    /*
-                     * Adjust timeout if necessary to ensure that we adhere to
-                     * timeout semantics.
-                     */
-                    if (timeout) {
-                        jlong newTime = JVM_CurrentTimeMillis(env, 0);
-                        timeout -= (newTime - prevTime);
-                        if (timeout <= 0) {
-                            JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
-                                    "Receive timed out");
-                            if (mallocedPacket) {
-                                free(fullPacket);
-                            }
-                            return;
-                        }
-                        prevTime = newTime;
-                    }
-
-                    continue;
-                }
-            }
-#endif
-
-            /*
              * success - fill in received address...
              *
              * REMIND: Fill in an int on the packet, and create inetadd
@@ -1112,27 +981,16 @@
 
      setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*) &t, sizeof(int));
 
-#ifdef __linux__
-    if (isOldKernel) {
-        setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, (char*) &t, sizeof(int));
-    }
-
-#ifdef AF_INET6
+#if defined (__linux__) && defined (AF_INET6)
     /*
      * On Linux for IPv6 sockets we must set the hop limit
-     * to 1 to be compatible with default ttl of 1 for IPv4 sockets.
+     * to 1 to be compatible with default TTL of 1 for IPv4 sockets.
      */
     if (domain == AF_INET6) {
         int ttl = 1;
         setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl,
                    sizeof(ttl));
-
-        if (isOldKernel) {
-            (*env)->SetIntField(env, this, pdsi_ttlID, ttl);
-        }
     }
-#endif
-
 #endif /* __linux__ */
 
     (*env)->SetIntField(env, fdObj, IO_fd_fdID, fd);
@@ -1250,16 +1108,6 @@
         return;
     }
 
-#ifdef __linux__
-    /*
-     * Linux 2.2 kernel doesn't support IPV6_MULTICAST_IF socket
-     * option so record index for later retrival.
-     */
-    if (isOldKernel) {
-        (*env)->SetIntField(env, this, pdsi_multicastInterfaceID,
-                            (jint)index);
-    }
-#endif
 }
 #endif /* AF_INET6 */
 
@@ -1326,8 +1174,6 @@
  *              InetAddress is bound
  *              Set outgoing multicast interface using
  *              IPPROTO_IPV6/IPV6_MULTICAST_IF
- *              On Linux 2.2 record interface index as can't
- *              query the multicast interface.
  *
  * SockOptions.IF_MULTICAST_IF2 :-
  *      value is a NetworkInterface
@@ -1338,8 +1184,6 @@
  *      IPv6:   Obtain NetworkInterface.index
  *              Set outgoing multicast interface using
  *              IPPROTO_IPV6/IPV6_MULTICAST_IF
- *              On Linux 2.2 record interface index as can't
- *              query the multicast interface.
  *
  */
 static void setMulticastInterface(JNIEnv *env, jobject this, int fd,
@@ -1436,15 +1280,6 @@
         return;
     }
 
-#ifdef __linux__
-    /*
-     * Can't query IPV6_MULTICAST_LOOP on Linux 2.2 kernel so
-     * store it in impl so that we can simulate getsockopt.
-     */
-    if (isOldKernel) {
-        (*env)->SetBooleanField(env, this, pdsi_loopbackID, on);
-    }
-#endif
 }
 #endif  /* AF_INET6 */
 
@@ -1507,7 +1342,7 @@
     }
 
     /*
-     * Setting the multicast interface handled seperately
+     * Setting the multicast interface handled separately
      */
     if (opt == java_net_SocketOptions_IP_MULTICAST_IF ||
         opt == java_net_SocketOptions_IP_MULTICAST_IF2) {
@@ -1594,8 +1429,7 @@
  *              Create InetAddress
  *              IP_MULTICAST_IF returns struct ip_mreqn on 2.2
  *              kernel but struct in_addr on 2.4 kernel
- *      IPv6:   Query IPPROTO_IPV6 / IPV6_MULTICAST_IF or
- *              obtain from impl is Linux 2.2 kernel
+ *      IPv6:   Query IPPROTO_IPV6 / IPV6_MULTICAST_IF
  *              If index == 0 return InetAddress representing
  *              anyLocalAddress.
  *              If index > 0 query NetworkInterface by index
@@ -1641,14 +1475,6 @@
         struct in_addr *inP = &in;
         int len = sizeof(struct in_addr);
 
-#ifdef __linux__
-        struct ip_mreqn mreqn;
-        if (isOldKernel) {
-            inP = (struct in_addr *)&mreqn;
-            len = sizeof(struct ip_mreqn);
-        }
-#endif
-
         if (JVM_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
                            (char *)inP, &len) < 0) {
             NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
@@ -1672,12 +1498,7 @@
         addr = (*env)->NewObject(env, inet4_class, inet4_ctrID, 0);
         CHECK_NULL_RETURN(addr, NULL);
 
-#ifdef __linux__
-        (*env)->SetIntField(env, addr, inet4_addrID,
-                (isOldKernel ? ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr)) );
-#else
         (*env)->SetIntField(env, addr, inet4_addrID, ntohl(in.s_addr));
-#endif
 
         /*
          * For IP_MULTICAST_IF return InetAddress
@@ -1746,22 +1567,11 @@
         jobject addr;
         jobject ni;
 
-#ifdef __linux__
-        /*
-         * Linux 2.2 kernel doesn't support IPV6_MULTICAST_IF socke option
-         * so use cached index.
-         */
-        if (isOldKernel) {
-            index = (*env)->GetIntField(env, this, pdsi_multicastInterfaceID);
-        } else
-#endif
-        {
-            if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
-                               (char*)&index, &len) < 0) {
-                NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
-                               "Error getting socket option");
-                return NULL;
-            }
+        if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+                           (char*)&index, &len) < 0) {
+            NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+                           "Error getting socket option");
+            return NULL;
         }
 
         if (ni_class == NULL) {
@@ -1877,7 +1687,7 @@
     }
 
     /*
-     * Handle IP_MULTICAST_IF seperately
+     * Handle IP_MULTICAST_IF separately
      */
     if (opt == java_net_SocketOptions_IP_MULTICAST_IF ||
         opt == java_net_SocketOptions_IP_MULTICAST_IF2) {
@@ -1916,18 +1726,6 @@
         return NULL;
     }
 
-    /*
-     * IP_MULTICAST_LOOP socket option isn't available on Linux 2.2
-     * kernel with IPv6 so return value stored in impl.
-     */
-#if defined(AF_INET6) && defined(__linux__)
-    if (isOldKernel && opt == java_net_SocketOptions_IP_MULTICAST_LOOP &&
-        level == IPPROTO_IPV6) {
-        int mode = (int)(*env)->GetBooleanField(env, this, pdsi_loopbackID);
-        return createBoolean(env, mode);
-    }
-#endif
-
     if (opt == java_net_SocketOptions_IP_MULTICAST_LOOP &&
         level == IPPROTO_IP) {
         optlen = sizeof(optval.c);
@@ -1961,7 +1759,7 @@
 
     }
 
-    /* should never rearch here */
+    /* should never reach here */
     return NULL;
 }
 
@@ -2025,15 +1823,12 @@
     } else {
         fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
     }
-    /* setsockopt to be correct ttl */
+    /* setsockopt to be correct TTL */
 #ifdef AF_INET6
 #ifdef __linux__
     setTTL(env, fd, ttl);
     if (ipv6_available()) {
         setHopLimit(env, fd, ttl);
-        if (isOldKernel) {
-            (*env)->SetIntField(env, this, pdsi_ttlID, ttl);
-        }
     }
 #else  /*  __linux__ not defined */
     if (ipv6_available()) {
@@ -2076,21 +1871,12 @@
     } else {
         fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
     }
-    /* getsockopt of ttl */
+    /* getsockopt of TTL */
 #ifdef AF_INET6
     if (ipv6_available()) {
         int ttl = 0;
         int len = sizeof(ttl);
 
-#ifdef __linux__
-        /*
-         * Linux 2.2 kernel doesn't support IPV6_MULTICAST_HOPS socket option
-         */
-        if (isOldKernel) {
-            return (*env)->GetIntField(env, this, pdsi_ttlID);
-        }
-#endif
-
         if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
                                (char*)&ttl, &len) < 0) {
                 NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
@@ -2258,14 +2044,10 @@
                 int index;
                 int len = sizeof(index);
 
-                if (isOldKernel) {
-                    index = (*env)->GetIntField(env, this, pdsi_multicastInterfaceID);
-                } else {
-                    if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
-                                       (char*)&index, &len) < 0) {
-                        NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
-                        return;
-                    }
+                if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+                                   (char*)&index, &len) < 0) {
+                    NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
+                    return;
                 }
 
                 mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID));
@@ -2279,21 +2061,13 @@
                 struct in_addr *inP = &in;
                 socklen_t len = sizeof(struct in_addr);
 
-#ifdef __linux__
-                struct ip_mreqn mreqn;
-                if (isOldKernel) {
-                    inP = (struct in_addr *)&mreqn;
-                    len = sizeof(struct ip_mreqn);
-                }
-#endif
                 if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)inP, &len) < 0) {
                     NET_ThrowCurrent(env, "getsockopt IP_MULTICAST_IF failed");
                     return;
                 }
 
 #ifdef __linux__
-                mname.imr_address.s_addr =
-                    (isOldKernel ? mreqn.imr_address.s_addr : in.s_addr);
+                mname.imr_address.s_addr = in.s_addr;
 
 #else
                 mname.imr_interface.s_addr = in.s_addr;
@@ -2314,10 +2088,10 @@
              * If IP_ADD_MEMBERSHIP returns ENOPROTOOPT on Linux and we've got
              * IPv6 enabled then it's possible that the kernel has been fixed
              * so we switch to IPV6_ADD_MEMBERSHIP socket option.
-             * As of 2.4.7 kernel IPV6_ADD_MEMERSHIP can't handle IPv4-mapped
-             * addresses so we have to use IP_ADD_MEMERSHIP for IPv4 multicast
+             * As of 2.4.7 kernel IPV6_ADD_MEMBERSHIP can't handle IPv4-mapped
+             * addresses so we have to use IP_ADD_MEMBERSHIP for IPv4 multicast
              * groups. However if the socket is an IPv6 socket then then setsockopt
-             * should reurn ENOPROTOOPT. We assume this will be fixed in Linux
+             * should return ENOPROTOOPT. We assume this will be fixed in Linux
              * at some stage.
              */
 #if defined(__linux__) && defined(AF_INET6)
@@ -2385,20 +2159,10 @@
             int index;
             int len = sizeof(index);
 
-#ifdef __linux__
-            /*
-             * 2.2 kernel doens't support IPV6_MULTICAST_IF socket option
-             */
-            if (isOldKernel) {
-                index = (*env)->GetIntField(env, this, pdsi_multicastInterfaceID);
-            } else
-#endif
-            {
-                if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
-                                 (char*)&index, &len) < 0) {
-                    NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
-                    return;
-                }
+            if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+                             (char*)&index, &len) < 0) {
+                NET_ThrowCurrent(env, "getsockopt IPV6_MULTICAST_IF failed");
+               return;
             }
 
 #ifdef __linux__
@@ -2408,7 +2172,7 @@
              * subsequent leave groups to fail as there is no match. Thus we
              * pick the interface if there is a matching route.
              */
-            if (index == 0 && !isOldKernel) {
+            if (index == 0) {
                 int rt_index = getDefaultIPv6Interface(&(mname6.ipv6mr_multiaddr));
                 if (rt_index > 0) {
                     index = rt_index;
--- a/jdk/src/solaris/native/java/net/PlainSocketImpl.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/PlainSocketImpl.c	Wed Jul 05 18:26:11 2017 +0200
@@ -128,7 +128,7 @@
 
 /*
  * The initroto function is called whenever PlainSocketImpl is
- * loaded, to cache fieldIds for efficiency. This is called everytime
+ * loaded, to cache field IDs for efficiency. This is called every time
  * the Java class is loaded.
  *
  * Class:     java_net_PlainSocketImpl
@@ -589,7 +589,7 @@
     /* set the address */
     (*env)->SetObjectField(env, this, psi_addressID, iaObj);
 
-    /* intialize the local port */
+    /* initialize the local port */
     if (localport == 0) {
         /* Now that we're a connected socket, let's extract the port number
          * that the system chose for us and store it in the Socket object.
@@ -909,7 +909,7 @@
     }
 
     /*
-     * SO_TIMEOUT is a no-op on Solaris/Linux
+     * SO_TIMEOUT is a NOOP on Solaris/Linux
      */
     if (cmd == java_net_SocketOptions_SO_TIMEOUT) {
         return;
--- a/jdk/src/solaris/native/java/net/SocketInputStream.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/SocketInputStream.c	Wed Jul 05 18:26:11 2017 +0200
@@ -67,14 +67,14 @@
     jint fd, nread;
 
     if (IS_NULL(fdObj)) {
-        /* should't this be a NullPointerException? -br */
+        /* shouldn't this be a NullPointerException? -br */
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                         "Socket closed");
         return -1;
     } else {
         fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
         /* Bug 4086704 - If the Socket associated with this file descriptor
-         * was closed (sysCloseFD), the the file descriptor is set to -1.
+         * was closed (sysCloseFD), then the file descriptor is set to -1.
          */
         if (fd == -1) {
             JNU_ThrowByName(env, "java/net/SocketException", "Socket closed");
--- a/jdk/src/solaris/native/java/net/bsd_close.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/bsd_close.c	Wed Jul 05 18:26:11 2017 +0200
@@ -68,7 +68,7 @@
 
 /*
  * This limit applies if getlimit() returns unlimited.
- * Unfortunately, this means if someone wants a higher limt
+ * Unfortunately, this means if someone wants a higher limit
  * then they have to set an explicit limit, higher than this,
  * which is probably counter-intuitive.
  */
--- a/jdk/src/solaris/native/java/net/net_util_md.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/net_util_md.c	Wed Jul 05 18:26:11 2017 +0200
@@ -169,7 +169,7 @@
  * for Solaris versions that do not support the ioctl() in getParam().
  * Ugly, but only called once (for each sotype).
  *
- * As an optimisation, we make a guess using the default values for Solaris
+ * As an optimization, we make a guess using the default values for Solaris
  * assuming they haven't been modified with ndd.
  */
 
@@ -217,23 +217,7 @@
 #endif
 
 #ifdef __linux__
-static int kernelV22 = 0;
 static int vinit = 0;
-
-int kernelIsV22 () {
-    if (!vinit) {
-        struct utsname sysinfo;
-        if (uname(&sysinfo) == 0) {
-            sysinfo.release[3] = '\0';
-            if (strcmp(sysinfo.release, "2.2") == 0) {
-                kernelV22 = JNI_TRUE;
-            }
-        }
-        vinit = 1;
-    }
-    return kernelV22;
-}
-
 static int kernelV24 = 0;
 static int vinit24 = 0;
 
@@ -253,17 +237,11 @@
 
 int getScopeID (struct sockaddr *him) {
     struct sockaddr_in6 *hext = (struct sockaddr_in6 *)him;
-    if (kernelIsV22()) {
-        return 0;
-    }
     return hext->sin6_scope_id;
 }
 
 int cmpScopeID (unsigned int scope, struct sockaddr *him) {
     struct sockaddr_in6 *hext = (struct sockaddr_in6 *)him;
-    if (kernelIsV22()) {
-        return 1;       /* scope is ignored for comparison in 2.2 kernel */
-    }
     return hext->sin6_scope_id == scope;
 }
 
@@ -843,15 +821,14 @@
          * address needs to be routed via the loopback interface. In this case,
          * we override the specified value with that of the loopback interface.
          * If no cached value exists and no value was specified by user, then
-         * we try to determine a value ffrom the routing table. In all these
+         * we try to determine a value from the routing table. In all these
          * cases the used value is cached for further use.
          */
 #ifdef __linux__
         if (IN6_IS_ADDR_LINKLOCAL(&(him6->sin6_addr))) {
             int cached_scope_id = 0, scope_id = 0;
-            int old_kernel = kernelIsV22();
 
-            if (ia6_cachedscopeidID && !old_kernel) {
+            if (ia6_cachedscopeidID) {
                 cached_scope_id = (int)(*env)->GetIntField(env, iaObj, ia6_cachedscopeidID);
                 /* if cached value exists then use it. Otherwise, check
                  * if scope is set in the address.
@@ -891,13 +868,11 @@
              * of sockaddr_in6.
              */
 
-            if (!old_kernel) {
-                struct sockaddr_in6 *him6 =
-                        (struct sockaddr_in6 *)him;
-                him6->sin6_scope_id = cached_scope_id != 0 ?
-                                            cached_scope_id    : scope_id;
-                *len = sizeof(struct sockaddr_in6);
-            }
+            struct sockaddr_in6 *him6 =
+                    (struct sockaddr_in6 *)him;
+            him6->sin6_scope_id = cached_scope_id != 0 ?
+                                        cached_scope_id    : scope_id;
+            *len = sizeof(struct sockaddr_in6);
         }
 #else
         /* handle scope_id for solaris */
@@ -1208,7 +1183,7 @@
 
 /*
  * Wrapper for getsockopt system routine - does any necessary
- * pre/post processing to deal with OS specific oddies :-
+ * pre/post processing to deal with OS specific oddities :-
  *
  * IP_TOS is a no-op with IPv6 sockets as it's setup when
  * the connection is established.
@@ -1287,7 +1262,7 @@
  *
  * For IP_TOS socket option need to mask off bits as this
  * aren't automatically masked by the kernel and results in
- * an error. In addition IP_TOS is a noop with IPv6 as it
+ * an error. In addition IP_TOS is a NOOP with IPv6 as it
  * should be setup as connection time.
  */
 int
@@ -1321,7 +1296,7 @@
 
     /*
      * IPPROTO/IP_TOS :-
-     * 1. IPv6 on Solaris/Mac OS: no-op and will be set
+     * 1. IPv6 on Solaris/Mac OS: NOOP and will be set
      *    in flowinfo field when connecting TCP socket,
      *    or sending UDP packet.
      * 2. IPv6 on Linux: By default Linux ignores flowinfo
--- a/jdk/src/solaris/native/java/net/net_util_md.h	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/java/net/net_util_md.h	Wed Jul 05 18:26:11 2017 +0200
@@ -144,7 +144,6 @@
  *  Utilities
  */
 #ifdef __linux__
-extern int kernelIsV22();
 extern int kernelIsV24();
 #endif
 
--- a/jdk/src/solaris/native/sun/awt/initIDs.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/sun/awt/initIDs.c	Wed Jul 05 18:26:11 2017 +0200
@@ -89,6 +89,12 @@
 }
 
 JNIEXPORT void JNICALL
+Java_java_awt_Choice_initIDs
+  (JNIEnv *env, jclass clazz)
+{
+}
+
+JNIEXPORT void JNICALL
 Java_java_awt_Dimension_initIDs
   (JNIEnv *env, jclass clazz)
 {
--- a/jdk/src/solaris/native/sun/nio/ch/Net.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/solaris/native/sun/nio/ch/Net.c	Wed Jul 05 18:26:11 2017 +0200
@@ -38,6 +38,7 @@
 #include "net_util_md.h"
 #include "nio_util.h"
 #include "nio.h"
+#include "sun_nio_ch_PollArrayWrapper.h"
 
 #ifdef _ALLBSD_SOURCE
 
@@ -627,6 +628,26 @@
         handleSocketError(env, errno);
 }
 
+JNIEXPORT jint JNICALL
+Java_sun_nio_ch_Net_poll(JNIEnv* env, jclass this, jobject fdo, jint events, jlong timeout)
+{
+    struct pollfd pfd;
+    int rv;
+    pfd.fd = fdval(env, fdo);
+    pfd.events = events;
+    rv = poll(&pfd, 1, timeout);
+
+    if (rv >= 0) {
+        return pfd.revents;
+    } else if (errno == EINTR) {
+        return IOS_INTERRUPTED;
+    } else if (rv < 0) {
+        handleSocketError(env, errno);
+        return IOS_THROWN;
+    }
+}
+
+
 /* Declared in nio_util.h */
 
 jint
--- a/jdk/src/windows/native/sun/nio/ch/Net.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/nio/ch/Net.c	Wed Jul 05 18:26:11 2017 +0200
@@ -35,6 +35,7 @@
 #include "net_util.h"
 
 #include "sun_nio_ch_Net.h"
+#include "sun_nio_ch_PollArrayWrapper.h"
 
 /**
  * Definitions to allow for building with older SDK include files.
@@ -524,3 +525,49 @@
         NET_ThrowNew(env, WSAGetLastError(), "shutdown");
     }
 }
+
+JNIEXPORT jint JNICALL
+Java_sun_nio_ch_Net_poll(JNIEnv* env, jclass this, jobject fdo, jint events, jlong timeout)
+{
+    int rv;
+    int revents = 0;
+    struct timeval t;
+    int lastError = 0;
+    fd_set rd, wr, ex;
+    jint fd = fdval(env, fdo);
+
+    t.tv_sec = timeout / 1000;
+    t.tv_usec = (timeout % 1000) * 1000;
+
+    FD_ZERO(&rd);
+    FD_ZERO(&wr);
+    FD_ZERO(&ex);
+    if (events & sun_nio_ch_PollArrayWrapper_POLLIN) {
+        FD_SET(fd, &rd);
+    }
+    if (events & sun_nio_ch_PollArrayWrapper_POLLOUT ||
+        events & sun_nio_ch_PollArrayWrapper_POLLCONN) {
+        FD_SET(fd, &wr);
+    }
+    FD_SET(fd, &ex);
+
+    rv = select(fd+1, &rd, &wr, &ex, &t);
+
+    /* save last winsock error */
+    if (rv == SOCKET_ERROR) {
+        handleSocketError(env, lastError);
+        return IOS_THROWN;
+    } else if (rv >= 0) {
+        rv = 0;
+        if (FD_ISSET(fd, &rd)) {
+            rv |= sun_nio_ch_PollArrayWrapper_POLLIN;
+        }
+        if (FD_ISSET(fd, &wr)) {
+            rv |= sun_nio_ch_PollArrayWrapper_POLLOUT;
+        }
+        if (FD_ISSET(fd, &ex)) {
+            rv |= sun_nio_ch_PollArrayWrapper_POLLERR;
+        }
+    }
+    return rv;
+}
--- a/jdk/src/windows/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c	Wed Jul 05 18:26:11 2017 +0200
@@ -209,31 +209,26 @@
  */
 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDateTimePattern
   (JNIEnv *env, jclass cls, jint dateStyle, jint timeStyle, jstring jlangtag) {
-    WCHAR datePattern[BUFLEN];
-    WCHAR timePattern[BUFLEN];
+    WCHAR pattern[BUFLEN];
     const jchar *langtag = (*env)->GetStringChars(env, jlangtag, JNI_FALSE);
 
-    datePattern[0] = L'\0';
-    timePattern[0] = L'\0';
+    pattern[0] = L'\0';
 
     if (dateStyle == 0 || dateStyle == 1) {
-        getLocaleInfoWrapper(langtag, LOCALE_SLONGDATE, datePattern, BUFLEN);
+        getLocaleInfoWrapper(langtag, LOCALE_SLONGDATE, pattern, BUFLEN);
     } else if (dateStyle == 2 || dateStyle == 3) {
-        getLocaleInfoWrapper(langtag, LOCALE_SSHORTDATE, datePattern, BUFLEN);
+        getLocaleInfoWrapper(langtag, LOCALE_SSHORTDATE, pattern, BUFLEN);
     }
 
     if (timeStyle == 0 || timeStyle == 1) {
-        getLocaleInfoWrapper(langtag, LOCALE_STIMEFORMAT, timePattern, BUFLEN);
+        getLocaleInfoWrapper(langtag, LOCALE_STIMEFORMAT, pattern, BUFLEN);
     } else if (timeStyle == 2 || timeStyle == 3) {
-        getLocaleInfoWrapper(langtag, LOCALE_SSHORTTIME, timePattern, BUFLEN);
+        getLocaleInfoWrapper(langtag, LOCALE_SSHORTTIME, pattern, BUFLEN);
     }
 
-    wcscat(datePattern, L" ");
-    wcscat(datePattern, timePattern);
-
     (*env)->ReleaseStringChars(env, jlangtag, langtag);
 
-    return (*env)->NewString(env, datePattern, wcslen(datePattern));
+    return (*env)->NewString(env, pattern, wcslen(pattern));
 }
 
 /*
--- a/jdk/src/windows/native/sun/windows/awt_Choice.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/windows/awt_Choice.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -79,6 +79,10 @@
 
 static const UINT MINIMUM_NUMBER_OF_VISIBLE_ITEMS = 8;
 
+namespace {
+    jfieldID selectedIndexID;
+}
+
 /*************************************************************************
  * AwtChoice class methods
  */
@@ -86,7 +90,6 @@
 AwtChoice::AwtChoice() {
     m_hList = NULL;
     m_listDefWindowProc = NULL;
-    m_selectedItem = -1;
 }
 
 LPCTSTR AwtChoice::GetClassName() {
@@ -102,7 +105,6 @@
 
 AwtChoice* AwtChoice::Create(jobject peer, jobject parent) {
 
-
     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
 
     jobject target = NULL;
@@ -438,10 +440,14 @@
 MsgRouting AwtChoice::WmNotify(UINT notifyCode)
 {
     if (notifyCode == CBN_SELCHANGE) {
-        int selectedItem = (int)SendMessage(CB_GETCURSEL);
-        if (selectedItem != CB_ERR && m_selectedItem != selectedItem){
-            m_selectedItem = selectedItem;
-            DoCallback("handleAction", "(I)V", selectedItem);
+        int selectedIndex = (int)SendMessage(CB_GETCURSEL);
+
+        JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+        jobject target = GetTarget(env);
+        int previousIndex = env->GetIntField(target, selectedIndexID);
+
+        if (selectedIndex != CB_ERR && selectedIndex != previousIndex){
+            DoCallback("handleAction", "(I)V", selectedIndex);
         }
     } else if (notifyCode == CBN_DROPDOWN) {
 
@@ -695,6 +701,15 @@
 
 extern "C" {
 
+JNIEXPORT void JNICALL
+Java_java_awt_Choice_initIDs(JNIEnv *env, jclass cls)
+{
+    TRY;
+    selectedIndexID = env->GetFieldID(cls, "selectedIndex", "I");
+    DASSERT(selectedIndexID);
+    CATCH_BAD_ALLOC;
+}
+
 /*
  * Class:     sun_awt_windows_WChoicePeer
  * Method:    select
--- a/jdk/src/windows/native/sun/windows/awt_Choice.h	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/windows/awt_Choice.h	Wed Jul 05 18:26:11 2017 +0200
@@ -94,7 +94,6 @@
     static BOOL sm_isMouseMoveInList;
     HWND m_hList;
     WNDPROC m_listDefWindowProc;
-    int m_selectedItem;
     static LRESULT CALLBACK ListWindowProc(HWND hwnd, UINT message,
                                            WPARAM wParam, LPARAM lParam);
 };
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -3144,7 +3144,8 @@
     return;
 }
 
-UINT AwtComponent::WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers)
+UINT AwtComponent::WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers, UINT character, BOOL isDeadKey)
+
 {
     // Handle the few cases where we need to take the modifier into
     // consideration for the Java VK code or where we have to take the keyboard
@@ -3171,6 +3172,15 @@
             break;
     };
 
+    // check dead key
+    if (isDeadKey) {
+      for (int i = 0; charToDeadVKTable[i].c != 0; i++) {
+        if (charToDeadVKTable[i].c == character) {
+            return charToDeadVKTable[i].javaKey;
+        }
+      }
+    }
+
     // for the general case, use a bi-directional table
     for (int i = 0; keyMapTable[i].windowsKey != 0; i++) {
         if (keyMapTable[i].windowsKey == windowsKey) {
@@ -3384,14 +3394,18 @@
     }
 }
 
-UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops)
+UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops, BOOL &isDeadKey)
 {
     static Hashtable transTable("VKEY translations");
+    static Hashtable deadKeyFlagTable("Dead Key Flags");
+    isDeadKey = FALSE;
 
     // Try to translate using last saved translation
     if (ops == LOAD) {
+       void* deadKeyFlag = deadKeyFlagTable.remove(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)));
        void* value = transTable.remove(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)));
        if (value != NULL) {
+           isDeadKey = static_cast<BOOL>(reinterpret_cast<INT_PTR>(deadKeyFlag));
            return static_cast<UINT>(reinterpret_cast<INT_PTR>(value));
        }
     }
@@ -3484,12 +3498,13 @@
 
     // instead of creating our own conversion tables, I'll let Win32
     // convert the character for me.
-    WORD mbChar;
+    WORD wChar[2];
     UINT scancode = ::MapVirtualKey(wkey, 0);
-    int converted = ::ToAsciiEx(wkey, scancode, keyboardState,
-                                &mbChar, 0, GetKeyboardLayout());
+    int converted = ::ToUnicodeEx(wkey, scancode, keyboardState,
+                                  wChar, 2, 0, GetKeyboardLayout());
 
     UINT translation;
+    BOOL deadKeyFlag = (converted == 2);
 
     // Dead Key
     if (converted < 0) {
@@ -3508,16 +3523,16 @@
     } else
     // the caller expects a Unicode character.
     if (converted > 0) {
-        WCHAR unicodeChar[2];
-        VERIFY(::MultiByteToWideChar(GetCodePage(), MB_PRECOMPOSED,
-        (LPCSTR)&mbChar, 1, unicodeChar, 1));
-
-        translation = unicodeChar[0];
+        translation = wChar[0];
     }
     if (ops == SAVE) {
         transTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)),
                        reinterpret_cast<void*>(static_cast<INT_PTR>(translation)));
-    }
+        deadKeyFlagTable.put(reinterpret_cast<void*>(static_cast<INT_PTR>(wkey)),
+                       reinterpret_cast<void*>(static_cast<INT_PTR>(deadKeyFlag)));
+    }
+
+    isDeadKey = deadKeyFlag;
     return translation;
 }
 
@@ -3537,8 +3552,9 @@
 
     UINT modifiers = GetJavaModifiers();
     jint keyLocation = GetKeyLocation(wkey, flags);
-    UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
-    UINT character = WindowsKeyToJavaChar(wkey, modifiers, SAVE);
+    BOOL isDeadKey = FALSE;
+    UINT character = WindowsKeyToJavaChar(wkey, modifiers, SAVE, isDeadKey);
+    UINT jkey = WindowsKeyToJavaKey(wkey, modifiers, character, isDeadKey);
     UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers);
 
 
@@ -3579,8 +3595,9 @@
 
     UINT modifiers = GetJavaModifiers();
     jint keyLocation = GetKeyLocation(wkey, flags);
-    UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
-    UINT character = WindowsKeyToJavaChar(wkey, modifiers, LOAD);
+    BOOL isDeadKey = FALSE;
+    UINT character = WindowsKeyToJavaChar(wkey, modifiers, LOAD, isDeadKey);
+    UINT jkey = WindowsKeyToJavaKey(wkey, modifiers, character, isDeadKey);
     UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers);
 
     SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED,
@@ -5628,7 +5645,8 @@
                         }
                     }
 
-                    modifiedChar = p->WindowsKeyToJavaChar(winKey, modifiers, AwtComponent::NONE);
+                    BOOL isDeadKey = FALSE;
+                    modifiedChar = p->WindowsKeyToJavaChar(winKey, modifiers, AwtComponent::NONE, isDeadKey);
                     bCharChanged = (keyChar != modifiedChar);
                 }
                 break;
@@ -7166,4 +7184,4 @@
         removedDCs = removedDCs->next;
         delete tmpDCList;
     }
-}
+}
\ No newline at end of file
--- a/jdk/src/windows/native/sun/windows/awt_Component.h	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/windows/awt_Component.h	Wed Jul 05 18:26:11 2017 +0200
@@ -441,7 +441,7 @@
     static jint GetJavaModifiers();
     static jint GetButton(int mouseButton);
     static UINT GetButtonMK(int mouseButton);
-    static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers);
+    static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers, UINT character, BOOL isDeadKey);
     static void JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers, UINT originalWindowsKey);
     static void UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers);
 
@@ -453,7 +453,7 @@
 
     enum TransOps {NONE, LOAD, SAVE};
 
-    UINT WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops);
+    UINT WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops, BOOL &isDeadKey);
 
     /* routines used for input method support */
     void SetInputMethod(jobject im, BOOL useNativeCompWindow);
--- a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, 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
@@ -517,10 +517,10 @@
     jstring infojStr = NULL;
 
     if ((buffSize = ::ImmGetDescription(hkl, szImmDescription, 0)) > 0) {
-        szImmDescription = (LPTSTR) safe_Malloc(buffSize * sizeof(TCHAR));
+        szImmDescription = (LPTSTR) safe_Malloc((buffSize+1) * sizeof(TCHAR));
 
         if (szImmDescription != NULL) {
-            ImmGetDescription(hkl, szImmDescription, buffSize);
+            ImmGetDescription(hkl, szImmDescription, (buffSize+1));
 
             infojStr = JNU_NewStringPlatform(env, szImmDescription);
 
--- a/jdk/test/ProblemList.txt	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 18:26:11 2017 +0200
@@ -153,9 +153,6 @@
 # 7144846
 javax/management/remote/mandatory/connection/ReconnectTest.java	generic-all
 
-# 7158614, locks up Windows machines at least
-sun/management/jmxremote/startstop/JMXStartStopTest.sh		windows-all
-
 # 7120365
 javax/management/remote/mandatory/notif/DiffHBTest.java 	generic-all
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Choice/ItemStateChangeTest/ItemStateChangeTest.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+  @test
+  @bug 7171412
+  @summary awt Choice doesn't fire ItemStateChange when selecting item after select() call
+  @author Oleg Pekhovskiy: area=awt-choice
+  @library ../../regtesthelpers
+  @build Util
+  @run main ItemStateChangeTest
+*/
+
+import test.java.awt.regtesthelpers.Util;
+
+import java.awt.*;
+import java.awt.event.*;
+import sun.awt.OSInfo;
+
+public class ItemStateChangeTest extends Frame {
+
+    int events = 0;
+
+    public static void main(String args[]) {
+        new ItemStateChangeTest();
+    }
+
+    public ItemStateChangeTest() {
+
+        if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {
+            return;
+        }
+
+        try {
+
+            final Robot robot = new Robot();
+            robot.setAutoDelay(20);
+            Util.waitForIdle(robot);
+
+            addWindowListener(new WindowAdapter() {
+                @Override
+                public void windowClosing(WindowEvent e) {
+                    System.exit(0);
+                }
+            });
+
+            final Choice choice = new Choice();
+            choice.add("A");
+            choice.add("B");
+            choice.addItemListener(new ItemListener() {
+                @Override
+                public void itemStateChanged(ItemEvent e) {
+                    ++events;
+                }
+            });
+
+            add(choice);
+            setSize(200, 150);
+            setVisible(true);
+            toFront();
+
+            // choose B
+            int y = chooseB(choice, robot, 16);
+
+            // reset to A
+            choice.select(0);
+            robot.delay(20);
+            Util.waitForIdle(robot);
+
+            // choose B again
+            chooseB(choice, robot, y);
+
+            if (events == 2) {
+                System.out.println("Test passed!");
+            }
+            else {
+                throw new RuntimeException("Test failed!");
+            }
+
+        }
+        catch (AWTException e) {
+            throw new RuntimeException("Test failed!");
+        }
+    }
+
+    final int chooseB(Choice choice, Robot robot, int y) {
+        while (true) {
+            // show drop-down list
+            Util.clickOnComp(choice, robot);
+            Util.waitForIdle(robot);
+            Point pt = choice.getLocationOnScreen();
+            Dimension size = choice.getSize();
+            // try to click B item
+            robot.mouseMove(pt.x + size.width / 2, pt.y + size.height + y);
+            Util.waitForIdle(robot);
+            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+            Util.waitForIdle(robot);
+            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+            Util.waitForIdle(robot);
+            if (choice.getSelectedIndex() == 1) {
+                break;
+            }
+            // if it's not B, position cursor lower by 2 pixels and try again
+            y += 2;
+        }
+        return y;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/List/EmptyListEventTest/EmptyListEventTest.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2008, 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 6366126
+ * @summary List throws ArrayIndexOutOfBoundsException when pressing ENTER after removing all the items, Win32
+ * @author Dmitry Cherepanov area=awt.list
+ * @run main EmptyListEventTest
+ */
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import sun.awt.SunToolkit;
+
+public class EmptyListEventTest {
+
+    private static List list;
+
+    public static void main(String[] args) throws Exception {
+
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+
+        toolkit.realSync();
+
+        // press mouse -> ItemEvent
+        Point point = getClickPoint();
+        robot.mouseMove(point.x, point.y);
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+        toolkit.realSync();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                list.requestFocusInWindow();
+            }
+        });
+
+        toolkit.realSync();
+
+        if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != list) {
+            throw new RuntimeException("Test failed - list isn't focus owner.");
+        }
+
+        // press key ENTER -> ActionEvent
+        robot.keyPress(KeyEvent.VK_ENTER);
+        robot.keyRelease(KeyEvent.VK_ENTER);
+        toolkit.realSync();
+
+        // press key SPACE -> ItemEvent
+        robot.keyPress(KeyEvent.VK_SPACE);
+        robot.keyRelease(KeyEvent.VK_SPACE);
+        toolkit.realSync();
+
+        // mouse double click -> ActionEvent
+        robot.setAutoDelay(10);
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+        robot.mousePress(InputEvent.BUTTON1_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_MASK);
+        toolkit.realSync();
+    }
+
+    private static Point getClickPoint() throws Exception {
+        final Point[] result = new Point[1];
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+
+            @Override
+            public void run() {
+                Point point = list.getLocationOnScreen();
+                point.translate(list.getWidth() / 2, list.getHeight() / 2);
+                result[0] = point;
+
+            }
+        });
+
+        return result[0];
+
+
+    }
+
+    private static void createAndShowGUI() {
+        JFrame frame = new JFrame();
+        frame.setSize(200, 200);
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        JPanel panel = new JPanel(new BorderLayout());
+
+        frame.getToolkit().addAWTEventListener(new AWTEventListener() {
+
+            public void eventDispatched(AWTEvent e) {
+                System.out.println(e);
+            }
+        }, AWTEvent.FOCUS_EVENT_MASK | AWTEvent.WINDOW_FOCUS_EVENT_MASK);
+
+
+        MyListener listener = new MyListener();
+
+        list = new List(4, true);
+        list.addActionListener(listener);
+        list.addItemListener(listener);
+
+        panel.add(list);
+
+        frame.getContentPane().add(panel);
+        frame.setVisible(true);
+
+    }
+
+    static class MyListener implements ActionListener, ItemListener {
+
+        public void actionPerformed(ActionEvent ae) {
+            System.err.println(ae);
+            throw new RuntimeException("Test failed - list is empty so event is redundant");
+        }
+
+        public void itemStateChanged(ItemEvent ie) {
+            System.err.println(ie);
+            throw new RuntimeException("Test failed - list is empty so event is redundant");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/ScrollPane/ScrollPanePreferredSize/ScrollPanePreferredSize.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.awt.Dimension;
+import java.awt.Frame;
+import java.awt.ScrollPane;
+import java.awt.Toolkit;
+
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 7124213
+ * @author Sergey Bylokhov
+ */
+public final class ScrollPanePreferredSize {
+
+    public static void main(final String[] args) {
+        final Dimension expected = new Dimension(300, 300);
+        final Frame frame = new Frame();
+        final ScrollPane sp = new ScrollPane();
+        sp.setSize(expected);
+        frame.add(sp);
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+        sleep();
+        final Dimension size = frame.getSize();
+        if (size.width < expected.width || size.height < expected.height) {
+            throw new RuntimeException(
+                    "Expected size: >= " + expected + ", actual size: " + size);
+        }
+        frame.dispose();
+    }
+
+    private static void sleep() {
+        ((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
+        try {
+            Thread.sleep(500L);
+        } catch (InterruptedException ignored) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/TextArea/TextAreaTwicePack/TextAreaTwicePack.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.awt.Dimension;
+import java.awt.Frame;
+import java.awt.TextArea;
+import java.awt.Toolkit;
+
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 7160627
+ * @summary We shouldn't get different frame size when we call Frame.pack()
+ * twice.
+ * @author Sergey Bylokhov
+ */
+public final class TextAreaTwicePack {
+
+    public static void main(final String[] args) {
+        final Frame frame = new Frame();
+        final TextArea ta = new TextArea();
+        frame.add(ta);
+        frame.pack();
+        frame.setVisible(true);
+        sleep();
+        final Dimension before = frame.getSize();
+        frame.pack();
+        final Dimension after = frame.getSize();
+        if (!after.equals(before)) {
+            throw new RuntimeException(
+                    "Expected size: " + before + ", actual size: " + after);
+        }
+        frame.dispose();
+    }
+
+    private static void sleep() {
+        ((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
+        try {
+            Thread.sleep(500L);
+        } catch (InterruptedException ignored) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/KeyEvent/DeadKey/DeadKeyMacOSXInputText.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7199180
+ * @summary [macosx] Dead keys handling for input methods
+ * @author alexandr.scherbatiy area=awt.event
+ * @run main DeadKeyMacOSXInputText
+ */
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.event.KeyEvent;
+import javax.swing.JTextField;
+import sun.awt.OSInfo;
+import sun.awt.SunToolkit;
+
+public class DeadKeyMacOSXInputText {
+
+    private static SunToolkit toolkit;
+    private static volatile int state = 0;
+
+    public static void main(String[] args) throws Exception {
+
+        if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) {
+            return;
+        }
+
+        toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        createAndShowGUI();
+
+        // Pressed keys: Alt + E + A
+        // Results:  ALT + VK_DEAD_ACUTE + a with accute accent
+        robot.keyPress(KeyEvent.VK_ALT);
+        robot.keyPress(KeyEvent.VK_E);
+        robot.keyRelease(KeyEvent.VK_E);
+        robot.keyRelease(KeyEvent.VK_ALT);
+
+        robot.keyPress(KeyEvent.VK_A);
+        robot.keyRelease(KeyEvent.VK_A);
+        toolkit.realSync();
+
+        if (state != 3) {
+            throw new RuntimeException("Wrong number of key events.");
+        }
+    }
+
+    static void createAndShowGUI() {
+        Frame frame = new Frame();
+        frame.setSize(300, 300);
+        Panel panel = new Panel(new BorderLayout());
+        JTextField textField = new JTextField();
+        textField.addKeyListener(new DeadKeyListener());
+        panel.add(textField, BorderLayout.CENTER);
+        frame.add(panel);
+        frame.setVisible(true);
+        toolkit.realSync();
+
+        textField.requestFocusInWindow();
+        toolkit.realSync();
+
+    }
+
+    static class DeadKeyListener extends KeyAdapter {
+
+        @Override
+        public void keyPressed(KeyEvent e) {
+            int keyCode = e.getKeyCode();
+            char keyChar = e.getKeyChar();
+
+            switch (state) {
+                case 0:
+                    if (keyCode != KeyEvent.VK_ALT) {
+                        throw new RuntimeException("Alt is not pressed.");
+                    }
+                    state++;
+                    break;
+                case 1:
+                    if (keyCode != KeyEvent.VK_DEAD_ACUTE) {
+                        throw new RuntimeException("Dead ACUTE is not pressed.");
+                    }
+                    if (keyChar != 0xB4) {
+                        throw new RuntimeException("Pressed char is not dead acute.");
+                    }
+                    state++;
+                    break;
+            }
+        }
+
+        @Override
+        public void keyTyped(KeyEvent e) {
+            int keyCode = e.getKeyCode();
+            char keyChar = e.getKeyChar();
+
+            if (state == 2) {
+                if (keyCode != 0) {
+                    throw new RuntimeException("Key code should be undefined.");
+                }
+                if (keyChar != 0xE1) {
+                    throw new RuntimeException("A char does not have ACCUTE accent");
+                }
+                state++;
+            } else {
+                throw new RuntimeException("Wron number of keyTyped events.");
+            }
+        }
+    }
+}
--- a/jdk/test/java/nio/Buffer/Basic-X.java.template	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/Basic-X.java.template	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch($type$ [] t, Class ex, Runnable thunk) {
+    private static void tryCatch($type$ [] t, Class<?> ex, Runnable thunk) {
         tryCatch($Type$Buffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put($Type$Buffer) should not change source position
+        final $Type$Buffer src = $Type$Buffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 #end[byte]
 
+#if[char]
+
+        // 7199551
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+            public void run() {
+                String s = new String(new char[rb.remaining() + 1]);
+                rb.put(s);
+            }});
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+            public void run() {
+                String s = new String(new char[rb.remaining() + 1]);
+                rb.append(s);
+            }});
+
+#end[char]
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/Basic.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/Basic.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,7 +25,7 @@
  * @summary Unit test for buffers
  * @bug 4413135 4414911 4416536 4416562 4418782 4471053 4472779 4490253 4523725
  *      4526177 4463011 4660660 4661219 4663521 4782970 4804304 4938424 6231529
- *      6221101 6234263 6535542 6591971 6593946 6795561 7190219
+ *      6221101 6234263 6535542 6591971 6593946 6795561 7190219 7199551
  * @author Mark Reinhold
  */
 
--- a/jdk/test/java/nio/Buffer/BasicByte.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicByte.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(byte [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(byte [] t, Class<?> ex, Runnable thunk) {
         tryCatch(ByteBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(ByteBuffer) should not change source position
+        final ByteBuffer src = ByteBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/BasicChar.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicChar.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(char [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(char [] t, Class<?> ex, Runnable thunk) {
         tryCatch(CharBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(CharBuffer) should not change source position
+        final CharBuffer src = CharBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+        // 7199551
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+            public void run() {
+                String s = new String(new char[rb.remaining() + 1]);
+                rb.put(s);
+            }});
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+            public void run() {
+                String s = new String(new char[rb.remaining() + 1]);
+                rb.append(s);
+            }});
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/BasicDouble.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicDouble.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(double [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(double [] t, Class<?> ex, Runnable thunk) {
         tryCatch(DoubleBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(DoubleBuffer) should not change source position
+        final DoubleBuffer src = DoubleBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/BasicFloat.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicFloat.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(float [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(float [] t, Class<?> ex, Runnable thunk) {
         tryCatch(FloatBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(FloatBuffer) should not change source position
+        final FloatBuffer src = FloatBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/BasicInt.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicInt.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(int [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(int [] t, Class<?> ex, Runnable thunk) {
         tryCatch(IntBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(IntBuffer) should not change source position
+        final IntBuffer src = IntBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/BasicLong.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicLong.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(long [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(long [] t, Class<?> ex, Runnable thunk) {
         tryCatch(LongBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(LongBuffer) should not change source position
+        final LongBuffer src = LongBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- a/jdk/test/java/nio/Buffer/BasicShort.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/Buffer/BasicShort.java	Wed Jul 05 18:26:11 2017 +0200
@@ -335,7 +335,7 @@
         fail(problem + String.format(": x=%s y=%s", x, y), xb, yb);
     }
 
-    private static void tryCatch(Buffer b, Class ex, Runnable thunk) {
+    private static void tryCatch(Buffer b, Class<?> ex, Runnable thunk) {
         boolean caught = false;
         try {
             thunk.run();
@@ -350,7 +350,7 @@
             fail(ex.getName() + " not thrown", b);
     }
 
-    private static void tryCatch(short [] t, Class ex, Runnable thunk) {
+    private static void tryCatch(short [] t, Class<?> ex, Runnable thunk) {
         tryCatch(ShortBuffer.wrap(t), ex, thunk);
     }
 
@@ -681,6 +681,14 @@
                     bulkPutBuffer(rb);
                 }});
 
+        // put(ShortBuffer) should not change source position
+        final ShortBuffer src = ShortBuffer.allocate(1);
+        tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
+                public void run() {
+                    rb.put(src);
+                 }});
+        ck(src, src.position(), 0);
+
         tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
                 public void run() {
                     rb.compact();
@@ -744,6 +752,22 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         if (rb.getClass().getName().startsWith("java.nio.Heap")) {
 
             tryCatch(b, ReadOnlyBufferException.class, new Runnable() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/Selector/ChangingInterests.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/* @test
+ * @bug 7200742
+ * @summary Test that Selector doesn't spin when changing interest ops
+ */
+
+import java.net.*;
+import java.nio.ByteBuffer;
+import java.nio.channels.*;
+import static java.nio.channels.SelectionKey.*;
+import java.io.IOException;
+
+public class ChangingInterests {
+
+    static int OPS[] = { 0, OP_WRITE, OP_READ, (OP_WRITE|OP_READ) };
+
+    static String toOpsString(int ops) {
+        String s = "";
+        if ((ops & OP_READ) > 0)
+            s += "POLLIN";
+        if ((ops & OP_WRITE) > 0) {
+            if (s.length() > 0)
+                s += "|";
+            s += "POLLOUT";
+        }
+        if (s.length() == 0)
+            s = "0";
+        return "(" + s + ")";
+    }
+
+    static void write1(SocketChannel peer) throws IOException {
+        peer.write(ByteBuffer.wrap(new byte[1]));
+        // give time for other end to be readable
+        try {
+            Thread.sleep(50);
+        } catch (InterruptedException ignore) { }
+    }
+
+    static void drain(SocketChannel sc) throws IOException {
+        ByteBuffer buf = ByteBuffer.allocate(100);
+        int n;
+        while ((n = sc.read(buf)) > 0) {
+            buf.rewind();
+        }
+    }
+
+    /**
+     * Changes the given key's interest set from one set to another and then
+     * checks the selected key set and the key's channel.
+     */
+    static void testChange(SelectionKey key, int from, int to) throws IOException {
+        Selector sel = key.selector();
+        assertTrue(sel.keys().size() == 1, "Only one channel should be registered");
+
+        // ensure that channel is registered with the "from" interest set
+        key.interestOps(from);
+        sel.selectNow();
+        sel.selectedKeys().clear();
+
+        // change to the "to" interest set
+        key.interestOps(to);
+        System.out.println("select...");
+        int selected = sel.selectNow();
+        System.out.println("" + selected + " channel(s) selected");
+
+        int expected = (to == 0) ? 0 : 1;
+        assertTrue(selected == expected, "Expected " + expected);
+
+        // check selected keys
+        for (SelectionKey k: sel.selectedKeys()) {
+            assertTrue(k == key, "Unexpected key selected");
+
+            boolean readable = k.isReadable();
+            boolean writable = k.isWritable();
+
+            System.out.println("key readable: " + readable);
+            System.out.println("key writable: " + writable);
+
+            if ((to & OP_READ) == 0) {
+                assertTrue(!readable, "Not expected to be readable");
+            } else {
+                assertTrue(readable, "Expected to be readable");
+            }
+
+            if ((to & OP_WRITE) == 0) {
+                assertTrue(!writable, "Not expected to be writable");
+            } else {
+                assertTrue(writable, "Expected to be writable");
+            }
+
+            sel.selectedKeys().clear();
+        }
+    }
+
+    /**
+     * Tests that given Selector's select method blocks.
+     */
+    static void testForSpin(Selector sel) throws IOException {
+        System.out.println("Test for spin...");
+        long start = System.currentTimeMillis();
+        int count = 3;
+        while (count-- > 0) {
+            int selected = sel.select(1000);
+            System.out.println("" + selected + " channel(s) selected");
+            assertTrue(selected == 0, "Channel should not be selected");
+        }
+        long dur = System.currentTimeMillis() - start;
+        assertTrue(dur > 1000, "select was too short");
+    }
+
+    public static void main(String[] args) throws IOException {
+        InetAddress lh = InetAddress.getLocalHost();
+
+        // create loopback connection
+        ServerSocketChannel ssc =
+            ServerSocketChannel.open().bind(new InetSocketAddress(0));
+
+        final SocketChannel sc = SocketChannel.open();
+        sc.connect(new InetSocketAddress(lh, ssc.socket().getLocalPort()));
+        SocketChannel peer = ssc.accept();
+
+        sc.configureBlocking(false);
+
+        // ensure that channel "sc" is readable
+        write1(peer);
+
+        try (Selector sel = Selector.open()) {
+            SelectionKey key = sc.register(sel, 0);
+            sel.selectNow();
+
+            // test all transitions
+            for (int from: OPS) {
+                for (int to: OPS) {
+
+                    System.out.println(toOpsString(from) + " -> " + toOpsString(to));
+
+                    testChange(key, from, to);
+
+                    // if the interst ops is now 0 then Selector should not spin
+                    if (to == 0)
+                        testForSpin(sel);
+
+                    // if interest ops is now OP_READ then make non-readable
+                    // and test that Selector does not spin.
+                    if (to == OP_READ) {
+                        System.out.println("Drain channel...");
+                        drain(sc);
+                        testForSpin(sel);
+                        System.out.println("Make channel readable again");
+                        write1(peer);
+                    }
+
+                    System.out.println();
+                }
+            }
+
+        } finally {
+            sc.close();
+            peer.close();
+            ssc.close();
+        }
+    }
+
+    static void assertTrue(boolean v, String msg) {
+        if (!v) throw new RuntimeException(msg);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/etc/AdaptorCloseAndInterrupt.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/* @test
+ * @bug 7184932
+ * @summary Test asynchronous close and interrupt of timed socket adapter methods
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+import java.nio.channels.spi.AbstractSelectableChannel;
+import java.net.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.Random;
+
+
+public class AdaptorCloseAndInterrupt {
+    private static final ScheduledExecutorService pool =
+        Executors.newScheduledThreadPool(1);
+    final ServerSocketChannel listener;
+    final DatagramChannel peer;
+    final int port;
+
+    public AdaptorCloseAndInterrupt() {
+        listener = null;
+        peer = null;
+        port = -1;
+    }
+
+    public AdaptorCloseAndInterrupt(ServerSocketChannel listener) {
+        this.listener = listener;
+        this.port = listener.socket().getLocalPort();
+        this.peer = null;
+    }
+
+    public AdaptorCloseAndInterrupt(DatagramChannel listener) {
+        this.peer = listener;
+        this.port = peer.socket().getLocalPort();
+        this.listener = null;
+    }
+
+    public static void main(String args[]) throws Exception {
+        try {
+            try (ServerSocketChannel listener = ServerSocketChannel.open()) {
+                listener.socket().bind(null);
+                new AdaptorCloseAndInterrupt(listener).scReadAsyncClose();
+                new AdaptorCloseAndInterrupt(listener).scReadAsyncInterrupt();
+            }
+
+            try (DatagramChannel peer = DatagramChannel.open()) {
+                peer.socket().bind(null);
+                new AdaptorCloseAndInterrupt(peer).dcReceiveAsyncClose();
+                new AdaptorCloseAndInterrupt(peer).dcReceiveAsyncInterrupt();
+            }
+
+            new AdaptorCloseAndInterrupt().ssAcceptAsyncClose();
+            new AdaptorCloseAndInterrupt().ssAcceptAsyncInterrupt();
+        } finally {
+            pool.shutdown();
+        }
+        System.out.println("Test Passed");
+    }
+
+    void scReadAsyncClose() throws IOException {
+        try {
+            SocketChannel sc = SocketChannel.open(new InetSocketAddress(
+                "127.0.0.1", port));
+            sc.socket().setSoTimeout(30*1000);
+
+            doAsyncClose(sc);
+
+            try {
+                sc.socket().getInputStream().read(new byte[100]);
+                throw new RuntimeException("read should not have completed");
+            } catch (ClosedChannelException expected) {}
+
+            if (!sc.socket().isClosed())
+                throw new RuntimeException("socket is not closed");
+        } finally {
+            // accept connection and close it.
+            listener.accept().close();
+        }
+    }
+
+    void scReadAsyncInterrupt() throws IOException {
+        try {
+            final SocketChannel sc = SocketChannel.open(new InetSocketAddress(
+                "127.0.0.1", port));
+            sc.socket().setSoTimeout(30*1000);
+
+            doAsyncInterrupt();
+
+            try {
+                sc.socket().getInputStream().read(new byte[100]);
+                throw new RuntimeException("read should not have completed");
+            } catch (ClosedByInterruptException expected) {
+                Thread.currentThread().interrupted();
+            }
+
+            if (!sc.socket().isClosed())
+                throw new RuntimeException("socket is not closed");
+        } finally {
+            // accept connection and close it.
+            listener.accept().close();
+        }
+    }
+
+    void dcReceiveAsyncClose() throws IOException {
+        DatagramChannel dc = DatagramChannel.open();
+        dc.connect(new InetSocketAddress(
+            "127.0.0.1", port));
+        dc.socket().setSoTimeout(30*1000);
+
+        doAsyncClose(dc);
+
+        try {
+            dc.socket().receive(new DatagramPacket(new byte[100], 100));
+            throw new RuntimeException("receive should not have completed");
+        } catch (ClosedChannelException expected) {}
+
+        if (!dc.socket().isClosed())
+            throw new RuntimeException("socket is not closed");
+    }
+
+    void dcReceiveAsyncInterrupt() throws IOException {
+        DatagramChannel dc = DatagramChannel.open();
+        dc.connect(new InetSocketAddress(
+            "127.0.0.1", port));
+        dc.socket().setSoTimeout(30*1000);
+
+        doAsyncInterrupt();
+
+        try {
+            dc.socket().receive(new DatagramPacket(new byte[100], 100));
+            throw new RuntimeException("receive should not have completed");
+        } catch (ClosedByInterruptException expected) {
+            Thread.currentThread().interrupted();
+        }
+
+        if (!dc.socket().isClosed())
+            throw new RuntimeException("socket is not closed");
+    }
+
+    void ssAcceptAsyncClose() throws IOException {
+        ServerSocketChannel ssc = ServerSocketChannel.open();
+        ssc.socket().bind(null);
+        ssc.socket().setSoTimeout(30*1000);
+
+        doAsyncClose(ssc);
+
+        try {
+            ssc.socket().accept();
+            throw new RuntimeException("accept should not have completed");
+        } catch (ClosedChannelException expected) {}
+
+        if (!ssc.socket().isClosed())
+            throw new RuntimeException("socket is not closed");
+    }
+
+    void ssAcceptAsyncInterrupt() throws IOException {
+        ServerSocketChannel ssc = ServerSocketChannel.open();
+        ssc.socket().bind(null);
+        ssc.socket().setSoTimeout(30*1000);
+
+        doAsyncInterrupt();
+
+        try {
+            ssc.socket().accept();
+            throw new RuntimeException("accept should not have completed");
+        } catch (ClosedByInterruptException expected) {
+            Thread.currentThread().interrupted();
+        }
+
+        if (!ssc.socket().isClosed())
+            throw new RuntimeException("socket is not closed");
+    }
+
+    void doAsyncClose(final AbstractSelectableChannel sc) {
+        AdaptorCloseAndInterrupt.pool.schedule(new Callable<Void>() {
+            public Void call() throws Exception {
+                sc.close();
+                return null;
+            }
+        }, new Random().nextInt(1000), TimeUnit.MILLISECONDS);
+    }
+
+    void doAsyncInterrupt() {
+        final Thread current = Thread.currentThread();
+        AdaptorCloseAndInterrupt.pool.schedule(new Callable<Void>() {
+            public Void call() throws Exception {
+                current.interrupt();
+                return null;
+            }
+        }, new Random().nextInt(1000), TimeUnit.MILLISECONDS);
+    }
+
+}
--- a/jdk/test/java/nio/file/Files/CopyAndMove.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/nio/file/Files/CopyAndMove.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, 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
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4313887 6838333 6917021 7006126
+ * @bug 4313887 6838333 6917021 7006126 6950237
  * @summary Unit test for java.nio.file.Files copy and move methods
  * @library ..
  * @build CopyAndMove PassThroughFileSystem
@@ -41,12 +41,14 @@
 public class CopyAndMove {
     static final Random rand = new Random();
     static boolean heads() { return rand.nextBoolean(); }
+    private static boolean testPosixAttributes = false;
 
     public static void main(String[] args) throws Exception {
         Path dir1 = TestUtil.createTemporaryDirectory();
         try {
 
             // Same directory
+            testPosixAttributes = getFileStore(dir1).supportsFileAttributeView("posix");
             testCopyFileToFile(dir1, dir1, TestUtil.supportsLinks(dir1));
             testMove(dir1, dir1, TestUtil.supportsLinks(dir1));
 
@@ -57,6 +59,8 @@
             try {
                 boolean testSymbolicLinks =
                     TestUtil.supportsLinks(dir1) && TestUtil.supportsLinks(dir2);
+                testPosixAttributes = getFileStore(dir1).supportsFileAttributeView("posix") &&
+                                      getFileStore(dir2).supportsFileAttributeView("posix");
                 testCopyFileToFile(dir1, dir2, testSymbolicLinks);
                 testMove(dir1, dir2, testSymbolicLinks);
             } finally {
@@ -65,6 +69,8 @@
 
             // Target is location associated with custom provider
             Path dir3 = PassThroughFileSystem.create().getPath(dir1.toString());
+            testPosixAttributes = getFileStore(dir1).supportsFileAttributeView("posix") &&
+                                  getFileStore(dir3).supportsFileAttributeView("posix");
             testCopyFileToFile(dir1, dir3, false);
             testMove(dir1, dir3, false);
 
@@ -90,7 +96,12 @@
         if (!attrs1.isSymbolicLink()) {
             long time1 = attrs1.lastModifiedTime().toMillis();
             long time2 = attrs2.lastModifiedTime().toMillis();
-            assertTrue(time1 == time2);
+
+            if (time1 != time2) {
+                System.err.format("File time for %s is %s\n", attrs1.fileKey(), attrs1.lastModifiedTime());
+                System.err.format("File time for %s is %s\n", attrs2.fileKey(), attrs2.lastModifiedTime());
+                assertTrue(false);
+            }
         }
 
         // check size
@@ -207,7 +218,10 @@
         if (source.getFileSystem().provider() == target.getFileSystem().provider()) {
 
             // verify POSIX attributes
-            if (posixAttributes != null && !basicAttributes.isSymbolicLink()) {
+            if (posixAttributes != null &&
+                !basicAttributes.isSymbolicLink() &&
+                testPosixAttributes)
+            {
                 checkPosixAttributes(posixAttributes,
                     readAttributes(target, PosixFileAttributes.class, NOFOLLOW_LINKS));
             }
@@ -636,7 +650,9 @@
 
                 // check POSIX attributes are copied
                 String os = System.getProperty("os.name");
-                if (os.equals("SunOS") || os.equals("Linux")) {
+                if ((os.equals("SunOS") || os.equals("Linux")) &&
+                    testPosixAttributes)
+                {
                     checkPosixAttributes(
                         readAttributes(source, PosixFileAttributes.class, linkOptions),
                         readAttributes(target, PosixFileAttributes.class, linkOptions));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/BreakIterator/Bug7104012.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+/*
+ * @test
+ * @bug 7104012
+ * @summary Confirm that AIOBE is not thrown.
+ */
+
+import java.text.*;
+import java.util.*;
+
+public class Bug7104012 {
+
+    public static void main(String[] args) {
+        boolean err = false;
+
+        List<String> data = new ArrayList<>();
+        data.add("\udb40");
+        data.add(" \udb40");
+        data.add("\udc53");
+        data.add(" \udc53");
+        data.add(" \udb40\udc53");
+        data.add("\udb40\udc53");
+        data.add("ABC \udb40\udc53 123");
+        data.add("\udb40\udc53 ABC \udb40\udc53");
+
+        for (Locale locale : Locale.getAvailableLocales()) {
+            List<BreakIterator> breakIterators = new ArrayList<>();
+            breakIterators.add(BreakIterator.getCharacterInstance(locale));
+            breakIterators.add(BreakIterator.getLineInstance(locale));
+            breakIterators.add(BreakIterator.getSentenceInstance(locale));
+            breakIterators.add(BreakIterator.getWordInstance(locale));
+
+            for (BreakIterator bi : breakIterators) {
+                for (String str : data) {
+                    try {
+                        bi.setText(str);
+                        bi.first();
+                        while (bi.next() != BreakIterator.DONE) { }
+                        bi.last();
+                        while (bi.previous() != BreakIterator.DONE) { }
+                    }
+                    catch (ArrayIndexOutOfBoundsException ex) {
+                        System.out.println("    " + data.indexOf(str)
+                            + ": BreakIterator(" + locale
+                            + ") threw AIOBE.");
+                        err = true;
+                    }
+                }
+            }
+        }
+
+        if (err) {
+            throw new RuntimeException("Unexpected exeption.");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Collator/Bug7200119.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7200119
+ * @summary verify that getAvailableLocales() contains Locale.US
+ */
+import java.text.*;
+import java.util.*;
+
+public class Bug7200119 {
+    public static void main(String[] args) {
+        List<Locale> avail = Arrays.asList(Collator.getAvailableLocales());
+
+        if (!avail.contains(Locale.US)) {
+            throw new RuntimeException("Failed.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DecimalFormat/Bug7196316.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+/*
+ * @test
+ * @bug 7196316
+ * @summary Confirm that a non-default rounding mode is used even after deserialization.
+ */
+
+
+import java.io.*;
+import java.math.*;
+import java.text.*;
+
+public class Bug7196316 {
+
+    private static final String filename = "bug7196316.ser";
+
+    public static void main(String[] args) throws Exception {
+        DecimalFormat df;
+        RoundingMode mode = RoundingMode.DOWN;
+        double given = 6.6;
+        String expected;
+        String actual;
+
+        try (ObjectOutputStream os
+                 = new ObjectOutputStream(new FileOutputStream(filename))) {
+            df = new DecimalFormat("#");
+            df.setRoundingMode(mode);
+            expected = df.format(given);
+            os.writeObject(df);
+        }
+
+        try (ObjectInputStream is
+                 = new ObjectInputStream(new FileInputStream(filename))) {
+            df = (DecimalFormat)is.readObject();
+        }
+
+        RoundingMode newMode = df.getRoundingMode();
+        if (mode != newMode) {
+            throw new RuntimeException("Unexpected roundig mode: " + newMode);
+        } else {
+            actual = df.format(given);
+            if (!expected.equals(actual)) {
+                throw new RuntimeException("Unexpected formatted result: \""
+                              + actual + "\"");
+            } else {
+                System.out.println("Passed: Expected rounding mode (" + newMode
+                    + ") & formatted result: \"" + actual + "\"");
+            }
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DecimalFormat/FormatMicroBenchmark.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,926 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7050528
+ * @summary Set of micro-benchmarks testing throughput of java.text.DecimalFormat.format()
+ * @author Olivier Lagneau
+ * @run main FormatMicroBenchmark
+ */
+
+/* This is a set of micro-benchmarks testing throughput of java.text.DecimalFormat.format().
+ * It never fails.
+ *
+ * Usage and arguments:
+ *  - Run with no argument skips the whole benchmark and exits.
+ *  - Run with "-help" as first argument calls the usage() method and exits.
+ *  - Run with "-doit" runs the benchmark with summary details.
+ *  - Run with "-verbose" provides additional details on the run.
+ *
+ * Example run :
+ *   java -Xms500m -Xmx500m -XX:NewSize=400m FormatMicroBenchmark -doit -verbose
+ *
+ * Running with jtreg:
+ *  The jtreg header "run" tag options+args must be changed to avoid skipping
+ *  the execution. here is an example of run options:
+ *  "main/othervm -Xms500m -Xmx500m -XX:NewSize=400m FormatMicroBenchmark -doit"
+ *
+ * Note:
+ *  - Vm options -Xms, -Xmx, -XX:NewSize must be set correctly for
+ *    getting reliable numbers. Otherwise GC activity may corrupt results.
+ *    As of jdk80b48 using "-Xms500m -Xmx500m -XX:NewSize=400m" covers
+ *    all cases.
+ *  - Optionally using "-XX:+printGC" option provides information that
+ *    helps checking any GC activity while benches are run.
+ *
+ * Vm Options:
+ *  - Vm options to use (as of jdk80b48):
+ *     fast-path case :     -Xms128m -Xmx128m -XX:NewSize=100m
+ *     non fast-path case:  -Xms500m -Xmx500m -XX:NewSize=400m
+ *    or use worst case (non fast-path above) with both types of algorithm.
+ *
+ *  - use -XX:+PrintGC to verify memory consumption of the benchmarks.
+ *    (See "Checking Memory Consumption" below).
+ *
+ * Description:
+ *
+ *  Fast-path algorithm for format(double...)  call stack is very different  of
+ *  the standard call stack. Where the  standard algorithm for formating double
+ *  uses internal class sun.misc.FloatingDecimal and its dtoa(double) method to
+ *  provide digits,  fast-path embeds its own  algorithm for  binary to decimal
+ *  string conversion.
+ *
+ *  FloatingDecimal always converts completely  the passed double to  a string.
+ *  Fast-path converts  only to the needed digits  since it follows constraints
+ *  on both the pattern rule,  the  DecimalFormat instance properties, and  the
+ *  passed double.
+ *
+ *  Micro benchmarks below measure  the throughput for formating double  values
+ *  using NumberFormat.format(double)  call stack.  The  standard DecimalFormat
+ *  call stack as well as the  fast-path algorithm implementation are sensitive
+ *  to the nature of the passed double values regarding throughput performance.
+ *
+ *  These benchmarks are useful both  for measuring the global performance gain
+ *  of fast-path and to check that any modification done on fast-path algorithm
+ *  does not bring any regression in the performance boost of fast-path.
+ *
+ *  Note  that these benchmarks  will provide numbers  without any knowledge of
+ *  the  implementation of DecimalFormat class. So  to check regression any run
+ *  should be compared to another reference run with  a previous JDK, wether or
+ *  not this previous reference JDK contains fast-path implementation.
+ *
+ *  The eight benchmarks below are dedicated to measure throughput on different
+ *  kinds of double that all fall in the fast-path case (all in Integer range):
+ *
+ *  - Integer case : used double values are all "integer-like" (ex: -12345.0).
+ *    This is the benchFormatInteger micro-benchmark.
+ *
+ *  - Fractional case : double values are "fractional" (ex: -0.12345).
+ *    This is the benchFormatFractional micro-benchmark.
+ *
+ *  - Small integral case : like Integer case but double values are all limited
+ *    in their magnitude, from -500.0 to 500.0 if the number of iterations N is
+ *    set to 500000.
+ *    This is the benchFormatSmallIntegral micro-benchmark.
+ *
+ *  - Fractional All Nines : doubles values have fractional part that is very
+ *    close to "999" (decimal pattern), or "99" (currency pattern),
+ *    or "0000...".
+ *    This is the benchFormatFractionalAllNines micro-benchmark.
+ *
+ *  - All Nines : double values are such that both integral and fractional
+ *    part consist only of '9' digits. None of these values are rounded up.
+ *    This is the benchFormatAllNines micro-benchmark.
+ *
+ *  - Fair simple case : calling J the loop variable and iterating over
+ *    the N number of iterations, used double values are computed as
+ *    d = (double) J + J*seed
+ *    where seed is a very small value that adds a fractional part and adds a
+ *    small number to integral part. Provides fairly distributed double values.
+ *    This is the benchFormatFairSimple micro-benchmark.
+ *
+ *  - Fair case : this is a combination of small integral case and fair simple
+ *    case. Double values are limited in their magnitude but follow a parabolic
+ *    curve y = x**2 / K, keeping large magnitude only for large values of J.
+ *    The intent is trying to reproduce a distribution of double values as could
+ *    be found in a business application, with most values in either the low
+ *    range or the high range.
+ *    This is the benchFormatFair micro-benchmark.
+ *
+ *  - Tie cases: values are very close to a tie case (iii...ii.fff5)
+ *    That is the worst situation that can happen for Fast-path algorithm when
+ *    considering throughput.
+ *    This is the benchFormatTie micro-benchmark.
+ *
+ *  For  all  of  the micro-benchmarks,  the  throughput load   of the eventual
+ *  additional computations inside the loop is calculated  prior to running the
+ *  benchmark, and provided in the output.  That may be  useful since this load
+ *  may vary for each architecture or machine configuration.
+ *
+ *  The "-verbose" flag,  when set, provides the  throughput  load numbers, the
+ *  time spent for  each run of  a benchmark, as  well as an estimation  of the
+ *  memory consumed  by the  runs.  Beware of  incremental  GCs, see  "Checking
+ *  Memory  Consumption" section below. Every run   should be done with correct
+ *  ms, mx, and NewSize vm options to get fully reliable numbers.
+ *
+ *  The output provides the  mean time needed for  a benchmark after the server
+ *  jit compiler has done its optimization work if  any. Thus only the last but
+ *  first three runs are taken into account in the time measurement (server jit
+ *  compiler shows  to have  done full  optimization  in  most cases  after the
+ *  second run, given a base number of iterations set to 500000).
+ *
+ *  The program cleans up memory (stabilizeMemory() method) between each run of
+ *  the benchmarks to make sure that  no garbage collection activity happens in
+ *  measurements. However that does not  preclude incremental GCs activity that
+ *  may  happen during the micro-benchmark if  -Xms, -Xmx, and NewSize options
+ *  have not been tuned and set correctly.
+ *
+ * Checking Memory Consumption:
+ *
+ *  For getting confidence  in the throughput numbers, there  must not give any
+ *  GC activity during the benchmark runs. That  means that specific VM options
+ *  related to memory must be tuned for any given implementation of the JDK.
+ *
+ *  Running with "-verbose" arguments will provide  clues of the memory consumed
+ *  but  is   not enough,  since  any   unexpected  incremental  GC  may  lower
+ *  artificially the estimation of the memory consumption.
+ *
+ *  Options to  set are -Xms, -Xmx,  -XX:NewSize, plus -XX:+PrintGC to evaluate
+ *  correctly  the  values of  these options. When  running "-verbose", varying
+ *  numbers reported for memory consumption may  indicate bad choices for these
+ *  options.
+ *
+ *  For jdk80b25, fast-path shows a consuption of ~60Mbs for 500000 iterations
+ *  while a jdk without fast-path will consume ~260Mbs for each benchmark run.
+ *  Indeed these values will vary depending on the jdk used.
+ *
+ *  Correct option settings found jdk80b48 were :
+ *     fast-path :     -Xms128m -Xmx128m -XX:NewSize=100m
+ *     non fast-path : -Xms500m -Xmx500m -XX:NewSize=400m
+ *  Greater values can be provided safely but not smaller ones.
+ * ----------------------------------------------------------------------
+ */
+
+import java.util.*;
+import java.text.NumberFormat;
+import java.text.DecimalFormat;
+
+public class FormatMicroBenchmark {
+
+    // The number of times the bench method will be run (must be at least 4).
+    private static final int NB_RUNS = 20;
+
+    // The bench* methods below all iterates over [-MAX_RANGE , +MAX_RANGE] integer values.
+    private static final int MAX_RANGE = 500000;
+
+    // Flag for more details on each bench run (default is no).
+    private static boolean Verbose = false;
+
+    // Should we really execute the benches ? (no by default).
+    private static boolean DoIt = false;
+
+    // Prints out a message describing how to run the program.
+    private static void usage() {
+        System.out.println(
+            "This is a set of micro-benchmarks testing throughput of " +
+            "java.text.DecimalFormat.format(). It never fails.\n\n" +
+            "Usage and arguments:\n" +
+            " - Run with no argument skips the whole benchmark and exits.\n" +
+            " - Run with \"-help\" as first argument prints this message and exits.\n" +
+            " - Run with \"-doit\" runs the benchmark with summary details.\n" +
+            " - Run with \"-verbose\" provides additional details on the run.\n\n" +
+            "Example run :\n" +
+            "   java -Xms500m -Xmx500m -XX:NewSize=400m FormatMicroBenchmark -doit -verbose\n\n" +
+            "Note: \n" +
+            " - Vm options -Xms, -Xmx, -XX:NewSize must be set correctly for \n" +
+            "   getting reliable numbers. Otherwise GC activity may corrupt results.\n" +
+            "   As of jdk80b48 using \"-Xms500m -Xmx500m -XX:NewSize=400m\" covers \n" +
+            "   all cases.\n" +
+            " - Optionally using \"-XX:+printGC\" option provides information that \n" +
+            "   helps checking any GC activity while benches are run.\n\n" +
+            "Look at the heading comments and description in source code for " +
+            "detailed information.\n");
+    }
+
+    /* We will call stabilizeMemory before each call of benchFormat***().
+     * This in turn tries to clean up as much memory as possible.
+     * As a safe bound we limit number of System.gc() calls to 10,
+     * but most of the time two calls to System.gc() will be enough.
+     * If memory reporting is asked for, the method returns the difference
+     * of free memory between entering an leaving the method.
+     */
+    private static long stabilizeMemory(boolean reportConsumedMemory) {
+        final long oneMegabyte = 1024L * 1024L;
+
+        long refMemory = 0;
+        long initialMemoryLeft = Runtime.getRuntime().freeMemory();
+        long currMemoryLeft = initialMemoryLeft;
+        int nbGCCalls = 0;
+
+        do {
+            nbGCCalls++;
+
+            refMemory = currMemoryLeft;
+            System.gc();
+            currMemoryLeft = Runtime.getRuntime().freeMemory();
+
+        } while ((Math.abs(currMemoryLeft - refMemory) > oneMegabyte) &&
+                 (nbGCCalls < 10));
+
+        if (Verbose &&
+            reportConsumedMemory)
+            System.out.println("Memory consumed by previous run : " +
+                               (currMemoryLeft - initialMemoryLeft)/oneMegabyte + "Mbs.");
+
+        return currMemoryLeft;
+    }
+
+
+    // ---------- Integer only based bench --------------------
+    private static final String INTEGER_BENCH = "benchFormatInteger";
+    private static String benchFormatInteger(NumberFormat nf) {
+        String str = "";
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++)
+            str = nf.format((double) j);
+        return str;
+    }
+
+    // This reproduces the throughput load added in benchFormatInteger
+    static double integerThroughputLoad() {
+        double d = 0.0d;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = (double) j;
+        }
+        return d;
+    }
+
+    // Runs integerThroughputLoad and calculate its mean load
+    static void calculateIntegerThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = integerThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+
+        if (Verbose)
+            System.out.println(
+               "calculated throughput load for " + INTEGER_BENCH +
+               " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+    // ---------- Fractional only based bench --------------------
+    private static final String FRACTIONAL_BENCH = "benchFormatFractional";
+    private static String benchFormatFractional(NumberFormat nf) {
+        String str = "";
+        double floatingN = 1.0d / (double) MAX_RANGE;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++)
+            str = nf.format(floatingN * (double) j);
+        return str;
+    }
+
+    // This reproduces the throughput load added in benchFormatFractional
+    static double fractionalThroughputLoad() {
+        double d = 0.0d;
+        double floatingN = 1.0d / (double) MAX_RANGE;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = floatingN * (double) j;
+        }
+        return d;
+    }
+
+    // Runs fractionalThroughputLoad and calculate its mean load
+    static void calculateFractionalThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = fractionalThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+        System.out.println(
+            "calculated throughput load for " + FRACTIONAL_BENCH +
+            " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+    // ---------- An Small Integral bench --------------------
+    //  that limits the magnitude of tested double values
+    private static final String SMALL_INTEGRAL_BENCH = "benchFormatSmallIntegral";
+    private static String benchFormatSmallIntegral(NumberFormat nf) {
+        String str = "";
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++)
+            str = nf.format(((double) j) / 1000.0d);
+        return str;
+    }
+
+    // This reproduces the throughput load added in benchFormatSmallIntegral
+    static double smallIntegralThroughputLoad() {
+        double d = 0.0d;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = (double) j / 1000.0d;
+        }
+        return d;
+    }
+
+    // Runs small_integralThroughputLoad and calculate its mean load
+    static void calculateSmallIntegralThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = smallIntegralThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+        System.out.println(
+            "calculated throughput load for " + SMALL_INTEGRAL_BENCH +
+            " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+    // ---------- A fair and simple bench --------------------
+    private static final String FAIR_SIMPLE_BENCH = "benchFormatFairSimple";
+    private static String benchFormatFairSimple(NumberFormat nf, boolean isCurrency) {
+        String str = "";
+        double seed = isCurrency ?  0.0010203040506070809 : 0.00010203040506070809;
+        double d = (double) -MAX_RANGE;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = d  + 1.0d + seed;
+            str = nf.format(d);
+        }
+        return str;
+    }
+
+    // This reproduces the throughput load added in benchFormatFairSimple
+    static double fairSimpleThroughputLoad() {
+        double seed =  0.00010203040506070809;
+        double delta = 0.0d;
+        double d = (double) -MAX_RANGE;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = d + 1.0d + seed;
+        }
+        return d;
+    }
+
+    // Runs fairThroughputLoad and calculate its mean load
+    static void calculateFairSimpleThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = fairSimpleThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+        System.out.println(
+            "calculated throughput load for " + FAIR_SIMPLE_BENCH +
+            " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+    // ---------- Fractional part is only made of nines bench --------------
+    private static final String FRACTIONAL_ALL_NINES_BENCH = "benchFormatFractionalAllNines";
+    private static String benchFormatFractionalAllNines(NumberFormat nf, boolean isCurrency) {
+        String str = "";
+        double fractionalEven = isCurrency ?  0.993000001 : 0.99930000001;
+        double fractionalOdd  = isCurrency ?  0.996000001 : 0.99960000001;
+        double fractional;
+        double d;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            if ((j & 1) == 0)
+                fractional = fractionalEven;
+            else
+                fractional = fractionalOdd;
+            if ( j >= 0)
+                d = (double ) j + fractional;
+            else d = (double) j - fractional;
+            str = nf.format(d);
+        }
+        return str;
+    }
+
+    // This reproduces the throughput load added in benchFormatFractionalAllNines
+    static double fractionalAllNinesThroughputLoad() {
+        double fractionalEven = 0.99930000001;
+        double fractionalOdd  = 0.99960000001;
+        double fractional;
+        double d = 0.0d;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            if ((j & 1) == 0)
+                fractional = fractionalEven;
+            else fractional = fractionalOdd;
+            if ( j >= 0)
+                d = (double ) j + fractional;
+            else d = (double) j - fractional;
+        }
+        return d;
+    }
+
+    // Runs fractionalAllNinesThroughputLoad and calculate its mean load
+    static void calculateFractionalAllNinesThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = fractionalAllNinesThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+            System.out.println(
+               "calculated throughput load for " + FRACTIONAL_ALL_NINES_BENCH +
+               " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+    // ---------- Number is only made of nines bench --------------
+    private static final String ALL_NINES_BENCH = "benchFormatAllNines";
+    private static String benchFormatAllNines(NumberFormat nf, boolean isCurrency) {
+        String str = "";
+        double[] decimaAllNines =
+            {9.9993, 99.9993, 999.9993, 9999.9993, 99999.9993,
+             999999.9993, 9999999.9993, 99999999.9993, 999999999.9993};
+        double[] currencyAllNines =
+            {9.993, 99.993, 999.993, 9999.993, 99999.993,
+             999999.993, 9999999.993, 99999999.993, 999999999.993};
+        double[] valuesArray = (isCurrency) ? currencyAllNines : decimaAllNines;
+        double seed = 1.0 / (double) MAX_RANGE;
+        double d;
+        int id;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            id = (j >=  0) ? j % 9 : -j % 9;
+            if ((j & 1) == 0)
+                d = valuesArray[id] + id * seed;
+            else
+                d = valuesArray[id] - id * seed;
+            str = nf.format(d);
+        }
+        return str;
+    }
+
+    // This reproduces the throughput load added in benchFormatAllNines
+    static double allNinesThroughputLoad() {
+        double[] decimaAllNines =
+            {9.9993, 99.9993, 999.9993, 9999.9993, 99999.9993,
+             999999.9993, 9999999.9993, 99999999.9993, 999999999.9993};
+        double[] valuesArray = decimaAllNines;
+        double seed = 1.0 / (double) MAX_RANGE;
+        double d = 0.0d;
+        int id;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            id = (j >=  0) ? j % 9 : -j % 9;
+            if ((j & 1) == 0)
+                d = valuesArray[id] + id * seed;
+            else
+                d = valuesArray[id] - id * seed;
+        }
+        return d;
+    }
+
+    // Runs allNinesThroughputLoad and calculate its mean load
+    static void calculateAllNinesThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = allNinesThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+            System.out.println(
+               "calculated throughput load for " + ALL_NINES_BENCH +
+               " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+
+
+    // --- A fair bench trying (hopefully) to reproduce business applicatons  ---
+
+    /*  benchFormatFair uses the following formula :
+     *   y = F(x) = sign(x) * x**2 * ((1000/MAX_RANGE)**2).
+     *
+     *  which converts in the loop as (if j is the loop index) :
+     *   x = double(j)
+     *   k = 1000.0d * double(MAX_RANGE)
+     *   y = sign(j) * x**2 * k**2
+     *
+     *  This is a flattened parabolic curve where only the j values
+     *  in [-1000, 1000] will provide y results in [-1, +1] interval,
+     *  and for abs(j) >= 1000 the result y will be greater than 1.
+     *
+     *  The difference with benchFormatSmallIntegral is that since y results
+     *  follow a parabolic curve the magnitude of y grows much more rapidly
+     *  and closer to j values when abs(j) >= 1000:
+     *   - for |j| < 1000,  SmallIntegral(j) < 1.0 and fair(j) < 1.0
+     *   - for j in [1000, 10000[
+     *      SmallIntegral(j) is in [1, 10[
+     *      Fair(j) is in [4, 400[
+     *   - for j in [10000,100000[
+     *      SmallIntegral(j) is in [10, 100[
+     *      Fair(j) is in [400,40000[
+     *   - for j in [100000,1000000[
+     *      SmallIntegral(j) is in [100, 1000[
+     *      Fair(j) is in [40000, 4000000[
+     *
+     *  Since double values for j less than 100000 provide only 4 digits in the
+     *  integral, values greater than 250000 provide at least 6 digits, and 500000
+     *  computes to 1000000, the distribution is roughly half with less than 5
+     *  digits and half with at least 6 digits in the integral part.
+     *
+     *  Compared to FairSimple bench, this represents an application where 20% of
+     *  the double values to format are less than 40000.0 absolute value.
+     *
+     *  Fair(j) is close to the magnitude of j when j > 100000 and is hopefully
+     *  more representative of what may be found in general in business apps.
+     *  (assumption : there will be mainly either small or large values, and
+     *   less values in middle range).
+     *
+     *  We could get even more precise distribution of values using formula :
+     *   y = sign(x) * abs(x)**n * ((1000 / MAX_RANGE)**n) where n > 2,
+     *  or even well-known statistics function to fine target such distribution,
+     *  but we have considred that the throughput load for calculating y would
+     *  then be too high. We thus restrain the use of a power of 2 formula.
+     */
+
+    private static final String FAIR_BENCH = "benchFormatFair";
+    private static String benchFormatFair(NumberFormat nf) {
+        String str = "";
+        double k = 1000.0d / (double) MAX_RANGE;
+        k *= k;
+
+        double d;
+        double absj;
+        double jPowerOf2;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            absj = (double) j;
+            jPowerOf2 = absj * absj;
+            d = k * jPowerOf2;
+            if (j < 0) d = -d;
+            str = nf.format(d);
+        }
+        return str;
+    }
+
+    // This is the exact throughput load added in benchFormatFair
+    static double fairThroughputLoad() {
+        double k = 1000.0d / (double) MAX_RANGE;
+        k *= k;
+
+        double d = 0.0d;
+        double absj;
+        double jPowerOf2;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            absj = (double) j;
+            jPowerOf2 = absj * absj;
+            d = k * jPowerOf2;
+            if (j < 0) d = -d;
+        }
+        return d;
+    }
+
+    // Runs fairThroughputLoad and calculate its mean load
+    static void calculateFairThroughputLoad() {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = fairThroughputLoad();
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+            System.out.println(
+               "calculated throughput load for " + FAIR_BENCH +
+               " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+    // ---------- All double values are very close to a tie --------------------
+    // i.e. like 123.1235 (for decimal case) or 123.125 (for currency case).
+
+    private static final String TIE_BENCH = "benchFormatTie";
+    private static String benchFormatTie(NumberFormat nf, boolean isCurrency) {
+        double d;
+        String str = "";
+        double fractionaScaling = (isCurrency) ? 1000.0d : 10000.0d;
+        int fixedFractionalPart = (isCurrency) ? 125 : 1235;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = (((double) j * fractionaScaling) +
+                 (double) fixedFractionalPart) / fractionaScaling;
+            str = nf.format(d);
+        }
+        return str;
+    }
+
+    // This is the exact throughput load added in benchFormatTie
+    static double tieThroughputLoad(boolean isCurrency) {
+        double d = 0.0d;
+        double fractionaScaling = (isCurrency) ? 1000.0d : 10000.0d;
+        int fixedFractionalPart = (isCurrency) ? 125 : 1235;
+        for (int j = - MAX_RANGE; j <= MAX_RANGE; j++) {
+            d = (((double) j * fractionaScaling) +
+                 (double) fixedFractionalPart) / fractionaScaling;
+        }
+        return d;
+    }
+
+    // Runs tieThroughputLoad and calculate its mean load
+    static void calculateTieThroughputLoad(boolean isCurrency) {
+        int nbRuns = NB_RUNS;
+        long elapsedTime = 0;
+        double foo;
+
+        for (int i = 1; i <= nbRuns; i++) {
+
+            long startTime = System.nanoTime();
+            foo = tieThroughputLoad(isCurrency);
+            long estimatedTime = System.nanoTime() - startTime;
+            if (i > 3) elapsedTime += estimatedTime / 1000;
+        }
+
+        if (Verbose)
+            System.out.println(
+               "calculated throughput load for " + TIE_BENCH +
+               " bench is = " + (elapsedTime / (nbRuns - 3)) + " microseconds");
+    }
+
+
+    // Print statistics for passed times results of benchName.
+    static void printPerfResults(long[] times, String benchName) {
+        int nbBenches = times.length;
+
+        long totalTimeSpent = 0;
+        long meanTimeSpent;
+
+        double variance = 0;
+        double standardDeviation = 0;
+
+        // Calculates mean spent time
+        for (int i = 1; i <= nbBenches; i++)
+            totalTimeSpent += times[i-1];
+        meanTimeSpent = totalTimeSpent / nbBenches;
+
+        // Calculates standard deviation
+        for (int j = 1; j <= nbBenches; j++)
+            variance += Math.pow(((double)times[j-1] - (double)meanTimeSpent), 2);
+        variance = variance / (double) times.length;
+        standardDeviation = Math.sqrt(variance) / meanTimeSpent;
+
+        // Print result and statistics for benchName
+        System.out.println(
+           "Statistics (starting at 4th bench) for bench " + benchName +
+           "\n for last " + nbBenches +
+           " runs out of " + NB_RUNS +
+           " , each with 2x" + MAX_RANGE + " format(double) calls : " +
+           "\n  mean exec time = " + meanTimeSpent + " microseconds" +
+           "\n  standard deviation = " + String.format("%.3f", standardDeviation) + "% \n");
+    }
+
+    public static void main(String[] args) {
+
+        if (args.length >= 1) {
+            // Parse args, just checks expected ones. Ignore others or dups.
+            if (args[0].equals("-help")) {
+                usage();
+                return;
+            }
+
+            for (String s : args) {
+                if (s.equals("-doit"))
+                    DoIt = true;
+                else if (s.equals("-verbose"))
+                    Verbose = true;
+            }
+        } else {
+            // No arguments, skips the benchmarks and exits.
+            System.out.println(
+                "Test skipped with success by default. See -help for details.");
+            return;
+        }
+
+        if (!DoIt) {
+            if (Verbose)
+                usage();
+            System.out.println(
+                "Test skipped and considered successful.");
+            return;
+        }
+
+        System.out.println("Single Threaded micro benchmark evaluating " +
+                           "the throughput of java.text.DecimalFormat.format() call stack.\n");
+
+        String fooString = "";
+
+        // Run benches for decimal instance
+        DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.US);
+        System.out.println("Running with a decimal instance of DecimalFormat.");
+
+        calculateIntegerThroughputLoad();
+        fooString =
+            BenchType.INTEGER_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateFractionalThroughputLoad();
+        fooString =
+            BenchType.FRACTIONAL_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateSmallIntegralThroughputLoad();
+        fooString =
+            BenchType.SMALL_INTEGRAL_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateFractionalAllNinesThroughputLoad();
+        fooString =
+            BenchType.FRACTIONAL_ALL_NINES_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateAllNinesThroughputLoad();
+        fooString =
+            BenchType.ALL_NINES_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateFairSimpleThroughputLoad();
+        fooString =
+            BenchType.FAIR_SIMPLE_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateFairThroughputLoad();
+        fooString =
+            BenchType.FAIR_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        calculateTieThroughputLoad(false);
+        fooString =
+            BenchType.TIE_BENCH.runBenchAndPrintStatistics(NB_RUNS, df, false);
+
+        // Run benches for currency instance
+        DecimalFormat cf = (DecimalFormat) NumberFormat.getCurrencyInstance(Locale.US);
+        System.out.println("Running with a currency instance of DecimalFormat.");
+
+        calculateIntegerThroughputLoad();
+        fooString =
+            BenchType.INTEGER_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateFractionalThroughputLoad();
+        fooString =
+            BenchType.FRACTIONAL_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateSmallIntegralThroughputLoad();
+        fooString =
+            BenchType.SMALL_INTEGRAL_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateFractionalAllNinesThroughputLoad();
+        fooString =
+            BenchType.FRACTIONAL_ALL_NINES_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateAllNinesThroughputLoad();
+        fooString =
+            BenchType.ALL_NINES_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateFairSimpleThroughputLoad();
+        fooString =
+            BenchType.FAIR_SIMPLE_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateFairThroughputLoad();
+        fooString =
+            BenchType.FAIR_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+        calculateTieThroughputLoad(false);
+        fooString =
+            BenchType.TIE_BENCH.runBenchAndPrintStatistics(NB_RUNS, cf, false);
+
+    }
+
+    // This class to factorise what would be duplicated otherwise.
+    static enum BenchType {
+
+        INTEGER_BENCH("benchFormatInteger"),
+        FRACTIONAL_BENCH("benchFormatFractional"),
+        SMALL_INTEGRAL_BENCH("benchFormatSmallIntegral"),
+        FAIR_SIMPLE_BENCH("benchFormatFairSimple"),
+        FRACTIONAL_ALL_NINES_BENCH("benchFormatFractionalAllNines"),
+        ALL_NINES_BENCH("benchFormatAllNines"),
+        FAIR_BENCH("benchFormatFair"),
+        TIE_BENCH("benchFormatTie");
+
+        private final String name;
+
+        BenchType(String name) {
+            this.name = name;
+        }
+
+        String runBenchAndPrintStatistics(int nbRuns,
+                         NumberFormat nf,
+                         boolean isCurrency) {
+
+            // We eliminate the first 3 runs in the time measurements
+            // to let C2 do complete compilation and optimization work.
+            long[] elapsedTimes = new long[nbRuns - 3];
+
+            System.out.println("Now running " + nbRuns + " times bench " + name);
+
+            String str = "";
+            for (int i = 1; i <= nbRuns; i++) {
+
+                stabilizeMemory(false);
+                long startTime = System.nanoTime();
+
+                switch(this) {
+                case INTEGER_BENCH :
+                    str = benchFormatInteger(nf);
+                    break;
+                case FRACTIONAL_BENCH :
+                    str = benchFormatFractional(nf);
+                    break;
+                case SMALL_INTEGRAL_BENCH :
+                    str = benchFormatSmallIntegral(nf);
+                    break;
+                case FRACTIONAL_ALL_NINES_BENCH :
+                    str = benchFormatFractionalAllNines(nf, isCurrency);
+                    break;
+                case ALL_NINES_BENCH :
+                    str = benchFormatAllNines(nf, isCurrency);
+                    break;
+                case FAIR_SIMPLE_BENCH :
+                    str = benchFormatFairSimple(nf, isCurrency);
+                    break;
+                case FAIR_BENCH :
+                    str = benchFormatFair(nf);
+                    break;
+                case TIE_BENCH :
+                    str = benchFormatTie(nf, isCurrency);
+                    break;
+
+                default:
+                }
+
+
+                long estimatedTime = System.nanoTime() - startTime;
+                if (i > 3)
+                    elapsedTimes[i-4] = estimatedTime / 1000;
+
+                if (Verbose)
+                    System.out.println(
+                                       "calculated time for " + name +
+                                       " bench " + i + " is = " +
+                                       (estimatedTime / 1000) + " microseconds");
+                else System.out.print(".");
+
+                stabilizeMemory(true);
+            }
+
+            System.out.println(name + " Done.");
+
+            printPerfResults(elapsedTimes, name);
+
+            return str;
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DecimalFormat/GoldenDoubleValues.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,965 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/* Set of constants and values used in RoundingAndPropertyTest.java.
+ *
+ * There are 5 different information in this class:
+ * - TestLocale is the locale used by RoundingAndPropertyTest regression test
+ *   when calling DecimalFormat.format() on either the set of DecimalGoldenValues
+ *   or CurrencyGoldenValues.
+ *   See main method of RoundingAndPropertyTest.
+ *
+ * - FullLocalizationTestLocale is the locale used by RoundingAndPropertyTest
+ *   regression test when calling DecimalFormat.format() on the set of values
+ *   (DecimalLocalizationValues) used to test that localization of digits
+ *   happens correctly when needed.
+ *   See main method of RoundingAndPropertyTest.
+ *
+ * - DecimalLocalizationValues is an array containing all the double values used
+ *   to check that localization of digits happens correctly when needed.
+ *   See RoundingAndPropertyTest.testLocalizationValues() method.
+ *
+ * - DecimalGoldenValues and CurrencyGoldenValues are arrays containing all the
+ *   double values that will be used as input when checking correctness of
+ *   results returned by DecimalFormat.format().
+ *   2 arrays are needed since decimal and currency formatting patterns require
+ *   a different number of digits after decimal point.
+ *   See RoundingAndPropertyTest.testGoldenValues() method.
+ *
+ * - PROPERTY_CHECK_POSITIVE_VALUE and PROPERTY_CHECK_NEGATIVE_VALUE are the
+ *   double values used for testing the validity of the property changes call
+ *   in the fast-path case. The locale used in that case is TestLocale.
+ *   See RoundingAndPropertyTest.testSettersAndFastPath() method.
+ */
+
+import java.util.*;
+
+class GoldenDoubleValues {
+
+    // TestLocale is the testing locale used by RoundingAndPropertyTest test,
+    // when testing the golden double values
+    static final Locale TestLocale = new Locale("en", "US");
+
+
+    // FullTestLocale is the testing locale used by RoundingAndPropertyTest test,
+    // when testing full localization of double values.
+    static final Locale FullLocalizationTestLocale = new Locale("hi", "IN");
+
+
+    /* Below are the two double values used for exercising the changes of
+     * of DecimalFormat properties and symbols. These values are also used
+     * as golden values (see golden arrays below).
+     */
+
+    /* PROPERTY_CHECK_NEGATIVE_VALUE is the negative double value used for
+     * testing the validity of the property changes for fast-path.
+     * See testSettersAndFastPath() in RoundingAndPropertyTest test.
+     */
+    static final double PROPERTY_CHECK_NEGATIVE_VALUE = -2147483646.2334997d;
+
+    /* PROPERTY_CHECK_POSITIVE_VALUE is the positive double value used for
+     * testing the validity of the property changes for fast-path.
+     * See testSettersAndFastPath() in RoundingAndPropertyTest test.
+     */
+    static final double PROPERTY_CHECK_POSITIVE_VALUE =  2147483646.2335003d;
+
+    /* --- Array of double values to test localization ------------------------
+     *
+     * For most locales, effective localization does not happen on digits, i.e.
+     * the digits are not changed due to localization. In order to check that
+     * fast-path localize correctly digits in such a case, the array of double
+     * values below deals with all the case of localization that may happen on
+     * digits
+     */
+    static final double[] DecimalLocalizationValues = {
+        1.123,
+        12.123,
+        123.123,
+        1234.123,
+        12345.123,
+        123456.123,
+        1234567.123,
+        12345678.123,
+        123456789.123,
+        1234567890.123,
+        1234.0,
+        1234.9,
+        1234.99,
+        1234.999
+    };
+
+
+    /* --- Arrays of golden double values ----------------------------------
+     *
+     * The   GoldenValues arrays  are used   as input values   for checking the
+     * correctness  of  the    DecimalFormat.format()  call  results  done   in
+     * RoundingAndPropertyTest regression test. The results are compared to the
+     * expected ones  found in  GoldenFormattedValues.  For each value   in the
+     * arrays  there  is   a corresponding    expected  string  result   found,
+     * represented as an array  of unicode values, at  the same index  in the
+     * related GoldenFormattedValues array.  The string returned by  the format
+     * call and the found in GoldenFormattedValues array  must be equal for the
+     * result to be considered valid.
+     * See RoundingAndPropertyTest.testGoldenValues() method.
+     *
+     * We  need 2  such  GoldenValues  arrays  since the decimal  and  currency
+     * formatting rules require different number of digits after decimal point.
+     *
+     * Thus we have two different arrays of golden values:
+     *  - DecimalGoldenValues for the decimal case.
+     *  - CurrencyGoldenValues for the currency case.
+     *
+     * They are associated to related GoldenFormattedValues arrays, generated by
+     * running RoundingAndPropertyTest with a "gengold" argument:
+     *  - DecimalGoldenFormattedValues for the decimal case.
+     *  - CurrencyGoldenFormattedValues for the currency case.
+     * These two generated arrays are found in GoldenFormattedValues.java file.
+     *
+     * The  impact of the formatting rules  is as follows,  because the pattern
+     * rule for  the  fractional  part is different   for  decimal and currency
+     * patterns:
+     *  - in decimal case one must output the first non-zero 3 digits of
+     *    fractional part 1.1232 => "1.123" and 1.12016789 => "1.12"
+     *  - in currency case the first 2 fractional digits are always output
+     *    1.1232 => "1.12" and 1.0016789 => "1.00"
+     *
+     * Thus we  need a different  number of  fractional digits when  we specify
+     * below the golden double values to check, and most of the decimal and
+     * currency golden values differ only in the number of fractional digits.
+     *
+     * The list below exercises almost all code pathes of the fast-path
+     * algorithm except localization of digits.
+     */
+
+    // --- The set of golden values for the Decimal formatting case --------
+    static final double[] DecimalGoldenValues = {
+        // Testing of specific values
+        +0.0,
+        -0.0,
+        Double.MIN_VALUE,
+        Double.MIN_NORMAL,
+        PROPERTY_CHECK_NEGATIVE_VALUE,
+        PROPERTY_CHECK_POSITIVE_VALUE,
+        -2147483647.9996,
+        2147483647.9996,
+        -1999999999.9994997,
+        1999999999.9995003,
+        // Testing fast-path range checks (all outside bounds)
+        Double.NaN,
+        Double.POSITIVE_INFINITY,
+        Double.NEGATIVE_INFINITY,
+        Double.MAX_VALUE,
+        -9876543210.9876543,
+        9876543210.9876543,
+        -1234567890.1234567E128,
+        1234567890.1234567E128,
+        // Testing of integral string size
+        1.123,
+        12.123,
+        123.123,
+        1234.123,
+        12345.123,
+        123456.123,
+        1234567.123,
+        12345678.123,
+        123456789.123,
+        1234567890.123,
+        -1.123,
+        -12.123,
+        -123.123,
+        -1234.123,
+        -12345.123,
+        -123456.123,
+        -1234567.123,
+        -12345678.123,
+        -123456789.123,
+        -1234567890.123,
+        // Testing of fractional string size
+        0.1,
+        0.12,
+        0.123,
+        0.1234,
+        10.1,
+        10.12,
+        10.123,
+        10.1234,
+        100.1,
+        100.12,
+        100.123,
+        100.1234,
+        1000.1,
+        1000.12,
+        1000.123,
+        1000.1234,
+        10000.1,
+        10000.12,
+        10000.123,
+        10000.1234,
+        100000.1,
+        100000.12,
+        100000.123,
+        100000.1234,
+        1000000.1,
+        1000000.12,
+        1000000.123,
+        1000000.1234,
+        10000000.1,
+        10000000.12,
+        10000000.123,
+        10000000.1234,
+        100000000.1,
+        100000000.12,
+        100000000.123,
+        100000000.1234,
+        1000000000.1,
+        1000000000.12,
+        1000000000.123,
+        1000000000.1234,
+        -0.1,
+        -0.12,
+        -0.123,
+        -0.1234,
+        -10.1,
+        -10.12,
+        -10.123,
+        -10.1234,
+        -100.1,
+        -100.12,
+        -100.123,
+        -100.1234,
+        -1000.1,
+        -1000.12,
+        -1000.123,
+        -1000.1234,
+        -10000.1,
+        -10000.12,
+        -10000.123,
+        -10000.1234,
+        -100000.1,
+        -100000.12,
+        -100000.123,
+        -100000.1234,
+        -1000000.1,
+        -1000000.12,
+        -1000000.123,
+        -1000000.1234,
+        -10000000.1,
+        -10000000.12,
+        -10000000.123,
+        -10000000.1234,
+        -100000000.1,
+        -100000000.12,
+        -100000000.123,
+        -100000000.1234,
+        -1000000000.1,
+        -1000000000.12,
+        -1000000000.123,
+        -1000000000.1234,
+        // Testing of special rounding cases
+        1.9993,
+        12.9993,
+        123.9993,
+        1234.9993,
+        12345.9993,
+        123456.9993,
+        1234567.9993,
+        12345678.9993,
+        123456789.9993,
+        1234567890.9993,
+        1.9996,
+        12.9996,
+        123.9996,
+        1234.9996,
+        12345.9996,
+        123456.9996,
+        1234567.9996,
+        12345678.9996,
+        123456789.9996,
+        1234567890.9996,
+        -1.9993,
+        -12.9993,
+        -123.9993,
+        -1234.9993,
+        -12345.9993,
+        -123456.9993,
+        -1234567.9993,
+        -12345678.9993,
+        -123456789.9993,
+        -1234567890.9993,
+        -1.9996,
+        -12.9996,
+        -123.9996,
+        -1234.9996,
+        -12345.9996,
+        -123456.9996,
+        -1234567.9996,
+        -12345678.9996,
+        -123456789.9996,
+        -1234567890.9996,
+        109.9996,
+        1099.9996,
+        10999.9996,
+        109999.9996,
+        1099999.9996,
+        10999999.9996,
+        109999999.9996,
+        1099999999.9996,
+        -109.9996,
+        -1099.9996,
+        -10999.9996,
+        -109999.9996,
+        -1099999.9996,
+        -10999999.9996,
+        -109999999.9996,
+        -1099999999.9996,
+        1.9996,
+        19.9996,
+        199.9996,
+        1999.9996,
+        19999.9996,
+        199999.9996,
+        1999999.9996,
+        19999999.9996,
+        199999999.9996,
+        1999999999.9996,
+        -1.9996,
+        -19.9996,
+        -199.9996,
+        -1999.9996,
+        -19999.9996,
+        -199999.9996,
+        -1999999.9996,
+        -19999999.9996,
+        -199999999.9996,
+        -1999999999.9996,
+        // Testing for all nines cases
+        9.9996,
+        99.9996,
+        999.9996,
+        9999.9996,
+        99999.9996,
+        999999.9996,
+        9999999.9996,
+        99999999.9996,
+        999999999.9996,
+        9.999,
+        99.999,
+        999.999,
+        9999.999,
+        99999.999,
+        999999.999,
+        9999999.999,
+        99999999.999,
+        999999999.999,
+        -9.9996,
+        -99.9996,
+        -999.9996,
+        -9999.9996,
+        -99999.9996,
+        -999999.9996,
+        -9999999.9996,
+        -99999999.9996,
+        -999999999.9996,
+        -9.999,
+        -99.999,
+        -999.999,
+        -9999.999,
+        -99999.999,
+        -999999.999,
+        -9999999.999,
+        -99999999.999,
+        -999999999.999,
+        // Testing for no Fractional part cases
+        1.0,
+        12.0,
+        123.0,
+        1234.0,
+        12345.0,
+        123456.0,
+        1234567.0,
+        12345678.0,
+        123456789.0,
+        1234567890.0,
+        -1.0,
+        -12.0,
+        -123.0,
+        -1234.0,
+        -12345.0,
+        -123456.0,
+        -1234567.0,
+        -12345678.0,
+        -123456789.0,
+        -1234567890.0,
+        // Testing of tricky cases
+        -2599.399999990123,
+        -2599.339999990123,
+        -2599.333999990123,
+        1.000099999999818,
+        1.000199999999818,
+        1.000299999999818,
+        1.000399999999818,
+        1.000499999999818,
+        1.000599999999818,
+        1.000699999999818,
+        1.000799999999818,
+        1.000899999999818,
+        1.000999999999818,
+        1.2224999999999980,
+        1.2224999999999981,
+        1.2224999999999982,
+        1.2224999999999983,
+        1.2224999999999984,
+        1.2224999999999985,
+        1.2224999999999986,
+        1.2224999999999987,
+        1.2224999999999988,
+        1.2224999999999989,
+        1.2224999999999990,
+        1.2224999999999991,
+        1.2224999999999992,
+        1.2224999999999993,
+        1.2224999999999994,
+        1.2224999999999995,
+        1.2224999999999996,
+        1.2224999999999997,
+        1.2224999999999998,
+        // 1.2225 and 1.2224999999999999 have the same double approximation
+        1.2225,
+        1.2225000000000001,
+        1.2225000000000002,
+        1.2225000000000003,
+        1.2225000000000004,
+        1.2225000000000005,
+        1.2225000000000006,
+        1.2225000000000007,
+        1.2225000000000008,
+        1.2225000000000009,
+        1.2225000000000010,
+        1.2225000000000011,
+        1.2225000000000012,
+        1.2225000000000013,
+        1.2225000000000014,
+        1.2225000000000015,
+        1.2225000000000016,
+        1.2225000000000017,
+        1.2225000000000018,
+        1.2225000000000019,
+        // Tricky rounding cases around tie values
+        100913.67050000005,
+        199999.99895901306,
+        251846.3465,
+        253243.8825000001,
+        365045.85349999997,
+        314734.9615,
+        541133.9755,
+        858372.1225,
+        1000999.9995000001,
+        1347505.7825,
+        3358844.1975,
+        9997979.4085,
+        9993743.1585,
+        9938671.9085,
+        3385302.5465,
+        3404642.6605,
+        3431280.0865,
+        3438756.4754999997,
+        3446053.7874999996,
+        3457917.5125,
+        3465393.9014999997,
+        3484734.0154999997,
+        3492031.3274999997,
+        3503895.0525,
+        3511371.4414999997,
+        3518668.7534999996,
+        3530532.4785,
+        3538008.8674999997,
+        3545306.1794999996,
+        3557169.9045,
+        3557348.9814999998,
+        3564646.2934999997,
+        3583986.4074999997,
+        3591283.7194999997,
+        3603147.4445,
+        3610623.8334999997,
+        3617921.1454999996,
+        3629784.8705,
+        3637261.2594999997,
+        3656422.2965,
+        3656601.3734999998,
+        3663898.6854999997,
+        3675762.4105,
+        3683238.7994999997,
+        3690536.1114999996,
+        3702399.8365,
+        3709876.2254999997,
+        3717173.5374999996,
+        3729037.2625,
+        3736513.6514999997,
+        3755853.7654999997,
+        3763151.0774999997,
+        3775014.8025,
+        3782491.1914999997,
+        3789788.5034999996,
+        3801652.2285,
+        3809128.6174999997,
+        3816425.9294999996,
+        3828289.6545,
+        3828468.7314999998,
+        3835766.0434999997,
+        3855106.1574999997,
+        3862403.4694999997,
+        3874267.1945,
+        3881743.5834999997,
+        3889040.8954999996,
+        3900904.6205,
+        3908381.0094999997,
+        3927542.0465,
+        3927721.1234999998,
+        3935018.4354999997,
+        3946882.1605,
+        3954358.5494999997,
+        3961655.8614999996,
+        3973519.5865,
+        3980995.9754999997,
+        3988293.2874999996,
+        4000157.0125,
+        4007633.4014999997,
+        4026973.5154999997,
+        4034270.8274999997,
+        4046134.5525,
+        4053610.9414999997,
+        4060908.2534999996,
+        4072771.9785,
+        4080248.3674999997,
+        4087545.6794999996,
+        4099409.4045,
+        4099588.4814999998,
+        4106885.7934999997,
+        4126225.9074999997,
+        4133523.2194999997,
+        4145386.9445,
+        4152863.3334999997,
+        4160160.6454999996,
+        4172024.3705,
+        4179500.7594999997,
+        4198661.7965,
+        4203407.2865,
+        4210704.5985,
+        4213435.4975
+    };
+
+    // --- The set of golden values for the currency formatting case --------
+    static final double[] CurrencyGoldenValues = {
+        // Testing of specific values
+        +0.0,
+        -0.0,
+        Double.MIN_VALUE,
+        Double.MIN_NORMAL,
+        PROPERTY_CHECK_NEGATIVE_VALUE,
+        PROPERTY_CHECK_POSITIVE_VALUE,
+        -2147483647.996,
+        2147483647.996,
+        -1999999999.9949997,
+        1999999999.9950003,
+        // Testing fast-path range checks (all outside bounds)
+        Double.NaN,
+        Double.POSITIVE_INFINITY,
+        Double.NEGATIVE_INFINITY,
+        Double.MAX_VALUE,
+        -9876543210.9876543,
+        9876543210.9876543,
+        -1234567890.1234567E128,
+        1234567890.1234567E128,
+        // Testing of integral string size
+        1.12,
+        12.12,
+        123.12,
+        1234.12,
+        12345.12,
+        123456.12,
+        1234567.12,
+        12345678.12,
+        123456789.12,
+        1234567890.12,
+        -1.12,
+        -12.12,
+        -123.12,
+        -1234.12,
+        -12345.12,
+        -123456.12,
+        -1234567.12,
+        -12345678.12,
+        -123456789.12,
+        -1234567890.12,
+        // Testing of fractional string size
+        0.1,
+        0.12,
+        0.123,
+        10.1,
+        10.12,
+        10.123,
+        100.1,
+        100.12,
+        100.123,
+        1000.1,
+        1000.12,
+        1000.123,
+        10000.1,
+        10000.12,
+        10000.123,
+        100000.1,
+        100000.12,
+        100000.123,
+        1000000.1,
+        1000000.12,
+        1000000.123,
+        10000000.1,
+        10000000.12,
+        10000000.123,
+        100000000.1,
+        100000000.12,
+        100000000.123,
+        1000000000.1,
+        1000000000.12,
+        1000000000.123,
+        -0.1,
+        -0.12,
+        -0.123,
+        -10.1,
+        -10.12,
+        -10.123,
+        -100.1,
+        -100.12,
+        -100.123,
+        -1000.1,
+        -1000.12,
+        -1000.123,
+        -10000.1,
+        -10000.12,
+        -10000.123,
+        -100000.1,
+        -100000.12,
+        -100000.123,
+        -1000000.1,
+        -1000000.12,
+        -1000000.123,
+        -10000000.1,
+        -10000000.12,
+        -10000000.123,
+        -100000000.1,
+        -100000000.12,
+        -100000000.123,
+        -1000000000.1,
+        -1000000000.12,
+        -1000000000.123,
+        // Testing of special rounding cases
+        1.993,
+        12.993,
+        123.993,
+        1234.993,
+        12345.993,
+        123456.993,
+        1234567.993,
+        12345678.993,
+        123456789.993,
+        1234567890.993,
+        1.996,
+        12.996,
+        123.996,
+        1234.996,
+        12345.996,
+        123456.996,
+        1234567.996,
+        12345678.996,
+        123456789.996,
+        1234567890.996,
+        -1.993,
+        -12.993,
+        -123.993,
+        -1234.993,
+        -12345.993,
+        -123456.993,
+        -1234567.993,
+        -12345678.993,
+        -123456789.993,
+        -1234567890.993,
+        -1.996,
+        -12.996,
+        -123.996,
+        -1234.996,
+        -12345.996,
+        -123456.996,
+        -1234567.996,
+        -12345678.996,
+        -123456789.996,
+        -1234567890.996,
+        109.996,
+        1099.996,
+        10999.996,
+        109999.996,
+        1099999.996,
+        10999999.996,
+        109999999.996,
+        1099999999.996,
+        -109.996,
+        -1099.996,
+        -10999.996,
+        -109999.996,
+        -1099999.996,
+        -10999999.996,
+        -109999999.996,
+        -1099999999.996,
+        1.996,
+        19.996,
+        199.996,
+        1999.996,
+        19999.996,
+        199999.996,
+        1999999.996,
+        19999999.996,
+        199999999.996,
+        1999999999.996,
+        -1.996,
+        -19.996,
+        -199.996,
+        -1999.996,
+        -19999.996,
+        -199999.996,
+        -1999999.996,
+        -19999999.996,
+        -199999999.996,
+        -1999999999.996,
+        // Testing of all nines cases
+        9.996,
+        99.996,
+        999.996,
+        9999.996,
+        99999.996,
+        999999.996,
+        9999999.996,
+        99999999.996,
+        999999999.996,
+        9.99,
+        99.99,
+        999.99,
+        9999.99,
+        99999.99,
+        999999.99,
+        9999999.99,
+        99999999.99,
+        999999999.99,
+        -9.996,
+        -99.996,
+        -999.996,
+        -9999.996,
+        -99999.996,
+        -999999.996,
+        -9999999.996,
+        -99999999.996,
+        -999999999.996,
+        -9.99,
+        -99.99,
+        -999.99,
+        -9999.99,
+        -99999.99,
+        -999999.99,
+        -9999999.99,
+        -99999999.99,
+        -999999999.99,
+        // Testing of no Fractional part cases
+        1.0,
+        12.0,
+        123.0,
+        1234.0,
+        12345.0,
+        123456.0,
+        1234567.0,
+        12345678.0,
+        123456789.0,
+        1234567890.0,
+        -1.0,
+        -12.0,
+        -123.0,
+        -1234.0,
+        -12345.0,
+        -123456.0,
+        -1234567.0,
+        -12345678.0,
+        -123456789.0,
+        -1234567890.0,
+        // Testing of tricky cases
+        -2599.399999990123,
+        -2599.339999990123,
+        -2599.333999990123,
+        1.000999999999818,
+        1.001999999999818,
+        1.002999999999818,
+        1.003999999999818,
+        1.004999999999818,
+        1.005999999999818,
+        1.006999999999818,
+        1.007999999999818,
+        1.008999999999818,
+        1.009999999999818,
+        1.224999999999980,
+        1.224999999999981,
+        1.224999999999982,
+        1.224999999999983,
+        1.224999999999984,
+        1.224999999999985,
+        1.224999999999986,
+        1.224999999999987,
+        1.224999999999988,
+        1.224999999999989,
+        1.224999999999990,
+        1.224999999999991,
+        1.224999999999992,
+        1.224999999999993,
+        1.224999999999994,
+        1.224999999999995,
+        1.224999999999996,
+        1.224999999999997,
+        1.224999999999998,
+        1.224999999999999,
+        1.225,
+        1.225000000000001,
+        1.225000000000002,
+        1.225000000000003,
+        1.225000000000004,
+        1.225000000000005,
+        1.225000000000006,
+        1.225000000000007,
+        1.225000000000008,
+        1.225000000000009,
+        1.225000000000010,
+        1.225000000000011,
+        1.225000000000012,
+        1.225000000000013,
+        1.225000000000014,
+        1.225000000000015,
+        1.225000000000016,
+        1.225000000000017,
+        1.225000000000018,
+        1.225000000000019,
+        // Tricky rounding cases around tie values
+        1009136.7050000005,
+        2518463.465,
+        2532438.825000001,
+        3650458.5349999997,
+        3147349.615,
+        5411339.755,
+        8583721.225,
+        13475057.825,
+        33588441.975,
+        99979794.085,
+        99937431.585,
+        99386719.085,
+        33853025.465,
+        34046426.605,
+        34312800.865,
+        34387564.754999997,
+        34460537.874999996,
+        34579175.125,
+        34653939.014999997,
+        34847340.154999997,
+        34920313.274999997,
+        35038950.525,
+        35113714.414999997,
+        35186687.534999996,
+        35305324.785,
+        35380088.674999997,
+        35453061.794999996,
+        35571699.045,
+        35573489.814999998,
+        35646462.934999997,
+        35839864.074999997,
+        35912837.194999997,
+        36031474.445,
+        36106238.334999997,
+        36179211.454999996,
+        36297848.705,
+        36372612.594999997,
+        36564222.965,
+        36566013.734999998,
+        36638986.854999997,
+        36757624.105,
+        36832387.994999997,
+        36905361.114999996,
+        37023998.365,
+        37098762.254999997,
+        37171735.374999996,
+        37290372.625,
+        37365136.514999997,
+        37558537.654999997,
+        37631510.774999997,
+        37750148.025,
+        37824911.914999997,
+        37897885.034999996,
+        38016522.285,
+        38091286.174999997,
+        38164259.294999996,
+        38282896.545,
+        38284687.314999998,
+        38357660.434999997,
+        38551061.574999997,
+        38624034.694999997,
+        38742671.945,
+        38817435.834999997,
+        38890408.954999996,
+        39009046.205,
+        39083810.094999997,
+        39275420.465,
+        39277211.234999998,
+        39350184.354999997,
+        39468821.605,
+        39543585.494999997,
+        39616558.614999996,
+        39735195.865,
+        39809959.754999997,
+        39882932.874999996,
+        40001570.125,
+        40076334.014999997,
+        40269735.154999997,
+        40342708.274999997,
+        40461345.525,
+        40536109.414999997,
+        40609082.534999996,
+        40727719.785,
+        40802483.674999997,
+        40875456.794999996,
+        40994094.045,
+        40995884.814999998,
+        41068857.934999997,
+        41262259.074999997,
+        41335232.194999997,
+        41453869.445,
+        41528633.334999997,
+        41601606.454999996,
+        41720243.705,
+        41795007.594999997,
+        41986617.965,
+        42034072.865,
+        42107045.985,
+        42134354.975
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DecimalFormat/GoldenFormattedValues.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,868 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/* This is a machine generated file - Please DO NOT EDIT !
+ * Change RoundingAndPropertyTest instead,
+ * and run with "-gengold" argument to regenerate (without copyright header).
+ */
+
+/* This file contains the set of result Strings expected from calling inside
+ * RoundingAndPropertyTest the method NumberFormat.format() upon the set of
+ * double values provided in GoldenDoubleValues.java. It contains three arrays,
+ * each containing arrays of unicode values representing the expected string
+ * result when calling format() on the corresponding (i.e. same index) double
+ * value found in GoldenDoubleValues arrays :
+ * - DecimalDigitsLocalizedFormattedValues corresponds to DecimalLocalizationValues,
+ *   when using FullLocalizationTestLocale to format.
+ * - DecimalGoldenFormattedValues corresponds to DecimalGoldenValues, when used
+ *   in the decimal pattern case together with TestLocale.
+ * - CurrencyGoldenFormattedValues corresponds to CurrencyGoldenValues. when used
+ *   in the currency pattern case together with TestLocale.
+ * Please see documentation in RoundingAndPropertyTest.java for more details.
+ *
+ * This file generated by running RoundingAndPropertyTest with "-gengold" argument.
+ */
+
+class GoldenFormattedValues {
+
+    // The formatted values below were generated from golden values
+    // listed in GoldenDoubleValues.java, using the following jvm version :
+    //   Oracle Corporation Java HotSpot(TM) Server VM 1.8.0-ea
+    //   locale for golden double values : en_US
+    //   locale for testing digit localization : hi_IN
+
+    // The array of int[] unicode values storing the expected results
+    // when experiencing full localization of digits on DecimalLocalizationValues.
+    static int[][] DecimalDigitsLocalizedFormattedValues = {
+        { 2407, 46, 2407, 2408, 2409 },
+        { 2407, 2408, 46, 2407, 2408, 2409 },
+        { 2407, 2408, 2409, 46, 2407, 2408, 2409 },
+        { 2407, 44, 2408, 2409, 2410, 46, 2407, 2408, 2409 },
+        { 2407, 2408, 44, 2409, 2410, 2411, 46, 2407, 2408, 2409 },
+        { 2407, 2408, 2409, 44, 2410, 2411, 2412, 46, 2407, 2408, 2409 },
+        { 2407, 44, 2408, 2409, 2410, 44, 2411, 2412, 2413, 46, 2407, 2408, 2409 },
+        { 2407, 2408, 44, 2409, 2410, 2411, 44, 2412, 2413, 2414, 46, 2407, 2408, 2409 },
+        { 2407, 2408, 2409, 44, 2410, 2411, 2412, 44, 2413, 2414, 2415, 46, 2407, 2408, 2409 },
+        { 2407, 44, 2408, 2409, 2410, 44, 2411, 2412, 2413, 44, 2414, 2415, 2406, 46, 2407, 2408, 2409 },
+        { 2407, 44, 2408, 2409, 2410 },
+        { 2407, 44, 2408, 2409, 2410, 46, 2415 },
+        { 2407, 44, 2408, 2409, 2410, 46, 2415, 2415 },
+        { 2407, 44, 2408, 2409, 2410, 46, 2415, 2415, 2415 },
+    };
+
+    // The array of int[] unicode values storing the expected results
+    // when calling Decimal.format(double) on the decimal GoldenDoubleValues.
+    static int[][] DecimalGoldenFormattedValues = {
+        { 48 },
+        { 45, 48 },
+        { 48 },
+        { 48 },
+        { 45, 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 54, 46, 50, 51, 51 },
+        { 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 54, 46, 50, 51, 52 },
+        { 45, 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 56 },
+        { 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 56 },
+        { 45, 49, 44, 57, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 50, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 65533 },
+        { 8734 },
+        { 45, 8734 },
+        { 49, 55, 57, 44, 55, 54, 57, 44, 51, 49, 51, 44, 52, 56, 54, 44, 50, 51, 49, 44, 53, 55, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 57, 44, 56, 55, 54, 44, 53, 52, 51, 44, 50, 49, 48, 46, 57, 56, 56 },
+        { 57, 44, 56, 55, 54, 44, 53, 52, 51, 44, 50, 49, 48, 46, 57, 56, 56 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 44, 48, 49, 50, 44, 51, 52, 53, 44, 54, 55, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 44, 48, 49, 50, 44, 51, 52, 53, 44, 54, 55, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 46, 49, 50, 51 },
+        { 49, 50, 46, 49, 50, 51 },
+        { 49, 50, 51, 46, 49, 50, 51 },
+        { 49, 44, 50, 51, 52, 46, 49, 50, 51 },
+        { 49, 50, 44, 51, 52, 53, 46, 49, 50, 51 },
+        { 49, 50, 51, 44, 52, 53, 54, 46, 49, 50, 51 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 49, 50, 51 },
+        { 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 49, 50, 51 },
+        { 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 49, 50, 51 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 49, 50, 51 },
+        { 45, 49, 46, 49, 50, 51 },
+        { 45, 49, 50, 46, 49, 50, 51 },
+        { 45, 49, 50, 51, 46, 49, 50, 51 },
+        { 45, 49, 44, 50, 51, 52, 46, 49, 50, 51 },
+        { 45, 49, 50, 44, 51, 52, 53, 46, 49, 50, 51 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 46, 49, 50, 51 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 49, 50, 51 },
+        { 45, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 49, 50, 51 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 49, 50, 51 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 49, 50, 51 },
+        { 48, 46, 49 },
+        { 48, 46, 49, 50 },
+        { 48, 46, 49, 50, 51 },
+        { 48, 46, 49, 50, 51 },
+        { 49, 48, 46, 49 },
+        { 49, 48, 46, 49, 50 },
+        { 49, 48, 46, 49, 50, 51 },
+        { 49, 48, 46, 49, 50, 51 },
+        { 49, 48, 48, 46, 49 },
+        { 49, 48, 48, 46, 49, 50 },
+        { 49, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 48, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 48, 46, 49 },
+        { 49, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 44, 48, 48, 48, 46, 49 },
+        { 49, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 49, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 48, 46, 49 },
+        { 45, 48, 46, 49, 50 },
+        { 45, 48, 46, 49, 50, 51 },
+        { 45, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 46, 49 },
+        { 45, 49, 48, 46, 49, 50 },
+        { 45, 49, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 48, 46, 49 },
+        { 45, 49, 48, 48, 46, 49, 50 },
+        { 45, 49, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 51 },
+        { 49, 46, 57, 57, 57 },
+        { 49, 50, 46, 57, 57, 57 },
+        { 49, 50, 51, 46, 57, 57, 57 },
+        { 49, 44, 50, 51, 52, 46, 57, 57, 57 },
+        { 49, 50, 44, 51, 52, 53, 46, 57, 57, 57 },
+        { 49, 50, 51, 44, 52, 53, 54, 46, 57, 57, 57 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 57, 57, 57 },
+        { 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 57, 57, 57 },
+        { 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 57, 57, 57 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 57, 57, 57 },
+        { 50 },
+        { 49, 51 },
+        { 49, 50, 52 },
+        { 49, 44, 50, 51, 53 },
+        { 49, 50, 44, 51, 52, 54 },
+        { 49, 50, 51, 44, 52, 53, 55 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 56 },
+        { 49, 50, 44, 51, 52, 53, 44, 54, 55, 57 },
+        { 49, 50, 51, 44, 52, 53, 54, 44, 55, 57, 48 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 49 },
+        { 45, 49, 46, 57, 57, 57 },
+        { 45, 49, 50, 46, 57, 57, 57 },
+        { 45, 49, 50, 51, 46, 57, 57, 57 },
+        { 45, 49, 44, 50, 51, 52, 46, 57, 57, 57 },
+        { 45, 49, 50, 44, 51, 52, 53, 46, 57, 57, 57 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 46, 57, 57, 57 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 57, 57, 57 },
+        { 45, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 57, 57, 57 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 57, 57, 57 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 57, 57, 57 },
+        { 45, 50 },
+        { 45, 49, 51 },
+        { 45, 49, 50, 52 },
+        { 45, 49, 44, 50, 51, 53 },
+        { 45, 49, 50, 44, 51, 52, 54 },
+        { 45, 49, 50, 51, 44, 52, 53, 55 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 56 },
+        { 45, 49, 50, 44, 51, 52, 53, 44, 54, 55, 57 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 44, 55, 57, 48 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 49 },
+        { 49, 49, 48 },
+        { 49, 44, 49, 48, 48 },
+        { 49, 49, 44, 48, 48, 48 },
+        { 49, 49, 48, 44, 48, 48, 48 },
+        { 49, 44, 49, 48, 48, 44, 48, 48, 48 },
+        { 49, 49, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 44, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 49, 48 },
+        { 45, 49, 44, 49, 48, 48 },
+        { 45, 49, 49, 44, 48, 48, 48 },
+        { 45, 49, 49, 48, 44, 48, 48, 48 },
+        { 45, 49, 44, 49, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 49, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 44, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 50 },
+        { 50, 48 },
+        { 50, 48, 48 },
+        { 50, 44, 48, 48, 48 },
+        { 50, 48, 44, 48, 48, 48 },
+        { 50, 48, 48, 44, 48, 48, 48 },
+        { 50, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 50, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 50, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 50, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 50 },
+        { 45, 50, 48 },
+        { 45, 50, 48, 48 },
+        { 45, 50, 44, 48, 48, 48 },
+        { 45, 50, 48, 44, 48, 48, 48 },
+        { 45, 50, 48, 48, 44, 48, 48, 48 },
+        { 45, 50, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 50, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 50, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 50, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 48 },
+        { 49, 48, 48 },
+        { 49, 44, 48, 48, 48 },
+        { 49, 48, 44, 48, 48, 48 },
+        { 49, 48, 48, 44, 48, 48, 48 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 57, 46, 57, 57, 57 },
+        { 57, 57, 46, 57, 57, 57 },
+        { 57, 57, 57, 46, 57, 57, 57 },
+        { 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 57, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 49, 48 },
+        { 45, 49, 48, 48 },
+        { 45, 49, 44, 48, 48, 48 },
+        { 45, 49, 48, 44, 48, 48, 48 },
+        { 45, 49, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48 },
+        { 45, 57, 46, 57, 57, 57 },
+        { 45, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 45, 57, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 49 },
+        { 49, 50 },
+        { 49, 50, 51 },
+        { 49, 44, 50, 51, 52 },
+        { 49, 50, 44, 51, 52, 53 },
+        { 49, 50, 51, 44, 52, 53, 54 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55 },
+        { 49, 50, 44, 51, 52, 53, 44, 54, 55, 56 },
+        { 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57 },
+        { 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48 },
+        { 45, 49 },
+        { 45, 49, 50 },
+        { 45, 49, 50, 51 },
+        { 45, 49, 44, 50, 51, 52 },
+        { 45, 49, 50, 44, 51, 52, 53 },
+        { 45, 49, 50, 51, 44, 52, 53, 54 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55 },
+        { 45, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56 },
+        { 45, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57 },
+        { 45, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48 },
+        { 45, 50, 44, 53, 57, 57, 46, 52 },
+        { 45, 50, 44, 53, 57, 57, 46, 51, 52 },
+        { 45, 50, 44, 53, 57, 57, 46, 51, 51, 52 },
+        { 49 },
+        { 49 },
+        { 49 },
+        { 49 },
+        { 49 },
+        { 49, 46, 48, 48, 49 },
+        { 49, 46, 48, 48, 49 },
+        { 49, 46, 48, 48, 49 },
+        { 49, 46, 48, 48, 49 },
+        { 49, 46, 48, 48, 49 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 50 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 46, 50, 50, 51 },
+        { 49, 48, 48, 44, 57, 49, 51, 46, 54, 55, 49 },
+        { 49, 57, 57, 44, 57, 57, 57, 46, 57, 57, 57 },
+        { 50, 53, 49, 44, 56, 52, 54, 46, 51, 52, 55 },
+        { 50, 53, 51, 44, 50, 52, 51, 46, 56, 56, 51 },
+        { 51, 54, 53, 44, 48, 52, 53, 46, 56, 53, 51 },
+        { 51, 49, 52, 44, 55, 51, 52, 46, 57, 54, 49 },
+        { 53, 52, 49, 44, 49, 51, 51, 46, 57, 55, 53 },
+        { 56, 53, 56, 44, 51, 55, 50, 46, 49, 50, 51 },
+        { 49, 44, 48, 48, 49, 44, 48, 48, 48 },
+        { 49, 44, 51, 52, 55, 44, 53, 48, 53, 46, 55, 56, 50 },
+        { 51, 44, 51, 53, 56, 44, 56, 52, 52, 46, 49, 57, 55 },
+        { 57, 44, 57, 57, 55, 44, 57, 55, 57, 46, 52, 48, 57 },
+        { 57, 44, 57, 57, 51, 44, 55, 52, 51, 46, 49, 53, 57 },
+        { 57, 44, 57, 51, 56, 44, 54, 55, 49, 46, 57, 48, 57 },
+        { 51, 44, 51, 56, 53, 44, 51, 48, 50, 46, 53, 52, 55 },
+        { 51, 44, 52, 48, 52, 44, 54, 52, 50, 46, 54, 54, 49 },
+        { 51, 44, 52, 51, 49, 44, 50, 56, 48, 46, 48, 56, 55 },
+        { 51, 44, 52, 51, 56, 44, 55, 53, 54, 46, 52, 55, 53 },
+        { 51, 44, 52, 52, 54, 44, 48, 53, 51, 46, 55, 56, 55 },
+        { 51, 44, 52, 53, 55, 44, 57, 49, 55, 46, 53, 49, 51 },
+        { 51, 44, 52, 54, 53, 44, 51, 57, 51, 46, 57, 48, 49 },
+        { 51, 44, 52, 56, 52, 44, 55, 51, 52, 46, 48, 49, 53 },
+        { 51, 44, 52, 57, 50, 44, 48, 51, 49, 46, 51, 50, 55 },
+        { 51, 44, 53, 48, 51, 44, 56, 57, 53, 46, 48, 53, 51 },
+        { 51, 44, 53, 49, 49, 44, 51, 55, 49, 46, 52, 52, 49 },
+        { 51, 44, 53, 49, 56, 44, 54, 54, 56, 46, 55, 53, 51 },
+        { 51, 44, 53, 51, 48, 44, 53, 51, 50, 46, 52, 55, 57 },
+        { 51, 44, 53, 51, 56, 44, 48, 48, 56, 46, 56, 54, 55 },
+        { 51, 44, 53, 52, 53, 44, 51, 48, 54, 46, 49, 55, 57 },
+        { 51, 44, 53, 53, 55, 44, 49, 54, 57, 46, 57, 48, 53 },
+        { 51, 44, 53, 53, 55, 44, 51, 52, 56, 46, 57, 56, 49 },
+        { 51, 44, 53, 54, 52, 44, 54, 52, 54, 46, 50, 57, 51 },
+        { 51, 44, 53, 56, 51, 44, 57, 56, 54, 46, 52, 48, 55 },
+        { 51, 44, 53, 57, 49, 44, 50, 56, 51, 46, 55, 49, 57 },
+        { 51, 44, 54, 48, 51, 44, 49, 52, 55, 46, 52, 52, 53 },
+        { 51, 44, 54, 49, 48, 44, 54, 50, 51, 46, 56, 51, 51 },
+        { 51, 44, 54, 49, 55, 44, 57, 50, 49, 46, 49, 52, 53 },
+        { 51, 44, 54, 50, 57, 44, 55, 56, 52, 46, 56, 55, 49 },
+        { 51, 44, 54, 51, 55, 44, 50, 54, 49, 46, 50, 53, 57 },
+        { 51, 44, 54, 53, 54, 44, 52, 50, 50, 46, 50, 57, 55 },
+        { 51, 44, 54, 53, 54, 44, 54, 48, 49, 46, 51, 55, 51 },
+        { 51, 44, 54, 54, 51, 44, 56, 57, 56, 46, 54, 56, 53 },
+        { 51, 44, 54, 55, 53, 44, 55, 54, 50, 46, 52, 49, 49 },
+        { 51, 44, 54, 56, 51, 44, 50, 51, 56, 46, 55, 57, 57 },
+        { 51, 44, 54, 57, 48, 44, 53, 51, 54, 46, 49, 49, 49 },
+        { 51, 44, 55, 48, 50, 44, 51, 57, 57, 46, 56, 51, 55 },
+        { 51, 44, 55, 48, 57, 44, 56, 55, 54, 46, 50, 50, 53 },
+        { 51, 44, 55, 49, 55, 44, 49, 55, 51, 46, 53, 51, 55 },
+        { 51, 44, 55, 50, 57, 44, 48, 51, 55, 46, 50, 54, 51 },
+        { 51, 44, 55, 51, 54, 44, 53, 49, 51, 46, 54, 53, 49 },
+        { 51, 44, 55, 53, 53, 44, 56, 53, 51, 46, 55, 54, 53 },
+        { 51, 44, 55, 54, 51, 44, 49, 53, 49, 46, 48, 55, 55 },
+        { 51, 44, 55, 55, 53, 44, 48, 49, 52, 46, 56, 48, 51 },
+        { 51, 44, 55, 56, 50, 44, 52, 57, 49, 46, 49, 57, 49 },
+        { 51, 44, 55, 56, 57, 44, 55, 56, 56, 46, 53, 48, 51 },
+        { 51, 44, 56, 48, 49, 44, 54, 53, 50, 46, 50, 50, 57 },
+        { 51, 44, 56, 48, 57, 44, 49, 50, 56, 46, 54, 49, 55 },
+        { 51, 44, 56, 49, 54, 44, 52, 50, 53, 46, 57, 50, 57 },
+        { 51, 44, 56, 50, 56, 44, 50, 56, 57, 46, 54, 53, 53 },
+        { 51, 44, 56, 50, 56, 44, 52, 54, 56, 46, 55, 51, 49 },
+        { 51, 44, 56, 51, 53, 44, 55, 54, 54, 46, 48, 52, 51 },
+        { 51, 44, 56, 53, 53, 44, 49, 48, 54, 46, 49, 53, 55 },
+        { 51, 44, 56, 54, 50, 44, 52, 48, 51, 46, 52, 54, 57 },
+        { 51, 44, 56, 55, 52, 44, 50, 54, 55, 46, 49, 57, 53 },
+        { 51, 44, 56, 56, 49, 44, 55, 52, 51, 46, 53, 56, 51 },
+        { 51, 44, 56, 56, 57, 44, 48, 52, 48, 46, 56, 57, 53 },
+        { 51, 44, 57, 48, 48, 44, 57, 48, 52, 46, 54, 50, 49 },
+        { 51, 44, 57, 48, 56, 44, 51, 56, 49, 46, 48, 48, 57 },
+        { 51, 44, 57, 50, 55, 44, 53, 52, 50, 46, 48, 52, 55 },
+        { 51, 44, 57, 50, 55, 44, 55, 50, 49, 46, 49, 50, 51 },
+        { 51, 44, 57, 51, 53, 44, 48, 49, 56, 46, 52, 51, 53 },
+        { 51, 44, 57, 52, 54, 44, 56, 56, 50, 46, 49, 54, 49 },
+        { 51, 44, 57, 53, 52, 44, 51, 53, 56, 46, 53, 52, 57 },
+        { 51, 44, 57, 54, 49, 44, 54, 53, 53, 46, 56, 54, 49 },
+        { 51, 44, 57, 55, 51, 44, 53, 49, 57, 46, 53, 56, 55 },
+        { 51, 44, 57, 56, 48, 44, 57, 57, 53, 46, 57, 55, 53 },
+        { 51, 44, 57, 56, 56, 44, 50, 57, 51, 46, 50, 56, 55 },
+        { 52, 44, 48, 48, 48, 44, 49, 53, 55, 46, 48, 49, 51 },
+        { 52, 44, 48, 48, 55, 44, 54, 51, 51, 46, 52, 48, 49 },
+        { 52, 44, 48, 50, 54, 44, 57, 55, 51, 46, 53, 49, 53 },
+        { 52, 44, 48, 51, 52, 44, 50, 55, 48, 46, 56, 50, 55 },
+        { 52, 44, 48, 52, 54, 44, 49, 51, 52, 46, 53, 53, 51 },
+        { 52, 44, 48, 53, 51, 44, 54, 49, 48, 46, 57, 52, 49 },
+        { 52, 44, 48, 54, 48, 44, 57, 48, 56, 46, 50, 53, 51 },
+        { 52, 44, 48, 55, 50, 44, 55, 55, 49, 46, 57, 55, 57 },
+        { 52, 44, 48, 56, 48, 44, 50, 52, 56, 46, 51, 54, 55 },
+        { 52, 44, 48, 56, 55, 44, 53, 52, 53, 46, 54, 55, 57 },
+        { 52, 44, 48, 57, 57, 44, 52, 48, 57, 46, 52, 48, 53 },
+        { 52, 44, 48, 57, 57, 44, 53, 56, 56, 46, 52, 56, 49 },
+        { 52, 44, 49, 48, 54, 44, 56, 56, 53, 46, 55, 57, 51 },
+        { 52, 44, 49, 50, 54, 44, 50, 50, 53, 46, 57, 48, 55 },
+        { 52, 44, 49, 51, 51, 44, 53, 50, 51, 46, 50, 49, 57 },
+        { 52, 44, 49, 52, 53, 44, 51, 56, 54, 46, 57, 52, 53 },
+        { 52, 44, 49, 53, 50, 44, 56, 54, 51, 46, 51, 51, 51 },
+        { 52, 44, 49, 54, 48, 44, 49, 54, 48, 46, 54, 52, 53 },
+        { 52, 44, 49, 55, 50, 44, 48, 50, 52, 46, 51, 55, 49 },
+        { 52, 44, 49, 55, 57, 44, 53, 48, 48, 46, 55, 53, 57 },
+        { 52, 44, 49, 57, 56, 44, 54, 54, 49, 46, 55, 57, 55 },
+        { 52, 44, 50, 48, 51, 44, 52, 48, 55, 46, 50, 56, 55 },
+        { 52, 44, 50, 49, 48, 44, 55, 48, 52, 46, 53, 57, 57 },
+        { 52, 44, 50, 49, 51, 44, 52, 51, 53, 46, 52, 57, 55 },
+    };
+
+    // The array of int[] unicode values storing the expected results
+    // when calling Decimal.format(double) on the currency GoldenDoubleValues.
+    static int[][] CurrencyGoldenFormattedValues = {
+        { 36, 48, 46, 48, 48 },
+        { 40, 36, 48, 46, 48, 48, 41 },
+        { 36, 48, 46, 48, 48 },
+        { 36, 48, 46, 48, 48 },
+        { 40, 36, 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 54, 46, 50, 51, 41 },
+        { 36, 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 54, 46, 50, 51 },
+        { 40, 36, 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 56, 46, 48, 48, 41 },
+        { 36, 50, 44, 49, 52, 55, 44, 52, 56, 51, 44, 54, 52, 56, 46, 48, 48 },
+        { 40, 36, 49, 44, 57, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 36, 50, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 65533 },
+        { 36, 8734 },
+        { 40, 36, 8734, 41 },
+        { 36, 49, 55, 57, 44, 55, 54, 57, 44, 51, 49, 51, 44, 52, 56, 54, 44, 50, 51, 49, 44, 53, 55, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 40, 36, 57, 44, 56, 55, 54, 44, 53, 52, 51, 44, 50, 49, 48, 46, 57, 57, 41 },
+        { 36, 57, 44, 56, 55, 54, 44, 53, 52, 51, 44, 50, 49, 48, 46, 57, 57 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 44, 48, 49, 50, 44, 51, 52, 53, 44, 54, 55, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 44, 48, 49, 50, 44, 51, 52, 53, 44, 54, 55, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 46, 49, 50 },
+        { 36, 49, 50, 46, 49, 50 },
+        { 36, 49, 50, 51, 46, 49, 50 },
+        { 36, 49, 44, 50, 51, 52, 46, 49, 50 },
+        { 36, 49, 50, 44, 51, 52, 53, 46, 49, 50 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 46, 49, 50 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 49, 50 },
+        { 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 49, 50 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 49, 50 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 49, 50 },
+        { 40, 36, 49, 46, 49, 50, 41 },
+        { 40, 36, 49, 50, 46, 49, 50, 41 },
+        { 40, 36, 49, 50, 51, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 46, 49, 50, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 46, 49, 50, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 49, 50, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 49, 50, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 49, 50, 41 },
+        { 36, 48, 46, 49, 48 },
+        { 36, 48, 46, 49, 50 },
+        { 36, 48, 46, 49, 50 },
+        { 36, 49, 48, 46, 49, 48 },
+        { 36, 49, 48, 46, 49, 50 },
+        { 36, 49, 48, 46, 49, 50 },
+        { 36, 49, 48, 48, 46, 49, 48 },
+        { 36, 49, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 48, 46, 49, 50 },
+        { 36, 49, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50 },
+        { 40, 36, 48, 46, 49, 48, 41 },
+        { 40, 36, 48, 46, 49, 50, 41 },
+        { 40, 36, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 48, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 49, 50, 41 },
+        { 36, 49, 46, 57, 57 },
+        { 36, 49, 50, 46, 57, 57 },
+        { 36, 49, 50, 51, 46, 57, 57 },
+        { 36, 49, 44, 50, 51, 52, 46, 57, 57 },
+        { 36, 49, 50, 44, 51, 52, 53, 46, 57, 57 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 46, 57, 57 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 57, 57 },
+        { 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 57, 57 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 57, 57 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 57, 57 },
+        { 36, 50, 46, 48, 48 },
+        { 36, 49, 51, 46, 48, 48 },
+        { 36, 49, 50, 52, 46, 48, 48 },
+        { 36, 49, 44, 50, 51, 53, 46, 48, 48 },
+        { 36, 49, 50, 44, 51, 52, 54, 46, 48, 48 },
+        { 36, 49, 50, 51, 44, 52, 53, 55, 46, 48, 48 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 56, 46, 48, 48 },
+        { 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 57, 46, 48, 48 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 57, 48, 46, 48, 48 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 49, 46, 48, 48 },
+        { 40, 36, 49, 46, 57, 57, 41 },
+        { 40, 36, 49, 50, 46, 57, 57, 41 },
+        { 40, 36, 49, 50, 51, 46, 57, 57, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 46, 57, 57, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 46, 57, 57, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 46, 57, 57, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 57, 57, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 57, 57, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 57, 57, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 57, 57, 41 },
+        { 40, 36, 50, 46, 48, 48, 41 },
+        { 40, 36, 49, 51, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 52, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 50, 51, 53, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 54, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 55, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 56, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 57, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 57, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 49, 46, 48, 48, 41 },
+        { 36, 49, 49, 48, 46, 48, 48 },
+        { 36, 49, 44, 49, 48, 48, 46, 48, 48 },
+        { 36, 49, 49, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 49, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 44, 49, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 44, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 40, 36, 49, 49, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 49, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 49, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 49, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 49, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 36, 50, 46, 48, 48 },
+        { 36, 50, 48, 46, 48, 48 },
+        { 36, 50, 48, 48, 46, 48, 48 },
+        { 36, 50, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 50, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 50, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 50, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 50, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 50, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 50, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 40, 36, 50, 46, 48, 48, 41 },
+        { 40, 36, 50, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 36, 49, 48, 46, 48, 48 },
+        { 36, 49, 48, 48, 46, 48, 48 },
+        { 36, 49, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48 },
+        { 36, 57, 46, 57, 57 },
+        { 36, 57, 57, 46, 57, 57 },
+        { 36, 57, 57, 57, 46, 57, 57 },
+        { 36, 57, 44, 57, 57, 57, 46, 57, 57 },
+        { 36, 57, 57, 44, 57, 57, 57, 46, 57, 57 },
+        { 36, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57 },
+        { 36, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57 },
+        { 36, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57 },
+        { 36, 57, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57 },
+        { 40, 36, 49, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 48, 48, 48, 44, 48, 48, 48, 44, 48, 48, 48, 46, 48, 48, 41 },
+        { 40, 36, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 40, 36, 57, 57, 57, 44, 57, 57, 57, 44, 57, 57, 57, 46, 57, 57, 41 },
+        { 36, 49, 46, 48, 48 },
+        { 36, 49, 50, 46, 48, 48 },
+        { 36, 49, 50, 51, 46, 48, 48 },
+        { 36, 49, 44, 50, 51, 52, 46, 48, 48 },
+        { 36, 49, 50, 44, 51, 52, 53, 46, 48, 48 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 46, 48, 48 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 48, 48 },
+        { 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 48, 48 },
+        { 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 48, 48 },
+        { 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 48, 48 },
+        { 40, 36, 49, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 51, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 44, 51, 52, 53, 44, 54, 55, 56, 46, 48, 48, 41 },
+        { 40, 36, 49, 50, 51, 44, 52, 53, 54, 44, 55, 56, 57, 46, 48, 48, 41 },
+        { 40, 36, 49, 44, 50, 51, 52, 44, 53, 54, 55, 44, 56, 57, 48, 46, 48, 48, 41 },
+        { 40, 36, 50, 44, 53, 57, 57, 46, 52, 48, 41 },
+        { 40, 36, 50, 44, 53, 57, 57, 46, 51, 52, 41 },
+        { 40, 36, 50, 44, 53, 57, 57, 46, 51, 51, 41 },
+        { 36, 49, 46, 48, 48 },
+        { 36, 49, 46, 48, 48 },
+        { 36, 49, 46, 48, 48 },
+        { 36, 49, 46, 48, 48 },
+        { 36, 49, 46, 48, 48 },
+        { 36, 49, 46, 48, 49 },
+        { 36, 49, 46, 48, 49 },
+        { 36, 49, 46, 48, 49 },
+        { 36, 49, 46, 48, 49 },
+        { 36, 49, 46, 48, 49 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 50 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 46, 50, 51 },
+        { 36, 49, 44, 48, 48, 57, 44, 49, 51, 54, 46, 55, 49 },
+        { 36, 50, 44, 53, 49, 56, 44, 52, 54, 51, 46, 52, 54 },
+        { 36, 50, 44, 53, 51, 50, 44, 52, 51, 56, 46, 56, 51 },
+        { 36, 51, 44, 54, 53, 48, 44, 52, 53, 56, 46, 53, 51 },
+        { 36, 51, 44, 49, 52, 55, 44, 51, 52, 57, 46, 54, 50 },
+        { 36, 53, 44, 52, 49, 49, 44, 51, 51, 57, 46, 55, 53 },
+        { 36, 56, 44, 53, 56, 51, 44, 55, 50, 49, 46, 50, 50 },
+        { 36, 49, 51, 44, 52, 55, 53, 44, 48, 53, 55, 46, 56, 50 },
+        { 36, 51, 51, 44, 53, 56, 56, 44, 52, 52, 49, 46, 57, 56 },
+        { 36, 57, 57, 44, 57, 55, 57, 44, 55, 57, 52, 46, 48, 56 },
+        { 36, 57, 57, 44, 57, 51, 55, 44, 52, 51, 49, 46, 53, 56 },
+        { 36, 57, 57, 44, 51, 56, 54, 44, 55, 49, 57, 46, 48, 56 },
+        { 36, 51, 51, 44, 56, 53, 51, 44, 48, 50, 53, 46, 52, 55 },
+        { 36, 51, 52, 44, 48, 52, 54, 44, 52, 50, 54, 46, 54, 48 },
+        { 36, 51, 52, 44, 51, 49, 50, 44, 56, 48, 48, 46, 56, 55 },
+        { 36, 51, 52, 44, 51, 56, 55, 44, 53, 54, 52, 46, 55, 53 },
+        { 36, 51, 52, 44, 52, 54, 48, 44, 53, 51, 55, 46, 56, 55 },
+        { 36, 51, 52, 44, 53, 55, 57, 44, 49, 55, 53, 46, 49, 50 },
+        { 36, 51, 52, 44, 54, 53, 51, 44, 57, 51, 57, 46, 48, 50 },
+        { 36, 51, 52, 44, 56, 52, 55, 44, 51, 52, 48, 46, 49, 53 },
+        { 36, 51, 52, 44, 57, 50, 48, 44, 51, 49, 51, 46, 50, 55 },
+        { 36, 51, 53, 44, 48, 51, 56, 44, 57, 53, 48, 46, 53, 50 },
+        { 36, 51, 53, 44, 49, 49, 51, 44, 55, 49, 52, 46, 52, 49 },
+        { 36, 51, 53, 44, 49, 56, 54, 44, 54, 56, 55, 46, 53, 51 },
+        { 36, 51, 53, 44, 51, 48, 53, 44, 51, 50, 52, 46, 55, 56 },
+        { 36, 51, 53, 44, 51, 56, 48, 44, 48, 56, 56, 46, 54, 55 },
+        { 36, 51, 53, 44, 52, 53, 51, 44, 48, 54, 49, 46, 55, 57 },
+        { 36, 51, 53, 44, 53, 55, 49, 44, 54, 57, 57, 46, 48, 53 },
+        { 36, 51, 53, 44, 53, 55, 51, 44, 52, 56, 57, 46, 56, 49 },
+        { 36, 51, 53, 44, 54, 52, 54, 44, 52, 54, 50, 46, 57, 51 },
+        { 36, 51, 53, 44, 56, 51, 57, 44, 56, 54, 52, 46, 48, 55 },
+        { 36, 51, 53, 44, 57, 49, 50, 44, 56, 51, 55, 46, 50, 48 },
+        { 36, 51, 54, 44, 48, 51, 49, 44, 52, 55, 52, 46, 52, 53 },
+        { 36, 51, 54, 44, 49, 48, 54, 44, 50, 51, 56, 46, 51, 51 },
+        { 36, 51, 54, 44, 49, 55, 57, 44, 50, 49, 49, 46, 52, 53 },
+        { 36, 51, 54, 44, 50, 57, 55, 44, 56, 52, 56, 46, 55, 48 },
+        { 36, 51, 54, 44, 51, 55, 50, 44, 54, 49, 50, 46, 53, 57 },
+        { 36, 51, 54, 44, 53, 54, 52, 44, 50, 50, 50, 46, 57, 55 },
+        { 36, 51, 54, 44, 53, 54, 54, 44, 48, 49, 51, 46, 55, 51 },
+        { 36, 51, 54, 44, 54, 51, 56, 44, 57, 56, 54, 46, 56, 53 },
+        { 36, 51, 54, 44, 55, 53, 55, 44, 54, 50, 52, 46, 49, 48 },
+        { 36, 51, 54, 44, 56, 51, 50, 44, 51, 56, 55, 46, 57, 57 },
+        { 36, 51, 54, 44, 57, 48, 53, 44, 51, 54, 49, 46, 49, 49 },
+        { 36, 51, 55, 44, 48, 50, 51, 44, 57, 57, 56, 46, 51, 55 },
+        { 36, 51, 55, 44, 48, 57, 56, 44, 55, 54, 50, 46, 50, 53 },
+        { 36, 51, 55, 44, 49, 55, 49, 44, 55, 51, 53, 46, 51, 55 },
+        { 36, 51, 55, 44, 50, 57, 48, 44, 51, 55, 50, 46, 54, 50 },
+        { 36, 51, 55, 44, 51, 54, 53, 44, 49, 51, 54, 46, 53, 50 },
+        { 36, 51, 55, 44, 53, 53, 56, 44, 53, 51, 55, 46, 54, 53 },
+        { 36, 51, 55, 44, 54, 51, 49, 44, 53, 49, 48, 46, 55, 55 },
+        { 36, 51, 55, 44, 55, 53, 48, 44, 49, 52, 56, 46, 48, 50 },
+        { 36, 51, 55, 44, 56, 50, 52, 44, 57, 49, 49, 46, 57, 49 },
+        { 36, 51, 55, 44, 56, 57, 55, 44, 56, 56, 53, 46, 48, 51 },
+        { 36, 51, 56, 44, 48, 49, 54, 44, 53, 50, 50, 46, 50, 56 },
+        { 36, 51, 56, 44, 48, 57, 49, 44, 50, 56, 54, 46, 49, 55 },
+        { 36, 51, 56, 44, 49, 54, 52, 44, 50, 53, 57, 46, 50, 57 },
+        { 36, 51, 56, 44, 50, 56, 50, 44, 56, 57, 54, 46, 53, 53 },
+        { 36, 51, 56, 44, 50, 56, 52, 44, 54, 56, 55, 46, 51, 49 },
+        { 36, 51, 56, 44, 51, 53, 55, 44, 54, 54, 48, 46, 52, 51 },
+        { 36, 51, 56, 44, 53, 53, 49, 44, 48, 54, 49, 46, 53, 55 },
+        { 36, 51, 56, 44, 54, 50, 52, 44, 48, 51, 52, 46, 55, 48 },
+        { 36, 51, 56, 44, 55, 52, 50, 44, 54, 55, 49, 46, 57, 53 },
+        { 36, 51, 56, 44, 56, 49, 55, 44, 52, 51, 53, 46, 56, 51 },
+        { 36, 51, 56, 44, 56, 57, 48, 44, 52, 48, 56, 46, 57, 53 },
+        { 36, 51, 57, 44, 48, 48, 57, 44, 48, 52, 54, 46, 50, 48 },
+        { 36, 51, 57, 44, 48, 56, 51, 44, 56, 49, 48, 46, 48, 57 },
+        { 36, 51, 57, 44, 50, 55, 53, 44, 52, 50, 48, 46, 52, 55 },
+        { 36, 51, 57, 44, 50, 55, 55, 44, 50, 49, 49, 46, 50, 51 },
+        { 36, 51, 57, 44, 51, 53, 48, 44, 49, 56, 52, 46, 51, 53 },
+        { 36, 51, 57, 44, 52, 54, 56, 44, 56, 50, 49, 46, 54, 48 },
+        { 36, 51, 57, 44, 53, 52, 51, 44, 53, 56, 53, 46, 52, 57 },
+        { 36, 51, 57, 44, 54, 49, 54, 44, 53, 53, 56, 46, 54, 49 },
+        { 36, 51, 57, 44, 55, 51, 53, 44, 49, 57, 53, 46, 56, 55 },
+        { 36, 51, 57, 44, 56, 48, 57, 44, 57, 53, 57, 46, 55, 53 },
+        { 36, 51, 57, 44, 56, 56, 50, 44, 57, 51, 50, 46, 56, 55 },
+        { 36, 52, 48, 44, 48, 48, 49, 44, 53, 55, 48, 46, 49, 50 },
+        { 36, 52, 48, 44, 48, 55, 54, 44, 51, 51, 52, 46, 48, 50 },
+        { 36, 52, 48, 44, 50, 54, 57, 44, 55, 51, 53, 46, 49, 53 },
+        { 36, 52, 48, 44, 51, 52, 50, 44, 55, 48, 56, 46, 50, 55 },
+        { 36, 52, 48, 44, 52, 54, 49, 44, 51, 52, 53, 46, 53, 50 },
+        { 36, 52, 48, 44, 53, 51, 54, 44, 49, 48, 57, 46, 52, 49 },
+        { 36, 52, 48, 44, 54, 48, 57, 44, 48, 56, 50, 46, 53, 51 },
+        { 36, 52, 48, 44, 55, 50, 55, 44, 55, 49, 57, 46, 55, 56 },
+        { 36, 52, 48, 44, 56, 48, 50, 44, 52, 56, 51, 46, 54, 55 },
+        { 36, 52, 48, 44, 56, 55, 53, 44, 52, 53, 54, 46, 55, 57 },
+        { 36, 52, 48, 44, 57, 57, 52, 44, 48, 57, 52, 46, 48, 53 },
+        { 36, 52, 48, 44, 57, 57, 53, 44, 56, 56, 52, 46, 56, 49 },
+        { 36, 52, 49, 44, 48, 54, 56, 44, 56, 53, 55, 46, 57, 51 },
+        { 36, 52, 49, 44, 50, 54, 50, 44, 50, 53, 57, 46, 48, 55 },
+        { 36, 52, 49, 44, 51, 51, 53, 44, 50, 51, 50, 46, 50, 48 },
+        { 36, 52, 49, 44, 52, 53, 51, 44, 56, 54, 57, 46, 52, 53 },
+        { 36, 52, 49, 44, 53, 50, 56, 44, 54, 51, 51, 46, 51, 51 },
+        { 36, 52, 49, 44, 54, 48, 49, 44, 54, 48, 54, 46, 52, 53 },
+        { 36, 52, 49, 44, 55, 50, 48, 44, 50, 52, 51, 46, 55, 48 },
+        { 36, 52, 49, 44, 55, 57, 53, 44, 48, 48, 55, 46, 53, 57 },
+        { 36, 52, 49, 44, 57, 56, 54, 44, 54, 49, 55, 46, 57, 55 },
+        { 36, 52, 50, 44, 48, 51, 52, 44, 48, 55, 50, 46, 56, 55 },
+        { 36, 52, 50, 44, 49, 48, 55, 44, 48, 52, 53, 46, 57, 56 },
+        { 36, 52, 50, 44, 49, 51, 52, 44, 51, 53, 52, 46, 57, 56 },
+    };
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DecimalFormat/RoundingAndPropertyTest.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,795 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/* @test
+ * @bug 7050528
+ * @summary Test java.text.DecimalFormat fast-path for format(double...)
+ * @author Olivier Lagneau
+ * @run main RoundingAndPropertyTest
+ *
+ */
+
+/* -----------------------------------------------------------------------------
+ * Note :
+ *  Since fast-path algorithm   does not modify  any feature  of DecimalFormat,
+ *  some tests or  values in this program  may have to be adapted/added/removed
+ *  when any change has been done in the fast-path source  code, because the
+ *  conditions for exercising fast-path may change.
+ *
+ *  This is specially true if the set of constraints to fall in the fast-path
+ *  case is relaxed in any manner.
+ *
+ * Usage :
+ *  - Run main without any argument to test against a set of golden values and
+ *    associated results hard-coded in the source code. That will do the tests
+ *    described below
+ *    See below comment section named "Description".
+ *
+ *  or
+ *
+ *  - Run main with string argument "-gengold" to output source code of
+ *    GoldenFormattedValues.java class file with the jdk version used while
+ *    generating the code.
+ *    See below comment section named : "Modifying Golden Values".
+ *
+ *  In case of error while running the test, a Runtime exception is generated
+ *  providing the numbers of errors detected (format of golden values checks and
+ *  property changes checks), and the program exit.
+ *
+ * Description :
+ *
+ *  This test first checks that localization of digits is done correctly when
+ *  calling DecimalFormat.format() on the array of values DecimalLocalizationValues
+ *  found in GoldenDoubleValues, using the locale FullLocalizationTestLocale
+ *  (from GoldenDoubleValues) that implies localization of digits. it checks the
+ *  the results against expected returned string. In case of formatting error,
+ *  it provides a message informing which value was wrongly formatted.
+ *
+ *  Then it checks the results of  calling NumberFormat.format(double) on a set
+ *  of  predefined golden values and  checks results against expected returned
+ *  string.  It does this both for the  decimal case, with an instance returned
+ *  NumberFormat.getInstance() call and for the currency case, with an instance
+ *  returned by NumberFormat.getCurrencyInstance(). Almost all the tested  double
+ *  values satisfy the constraints assumed by the fast-path algorithm for
+ *  format(double ...). Some  are voluntarily outside the scope of fast-path to
+ *  check that the algorithm correctly eliminate them. In case of formatting
+ *  error a message provides information on the golden value raising the error
+ *  (value, exact decimal value (using BidDecimal), expected result, formatted result).
+ *
+ *  Last  the test checks the status and  behavior of a DecimalFormat instance
+ *  when changing  properties that  make this  instance  satisfy/invalidate its
+ *  fast-path status, depending on the predefined  set of fast-path constraints.
+ *
+ *  The golden  results are predefined arrays  of  int[] containing the unicode
+ *  ints of the chars  in  the expected  formatted  string, when  using  locale
+ *  provided in  GoldenDoubleValues class. The   results are those obtained  by
+ *  using a reference jdk  version (for example  one that does not contains the
+ *  DecimalFormat fast-path algorithm, like jdk80-b25).
+ *
+ *  The double values from which we get golden results are stored inside two
+ *  arrays of double values:
+ *  - DecimalGoldenValues  for testing NumberFormat.getInstance().
+ *  - CurrencyGoldenValues for testing NumberFormat.getCurrencyInstance().
+ *  These arrays are located in GoldenDoubleValues.java source file.
+ *
+ *  For each double value in the arrays above, there is an associated golden
+ *  result. These results are stored in arrays of int[]:
+ *  - DecimalGoldenFormattedValues  for expected decimal golden results.
+ *  - CurrencyGoldenFormattedValues for expected currency golden results.
+ *  - DecimalDigitsLocalizedFormattedValues for expected localized digit results.
+ *
+ *  We store the results in int[] arrays containing the expected unicode values
+ *  because the  compiler that will compile the  containing java file may use a
+ *  different locale than the one registered in GoldenDoubleValues.java.  These
+ *  arrays are  located in  a  separate GoldenFormattedValues.java  source file
+ *  that is generated  by  RoundingAndPropertyTest using  "-gengold"  parameter.
+ *  See below "Modifying Golden Values".
+ *
+ *  The golden value arrays can be expanded, modified ... to test additional
+ *  or different double values. In that case, the source file of class
+ *  GoldenFormattedValues must be regenerated to replace the existing one..
+ *
+ * Modifying Golden Values :
+ *
+ *  In order to ease further modification of the list of double values checked
+ *  and associated golden results, the test includes the method
+ *  generatesGoldenFormattedValuesClass() that writes on standard output stream
+ *  the source code for GoldenFormattedValues class that includes the expected
+ *  results arrays.
+ *
+ *  Here are the steps to follow for updating/modifying golden values and results:
+ *   1- Edit GoldenDoubleValues.java to add/remove/modify golden or localization
+ *      values.
+ *   2- Run main with "-gengold" string argument with a target jdk.
+ *      (at the creation of this test file, the target jdk used was jdk1.8.0-ea).
+ *   2- Copy this java code that has been writen on standard output and replace
+ *      GoldenFormattedValues.java contents by the generated output.
+ *   3- Check that this updated code compiles.
+ *  [4]- If needed replaces existing GoldenDoubleValues and GoldenFormattedValues
+ *      files in jdk/test section, respectively by the one modified at step 1 and
+ *      generated at step 2.
+ * -----------------------------------------------------------------------------
+ */
+
+import java.util.*;
+import java.text.NumberFormat;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.math.RoundingMode;
+import java.math.BigDecimal;
+
+
+public class RoundingAndPropertyTest {
+
+
+    // Prints on standard output stream the unicode values of chars as a
+    // comma-separated list of int values
+    private static void printUnicodeValuesArray(char[] chars) {
+        for (int i = 0; i < chars.length; i++) {
+            System.out.print((int) chars[i]);
+            if (i != (chars.length - 1))
+                System.out.print(", ");
+        }
+    }
+
+    // Converts given array of unicode values as an array of chars.
+    // Returns this converted array.
+    private static char[] getCharsFromUnicodeArray(int[] unicodeValues) {
+        char[] chars = new char[unicodeValues.length];
+
+        for (int i = 0; i < unicodeValues.length; i++) {
+            chars[i] = (char) unicodeValues[i];
+        }
+        return chars;
+    }
+
+    /* Prints on standard output stream the java code of resulting
+     * GoldenFormattedValues class for the golden values found in
+     * class GoldenDoubleValues.
+     */
+    private static void generatesGoldenFormattedValuesClass() {
+
+        String fourWhiteSpaces    = "    ";
+        String eightWhiteSpaces   = "        ";
+
+        // Prints header without Copyright header.
+        System.out.println("/* This is a machine generated file - Please DO NOT EDIT !");
+        System.out.println(" * Change RoundingAndPropertyTest instead,");
+        System.out.println(" * and run with \"-gengold\" argument to regenerate (without copyright header).");
+        System.out.println(" */");
+        System.out.println();
+
+        System.out.println("/* This file contains the set of result Strings expected from calling inside");
+        System.out.println(" * RoundingAndPropertyTest the method NumberFormat.format() upon the set of");
+        System.out.println(" * double values provided in GoldenDoubleValues.java. It contains three arrays,");
+        System.out.println(" * each containing arrays of unicode values representing the expected string");
+        System.out.println(" * result when calling format() on the corresponding (i.e. same index) double");
+        System.out.println(" * value found in GoldenDoubleValues arrays :");
+        System.out.println(" * - DecimalDigitsLocalizedFormattedValues corresponds to DecimalLocalizationValues,");
+        System.out.println(" *   when using FullLocalizationTestLocale to format.");
+        System.out.println(" * - DecimalGoldenFormattedValues corresponds to DecimalGoldenValues, when used");
+        System.out.println(" *   in the decimal pattern case together with TestLocale.");
+        System.out.println(" * - CurrencyGoldenFormattedValues corresponds to CurrencyGoldenValues. when used");
+        System.out.println(" *   in the currency pattern case together with TestLocale.");
+        System.out.println(" * Please see documentation in RoundingAndPropertyTest.java for more details.");
+        System.out.println(" *");
+        System.out.println(" * This file generated by running RoundingAndPropertyTest with \"-gengold\" argument.");
+        System.out.println(" */");
+        System.out.println();
+
+        // Prints beginning of class GoldenFormattedValues.
+        System.out.println("class GoldenFormattedValues {");
+        System.out.println();
+        System.out.println(
+            fourWhiteSpaces +
+            "// The formatted values below were generated from golden values");
+        System.out.print(
+            fourWhiteSpaces +
+            "// listed in GoldenDoubleValues.java,");
+        System.out.println(" using the following jvm version :");
+        System.out.println(
+            fourWhiteSpaces + "//   " +
+            System.getProperty("java.vendor") +
+            " " +
+            System.getProperty("java.vm.name") +
+            " " +
+            System.getProperty("java.version"));
+        System.out.println(
+            fourWhiteSpaces +
+            "//   locale for golden double values : " + GoldenDoubleValues.TestLocale);
+        System.out.println(
+            fourWhiteSpaces +
+            "//   locale for testing digit localization : " + GoldenDoubleValues.FullLocalizationTestLocale);
+        System.out.println();
+
+        // Prints the expected results when digit localization happens
+        System.out.println(
+            fourWhiteSpaces +
+            "// The array of int[] unicode values storing the expected results");
+        System.out.print(
+            fourWhiteSpaces +
+            "// when experiencing full localization of digits");
+        System.out.println(" on DecimalLocalizationValues.");
+        System.out.println(
+            fourWhiteSpaces +
+            "static int[][] DecimalDigitsLocalizedFormattedValues = {");
+        NumberFormat df =
+            NumberFormat.getInstance(GoldenDoubleValues.FullLocalizationTestLocale);
+        for (int i = 0;
+             i < GoldenDoubleValues.DecimalLocalizationValues.length;
+             i++) {
+            double d = GoldenDoubleValues.DecimalLocalizationValues[i];
+            String formatted = df.format(d);
+            char[] decFmtChars = formatted.toCharArray();
+
+            System.out.print(eightWhiteSpaces + "{ ");
+            printUnicodeValuesArray(decFmtChars);
+            System.out.println(" },");
+        }
+        System.out.println(fourWhiteSpaces + "};");
+        System.out.println();
+
+        // Prints the golden expected results for the decimal pattern case
+        System.out.println(
+            fourWhiteSpaces +
+            "// The array of int[] unicode values storing the expected results");
+        System.out.print(
+            fourWhiteSpaces +
+            "// when calling Decimal.format(double)");
+        System.out.println(" on the decimal GoldenDoubleValues.");
+        System.out.println(
+            fourWhiteSpaces +
+            "static int[][] DecimalGoldenFormattedValues = {");
+        df = NumberFormat.getInstance(GoldenDoubleValues.TestLocale);
+        for (int i = 0;
+             i < GoldenDoubleValues.DecimalGoldenValues.length;
+             i++) {
+            double d = GoldenDoubleValues.DecimalGoldenValues[i];
+            String formatted = df.format(d);
+            char[] decFmtChars = formatted.toCharArray();
+
+            System.out.print(eightWhiteSpaces + "{ ");
+            printUnicodeValuesArray(decFmtChars);
+            System.out.println(" },");
+        }
+        System.out.println(fourWhiteSpaces + "};");
+        System.out.println();
+
+        // Prints the golden expected results for the currency pattern case
+        System.out.println(
+            fourWhiteSpaces +
+            "// The array of int[] unicode values storing the expected results");
+        System.out.print(
+            fourWhiteSpaces +
+            "// when calling Decimal.format(double)");
+        System.out.println(" on the currency GoldenDoubleValues.");
+        System.out.println(
+            fourWhiteSpaces +
+            "static int[][] CurrencyGoldenFormattedValues = {");
+        NumberFormat cf =
+            NumberFormat.getCurrencyInstance(GoldenDoubleValues.TestLocale);
+        for (int i = 0;
+             i < GoldenDoubleValues.CurrencyGoldenValues.length;
+             i++) {
+            double d = GoldenDoubleValues.CurrencyGoldenValues[i];
+            String formatted = cf.format(d);
+            char[] decFmtChars = formatted.toCharArray();
+
+            System.out.print(eightWhiteSpaces + "{ ");
+            printUnicodeValuesArray(decFmtChars);
+            System.out.println(" },");
+        }
+        System.out.println(fourWhiteSpaces + "};");
+        System.out.println();
+
+        // Prints end of GoldenFormattedValues class.
+        System.out.println("}");
+    }
+
+    private static int testLocalizationValues() {
+
+        DecimalFormat df = (DecimalFormat)
+            NumberFormat.getInstance(GoldenDoubleValues.FullLocalizationTestLocale);
+
+        double[] localizationValues = GoldenDoubleValues.DecimalLocalizationValues;
+        int size = localizationValues.length;
+        int successCounter = 0;
+        int failureCounter = 0;
+        for (int i = 0; i < size; i++) {
+
+            double d = localizationValues[i];
+            String formatted = df.format(d);
+
+            char[] expectedUnicodeArray =
+                getCharsFromUnicodeArray(
+                    GoldenFormattedValues.DecimalDigitsLocalizedFormattedValues[i]);
+            String expected = new String(expectedUnicodeArray);
+
+            if (!formatted.equals(expected)) {
+                failureCounter++;
+                System.out.println(
+                    "--- Localization error for value d = " + d +
+                    ". Exact value = " + new BigDecimal(d).toString() +
+                    ". Expected result = " + expected +
+                    ". Output result = " + formatted);
+            } else successCounter++;
+        }
+        System.out.println("Checked positively " + successCounter +
+                           " golden decimal values out of " + size +
+                           " tests. There were " + failureCounter +
+                           " format failure");
+
+        return failureCounter;
+    }
+
+    private static int testGoldenValues(java.text.DecimalFormat df,
+                                        java.text.DecimalFormat cf) {
+
+        double[] goldenDecimalValues = GoldenDoubleValues.DecimalGoldenValues;
+        int decimalSize = goldenDecimalValues.length;
+        int decimalSuccessCounter = 0;
+        int decimalFailureCounter = 0;
+        for (int i = 0; i < decimalSize; i++) {
+
+            double d = goldenDecimalValues[i];
+            String formatted = df.format(d);
+
+            char[] expectedUnicodeArray =
+                getCharsFromUnicodeArray(
+                    GoldenFormattedValues.DecimalGoldenFormattedValues[i]);
+            String expected = new String(expectedUnicodeArray);
+
+            if (!formatted.equals(expected)) {
+                decimalFailureCounter++;
+                System.out.println(
+                    "--- Error for golden value d = " + d +
+                    ". Exact value = " + new BigDecimal(d).toString() +
+                    ". Expected result = " + expected +
+                    ". Output result = " + formatted);
+            } else decimalSuccessCounter++;
+        }
+        System.out.println("Checked positively " + decimalSuccessCounter +
+                           " golden decimal values out of " + decimalSize +
+                           " tests. There were " + decimalFailureCounter +
+                           " format failure");
+
+        double[] goldenCurrencyValues = GoldenDoubleValues.CurrencyGoldenValues;
+        int currencySize = goldenCurrencyValues.length;
+        int currencySuccessCounter = 0;
+        int currencyFailureCounter = 0;
+        for (int i = 0; i < currencySize; i++) {
+            double d = goldenCurrencyValues[i];
+            String formatted = cf.format(d);
+
+            char[] expectedUnicodeArray =
+                getCharsFromUnicodeArray(
+                    GoldenFormattedValues.CurrencyGoldenFormattedValues[i]);
+            String expected = new String(expectedUnicodeArray);
+
+            if (!formatted.equals(expected)) {
+                currencyFailureCounter++;
+                System.out.println(
+                    "--- Error for golden value d = " + d +
+                    ". Exact value = " + new BigDecimal(d).toString() +
+                    ". Expected result = " + expected +
+                    ". Output result = " + formatted);
+            } else currencySuccessCounter++;
+        }
+        System.out.println("Checked positively " + currencySuccessCounter +
+                           " golden currency values out of " + currencySize +
+                           " tests. There were " + currencyFailureCounter +
+                           " format failure");
+
+        return (decimalFailureCounter + currencyFailureCounter);
+    }
+
+    // Checks that the two passed s1 and s2 string are equal, and prints
+    // out message in case of error.
+    private static boolean resultsEqual(String propertyName,
+                                        String s1,
+                                        String s2) {
+
+        boolean equality = s1.equals(s2);
+        if (!equality)
+            System.out.println(
+                "\n*** Error while reverting to default " +
+                propertyName + " property.\n" +
+                "    initial output = " + s1 +
+                ". reverted output = " + s2 + ".");
+        else System.out.println(" Test passed.");
+
+        return equality;
+
+    }
+
+    /* This methods checks the behaviour of the management of properties
+     * of a DecimalFormat instance that satisfies fast-path constraints.
+     *
+     * It does this by comparing the results of the format(double) output
+     * obtained from initial fast-path state with the output provided by
+     * the same instance that has been pushed and exercised outside
+     * fast-path rules and finally "reverted" to its initial fast-path state.
+     *
+     * The schema of actions is this :
+     *  - Call format(double) on a known DecimalFormat fast-path instance,
+     *    and store this result.
+     *  - Record the current state of a given property.
+     *  - Change the property to invalidate the fast-path state.
+     *  - Call again format(double) on the instance.
+     *  - Revert state of property to validate again fast-path context.
+     *  - Call format(double) again.
+     *  - Check that first and last call to format(double) provide same result
+     *  - Record failure if any.
+     *  - Do the same for another property with the same instance.
+     * So all the property changes are chained one after the other on only the
+     * same instance.
+     *
+     * Some properties that currently do not influence the fast-path state
+     * are also tested. This is not useful with current fast-path source
+     * but is here for testing the whole set of properties. This is the case
+     * for prefixes and suffixes, and parseBigDecimal properties.
+     */
+    private static int testSettersAndFastPath(DecimalFormat df,
+                                               boolean isCurrency) {
+
+        final double d1 = GoldenDoubleValues.PROPERTY_CHECK_POSITIVE_VALUE;
+        final double d2 = GoldenDoubleValues.PROPERTY_CHECK_NEGATIVE_VALUE;
+
+        int errors = 0;
+        boolean testSucceeded = false;
+        String firstFormatResult;
+        String secondFormatResult;
+        String propertyName;
+
+        // ---- positivePrefix property test ----
+        testSucceeded = false;
+        propertyName = "positivePrefix";
+        System.out.print("Checking " + propertyName + " property.");
+        String initialPrefix = df.getPositivePrefix();
+        firstFormatResult = df.format(d1);
+        df.setPositivePrefix("positivePrefix:");
+        df.format(d1);
+        df.setPositivePrefix(initialPrefix);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- positiveSuffix property test ----
+        testSucceeded = false;
+        propertyName = "positiveSuffix";
+        System.out.print("Checking " + propertyName + " property.");
+        String initialSuffix = df.getPositiveSuffix();
+        firstFormatResult = df.format(d1);
+        df.setPositiveSuffix("positiveSuffix:");
+        df.format(d1);
+        df.setPositiveSuffix(initialSuffix);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName,firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- negativePrefix property test ----
+        testSucceeded = false;
+        propertyName = "negativePrefix";
+        System.out.print("Checking " + propertyName + " property.");
+        initialPrefix = df.getNegativePrefix();
+        firstFormatResult = df.format(d1);
+        df.setNegativePrefix("negativePrefix:");
+        df.format(d1);
+        df.setNegativePrefix(initialPrefix);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- negativeSuffix property test ----
+        testSucceeded = false;
+        propertyName = "negativeSuffix";
+        System.out.print("Checking " + propertyName + " property.");
+        initialSuffix = df.getNegativeSuffix();
+        firstFormatResult = df.format(d1);
+        df.setNegativeSuffix("negativeSuffix:");
+        df.format(d1);
+        df.setNegativeSuffix(initialSuffix);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- multiplier property test ----
+        testSucceeded = false;
+        propertyName = "multiplier";
+        System.out.print("Checking " + propertyName + " property.");
+        int initialMultiplier = df.getMultiplier();
+        firstFormatResult = df.format(d1);
+        df.setMultiplier(10);
+        df.format(d1);
+        df.setMultiplier(initialMultiplier);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- groupingUsed property test ----
+        testSucceeded = false;
+        propertyName = "groupingUsed";
+        System.out.print("Checking " + propertyName + " property.");
+        boolean initialGroupingUsed = df.isGroupingUsed();
+        firstFormatResult = df.format(d1);
+        df.setGroupingUsed(!initialGroupingUsed);
+        df.format(d1);
+        df.setGroupingUsed(initialGroupingUsed);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- groupingSize property test ----
+        testSucceeded = false;
+        propertyName = "groupingSize";
+        System.out.print("Checking " + propertyName + " property.");
+        int initialGroupingSize = df.getGroupingSize();
+        firstFormatResult = df.format(d1);
+        df.setGroupingSize(initialGroupingSize + 1);
+        df.format(d1);
+        df.setGroupingSize(initialGroupingSize);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- decimalSeparatorAlwaysShown property test ----
+        testSucceeded = false;
+        propertyName = "decimalSeparatorAlwaysShown";
+        System.out.print("Checking " + propertyName + " property.");
+        boolean initialDSShown = df.isDecimalSeparatorAlwaysShown();
+        firstFormatResult = df.format(d1);
+        df.setDecimalSeparatorAlwaysShown(!initialDSShown);
+        df.format(d1);
+        df.setDecimalSeparatorAlwaysShown(initialDSShown);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- parseBigDecimal property test ----
+        testSucceeded = false;
+        propertyName = "parseBigDecimal";
+        System.out.print("Checking " + propertyName + " property.");
+        boolean initialParseBigdecimal = df.isParseBigDecimal();
+        firstFormatResult = df.format(d1);
+        df.setParseBigDecimal(!initialParseBigdecimal);
+        df.format(d1);
+        df.setParseBigDecimal(initialParseBigdecimal);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- maximumIntegerDigits property test ----
+        testSucceeded = false;
+        propertyName = "maximumIntegerDigits";
+        System.out.print("Checking " + propertyName + " property.");
+        int initialMaxIDs = df.getMaximumIntegerDigits();
+        firstFormatResult = df.format(d1);
+        df.setMaximumIntegerDigits(8);
+        df.format(d1);
+        df.setMaximumIntegerDigits(initialMaxIDs);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- minimumIntegerDigits property test ----
+        testSucceeded = false;
+        propertyName = "minimumIntegerDigits";
+        System.out.print("Checking " + propertyName + " property.");
+        int initialMinIDs = df.getMinimumIntegerDigits();
+        firstFormatResult = df.format(d1);
+        df.setMinimumIntegerDigits(2);
+        df.format(d1);
+        df.setMinimumIntegerDigits(initialMinIDs);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- maximumFractionDigits property test ----
+        testSucceeded = false;
+        propertyName = "maximumFractionDigits";
+        System.out.print("Checking " + propertyName + " property.");
+        firstFormatResult = df.format(d1);
+        df.setMaximumFractionDigits(8);
+        df.format(d1);
+        if (isCurrency) {
+            df.setMinimumFractionDigits(2);
+            df.setMaximumFractionDigits(2);
+        } else {
+            df.setMinimumFractionDigits(0);
+            df.setMaximumFractionDigits(3);
+        }
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- minimumFractionDigits property test ----
+        testSucceeded = false;
+        propertyName = "minimumFractionDigits";
+        System.out.print("Checking " + propertyName + " property.");
+        firstFormatResult = df.format(d1);
+        df.setMinimumFractionDigits(1);
+        df.format(d1);
+        if (isCurrency) {
+            df.setMinimumFractionDigits(2);
+            df.setMaximumFractionDigits(2);
+        } else {
+            df.setMinimumFractionDigits(0);
+            df.setMaximumFractionDigits(3);
+        }
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- currency property test ----
+        testSucceeded = false;
+        propertyName = "currency";
+        System.out.print("Checking " + propertyName + " property.");
+        Currency initialCurrency = df.getCurrency();
+        Currency japanCur = java.util.Currency.getInstance(Locale.JAPAN);
+        firstFormatResult = df.format(d1);
+        df.setCurrency(japanCur);
+        df.format(d1);
+        df.setCurrency(initialCurrency);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- roundingMode property test ----
+        testSucceeded = false;
+        propertyName = "roundingMode";
+        System.out.print("Checking " + propertyName + " property.");
+        RoundingMode initialRMode = df.getRoundingMode();
+        firstFormatResult = df.format(d1);
+        df.setRoundingMode(RoundingMode.HALF_UP);
+        df.format(d1);
+        df.setRoundingMode(RoundingMode.HALF_EVEN);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        // ---- decimalFormatSymbols property test ----
+        testSucceeded = false;
+        propertyName = "decimalFormatSymbols";
+        System.out.print("Checking " + propertyName + " property.");
+        DecimalFormatSymbols initialDecimalFormatSymbols = df.getDecimalFormatSymbols();
+        firstFormatResult = df.format(d1);
+        Locale bizarreLocale = new Locale("fr", "FR");
+        DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(bizarreLocale);
+        unusualSymbols.setDecimalSeparator('@');
+        unusualSymbols.setGroupingSeparator('|');
+        df.setDecimalFormatSymbols(unusualSymbols);
+        df.format(d1);
+        df.setDecimalFormatSymbols(initialDecimalFormatSymbols);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        testSucceeded = false;
+        System.out.print("Checking " + propertyName + " property.");
+        initialDecimalFormatSymbols = df.getDecimalFormatSymbols();
+        firstFormatResult = df.format(d1);
+        Locale japanLocale = Locale.JAPAN;
+        unusualSymbols = new DecimalFormatSymbols(japanLocale);
+        unusualSymbols.setDecimalSeparator('9');
+        unusualSymbols.setGroupingSeparator('0');
+        df.setDecimalFormatSymbols(unusualSymbols);
+        df.format(d1);
+        df.setDecimalFormatSymbols(initialDecimalFormatSymbols);
+        secondFormatResult = df.format(d1);
+        testSucceeded =
+            resultsEqual(propertyName, firstFormatResult, secondFormatResult);
+        if (!testSucceeded)
+            errors++;
+
+        return errors;
+    }
+
+    // Main for RoundingAndPropertyTest. We test first the golden values,
+    // and then the property setters and getters.
+    public static void main(String[] args) {
+
+        if ((args.length >= 1) &&
+            (args[0].equals("-gengold")))
+            generatesGoldenFormattedValuesClass();
+        else {
+            System.out.println("\nChecking correctness of formatting with digit localization.");
+            System.out.println("=============================================================");
+            int localizationErrors = testLocalizationValues();
+            if (localizationErrors != 0)
+                System.out.println("*** Failure in localization tests : " +
+                                   localizationErrors + " errors detected ");
+            else System.out.println(" Tests for full localization of digits all passed.");
+
+            DecimalFormat df = (DecimalFormat)
+                NumberFormat.getInstance(GoldenDoubleValues.TestLocale);
+            DecimalFormat cf = (DecimalFormat)
+                NumberFormat.getCurrencyInstance(GoldenDoubleValues.TestLocale);
+
+            System.out.println("\nChecking correctness of formating for golden values.");
+            System.out.println("=============================================================");
+            int goldenValuesErrors = testGoldenValues(df,cf);
+            if (goldenValuesErrors != 0)
+                System.out.println("*** Failure in goldenValues tests : " +
+                                   goldenValuesErrors + " errors detected ");
+            else System.out.println(" Tests for golden values all passed.");
+
+            System.out.println("\nChecking behavior of property changes for decimal case.");
+            System.out.println("=============================================================");
+            int decimalTestsErrors = testSettersAndFastPath(df, false);
+            if (decimalTestsErrors != 0)
+                System.out.println("*** Failure in decimal property changes tests : " +
+                                   decimalTestsErrors + " errors detected ");
+            else System.out.println(" Tests for decimal property changes all passed.");
+
+            System.out.println("\nChecking behavior of property changes for currency case.");
+            System.out.println("=============================================================");
+            int currencyTestsErrors = testSettersAndFastPath(cf, true);
+            if (currencyTestsErrors != 0)
+                System.out.println("*** Failure in currency property changes tests : " +
+                                   currencyTestsErrors + " errors detected ");
+            else System.out.println(" Tests for currency property chamges all passed.");
+
+            if ((localizationErrors > 0) ||
+                (goldenValuesErrors > 0) ||
+                (decimalTestsErrors > 0) ||
+                (currencyTestsErrors > 0))
+                throw new RuntimeException(
+                    "Failed with " +
+                    (localizationErrors + goldenValuesErrors +
+                     decimalTestsErrors + currencyTestsErrors) +
+                    " error(s).");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Locale/Bug7069824.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,1006 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7069824
+ * @summary Verify implementation for Locale matching.
+ * @run main Bug7069824
+ */
+
+import java.util.*;
+import java.util.Locale.*;
+import static java.util.Locale.FilteringMode.*;
+import static java.util.Locale.LanguageRange.*;
+
+public class Bug7069824 {
+
+    static boolean err = false;
+
+    public static void main(String[] args) {
+        testLanguageRange();
+        testLocale();
+
+        if (err) {
+            throw new RuntimeException("Failed.");
+        }
+    }
+
+    private static void testLanguageRange() {
+        System.out.println("Test LanguageRange class...");
+        testConstants();
+        testConstructors();
+        testMethods();
+    }
+
+    private static void testLocale() {
+        System.out.println("Test Locale class...");
+        test_filter();
+        test_filterTags();
+        test_lookup();
+        test_lookupTag();
+    }
+
+    private static void testConstants() {
+        boolean error = false;
+
+        if (MIN_WEIGHT != 0.0) {
+            error = true;
+            System.err.println("    MIN_WEIGHT should be 0.0 but got "
+                + MIN_WEIGHT);
+        }
+
+        if (MAX_WEIGHT != 1.0) {
+            error = true;
+            System.err.println("    MAX_WEIGHT should be 1.0 but got "
+                + MAX_WEIGHT);
+        }
+
+        if (error) {
+            err = true;
+            System.err.println("  testConstants() failed.");
+        } else {
+            System.out.println("  testConstants() passed.");
+        }
+    }
+
+    private static void testConstructors() {
+        boolean error = false;
+
+        LanguageRange lr;
+        String range;
+        double weight;
+
+        range = null;
+        try {
+            lr = new LanguageRange(range);
+            error = true;
+            System.err.println("    NPE should be thrown for LanguageRange("
+                + range + ").");
+        }
+        catch (NullPointerException ex) {
+        }
+
+        range = null;
+        weight = 0.8;
+        try {
+            lr = new LanguageRange(range, weight);
+            error = true;
+            System.err.println("    NPE should be thrown for LanguageRange("
+                + range + ", " + weight + ").");
+        }
+        catch (NullPointerException ex) {
+        }
+
+        range = "elvish";
+        try {
+            lr = new LanguageRange(range);
+        }
+        catch (Exception ex) {
+            error = true;
+            System.err.println("    " + ex
+                + " should not be thrown for LanguageRange(" + range + ").");
+        }
+
+        range = "de-DE";
+        try {
+            lr = new LanguageRange(range);
+        }
+        catch (Exception ex) {
+            error = true;
+            System.err.println("    " + ex
+                + " should not be thrown for LanguageRange(" + range + ").");
+        }
+
+        range = "ar";
+        weight = 0.8;
+        try {
+            lr = new LanguageRange(range, weight);
+        }
+        catch (Exception ex) {
+            error = true;
+            System.err.println("    " + ex
+                + " should not be thrown for LanguageRange(" + range + ", "
+                + weight + ").");
+        }
+
+        range = "ja";
+        weight = -0.8;
+        try {
+            lr = new LanguageRange(range, weight);
+            error = true;
+            System.err.println("    IAE should be thrown for LanguageRange("
+                + range + ", " + weight + ").");
+        }
+        catch (IllegalArgumentException ex) {
+        }
+
+        range = "Elvish";
+        weight = 3.0;
+        try {
+            lr = new LanguageRange(range, weight);
+            error = true;
+            System.err.println("    IAE should be thrown for LanguageRange("
+                + range + ", " + weight + ").");
+        }
+        catch (IllegalArgumentException ex) {
+        }
+
+        String[] illformedRanges = {"-ja", "ja--JP", "en-US-", "a4r", "ar*",
+            "ar-*EG", "", "abcdefghijklmn", "ja-J=", "ja-opqrstuvwxyz"};
+        for (String r : illformedRanges) {
+            try {
+                lr = new LanguageRange(r);
+                error = true;
+                System.err.println("    IAE should be thrown for LanguageRange("
+                    + r + ").");
+            }
+            catch (IllegalArgumentException ex) {
+            }
+        }
+
+
+        if (error) {
+            err = true;
+            System.err.println("  testConstructors() failed.");
+        } else {
+            System.out.println("  testConstructors() passed.");
+        }
+    }
+
+    private static void testMethods() {
+        test_getRange();
+        test_getWeight();
+        test_equals();
+        test_parse();
+        test_mapEquivalents();
+    }
+
+    private static void test_getRange() {
+        boolean error = false;
+
+        String range = "ja";
+        double weight = 0.5;
+        LanguageRange lr = new LanguageRange(range, weight);
+        if (!lr.getRange().equals(range)) {
+             error = true;
+             System.err.println("    LanguageRange.getRange() returned unexpected value. Expected: "
+                 + range + ", got: " + lr.getRange());
+        }
+
+        range = "en-US";
+        weight = 0.5;
+        lr = new LanguageRange(range, weight);
+        if (!lr.getRange().equals(range.toLowerCase())) {
+             error = true;
+             System.err.println("    LanguageRange.getRange() returned unexpected value. Expected: "
+                 + range + ", got: " + lr.getRange());
+        }
+
+        if (error) {
+            err = true;
+            System.err.println("  test_getRange() failed.");
+        } else {
+            System.out.println("  test_getRange() passed.");
+        }
+    }
+
+    private static void test_getWeight() {
+        boolean error = false;
+
+        String range = "ja";
+        double weight = 0.5;
+        LanguageRange lr = new LanguageRange(range, weight);
+        if (lr.getWeight() != weight) {
+             error = true;
+             System.err.println("    LanguageRange.getWeight() returned unexpected value. Expected: "
+                 + weight + ", got: " + lr.getWeight());
+        }
+
+        range = "ja";
+        weight = MAX_WEIGHT; // default
+        lr = new LanguageRange(range);
+        if (!lr.getRange().equals(range) || lr.getWeight() != MAX_WEIGHT) {
+             error = true;
+             System.err.println("    LanguageRange.getWeight() returned unexpected value. Expected: "
+                 + weight + ", got: " + lr.getWeight());
+        }
+
+        if (error) {
+            err = true;
+            System.err.println("  test_getWeight() failed.");
+        } else {
+            System.out.println("  test_getWeight() passed.");
+        }
+    }
+
+    private static void test_equals() {
+        boolean error = false;
+
+        LanguageRange lr1 = new LanguageRange("ja", 1.0);
+        LanguageRange lr2 = new LanguageRange("ja");
+        LanguageRange lr3 = new LanguageRange("ja", 0.1);
+        LanguageRange lr4 = new LanguageRange("en", 1.0);
+
+        if (!lr1.equals(lr2)) {
+            error = true;
+            System.err.println("    LanguageRange(LR(ja, 1.0)).equals(LR(ja)) should return true.");
+        }
+
+        if (lr1.equals(lr3)) {
+            error = true;
+            System.err.println("    LanguageRange(LR(ja, 1.0)).equals(LR(ja, 0.1)) should return false.");
+        }
+
+        if (lr1.equals(lr4)) {
+            error = true;
+            System.err.println("    LanguageRange(LR(ja, 1.0)).equals(LR(en, 1.0)) should return false.");
+        }
+
+        if (lr1.equals(null)) {
+            error = true;
+            System.err.println("    LanguageRange(LR(ja, 1.0)).equals(null) should return false.");
+        }
+
+        if (lr1.equals("")) {
+            error = true;
+            System.err.println("    LanguageRange(LR(ja, 1.0)).equals(\"\") should return false.");
+
+        }
+
+        if (error) {
+            err = true;
+            System.err.println("  test_equals() failed.");
+        } else {
+            System.out.println("  test_equals() passed.");
+        }
+    }
+
+    private static void test_parse() {
+        boolean error = false;
+
+        List<LanguageRange> list;
+        String str = null;
+        try {
+            list = LanguageRange.parse(str);
+            error = true;
+            System.err.println("    NPE should be thrown for parse("
+                + str + ").");
+        }
+        catch (NullPointerException ex) {
+        }
+
+        str = "";
+        try {
+            list = LanguageRange.parse("");
+            error = true;
+            System.err.println("    IAE should be thrown for parse("
+                + str + ").");
+        }
+        catch (IllegalArgumentException ex) {
+        }
+
+        str = "ja;q=3";
+        try {
+            list = LanguageRange.parse(str);
+            error = true;
+            System.err.println("IAE should be thrown for parse("
+                 + str + ").");
+        }
+        catch (IllegalArgumentException ex) {
+        }
+
+        str = "Accept-Language: fr-FX,de-DE;q=0.5, fr-tp-x-FOO;q=0.1,"
+                  + "en-X-tp;q=0.6,en-FR;q=.7,de-de;q=0.8, iw;q=0.4, "
+                  + "he;q=0.4, de-de;q=0.5,ja, in-tpp, in-tp;q=0.2";
+        ArrayList<LanguageRange> expected = new ArrayList<>();
+        expected.add(new LanguageRange("fr-fx", 1.0));
+        expected.add(new LanguageRange("fr-fr", 1.0));
+        expected.add(new LanguageRange("ja", 1.0));
+        expected.add(new LanguageRange("in-tpp", 1.0));
+        expected.add(new LanguageRange("id-tpp", 1.0));
+        expected.add(new LanguageRange("en-fr", 0.7));
+        expected.add(new LanguageRange("en-fx", 0.7));
+        expected.add(new LanguageRange("en-x-tp", 0.6));
+        expected.add(new LanguageRange("de-de", 0.5));
+        expected.add(new LanguageRange("de-dd", 0.5));
+        expected.add(new LanguageRange("iw", 0.4));
+        expected.add(new LanguageRange("he", 0.4));
+        expected.add(new LanguageRange("in-tp", 0.2));
+        expected.add(new LanguageRange("id-tl", 0.2));
+        expected.add(new LanguageRange("id-tp", 0.2));
+        expected.add(new LanguageRange("in-tl", 0.2));
+        expected.add(new LanguageRange("fr-tp-x-foo", 0.1));
+        expected.add(new LanguageRange("fr-tl-x-foo", 0.1));
+        List<LanguageRange> got = LanguageRange.parse(str);
+        if (!areEqual(expected, got)) {
+            error = true;
+            System.err.println("    #1 parse() test failed.");
+        }
+
+        str = "Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1";
+        expected = new ArrayList<>();
+        expected.add(new LanguageRange("no-nyn", 1.0));
+        expected.add(new LanguageRange("nn", 1.0));
+        expected.add(new LanguageRange("no-bok-no", 0.9));
+        expected.add(new LanguageRange("nb-no", 0.9));
+        expected.add(new LanguageRange("hak-CN", 0.8));
+        expected.add(new LanguageRange("zh-hakka-CN", 0.8));
+        expected.add(new LanguageRange("i-hak-CN", 0.8));
+        expected.add(new LanguageRange("cmn-CN", 0.1));
+        expected.add(new LanguageRange("zh-cmn-CN", 0.1));
+        expected.add(new LanguageRange("zh-guoyu-CN", 0.1));
+        got = LanguageRange.parse(str);
+        if (!areEqual(expected, got)) {
+            error = true;
+            System.err.println("    #2 parse() test failed.");
+        }
+
+        str = "Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5";
+        expected = new ArrayList<>();
+        expected.add(new LanguageRange("no-bok-no", 0.9));
+        expected.add(new LanguageRange("nb-no", 0.9));
+        expected.add(new LanguageRange("rki", 0.4));
+        expected.add(new LanguageRange("ybd", 0.4));
+        expected.add(new LanguageRange("ccq", 0.4));
+        got = LanguageRange.parse(str);
+        if (!areEqual(expected, got)) {
+            error = true;
+            System.err.println("    #3 parse() test failed.");
+        }
+
+        if (error) {
+            err = true;
+            System.err.println("  test_parse() failed.");
+        } else {
+            System.out.println("  test_parse() passed.");
+        }
+    }
+
+    private static boolean areEqual(List<LanguageRange> expected,
+                                    List<LanguageRange> got) {
+        boolean error = false;
+
+        int expectedSize = expected.size();
+        int actualSize = got.size();
+
+        if (expectedSize != actualSize) {
+            error = true;
+
+            System.err.println("  Expected size=" + expectedSize);
+            for (LanguageRange lr : expected) {
+                System.err.println("    range=" + lr.getRange()
+                    + ", weight=" + lr.getWeight());
+            }
+
+            System.out.println("  Actual size=" + actualSize);
+            for (LanguageRange lr : got) {
+                System.err.println("    range=" + lr.getRange()
+                    + ", weight=" + lr.getWeight());
+            }
+        } else {
+            for (int i = 0; i < expectedSize; i++) {
+                LanguageRange lr1 = expected.get(i);
+                LanguageRange lr2 = got.get(i);
+
+                if (!lr1.getRange().equals(lr2.getRange())
+                    || lr1.getWeight() != lr2.getWeight()) {
+                    error = true;
+                    System.err.println("  " + i + ": Expected: range=" + lr1.getRange()
+                        + ", weight=" + lr1.getWeight());
+                    System.err.println("  " + i + ": Actual:   range=" + lr2.getRange()
+                        + ", weight=" + lr2.getWeight());
+                }
+            }
+        }
+
+        return !error;
+    }
+
+    private static void test_mapEquivalents() {
+        boolean error = false;
+
+        String ranges = "zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4";
+        List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+        HashMap<String, List<String>> map = null;
+
+        try {
+            List<LanguageRange> list =
+                LanguageRange.mapEquivalents(priorityList, null);
+        }
+        catch (Exception ex) {
+             error = true;
+             System.err.println(ex
+                 + " should not be thrown for mapEquivalents(priorityList, null).");
+        }
+
+        map = new HashMap<>();
+        try {
+            List<LanguageRange> list =
+                LanguageRange.mapEquivalents(priorityList, map);
+        }
+        catch (Exception ex) {
+             error = true;
+             System.err.println(ex
+                 + " should not be thrown for mapEquivalents(priorityList, empty map).");
+        }
+
+        ArrayList<String> equivalentList = new ArrayList<>();
+        equivalentList.add("ja");
+        equivalentList.add("ja-Hira");
+        map.put("ja", equivalentList);
+        try {
+            List<LanguageRange> list = LanguageRange.mapEquivalents(null, map);
+             error = true;
+             System.err.println("NPE should be thrown for mapEquivalents(null, map).");
+        }
+        catch (NullPointerException ex) {
+        }
+
+        map = new LinkedHashMap<>();
+        ArrayList<String> equivalentList1 = new ArrayList<>();
+        equivalentList1.add("ja");
+        equivalentList1.add("ja-Hira");
+        map.put("ja", equivalentList1);
+        ArrayList<String> equivalentList2 = new ArrayList<>();
+        equivalentList2.add("zh-Hans");
+        equivalentList2.add("zh-Hans-CN");
+        equivalentList2.add("zh-CN");
+        map.put("zh", equivalentList2);
+        ArrayList<String> equivalentList3 = new ArrayList<>();
+        equivalentList3.add("zh-TW");
+        equivalentList3.add("zh-Hant");
+        map.put("zh-TW", equivalentList3);
+        map.put("es", null);
+        ArrayList<String> equivalentList4 = new ArrayList<>();
+        map.put("en", equivalentList4);
+        ArrayList<String> equivalentList5 = new ArrayList<>();
+        equivalentList5.add("de");
+        map.put("zh-HK", equivalentList5);
+
+        ArrayList<LanguageRange> expected = new ArrayList<>();
+        expected.add(new LanguageRange("zh-hans", 1.0));
+        expected.add(new LanguageRange("zh-hans-cn", 1.0));
+        expected.add(new LanguageRange("zh-cn", 1.0));
+        expected.add(new LanguageRange("de", 1.0));
+        expected.add(new LanguageRange("ar", 0.9));
+        expected.add(new LanguageRange("zh-tw", 0.8));
+        expected.add(new LanguageRange("zh-hant", 0.8));
+        expected.add(new LanguageRange("ja-jp", 0.2));
+        expected.add(new LanguageRange("ja-hira-jp", 0.2));
+        List<LanguageRange> got =
+            LanguageRange.mapEquivalents(priorityList, map);
+
+        if (!areEqual(expected, got)) {
+            error = true;
+        }
+
+        if (error) {
+            err = true;
+            System.err.println("  test_mapEquivalents() failed.");
+        } else {
+            System.out.println("  test_mapEquivalents() passed.");
+        }
+    }
+
+    private static void test_filter() {
+        boolean error = false;
+
+        String ranges = "ja-JP, fr-FR";
+        String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        FilteringMode mode = EXTENDED_FILTERING;
+
+        List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+        List<Locale> tagList = generateLocales(tags);
+        String actualLocales =
+            showLocales(Locale.filter(priorityList, tagList, mode));
+        String expectedLocales = "ja-JP-hepburn, ja-Latn-JP";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#1 filter(" + mode + ")",
+                             ranges, tags, expectedLocales, actualLocales);
+        }
+
+
+        ranges = "ja-*-JP, fr-FR";
+        tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        mode = EXTENDED_FILTERING;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
+        expectedLocales = "ja-JP-hepburn, ja-Latn-JP";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#2 filter(" + mode + ")",
+                             ranges, tags, expectedLocales, actualLocales);
+        }
+
+
+        ranges = "ja-*-JP, fr-FR, de-de;q=0.2";
+        tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";
+        mode = AUTOSELECT_FILTERING;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
+        expectedLocales = "ja-JP-hepburn, ja-Latn-JP, de-DE";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#3 filter(" + mode + ")",
+                             ranges, tags,expectedLocales, actualLocales);
+        }
+
+        ranges = "ja-JP, fr-FR, de-de;q=0.2";
+        tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";
+        mode = AUTOSELECT_FILTERING;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
+        expectedLocales = "ja-JP-hepburn, de-DE";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#4 filter(" + mode + ")",
+                             ranges, tags, expectedLocales, actualLocales);
+        }
+
+
+        ranges = "en;q=0.2, ja-*-JP, fr-JP";
+        tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        mode = IGNORE_EXTENDED_RANGES;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
+        expectedLocales = "en";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#5 filter(" + mode + ")",
+                             ranges, tags, expectedLocales, actualLocales);
+        }
+
+
+        ranges = "en;q=0.2, ja-*-JP, fr-JP";
+        tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        mode = MAP_EXTENDED_RANGES;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
+        expectedLocales = "ja-JP-hepburn, en";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#6 filter(" + mode + ")",
+                             ranges, tags, expectedLocales, actualLocales);
+        }
+
+
+        ranges = "en;q=0.2, ja-JP, fr-JP";
+        tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        mode = REJECT_EXTENDED_RANGES;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
+        expectedLocales = "ja-JP-hepburn, en";
+
+        if (!expectedLocales.equals(actualLocales)) {
+            error = true;
+            showErrorMessage("#7 filter(" + mode + ")",
+                             ranges, tags, expectedLocales, actualLocales);
+        }
+
+
+        ranges = "en;q=0.2, ja-*-JP, fr-JP";
+        tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        mode = REJECT_EXTENDED_RANGES;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        try {
+            actualLocales =
+                showLocales(Locale.filter(priorityList, tagList, mode));
+            error = true;
+            System.out.println("IAE should be thrown for filter("
+                + mode + ").");
+        }
+        catch (IllegalArgumentException ex) {
+        }
+
+
+        ranges = "en;q=0.2, ja-*-JP, fr-JP";
+        tags = null;
+        mode = REJECT_EXTENDED_RANGES;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        try {
+            actualLocales =
+                showLocales(Locale.filter(priorityList, tagList, mode));
+            error = true;
+            System.out.println("NPE should be thrown for filter(tags=null).");
+        }
+        catch (NullPointerException ex) {
+        }
+
+
+        ranges = null;
+        tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+        mode = REJECT_EXTENDED_RANGES;
+
+        try {
+            priorityList = LanguageRange.parse(ranges);
+            tagList = generateLocales(tags);
+            actualLocales =
+                showLocales(Locale.filter(priorityList, tagList, mode));
+            error = true;
+            System.out.println("NPE should be thrown for filter(ranges=null).");
+        }
+        catch (NullPointerException ex) {
+        }
+
+
+        ranges = "en;q=0.2, ja-*-JP, fr-JP";
+        tags = "";
+        mode = REJECT_EXTENDED_RANGES;
+
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLocales(tags);
+        try {
+            actualLocales =
+                showLocales(Locale.filter(priorityList, tagList, mode));
+        }
+        catch (Exception ex) {
+            error = true;
+            System.out.println(ex
+                + " should not be thrown for filter(" + ranges + ", \"\").");
+        }
+
+
+        if (error) {
+            err = true;
+            System.out.println("  test_filter() failed.");
+        } else {
+            System.out.println("  test_filter() passed.");
+        }
+    }
+
+    private static void test_filterTags() {
+        boolean error = false;
+
+        String ranges = "en;q=0.2, *;q=0.6, ja";
+        String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";
+
+        List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+        List<String> tagList = generateLanguageTags(tags);
+        String actualTags =
+            showLanguageTags(Locale.filterTags(priorityList, tagList));
+        String expectedTags = tags;
+
+        if (!expectedTags.equals(actualTags)) {
+            error = true;
+            showErrorMessage("#1 filterTags()",
+                             ranges, tags, expectedTags, actualTags);
+        }
+
+
+        ranges = "en;q=0.2, ja-JP, fr-JP";
+        tags = "de-DE, en, ja-JP-hepburn, fr, he";
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList));
+        expectedTags = "ja-jp-hepburn, en";
+
+        if (!expectedTags.equals(actualTags)) {
+            error = true;
+            showErrorMessage("#2 filterTags()",
+                             ranges, tags, expectedTags, actualTags);
+        }
+
+
+        ranges = "de-DE";
+        tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+               + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
+        FilteringMode mode = MAP_EXTENDED_RANGES;
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
+        expectedTags = "de-de, de-de-x-goethe";
+
+        if (!expectedTags.equals(actualTags)) {
+            error = true;
+            showErrorMessage("#3 filterTags(" + mode + ")",
+                             ranges, tags, expectedTags, actualTags);
+        }
+
+
+        ranges = "de-DE";
+        tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+               + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
+        mode = EXTENDED_FILTERING;
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
+        expectedTags = "de-de, de-latn-de, de-latf-de, de-de-x-goethe, "
+                       + "de-latn-de-1996, de-deva-de";
+
+        if (!expectedTags.equals(actualTags)) {
+            error = true;
+            showErrorMessage("#4 filterTags(" + mode + ")",
+                             ranges, tags, expectedTags, actualTags);
+        }
+
+
+        ranges = "de-*-DE";
+        tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+               + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
+        mode = EXTENDED_FILTERING;
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
+        expectedTags = "de-de, de-latn-de, de-latf-de, de-de-x-goethe, "
+                       + "de-latn-de-1996, de-deva-de";
+
+        if (!expectedTags.equals(actualTags)) {
+            error = true;
+            showErrorMessage("#5 filterTags(" + mode + ")",
+                             ranges, tags, expectedTags, actualTags);
+        }
+
+        if (error) {
+            err = true;
+            System.out.println("  test_filterTags() failed.");
+        } else {
+            System.out.println("  test_filterTags() passed.");
+        }
+    }
+
+    private static void test_lookup() {
+        boolean error = false;
+
+        String ranges = "en;q=0.2, *-JP;q=0.6, iw";
+        String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";
+        List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+        List<Locale> localeList = generateLocales(tags);
+        String actualLocale =
+            Locale.lookup(priorityList, localeList).toLanguageTag();
+        String expectedLocale ="he";
+
+        if (!expectedLocale.equals(actualLocale)) {
+            error = true;
+            showErrorMessage("#1 lookup()", ranges, tags, expectedLocale, actualLocale);
+        }
+
+
+        ranges = "en;q=0.2, *-JP;q=0.6, iw";
+        tags = "de-DE, he-IL, en, iw";
+        priorityList = LanguageRange.parse(ranges);
+        localeList = generateLocales(tags);
+        actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();
+        expectedLocale = "he";
+
+        if (!expectedLocale.equals(actualLocale)) {
+            error = true;
+            showErrorMessage("#2 lookup()", ranges, tags, expectedLocale, actualLocale);
+        }
+
+
+        ranges = "en;q=0.2, ja-*-JP-x-foo;q=0.6, iw";
+        tags = "de-DE, fr, en, ja-Latn-JP";
+        priorityList = LanguageRange.parse(ranges);
+        localeList = generateLocales(tags);
+        actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();
+        expectedLocale = "ja-Latn-JP";
+
+        if (!expectedLocale.equals(actualLocale)) {
+            error = true;
+            showErrorMessage("#3 lookup()", ranges, tags, expectedLocale, actualLocale);
+        }
+
+        if (error) {
+            err = true;
+            System.out.println("  test_lookup() failed.");
+        } else {
+            System.out.println("  test_lookup() passed.");
+        }
+    }
+
+    private static void test_lookupTag() {
+        boolean error = false;
+
+        String ranges = "en, *";
+        String tags = "es, de, ja-JP";
+        List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+        List<String> tagList = generateLanguageTags(tags);
+        String actualTag = Locale.lookupTag(priorityList, tagList);
+        String expectedTag = null;
+
+        if (actualTag != null) {
+            error = true;
+            showErrorMessage("#1 lookupTag()", ranges, tags, expectedTag, actualTag);
+        }
+
+
+        ranges= "en;q=0.2, *-JP";
+        tags = "de-DE, en, ja-JP-hepburn, fr-JP, en-JP";
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTag = Locale.lookupTag(priorityList, tagList);
+        expectedTag = "fr-jp";
+
+        if (!expectedTag.equals(actualTag)) {
+            error = true;
+            showErrorMessage("#2 lookupTag()", ranges, tags, expectedTag, actualTag);
+        }
+
+
+        ranges = "en;q=0.2, ar-MO, iw";
+        tags = "de-DE, he, fr-JP";
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTag = Locale.lookupTag(priorityList, tagList);
+        expectedTag = "he";
+
+        if (!expectedTag.equals(actualTag)) {
+            error = true;
+            showErrorMessage("#3 lookupTag()", ranges, tags, expectedTag, actualTag);
+        }
+
+
+        ranges = "en;q=0.2, ar-MO, he";
+        tags = "de-DE, iw, fr-JP";
+        priorityList = LanguageRange.parse(ranges);
+        tagList = generateLanguageTags(tags);
+        actualTag = Locale.lookupTag(priorityList, tagList);
+        expectedTag = "iw";
+
+        if (!expectedTag.equals(actualTag)) {
+            error = true;
+            showErrorMessage("#4 lookupTag()", ranges, tags, expectedTag, actualTag);
+        }
+
+        if (error) {
+            err = true;
+            System.out.println("  test_lookupTag() failed.");
+        } else {
+            System.out.println("  test_lookupTag() passed.");
+        }
+    }
+
+    private static List<Locale> generateLocales(String tags) {
+        if (tags == null) {
+            return null;
+        }
+
+        List<Locale> localeList = new ArrayList<>();
+        if (tags.equals("")) {
+            return localeList;
+        }
+        String[] t = tags.split(", ");
+        for (String tag : t) {
+            localeList.add(Locale.forLanguageTag(tag));
+        }
+        return localeList;
+    }
+
+    private static List<String> generateLanguageTags(String tags) {
+        List<String> tagList = new ArrayList<>();
+        String[] t = tags.split(", ");
+        for (String tag : t) {
+            tagList.add(tag);
+        }
+        return tagList;
+    }
+
+    private static String showPriorityList(List<LanguageRange> priorityList) {
+        StringBuilder sb = new StringBuilder();
+
+        Iterator<LanguageRange> itr = priorityList.iterator();
+        LanguageRange lr;
+        if (itr.hasNext()) {
+            lr = itr.next();
+            sb.append(lr.getRange());
+            sb.append(";q=");
+            sb.append(lr.getWeight());
+        }
+        while (itr.hasNext()) {
+            sb.append(", ");
+            lr = itr.next();
+            sb.append(lr.getRange());
+            sb.append(";q=");
+            sb.append(lr.getWeight());
+        }
+
+        return sb.toString();
+    }
+
+    private static String showLanguageTags(List<String> tags) {
+        StringBuilder sb = new StringBuilder();
+
+        Iterator<String> itr = tags.iterator();
+        if (itr.hasNext()) {
+            sb.append(itr.next());
+        }
+        while (itr.hasNext()) {
+            sb.append(", ");
+            sb.append(itr.next());
+        }
+
+        return sb.toString().trim();
+    }
+
+    private static String showLocales(List<Locale> locales) {
+        StringBuilder sb = new StringBuilder();
+
+        Iterator<Locale> itr = locales.iterator();
+        if (itr.hasNext()) {
+            sb.append(itr.next().toLanguageTag());
+        }
+        while (itr.hasNext()) {
+            sb.append(", ");
+            sb.append(itr.next().toLanguageTag());
+        }
+
+        return sb.toString().trim();
+    }
+
+    private static void showErrorMessage(String methodName,
+                                         String priorityList,
+                                         String tags,
+                                         String expectedTags,
+                                         String actualTags) {
+        System.out.println("\nIncorrect " + methodName + " result.");
+        System.out.println("  Priority list  :  " + priorityList);
+        System.out.println("  Language tags  :  " + tags);
+        System.out.println("  Expected value : " + expectedTags);
+        System.out.println("  Actual value   : " + actualTags);
+    }
+
+}
--- a/jdk/test/java/util/Locale/LocaleProviders.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/util/Locale/LocaleProviders.java	Wed Jul 05 18:26:11 2017 +0200
@@ -20,15 +20,45 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-import java.text.spi.DateFormatProvider;
-import java.util.Locale;
+import java.text.*;
+import java.text.spi.*;
+import java.util.*;
 import sun.util.locale.provider.LocaleProviderAdapter;
 
 public class LocaleProviders {
 
     public static void main(String[] args) {
-        String expected = args[0];
-        Locale testLocale = new Locale(args[1], args[2]);
+        String methodName = args[0];
+
+        switch (methodName) {
+            case "getPlatformLocale":
+                if (args[1].equals("format")) {
+                    getPlatformLocale(Locale.Category.FORMAT);
+                } else {
+                    getPlatformLocale(Locale.Category.DISPLAY);
+                }
+                break;
+
+            case "adapterTest":
+                adapterTest(args[1], args[2], (args.length >= 4 ? args[3] : ""));
+                break;
+
+            case "bug7198834Test":
+                bug7198834Test();
+                break;
+
+            default:
+                throw new RuntimeException("Test method '"+methodName+"' not found.");
+        }
+    }
+
+    static void getPlatformLocale(Locale.Category cat) {
+        Locale defloc = Locale.getDefault(cat);
+        System.out.printf("%s,%s\n", defloc.getLanguage(), defloc.getCountry());
+    }
+
+    static void adapterTest(String expected, String lang, String ctry) {
+        Locale testLocale = new Locale(lang, ctry);
         String preference = System.getProperty("java.locale.providers", "");
         LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, testLocale);
         LocaleProviderAdapter.Type type = lda.getAdapterType();
@@ -37,4 +67,18 @@
             throw new RuntimeException("Returned locale data adapter is not correct.");
         }
     }
+
+    static void bug7198834Test() {
+        LocaleProviderAdapter lda = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, Locale.US);
+        LocaleProviderAdapter.Type type = lda.getAdapterType();
+        if (type == LocaleProviderAdapter.Type.HOST && System.getProperty("os.name").startsWith("Windows")) {
+            DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.US);
+            String date = df.format(new Date());
+            if (date.charAt(date.length()-1) == ' ') {
+                throw new RuntimeException("Windows Host Locale Provider returns a trailing space.");
+            }
+        } else {
+            System.out.println("Windows HOST locale adapter not found. Ignoring this test.");
+        }
+    }
 }
--- a/jdk/test/java/util/Locale/LocaleProviders.sh	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/java/util/Locale/LocaleProviders.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -23,7 +23,7 @@
 #!/bin/sh
 #
 # @test
-# @bug 6336885
+# @bug 6336885 7196799 7197573 7198834
 # @summary tests for "java.locale.providers" system property
 # @compile -XDignore.symbol.file LocaleProviders.java
 # @run shell/timeout=600 LocaleProviders.sh
@@ -65,9 +65,21 @@
     ;;
 esac
 
+# get the platform default locales
+PLATDEF=`${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} LocaleProviders getPlatformLocale display`
+DEFLANG=`echo ${PLATDEF} | sed -e "s/,.*//"`
+DEFCTRY=`echo ${PLATDEF} | sed -e "s/.*,//"`
+echo "DEFLANG=${DEFLANG}"
+echo "DEFCTRY=${DEFCTRY}"
+PLATDEF=`${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} LocaleProviders getPlatformLocale format`
+DEFFMTLANG=`echo ${PLATDEF} | sed -e "s/,.*//"`
+DEFFMTCTRY=`echo ${PLATDEF} | sed -e "s/.*,//"`
+echo "DEFFMTLANG=${DEFFMTLANG}"
+echo "DEFFMTCTRY=${DEFFMTCTRY}"
+
 runTest()
 {
-    RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} -Duser.language=$DEFLANG -Duser.country=$DEFCTRY -Djava.locale.providers=$PREFLIST LocaleProviders $EXPECTED $TESTLANG $TESTCTRY"
+    RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} -Djava.locale.providers=$PREFLIST LocaleProviders $METHODNAME $PARAM1 $PARAM2 $PARAM3"
     echo ${RUNCMD}
     ${RUNCMD}
     result=$?
@@ -81,65 +93,110 @@
 }
 
 # testing HOST is selected for the default locale, if specified on Windows or MacOSX
-DEFLANG=en
-DEFCTRY=US
-PREFLIST=HOST
+METHODNAME=adapterTest
+PREFLIST=HOST,JRE
 case "$OS" in
   Windows_NT* )
     WINVER=`uname -r`
     if [ "${WINVER}" = "5" ]
     then
-      EXPECTED=JRE
+      PARAM1=JRE
     else
-      EXPECTED=HOST
+      PARAM1=HOST
     fi
     ;;
   CYGWIN_NT-6* | Darwin )
-    EXPECTED=HOST
+    PARAM1=HOST
     ;;
   * )
-    EXPECTED=JRE
+    PARAM1=JRE
     ;;
 esac
-TESTLANG=en
-TESTCTRY=US
+PARAM2=${DEFLANG}
+PARAM3=${DEFCTRY}
 runTest
 
 # testing HOST is NOT selected for the non-default locale, if specified
-DEFLANG=en
-DEFCTRY=US
-PREFLIST=HOST
-EXPECTED=JRE
-TESTLANG=en
-TESTCTRY=GB
+METHODNAME=adapterTest
+PREFLIST=HOST,JRE
+PARAM1=JRE
+# Try to find the locale JRE supports which is not the platform default (HOST supports that one)
+if [ "${DEFLANG}" != "en" ] && [ "${DEFFMTLANG}" != "en" ]; then
+  PARAM2=en
+  PARAM3=US
+elif [ "${DEFLANG}" != "ja" ] && [ "${DEFFMTLANG}" != "ja" ]; then 
+  PARAM2=ja
+  PARAM3=JP
+else
+  PARAM2=zh
+  PARAM3=CN
+fi
 runTest
 
 # testing SPI is NOT selected, as there is none.
-PREFLIST=SPI
-EXPECTED=JRE
-TESTLANG=en
-TESTCTRY=US
+METHODNAME=adapterTest
+PREFLIST=SPI,JRE
+PARAM1=JRE
+PARAM2=en
+PARAM3=US
 runTest
 
 # testing the order, variaton #1. This assumes en_GB DateFormat data are available both in JRE & CLDR
-PREFLIST=CLDR
-EXPECTED=CLDR
-TESTLANG=en
-TESTCTRY=GB
+METHODNAME=adapterTest
+PREFLIST=CLDR,JRE
+PARAM1=CLDR
+PARAM2=en
+PARAM3=GB
 runTest
 
 # testing the order, variaton #2. This assumes en_GB DateFormat data are available both in JRE & CLDR
+METHODNAME=adapterTest
 PREFLIST=JRE,CLDR
-EXPECTED=JRE
-TESTLANG=en
-TESTCTRY=GB
+PARAM1=JRE
+PARAM2=en
+PARAM3=GB
 runTest
 
 # testing the order, variaton #3 for non-existent locale in JRE assuming "haw" is not in JRE.
+METHODNAME=adapterTest
 PREFLIST=JRE,CLDR
-EXPECTED=CLDR
-TESTLANG=haw
-TESTCTRY=GB
+PARAM1=CLDR
+PARAM2=haw
+PARAM3=GB
+runTest
+
+# testing the order, variaton #4 for the bug 7196799. CLDR's "zh" data should be used in "zh_CN"
+METHODNAME=adapterTest
+PREFLIST=CLDR
+PARAM1=CLDR
+PARAM2=zh
+PARAM3=CN
+runTest
+
+# testing FALLBACK provider. SPI and invalid one cases.
+METHODNAME=adapterTest
+PREFLIST=SPI
+PARAM1=FALLBACK
+PARAM2=en
+PARAM3=US
+runTest
+PREFLIST=FOO
+PARAM1=JRE
+PARAM2=en
+PARAM3=US
+runTest
+PREFLIST=BAR,SPI
+PARAM1=FALLBACK
+PARAM2=en
+PARAM3=US
+runTest
+
+# testing 7198834 fix. Only works on Windows Vista or upper.
+METHODNAME=bug7198834Test
+PREFLIST=HOST
+PARAM1=
+PARAM2=
+PARAM3=
 runTest
 
 exit $result
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Locale/tools/EquivMapsGenerator.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.io.*;
+import java.nio.charset.*;
+import java.nio.file.*;
+import java.util.*;
+
+public class EquivMapsGenerator {
+
+    /*
+     * IANA Language Subtag Registry file downloaded from
+     *     http://www.iana.org/assignments/language-subtag-registry
+     */
+    private static final String DEFAULT_LSR_FILE =
+        "language-subtag-registry.txt";
+
+    private static boolean verbose = false;
+
+    public static void main(String[] args) throws Exception {
+        String fileLSR = DEFAULT_LSR_FILE;
+
+        for (int i = 0; i < args.length; i++) {
+            String s = args[i];
+            if (s.equals("-lsr")) {
+                fileLSR = args[++i];
+            } else if (s.equals("-verbose")) {
+                verbose = true;
+            }
+        }
+
+        readLSRfile(fileLSR);
+        generateEquivalentMap();
+        generateSourceCode();
+    }
+
+    private static String LSRrevisionDate;
+    private static Map<String, StringBuilder> initialLanguageMap =
+        new TreeMap<>();
+    private static Map<String, StringBuilder> initialRegionVariantMap =
+        new TreeMap<>();
+
+    private static Map<String, String> sortedLanguageMap1 = new TreeMap<>();
+    private static Map<String, String[]> sortedLanguageMap2 = new TreeMap<>();
+    private static Map<String, String> sortedRegionVariantMap =
+        new TreeMap<>();
+
+    private static void readLSRfile(String filename) throws Exception {
+        String type = null;
+        String tag = null;
+        String preferred = null;
+        int mappingNum = 0;
+
+        for (String line : Files.readAllLines(Paths.get(filename),
+                                              Charset.forName("UTF-8"))) {
+            line = line.toLowerCase();
+            int index = line.indexOf(' ')+1;
+            if (line.startsWith("file-date:")) {
+                LSRrevisionDate = line.substring(index);
+                if (verbose) {
+                    System.out.println("LSR revision date=" + LSRrevisionDate);
+                }
+            } else if (line.startsWith("type:")) {
+                type = line.substring(index);
+            } else if (line.startsWith("tag:") || line.startsWith("subtag:")) {
+                tag = line.substring(index);
+            } else if (line.startsWith("preferred-value:")
+                       && !type.equals("extlang")) {
+                preferred = line.substring(index);
+                mappingNum++;
+                processDeprecatedData(type, tag, preferred);
+            } else if (line.equals("%%")) {
+                type = null;
+                tag = null;
+                preferred = null;
+            }
+        }
+
+        if (verbose) {
+            System.out.println("readLSRfile(" + filename + ")");
+            System.out.println("  Total number of mapping=" + mappingNum);
+            System.out.println("\n  Map for language. Size="
+                + initialLanguageMap.size());
+
+            for (String key : initialLanguageMap.keySet()) {
+                System.out.println("    " + key + ": \""
+                    + initialLanguageMap.get(key) + "\"");
+            }
+
+            System.out.println("\n  Map for region and variant. Size="
+                + initialRegionVariantMap.size());
+
+            for (String key : initialRegionVariantMap.keySet()) {
+                System.out.println("    " + key + ": \""
+                    + initialRegionVariantMap.get(key) + "\"");
+            }
+        }
+    }
+
+    private static void processDeprecatedData(String type,
+                                              String tag,
+                                              String preferred) {
+        StringBuilder sb;
+        if (type.equals("region") || type.equals("variant")) {
+            if (!initialRegionVariantMap.containsKey(preferred)) {
+                sb = new StringBuilder("-");
+                sb.append(preferred);
+                sb.append(",-");
+                sb.append(tag);
+                initialRegionVariantMap.put("-"+preferred, sb);
+            } else {
+                throw new RuntimeException("New case, need implementation."
+                    + " A region/variant subtag \"" + preferred
+                    + "\" is registered for more than one subtags.");
+            }
+        } else { // language, grandfahered, and redundant
+            if (!initialLanguageMap.containsKey(preferred)) {
+                sb = new StringBuilder(preferred);
+                sb.append(',');
+                sb.append(tag);
+                initialLanguageMap.put(preferred, sb);
+            } else {
+                sb = initialLanguageMap.get(preferred);
+                sb.append(',');
+                sb.append(tag);
+                initialLanguageMap.put(preferred, sb);
+            }
+        }
+    }
+
+    private static void generateEquivalentMap() {
+        String[] subtags;
+        for (String preferred : initialLanguageMap.keySet()) {
+            subtags = initialLanguageMap.get(preferred).toString().split(",");
+
+            if (subtags.length == 2) {
+                sortedLanguageMap1.put(subtags[0], subtags[1]);
+                sortedLanguageMap1.put(subtags[1], subtags[0]);
+            } else if (subtags.length == 3) {
+                sortedLanguageMap2.put(subtags[0],
+                                     new String[]{subtags[1], subtags[2]});
+                sortedLanguageMap2.put(subtags[1],
+                                     new String[]{subtags[0], subtags[2]});
+                sortedLanguageMap2.put(subtags[2],
+                                     new String[]{subtags[0], subtags[1]});
+            } else {
+                    throw new RuntimeException("New case, need implementation."
+                        + " A language subtag \"" + preferred
+                        + "\" is registered for more than two subtags. ");
+            }
+        }
+
+        for (String preferred : initialRegionVariantMap.keySet()) {
+            subtags =
+                initialRegionVariantMap.get(preferred).toString().split(",");
+
+            sortedRegionVariantMap.put(subtags[0], subtags[1]);
+            sortedRegionVariantMap.put(subtags[1], subtags[0]);
+        }
+
+        if (verbose) {
+            System.out.println("generateEquivalentMap()");
+            System.out.println("  \nSorted map for language subtags which have only one equivalent. Size="
+                + sortedLanguageMap1.size());
+            for (String key : sortedLanguageMap1.keySet()) {
+                System.out.println("    " + key + ": \""
+                    + sortedLanguageMap1.get(key) + "\"");
+            }
+
+            System.out.println("\n  Sorted map for language subtags which have multiple equivalents. Size="
+                + sortedLanguageMap2.size());
+            for (String key : sortedLanguageMap2.keySet()) {
+                String[] s = sortedLanguageMap2.get(key);
+                System.out.println("    " + key + ": \""
+                    + s[0] + "\", \"" + s[1] + "\"");
+            }
+
+            System.out.println("\n  Sorted map for region and variant subtags. Size="
+                + sortedRegionVariantMap.size());
+            for (String key : sortedRegionVariantMap.keySet()) {
+                System.out.println("    " + key + ": \""
+                    + sortedRegionVariantMap.get(key) + "\"");
+            }
+        }
+        System.out.println();
+    }
+
+    private final static String headerText =
+        "final class LocaleEquivalentMaps {\n\n"
+        + "    static final Map<String, String> singleEquivMap;\n"
+        + "    static final Map<String, String[]> multiEquivsMap;\n"
+        + "    static final Map<String, String> regionVariantEquivMap;\n\n"
+        + "    static {\n"
+        + "        singleEquivMap = new HashMap<>();\n"
+        + "        multiEquivsMap = new HashMap<>();\n"
+        + "        regionVariantEquivMap = new HashMap<>();\n\n"
+        + "        // This is an auto-generated file and should not be manually edited.\n";
+
+    private final static String footerText =
+        "    }\n\n"
+        + "}";
+
+    private static void generateSourceCode() {
+        System.out.println(headerText
+            + "        //   LSR Revision: " + LSRrevisionDate);
+
+        for (String key : sortedLanguageMap1.keySet()) {
+            String value = sortedLanguageMap1.get(key);
+            System.out.println("        singleEquivMap.put(\""
+                + key + "\", \"" + value + "\");");
+        }
+        System.out.println();
+        for (String key : sortedLanguageMap2.keySet()) {
+            String[] values = sortedLanguageMap2.get(key);
+            System.out.println("        multiEquivsMap.put(\""
+                + key + "\", new String[] {\"" + values[0] + "\", \""
+                + values[1] + "\"});");
+        }
+        System.out.println();
+        for (String key : sortedRegionVariantMap.keySet()) {
+            String value = sortedRegionVariantMap.get(key);
+            System.out.println("        regionVariantEquivMap.put(\""
+                + key + "\", \"" + value + "\");");
+        }
+
+        System.out.println(footerText);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Locale/tools/language-subtag-registry.txt	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,45975 @@
+File-Date: 2012-09-04
+%%
+Type: language
+Subtag: aa
+Description: Afar
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ab
+Description: Abkhazian
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: ae
+Description: Avestan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: af
+Description: Afrikaans
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ak
+Description: Akan
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: am
+Description: Amharic
+Added: 2005-10-16
+Suppress-Script: Ethi
+%%
+Type: language
+Subtag: an
+Description: Aragonese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ar
+Description: Arabic
+Added: 2005-10-16
+Suppress-Script: Arab
+Scope: macrolanguage
+%%
+Type: language
+Subtag: as
+Description: Assamese
+Added: 2005-10-16
+Suppress-Script: Beng
+%%
+Type: language
+Subtag: av
+Description: Avaric
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ay
+Description: Aymara
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: az
+Description: Azerbaijani
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ba
+Description: Bashkir
+Added: 2005-10-16
+%%
+Type: language
+Subtag: be
+Description: Belarusian
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: bg
+Description: Bulgarian
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: bh
+Description: Bihari languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: bi
+Description: Bislama
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bm
+Description: Bambara
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bn
+Description: Bengali
+Added: 2005-10-16
+Suppress-Script: Beng
+%%
+Type: language
+Subtag: bo
+Description: Tibetan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: br
+Description: Breton
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bs
+Description: Bosnian
+Added: 2005-10-16
+Suppress-Script: Latn
+Macrolanguage: sh
+%%
+Type: language
+Subtag: ca
+Description: Catalan
+Description: Valencian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ce
+Description: Chechen
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ch
+Description: Chamorro
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: co
+Description: Corsican
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cr
+Description: Cree
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: cs
+Description: Czech
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: cu
+Description: Church Slavic
+Description: Church Slavonic
+Description: Old Bulgarian
+Description: Old Church Slavonic
+Description: Old Slavonic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cv
+Description: Chuvash
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cy
+Description: Welsh
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: da
+Description: Danish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: de
+Description: German
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: dv
+Description: Dhivehi
+Description: Divehi
+Description: Maldivian
+Added: 2005-10-16
+Suppress-Script: Thaa
+%%
+Type: language
+Subtag: dz
+Description: Dzongkha
+Added: 2005-10-16
+Suppress-Script: Tibt
+%%
+Type: language
+Subtag: ee
+Description: Ewe
+Added: 2005-10-16
+%%
+Type: language
+Subtag: el
+Description: Modern Greek (1453-)
+Added: 2005-10-16
+Suppress-Script: Grek
+%%
+Type: language
+Subtag: en
+Description: English
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: eo
+Description: Esperanto
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: es
+Description: Spanish
+Description: Castilian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: et
+Description: Estonian
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: eu
+Description: Basque
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: fa
+Description: Persian
+Added: 2005-10-16
+Suppress-Script: Arab
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ff
+Description: Fulah
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: fi
+Description: Finnish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: fj
+Description: Fijian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: fo
+Description: Faroese
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: fr
+Description: French
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: fy
+Description: Western Frisian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ga
+Description: Irish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: gd
+Description: Scottish Gaelic
+Description: Gaelic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gl
+Description: Galician
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: gn
+Description: Guarani
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: gu
+Description: Gujarati
+Added: 2005-10-16
+Suppress-Script: Gujr
+%%
+Type: language
+Subtag: gv
+Description: Manx
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ha
+Description: Hausa
+Added: 2005-10-16
+%%
+Type: language
+Subtag: he
+Description: Hebrew
+Added: 2005-10-16
+Suppress-Script: Hebr
+%%
+Type: language
+Subtag: hi
+Description: Hindi
+Added: 2005-10-16
+Suppress-Script: Deva
+%%
+Type: language
+Subtag: ho
+Description: Hiri Motu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: hr
+Description: Croatian
+Added: 2005-10-16
+Suppress-Script: Latn
+Macrolanguage: sh
+%%
+Type: language
+Subtag: ht
+Description: Haitian
+Description: Haitian Creole
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: hu
+Description: Hungarian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: hy
+Description: Armenian
+Added: 2005-10-16
+Suppress-Script: Armn
+%%
+Type: language
+Subtag: hz
+Description: Herero
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ia
+Description: Interlingua (International Auxiliary Language
+  Association)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: id
+Description: Indonesian
+Added: 2005-10-16
+Suppress-Script: Latn
+Macrolanguage: ms
+%%
+Type: language
+Subtag: ie
+Description: Interlingue
+Description: Occidental
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ig
+Description: Igbo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ii
+Description: Sichuan Yi
+Description: Nuosu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ik
+Description: Inupiaq
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: in
+Description: Indonesian
+Added: 2005-10-16
+Deprecated: 1989-01-01
+Preferred-Value: id
+Suppress-Script: Latn
+Macrolanguage: ms
+%%
+Type: language
+Subtag: io
+Description: Ido
+Added: 2005-10-16
+%%
+Type: language
+Subtag: is
+Description: Icelandic
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: it
+Description: Italian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: iu
+Description: Inuktitut
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: iw
+Description: Hebrew
+Added: 2005-10-16
+Deprecated: 1989-01-01
+Preferred-Value: he
+Suppress-Script: Hebr
+%%
+Type: language
+Subtag: ja
+Description: Japanese
+Added: 2005-10-16
+Suppress-Script: Jpan
+%%
+Type: language
+Subtag: ji
+Description: Yiddish
+Added: 2005-10-16
+Deprecated: 1989-01-01
+Preferred-Value: yi
+%%
+Type: language
+Subtag: jv
+Description: Javanese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: jw
+Description: Javanese
+Added: 2005-10-16
+Deprecated: 2001-08-13
+Preferred-Value: jv
+Comments: published by error in Table 1 of ISO 639:1988
+%%
+Type: language
+Subtag: ka
+Description: Georgian
+Added: 2005-10-16
+Suppress-Script: Geor
+%%
+Type: language
+Subtag: kg
+Description: Kongo
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ki
+Description: Kikuyu
+Description: Gikuyu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kj
+Description: Kuanyama
+Description: Kwanyama
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kk
+Description: Kazakh
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: kl
+Description: Kalaallisut
+Description: Greenlandic
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: km
+Description: Central Khmer
+Added: 2005-10-16
+Suppress-Script: Khmr
+%%
+Type: language
+Subtag: kn
+Description: Kannada
+Added: 2005-10-16
+Suppress-Script: Knda
+%%
+Type: language
+Subtag: ko
+Description: Korean
+Added: 2005-10-16
+Suppress-Script: Kore
+%%
+Type: language
+Subtag: kr
+Description: Kanuri
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ks
+Description: Kashmiri
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ku
+Description: Kurdish
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: kv
+Description: Komi
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: kw
+Description: Cornish
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ky
+Description: Kirghiz
+Description: Kyrgyz
+Added: 2005-10-16
+%%
+Type: language
+Subtag: la
+Description: Latin
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: lb
+Description: Luxembourgish
+Description: Letzeburgesch
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: lg
+Description: Ganda
+Added: 2005-10-16
+%%
+Type: language
+Subtag: li
+Description: Limburgan
+Description: Limburger
+Description: Limburgish
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ln
+Description: Lingala
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: lo
+Description: Lao
+Added: 2005-10-16
+Suppress-Script: Laoo
+%%
+Type: language
+Subtag: lt
+Description: Lithuanian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: lu
+Description: Luba-Katanga
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lv
+Description: Latvian
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: mg
+Description: Malagasy
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: mh
+Description: Marshallese
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: mi
+Description: Maori
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mk
+Description: Macedonian
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: ml
+Description: Malayalam
+Added: 2005-10-16
+Suppress-Script: Mlym
+%%
+Type: language
+Subtag: mn
+Description: Mongolian
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: mo
+Description: Moldavian
+Description: Moldovan
+Added: 2005-10-16
+Deprecated: 2008-11-22
+Preferred-Value: ro
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: mr
+Description: Marathi
+Added: 2005-10-16
+Suppress-Script: Deva
+%%
+Type: language
+Subtag: ms
+Description: Malay (macrolanguage)
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: mt
+Description: Maltese
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: my
+Description: Burmese
+Added: 2005-10-16
+Suppress-Script: Mymr
+%%
+Type: language
+Subtag: na
+Description: Nauru
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: nb
+Description: Norwegian Bokmål
+Added: 2005-10-16
+Suppress-Script: Latn
+Macrolanguage: no
+%%
+Type: language
+Subtag: nd
+Description: North Ndebele
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ne
+Description: Nepali (macrolanguage)
+Added: 2005-10-16
+Suppress-Script: Deva
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ng
+Description: Ndonga
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nl
+Description: Dutch
+Description: Flemish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: nn
+Description: Norwegian Nynorsk
+Added: 2005-10-16
+Suppress-Script: Latn
+Macrolanguage: no
+%%
+Type: language
+Subtag: no
+Description: Norwegian
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: nr
+Description: South Ndebele
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: nv
+Description: Navajo
+Description: Navaho
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ny
+Description: Nyanja
+Description: Chewa
+Description: Chichewa
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: oc
+Description: Occitan (post 1500)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: oj
+Description: Ojibwa
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: om
+Description: Oromo
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: or
+Description: Oriya (macrolanguage)
+Added: 2005-10-16
+Suppress-Script: Orya
+Scope: macrolanguage
+%%
+Type: language
+Subtag: os
+Description: Ossetian
+Description: Ossetic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pa
+Description: Panjabi
+Description: Punjabi
+Added: 2005-10-16
+Suppress-Script: Guru
+%%
+Type: language
+Subtag: pi
+Description: Pali
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pl
+Description: Polish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ps
+Description: Pushto
+Description: Pashto
+Added: 2005-10-16
+Suppress-Script: Arab
+Scope: macrolanguage
+%%
+Type: language
+Subtag: pt
+Description: Portuguese
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: qu
+Description: Quechua
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: rm
+Description: Romansh
+Suppress-Script: Latn
+Added: 2005-10-16
+%%
+Type: language
+Subtag: rn
+Description: Rundi
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ro
+Description: Romanian
+Description: Moldavian
+Description: Moldovan
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ru
+Description: Russian
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: rw
+Description: Kinyarwanda
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sa
+Description: Sanskrit
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sc
+Description: Sardinian
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: sd
+Description: Sindhi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: se
+Description: Northern Sami
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sg
+Description: Sango
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sh
+Description: Serbo-Croatian
+Added: 2005-10-16
+Scope: macrolanguage
+Comments: sr, hr, bs are preferred for most modern uses
+%%
+Type: language
+Subtag: si
+Description: Sinhala
+Description: Sinhalese
+Added: 2005-10-16
+Suppress-Script: Sinh
+%%
+Type: language
+Subtag: sk
+Description: Slovak
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sl
+Description: Slovenian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sm
+Description: Samoan
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sn
+Description: Shona
+Added: 2005-10-16
+%%
+Type: language
+Subtag: so
+Description: Somali
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sq
+Description: Albanian
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: sr
+Description: Serbian
+Added: 2005-10-16
+Macrolanguage: sh
+%%
+Type: language
+Subtag: ss
+Description: Swati
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: st
+Description: Southern Sotho
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: su
+Description: Sundanese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sv
+Description: Swedish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: sw
+Description: Swahili (macrolanguage)
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ta
+Description: Tamil
+Added: 2005-10-16
+Suppress-Script: Taml
+%%
+Type: language
+Subtag: te
+Description: Telugu
+Added: 2005-10-16
+Suppress-Script: Telu
+%%
+Type: language
+Subtag: tg
+Description: Tajik
+Added: 2005-10-16
+%%
+Type: language
+Subtag: th
+Description: Thai
+Added: 2005-10-16
+Suppress-Script: Thai
+%%
+Type: language
+Subtag: ti
+Description: Tigrinya
+Added: 2005-10-16
+Suppress-Script: Ethi
+%%
+Type: language
+Subtag: tk
+Description: Turkmen
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tl
+Description: Tagalog
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: tn
+Description: Tswana
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: to
+Description: Tonga (Tonga Islands)
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: tr
+Description: Turkish
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ts
+Description: Tsonga
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: tt
+Description: Tatar
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tw
+Description: Twi
+Added: 2005-10-16
+Macrolanguage: ak
+%%
+Type: language
+Subtag: ty
+Description: Tahitian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ug
+Description: Uighur
+Description: Uyghur
+Added: 2005-10-16
+%%
+Type: language
+Subtag: uk
+Description: Ukrainian
+Added: 2005-10-16
+Suppress-Script: Cyrl
+%%
+Type: language
+Subtag: ur
+Description: Urdu
+Added: 2005-10-16
+Suppress-Script: Arab
+%%
+Type: language
+Subtag: uz
+Description: Uzbek
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ve
+Description: Venda
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: vi
+Description: Vietnamese
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: vo
+Description: Volapük
+Added: 2005-10-16
+%%
+Type: language
+Subtag: wa
+Description: Walloon
+Added: 2005-10-16
+%%
+Type: language
+Subtag: wo
+Description: Wolof
+Added: 2005-10-16
+%%
+Type: language
+Subtag: xh
+Description: Xhosa
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: yi
+Description: Yiddish
+Added: 2005-10-16
+Suppress-Script: Hebr
+Scope: macrolanguage
+%%
+Type: language
+Subtag: yo
+Description: Yoruba
+Added: 2005-10-16
+%%
+Type: language
+Subtag: za
+Description: Zhuang
+Description: Chuang
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: zh
+Description: Chinese
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: zu
+Description: Zulu
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: aaa
+Description: Ghotuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aab
+Description: Alumu-Tesu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aac
+Description: Ari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aad
+Description: Amal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aae
+Description: Arbëreshë Albanian
+Added: 2009-07-29
+Macrolanguage: sq
+%%
+Type: language
+Subtag: aaf
+Description: Aranadan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aag
+Description: Ambrak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aah
+Description: Abu' Arapesh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aai
+Description: Arifama-Miniafia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aak
+Description: Ankave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aal
+Description: Afade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aam
+Description: Aramanik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aan
+Description: Anambé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aao
+Description: Algerian Saharan Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: aap
+Description: Pará Arára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aaq
+Description: Eastern Abnaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aas
+Description: Aasáx
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aat
+Description: Arvanitika Albanian
+Added: 2009-07-29
+Macrolanguage: sq
+%%
+Type: language
+Subtag: aau
+Description: Abau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aav
+Description: Austro-Asiatic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: aaw
+Description: Solong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aax
+Description: Mandobo Atas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aaz
+Description: Amarasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aba
+Description: Abé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abb
+Description: Bankon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abc
+Description: Ambala Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abd
+Description: Manide
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abe
+Description: Western Abnaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abf
+Description: Abai Sungai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abg
+Description: Abaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abh
+Description: Tajiki Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: abi
+Description: Abidji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abj
+Description: Aka-Bea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abl
+Description: Lampung Nyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abm
+Description: Abanyom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abn
+Description: Abua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abo
+Description: Abon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abp
+Description: Abellen Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abq
+Description: Abaza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abr
+Description: Abron
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abs
+Description: Ambonese Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abt
+Description: Ambulas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abu
+Description: Abure
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abv
+Description: Baharna Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: abw
+Description: Pal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abx
+Description: Inabaknon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aby
+Description: Aneme Wake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: abz
+Description: Abui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aca
+Description: Achagua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acb
+Description: Áncá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acd
+Description: Gikyode
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ace
+Description: Achinese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: acf
+Description: Saint Lucian Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ach
+Description: Acoli
+Added: 2005-10-16
+%%
+Type: language
+Subtag: aci
+Description: Aka-Cari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ack
+Description: Aka-Kora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acl
+Description: Akar-Bale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acm
+Description: Mesopotamian Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: acn
+Description: Achang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acp
+Description: Eastern Acipa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acq
+Description: Ta'izzi-Adeni Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: acr
+Description: Achi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acs
+Description: Acroá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: act
+Description: Achterhoeks
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acu
+Description: Achuar-Shiwiar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acv
+Description: Achumawi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: acw
+Description: Hijazi Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: acx
+Description: Omani Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: acy
+Description: Cypriot Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: acz
+Description: Acheron
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ada
+Description: Adangme
+Added: 2005-10-16
+%%
+Type: language
+Subtag: adb
+Description: Adabe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: add
+Description: Dzodinka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ade
+Description: Adele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adf
+Description: Dhofari Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: adg
+Description: Andegerebinha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adh
+Description: Adhola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adi
+Description: Adi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adj
+Description: Adioukrou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adl
+Description: Galo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adn
+Description: Adang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ado
+Description: Abu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adp
+Description: Adap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adq
+Description: Adangbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adr
+Description: Adonara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ads
+Description: Adamorobe Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adt
+Description: Adnyamathanha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adu
+Description: Aduge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adw
+Description: Amundava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: adx
+Description: Amdo Tibetan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ady
+Description: Adyghe
+Description: Adygei
+Added: 2005-10-16
+%%
+Type: language
+Subtag: adz
+Description: Adzera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aea
+Description: Areba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aeb
+Description: Tunisian Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: aec
+Description: Saidi Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: aed
+Description: Argentine Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aee
+Description: Northeast Pashayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aek
+Description: Haeke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ael
+Description: Ambele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aem
+Description: Arem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aen
+Description: Armenian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aeq
+Description: Aer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aer
+Description: Eastern Arrernte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aes
+Description: Alsea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aeu
+Description: Akeu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aew
+Description: Ambakich
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aey
+Description: Amele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aez
+Description: Aeka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afa
+Description: Afro-Asiatic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: afb
+Description: Gulf Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: afd
+Description: Andai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afe
+Description: Putukwam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afg
+Description: Afghan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afh
+Description: Afrihili
+Added: 2005-10-16
+%%
+Type: language
+Subtag: afi
+Description: Akrukay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afk
+Description: Nanubae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afn
+Description: Defaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afo
+Description: Eloyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afp
+Description: Tapei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afs
+Description: Afro-Seminole Creole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aft
+Description: Afitti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afu
+Description: Awutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: afz
+Description: Obokuitai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aga
+Description: Aguano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agb
+Description: Legbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agc
+Description: Agatu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agd
+Description: Agarabi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: age
+Description: Angal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agf
+Description: Arguni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agg
+Description: Angor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agh
+Description: Ngelima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agi
+Description: Agariya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agj
+Description: Argobba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agk
+Description: Isarog Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agl
+Description: Fembe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agm
+Description: Angaataha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agn
+Description: Agutaynen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ago
+Description: Tainae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agp
+Description: Paranan
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see apf, prf
+%%
+Type: language
+Subtag: agq
+Description: Aghem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agr
+Description: Aguaruna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ags
+Description: Esimbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agt
+Description: Central Cagayan Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agu
+Description: Aguacateco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agv
+Description: Remontado Dumagat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agw
+Description: Kahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agx
+Description: Aghul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agy
+Description: Southern Alta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: agz
+Description: Mt. Iriga Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aha
+Description: Ahanta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahb
+Description: Axamb
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahg
+Description: Qimant
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahh
+Description: Aghu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahi
+Description: Tiagbamrin Aizi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahk
+Description: Akha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahl
+Description: Igo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahm
+Description: Mobumrin Aizi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahn
+Description: Àhàn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aho
+Description: Ahom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahp
+Description: Aproumu Aizi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahr
+Description: Ahirani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ahs
+Description: Ashe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aht
+Description: Ahtena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aia
+Description: Arosi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aib
+Description: Ainu (China)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aic
+Description: Ainbai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aid
+Description: Alngith
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aie
+Description: Amara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aif
+Description: Agi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aig
+Description: Antigua and Barbuda Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aih
+Description: Ai-Cham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aii
+Description: Assyrian Neo-Aramaic
+Added: 2009-07-29
+Macrolanguage: syr
+%%
+Type: language
+Subtag: aij
+Description: Lishanid Noshan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aik
+Description: Ake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ail
+Description: Aimele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aim
+Description: Aimol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ain
+Description: Ainu (Japan)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: aio
+Description: Aiton
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aip
+Description: Burumakok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aiq
+Description: Aimaq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: air
+Description: Airoran
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ais
+Description: Nataoran Amis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ait
+Description: Arikem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aiw
+Description: Aari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aix
+Description: Aighon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aiy
+Description: Ali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aja
+Description: Aja (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ajg
+Description: Aja (Benin)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aji
+Description: Ajië
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ajn
+Description: Andajin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: ajp
+Description: South Levantine Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ajt
+Description: Judeo-Tunisian Arabic
+Added: 2009-07-29
+Macrolanguage: jrb
+%%
+Type: language
+Subtag: aju
+Description: Judeo-Moroccan Arabic
+Added: 2009-07-29
+Macrolanguage: jrb
+%%
+Type: language
+Subtag: ajw
+Description: Ajawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ajz
+Description: Amri Karbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akb
+Description: Batak Angkola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akc
+Description: Mpur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akd
+Description: Ukpet-Ehom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ake
+Description: Akawaio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akf
+Description: Akpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akg
+Description: Anakalangu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akh
+Description: Angal Heneng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aki
+Description: Aiome
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akj
+Description: Aka-Jeru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akk
+Description: Akkadian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: akl
+Description: Aklanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akm
+Description: Aka-Bo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ako
+Description: Akurio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akp
+Description: Siwu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akq
+Description: Ak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akr
+Description: Araki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aks
+Description: Akaselem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akt
+Description: Akolet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aku
+Description: Akum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akv
+Description: Akhvakh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akw
+Description: Akwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akx
+Description: Aka-Kede
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aky
+Description: Aka-Kol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: akz
+Description: Alabama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ala
+Description: Alago
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alc
+Description: Qawasqar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ald
+Description: Alladian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ale
+Description: Aleut
+Added: 2005-10-16
+%%
+Type: language
+Subtag: alf
+Description: Alege
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alg
+Description: Algonquian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: alh
+Description: Alawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ali
+Description: Amaimon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alj
+Description: Alangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alk
+Description: Alak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: all
+Description: Allar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alm
+Description: Amblong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aln
+Description: Gheg Albanian
+Added: 2009-07-29
+Macrolanguage: sq
+%%
+Type: language
+Subtag: alo
+Description: Larike-Wakasihu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alp
+Description: Alune
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alq
+Description: Algonquin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alr
+Description: Alutor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: als
+Description: Tosk Albanian
+Added: 2009-07-29
+Macrolanguage: sq
+%%
+Type: language
+Subtag: alt
+Description: Southern Altai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: alu
+Description: 'Are'are
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alv
+Description: Atlantic-Congo languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: alw
+Description: Alaba-K’abeena
+Description: Wanbasana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alx
+Description: Amol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aly
+Description: Alyawarr
+Added: 2009-07-29
+%%
+Type: language
+Subtag: alz
+Description: Alur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ama
+Description: Amanayé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amb
+Description: Ambo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amc
+Description: Amahuaca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ame
+Description: Yanesha'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amf
+Description: Hamer-Banna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amg
+Description: Amurdak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ami
+Description: Amis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amj
+Description: Amdang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amk
+Description: Ambai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aml
+Description: War-Jaintia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amm
+Description: Ama (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amn
+Description: Amanab
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amo
+Description: Amo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amp
+Description: Alamblak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amq
+Description: Amahai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amr
+Description: Amarakaeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ams
+Description: Southern Amami-Oshima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amt
+Description: Amto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amu
+Description: Guerrero Amuzgo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amv
+Description: Ambelau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amw
+Description: Western Neo-Aramaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amx
+Description: Anmatyerre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amy
+Description: Ami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: amz
+Description: Atampaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ana
+Description: Andaqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anb
+Description: Andoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anc
+Description: Ngas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: and
+Description: Ansus
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ane
+Description: Xârâcùù
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anf
+Description: Animere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ang
+Description: Old English (ca. 450-1100)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: anh
+Description: Nend
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ani
+Description: Andi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anj
+Description: Anor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ank
+Description: Goemai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anl
+Description: Anu-Hkongso Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anm
+Description: Anal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ann
+Description: Obolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ano
+Description: Andoque
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anp
+Description: Angika
+Added: 2006-03-08
+%%
+Type: language
+Subtag: anq
+Description: Jarawa (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anr
+Description: Andh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ans
+Description: Anserma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ant
+Description: Antakarinya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anu
+Description: Anuak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anv
+Description: Denya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anw
+Description: Anaang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anx
+Description: Andra-Hus
+Added: 2009-07-29
+%%
+Type: language
+Subtag: any
+Description: Anyin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: anz
+Description: Anem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoa
+Description: Angolar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aob
+Description: Abom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoc
+Description: Pemon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aod
+Description: Andarum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoe
+Description: Angal Enen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aof
+Description: Bragat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aog
+Description: Angoram
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoh
+Description: Arma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoi
+Description: Anindilyakwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoj
+Description: Mufian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aok
+Description: Arhö
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aol
+Description: Alor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aom
+Description: Ömie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aon
+Description: Bumbita Arapesh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aor
+Description: Aore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aos
+Description: Taikat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aot
+Description: A'tong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aou
+Description: A'ou
+Added: 2012-08-12
+%%
+Type: language
+Subtag: aox
+Description: Atorada
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aoz
+Description: Uab Meto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apa
+Description: Apache languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: apb
+Description: Sa'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apc
+Description: North Levantine Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: apd
+Description: Sudanese Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ape
+Description: Bukiyip
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apf
+Description: Pahanan Agta
+Added: 2010-03-11
+%%
+Type: language
+Subtag: apg
+Description: Ampanang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aph
+Description: Athpariya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: api
+Description: Apiaká
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apj
+Description: Jicarilla Apache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apk
+Description: Kiowa Apache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apl
+Description: Lipan Apache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apm
+Description: Mescalero-Chiricahua Apache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apn
+Description: Apinayé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apo
+Description: Ambul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: app
+Description: Apma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apq
+Description: A-Pucikwar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apr
+Description: Arop-Lokep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aps
+Description: Arop-Sissano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apt
+Description: Apatani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apu
+Description: Apurinã
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apv
+Description: Alapmunte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apw
+Description: Western Apache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apx
+Description: Aputai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apy
+Description: Apalaí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: apz
+Description: Safeyoka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aqa
+Description: Alacalufan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: aqc
+Description: Archi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aqd
+Description: Ampari Dogon
+Added: 2011-08-16
+%%
+Type: language
+Subtag: aqg
+Description: Arigidi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aql
+Description: Algic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: aqm
+Description: Atohwaim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aqn
+Description: Northern Alta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aqp
+Description: Atakapa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aqr
+Description: Arhâ
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aqz
+Description: Akuntsu
+Added: 2010-03-11
+%%
+Type: language
+Subtag: arb
+Description: Standard Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: arc
+Description: Official Aramaic (700-300 BCE)
+Description: Imperial Aramaic (700-300 BCE)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ard
+Description: Arabana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: are
+Description: Western Arrarnta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arh
+Description: Arhuaco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ari
+Description: Arikara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arj
+Description: Arapaso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ark
+Description: Arikapú
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arl
+Description: Arabela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arn
+Description: Mapudungun
+Description: Mapuche
+Added: 2005-10-16
+%%
+Type: language
+Subtag: aro
+Description: Araona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arp
+Description: Arapaho
+Added: 2005-10-16
+%%
+Type: language
+Subtag: arq
+Description: Algerian Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: arr
+Description: Karo (Brazil)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ars
+Description: Najdi Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: art
+Description: Artificial languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: aru
+Description: Aruá (Amazonas State)
+Description: Arawá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arv
+Description: Arbore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: arw
+Description: Arawak
+Added: 2005-10-16
+%%
+Type: language
+Subtag: arx
+Description: Aruá (Rodonia State)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ary
+Description: Moroccan Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: arz
+Description: Egyptian Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: asa
+Description: Asu (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asb
+Description: Assiniboine
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asc
+Description: Casuarina Coast Asmat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asd
+Description: Asas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ase
+Description: American Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asf
+Description: Australian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asg
+Description: Cishingini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ash
+Description: Abishira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asi
+Description: Buruwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asj
+Description: Nsari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ask
+Description: Ashkun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asl
+Description: Asilulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asn
+Description: Xingú Asuriní
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aso
+Description: Dano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asp
+Description: Algerian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asq
+Description: Austrian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asr
+Description: Asuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ass
+Description: Ipulo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ast
+Description: Asturian
+Description: Asturleonese
+Description: Bable
+Description: Leonese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: asu
+Description: Tocantins Asurini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asv
+Description: Asoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asw
+Description: Australian Aborigines Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asx
+Description: Muratayak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asy
+Description: Yaosakor Asmat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: asz
+Description: As
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ata
+Description: Pele-Ata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atb
+Description: Zaiwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atc
+Description: Atsahuaca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atd
+Description: Ata Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ate
+Description: Atemble
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atg
+Description: Ivbie North-Okpela-Arhe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ath
+Description: Athapascan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ati
+Description: Attié
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atj
+Description: Atikamekw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atk
+Description: Ati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atl
+Description: Mt. Iraya Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atm
+Description: Ata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atn
+Description: Ashtiani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ato
+Description: Atong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atp
+Description: Pudtol Atta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atq
+Description: Aralle-Tabulahan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atr
+Description: Waimiri-Atroari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ats
+Description: Gros Ventre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: att
+Description: Pamplona Atta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atu
+Description: Reel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atv
+Description: Northern Altai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atw
+Description: Atsugewi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atx
+Description: Arutani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aty
+Description: Aneityum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: atz
+Description: Arta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aua
+Description: Asumboa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aub
+Description: Alugu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auc
+Description: Waorani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aud
+Description: Anuta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aue
+Description: =/Kx'au//'ein
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auf
+Description: Arauan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: aug
+Description: Aguna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auh
+Description: Aushi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aui
+Description: Anuki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auj
+Description: Awjilah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auk
+Description: Heyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aul
+Description: Aulua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aum
+Description: Asu (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aun
+Description: Molmo One
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auo
+Description: Auyokawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aup
+Description: Makayam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auq
+Description: Anus
+Description: Korur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aur
+Description: Aruek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aus
+Description: Australian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: aut
+Description: Austral
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auu
+Description: Auye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auw
+Description: Awyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aux
+Description: Aurá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auy
+Description: Awiyaana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: auz
+Description: Uzbeki Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: avb
+Description: Avau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avd
+Description: Alviri-Vidari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avi
+Description: Avikam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avk
+Description: Kotava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avl
+Description: Eastern Egyptian Bedawi Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: avm
+Description: Angkamuthi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: avn
+Description: Avatime
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avo
+Description: Agavotaguerra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avs
+Description: Aushiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avt
+Description: Au
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avu
+Description: Avokaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: avv
+Description: Avá-Canoeiro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awa
+Description: Awadhi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: awb
+Description: Awa (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awc
+Description: Cicipu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awd
+Description: Arawakan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: awe
+Description: Awetí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awg
+Description: Anguthimri
+Added: 2012-08-12
+%%
+Type: language
+Subtag: awh
+Description: Awbono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awi
+Description: Aekyom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awk
+Description: Awabakal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awm
+Description: Arawum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awn
+Description: Awngi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awo
+Description: Awak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awr
+Description: Awera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aws
+Description: South Awyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awt
+Description: Araweté
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awu
+Description: Central Awyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awv
+Description: Jair Awyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aww
+Description: Awun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awx
+Description: Awara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: awy
+Description: Edera Awyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: axb
+Description: Abipon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: axe
+Description: Ayerrerenge
+Added: 2012-08-12
+%%
+Type: language
+Subtag: axg
+Description: Mato Grosso Arára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: axk
+Description: Yaka (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: axm
+Description: Middle Armenian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: axx
+Description: Xaragure
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aya
+Description: Awar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayb
+Description: Ayizo Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayc
+Description: Southern Aymara
+Added: 2009-07-29
+Macrolanguage: ay
+%%
+Type: language
+Subtag: ayd
+Description: Ayabadhu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aye
+Description: Ayere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayg
+Description: Ginyanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayh
+Description: Hadrami Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ayi
+Description: Leyigha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayk
+Description: Akuku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayl
+Description: Libyan Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ayn
+Description: Sanaani Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ayo
+Description: Ayoreo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayp
+Description: North Mesopotamian Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ayq
+Description: Ayi (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayr
+Description: Central Aymara
+Added: 2009-07-29
+Macrolanguage: ay
+%%
+Type: language
+Subtag: ays
+Description: Sorsogon Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayt
+Description: Magbukun Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayu
+Description: Ayu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayx
+Description: Ayi (China)
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Preferred-Value: nun
+%%
+Type: language
+Subtag: ayy
+Description: Tayabas Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ayz
+Description: Mai Brat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: aza
+Description: Azha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: azb
+Description: South Azerbaijani
+Added: 2009-07-29
+Macrolanguage: az
+%%
+Type: language
+Subtag: azc
+Description: Uto-Aztecan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: azd
+Description: Eastern Durango Nahuatl
+Added: 2012-08-12
+%%
+Type: language
+Subtag: azg
+Description: San Pedro Amuzgos Amuzgo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: azj
+Description: North Azerbaijani
+Added: 2009-07-29
+Macrolanguage: az
+%%
+Type: language
+Subtag: azm
+Description: Ipalapa Amuzgo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: azn
+Description: Western Durango Nahuatl
+Added: 2012-08-12
+%%
+Type: language
+Subtag: azo
+Description: Awing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: azt
+Description: Faire Atta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: azz
+Description: Highland Puebla Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: baa
+Description: Babatana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bab
+Description: Bainouk-Gunyuño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bac
+Description: Badui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bad
+Description: Banda languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: bae
+Description: Baré
+Added: 2009-07-29
+%%
+Type: language
+Subtag: baf
+Description: Nubaca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bag
+Description: Tuki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bah
+Description: Bahamas Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bai
+Description: Bamileke languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: baj
+Description: Barakai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bal
+Description: Baluchi
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: ban
+Description: Balinese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bao
+Description: Waimaha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bap
+Description: Bantawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bar
+Description: Bavarian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bas
+Description: Basa (Cameroon)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bat
+Description: Baltic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: bau
+Description: Bada (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bav
+Description: Vengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: baw
+Description: Bambili-Bambui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bax
+Description: Bamun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bay
+Description: Batuley
+Added: 2009-07-29
+%%
+Type: language
+Subtag: baz
+Description: Tunen
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see nvo, tvu
+%%
+Type: language
+Subtag: bba
+Description: Baatonum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbb
+Description: Barai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbc
+Description: Batak Toba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbd
+Description: Bau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbe
+Description: Bangba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbf
+Description: Baibai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbg
+Description: Barama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbh
+Description: Bugan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbi
+Description: Barombi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbj
+Description: Ghomálá'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbk
+Description: Babanki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbl
+Description: Bats
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbm
+Description: Babango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbn
+Description: Uneapa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbo
+Description: Northern Bobo Madaré
+Description: Konabéré
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbp
+Description: West Central Banda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbq
+Description: Bamali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbr
+Description: Girawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbs
+Description: Bakpinka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbt
+Description: Mburku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbu
+Description: Kulung (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbv
+Description: Karnai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbw
+Description: Baba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbx
+Description: Bubia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bby
+Description: Befang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bbz
+Description: Babalia Creole Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: bca
+Description: Central Bai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcb
+Description: Bainouk-Samik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcc
+Description: Southern Balochi
+Added: 2009-07-29
+Macrolanguage: bal
+%%
+Type: language
+Subtag: bcd
+Description: North Babar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bce
+Description: Bamenyam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcf
+Description: Bamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcg
+Description: Baga Binari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bch
+Description: Bariai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bci
+Description: Baoulé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcj
+Description: Bardi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bck
+Description: Bunaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcl
+Description: Central Bikol
+Added: 2009-07-29
+Macrolanguage: bik
+%%
+Type: language
+Subtag: bcm
+Description: Bannoni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcn
+Description: Bali (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bco
+Description: Kaluli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcp
+Description: Bali (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcq
+Description: Bench
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcr
+Description: Babine
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcs
+Description: Kohumono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bct
+Description: Bendi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcu
+Description: Awad Bing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcv
+Description: Shoo-Minda-Nye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcw
+Description: Bana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcy
+Description: Bacama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bcz
+Description: Bainouk-Gunyaamolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bda
+Description: Bayot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdb
+Description: Basap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdc
+Description: Emberá-Baudó
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdd
+Description: Bunama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bde
+Description: Bade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdf
+Description: Biage
+Added: 2010-03-11
+%%
+Type: language
+Subtag: bdg
+Description: Bonggi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdh
+Description: Baka (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdi
+Description: Burun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdj
+Description: Bai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdk
+Description: Budukh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdl
+Description: Indonesian Bajau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdm
+Description: Buduma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdn
+Description: Baldemu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdo
+Description: Morom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdp
+Description: Bende
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdq
+Description: Bahnar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdr
+Description: West Coast Bajau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bds
+Description: Burunge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdt
+Description: Bokoto
+Added: 2009-07-29
+Macrolanguage: gba
+%%
+Type: language
+Subtag: bdu
+Description: Oroko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdv
+Description: Bodo Parja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdw
+Description: Baham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdx
+Description: Budong-Budong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdy
+Description: Bandjalang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bdz
+Description: Badeshi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bea
+Description: Beaver
+Added: 2009-07-29
+%%
+Type: language
+Subtag: beb
+Description: Bebele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bec
+Description: Iceve-Maci
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bed
+Description: Bedoanas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bee
+Description: Byangsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bef
+Description: Benabena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: beg
+Description: Belait
+Added: 2009-07-29
+%%
+Type: language
+Subtag: beh
+Description: Biali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bei
+Description: Bekati'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bej
+Description: Beja
+Description: Bedawiyet
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bek
+Description: Bebeli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bem
+Description: Bemba (Zambia)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: beo
+Description: Beami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bep
+Description: Besoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: beq
+Description: Beembe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ber
+Description: Berber languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: bes
+Description: Besme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bet
+Description: Guiberoua Béte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: beu
+Description: Blagar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bev
+Description: Daloa Bété
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bew
+Description: Betawi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bex
+Description: Jur Modo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bey
+Description: Beli (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bez
+Description: Bena (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfa
+Description: Bari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfb
+Description: Pauri Bareli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfc
+Description: Northern Bai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfd
+Description: Bafut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfe
+Description: Betaf
+Description: Tena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bff
+Description: Bofi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfg
+Description: Busang Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfh
+Description: Blafe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfi
+Description: British Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfj
+Description: Bafanji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfk
+Description: Ban Khor Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfl
+Description: Banda-Ndélé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfm
+Description: Mmen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfn
+Description: Bunak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfo
+Description: Malba Birifor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfp
+Description: Beba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfq
+Description: Badaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfr
+Description: Bazigar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfs
+Description: Southern Bai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bft
+Description: Balti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfu
+Description: Gahri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfw
+Description: Bondo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfx
+Description: Bantayanon
+Added: 2010-03-11
+%%
+Type: language
+Subtag: bfy
+Description: Bagheli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bfz
+Description: Mahasu Pahari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bga
+Description: Gwamhi-Wuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgb
+Description: Bobongko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgc
+Description: Haryanvi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgd
+Description: Rathwi Bareli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bge
+Description: Bauria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgf
+Description: Bangandu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgg
+Description: Bugun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgi
+Description: Giangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgj
+Description: Bangolan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgk
+Description: Bit
+Description: Buxinhua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgl
+Description: Bo (Laos)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgm
+Description: Baga Mboteni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgn
+Description: Western Balochi
+Added: 2009-07-29
+Macrolanguage: bal
+%%
+Type: language
+Subtag: bgo
+Description: Baga Koga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgp
+Description: Eastern Balochi
+Added: 2009-07-29
+Macrolanguage: bal
+%%
+Type: language
+Subtag: bgq
+Description: Bagri
+Added: 2009-07-29
+Macrolanguage: raj
+%%
+Type: language
+Subtag: bgr
+Description: Bawm Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgs
+Description: Tagabawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgt
+Description: Bughotu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgu
+Description: Mbongno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgv
+Description: Warkay-Bipim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgw
+Description: Bhatri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgx
+Description: Balkan Gagauz Turkish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgy
+Description: Benggoi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bgz
+Description: Banggai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bha
+Description: Bharia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhb
+Description: Bhili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhc
+Description: Biga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhd
+Description: Bhadrawahi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhe
+Description: Bhaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhf
+Description: Odiai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhg
+Description: Binandere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhh
+Description: Bukharic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhi
+Description: Bhilali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhj
+Description: Bahing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhk
+Description: Albay Bicolano
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Macrolanguage: bik
+Comments: see fbl, lbl, rbl, ubl
+%%
+Type: language
+Subtag: bhl
+Description: Bimin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhm
+Description: Bathari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhn
+Description: Bohtan Neo-Aramaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bho
+Description: Bhojpuri
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bhp
+Description: Bima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhq
+Description: Tukang Besi South
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhr
+Description: Bara Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: bhs
+Description: Buwal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bht
+Description: Bhattiyali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhu
+Description: Bhunjia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhv
+Description: Bahau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhw
+Description: Biak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhx
+Description: Bhalay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhy
+Description: Bhele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bhz
+Description: Bada (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bia
+Description: Badimaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bib
+Description: Bissa
+Description: Bisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bic
+Description: Bikaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bid
+Description: Bidiyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bie
+Description: Bepour
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bif
+Description: Biafada
+Added: 2009-07-29
+%%
+Type: language
+Subtag: big
+Description: Biangai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bij
+Description: Vaghat-Ya-Bijim-Legeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bik
+Description: Bikol
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: bil
+Description: Bile
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bim
+Description: Bimoba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bin
+Description: Bini
+Description: Edo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: bio
+Description: Nai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bip
+Description: Bila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: biq
+Description: Bipi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bir
+Description: Bisorio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bit
+Description: Berinomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: biu
+Description: Biete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: biv
+Description: Southern Birifor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: biw
+Description: Kol (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bix
+Description: Bijori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: biy
+Description: Birhor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: biz
+Description: Baloi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bja
+Description: Budza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjb
+Description: Banggarla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjc
+Description: Bariji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjd
+Description: Bandjigali
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: drl
+%%
+Type: language
+Subtag: bje
+Description: Biao-Jiao Mien
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjf
+Description: Barzani Jewish Neo-Aramaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjg
+Description: Bidyogo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjh
+Description: Bahinemo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bji
+Description: Burji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjj
+Description: Kanauji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjk
+Description: Barok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjl
+Description: Bulu (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjm
+Description: Bajelani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjn
+Description: Banjar
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: bjo
+Description: Mid-Southern Banda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjq
+Description: Southern Betsimisaraka Malagasy
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Macrolanguage: mg
+Comments: see bzc, tkg
+%%
+Type: language
+Subtag: bjr
+Description: Binumarien
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjs
+Description: Bajan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjt
+Description: Balanta-Ganja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bju
+Description: Busuu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjv
+Description: Bedjond
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjw
+Description: Bakwé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjx
+Description: Banao Itneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjy
+Description: Bayali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bjz
+Description: Baruga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bka
+Description: Kyak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkb
+Description: Finallig
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see ebk, obk
+%%
+Type: language
+Subtag: bkc
+Description: Baka (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkd
+Description: Binukid
+Description: Talaandig
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkf
+Description: Beeke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkg
+Description: Buraka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkh
+Description: Bakoko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bki
+Description: Baki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkj
+Description: Pande
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkk
+Description: Brokskat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkl
+Description: Berik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkm
+Description: Kom (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkn
+Description: Bukitan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bko
+Description: Kwa'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkp
+Description: Boko (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkq
+Description: Bakairí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkr
+Description: Bakumpai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bks
+Description: Northern Sorsoganon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkt
+Description: Boloki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bku
+Description: Buhid
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkv
+Description: Bekwarra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkw
+Description: Bekwel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkx
+Description: Baikeno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bky
+Description: Bokyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bkz
+Description: Bungku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bla
+Description: Siksika
+Added: 2005-10-16
+%%
+Type: language
+Subtag: blb
+Description: Bilua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blc
+Description: Bella Coola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bld
+Description: Bolango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ble
+Description: Balanta-Kentohe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blf
+Description: Buol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blg
+Description: Balau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blh
+Description: Kuwaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bli
+Description: Bolia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blj
+Description: Bolongan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blk
+Description: Pa'o Karen
+Description: Pa'O
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bll
+Description: Biloxi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blm
+Description: Beli (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bln
+Description: Southern Catanduanes Bikol
+Added: 2009-07-29
+Macrolanguage: bik
+%%
+Type: language
+Subtag: blo
+Description: Anii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blp
+Description: Blablanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blq
+Description: Baluan-Pam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blr
+Description: Blang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bls
+Description: Balaesang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blt
+Description: Tai Dam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blv
+Description: Bolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blw
+Description: Balangao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blx
+Description: Mag-Indi Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bly
+Description: Notre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: blz
+Description: Balantak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bma
+Description: Lame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmb
+Description: Bembe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmc
+Description: Biem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmd
+Description: Baga Manduri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bme
+Description: Limassa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmf
+Description: Bom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmg
+Description: Bamwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmh
+Description: Kein
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmi
+Description: Bagirmi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmj
+Description: Bote-Majhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmk
+Description: Ghayavi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bml
+Description: Bomboli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmm
+Description: Northern Betsimisaraka Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: bmn
+Description: Bina (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmo
+Description: Bambalang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmp
+Description: Bulgebi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmq
+Description: Bomu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmr
+Description: Muinane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bms
+Description: Bilma Kanuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmt
+Description: Biao Mon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmu
+Description: Somba-Siawari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmv
+Description: Bum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmw
+Description: Bomwali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmx
+Description: Baimak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmy
+Description: Bemba (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bmz
+Description: Baramu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bna
+Description: Bonerate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnb
+Description: Bookan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnc
+Description: Bontok
+Added: 2009-07-29
+Scope: macrolanguage
+%%
+Type: language
+Subtag: bnd
+Description: Banda (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bne
+Description: Bintauna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnf
+Description: Masiwang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bng
+Description: Benga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bni
+Description: Bangi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnj
+Description: Eastern Tawbuid
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnk
+Description: Bierebo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnl
+Description: Boon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnm
+Description: Batanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnn
+Description: Bunun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bno
+Description: Bantoanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnp
+Description: Bola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnq
+Description: Bantik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnr
+Description: Butmas-Tur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bns
+Description: Bundeli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnt
+Description: Bantu languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: bnu
+Description: Bentong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnv
+Description: Bonerif
+Description: Beneraf
+Description: Edwas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnw
+Description: Bisis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnx
+Description: Bangubangu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bny
+Description: Bintulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bnz
+Description: Beezen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boa
+Description: Bora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bob
+Description: Aweer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boe
+Description: Mundabli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bof
+Description: Bolon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bog
+Description: Bamako Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boh
+Description: Boma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boi
+Description: Barbareño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boj
+Description: Anjam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bok
+Description: Bonjo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bol
+Description: Bole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bom
+Description: Berom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bon
+Description: Bine
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boo
+Description: Tiemacèwè Bozo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bop
+Description: Bonkiman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boq
+Description: Bogaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bor
+Description: Borôro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bot
+Description: Bongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bou
+Description: Bondei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bov
+Description: Tuwuli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bow
+Description: Rema
+Added: 2009-07-29
+%%
+Type: language
+Subtag: box
+Description: Buamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boy
+Description: Bodo (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: boz
+Description: Tiéyaxo Bozo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpa
+Description: Dakaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpb
+Description: Barbacoas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpd
+Description: Banda-Banda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpg
+Description: Bonggo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bph
+Description: Botlikh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpi
+Description: Bagupi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpj
+Description: Binji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpk
+Description: Orowe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpl
+Description: Broome Pearling Lugger Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpm
+Description: Biyom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpn
+Description: Dzao Min
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpo
+Description: Anasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpp
+Description: Kaure
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpq
+Description: Banda Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpr
+Description: Koronadal Blaan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bps
+Description: Sarangani Blaan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpt
+Description: Barrow Point
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpu
+Description: Bongu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpv
+Description: Bian Marind
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpw
+Description: Bo (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpx
+Description: Palya Bareli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpy
+Description: Bishnupriya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bpz
+Description: Bilba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqa
+Description: Tchumbuli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqb
+Description: Bagusa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqc
+Description: Boko (Benin)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqd
+Description: Bung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqf
+Description: Baga Kaloum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqg
+Description: Bago-Kusuntu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqh
+Description: Baima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqi
+Description: Bakhtiari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqj
+Description: Bandial
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqk
+Description: Banda-Mbrès
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bql
+Description: Bilakura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqm
+Description: Wumboko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqn
+Description: Bulgarian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqo
+Description: Balo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqp
+Description: Busa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqq
+Description: Biritai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqr
+Description: Burusu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqs
+Description: Bosngun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqt
+Description: Bamukumbit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqu
+Description: Boguru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqv
+Description: Koro Wachi
+Description: Begbere-Ejar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqw
+Description: Buru (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqx
+Description: Baangi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqy
+Description: Bengkala Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bqz
+Description: Bakaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bra
+Description: Braj
+Added: 2005-10-16
+%%
+Type: language
+Subtag: brb
+Description: Lave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brc
+Description: Berbice Creole Dutch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brd
+Description: Baraamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brf
+Description: Bera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brg
+Description: Baure
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brh
+Description: Brahui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bri
+Description: Mokpwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brj
+Description: Bieria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brk
+Description: Birked
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brl
+Description: Birwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brm
+Description: Barambu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brn
+Description: Boruca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bro
+Description: Brokkat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brp
+Description: Barapasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brq
+Description: Breri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brr
+Description: Birao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brs
+Description: Baras
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brt
+Description: Bitare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bru
+Description: Eastern Bru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brv
+Description: Western Bru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brw
+Description: Bellari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brx
+Description: Bodo (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bry
+Description: Burui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: brz
+Description: Bilbil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsa
+Description: Abinomn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsb
+Description: Brunei Bisaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsc
+Description: Bassari
+Description: Oniyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bse
+Description: Wushi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsf
+Description: Bauchi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsg
+Description: Bashkardi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsh
+Description: Kati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsi
+Description: Bassossi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsj
+Description: Bangwinji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsk
+Description: Burushaski
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsl
+Description: Basa-Gumna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsm
+Description: Busami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsn
+Description: Barasana-Eduria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bso
+Description: Buso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsp
+Description: Baga Sitemu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsq
+Description: Bassa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsr
+Description: Bassa-Kontagora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bss
+Description: Akoose
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bst
+Description: Basketo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsu
+Description: Bahonsuai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsv
+Description: Baga Sobané
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsw
+Description: Baiso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsx
+Description: Yangkam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bsy
+Description: Sabah Bisaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bta
+Description: Bata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btb
+Description: Beti (Cameroon)
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see beb, bum, bxp, eto, ewo, fan, mct
+%%
+Type: language
+Subtag: btc
+Description: Bati (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btd
+Description: Batak Dairi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bte
+Description: Gamo-Ningi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btf
+Description: Birgit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btg
+Description: Gagnoa Bété
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bth
+Description: Biatah Bidayuh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bti
+Description: Burate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btj
+Description: Bacanese Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: btk
+Description: Batak languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: btl
+Description: Bhatola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btm
+Description: Batak Mandailing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btn
+Description: Ratagnon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bto
+Description: Rinconada Bikol
+Added: 2009-07-29
+Macrolanguage: bik
+%%
+Type: language
+Subtag: btp
+Description: Budibud
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btq
+Description: Batek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btr
+Description: Baetora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bts
+Description: Batak Simalungun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btt
+Description: Bete-Bendi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btu
+Description: Batu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btv
+Description: Bateri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btw
+Description: Butuanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btx
+Description: Batak Karo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bty
+Description: Bobot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: btz
+Description: Batak Alas-Kluet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bua
+Description: Buriat
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: bub
+Description: Bua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buc
+Description: Bushi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bud
+Description: Ntcham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bue
+Description: Beothuk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buf
+Description: Bushoong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bug
+Description: Buginese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: buh
+Description: Younuo Bunu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bui
+Description: Bongili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buj
+Description: Basa-Gurmana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buk
+Description: Bugawac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bum
+Description: Bulu (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bun
+Description: Sherbro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buo
+Description: Terei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bup
+Description: Busoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buq
+Description: Brem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bus
+Description: Bokobaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: but
+Description: Bungain
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buu
+Description: Budu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buv
+Description: Bun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buw
+Description: Bubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bux
+Description: Boghom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buy
+Description: Bullom So
+Added: 2009-07-29
+%%
+Type: language
+Subtag: buz
+Description: Bukwen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bva
+Description: Barein
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvb
+Description: Bube
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvc
+Description: Baelelea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvd
+Description: Baeggu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bve
+Description: Berau Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: bvf
+Description: Boor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvg
+Description: Bonkeng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvh
+Description: Bure
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvi
+Description: Belanda Viri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvj
+Description: Baan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvk
+Description: Bukat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvl
+Description: Bolivian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvm
+Description: Bamunka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvn
+Description: Buna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvo
+Description: Bolgo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvq
+Description: Birri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvr
+Description: Burarra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvt
+Description: Bati (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvu
+Description: Bukit Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: bvv
+Description: Baniva
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvw
+Description: Boga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvx
+Description: Dibole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bvy
+Description: Baybayanon
+Added: 2010-03-11
+%%
+Type: language
+Subtag: bvz
+Description: Bauzi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwa
+Description: Bwatoo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwb
+Description: Namosi-Naitasiri-Serua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwc
+Description: Bwile
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwd
+Description: Bwaidoka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwe
+Description: Bwe Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwf
+Description: Boselewa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwg
+Description: Barwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwh
+Description: Bishuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwi
+Description: Baniwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwj
+Description: Láá Láá Bwamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwk
+Description: Bauwaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwl
+Description: Bwela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwm
+Description: Biwat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwn
+Description: Wunai Bunu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwo
+Description: Boro (Ethiopia)
+Description: Borna (Ethiopia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwp
+Description: Mandobo Bawah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwq
+Description: Southern Bobo Madaré
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwr
+Description: Bura-Pabir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bws
+Description: Bomboma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwt
+Description: Bafaw-Balong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwu
+Description: Buli (Ghana)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bww
+Description: Bwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwx
+Description: Bu-Nao Bunu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwy
+Description: Cwi Bwamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bwz
+Description: Bwisi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxa
+Description: Bauro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxb
+Description: Belanda Bor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxc
+Description: Molengue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxd
+Description: Pela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxe
+Description: Birale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxf
+Description: Bilur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxg
+Description: Bangala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxh
+Description: Buhutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxi
+Description: Pirlatapa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxj
+Description: Bayungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxk
+Description: Bukusu
+Description: Lubukusu
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: bxl
+Description: Jalkunan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxm
+Description: Mongolia Buriat
+Added: 2009-07-29
+Macrolanguage: bua
+%%
+Type: language
+Subtag: bxn
+Description: Burduna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxo
+Description: Barikanchi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxp
+Description: Bebil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxq
+Description: Beele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxr
+Description: Russia Buriat
+Added: 2009-07-29
+Macrolanguage: bua
+%%
+Type: language
+Subtag: bxs
+Description: Busam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxu
+Description: China Buriat
+Added: 2009-07-29
+Macrolanguage: bua
+%%
+Type: language
+Subtag: bxv
+Description: Berakou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxw
+Description: Bankagooma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxx
+Description: Borna (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bxz
+Description: Binahari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bya
+Description: Batak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byb
+Description: Bikya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byc
+Description: Ubaghara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byd
+Description: Benyadu'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bye
+Description: Pouye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byf
+Description: Bete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byg
+Description: Baygo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byh
+Description: Bhujel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byi
+Description: Buyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byj
+Description: Bina (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byk
+Description: Biao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byl
+Description: Bayono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bym
+Description: Bidyara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byn
+Description: Bilin
+Description: Blin
+Added: 2005-10-16
+%%
+Type: language
+Subtag: byo
+Description: Biyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byp
+Description: Bumaji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byq
+Description: Basay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byr
+Description: Baruya
+Description: Yipma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bys
+Description: Burak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byt
+Description: Berti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byv
+Description: Medumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byw
+Description: Belhariya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byx
+Description: Qaqet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byy
+Description: Buya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: byz
+Description: Banaro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bza
+Description: Bandi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzb
+Description: Andio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzc
+Description: Southern Betsimisaraka Malagasy
+Added: 2011-08-16
+Macrolanguage: mg
+%%
+Type: language
+Subtag: bzd
+Description: Bribri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bze
+Description: Jenaama Bozo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzf
+Description: Boikin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzg
+Description: Babuza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzh
+Description: Mapos Buang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzi
+Description: Bisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzj
+Description: Belize Kriol English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzk
+Description: Nicaragua Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzl
+Description: Boano (Sulawesi)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzm
+Description: Bolondo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzn
+Description: Boano (Maluku)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzo
+Description: Bozaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzp
+Description: Kemberano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzq
+Description: Buli (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzr
+Description: Biri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzs
+Description: Brazilian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzt
+Description: Brithenig
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzu
+Description: Burmeso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzv
+Description: Bebe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzw
+Description: Basa (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzx
+Description: Kɛlɛngaxo Bozo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzy
+Description: Obanliku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: bzz
+Description: Evant
+Added: 2009-07-29
+%%
+Type: language
+Subtag: caa
+Description: Chortí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cab
+Description: Garifuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cac
+Description: Chuj
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cad
+Description: Caddo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cae
+Description: Lehar
+Description: Laalaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: caf
+Description: Southern Carrier
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cag
+Description: Nivaclé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cah
+Description: Cahuarano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cai
+Description: Central American Indian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: caj
+Description: Chané
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cak
+Description: Kaqchikel
+Description: Cakchiquel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cal
+Description: Carolinian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cam
+Description: Cemuhî
+Added: 2009-07-29
+%%
+Type: language
+Subtag: can
+Description: Chambri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cao
+Description: Chácobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cap
+Description: Chipaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: caq
+Description: Car Nicobarese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: car
+Description: Galibi Carib
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cas
+Description: Tsimané
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cau
+Description: Caucasian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cav
+Description: Cavineña
+Added: 2009-07-29
+%%
+Type: language
+Subtag: caw
+Description: Callawalla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cax
+Description: Chiquitano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cay
+Description: Cayuga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: caz
+Description: Canichana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cba
+Description: Chibchan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: cbb
+Description: Cabiyarí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbc
+Description: Carapana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbd
+Description: Carijona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbe
+Description: Chipiajes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbg
+Description: Chimila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbh
+Description: Cagua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbi
+Description: Chachi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbj
+Description: Ede Cabe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbk
+Description: Chavacano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbl
+Description: Bualkhaw Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbn
+Description: Nyahkur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbo
+Description: Izora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbr
+Description: Cashibo-Cacataibo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbs
+Description: Cashinahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbt
+Description: Chayahuita
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbu
+Description: Candoshi-Shapra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbv
+Description: Cacua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cbw
+Description: Kinabalian
+Added: 2010-03-11
+%%
+Type: language
+Subtag: cby
+Description: Carabayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cca
+Description: Cauca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccc
+Description: Chamicuro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccd
+Description: Cafundo Creole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cce
+Description: Chopi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccg
+Description: Samba Daka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cch
+Description: Atsam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccj
+Description: Kasanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccl
+Description: Cutchi-Swahili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccm
+Description: Malaccan Creole Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccn
+Description: North Caucasian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: cco
+Description: Comaltepec Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccp
+Description: Chakma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccq
+Description: Chaungtha
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: rki
+%%
+Type: language
+Subtag: ccr
+Description: Cacaopera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ccs
+Description: South Caucasian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: cda
+Description: Choni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdc
+Description: Chadic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: cdd
+Description: Caddoan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: cde
+Description: Chenchu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdf
+Description: Chiru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdg
+Description: Chamari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdh
+Description: Chambeali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdi
+Description: Chodri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdj
+Description: Churahi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdm
+Description: Chepang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdn
+Description: Chaudangsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdo
+Description: Min Dong Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: cdr
+Description: Cinda-Regi-Tiyal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cds
+Description: Chadian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdy
+Description: Chadong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cdz
+Description: Koda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cea
+Description: Lower Chehalis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ceb
+Description: Cebuano
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ceg
+Description: Chamacoco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cek
+Description: Eastern Khumi Chin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: cel
+Description: Celtic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cen
+Description: Cen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cet
+Description: Centúúm
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cfa
+Description: Dijim-Bwilim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cfd
+Description: Cara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cfg
+Description: Como Karim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cfm
+Description: Falam Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cga
+Description: Changriwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cgc
+Description: Kagayanen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cgg
+Description: Chiga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cgk
+Description: Chocangacakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chb
+Description: Chibcha
+Added: 2005-10-16
+%%
+Type: language
+Subtag: chc
+Description: Catawba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chd
+Description: Highland Oaxaca Chontal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chf
+Description: Tabasco Chontal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chg
+Description: Chagatai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: chh
+Description: Chinook
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chj
+Description: Ojitlán Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chk
+Description: Chuukese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: chl
+Description: Cahuilla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chm
+Description: Mari (Russia)
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: chn
+Description: Chinook jargon
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cho
+Description: Choctaw
+Added: 2005-10-16
+%%
+Type: language
+Subtag: chp
+Description: Chipewyan
+Description: Dene Suline
+Added: 2005-10-16
+%%
+Type: language
+Subtag: chq
+Description: Quiotepec Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chr
+Description: Cherokee
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cht
+Description: Cholón
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chw
+Description: Chuwabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chx
+Description: Chantyal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: chy
+Description: Cheyenne
+Added: 2005-10-16
+%%
+Type: language
+Subtag: chz
+Description: Ozumacín Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cia
+Description: Cia-Cia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cib
+Description: Ci Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cic
+Description: Chickasaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cid
+Description: Chimariko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cie
+Description: Cineni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cih
+Description: Chinali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cik
+Description: Chitkuli Kinnauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cim
+Description: Cimbrian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cin
+Description: Cinta Larga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cip
+Description: Chiapanec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cir
+Description: Tiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ciw
+Description: Chippewa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: ciy
+Description: Chaima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cja
+Description: Western Cham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cje
+Description: Chru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjh
+Description: Upper Chehalis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cji
+Description: Chamalal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjk
+Description: Chokwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjm
+Description: Eastern Cham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjn
+Description: Chenapian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjo
+Description: Ashéninka Pajonal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjp
+Description: Cabécar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjr
+Description: Chorotega
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: mom
+%%
+Type: language
+Subtag: cjs
+Description: Shor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjv
+Description: Chuave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cjy
+Description: Jinyu Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: cka
+Description: Khumi Awa Chin
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: cmr
+%%
+Type: language
+Subtag: ckb
+Description: Central Kurdish
+Added: 2009-07-29
+Macrolanguage: ku
+%%
+Type: language
+Subtag: ckh
+Description: Chak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckl
+Description: Cibak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cko
+Description: Anufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckq
+Description: Kajakse
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckr
+Description: Kairak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cks
+Description: Tayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckt
+Description: Chukot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cku
+Description: Koasati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckv
+Description: Kavalan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckx
+Description: Caka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cky
+Description: Cakfem-Mushere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ckz
+Description: Cakchiquel-Quiché Mixed Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cla
+Description: Ron
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clc
+Description: Chilcotin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cld
+Description: Chaldean Neo-Aramaic
+Added: 2009-07-29
+Macrolanguage: syr
+%%
+Type: language
+Subtag: cle
+Description: Lealao Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clh
+Description: Chilisso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cli
+Description: Chakali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clj
+Description: Laitu Chin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: clk
+Description: Idu-Mishmi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cll
+Description: Chala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clm
+Description: Clallam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clo
+Description: Lowland Oaxaca Chontal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clt
+Description: Lautu Chin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: clu
+Description: Caluyanun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: clw
+Description: Chulym
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cly
+Description: Eastern Highland Chatino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cma
+Description: Maa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmc
+Description: Chamic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cme
+Description: Cerma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmg
+Description: Classical Mongolian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmi
+Description: Emberá-Chamí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmk
+Description: Chimakum
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: xch
+%%
+Type: language
+Subtag: cml
+Description: Campalagian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmm
+Description: Michigamea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmn
+Description: Mandarin Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: cmo
+Description: Central Mnong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmr
+Description: Mro-Khimi Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cms
+Description: Messapic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cmt
+Description: Camtho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cna
+Description: Changthang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnb
+Description: Chinbon Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnc
+Description: Côông
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cng
+Description: Northern Qiang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnh
+Description: Haka Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cni
+Description: Asháninka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnk
+Description: Khumi Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnl
+Description: Lalana Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cno
+Description: Con
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cns
+Description: Central Asmat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnt
+Description: Tepetotutla Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnu
+Description: Chenoua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnw
+Description: Ngawn Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cnx
+Description: Middle Cornish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coa
+Description: Cocos Islands Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: cob
+Description: Chicomuceltec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coc
+Description: Cocopa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cod
+Description: Cocama-Cocamilla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coe
+Description: Koreguaje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cof
+Description: Colorado
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cog
+Description: Chong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coh
+Description: Chonyi-Dzihana-Kauma
+Description: Chichonyi-Chidzihana-Chikauma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coj
+Description: Cochimi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cok
+Description: Santa Teresa Cora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: col
+Description: Columbia-Wenatchi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: com
+Description: Comanche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: con
+Description: Cofán
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coo
+Description: Comox
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cop
+Description: Coptic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: coq
+Description: Coquille
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cot
+Description: Caquinte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cou
+Description: Wamey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cov
+Description: Cao Miao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cow
+Description: Cowlitz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cox
+Description: Nanti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coy
+Description: Coyaima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: coz
+Description: Chochotec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpa
+Description: Palantla Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpb
+Description: Ucayali-Yurúa Ashéninka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpc
+Description: Ajyíninka Apurucayali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpe
+Description: English-based creoles and pidgins
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cpf
+Description: French-based creoles and pidgins
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cpg
+Description: Cappadocian Greek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpi
+Description: Chinese Pidgin English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpn
+Description: Cherepon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpp
+Description: Portuguese-based creoles and pidgins
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cps
+Description: Capiznon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpu
+Description: Pichis Ashéninka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cpx
+Description: Pu-Xian Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: cpy
+Description: South Ucayali Ashéninka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cqd
+Description: Chuanqiandian Cluster Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: cqu
+Description: Chilean Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: cra
+Description: Chara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crb
+Description: Island Carib
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crc
+Description: Lonwolwol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crd
+Description: Coeur d'Alene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crf
+Description: Caramanta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crg
+Description: Michif
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crh
+Description: Crimean Tatar
+Description: Crimean Turkish
+Added: 2005-10-16
+%%
+Type: language
+Subtag: cri
+Description: Sãotomense
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crj
+Description: Southern East Cree
+Added: 2009-07-29
+Macrolanguage: cr
+%%
+Type: language
+Subtag: crk
+Description: Plains Cree
+Added: 2009-07-29
+Macrolanguage: cr
+%%
+Type: language
+Subtag: crl
+Description: Northern East Cree
+Added: 2009-07-29
+Macrolanguage: cr
+%%
+Type: language
+Subtag: crm
+Description: Moose Cree
+Added: 2009-07-29
+Macrolanguage: cr
+%%
+Type: language
+Subtag: crn
+Description: El Nayar Cora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cro
+Description: Crow
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crp
+Description: Creoles and pidgins
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: crq
+Description: Iyo'wujwa Chorote
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crr
+Description: Carolina Algonquian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crs
+Description: Seselwa Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crt
+Description: Iyojwa'ja Chorote
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crv
+Description: Chaura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crw
+Description: Chrau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crx
+Description: Carrier
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cry
+Description: Cori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: crz
+Description: Cruzeño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csa
+Description: Chiltepec Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csb
+Description: Kashubian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: csc
+Description: Catalan Sign Language
+Description: Lengua de señas catalana
+Description: Llengua de Signes Catalana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csd
+Description: Chiangmai Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cse
+Description: Czech Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csf
+Description: Cuba Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csg
+Description: Chilean Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csh
+Description: Asho Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csi
+Description: Coast Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csk
+Description: Jola-Kasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csl
+Description: Chinese Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csm
+Description: Central Sierra Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csn
+Description: Colombian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cso
+Description: Sochiapam Chinantec
+Description: Sochiapan Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csq
+Description: Croatia Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csr
+Description: Costa Rican Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: css
+Description: Southern Ohlone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cst
+Description: Northern Ohlone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csu
+Description: Central Sudanic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: csv
+Description: Sumtu Chin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: csw
+Description: Swampy Cree
+Added: 2009-07-29
+Macrolanguage: cr
+%%
+Type: language
+Subtag: csy
+Description: Siyin Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: csz
+Description: Coos
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cta
+Description: Tataltepec Chatino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctc
+Description: Chetco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctd
+Description: Tedim Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cte
+Description: Tepinapa Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctg
+Description: Chittagonian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cth
+Description: Thaiphum Chin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: ctl
+Description: Tlacoatzintepec Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctm
+Description: Chitimacha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctn
+Description: Chhintange
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cto
+Description: Emberá-Catío
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctp
+Description: Western Highland Chatino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cts
+Description: Northern Catanduanes Bikol
+Added: 2009-07-29
+Macrolanguage: bik
+%%
+Type: language
+Subtag: ctt
+Description: Wayanad Chetti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctu
+Description: Chol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ctz
+Description: Zacatepec Chatino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cua
+Description: Cua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cub
+Description: Cubeo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuc
+Description: Usila Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cug
+Description: Cung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuh
+Description: Chuka
+Description: Gichuka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cui
+Description: Cuiba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuj
+Description: Mashco Piro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuk
+Description: San Blas Kuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cul
+Description: Culina
+Description: Kulina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cum
+Description: Cumeral
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuo
+Description: Cumanagoto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cup
+Description: Cupeño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuq
+Description: Cun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cur
+Description: Chhulung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cus
+Description: Cushitic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: cut
+Description: Teutila Cuicatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuu
+Description: Tai Ya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuv
+Description: Cuvok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cuw
+Description: Chukwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cux
+Description: Tepeuxila Cuicatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cvg
+Description: Chug
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cvn
+Description: Valle Nacional Chinantec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cwa
+Description: Kabwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cwb
+Description: Maindo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cwd
+Description: Woods Cree
+Added: 2009-07-29
+Macrolanguage: cr
+%%
+Type: language
+Subtag: cwe
+Description: Kwere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cwg
+Description: Chewong
+Description: Cheq Wong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cwt
+Description: Kuwaataay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cya
+Description: Nopala Chatino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cyb
+Description: Cayubaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: cyo
+Description: Cuyonon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: czh
+Description: Huizhou Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: czk
+Description: Knaanic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: czn
+Description: Zenzontepec Chatino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: czo
+Description: Min Zhong Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: czt
+Description: Zotung Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: daa
+Description: Dangaléat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dac
+Description: Dambi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dad
+Description: Marik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dae
+Description: Duupa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: daf
+Description: Dan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dag
+Description: Dagbani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dah
+Description: Gwahatike
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dai
+Description: Day
+Added: 2009-07-29
+%%
+Type: language
+Subtag: daj
+Description: Dar Fur Daju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dak
+Description: Dakota
+Added: 2005-10-16
+%%
+Type: language
+Subtag: dal
+Description: Dahalo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dam
+Description: Damakawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dao
+Description: Daai Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dap
+Description: Nisi (India)
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see njz, tgj
+%%
+Type: language
+Subtag: daq
+Description: Dandami Maria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dar
+Description: Dargwa
+Added: 2005-10-16
+%%
+Type: language
+Subtag: das
+Description: Daho-Doo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dau
+Description: Dar Sila Daju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dav
+Description: Taita
+Description: Dawida
+Added: 2009-07-29
+%%
+Type: language
+Subtag: daw
+Description: Davawenyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dax
+Description: Dayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: day
+Description: Land Dayak languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: daz
+Description: Dao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dba
+Description: Bangi Me
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbb
+Description: Deno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbd
+Description: Dadiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbe
+Description: Dabe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbf
+Description: Edopi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbg
+Description: Dogul Dom Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbi
+Description: Doka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbj
+Description: Ida'an
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbl
+Description: Dyirbal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbm
+Description: Duguri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbn
+Description: Duriankere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbo
+Description: Dulbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbp
+Description: Duwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbq
+Description: Daba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbr
+Description: Dabarre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbt
+Description: Ben Tey Dogon
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dbu
+Description: Bondum Dom Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbv
+Description: Dungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dbw
+Description: Bankan Tey Dogon
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dby
+Description: Dibiyaso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dcc
+Description: Deccan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dcr
+Description: Negerhollands
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dda
+Description: Dadi Dadi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: ddd
+Description: Dongotono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dde
+Description: Doondo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddg
+Description: Fataluku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddi
+Description: West Goodenough
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddj
+Description: Jaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddn
+Description: Dendi (Benin)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddo
+Description: Dido
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddr
+Description: Dhudhuroa
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dds
+Description: Donno So Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ddw
+Description: Dawera-Daweloor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dec
+Description: Dagik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ded
+Description: Dedua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dee
+Description: Dewoin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: def
+Description: Dezfuli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: deg
+Description: Degema
+Added: 2009-07-29
+%%
+Type: language
+Subtag: deh
+Description: Dehwari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dei
+Description: Demisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dek
+Description: Dek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: del
+Description: Delaware
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: dem
+Description: Dem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: den
+Description: Slave (Athapascan)
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: dep
+Description: Pidgin Delaware
+Added: 2009-07-29
+%%
+Type: language
+Subtag: deq
+Description: Dendi (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: der
+Description: Deori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: des
+Description: Desano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dev
+Description: Domung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dez
+Description: Dengese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dga
+Description: Southern Dagaare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgb
+Description: Bunoge Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgc
+Description: Casiguran Dumagat Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgd
+Description: Dagaari Dioula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dge
+Description: Degenan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgg
+Description: Doga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgh
+Description: Dghwede
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgi
+Description: Northern Dagara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgk
+Description: Dagba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgl
+Description: Andaandi
+Description: Dongolawi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dgn
+Description: Dagoman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgo
+Description: Dogri (individual language)
+Added: 2009-07-29
+Macrolanguage: doi
+%%
+Type: language
+Subtag: dgr
+Description: Dogrib
+Added: 2005-10-16
+%%
+Type: language
+Subtag: dgs
+Description: Dogoso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgt
+Description: Ndrag'ngith
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dgu
+Description: Degaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgw
+Description: Daungwurrung
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dgx
+Description: Doghoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dgz
+Description: Daga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dha
+Description: Dhanwar (India)
+Added: 2009-07-29
+Deprecated: 2011-08-16
+%%
+Type: language
+Subtag: dhd
+Description: Dhundari
+Added: 2009-07-29
+Macrolanguage: mwr
+%%
+Type: language
+Subtag: dhg
+Description: Dhangu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhi
+Description: Dhimal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhl
+Description: Dhalandji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhm
+Description: Zemba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhn
+Description: Dhanki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dho
+Description: Dhodia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhr
+Description: Dhargari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhs
+Description: Dhaiso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhu
+Description: Dhurga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhv
+Description: Dehu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dhw
+Description: Dhanwar (Nepal)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dia
+Description: Dia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dib
+Description: South Central Dinka
+Added: 2009-07-29
+Macrolanguage: din
+%%
+Type: language
+Subtag: dic
+Description: Lakota Dida
+Added: 2009-07-29
+%%
+Type: language
+Subtag: did
+Description: Didinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dif
+Description: Dieri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dig
+Description: Digo
+Description: Chidigo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dih
+Description: Kumiai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dii
+Description: Dimbong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dij
+Description: Dai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dik
+Description: Southwestern Dinka
+Added: 2009-07-29
+Macrolanguage: din
+%%
+Type: language
+Subtag: dil
+Description: Dilling
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dim
+Description: Dime
+Added: 2009-07-29
+%%
+Type: language
+Subtag: din
+Description: Dinka
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: dio
+Description: Dibo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dip
+Description: Northeastern Dinka
+Added: 2009-07-29
+Macrolanguage: din
+%%
+Type: language
+Subtag: diq
+Description: Dimli (individual language)
+Added: 2009-07-29
+Macrolanguage: zza
+%%
+Type: language
+Subtag: dir
+Description: Dirim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dis
+Description: Dimasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dit
+Description: Dirari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: diu
+Description: Diriku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: diw
+Description: Northwestern Dinka
+Added: 2009-07-29
+Macrolanguage: din
+%%
+Type: language
+Subtag: dix
+Description: Dixon Reef
+Added: 2009-07-29
+%%
+Type: language
+Subtag: diy
+Description: Diuwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: diz
+Description: Ding
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dja
+Description: Djadjawurrung
+Added: 2012-08-12
+%%
+Type: language
+Subtag: djb
+Description: Djinba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djc
+Description: Dar Daju Daju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djd
+Description: Djamindjung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dje
+Description: Zarma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djf
+Description: Djangun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dji
+Description: Djinang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djj
+Description: Djeebbana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djk
+Description: Eastern Maroon Creole
+Description: Businenge Tongo
+Description: Nenge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djl
+Description: Djiwarli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djm
+Description: Jamsay Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djn
+Description: Djauan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djo
+Description: Jangkang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djr
+Description: Djambarrpuyngu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dju
+Description: Kapriman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: djw
+Description: Djawi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dka
+Description: Dakpakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dkk
+Description: Dakka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dkl
+Description: Kolum So Dogon
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Comments: see aqd, dmb
+%%
+Type: language
+Subtag: dkr
+Description: Kuijau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dks
+Description: Southeastern Dinka
+Added: 2009-07-29
+Macrolanguage: din
+%%
+Type: language
+Subtag: dkx
+Description: Mazagway
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dlg
+Description: Dolgan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dlm
+Description: Dalmatian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dln
+Description: Darlong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dma
+Description: Duma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmb
+Description: Mombo Dogon
+Added: 2011-08-16
+%%
+Type: language
+Subtag: dmc
+Description: Dimir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmd
+Description: Madhi Madhi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dme
+Description: Dugwor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmg
+Description: Upper Kinabatangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmk
+Description: Domaaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dml
+Description: Dameli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmm
+Description: Dama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmn
+Description: Mande languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: dmo
+Description: Kemedzung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmr
+Description: East Damar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dms
+Description: Dampelas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmu
+Description: Dubu
+Description: Tebi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmv
+Description: Dumpas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmx
+Description: Dema
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dmy
+Description: Demta
+Description: Sowari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dna
+Description: Upper Grand Valley Dani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnd
+Description: Daonda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dne
+Description: Ndendeule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dng
+Description: Dungan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dni
+Description: Lower Grand Valley Dani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnk
+Description: Dengka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnn
+Description: Dzùùngoo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnr
+Description: Danaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnt
+Description: Mid Grand Valley Dani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnu
+Description: Danau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dnv
+Description: Danu
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dnw
+Description: Western Dani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dny
+Description: Dení
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doa
+Description: Dom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dob
+Description: Dobu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doc
+Description: Northern Dong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doe
+Description: Doe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dof
+Description: Domu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doh
+Description: Dong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doi
+Description: Dogri (macrolanguage)
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: dok
+Description: Dondo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dol
+Description: Doso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: don
+Description: Toura (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doo
+Description: Dongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dop
+Description: Lukpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doq
+Description: Dominican Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dor
+Description: Dori'o
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dos
+Description: Dogosé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dot
+Description: Dass
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dov
+Description: Dombe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dow
+Description: Doyayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dox
+Description: Bussa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doy
+Description: Dompo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: doz
+Description: Dorze
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dpp
+Description: Papar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dra
+Description: Dravidian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: drb
+Description: Dair
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drc
+Description: Minderico
+Added: 2011-08-16
+%%
+Type: language
+Subtag: drd
+Description: Darmiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dre
+Description: Dolpo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drg
+Description: Rungus
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drh
+Description: Darkhat
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: khk
+%%
+Type: language
+Subtag: dri
+Description: C'lela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drl
+Description: Paakantyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drn
+Description: West Damar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dro
+Description: Daro-Matu Melanau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drq
+Description: Dura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drr
+Description: Dororo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drs
+Description: Gedeo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drt
+Description: Drents
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dru
+Description: Rukai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: drw
+Description: Darwazi
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: prs
+%%
+Type: language
+Subtag: dry
+Description: Darai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dsb
+Description: Lower Sorbian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: dse
+Description: Dutch Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dsh
+Description: Daasanach
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dsi
+Description: Disa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dsl
+Description: Danish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dsn
+Description: Dusner
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dso
+Description: Desiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dsq
+Description: Tadaksahak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dta
+Description: Daur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtb
+Description: Labuk-Kinabatangan Kadazan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtd
+Description: Ditidaht
+Added: 2011-08-16
+%%
+Type: language
+Subtag: dth
+Description: Adithinngithigh
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dti
+Description: Ana Tinga Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtk
+Description: Tene Kan Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtm
+Description: Tomo Kan Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dto
+Description: Tommo So Dogon
+Added: 2012-08-12
+%%
+Type: language
+Subtag: dtp
+Description: Central Dusun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtr
+Description: Lotud
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dts
+Description: Toro So Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtt
+Description: Toro Tegu Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dtu
+Description: Tebul Ure Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dty
+Description: Dotyali
+Added: 2012-08-12
+Macrolanguage: ne
+%%
+Type: language
+Subtag: dua
+Description: Duala
+Added: 2005-10-16
+%%
+Type: language
+Subtag: dub
+Description: Dubli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duc
+Description: Duna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dud
+Description: Hun-Saare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: due
+Description: Umiray Dumaget Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duf
+Description: Dumbea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dug
+Description: Duruma
+Description: Chiduruma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duh
+Description: Dungra Bhil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dui
+Description: Dumun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duj
+Description: Dhuwal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duk
+Description: Uyajitaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dul
+Description: Alabat Island Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dum
+Description: Middle Dutch (ca. 1050-1350)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: dun
+Description: Dusun Deyah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duo
+Description: Dupaninan Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dup
+Description: Duano
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: duq
+Description: Dusun Malang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dur
+Description: Dii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dus
+Description: Dumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duu
+Description: Drung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duv
+Description: Duvle
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duw
+Description: Dusun Witu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dux
+Description: Duungooma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duy
+Description: Dicamay Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: duz
+Description: Duli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dva
+Description: Duau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dwa
+Description: Diri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dwl
+Description: Walo Kumbe Dogon
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see dbt, dbw
+%%
+Type: language
+Subtag: dwr
+Description: Dawro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dws
+Description: Dutton World Speedwords
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dww
+Description: Dawawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dya
+Description: Dyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyb
+Description: Dyaberdyaber
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyd
+Description: Dyugun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyg
+Description: Villa Viciosa Agta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyi
+Description: Djimini Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dym
+Description: Yanda Dom Dogon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyn
+Description: Dyangadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyo
+Description: Jola-Fonyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dyu
+Description: Dyula
+Added: 2005-10-16
+%%
+Type: language
+Subtag: dyy
+Description: Dyaabugay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dza
+Description: Tunzu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dzd
+Description: Daza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dzg
+Description: Dazaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dzl
+Description: Dzalakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: dzn
+Description: Dzando
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ebg
+Description: Ebughu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ebk
+Description: Eastern Bontok
+Added: 2010-03-11
+Macrolanguage: bnc
+%%
+Type: language
+Subtag: ebo
+Description: Teke-Ebo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ebr
+Description: Ebrié
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ebu
+Description: Embu
+Description: Kiembu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ecr
+Description: Eteocretan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ecs
+Description: Ecuadorian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ecy
+Description: Eteocypriot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eee
+Description: E
+Added: 2009-07-29
+%%
+Type: language
+Subtag: efa
+Description: Efai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: efe
+Description: Efe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: efi
+Description: Efik
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ega
+Description: Ega
+Added: 2009-07-29
+%%
+Type: language
+Subtag: egl
+Description: Emilian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ego
+Description: Eggon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: egx
+Description: Egyptian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: egy
+Description: Egyptian (Ancient)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ehu
+Description: Ehueun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eip
+Description: Eipomek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eit
+Description: Eitiep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eiv
+Description: Askopan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eja
+Description: Ejamat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eka
+Description: Ekajuk
+Added: 2005-10-16
+%%
+Type: language
+Subtag: eke
+Description: Ekit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ekg
+Description: Ekari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eki
+Description: Eki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ekk
+Description: Standard Estonian
+Added: 2009-07-29
+Macrolanguage: et
+%%
+Type: language
+Subtag: ekl
+Description: Kol (Bangladesh)
+Description: Kol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ekm
+Description: Elip
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eko
+Description: Koti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ekp
+Description: Ekpeye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ekr
+Description: Yace
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eky
+Description: Eastern Kayah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ele
+Description: Elepi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: elh
+Description: El Hugeirat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eli
+Description: Nding
+Added: 2009-07-29
+%%
+Type: language
+Subtag: elk
+Description: Elkei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: elm
+Description: Eleme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: elo
+Description: El Molo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: elp
+Description: Elpaputih
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see amq, plh
+%%
+Type: language
+Subtag: elu
+Description: Elu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: elx
+Description: Elamite
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ema
+Description: Emai-Iuleha-Ora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emb
+Description: Embaloh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eme
+Description: Emerillon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emg
+Description: Eastern Meohang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emi
+Description: Mussau-Emira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emk
+Description: Eastern Maninkakan
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: emm
+Description: Mamulique
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emn
+Description: Eman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emo
+Description: Emok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emp
+Description: Northern Emberá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ems
+Description: Pacific Gulf Yupik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emu
+Description: Eastern Muria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emw
+Description: Emplawas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: emx
+Description: Erromintxela
+Added: 2010-03-11
+%%
+Type: language
+Subtag: emy
+Description: Epigraphic Mayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ena
+Description: Apali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enb
+Description: Markweeta
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: enc
+Description: En
+Added: 2009-07-29
+%%
+Type: language
+Subtag: end
+Description: Ende
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enf
+Description: Forest Enets
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enh
+Description: Tundra Enets
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enm
+Description: Middle English (1100-1500)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: enn
+Description: Engenni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eno
+Description: Enggano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enq
+Description: Enga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enr
+Description: Emumu
+Description: Emem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enu
+Description: Enu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: env
+Description: Enwan (Edu State)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: enw
+Description: Enwan (Akwa Ibom State)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eot
+Description: Beti (Côte d'Ivoire)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: epi
+Description: Epie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: era
+Description: Eravallan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: erg
+Description: Sie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: erh
+Description: Eruwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eri
+Description: Ogea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: erk
+Description: South Efate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ero
+Description: Horpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: err
+Description: Erre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ers
+Description: Ersu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ert
+Description: Eritai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: erw
+Description: Erokwanas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ese
+Description: Ese Ejja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esh
+Description: Eshtehardi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esi
+Description: North Alaskan Inupiatun
+Added: 2009-07-29
+Macrolanguage: ik
+%%
+Type: language
+Subtag: esk
+Description: Northwest Alaska Inupiatun
+Added: 2009-07-29
+Macrolanguage: ik
+%%
+Type: language
+Subtag: esl
+Description: Egypt Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esm
+Description: Esuma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esn
+Description: Salvadoran Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eso
+Description: Estonian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esq
+Description: Esselen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ess
+Description: Central Siberian Yupik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esu
+Description: Central Yupik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: esx
+Description: Eskimo-Aleut languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: etb
+Description: Etebi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: etc
+Description: Etchemin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eth
+Description: Ethiopian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: etn
+Description: Eton (Vanuatu)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eto
+Description: Eton (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: etr
+Description: Edolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ets
+Description: Yekhee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ett
+Description: Etruscan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: etu
+Description: Ejagham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: etx
+Description: Eten
+Added: 2009-07-29
+%%
+Type: language
+Subtag: etz
+Description: Semimi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: euq
+Description: Basque (family)
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: eve
+Description: Even
+Added: 2009-07-29
+%%
+Type: language
+Subtag: evh
+Description: Uvbie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: evn
+Description: Evenki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ewo
+Description: Ewondo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ext
+Description: Extremaduran
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eya
+Description: Eyak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: eyo
+Description: Keiyo
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: eze
+Description: Uzekwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: faa
+Description: Fasu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fab
+Description: Fa D'ambu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fad
+Description: Wagi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: faf
+Description: Fagani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fag
+Description: Finongan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fah
+Description: Baissa Fali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fai
+Description: Faiwol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: faj
+Description: Faita
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fak
+Description: Fang (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fal
+Description: South Fali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fam
+Description: Fam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fan
+Description: Fang (Equatorial Guinea)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: fap
+Description: Palor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: far
+Description: Fataleka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fat
+Description: Fanti
+Added: 2005-10-16
+Macrolanguage: ak
+%%
+Type: language
+Subtag: fau
+Description: Fayu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fax
+Description: Fala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fay
+Description: Southwestern Fars
+Added: 2009-07-29
+%%
+Type: language
+Subtag: faz
+Description: Northwestern Fars
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fbl
+Description: West Albay Bikol
+Added: 2010-03-11
+Macrolanguage: bik
+%%
+Type: language
+Subtag: fcs
+Description: Quebec Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fer
+Description: Feroge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ffi
+Description: Foia Foia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ffm
+Description: Maasina Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fgr
+Description: Fongoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fia
+Description: Nobiin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fie
+Description: Fyer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fil
+Description: Filipino
+Description: Pilipino
+Added: 2005-10-16
+%%
+Type: language
+Subtag: fip
+Description: Fipa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fir
+Description: Firan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fit
+Description: Tornedalen Finnish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fiu
+Description: Finno-Ugrian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: fiw
+Description: Fiwaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fkk
+Description: Kirya-Konzəl
+Added: 2012-08-12
+%%
+Type: language
+Subtag: fkv
+Description: Kven Finnish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fla
+Description: Kalispel-Pend d'Oreille
+Added: 2009-07-29
+%%
+Type: language
+Subtag: flh
+Description: Foau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fli
+Description: Fali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fll
+Description: North Fali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fln
+Description: Flinders Island
+Added: 2009-07-29
+%%
+Type: language
+Subtag: flr
+Description: Fuliiru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fly
+Description: Tsotsitaal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fmp
+Description: Fe'fe'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fmu
+Description: Far Western Muria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fng
+Description: Fanagalo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fni
+Description: Fania
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fod
+Description: Foodo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: foi
+Description: Foi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fom
+Description: Foma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fon
+Description: Fon
+Added: 2005-10-16
+%%
+Type: language
+Subtag: for
+Description: Fore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fos
+Description: Siraya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fox
+Description: Formosan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: fpe
+Description: Fernando Po Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fqs
+Description: Fas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: frc
+Description: Cajun French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: frd
+Description: Fordata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: frk
+Description: Frankish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: frm
+Description: Middle French (ca. 1400-1600)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: fro
+Description: Old French (842-ca. 1400)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: frp
+Description: Arpitan
+Description: Francoprovençal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: frq
+Description: Forak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: frr
+Description: Northern Frisian
+Added: 2006-03-08
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: frs
+Description: Eastern Frisian
+Added: 2006-03-08
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: frt
+Description: Fortsenal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fse
+Description: Finnish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fsl
+Description: French Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fss
+Description: Finland-Swedish Sign Language
+Description: finlandssvenskt teckenspråk
+Description: suomenruotsalainen viittomakieli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fub
+Description: Adamawa Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fuc
+Description: Pulaar
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fud
+Description: East Futuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fue
+Description: Borgu Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fuf
+Description: Pular
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fuh
+Description: Western Niger Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fui
+Description: Bagirmi Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fuj
+Description: Ko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fum
+Description: Fum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fun
+Description: Fulniô
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fuq
+Description: Central-Eastern Niger Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fur
+Description: Friulian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: fut
+Description: Futuna-Aniwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fuu
+Description: Furu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fuv
+Description: Nigerian Fulfulde
+Added: 2009-07-29
+Macrolanguage: ff
+%%
+Type: language
+Subtag: fuy
+Description: Fuyug
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fvr
+Description: Fur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fwa
+Description: Fwâi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: fwe
+Description: Fwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gaa
+Description: Ga
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gab
+Description: Gabri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gac
+Description: Mixed Great Andamanese
+Added: 2010-03-11
+%%
+Type: language
+Subtag: gad
+Description: Gaddang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gae
+Description: Guarequena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gaf
+Description: Gende
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gag
+Description: Gagauz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gah
+Description: Alekano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gai
+Description: Borei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gaj
+Description: Gadsup
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gak
+Description: Gamkonora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gal
+Description: Galoli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gam
+Description: Kandawo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gan
+Description: Gan Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: gao
+Description: Gants
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gap
+Description: Gal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gaq
+Description: Gata'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gar
+Description: Galeya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gas
+Description: Adiwasi Garasia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gat
+Description: Kenati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gau
+Description: Mudhili Gadaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gav
+Description: Gabutamon
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: dev
+%%
+Type: language
+Subtag: gaw
+Description: Nobonob
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gax
+Description: Borana-Arsi-Guji Oromo
+Added: 2009-07-29
+Macrolanguage: om
+%%
+Type: language
+Subtag: gay
+Description: Gayo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gaz
+Description: West Central Oromo
+Added: 2009-07-29
+Macrolanguage: om
+%%
+Type: language
+Subtag: gba
+Description: Gbaya (Central African Republic)
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: gbb
+Description: Kaytetye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbc
+Description: Garawa
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see wny, wrk
+%%
+Type: language
+Subtag: gbd
+Description: Karadjeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbe
+Description: Niksek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbf
+Description: Gaikundi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbg
+Description: Gbanziri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbh
+Description: Defi Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbi
+Description: Galela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbj
+Description: Bodo Gadaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbk
+Description: Gaddi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbl
+Description: Gamit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbm
+Description: Garhwali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbn
+Description: Mo'da
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbo
+Description: Northern Grebo
+Added: 2009-07-29
+Macrolanguage: grb
+%%
+Type: language
+Subtag: gbp
+Description: Gbaya-Bossangoa
+Added: 2009-07-29
+Macrolanguage: gba
+%%
+Type: language
+Subtag: gbq
+Description: Gbaya-Bozoum
+Added: 2009-07-29
+Macrolanguage: gba
+%%
+Type: language
+Subtag: gbr
+Description: Gbagyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbs
+Description: Gbesi Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbu
+Description: Gagadu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbv
+Description: Gbanu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbx
+Description: Eastern Xwla Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gby
+Description: Gbari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gbz
+Description: Zoroastrian Dari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gcc
+Description: Mali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gcd
+Description: Ganggalida
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gce
+Description: Galice
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gcf
+Description: Guadeloupean Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gcl
+Description: Grenadian Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gcn
+Description: Gaina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gcr
+Description: Guianese Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gct
+Description: Colonia Tovar German
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gda
+Description: Gade Lohar
+Added: 2009-07-29
+Macrolanguage: raj
+%%
+Type: language
+Subtag: gdb
+Description: Pottangi Ollar Gadaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdc
+Description: Gugu Badhun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdd
+Description: Gedaged
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gde
+Description: Gude
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdf
+Description: Guduf-Gava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdg
+Description: Ga'dang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdh
+Description: Gadjerawang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdi
+Description: Gundi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdj
+Description: Gurdjar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdk
+Description: Gadang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdl
+Description: Dirasha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdm
+Description: Laal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdn
+Description: Umanakaina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdo
+Description: Ghodoberi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdq
+Description: Mehri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdr
+Description: Wipi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gds
+Description: Ghandruk Sign Language
+Added: 2012-08-12
+%%
+Type: language
+Subtag: gdu
+Description: Gudu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gdx
+Description: Godwari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gea
+Description: Geruma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: geb
+Description: Kire
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gec
+Description: Gboloo Grebo
+Added: 2009-07-29
+Macrolanguage: grb
+%%
+Type: language
+Subtag: ged
+Description: Gade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: geg
+Description: Gengle
+Added: 2009-07-29
+%%
+Type: language
+Subtag: geh
+Description: Hutterite German
+Description: Hutterisch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gei
+Description: Gebe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gej
+Description: Gen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gek
+Description: Yiwom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gel
+Description: ut-Ma'in
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gem
+Description: Germanic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: geq
+Description: Geme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ges
+Description: Geser-Gorom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gew
+Description: Gera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gex
+Description: Garre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gey
+Description: Enya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gez
+Description: Geez
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gfk
+Description: Patpatar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gft
+Description: Gafat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gfx
+Description: Mangetti Dune !Xung
+Added: 2012-08-12
+%%
+Type: language
+Subtag: gga
+Description: Gao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggb
+Description: Gbii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggd
+Description: Gugadj
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gge
+Description: Guragone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggg
+Description: Gurgula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggk
+Description: Kungarakany
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggl
+Description: Ganglau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggn
+Description: Eastern Gurung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggo
+Description: Southern Gondi
+Added: 2009-07-29
+Macrolanguage: gon
+%%
+Type: language
+Subtag: ggr
+Description: Aghu Tharnggalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggt
+Description: Gitua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggu
+Description: Gagu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ggw
+Description: Gogodala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gha
+Description: Ghadamès
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghc
+Description: Hiberno-Scottish Gaelic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghe
+Description: Southern Ghale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghh
+Description: Northern Ghale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghk
+Description: Geko Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghl
+Description: Ghulfan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghn
+Description: Ghanongga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gho
+Description: Ghomara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghr
+Description: Ghera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ghs
+Description: Guhu-Samane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ght
+Description: Kuke
+Description: Kutang Ghale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gia
+Description: Kitja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gib
+Description: Gibanawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gic
+Description: Gail
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gid
+Description: Gidar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gig
+Description: Goaria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gil
+Description: Gilbertese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gim
+Description: Gimi (Eastern Highlands)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gin
+Description: Hinukh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gio
+Description: Gelao
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see aou, gqu
+%%
+Type: language
+Subtag: gip
+Description: Gimi (West New Britain)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: giq
+Description: Green Gelao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gir
+Description: Red Gelao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gis
+Description: North Giziga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: git
+Description: Gitxsan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: giu
+Description: Mulao
+Added: 2012-08-12
+%%
+Type: language
+Subtag: giw
+Description: White Gelao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gix
+Description: Gilima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: giy
+Description: Giyug
+Added: 2009-07-29
+%%
+Type: language
+Subtag: giz
+Description: South Giziga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gji
+Description: Geji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gjk
+Description: Kachi Koli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gjn
+Description: Gonja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gju
+Description: Gujari
+Added: 2009-07-29
+Macrolanguage: raj
+%%
+Type: language
+Subtag: gka
+Description: Guya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gke
+Description: Ndai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gkn
+Description: Gokana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gko
+Description: Kok-Nar
+Added: 2012-08-12
+%%
+Type: language
+Subtag: gkp
+Description: Guinea Kpelle
+Added: 2009-07-29
+Macrolanguage: kpe
+%%
+Type: language
+Subtag: glc
+Description: Bon Gula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gld
+Description: Nanai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glh
+Description: Northwest Pashayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gli
+Description: Guliguli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glj
+Description: Gula Iro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glk
+Description: Gilaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glo
+Description: Galambu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glr
+Description: Glaro-Twabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glu
+Description: Gula (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: glw
+Description: Glavda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gly
+Description: Gule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gma
+Description: Gambera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmb
+Description: Gula'alaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmd
+Description: Mághdì
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gme
+Description: East Germanic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: gmh
+Description: Middle High German (ca. 1050-1500)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gml
+Description: Middle Low German
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmm
+Description: Gbaya-Mbodomo
+Added: 2009-07-29
+Macrolanguage: gba
+%%
+Type: language
+Subtag: gmn
+Description: Gimnime
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmq
+Description: North Germanic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: gmu
+Description: Gumalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmv
+Description: Gamo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmw
+Description: West Germanic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: gmx
+Description: Magoma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gmy
+Description: Mycenaean Greek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gna
+Description: Kaansa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnb
+Description: Gangte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnc
+Description: Guanche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnd
+Description: Zulgo-Gemzek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gne
+Description: Ganang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gng
+Description: Ngangam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnh
+Description: Lere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gni
+Description: Gooniyandi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnk
+Description: //Gana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnl
+Description: Gangulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnm
+Description: Ginuman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnn
+Description: Gumatj
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gno
+Description: Northern Gondi
+Added: 2009-07-29
+Macrolanguage: gon
+%%
+Type: language
+Subtag: gnq
+Description: Gana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnr
+Description: Gureng Gureng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnt
+Description: Guntai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnu
+Description: Gnau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gnw
+Description: Western Bolivian Guaraní
+Added: 2009-07-29
+Macrolanguage: gn
+%%
+Type: language
+Subtag: gnz
+Description: Ganzi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goa
+Description: Guro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gob
+Description: Playero
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goc
+Description: Gorakor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: god
+Description: Godié
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goe
+Description: Gongduk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gof
+Description: Gofa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gog
+Description: Gogo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goh
+Description: Old High German (ca. 750-1050)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: goi
+Description: Gobasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goj
+Description: Gowlan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gok
+Description: Gowli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gol
+Description: Gola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gom
+Description: Goan Konkani
+Added: 2009-07-29
+Macrolanguage: kok
+%%
+Type: language
+Subtag: gon
+Description: Gondi
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: goo
+Description: Gone Dau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gop
+Description: Yeretuar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goq
+Description: Gorap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gor
+Description: Gorontalo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gos
+Description: Gronings
+Added: 2009-07-29
+%%
+Type: language
+Subtag: got
+Description: Gothic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gou
+Description: Gavar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gow
+Description: Gorowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gox
+Description: Gobu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goy
+Description: Goundo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: goz
+Description: Gozarkhani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gpa
+Description: Gupa-Abawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gpe
+Description: Ghanaian Pidgin English
+Added: 2012-08-12
+%%
+Type: language
+Subtag: gpn
+Description: Taiap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gqa
+Description: Ga'anda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gqi
+Description: Guiqiong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gqn
+Description: Guana (Brazil)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gqr
+Description: Gor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gqu
+Description: Qau
+Added: 2012-08-12
+%%
+Type: language
+Subtag: gra
+Description: Rajput Garasia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grb
+Description: Grebo
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: grc
+Description: Ancient Greek (to 1453)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: grd
+Description: Guruntum-Mbaaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grg
+Description: Madi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grh
+Description: Gbiri-Niragu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gri
+Description: Ghari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grj
+Description: Southern Grebo
+Added: 2009-07-29
+Macrolanguage: grb
+%%
+Type: language
+Subtag: grk
+Description: Greek languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: grm
+Description: Kota Marudu Talantang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gro
+Description: Groma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grq
+Description: Gorovu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grr
+Description: Taznatit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grs
+Description: Gresi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grt
+Description: Garo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gru
+Description: Kistane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grv
+Description: Central Grebo
+Added: 2009-07-29
+Macrolanguage: grb
+%%
+Type: language
+Subtag: grw
+Description: Gweda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: grx
+Description: Guriaso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gry
+Description: Barclayville Grebo
+Added: 2009-07-29
+Macrolanguage: grb
+%%
+Type: language
+Subtag: grz
+Description: Guramalum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gse
+Description: Ghanaian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gsg
+Description: German Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gsl
+Description: Gusilay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gsm
+Description: Guatemalan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gsn
+Description: Gusan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gso
+Description: Southwest Gbaya
+Added: 2009-07-29
+Macrolanguage: gba
+%%
+Type: language
+Subtag: gsp
+Description: Wasembo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gss
+Description: Greek Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gsw
+Description: Swiss German
+Description: Alemannic
+Description: Alsatian
+Added: 2006-03-08
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: gta
+Description: Guató
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gti
+Description: Gbati-ri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gua
+Description: Shiki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gub
+Description: Guajajára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guc
+Description: Wayuu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gud
+Description: Yocoboué Dida
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gue
+Description: Gurinji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guf
+Description: Gupapuyngu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gug
+Description: Paraguayan Guaraní
+Added: 2009-07-29
+Macrolanguage: gn
+%%
+Type: language
+Subtag: guh
+Description: Guahibo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gui
+Description: Eastern Bolivian Guaraní
+Added: 2009-07-29
+Macrolanguage: gn
+%%
+Type: language
+Subtag: guk
+Description: Gumuz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gul
+Description: Sea Island Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gum
+Description: Guambiano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gun
+Description: Mbyá Guaraní
+Added: 2009-07-29
+Macrolanguage: gn
+%%
+Type: language
+Subtag: guo
+Description: Guayabero
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gup
+Description: Gunwinggu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guq
+Description: Aché
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gur
+Description: Farefare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gus
+Description: Guinean Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gut
+Description: Maléku Jaíka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guu
+Description: Yanomamö
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guv
+Description: Gey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guw
+Description: Gun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gux
+Description: Gourmanchéma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: guz
+Description: Gusii
+Description: Ekegusii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gva
+Description: Guana (Paraguay)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvc
+Description: Guanano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gve
+Description: Duwet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvf
+Description: Golin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvj
+Description: Guajá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvl
+Description: Gulay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvm
+Description: Gurmana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvn
+Description: Kuku-Yalanji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvo
+Description: Gavião Do Jiparaná
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvp
+Description: Pará Gavião
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvr
+Description: Western Gurung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvs
+Description: Gumawana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gvy
+Description: Guyani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwa
+Description: Mbato
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwb
+Description: Gwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwc
+Description: Kalami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwd
+Description: Gawwada
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwe
+Description: Gweno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwf
+Description: Gowro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwg
+Description: Moo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwi
+Description: Gwichʼin
+Added: 2005-10-16
+%%
+Type: language
+Subtag: gwj
+Description: /Gwi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwm
+Description: Awngthim
+Added: 2012-08-12
+%%
+Type: language
+Subtag: gwn
+Description: Gwandara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwr
+Description: Gwere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwt
+Description: Gawar-Bati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwu
+Description: Guwamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gww
+Description: Kwini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gwx
+Description: Gua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gxx
+Description: Wè Southern
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gya
+Description: Northwest Gbaya
+Added: 2009-07-29
+Macrolanguage: gba
+%%
+Type: language
+Subtag: gyb
+Description: Garus
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyd
+Description: Kayardild
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gye
+Description: Gyem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyf
+Description: Gungabula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyg
+Description: Gbayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyi
+Description: Gyele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyl
+Description: Gayil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gym
+Description: Ngäbere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyn
+Description: Guyanese Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyr
+Description: Guarayu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gyy
+Description: Gunya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gza
+Description: Ganza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gzi
+Description: Gazi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: gzn
+Description: Gane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: haa
+Description: Han
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hab
+Description: Hanoi Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hac
+Description: Gurani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: had
+Description: Hatam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hae
+Description: Eastern Oromo
+Added: 2009-07-29
+Macrolanguage: om
+%%
+Type: language
+Subtag: haf
+Description: Haiphong Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hag
+Description: Hanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hah
+Description: Hahon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hai
+Description: Haida
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: haj
+Description: Hajong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hak
+Description: Hakka Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: hal
+Description: Halang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ham
+Description: Hewa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: han
+Description: Hangaza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hao
+Description: Hakö
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hap
+Description: Hupla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: haq
+Description: Ha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: har
+Description: Harari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: has
+Description: Haisla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hav
+Description: Havu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: haw
+Description: Hawaiian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: hax
+Description: Southern Haida
+Added: 2009-07-29
+Macrolanguage: hai
+%%
+Type: language
+Subtag: hay
+Description: Haya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: haz
+Description: Hazaragi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hba
+Description: Hamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hbb
+Description: Huba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hbn
+Description: Heiban
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hbo
+Description: Ancient Hebrew
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hbu
+Description: Habu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hca
+Description: Andaman Creole Hindi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hch
+Description: Huichol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hdn
+Description: Northern Haida
+Added: 2009-07-29
+Macrolanguage: hai
+%%
+Type: language
+Subtag: hds
+Description: Honduras Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hdy
+Description: Hadiyya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hea
+Description: Northern Qiandong Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hed
+Description: Herdé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: heg
+Description: Helong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: heh
+Description: Hehe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hei
+Description: Heiltsuk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hem
+Description: Hemba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hgm
+Description: Hai//om
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hgw
+Description: Haigwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hhi
+Description: Hoia Hoia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hhr
+Description: Kerak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hhy
+Description: Hoyahoya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hia
+Description: Lamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hib
+Description: Hibito
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hid
+Description: Hidatsa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hif
+Description: Fiji Hindi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hig
+Description: Kamwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hih
+Description: Pamosu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hii
+Description: Hinduri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hij
+Description: Hijuk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hik
+Description: Seit-Kaitetu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hil
+Description: Hiligaynon
+Added: 2005-10-16
+%%
+Type: language
+Subtag: him
+Description: Himachali languages
+Description: Western Pahari languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: hio
+Description: Tsoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hir
+Description: Himarimã
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hit
+Description: Hittite
+Added: 2005-10-16
+%%
+Type: language
+Subtag: hiw
+Description: Hiw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hix
+Description: Hixkaryána
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hji
+Description: Haji
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: hka
+Description: Kahe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hke
+Description: Hunde
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hkk
+Description: Hunjara-Kaina Ke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hks
+Description: Hong Kong Sign Language
+Description: Heung Kong Sau Yue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hla
+Description: Halia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hlb
+Description: Halbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hld
+Description: Halang Doan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hle
+Description: Hlersu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hlt
+Description: Matu Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hlu
+Description: Hieroglyphic Luwian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hma
+Description: Southern Mashan Hmong
+Description: Southern Mashan Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmb
+Description: Humburi Senni Songhay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hmc
+Description: Central Huishui Hmong
+Description: Central Huishui Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmd
+Description: Large Flowery Miao
+Description: A-hmaos
+Description: Da-Hua Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hme
+Description: Eastern Huishui Hmong
+Description: Eastern Huishui Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmf
+Description: Hmong Don
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hmg
+Description: Southwestern Guiyang Hmong
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmh
+Description: Southwestern Huishui Hmong
+Description: Southwestern Huishui Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmi
+Description: Northern Huishui Hmong
+Description: Northern Huishui Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmj
+Description: Ge
+Description: Gejia
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmk
+Description: Maek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hml
+Description: Luopohe Hmong
+Description: Luopohe Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmm
+Description: Central Mashan Hmong
+Description: Central Mashan Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmn
+Description: Hmong
+Description: Mong
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: hmp
+Description: Northern Mashan Hmong
+Description: Northern Mashan Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmq
+Description: Eastern Qiandong Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmr
+Description: Hmar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hms
+Description: Southern Qiandong Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmt
+Description: Hamtai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hmu
+Description: Hamap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hmv
+Description: Hmong Dô
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hmw
+Description: Western Mashan Hmong
+Description: Western Mashan Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmx
+Description: Hmong-Mien languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: hmy
+Description: Southern Guiyang Hmong
+Description: Southern Guiyang Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hmz
+Description: Hmong Shua
+Description: Sinicized Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hna
+Description: Mina (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hnd
+Description: Southern Hindko
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: hne
+Description: Chhattisgarhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hnh
+Description: //Ani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hni
+Description: Hani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hnj
+Description: Hmong Njua
+Description: Mong Leng
+Description: Mong Njua
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hnn
+Description: Hanunoo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hno
+Description: Northern Hindko
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: hns
+Description: Caribbean Hindustani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hnu
+Description: Hung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoa
+Description: Hoava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hob
+Description: Mari (Madang Province)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoc
+Description: Ho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hod
+Description: Holma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoe
+Description: Horom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoh
+Description: Hobyót
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoi
+Description: Holikachuk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoj
+Description: Hadothi
+Description: Haroti
+Added: 2009-07-29
+Macrolanguage: raj
+%%
+Type: language
+Subtag: hok
+Description: Hokan languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: hol
+Description: Holu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hom
+Description: Homa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoo
+Description: Holoholo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hop
+Description: Hopi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hor
+Description: Horo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hos
+Description: Ho Chi Minh City Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hot
+Description: Hote
+Description: Malê
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hov
+Description: Hovongan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: how
+Description: Honi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoy
+Description: Holiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hoz
+Description: Hozo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hpo
+Description: Hpon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hps
+Description: Hawai'i Pidgin Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hra
+Description: Hrangkhol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hre
+Description: Hre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hrk
+Description: Haruku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hrm
+Description: Horned Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: hro
+Description: Haroi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hrr
+Description: Horuru
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: jal
+%%
+Type: language
+Subtag: hrt
+Description: Hértevin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hru
+Description: Hruso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hrx
+Description: Hunsrik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hrz
+Description: Harzani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hsb
+Description: Upper Sorbian
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: hsh
+Description: Hungarian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hsl
+Description: Hausa Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hsn
+Description: Xiang Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: hss
+Description: Harsusi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hti
+Description: Hoti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hto
+Description: Minica Huitoto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hts
+Description: Hadza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: htu
+Description: Hitu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: htx
+Description: Middle Hittite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hub
+Description: Huambisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huc
+Description: =/Hua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hud
+Description: Huaulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hue
+Description: San Francisco Del Mar Huave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huf
+Description: Humene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hug
+Description: Huachipaeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huh
+Description: Huilliche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hui
+Description: Huli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huj
+Description: Northern Guiyang Hmong
+Description: Northern Guiyang Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: huk
+Description: Hulung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hul
+Description: Hula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hum
+Description: Hungana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huo
+Description: Hu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hup
+Description: Hupa
+Added: 2005-10-16
+%%
+Type: language
+Subtag: huq
+Description: Tsat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hur
+Description: Halkomelem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hus
+Description: Huastec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hut
+Description: Humla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huu
+Description: Murui Huitoto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huv
+Description: San Mateo Del Mar Huave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huw
+Description: Hukumina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hux
+Description: Nüpode Huitoto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huy
+Description: Hulaulá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: huz
+Description: Hunzib
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hvc
+Description: Haitian Vodoun Culture Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hve
+Description: San Dionisio Del Mar Huave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hvk
+Description: Haveke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hvn
+Description: Sabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hvv
+Description: Santa María Del Mar Huave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hwa
+Description: Wané
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hwc
+Description: Hawai'i Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hwo
+Description: Hwana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hya
+Description: Hya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: hyx
+Description: Armenian (family)
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: iai
+Description: Iaai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ian
+Description: Iatmul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iap
+Description: Iapama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iar
+Description: Purari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iba
+Description: Iban
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ibb
+Description: Ibibio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibd
+Description: Iwaidja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibe
+Description: Akpes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibg
+Description: Ibanag
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibi
+Description: Ibilo
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: opa
+%%
+Type: language
+Subtag: ibl
+Description: Ibaloi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibm
+Description: Agoi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibn
+Description: Ibino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibr
+Description: Ibuoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ibu
+Description: Ibu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iby
+Description: Ibani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ica
+Description: Ede Ica
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ich
+Description: Etkywan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: icl
+Description: Icelandic Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: icr
+Description: Islander Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ida
+Description: Idakho-Isukha-Tiriki
+Description: Luidakho-Luisukha-Lutirichi
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: idb
+Description: Indo-Portuguese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: idc
+Description: Idon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: idd
+Description: Ede Idaca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ide
+Description: Idere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: idi
+Description: Idi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: idr
+Description: Indri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ids
+Description: Idesa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: idt
+Description: Idaté
+Added: 2009-07-29
+%%
+Type: language
+Subtag: idu
+Description: Idoma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ifa
+Description: Amganad Ifugao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ifb
+Description: Batad Ifugao
+Description: Ayangan Ifugao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ife
+Description: Ifè
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iff
+Description: Ifo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ifk
+Description: Tuwali Ifugao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ifm
+Description: Teke-Fuumu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ifu
+Description: Mayoyao Ifugao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ify
+Description: Keley-I Kallahan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igb
+Description: Ebira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ige
+Description: Igede
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igg
+Description: Igana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igl
+Description: Igala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igm
+Description: Kanggape
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ign
+Description: Ignaciano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igo
+Description: Isebe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igs
+Description: Interglossa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: igw
+Description: Igwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ihb
+Description: Iha Based Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ihi
+Description: Ihievbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ihp
+Description: Iha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ihw
+Description: Bidhawal
+Added: 2012-08-12
+%%
+Type: language
+Subtag: iir
+Description: Indo-Iranian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: ijc
+Description: Izon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ije
+Description: Biseni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ijj
+Description: Ede Ije
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ijn
+Description: Kalabari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ijo
+Description: Ijo languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ijs
+Description: Southeast Ijo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ike
+Description: Eastern Canadian Inuktitut
+Added: 2009-07-29
+Macrolanguage: iu
+%%
+Type: language
+Subtag: iki
+Description: Iko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikk
+Description: Ika
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikl
+Description: Ikulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iko
+Description: Olulumo-Ikom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikp
+Description: Ikpeshi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikt
+Description: Inuinnaqtun
+Description: Western Canadian Inuktitut
+Added: 2009-07-29
+Macrolanguage: iu
+%%
+Type: language
+Subtag: ikv
+Description: Iku-Gora-Ankwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikw
+Description: Ikwere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikx
+Description: Ik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ikz
+Description: Ikizu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ila
+Description: Ile Ape
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilb
+Description: Ila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilg
+Description: Garig-Ilgar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ili
+Description: Ili Turki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilk
+Description: Ilongot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ill
+Description: Iranun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilo
+Description: Iloko
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ils
+Description: International Sign
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilu
+Description: Ili'uun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilv
+Description: Ilue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ilw
+Description: Talur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ima
+Description: Mala Malasar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ime
+Description: Imeraguen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: imi
+Description: Anamgura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iml
+Description: Miluk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: imn
+Description: Imonda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: imo
+Description: Imbongu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: imr
+Description: Imroing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ims
+Description: Marsian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: imy
+Description: Milyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inb
+Description: Inga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inc
+Description: Indic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ine
+Description: Indo-European languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ing
+Description: Degexit'an
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inh
+Description: Ingush
+Added: 2005-10-16
+%%
+Type: language
+Subtag: inj
+Description: Jungle Inga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inl
+Description: Indonesian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inm
+Description: Minaean
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inn
+Description: Isinai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ino
+Description: Inoke-Yate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inp
+Description: Iñapari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ins
+Description: Indian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: int
+Description: Intha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: inz
+Description: Ineseño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ior
+Description: Inor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iou
+Description: Tuma-Irumu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iow
+Description: Iowa-Oto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ipi
+Description: Ipili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ipo
+Description: Ipiko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iqu
+Description: Iquito
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ira
+Description: Iranian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ire
+Description: Iresim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: irh
+Description: Irarutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iri
+Description: Irigwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: irk
+Description: Iraqw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: irn
+Description: Irántxe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iro
+Description: Iroquoian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: irr
+Description: Ir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iru
+Description: Irula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: irx
+Description: Kamberau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iry
+Description: Iraya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isa
+Description: Isabi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isc
+Description: Isconahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isd
+Description: Isnag
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ise
+Description: Italian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isg
+Description: Irish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ish
+Description: Esan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isi
+Description: Nkem-Nkum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isk
+Description: Ishkashimi
+Added: 2010-03-11
+%%
+Type: language
+Subtag: ism
+Description: Masimasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isn
+Description: Isanzu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iso
+Description: Isoko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isr
+Description: Israeli Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ist
+Description: Istriot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: isu
+Description: Isu (Menchum Division)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itb
+Description: Binongan Itneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itc
+Description: Italic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: ite
+Description: Itene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iti
+Description: Inlaod Itneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itk
+Description: Judeo-Italian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itl
+Description: Itelmen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itm
+Description: Itu Mbon Uzo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ito
+Description: Itonama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itr
+Description: Iteri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: its
+Description: Isekiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itt
+Description: Maeng Itneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itv
+Description: Itawit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itw
+Description: Ito
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itx
+Description: Itik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ity
+Description: Moyadan Itneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: itz
+Description: Itzá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ium
+Description: Iu Mien
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ivb
+Description: Ibatan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ivv
+Description: Ivatan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iwk
+Description: I-Wak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iwm
+Description: Iwam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iwo
+Description: Iwur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iws
+Description: Sepik Iwam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ixc
+Description: Ixcatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ixl
+Description: Ixil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iya
+Description: Iyayu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iyo
+Description: Mesaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: iyx
+Description: Yaka (Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: izh
+Description: Ingrian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: izi
+Description: Izi-Ezaa-Ikwo-Mgbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: izr
+Description: Izere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jaa
+Description: Jamamadí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jab
+Description: Hyam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jac
+Description: Popti'
+Description: Jakalteko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jad
+Description: Jahanka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jae
+Description: Yabem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jaf
+Description: Jara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jah
+Description: Jah Hut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jaj
+Description: Zazao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jak
+Description: Jakun
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: jal
+Description: Yalahatan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jam
+Description: Jamaican Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jan
+Description: Jandai
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jao
+Description: Yanyuwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jaq
+Description: Yaqay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jar
+Description: Jarawa (Nigeria)
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see jgk, jjr
+%%
+Type: language
+Subtag: jas
+Description: New Caledonian Javanese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jat
+Description: Jakati
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: jau
+Description: Yaur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jax
+Description: Jambi Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: jay
+Description: Yan-nhangu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jaz
+Description: Jawe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbe
+Description: Judeo-Berber
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbj
+Description: Arandai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbk
+Description: Barikewa
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jbn
+Description: Nafusi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbo
+Description: Lojban
+Added: 2005-10-16
+%%
+Type: language
+Subtag: jbr
+Description: Jofotek-Bromnya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbt
+Description: Jabutí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbu
+Description: Jukun Takum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jbw
+Description: Yawijibaya
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jcs
+Description: Jamaican Country Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jct
+Description: Krymchak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jda
+Description: Jad
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jdg
+Description: Jadgali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jdt
+Description: Judeo-Tat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jeb
+Description: Jebero
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jee
+Description: Jerung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jeg
+Description: Jeng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jeh
+Description: Jeh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jei
+Description: Yei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jek
+Description: Jeri Kuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jel
+Description: Yelmek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jen
+Description: Dza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jer
+Description: Jere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jet
+Description: Manem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jeu
+Description: Jonkor Bourmataguil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jgb
+Description: Ngbee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jge
+Description: Judeo-Georgian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jgk
+Description: Gwak
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jgo
+Description: Ngomba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jhi
+Description: Jehai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jhs
+Description: Jhankot Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jia
+Description: Jina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jib
+Description: Jibu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jic
+Description: Tol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jid
+Description: Bu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jie
+Description: Jilbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jig
+Description: Djingili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jih
+Description: sTodsde
+Description: Shangzhai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jii
+Description: Jiiddu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jil
+Description: Jilim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jim
+Description: Jimi (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jio
+Description: Jiamao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jiq
+Description: Guanyinqiao
+Description: Lavrung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jit
+Description: Jita
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jiu
+Description: Youle Jinuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jiv
+Description: Shuar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jiy
+Description: Buyuan Jinuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jjr
+Description: Bankal
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jkm
+Description: Mobwa Karen
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jko
+Description: Kubo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jkp
+Description: Paku Karen
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jkr
+Description: Koro (India)
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jku
+Description: Labir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jle
+Description: Ngile
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jls
+Description: Jamaican Sign Language
+Added: 2010-03-11
+%%
+Type: language
+Subtag: jma
+Description: Dima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmb
+Description: Zumbun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmc
+Description: Machame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmd
+Description: Yamdena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmi
+Description: Jimi (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jml
+Description: Jumli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmn
+Description: Makuri Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmr
+Description: Kamara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jms
+Description: Mashi (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jmw
+Description: Mouwase
+Added: 2012-08-12
+%%
+Type: language
+Subtag: jmx
+Description: Western Juxtlahuaca Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jna
+Description: Jangshung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jnd
+Description: Jandavra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jng
+Description: Yangman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jni
+Description: Janji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jnj
+Description: Yemsa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jnl
+Description: Rawat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jns
+Description: Jaunsari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: job
+Description: Joba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jod
+Description: Wojenaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jor
+Description: Jorá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jos
+Description: Jordanian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jow
+Description: Jowulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jpa
+Description: Jewish Palestinian Aramaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jpr
+Description: Judeo-Persian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: jpx
+Description: Japanese (family)
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: jqr
+Description: Jaqaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jra
+Description: Jarai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jrb
+Description: Judeo-Arabic
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: jrr
+Description: Jiru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jrt
+Description: Jorto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jru
+Description: Japrería
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jsl
+Description: Japanese Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jua
+Description: Júma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jub
+Description: Wannu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: juc
+Description: Jurchen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jud
+Description: Worodougou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: juh
+Description: Hõne
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jui
+Description: Ngadjuri
+Added: 2012-08-12
+%%
+Type: language
+Subtag: juk
+Description: Wapan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jul
+Description: Jirel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jum
+Description: Jumjum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jun
+Description: Juang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: juo
+Description: Jiba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jup
+Description: Hupdë
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jur
+Description: Jurúna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jus
+Description: Jumla Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jut
+Description: Jutish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: juu
+Description: Ju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: juw
+Description: Wãpha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: juy
+Description: Juray
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jvd
+Description: Javindo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jvn
+Description: Caribbean Javanese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jwi
+Description: Jwira-Pepesa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jya
+Description: Jiarong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: jye
+Description: Judeo-Yemeni Arabic
+Added: 2009-07-29
+Macrolanguage: jrb
+%%
+Type: language
+Subtag: jyy
+Description: Jaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kaa
+Description: Kara-Kalpak
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kab
+Description: Kabyle
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kac
+Description: Kachin
+Description: Jingpho
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kad
+Description: Adara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kae
+Description: Ketangalan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kaf
+Description: Katso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kag
+Description: Kajaman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kah
+Description: Kara (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kai
+Description: Karekare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kaj
+Description: Jju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kak
+Description: Kayapa Kallahan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kam
+Description: Kamba (Kenya)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kao
+Description: Xaasongaxango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kap
+Description: Bezhta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kaq
+Description: Capanahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kar
+Description: Karen languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: kav
+Description: Katukína
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kaw
+Description: Kawi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kax
+Description: Kao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kay
+Description: Kamayurá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kba
+Description: Kalarko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbb
+Description: Kaxuiâna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbc
+Description: Kadiwéu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbd
+Description: Kabardian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kbe
+Description: Kanju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbf
+Description: Kakauhua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbg
+Description: Khamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbh
+Description: Camsá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbi
+Description: Kaptiau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbj
+Description: Kari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbk
+Description: Grass Koiari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbl
+Description: Kanembu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbm
+Description: Iwal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbn
+Description: Kare (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbo
+Description: Keliko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbp
+Description: Kabiyè
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbq
+Description: Kamano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbr
+Description: Kafa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbs
+Description: Kande
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbt
+Description: Abadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbu
+Description: Kabutra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbv
+Description: Dera (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbw
+Description: Kaiep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kbx
+Description: Ap Ma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kby
+Description: Manga Kanuri
+Added: 2009-07-29
+Macrolanguage: kr
+%%
+Type: language
+Subtag: kbz
+Description: Duhwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kca
+Description: Khanty
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcb
+Description: Kawacha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcc
+Description: Lubila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcd
+Description: Ngkâlmpw Kanum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kce
+Description: Kaivi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcf
+Description: Ukaan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcg
+Description: Tyap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kch
+Description: Vono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kci
+Description: Kamantan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcj
+Description: Kobiana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kck
+Description: Kalanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcl
+Description: Kela (Papua New Guinea)
+Description: Kala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcm
+Description: Gula (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcn
+Description: Nubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kco
+Description: Kinalakna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcp
+Description: Kanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcq
+Description: Kamo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcr
+Description: Katla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcs
+Description: Koenoem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kct
+Description: Kaian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcu
+Description: Kami (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcv
+Description: Kete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcw
+Description: Kabwari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcx
+Description: Kachama-Ganjule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcy
+Description: Korandje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kcz
+Description: Konongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kda
+Description: Worimi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdc
+Description: Kutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdd
+Description: Yankunytjatjara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kde
+Description: Makonde
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdf
+Description: Mamusi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdg
+Description: Seba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdh
+Description: Tem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdi
+Description: Kumam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdj
+Description: Karamojong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdk
+Description: Numee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdl
+Description: Tsikimba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdm
+Description: Kagoma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdn
+Description: Kunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdo
+Description: Kordofanian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: kdp
+Description: Kaningdon-Nindem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdq
+Description: Koch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdr
+Description: Karaim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdt
+Description: Kuy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdu
+Description: Kadaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdv
+Description: Kado
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see zkd, zkn
+%%
+Type: language
+Subtag: kdw
+Description: Koneraw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdx
+Description: Kam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdy
+Description: Keder
+Description: Keijar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kdz
+Description: Kwaja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kea
+Description: Kabuverdianu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: keb
+Description: Kélé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kec
+Description: Keiga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ked
+Description: Kerewe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kee
+Description: Eastern Keres
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kef
+Description: Kpessi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: keg
+Description: Tese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: keh
+Description: Keak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kei
+Description: Kei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kej
+Description: Kadar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kek
+Description: Kekchí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kel
+Description: Kela (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kem
+Description: Kemak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ken
+Description: Kenyang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: keo
+Description: Kakwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kep
+Description: Kaikadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: keq
+Description: Kamar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ker
+Description: Kera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kes
+Description: Kugbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ket
+Description: Ket
+Added: 2009-07-29
+%%
+Type: language
+Subtag: keu
+Description: Akebu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kev
+Description: Kanikkaran
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kew
+Description: West Kewa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kex
+Description: Kukna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: key
+Description: Kupia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kez
+Description: Kukele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfa
+Description: Kodava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfb
+Description: Northwestern Kolami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfc
+Description: Konda-Dora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfd
+Description: Korra Koraga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfe
+Description: Kota (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kff
+Description: Koya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfg
+Description: Kudiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfh
+Description: Kurichiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfi
+Description: Kannada Kurumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfj
+Description: Kemiehua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfk
+Description: Kinnauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfl
+Description: Kung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfm
+Description: Khunsari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfn
+Description: Kuk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfo
+Description: Koro (Côte d'Ivoire)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfp
+Description: Korwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfq
+Description: Korku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfr
+Description: Kachchi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfs
+Description: Bilaspuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kft
+Description: Kanjari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfu
+Description: Katkari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfv
+Description: Kurmukar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfw
+Description: Kharam Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfx
+Description: Kullu Pahari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfy
+Description: Kumaoni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kfz
+Description: Koromfé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kga
+Description: Koyaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgb
+Description: Kawe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgc
+Description: Kasseng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgd
+Description: Kataang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kge
+Description: Komering
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgf
+Description: Kube
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgg
+Description: Kusunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgh
+Description: Upper Tanudan Kalinga
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: kml
+%%
+Type: language
+Subtag: kgi
+Description: Selangor Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgj
+Description: Gamale Kham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgk
+Description: Kaiwá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgl
+Description: Kunggari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgm
+Description: Karipúna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgn
+Description: Karingani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgo
+Description: Krongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgp
+Description: Kaingang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgq
+Description: Kamoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgr
+Description: Abun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgs
+Description: Kumbainggar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgt
+Description: Somyev
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgu
+Description: Kobol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgv
+Description: Karas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgw
+Description: Karon Dori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgx
+Description: Kamaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kgy
+Description: Kyerung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kha
+Description: Khasi
+Added: 2005-10-16
+Comments: as of 2008-04-21 this subtag does not include Lyngngam; see
+  lyg
+%%
+Type: language
+Subtag: khb
+Description: Lü
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khc
+Description: Tukang Besi North
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khd
+Description: Bädi Kanum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khe
+Description: Korowai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khf
+Description: Khuen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khg
+Description: Khams Tibetan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khh
+Description: Kehu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khi
+Description: Khoisan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: khj
+Description: Kuturmi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khk
+Description: Halh Mongolian
+Added: 2009-07-29
+Macrolanguage: mn
+%%
+Type: language
+Subtag: khl
+Description: Lusi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khn
+Description: Khandesi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kho
+Description: Khotanese
+Description: Sakan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: khp
+Description: Kapori
+Description: Kapauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khq
+Description: Koyra Chiini Songhay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khr
+Description: Kharia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khs
+Description: Kasua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kht
+Description: Khamti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khu
+Description: Nkhumbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khv
+Description: Khvarshi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khw
+Description: Khowar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khx
+Description: Kanu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khy
+Description: Kele (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: khz
+Description: Keapara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kia
+Description: Kim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kib
+Description: Koalib
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kic
+Description: Kickapoo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kid
+Description: Koshin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kie
+Description: Kibet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kif
+Description: Eastern Parbate Kham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kig
+Description: Kimaama
+Description: Kimaghima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kih
+Description: Kilmeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kii
+Description: Kitsai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kij
+Description: Kilivila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kil
+Description: Kariya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kim
+Description: Karagas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kio
+Description: Kiowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kip
+Description: Sheshi Kham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kiq
+Description: Kosadle
+Description: Kosare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kis
+Description: Kis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kit
+Description: Agob
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kiu
+Description: Kirmanjki (individual language)
+Added: 2009-07-29
+Macrolanguage: zza
+%%
+Type: language
+Subtag: kiv
+Description: Kimbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kiw
+Description: Northeast Kiwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kix
+Description: Khiamniungan Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kiy
+Description: Kirikiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kiz
+Description: Kisi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kja
+Description: Mlap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjb
+Description: Q'anjob'al
+Description: Kanjobal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjc
+Description: Coastal Konjo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjd
+Description: Southern Kiwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kje
+Description: Kisar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjf
+Description: Khalaj
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjg
+Description: Khmu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjh
+Description: Khakas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kji
+Description: Zabana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjj
+Description: Khinalugh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjk
+Description: Highland Konjo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjl
+Description: Western Parbate Kham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjm
+Description: Kháng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjn
+Description: Kunjen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjo
+Description: Harijan Kinnauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjp
+Description: Pwo Eastern Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjq
+Description: Western Keres
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjr
+Description: Kurudu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjs
+Description: East Kewa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjt
+Description: Phrae Pwo Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kju
+Description: Kashaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjx
+Description: Ramopa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjy
+Description: Erave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kjz
+Description: Bumthangkha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kka
+Description: Kakanda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkb
+Description: Kwerisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkc
+Description: Odoodee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkd
+Description: Kinuku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kke
+Description: Kakabe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkf
+Description: Kalaktang Monpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkg
+Description: Mabaka Valley Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkh
+Description: Khün
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kki
+Description: Kagulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkj
+Description: Kako
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkk
+Description: Kokota
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkl
+Description: Kosarek Yale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkm
+Description: Kiong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkn
+Description: Kon Keu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kko
+Description: Karko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkp
+Description: Gugubera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkq
+Description: Kaiku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkr
+Description: Kir-Balar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kks
+Description: Giiwo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkt
+Description: Koi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kku
+Description: Tumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkv
+Description: Kangean
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkw
+Description: Teke-Kukuya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkx
+Description: Kohin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kky
+Description: Guguyimidjir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kkz
+Description: Kaska
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kla
+Description: Klamath-Modoc
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klb
+Description: Kiliwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klc
+Description: Kolbila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kld
+Description: Gamilaraay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kle
+Description: Kulung (Nepal)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klf
+Description: Kendeje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klg
+Description: Tagakaulo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klh
+Description: Weliki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kli
+Description: Kalumpang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klj
+Description: Turkic Khalaj
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klk
+Description: Kono (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kll
+Description: Kagan Kalagan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klm
+Description: Migum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kln
+Description: Kalenjin
+Added: 2009-07-29
+Scope: macrolanguage
+%%
+Type: language
+Subtag: klo
+Description: Kapya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klp
+Description: Kamasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klq
+Description: Rumu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klr
+Description: Khaling
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kls
+Description: Kalasha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klt
+Description: Nukna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klu
+Description: Klao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klv
+Description: Maskelynes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klw
+Description: Lindu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klx
+Description: Koluwawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kly
+Description: Kalao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: klz
+Description: Kabola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kma
+Description: Konni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmb
+Description: Kimbundu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kmc
+Description: Southern Dong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmd
+Description: Majukayang Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kme
+Description: Bakole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmf
+Description: Kare (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmg
+Description: Kâte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmh
+Description: Kalam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmi
+Description: Kami (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmj
+Description: Kumarbhag Paharia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmk
+Description: Limos Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kml
+Description: Tanudan Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmm
+Description: Kom (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmn
+Description: Awtuw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmo
+Description: Kwoma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmp
+Description: Gimme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmq
+Description: Kwama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmr
+Description: Northern Kurdish
+Added: 2009-07-29
+Macrolanguage: ku
+%%
+Type: language
+Subtag: kms
+Description: Kamasau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmt
+Description: Kemtuik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmu
+Description: Kanite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmv
+Description: Karipúna Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmw
+Description: Komo (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmx
+Description: Waboda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmy
+Description: Koma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kmz
+Description: Khorasani Turkish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kna
+Description: Dera (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knb
+Description: Lubuagan Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knc
+Description: Central Kanuri
+Added: 2009-07-29
+Macrolanguage: kr
+%%
+Type: language
+Subtag: knd
+Description: Konda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kne
+Description: Kankanaey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knf
+Description: Mankanya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kng
+Description: Koongo
+Added: 2009-07-29
+Macrolanguage: kg
+%%
+Type: language
+Subtag: kni
+Description: Kanufi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knj
+Description: Western Kanjobal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knk
+Description: Kuranko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knl
+Description: Keninjal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knm
+Description: Kanamarí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knn
+Description: Konkani (individual language)
+Added: 2009-07-29
+Macrolanguage: kok
+%%
+Type: language
+Subtag: kno
+Description: Kono (Sierra Leone)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knp
+Description: Kwanja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knq
+Description: Kintaq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knr
+Description: Kaningra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kns
+Description: Kensiu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knt
+Description: Panoan Katukína
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knu
+Description: Kono (Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knv
+Description: Tabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knw
+Description: Kung-Ekoka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knx
+Description: Kendayan
+Description: Salako
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kny
+Description: Kanyok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: knz
+Description: Kalamsé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koa
+Description: Konomala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koc
+Description: Kpati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kod
+Description: Kodi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koe
+Description: Kacipo-Balesi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kof
+Description: Kubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kog
+Description: Cogui
+Description: Kogi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koh
+Description: Koyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koi
+Description: Komi-Permyak
+Added: 2009-07-29
+Macrolanguage: kv
+%%
+Type: language
+Subtag: koj
+Description: Sara Dunjo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kok
+Description: Konkani (macrolanguage)
+Added: 2005-10-16
+Suppress-Script: Deva
+Scope: macrolanguage
+%%
+Type: language
+Subtag: kol
+Description: Kol (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koo
+Description: Konzo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kop
+Description: Waube
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koq
+Description: Kota (Gabon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kos
+Description: Kosraean
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kot
+Description: Lagwan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kou
+Description: Koke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kov
+Description: Kudu-Camo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kow
+Description: Kugama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kox
+Description: Coxima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koy
+Description: Koyukon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: koz
+Description: Korak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpa
+Description: Kutto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpb
+Description: Mullu Kurumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpc
+Description: Curripaco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpd
+Description: Koba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpe
+Description: Kpelle
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: kpf
+Description: Komba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpg
+Description: Kapingamarangi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kph
+Description: Kplang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpi
+Description: Kofei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpj
+Description: Karajá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpk
+Description: Kpan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpl
+Description: Kpala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpm
+Description: Koho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpn
+Description: Kepkiriwát
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpo
+Description: Ikposo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpp
+Description: Paku Karen
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see jkm, jkp
+%%
+Type: language
+Subtag: kpq
+Description: Korupun-Sela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpr
+Description: Korafe-Yegha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kps
+Description: Tehit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpt
+Description: Karata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpu
+Description: Kafoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpv
+Description: Komi-Zyrian
+Added: 2009-07-29
+Macrolanguage: kv
+%%
+Type: language
+Subtag: kpw
+Description: Kobon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpx
+Description: Mountain Koiali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpy
+Description: Koryak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kpz
+Description: Kupsabiny
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqa
+Description: Mum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqb
+Description: Kovai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqc
+Description: Doromu-Koki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqd
+Description: Koy Sanjaq Surat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqe
+Description: Kalagan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqf
+Description: Kakabai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqg
+Description: Khe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqh
+Description: Kisankasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqi
+Description: Koitabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqj
+Description: Koromira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqk
+Description: Kotafon Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kql
+Description: Kyenele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqm
+Description: Khisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqn
+Description: Kaonde
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqo
+Description: Eastern Krahn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqp
+Description: Kimré
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqq
+Description: Krenak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqr
+Description: Kimaragang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqs
+Description: Northern Kissi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqt
+Description: Klias River Kadazan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqu
+Description: Seroa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqv
+Description: Okolod
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqw
+Description: Kandas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqx
+Description: Mser
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqy
+Description: Koorete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kqz
+Description: Korana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kra
+Description: Kumhali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krb
+Description: Karkin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krc
+Description: Karachay-Balkar
+Added: 2005-10-16
+%%
+Type: language
+Subtag: krd
+Description: Kairui-Midiki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kre
+Description: Panará
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krf
+Description: Koro (Vanuatu)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krh
+Description: Kurama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kri
+Description: Krio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krj
+Description: Kinaray-A
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krk
+Description: Kerek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krl
+Description: Karelian
+Added: 2006-03-08
+%%
+Type: language
+Subtag: krm
+Description: Krim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krn
+Description: Sapo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kro
+Description: Kru languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: krp
+Description: Korop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krr
+Description: Kru'ng 2
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krs
+Description: Gbaya (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krt
+Description: Tumari Kanuri
+Added: 2009-07-29
+Macrolanguage: kr
+%%
+Type: language
+Subtag: kru
+Description: Kurukh
+Added: 2005-10-16
+%%
+Type: language
+Subtag: krv
+Description: Kavet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krw
+Description: Western Krahn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krx
+Description: Karon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kry
+Description: Kryts
+Added: 2009-07-29
+%%
+Type: language
+Subtag: krz
+Description: Sota Kanum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksa
+Description: Shuwa-Zamani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksb
+Description: Shambala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksc
+Description: Southern Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksd
+Description: Kuanua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kse
+Description: Kuni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksf
+Description: Bafia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksg
+Description: Kusaghe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksh
+Description: Kölsch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksi
+Description: Krisa
+Description: I'saka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksj
+Description: Uare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksk
+Description: Kansa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksl
+Description: Kumalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksm
+Description: Kumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksn
+Description: Kasiguranin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kso
+Description: Kofa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksp
+Description: Kaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksq
+Description: Kwaami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksr
+Description: Borong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kss
+Description: Southern Kisi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kst
+Description: Winyé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksu
+Description: Khamyang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksv
+Description: Kusu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksw
+Description: S'gaw Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksx
+Description: Kedang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksy
+Description: Kharia Thar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ksz
+Description: Kodaku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kta
+Description: Katua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktb
+Description: Kambaata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktc
+Description: Kholok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktd
+Description: Kokata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kte
+Description: Nubri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktf
+Description: Kwami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktg
+Description: Kalkutung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kth
+Description: Karanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kti
+Description: North Muyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktj
+Description: Plapo Krumen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktk
+Description: Kaniet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktl
+Description: Koroshi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktm
+Description: Kurti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktn
+Description: Karitiâna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kto
+Description: Kuot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktp
+Description: Kaduo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktq
+Description: Katabaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktr
+Description: Kota Marudu Tinagas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kts
+Description: South Muyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktt
+Description: Ketum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktu
+Description: Kituba (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktv
+Description: Eastern Katu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktw
+Description: Kato
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktx
+Description: Kaxararí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kty
+Description: Kango (Bas-Uélé District)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ktz
+Description: Ju/'hoan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kub
+Description: Kutep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuc
+Description: Kwinsu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kud
+Description: 'Auhelawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kue
+Description: Kuman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuf
+Description: Western Katu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kug
+Description: Kupa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuh
+Description: Kushi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kui
+Description: Kuikúro-Kalapálo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuj
+Description: Kuria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuk
+Description: Kepo'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kul
+Description: Kulere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kum
+Description: Kumyk
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kun
+Description: Kunama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuo
+Description: Kumukio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kup
+Description: Kunimaipa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuq
+Description: Karipuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kus
+Description: Kusaal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kut
+Description: Kutenai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: kuu
+Description: Upper Kuskokwim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuv
+Description: Kur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuw
+Description: Kpagua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kux
+Description: Kukatja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuy
+Description: Kuuku-Ya'u
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kuz
+Description: Kunza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kva
+Description: Bagvalal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvb
+Description: Kubu
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: kvc
+Description: Kove
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvd
+Description: Kui (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kve
+Description: Kalabakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvf
+Description: Kabalai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvg
+Description: Kuni-Boazi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvh
+Description: Komodo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvi
+Description: Kwang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvj
+Description: Psikye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvk
+Description: Korean Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvl
+Description: Kayaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvm
+Description: Kendem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvn
+Description: Border Kuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvo
+Description: Dobel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvp
+Description: Kompane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvq
+Description: Geba Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvr
+Description: Kerinci
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: kvs
+Description: Kunggara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvt
+Description: Lahta Karen
+Description: Lahta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvu
+Description: Yinbaw Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvv
+Description: Kola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvw
+Description: Wersing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvx
+Description: Parkari Koli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvy
+Description: Yintale Karen
+Description: Yintale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kvz
+Description: Tsakwambo
+Description: Tsaukambo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwa
+Description: Dâw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwb
+Description: Kwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwc
+Description: Likwala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwd
+Description: Kwaio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwe
+Description: Kwerba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwf
+Description: Kwara'ae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwg
+Description: Sara Kaba Deme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwh
+Description: Kowiai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwi
+Description: Awa-Cuaiquer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwj
+Description: Kwanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwk
+Description: Kwakiutl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwl
+Description: Kofyar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwm
+Description: Kwambi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwn
+Description: Kwangali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwo
+Description: Kwomtari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwp
+Description: Kodia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwq
+Description: Kwak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwr
+Description: Kwer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kws
+Description: Kwese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwt
+Description: Kwesten
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwu
+Description: Kwakum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwv
+Description: Sara Kaba Náà
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kww
+Description: Kwinti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwx
+Description: Khirwar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kwy
+Description: San Salvador Kongo
+Added: 2009-07-29
+Macrolanguage: kg
+%%
+Type: language
+Subtag: kwz
+Description: Kwadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxa
+Description: Kairiru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxb
+Description: Krobu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxc
+Description: Konso
+Description: Khonso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxd
+Description: Brunei
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: kxe
+Description: Kakihum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxf
+Description: Manumanaw Karen
+Description: Manumanaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxh
+Description: Karo (Ethiopia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxi
+Description: Keningau Murut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxj
+Description: Kulfa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxk
+Description: Zayein Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxl
+Description: Nepali Kurux
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxm
+Description: Northern Khmer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxn
+Description: Kanowit-Tanjong Melanau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxo
+Description: Kanoé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxp
+Description: Wadiyara Koli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxq
+Description: Smärky Kanum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxr
+Description: Koro (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxs
+Description: Kangjia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxt
+Description: Koiwat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxu
+Description: Kui (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxv
+Description: Kuvi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxw
+Description: Konai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxx
+Description: Likuba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxy
+Description: Kayong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kxz
+Description: Kerewo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kya
+Description: Kwaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyb
+Description: Butbut Kalinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyc
+Description: Kyaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyd
+Description: Karey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kye
+Description: Krache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyf
+Description: Kouya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyg
+Description: Keyagana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyh
+Description: Karok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyi
+Description: Kiput
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyj
+Description: Karao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyk
+Description: Kamayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyl
+Description: Kalapuya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kym
+Description: Kpatili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyn
+Description: Northern Binukidnon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyo
+Description: Kelon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyp
+Description: Kang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyq
+Description: Kenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyr
+Description: Kuruáya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kys
+Description: Baram Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyt
+Description: Kayagar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyu
+Description: Western Kayah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyv
+Description: Kayort
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyw
+Description: Kudmali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyx
+Description: Rapoisi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyy
+Description: Kambaira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kyz
+Description: Kayabí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kza
+Description: Western Karaboro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzb
+Description: Kaibobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzc
+Description: Bondoukou Kulango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzd
+Description: Kadai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kze
+Description: Kosena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzf
+Description: Da'a Kaili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzg
+Description: Kikai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzh
+Description: Kenuzi-Dongola
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see dgl, xnz
+%%
+Type: language
+Subtag: kzi
+Description: Kelabit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzj
+Description: Coastal Kadazan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzk
+Description: Kazukuru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzl
+Description: Kayeli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzm
+Description: Kais
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzn
+Description: Kokola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzo
+Description: Kaningi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzp
+Description: Kaidipang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzq
+Description: Kaike
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzr
+Description: Karang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzs
+Description: Sugut Dusun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzt
+Description: Tambunan Dusun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzu
+Description: Kayupulau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzv
+Description: Komyandaret
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzw
+Description: Karirí-Xocó
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzx
+Description: Kamarian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzy
+Description: Kango (Tshopo District)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: kzz
+Description: Kalabra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: laa
+Description: Southern Subanen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lab
+Description: Linear A
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lac
+Description: Lacandon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lad
+Description: Ladino
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lae
+Description: Pattani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: laf
+Description: Lafofa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lag
+Description: Langi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lah
+Description: Lahnda
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: lai
+Description: Lambya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: laj
+Description: Lango (Uganda)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lak
+Description: Laka (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lal
+Description: Lalia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lam
+Description: Lamba
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lan
+Description: Laru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lap
+Description: Laka (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: laq
+Description: Qabiao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lar
+Description: Larteh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: las
+Description: Lama (Togo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lau
+Description: Laba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: law
+Description: Lauje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lax
+Description: Tiwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lay
+Description: Lama (Myanmar)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: laz
+Description: Aribwatsa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lba
+Description: Lui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbb
+Description: Label
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbc
+Description: Lakkia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbe
+Description: Lak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbf
+Description: Tinani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbg
+Description: Laopang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbi
+Description: La'bi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbj
+Description: Ladakhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbk
+Description: Central Bontok
+Added: 2010-03-11
+Macrolanguage: bnc
+%%
+Type: language
+Subtag: lbl
+Description: Libon Bikol
+Added: 2010-03-11
+Macrolanguage: bik
+%%
+Type: language
+Subtag: lbm
+Description: Lodhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbn
+Description: Lamet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbo
+Description: Laven
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbq
+Description: Wampar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbr
+Description: Lohorung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbs
+Description: Libyan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbt
+Description: Lachi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbu
+Description: Labu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbv
+Description: Lavatbura-Lamusong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbw
+Description: Tolaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbx
+Description: Lawangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lby
+Description: Lamu-Lamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lbz
+Description: Lardil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lcc
+Description: Legenyem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lcd
+Description: Lola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lce
+Description: Loncong
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: lcf
+Description: Lubu
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: lch
+Description: Luchazi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lcl
+Description: Lisela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lcm
+Description: Tungag
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lcp
+Description: Western Lawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lcq
+Description: Luhu
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: ppr
+%%
+Type: language
+Subtag: lcs
+Description: Lisabata-Nuniali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldb
+Description: Dũya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldd
+Description: Luri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldg
+Description: Lenyima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldh
+Description: Lamja-Dengsa-Tola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldi
+Description: Laari
+Added: 2009-07-29
+Macrolanguage: kg
+%%
+Type: language
+Subtag: ldj
+Description: Lemoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldk
+Description: Leelau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldl
+Description: Kaan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldm
+Description: Landoma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldn
+Description: Láadan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldo
+Description: Loo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldp
+Description: Tso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ldq
+Description: Lufu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lea
+Description: Lega-Shabunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: leb
+Description: Lala-Bisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lec
+Description: Leco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: led
+Description: Lendu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lee
+Description: Lyélé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lef
+Description: Lelemi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: leg
+Description: Lengua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: leh
+Description: Lenje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lei
+Description: Lemio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lej
+Description: Lengola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lek
+Description: Leipon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lel
+Description: Lele (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lem
+Description: Nomaande
+Added: 2009-07-29
+%%
+Type: language
+Subtag: len
+Description: Lenca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: leo
+Description: Leti (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lep
+Description: Lepcha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: leq
+Description: Lembena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ler
+Description: Lenkau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: les
+Description: Lese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: let
+Description: Lesing-Gelimi
+Description: Amio-Gelimi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: leu
+Description: Kara (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lev
+Description: Lamma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lew
+Description: Ledo Kaili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lex
+Description: Luang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ley
+Description: Lemolang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lez
+Description: Lezghian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lfa
+Description: Lefa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lfn
+Description: Lingua Franca Nova
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lga
+Description: Lungga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgb
+Description: Laghu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgg
+Description: Lugbara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgh
+Description: Laghuu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgi
+Description: Lengilu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgk
+Description: Lingarak
+Description: Neverver
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgl
+Description: Wala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgm
+Description: Lega-Mwenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgn
+Description: Opuuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgq
+Description: Logba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgr
+Description: Lengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgt
+Description: Pahi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgu
+Description: Longgu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lgz
+Description: Ligenza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lha
+Description: Laha (Viet Nam)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhh
+Description: Laha (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhi
+Description: Lahu Shi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhl
+Description: Lahul Lohar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhm
+Description: Lhomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhn
+Description: Lahanan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhp
+Description: Lhokpu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhs
+Description: Mlahsö
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lht
+Description: Lo-Toga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lhu
+Description: Lahu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lia
+Description: West-Central Limba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lib
+Description: Likum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lic
+Description: Hlai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lid
+Description: Nyindrou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lie
+Description: Likila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lif
+Description: Limbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lig
+Description: Ligbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lih
+Description: Lihir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lii
+Description: Lingkhim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lij
+Description: Ligurian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lik
+Description: Lika
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lil
+Description: Lillooet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lio
+Description: Liki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lip
+Description: Sekpele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: liq
+Description: Libido
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lir
+Description: Liberian English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lis
+Description: Lisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: liu
+Description: Logorik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: liv
+Description: Liv
+Added: 2009-07-29
+%%
+Type: language
+Subtag: liw
+Description: Col
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: lix
+Description: Liabuku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: liy
+Description: Banda-Bambari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: liz
+Description: Libinza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lje
+Description: Rampi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lji
+Description: Laiyolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ljl
+Description: Li'o
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ljp
+Description: Lampung Api
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lka
+Description: Lakalei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lkb
+Description: Kabras
+Description: Lukabaras
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lkc
+Description: Kucong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lkd
+Description: Lakondê
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lke
+Description: Kenyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lkh
+Description: Lakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lki
+Description: Laki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lkj
+Description: Remun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lkl
+Description: Laeko-Libuat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lkn
+Description: Lakon
+Description: Vure
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lko
+Description: Khayo
+Description: Olukhayo
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lkr
+Description: Päri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lks
+Description: Kisa
+Description: Olushisa
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lkt
+Description: Lakota
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lky
+Description: Lokoya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lla
+Description: Lala-Roba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llb
+Description: Lolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llc
+Description: Lele (Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lld
+Description: Ladin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lle
+Description: Lele (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llf
+Description: Hermit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llg
+Description: Lole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llh
+Description: Lamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lli
+Description: Teke-Laali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llj
+Description: Ladji Ladji
+Added: 2012-08-12
+%%
+Type: language
+Subtag: llk
+Description: Lelak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lll
+Description: Lilau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llm
+Description: Lasalimu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lln
+Description: Lele (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llo
+Description: Khlor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llp
+Description: North Efate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llq
+Description: Lolak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lls
+Description: Lithuanian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llu
+Description: Lau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: llx
+Description: Lauan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lma
+Description: East Limba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmb
+Description: Merei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmc
+Description: Limilngan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmd
+Description: Lumun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lme
+Description: Pévé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmf
+Description: South Lembata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmg
+Description: Lamogai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmh
+Description: Lambichhong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmi
+Description: Lombi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmj
+Description: West Lembata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmk
+Description: Lamkang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lml
+Description: Hano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmm
+Description: Lamam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmn
+Description: Lambadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmo
+Description: Lombard
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmp
+Description: Limbum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmq
+Description: Lamatuka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmr
+Description: Lamalera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmu
+Description: Lamenu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmv
+Description: Lomaiviti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmw
+Description: Lake Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmx
+Description: Laimbue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmy
+Description: Lamboya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lmz
+Description: Lumbee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lna
+Description: Langbashe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnb
+Description: Mbalanhu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnd
+Description: Lundayeh
+Description: Lun Bawang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lng
+Description: Langobardic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnh
+Description: Lanoh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lni
+Description: Daantanai'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnj
+Description: Leningitij
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnl
+Description: South Central Banda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnm
+Description: Langam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnn
+Description: Lorediakarkar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lno
+Description: Lango (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lns
+Description: Lamnso'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnu
+Description: Longuda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lnz
+Description: Lonzo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loa
+Description: Loloda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lob
+Description: Lobi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loc
+Description: Inonhan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loe
+Description: Saluan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lof
+Description: Logol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: log
+Description: Logo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loh
+Description: Narim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loi
+Description: Loma (Côte d'Ivoire)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loj
+Description: Lou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lok
+Description: Loko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lol
+Description: Mongo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lom
+Description: Loma (Liberia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lon
+Description: Malawi Lomwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loo
+Description: Lombo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lop
+Description: Lopa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loq
+Description: Lobala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lor
+Description: Téén
+Added: 2009-07-29
+%%
+Type: language
+Subtag: los
+Description: Loniu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lot
+Description: Otuho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lou
+Description: Louisiana Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lov
+Description: Lopi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: low
+Description: Tampias Lobu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lox
+Description: Loun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loy
+Description: Loke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: loz
+Description: Lozi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lpa
+Description: Lelepa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lpe
+Description: Lepki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lpn
+Description: Long Phuri Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lpo
+Description: Lipo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lpx
+Description: Lopit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lra
+Description: Rara Bakati'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrc
+Description: Northern Luri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lre
+Description: Laurentian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrg
+Description: Laragia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lri
+Description: Marachi
+Description: Olumarachi
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lrk
+Description: Loarki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrl
+Description: Lari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrm
+Description: Marama
+Description: Olumarama
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lrn
+Description: Lorang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lro
+Description: Laro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrr
+Description: Southern Yamphu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrt
+Description: Larantuka Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrv
+Description: Larevat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lrz
+Description: Lemerig
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsa
+Description: Lasgerdi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsd
+Description: Lishana Deni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lse
+Description: Lusengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsg
+Description: Lyons Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsh
+Description: Lish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsi
+Description: Lashi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsl
+Description: Latvian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsm
+Description: Saamia
+Description: Olusamia
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lso
+Description: Laos Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsp
+Description: Panamanian Sign Language
+Description: Lengua de Señas Panameñas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsr
+Description: Aruop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lss
+Description: Lasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lst
+Description: Trinidad and Tobago Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lsy
+Description: Mauritian Sign Language
+Added: 2010-03-11
+%%
+Type: language
+Subtag: ltc
+Description: Late Middle Chinese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ltg
+Description: Latgalian
+Added: 2010-03-11
+Macrolanguage: lv
+%%
+Type: language
+Subtag: lti
+Description: Leti (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ltn
+Description: Latundê
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lto
+Description: Tsotso
+Description: Olutsotso
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lts
+Description: Tachoni
+Description: Lutachoni
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: ltu
+Description: Latu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lua
+Description: Luba-Lulua
+Added: 2005-10-16
+%%
+Type: language
+Subtag: luc
+Description: Aringa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lud
+Description: Ludian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lue
+Description: Luvale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luf
+Description: Laua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lui
+Description: Luiseno
+Added: 2005-10-16
+%%
+Type: language
+Subtag: luj
+Description: Luna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luk
+Description: Lunanakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lul
+Description: Olu'bo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lum
+Description: Luimbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lun
+Description: Lunda
+Added: 2005-10-16
+%%
+Type: language
+Subtag: luo
+Description: Luo (Kenya and Tanzania)
+Description: Dholuo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lup
+Description: Lumbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luq
+Description: Lucumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lur
+Description: Laura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lus
+Description: Lushai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: lut
+Description: Lushootseed
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luu
+Description: Lumba-Yakkha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luv
+Description: Luwati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luw
+Description: Luo (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: luy
+Description: Luyia
+Description: Oluluyia
+Added: 2009-07-29
+Scope: macrolanguage
+%%
+Type: language
+Subtag: luz
+Description: Southern Luri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lva
+Description: Maku'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lvk
+Description: Lavukaleve
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lvs
+Description: Standard Latvian
+Added: 2010-03-11
+Macrolanguage: lv
+%%
+Type: language
+Subtag: lvu
+Description: Levuka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwa
+Description: Lwalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwe
+Description: Lewo Eleng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwg
+Description: Wanga
+Description: Oluwanga
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: lwh
+Description: White Lachi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwl
+Description: Eastern Lawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwm
+Description: Laomian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwo
+Description: Luwo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lwt
+Description: Lewotobi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lww
+Description: Lewo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lya
+Description: Layakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lyg
+Description: Lyngngam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lyn
+Description: Luyana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lzh
+Description: Literary Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: lzl
+Description: Litzlitz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lzn
+Description: Leinong Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: lzz
+Description: Laz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: maa
+Description: San Jerónimo Tecóatl Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mab
+Description: Yutanduchi Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mad
+Description: Madurese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mae
+Description: Bo-Rukul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: maf
+Description: Mafa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mag
+Description: Magahi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mai
+Description: Maithili
+Added: 2005-10-16
+Suppress-Script: Deva
+%%
+Type: language
+Subtag: maj
+Description: Jalapa De Díaz Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mak
+Description: Makasar
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mam
+Description: Mam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: man
+Description: Mandingo
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: map
+Description: Austronesian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: maq
+Description: Chiquihuitlán Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mas
+Description: Masai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mat
+Description: San Francisco Matlatzinca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mau
+Description: Huautla Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mav
+Description: Sateré-Mawé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: maw
+Description: Mampruli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: max
+Description: North Moluccan Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: maz
+Description: Central Mazahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mba
+Description: Higaonon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbb
+Description: Western Bukidnon Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbc
+Description: Macushi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbd
+Description: Dibabawon Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbe
+Description: Molale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbf
+Description: Baba Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbh
+Description: Mangseng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbi
+Description: Ilianen Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbj
+Description: Nadëb
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbk
+Description: Malol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbl
+Description: Maxakalí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbm
+Description: Ombamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbn
+Description: Macaguán
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbo
+Description: Mbo (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbp
+Description: Malayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbq
+Description: Maisin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbr
+Description: Nukak Makú
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbs
+Description: Sarangani Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbt
+Description: Matigsalug Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbu
+Description: Mbula-Bwazza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbv
+Description: Mbulungish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbw
+Description: Maring
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbx
+Description: Mari (East Sepik Province)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mby
+Description: Memoni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mbz
+Description: Amoltepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mca
+Description: Maca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcb
+Description: Machiguenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcc
+Description: Bitur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcd
+Description: Sharanahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mce
+Description: Itundujia Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcf
+Description: Matsés
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcg
+Description: Mapoyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mch
+Description: Maquiritari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mci
+Description: Mese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcj
+Description: Mvanip
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mck
+Description: Mbunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcl
+Description: Macaguaje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcm
+Description: Malaccan Creole Portuguese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcn
+Description: Masana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mco
+Description: Coatlán Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcp
+Description: Makaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcq
+Description: Ese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcr
+Description: Menya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcs
+Description: Mambai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mct
+Description: Mengisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcu
+Description: Cameroon Mambila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcv
+Description: Minanibai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcw
+Description: Mawa (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcx
+Description: Mpiemo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcy
+Description: South Watut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mcz
+Description: Mawan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mda
+Description: Mada (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdb
+Description: Morigi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdc
+Description: Male (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdd
+Description: Mbum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mde
+Description: Maba (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdf
+Description: Moksha
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mdg
+Description: Massalat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdh
+Description: Maguindanaon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdi
+Description: Mamvu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdj
+Description: Mangbetu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdk
+Description: Mangbutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdl
+Description: Maltese Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdm
+Description: Mayogo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdn
+Description: Mbati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdp
+Description: Mbala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdq
+Description: Mbole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdr
+Description: Mandar
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mds
+Description: Maria (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdt
+Description: Mbere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdu
+Description: Mboko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdv
+Description: Santa Lucía Monteverde Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdw
+Description: Mbosi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdx
+Description: Dizin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdy
+Description: Male (Ethiopia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mdz
+Description: Suruí Do Pará
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mea
+Description: Menka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: meb
+Description: Ikobi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mec
+Description: Mara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: med
+Description: Melpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mee
+Description: Mengen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mef
+Description: Megam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: meg
+Description: Mea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: meh
+Description: Southwestern Tlaxiaco Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mei
+Description: Midob
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mej
+Description: Meyah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mek
+Description: Mekeo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mel
+Description: Central Melanau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mem
+Description: Mangala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: men
+Description: Mende (Sierra Leone)
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: meo
+Description: Kedah Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: mep
+Description: Miriwung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: meq
+Description: Merey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mer
+Description: Meru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mes
+Description: Masmaje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: met
+Description: Mato
+Added: 2009-07-29
+%%
+Type: language
+Subtag: meu
+Description: Motu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mev
+Description: Mann
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mew
+Description: Maaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mey
+Description: Hassaniyya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mez
+Description: Menominee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfa
+Description: Pattani Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: mfb
+Description: Bangka
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: mfc
+Description: Mba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfd
+Description: Mendankwe-Nkwen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfe
+Description: Morisyen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mff
+Description: Naki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfg
+Description: Mixifore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfh
+Description: Matal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfi
+Description: Wandala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfj
+Description: Mefele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfk
+Description: North Mofu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfl
+Description: Putai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfm
+Description: Marghi South
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfn
+Description: Cross River Mbembe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfo
+Description: Mbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfp
+Description: Makassar Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfq
+Description: Moba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfr
+Description: Marithiel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfs
+Description: Mexican Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mft
+Description: Mokerang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfu
+Description: Mbwela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfv
+Description: Mandjak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfw
+Description: Mulaha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfx
+Description: Melo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfy
+Description: Mayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mfz
+Description: Mabaan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mga
+Description: Middle Irish (900-1200)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mgb
+Description: Mararit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgc
+Description: Morokodo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgd
+Description: Moru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mge
+Description: Mango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgf
+Description: Maklew
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgg
+Description: Mpumpong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgh
+Description: Makhuwa-Meetto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgi
+Description: Lijili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgj
+Description: Abureni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgk
+Description: Mawes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgl
+Description: Maleu-Kilenge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgm
+Description: Mambae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgn
+Description: Mbangi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgo
+Description: Meta'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgp
+Description: Eastern Magar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgq
+Description: Malila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgr
+Description: Mambwe-Lungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgs
+Description: Manda (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgt
+Description: Mongol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgu
+Description: Mailu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgv
+Description: Matengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgw
+Description: Matumbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgx
+Description: Omati
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see jbk, jmw
+%%
+Type: language
+Subtag: mgy
+Description: Mbunga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mgz
+Description: Mbugwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mha
+Description: Manda (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhb
+Description: Mahongwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhc
+Description: Mocho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhd
+Description: Mbugu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhe
+Description: Besisi
+Description: Mah Meri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhf
+Description: Mamaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhg
+Description: Margu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhh
+Description: Maskoy Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhi
+Description: Ma'di
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhj
+Description: Mogholi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhk
+Description: Mungaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhl
+Description: Mauwake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhm
+Description: Makhuwa-Moniga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhn
+Description: Mócheno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mho
+Description: Mashi (Zambia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhp
+Description: Balinese Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhq
+Description: Mandan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhr
+Description: Eastern Mari
+Added: 2009-07-29
+Macrolanguage: chm
+%%
+Type: language
+Subtag: mhs
+Description: Buru (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mht
+Description: Mandahuaca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhu
+Description: Digaro-Mishmi
+Description: Darang Deng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhw
+Description: Mbukushu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhx
+Description: Maru
+Description: Lhaovo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhy
+Description: Ma'anyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mhz
+Description: Mor (Mor Islands)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mia
+Description: Miami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mib
+Description: Atatláhuca Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mic
+Description: Mi'kmaq
+Description: Micmac
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mid
+Description: Mandaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mie
+Description: Ocotepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mif
+Description: Mofu-Gudur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mig
+Description: San Miguel El Grande Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mih
+Description: Chayuco Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mii
+Description: Chigmecatitlán Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mij
+Description: Abar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mik
+Description: Mikasuki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mil
+Description: Peñoles Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mim
+Description: Alacatlatzala Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: min
+Description: Minangkabau
+Added: 2005-10-16
+Macrolanguage: ms
+%%
+Type: language
+Subtag: mio
+Description: Pinotepa Nacional Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mip
+Description: Apasco-Apoala Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: miq
+Description: Mískito
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mir
+Description: Isthmus Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mis
+Description: Uncoded languages
+Added: 2005-10-16
+Scope: special
+%%
+Type: language
+Subtag: mit
+Description: Southern Puebla Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: miu
+Description: Cacaloxtepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: miw
+Description: Akoye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mix
+Description: Mixtepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: miy
+Description: Ayutla Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: miz
+Description: Coatzospan Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mja
+Description: Mahei
+Added: 2009-07-29
+Deprecated: 2011-08-16
+%%
+Type: language
+Subtag: mjc
+Description: San Juan Colorado Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjd
+Description: Northwest Maidu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mje
+Description: Muskum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjg
+Description: Tu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjh
+Description: Mwera (Nyasa)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mji
+Description: Kim Mun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjj
+Description: Mawak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjk
+Description: Matukar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjl
+Description: Mandeali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjm
+Description: Medebur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjn
+Description: Ma (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjo
+Description: Malankuravan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjp
+Description: Malapandaram
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjq
+Description: Malaryan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjr
+Description: Malavedan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjs
+Description: Miship
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjt
+Description: Sauria Paharia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mju
+Description: Manna-Dora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjv
+Description: Mannan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjw
+Description: Karbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjx
+Description: Mahali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjy
+Description: Mahican
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mjz
+Description: Majhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mka
+Description: Mbre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkb
+Description: Mal Paharia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkc
+Description: Siliput
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mke
+Description: Mawchi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkf
+Description: Miya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkg
+Description: Mak (China)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkh
+Description: Mon-Khmer languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: mki
+Description: Dhatki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkj
+Description: Mokilese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkk
+Description: Byep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkl
+Description: Mokole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkm
+Description: Moklen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkn
+Description: Kupang Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mko
+Description: Mingang Doso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkp
+Description: Moikodi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkq
+Description: Bay Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkr
+Description: Malas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mks
+Description: Silacayoapan Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkt
+Description: Vamale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mku
+Description: Konyanka Maninka
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: mkv
+Description: Mafea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkw
+Description: Kituba (Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkx
+Description: Kinamiging Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mky
+Description: East Makian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mkz
+Description: Makasae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mla
+Description: Malo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlb
+Description: Mbule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlc
+Description: Cao Lan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mld
+Description: Malakhel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mle
+Description: Manambu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlf
+Description: Mal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlh
+Description: Mape
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mli
+Description: Malimpung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlj
+Description: Miltu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlk
+Description: Ilwana
+Description: Kiwilwana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mll
+Description: Malua Bay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlm
+Description: Mulam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mln
+Description: Malango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlo
+Description: Mlomp
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlp
+Description: Bargam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlq
+Description: Western Maninkakan
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: mlr
+Description: Vame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mls
+Description: Masalit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlu
+Description: To'abaita
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlv
+Description: Motlav
+Description: Mwotlap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlw
+Description: Moloko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlx
+Description: Malfaxal
+Description: Naha'ai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mlz
+Description: Malaynon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mma
+Description: Mama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmb
+Description: Momina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmc
+Description: Michoacán Mazahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmd
+Description: Maonan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mme
+Description: Mae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmf
+Description: Mundat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmg
+Description: North Ambrym
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmh
+Description: Mehináku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmi
+Description: Musar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmj
+Description: Majhwar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmk
+Description: Mukha-Dora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mml
+Description: Man Met
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmm
+Description: Maii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmn
+Description: Mamanwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmo
+Description: Mangga Buang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmp
+Description: Siawi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmq
+Description: Musak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmr
+Description: Western Xiangxi Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: mmt
+Description: Malalamai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmu
+Description: Mmaala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmv
+Description: Miriti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmw
+Description: Emae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmx
+Description: Madak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmy
+Description: Migaama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mmz
+Description: Mabaale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mna
+Description: Mbula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnb
+Description: Muna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnc
+Description: Manchu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mnd
+Description: Mondé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mne
+Description: Naba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnf
+Description: Mundani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mng
+Description: Eastern Mnong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnh
+Description: Mono (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mni
+Description: Manipuri
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mnj
+Description: Munji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnk
+Description: Mandinka
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: mnl
+Description: Tiale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnm
+Description: Mapena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnn
+Description: Southern Mnong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mno
+Description: Manobo languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: mnp
+Description: Min Bei Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: mnq
+Description: Minriq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnr
+Description: Mono (USA)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mns
+Description: Mansi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnt
+Description: Maykulan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnu
+Description: Mer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnv
+Description: Rennell-Bellona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnw
+Description: Mon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnx
+Description: Manikion
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mny
+Description: Manyawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mnz
+Description: Moni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moa
+Description: Mwan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moc
+Description: Mocoví
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mod
+Description: Mobilian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moe
+Description: Montagnais
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mof
+Description: Mohegan-Montauk-Narragansett
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see xnt, xpq
+%%
+Type: language
+Subtag: mog
+Description: Mongondow
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moh
+Description: Mohawk
+Added: 2005-10-16
+%%
+Type: language
+Subtag: moi
+Description: Mboi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moj
+Description: Monzombo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mok
+Description: Morori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mom
+Description: Mangue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moo
+Description: Monom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mop
+Description: Mopán Maya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moq
+Description: Mor (Bomberai Peninsula)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mor
+Description: Moro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mos
+Description: Mossi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mot
+Description: Barí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mou
+Description: Mogum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mov
+Description: Mohave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mow
+Description: Moi (Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mox
+Description: Molima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moy
+Description: Shekkacho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: moz
+Description: Mukulu
+Description: Gergiko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpa
+Description: Mpoto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpb
+Description: Mullukmulluk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpc
+Description: Mangarayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpd
+Description: Machinere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpe
+Description: Majang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpg
+Description: Marba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mph
+Description: Maung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpi
+Description: Mpade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpj
+Description: Martu Wangka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpk
+Description: Mbara (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpl
+Description: Middle Watut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpm
+Description: Yosondúa Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpn
+Description: Mindiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpo
+Description: Miu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpp
+Description: Migabac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpq
+Description: Matís
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpr
+Description: Vangunu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mps
+Description: Dadibi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpt
+Description: Mian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpu
+Description: Makuráp
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpv
+Description: Mungkip
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpw
+Description: Mapidian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpx
+Description: Misima-Panaeati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpy
+Description: Mapia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mpz
+Description: Mpi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqa
+Description: Maba (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqb
+Description: Mbuko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqc
+Description: Mangole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqe
+Description: Matepi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqf
+Description: Momuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqg
+Description: Kota Bangun Kutai Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: mqh
+Description: Tlazoyaltepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqi
+Description: Mariri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqj
+Description: Mamasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqk
+Description: Rajah Kabunsuwan Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mql
+Description: Mbelime
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqm
+Description: South Marquesan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqn
+Description: Moronene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqo
+Description: Modole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqp
+Description: Manipa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqq
+Description: Minokok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqr
+Description: Mander
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqs
+Description: West Makian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqt
+Description: Mok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqu
+Description: Mandari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqv
+Description: Mosimo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqw
+Description: Murupi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqx
+Description: Mamuju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqy
+Description: Manggarai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mqz
+Description: Pano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mra
+Description: Mlabri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrb
+Description: Marino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrc
+Description: Maricopa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrd
+Description: Western Magar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mre
+Description: Martha's Vineyard Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrf
+Description: Elseng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrg
+Description: Mising
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrh
+Description: Mara Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrj
+Description: Western Mari
+Added: 2009-07-29
+Macrolanguage: chm
+%%
+Type: language
+Subtag: mrk
+Description: Hmwaveke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrl
+Description: Mortlockese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrm
+Description: Merlav
+Description: Mwerlap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrn
+Description: Cheke Holo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mro
+Description: Mru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrp
+Description: Morouas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrq
+Description: North Marquesan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrr
+Description: Maria (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrs
+Description: Maragus
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrt
+Description: Marghi Central
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mru
+Description: Mono (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrv
+Description: Mangareva
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrw
+Description: Maranao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrx
+Description: Maremgi
+Description: Dineor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mry
+Description: Mandaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mrz
+Description: Marind
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msb
+Description: Masbatenyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msc
+Description: Sankaran Maninka
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: msd
+Description: Yucatec Maya Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mse
+Description: Musey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msf
+Description: Mekwei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msg
+Description: Moraid
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msh
+Description: Masikoro Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: msi
+Description: Sabah Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: msj
+Description: Ma (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msk
+Description: Mansaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msl
+Description: Molof
+Description: Poule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msm
+Description: Agusan Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msn
+Description: Vurës
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mso
+Description: Mombum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msp
+Description: Maritsauá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msq
+Description: Caac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msr
+Description: Mongolian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mss
+Description: West Masela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mst
+Description: Cataelano Mandaya
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: mry
+%%
+Type: language
+Subtag: msu
+Description: Musom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msv
+Description: Maslam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msw
+Description: Mansoanka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msx
+Description: Moresada
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msy
+Description: Aruamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: msz
+Description: Momare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mta
+Description: Cotabato Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtb
+Description: Anyin Morofo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtc
+Description: Munit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtd
+Description: Mualang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mte
+Description: Mono (Solomon Islands)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtf
+Description: Murik (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtg
+Description: Una
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mth
+Description: Munggui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mti
+Description: Maiwa (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtj
+Description: Moskona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtk
+Description: Mbe'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtl
+Description: Montol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtm
+Description: Mator
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtn
+Description: Matagalpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mto
+Description: Totontepec Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtp
+Description: Wichí Lhamtés Nocten
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtq
+Description: Muong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtr
+Description: Mewari
+Added: 2009-07-29
+Macrolanguage: mwr
+%%
+Type: language
+Subtag: mts
+Description: Yora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtt
+Description: Mota
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtu
+Description: Tututepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtv
+Description: Asaro'o
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtw
+Description: Southern Binukidnon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mtx
+Description: Tidaá Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mty
+Description: Nabi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mua
+Description: Mundang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mub
+Description: Mubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muc
+Description: Mbu'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mud
+Description: Mednyj Aleut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mue
+Description: Media Lengua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mug
+Description: Musgu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muh
+Description: Mündü
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mui
+Description: Musi
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: muj
+Description: Mabire
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muk
+Description: Mugom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mul
+Description: Multiple languages
+Added: 2005-10-16
+Scope: special
+%%
+Type: language
+Subtag: mum
+Description: Maiwala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mun
+Description: Munda languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: muo
+Description: Nyong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mup
+Description: Malvi
+Added: 2009-07-29
+Macrolanguage: raj
+%%
+Type: language
+Subtag: muq
+Description: Eastern Xiangxi Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: mur
+Description: Murle
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mus
+Description: Creek
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mut
+Description: Western Muria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muu
+Description: Yaaku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muv
+Description: Muthuvan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mux
+Description: Bo-Ung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muy
+Description: Muyang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: muz
+Description: Mursi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mva
+Description: Manam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvb
+Description: Mattole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvd
+Description: Mamboru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mve
+Description: Marwari (Pakistan)
+Added: 2009-07-29
+Macrolanguage: mwr
+%%
+Type: language
+Subtag: mvf
+Description: Peripheral Mongolian
+Added: 2009-07-29
+Macrolanguage: mn
+%%
+Type: language
+Subtag: mvg
+Description: Yucuañe Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvh
+Description: Mulgi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvi
+Description: Miyako
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvk
+Description: Mekmek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvl
+Description: Mbara (Australia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvm
+Description: Muya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvn
+Description: Minaveha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvo
+Description: Marovo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvp
+Description: Duri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvq
+Description: Moere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvr
+Description: Marau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvs
+Description: Massep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvt
+Description: Mpotovoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvu
+Description: Marfa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvv
+Description: Tagal Murut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvw
+Description: Machinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvx
+Description: Meoswar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvy
+Description: Indus Kohistani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mvz
+Description: Mesqan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwa
+Description: Mwatebu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwb
+Description: Juwal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwc
+Description: Are
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwd
+Description: Mudbura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwe
+Description: Mwera (Chimwera)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwf
+Description: Murrinh-Patha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwg
+Description: Aiklep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwh
+Description: Mouk-Aria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwi
+Description: Labo
+Description: Ninde
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwj
+Description: Maligo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwk
+Description: Kita Maninkakan
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: mwl
+Description: Mirandese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: mwm
+Description: Sar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwn
+Description: Nyamwanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwo
+Description: Central Maewo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwp
+Description: Kala Lagaw Ya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwq
+Description: Mün Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwr
+Description: Marwari
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: mws
+Description: Mwimbi-Muthambi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwt
+Description: Moken
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwu
+Description: Mittu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwv
+Description: Mentawai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mww
+Description: Hmong Daw
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: mwx
+Description: Mediak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwy
+Description: Mosiro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mwz
+Description: Moingi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxa
+Description: Northwest Oaxaca Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxb
+Description: Tezoatlán Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxc
+Description: Manyika
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxd
+Description: Modang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxe
+Description: Mele-Fila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxf
+Description: Malgbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxg
+Description: Mbangala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxh
+Description: Mvuba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxi
+Description: Mozarabic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxj
+Description: Miju-Mishmi
+Description: Geman Deng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxk
+Description: Monumbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxl
+Description: Maxi Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxm
+Description: Meramera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxn
+Description: Moi (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxo
+Description: Mbowe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxp
+Description: Tlahuitoltepec Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxq
+Description: Juquila Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxr
+Description: Murik (Malaysia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxs
+Description: Huitepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxt
+Description: Jamiltepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxu
+Description: Mada (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxv
+Description: Metlatónoc Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxw
+Description: Namo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxx
+Description: Mahou
+Description: Mawukakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxy
+Description: Southeastern Nochixtlán Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mxz
+Description: Central Masela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myb
+Description: Mbay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myc
+Description: Mayeka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myd
+Description: Maramba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mye
+Description: Myene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myf
+Description: Bambassi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myg
+Description: Manta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myh
+Description: Makah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myi
+Description: Mina (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myj
+Description: Mangayat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myk
+Description: Mamara Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myl
+Description: Moma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mym
+Description: Me'en
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myn
+Description: Mayan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: myo
+Description: Anfillo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myp
+Description: Pirahã
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myq
+Description: Forest Maninka
+Added: 2009-07-29
+Macrolanguage: man
+%%
+Type: language
+Subtag: myr
+Description: Muniche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mys
+Description: Mesmes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myt
+Description: Sangab Mandaya
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: mry
+%%
+Type: language
+Subtag: myu
+Description: Mundurukú
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myv
+Description: Erzya
+Added: 2005-10-16
+%%
+Type: language
+Subtag: myw
+Description: Muyuw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myx
+Description: Masaaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myy
+Description: Macuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: myz
+Description: Classical Mandaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mza
+Description: Santa María Zacatepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzb
+Description: Tumzabt
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzc
+Description: Madagascar Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzd
+Description: Malimba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mze
+Description: Morawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzg
+Description: Monastic Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzh
+Description: Wichí Lhamtés Güisnay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzi
+Description: Ixcatlán Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzj
+Description: Manya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzk
+Description: Nigeria Mambila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzl
+Description: Mazatlán Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzm
+Description: Mumuye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzn
+Description: Mazanderani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzo
+Description: Matipuhy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzp
+Description: Movima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzq
+Description: Mori Atas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzr
+Description: Marúbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzs
+Description: Macanese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzt
+Description: Mintil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzu
+Description: Inapang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzv
+Description: Manza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzw
+Description: Deg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzx
+Description: Mawayana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzy
+Description: Mozambican Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: mzz
+Description: Maiadomu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: naa
+Description: Namla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nab
+Description: Southern Nambikuára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nac
+Description: Narak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nad
+Description: Nijadali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nae
+Description: Naka'ela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: naf
+Description: Nabak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nag
+Description: Naga Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nah
+Description: Nahuatl languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: nai
+Description: North American Indian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: naj
+Description: Nalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nak
+Description: Nakanai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nal
+Description: Nalik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nam
+Description: Ngan'gityemerri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nan
+Description: Min Nan Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: nao
+Description: Naaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nap
+Description: Neapolitan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: naq
+Description: Nama (Namibia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nar
+Description: Iguta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nas
+Description: Naasioi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nat
+Description: Hungworo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: naw
+Description: Nawuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nax
+Description: Nakwi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nay
+Description: Narrinyeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: naz
+Description: Coatepec Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nba
+Description: Nyemba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbb
+Description: Ndoe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbc
+Description: Chang Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbd
+Description: Ngbinda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbe
+Description: Konyak Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbf
+Description: Naxi
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Comments: see nru, nxq
+%%
+Type: language
+Subtag: nbg
+Description: Nagarchal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbh
+Description: Ngamo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbi
+Description: Mao Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbj
+Description: Ngarinman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbk
+Description: Nake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbm
+Description: Ngbaka Ma'bo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbn
+Description: Kuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbo
+Description: Nkukoli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbp
+Description: Nnam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbq
+Description: Nggem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbr
+Description: Numana-Nunku-Gbantu-Numbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbs
+Description: Namibian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbt
+Description: Na
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbu
+Description: Rongmei Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbv
+Description: Ngamambo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbw
+Description: Southern Ngbandi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nbx
+Description: Ngura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nby
+Description: Ningera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nca
+Description: Iyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncb
+Description: Central Nicobarese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncc
+Description: Ponam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncd
+Description: Nachering
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nce
+Description: Yale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncf
+Description: Notsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncg
+Description: Nisga'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nch
+Description: Central Huasteca Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nci
+Description: Classical Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncj
+Description: Northern Puebla Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nck
+Description: Nakara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncl
+Description: Michoacán Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncm
+Description: Nambo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncn
+Description: Nauna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nco
+Description: Sibe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncp
+Description: Ndaktup
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncr
+Description: Ncane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncs
+Description: Nicaraguan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nct
+Description: Chothe Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncu
+Description: Chumburung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncx
+Description: Central Puebla Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ncz
+Description: Natchez
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nda
+Description: Ndasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndb
+Description: Kenswei Nsei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndc
+Description: Ndau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndd
+Description: Nde-Nsele-Nta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndf
+Description: Nadruvian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndg
+Description: Ndengereko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndh
+Description: Ndali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndi
+Description: Samba Leko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndj
+Description: Ndamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndk
+Description: Ndaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndl
+Description: Ndolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndm
+Description: Ndam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndn
+Description: Ngundi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndp
+Description: Ndo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndq
+Description: Ndombe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndr
+Description: Ndoola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nds
+Description: Low German
+Description: Low Saxon
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ndt
+Description: Ndunga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndu
+Description: Dugun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndv
+Description: Ndut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndw
+Description: Ndobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndx
+Description: Nduga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndy
+Description: Lutos
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ndz
+Description: Ndogo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nea
+Description: Eastern Ngad'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: neb
+Description: Toura (Côte d'Ivoire)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nec
+Description: Nedebang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ned
+Description: Nde-Gbite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nee
+Description: Nêlêmwa-Nixumwak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nef
+Description: Nefamese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: neg
+Description: Negidal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: neh
+Description: Nyenkha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nei
+Description: Neo-Hittite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nej
+Description: Neko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nek
+Description: Neku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nem
+Description: Nemi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nen
+Description: Nengone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: neo
+Description: Ná-Meo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: neq
+Description: North Central Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ner
+Description: Yahadian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nes
+Description: Bhoti Kinnauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: net
+Description: Nete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: neu
+Description: Neo
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nev
+Description: Nyaheun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: new
+Description: Newari
+Description: Nepal Bhasa
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nex
+Description: Neme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ney
+Description: Neyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nez
+Description: Nez Perce
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nfa
+Description: Dhao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nfd
+Description: Ahwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nfl
+Description: Ayiwo
+Description: Äiwoo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nfr
+Description: Nafaanra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nfu
+Description: Mfumte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nga
+Description: Ngbaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngb
+Description: Northern Ngbandi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngc
+Description: Ngombe (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngd
+Description: Ngando (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nge
+Description: Ngemba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngf
+Description: Trans-New Guinea languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: ngg
+Description: Ngbaka Manza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngh
+Description: N/u
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngi
+Description: Ngizim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngj
+Description: Ngie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngk
+Description: Ngalkbun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngl
+Description: Lomwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngm
+Description: Ngatik Men's Creole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngn
+Description: Ngwo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngo
+Description: Ngoni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngp
+Description: Ngulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngq
+Description: Ngurimi
+Description: Ngoreme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngr
+Description: Engdewu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngs
+Description: Gvoko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngt
+Description: Ngeq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngu
+Description: Guerrero Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngv
+Description: Nagumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngw
+Description: Ngwaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngx
+Description: Nggwahyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngy
+Description: Tibea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ngz
+Description: Ngungwel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nha
+Description: Nhanda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhb
+Description: Beng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhc
+Description: Tabasco Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhd
+Description: Chiripá
+Description: Ava Guaraní
+Added: 2009-07-29
+Macrolanguage: gn
+%%
+Type: language
+Subtag: nhe
+Description: Eastern Huasteca Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhf
+Description: Nhuwala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhg
+Description: Tetelcingo Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhh
+Description: Nahari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhi
+Description: Zacatlán-Ahuacatlán-Tepetzintla Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhk
+Description: Isthmus-Cosoleacaque Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhm
+Description: Morelos Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhn
+Description: Central Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nho
+Description: Takuu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhp
+Description: Isthmus-Pajapan Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhq
+Description: Huaxcaleca Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhr
+Description: Naro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nht
+Description: Ometepec Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhu
+Description: Noone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhv
+Description: Temascaltepec Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhw
+Description: Western Huasteca Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhx
+Description: Isthmus-Mecayapan Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhy
+Description: Northern Oaxaca Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nhz
+Description: Santa María La Alta Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nia
+Description: Nias
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nib
+Description: Nakame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nic
+Description: Niger-Kordofanian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: nid
+Description: Ngandi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nie
+Description: Niellim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nif
+Description: Nek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nig
+Description: Ngalakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nih
+Description: Nyiha (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nii
+Description: Nii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nij
+Description: Ngaju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nik
+Description: Southern Nicobarese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nil
+Description: Nila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nim
+Description: Nilamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nin
+Description: Ninzo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nio
+Description: Nganasan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: niq
+Description: Nandi
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: nir
+Description: Nimboran
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nis
+Description: Nimi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nit
+Description: Southeastern Kolami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: niu
+Description: Niuean
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: niv
+Description: Gilyak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: niw
+Description: Nimo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nix
+Description: Hema
+Added: 2009-07-29
+%%
+Type: language
+Subtag: niy
+Description: Ngiti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: niz
+Description: Ningil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nja
+Description: Nzanyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njb
+Description: Nocte Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njd
+Description: Ndonde Hamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njh
+Description: Lotha Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nji
+Description: Gudanji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njj
+Description: Njen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njl
+Description: Njalgulgule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njm
+Description: Angami Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njn
+Description: Liangmai Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njo
+Description: Ao Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njr
+Description: Njerep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njs
+Description: Nisa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njt
+Description: Ndyuka-Trio Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nju
+Description: Ngadjunmaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njx
+Description: Kunyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njy
+Description: Njyem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: njz
+Description: Nyishi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nka
+Description: Nkoya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkb
+Description: Khoibu Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkc
+Description: Nkongho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkd
+Description: Koireng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nke
+Description: Duke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkf
+Description: Inpui Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkg
+Description: Nekgini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkh
+Description: Khezha Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nki
+Description: Thangal Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkj
+Description: Nakai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkk
+Description: Nokuku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkm
+Description: Namat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkn
+Description: Nkangala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nko
+Description: Nkonya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkp
+Description: Niuatoputapu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkq
+Description: Nkami
+Added: 2010-04-16
+%%
+Type: language
+Subtag: nkr
+Description: Nukuoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nks
+Description: North Asmat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkt
+Description: Nyika (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nku
+Description: Bouna Kulango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkv
+Description: Nyika (Malawi and Zambia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkw
+Description: Nkutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkx
+Description: Nkoroo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nkz
+Description: Nkari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nla
+Description: Ngombale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlc
+Description: Nalca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nle
+Description: East Nyala
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: nlg
+Description: Gela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nli
+Description: Grangali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlj
+Description: Nyali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlk
+Description: Ninia Yali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nll
+Description: Nihali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nln
+Description: Durango Nahuatl
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see azd, azn
+%%
+Type: language
+Subtag: nlo
+Description: Ngul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlr
+Description: Ngarla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlu
+Description: Nchumbulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlv
+Description: Orizaba Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlx
+Description: Nahali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nly
+Description: Nyamal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nlz
+Description: Nalögo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nma
+Description: Maram Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmb
+Description: Big Nambas
+Description: V'ënen Taut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmc
+Description: Ngam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmd
+Description: Ndumu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nme
+Description: Mzieme Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmf
+Description: Tangkhul Naga (India)
+Added: 2009-07-29
+Comments: see ntx
+%%
+Type: language
+Subtag: nmg
+Description: Kwasio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmh
+Description: Monsang Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmi
+Description: Nyam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmj
+Description: Ngombe (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmk
+Description: Namakura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nml
+Description: Ndemli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmm
+Description: Manangba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmn
+Description: !Xóõ
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmo
+Description: Moyon Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmp
+Description: Nimanbur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmq
+Description: Nambya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmr
+Description: Nimbari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nms
+Description: Letemboi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmt
+Description: Namonuito
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmu
+Description: Northeast Maidu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmv
+Description: Ngamini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmw
+Description: Nimoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmx
+Description: Nama (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmy
+Description: Namuyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nmz
+Description: Nawdm
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nna
+Description: Nyangumarta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnb
+Description: Nande
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnc
+Description: Nancere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnd
+Description: West Ambae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nne
+Description: Ngandyera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnf
+Description: Ngaing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nng
+Description: Maring Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnh
+Description: Ngiemboon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nni
+Description: North Nuaulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnj
+Description: Nyangatom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnk
+Description: Nankina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnl
+Description: Northern Rengma Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnm
+Description: Namia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnn
+Description: Ngete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnp
+Description: Wancho Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnq
+Description: Ngindo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnr
+Description: Narungga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nns
+Description: Ningye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnt
+Description: Nanticoke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnu
+Description: Dwang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnv
+Description: Nugunu (Australia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnw
+Description: Southern Nuni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnx
+Description: Ngong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nny
+Description: Nyangga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nnz
+Description: Nda'nda'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noa
+Description: Woun Meu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noc
+Description: Nuk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nod
+Description: Northern Thai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noe
+Description: Nimadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nof
+Description: Nomane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nog
+Description: Nogai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: noh
+Description: Nomu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noi
+Description: Noiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noj
+Description: Nonuya
+Added: 2010-03-11
+%%
+Type: language
+Subtag: nok
+Description: Nooksack
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nom
+Description: Nocamán
+Added: 2009-07-29
+%%
+Type: language
+Subtag: non
+Description: Old Norse
+Added: 2005-10-16
+%%
+Type: language
+Subtag: noo
+Description: Nootka
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Comments: see dtd, nuk
+%%
+Type: language
+Subtag: nop
+Description: Numanggang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noq
+Description: Ngongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nos
+Description: Eastern Nisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: not
+Description: Nomatsiguenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nou
+Description: Ewage-Notu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nov
+Description: Novial
+Added: 2009-07-29
+%%
+Type: language
+Subtag: now
+Description: Nyambo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noy
+Description: Noy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: noz
+Description: Nayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npa
+Description: Nar Phu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npb
+Description: Nupbikha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npg
+Description: Ponyo-Gongwang Naga
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nph
+Description: Phom Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npi
+Description: Nepali (individual language)
+Added: 2012-08-12
+Macrolanguage: ne
+%%
+Type: language
+Subtag: npl
+Description: Southeastern Puebla Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npn
+Description: Mondropolon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npo
+Description: Pochuri Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nps
+Description: Nipsan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npu
+Description: Puimei Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: npy
+Description: Napu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nqg
+Description: Southern Nago
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nqk
+Description: Kura Ede Nago
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nqm
+Description: Ndom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nqn
+Description: Nen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nqo
+Description: N'Ko
+Description: N’Ko
+Added: 2006-06-05
+Suppress-Script: Nkoo
+%%
+Type: language
+Subtag: nqy
+Description: Akyaung Ari Naga
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nra
+Description: Ngom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrb
+Description: Nara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrc
+Description: Noric
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nre
+Description: Southern Rengma Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrg
+Description: Narango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nri
+Description: Chokri Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrl
+Description: Ngarluma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrm
+Description: Narom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrn
+Description: Norn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrp
+Description: North Picene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrr
+Description: Norra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrt
+Description: Northern Kalapuya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nru
+Description: Narua
+Added: 2011-08-16
+%%
+Type: language
+Subtag: nrx
+Description: Ngurmbur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nrz
+Description: Lala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsa
+Description: Sangtam Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsc
+Description: Nshi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsd
+Description: Southern Nisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nse
+Description: Nsenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsf
+Description: Northwestern Nisu
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nsg
+Description: Ngasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsh
+Description: Ngoshie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsi
+Description: Nigerian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsk
+Description: Naskapi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsl
+Description: Norwegian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsm
+Description: Sumi Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsn
+Description: Nehan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nso
+Description: Pedi
+Description: Northern Sotho
+Description: Sepedi
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: nsp
+Description: Nepalese Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsq
+Description: Northern Sierra Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsr
+Description: Maritime Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nss
+Description: Nali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nst
+Description: Tase Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsu
+Description: Sierra Negra Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsv
+Description: Southwestern Nisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsw
+Description: Navut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsx
+Description: Nsongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsy
+Description: Nasal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nsz
+Description: Nisenan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nte
+Description: Nathembo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nti
+Description: Natioro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntj
+Description: Ngaanyatjarra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntk
+Description: Ikoma-Nata-Isenye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntm
+Description: Nateni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nto
+Description: Ntomba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntp
+Description: Northern Tepehuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntr
+Description: Delo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nts
+Description: Natagaimas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntu
+Description: Natügu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntw
+Description: Nottoway
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntx
+Description: Tangkhul Naga (Myanmar)
+Added: 2012-08-12
+Comments: see nmf
+%%
+Type: language
+Subtag: nty
+Description: Mantsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ntz
+Description: Natanzi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nua
+Description: Yuaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nub
+Description: Nubian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: nuc
+Description: Nukuini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nud
+Description: Ngala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nue
+Description: Ngundu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuf
+Description: Nusu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nug
+Description: Nungali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuh
+Description: Ndunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nui
+Description: Ngumbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuj
+Description: Nyole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuk
+Description: Nuu-chah-nulth
+Description: Nuuchahnulth
+Added: 2011-08-16
+%%
+Type: language
+Subtag: nul
+Description: Nusa Laut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: num
+Description: Niuafo'ou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nun
+Description: Anong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuo
+Description: Nguôn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nup
+Description: Nupe-Nupe-Tako
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuq
+Description: Nukumanu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nur
+Description: Nukuria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nus
+Description: Nuer
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nut
+Description: Nung (Viet Nam)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuu
+Description: Ngbundu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuv
+Description: Northern Nuni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuw
+Description: Nguluwan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nux
+Description: Mehek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuy
+Description: Nunggubuyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nuz
+Description: Tlamacazapa Nahuatl
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nvh
+Description: Nasarian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nvm
+Description: Namiae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nvo
+Description: Nyokon
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nwa
+Description: Nawathinehena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwb
+Description: Nyabwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwc
+Description: Classical Newari
+Description: Classical Nepal Bhasa
+Description: Old Newari
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nwe
+Description: Ngwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwg
+Description: Ngayawung
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nwi
+Description: Southwest Tanna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwm
+Description: Nyamusa-Molo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwo
+Description: Nauo
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nwr
+Description: Nawaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwx
+Description: Middle Newar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nwy
+Description: Nottoway-Meherrin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxa
+Description: Nauete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxd
+Description: Ngando (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxe
+Description: Nage
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxg
+Description: Ngad'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxi
+Description: Nindi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxk
+Description: Koki Naga
+Added: 2012-08-12
+%%
+Type: language
+Subtag: nxl
+Description: South Nuaulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxm
+Description: Numidian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxn
+Description: Ngawun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxq
+Description: Naxi
+Added: 2011-08-16
+%%
+Type: language
+Subtag: nxr
+Description: Ninggerum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxu
+Description: Narau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nxx
+Description: Nafri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyb
+Description: Nyangbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyc
+Description: Nyanga-li
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyd
+Description: Nyore
+Description: Olunyole
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: nye
+Description: Nyengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyf
+Description: Giryama
+Description: Kigiryama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyg
+Description: Nyindu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyh
+Description: Nyigina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyi
+Description: Ama (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyj
+Description: Nyanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyk
+Description: Nyaneka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyl
+Description: Nyeu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nym
+Description: Nyamwezi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nyn
+Description: Nyankole
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nyo
+Description: Nyoro
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nyp
+Description: Nyang'i
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyq
+Description: Nayini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyr
+Description: Nyiha (Malawi)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nys
+Description: Nyunga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyt
+Description: Nyawaygi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyu
+Description: Nyungwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyv
+Description: Nyulnyul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyw
+Description: Nyaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyx
+Description: Nganyaywana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nyy
+Description: Nyakyusa-Ngonde
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nza
+Description: Tigon Mbembe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzb
+Description: Njebi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzi
+Description: Nzima
+Added: 2005-10-16
+%%
+Type: language
+Subtag: nzk
+Description: Nzakara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzm
+Description: Zeme Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzs
+Description: New Zealand Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzu
+Description: Teke-Nzikou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzy
+Description: Nzakambay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: nzz
+Description: Nanga Dama Dogon
+Added: 2010-03-11
+%%
+Type: language
+Subtag: oaa
+Description: Orok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oac
+Description: Oroch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oar
+Description: Old Aramaic (up to 700 BCE)
+Description: Ancient Aramaic (up to 700 BCE)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oav
+Description: Old Avar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obi
+Description: Obispeño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obk
+Description: Southern Bontok
+Added: 2010-03-11
+Macrolanguage: bnc
+%%
+Type: language
+Subtag: obl
+Description: Oblo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obm
+Description: Moabite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obo
+Description: Obo Manobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obr
+Description: Old Burmese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obt
+Description: Old Breton
+Added: 2009-07-29
+%%
+Type: language
+Subtag: obu
+Description: Obulom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oca
+Description: Ocaina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: och
+Description: Old Chinese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oco
+Description: Old Cornish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ocu
+Description: Atzingo Matlatzinca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oda
+Description: Odut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: odk
+Description: Od
+Added: 2009-07-29
+%%
+Type: language
+Subtag: odt
+Description: Old Dutch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: odu
+Description: Odual
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ofo
+Description: Ofo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ofs
+Description: Old Frisian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ofu
+Description: Efutop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ogb
+Description: Ogbia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ogc
+Description: Ogbah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oge
+Description: Old Georgian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ogg
+Description: Ogbogolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ogo
+Description: Khana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ogu
+Description: Ogbronuagum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oht
+Description: Old Hittite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ohu
+Description: Old Hungarian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oia
+Description: Oirata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oin
+Description: Inebu One
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ojb
+Description: Northwestern Ojibwa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: ojc
+Description: Central Ojibwa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: ojg
+Description: Eastern Ojibwa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: ojp
+Description: Old Japanese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ojs
+Description: Severn Ojibwa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: ojv
+Description: Ontong Java
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ojw
+Description: Western Ojibwa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: oka
+Description: Okanagan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okb
+Description: Okobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okd
+Description: Okodia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oke
+Description: Okpe (Southwestern Edo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okg
+Description: Koko Babangk
+Added: 2012-08-12
+%%
+Type: language
+Subtag: okh
+Description: Koresh-e Rostam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oki
+Description: Okiek
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: okj
+Description: Oko-Juwoi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okk
+Description: Kwamtim One
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okl
+Description: Old Kentish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okm
+Description: Middle Korean (10th-16th cent.)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okn
+Description: Oki-No-Erabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oko
+Description: Old Korean (3rd-9th cent.)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okr
+Description: Kirike
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oks
+Description: Oko-Eni-Osayen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oku
+Description: Oku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okv
+Description: Orokaiva
+Added: 2009-07-29
+%%
+Type: language
+Subtag: okx
+Description: Okpe (Northwestern Edo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ola
+Description: Walungge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: old
+Description: Mochi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ole
+Description: Olekha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: olm
+Description: Oloma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: olo
+Description: Livvi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: olr
+Description: Olrat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oma
+Description: Omaha-Ponca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omb
+Description: East Ambae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omc
+Description: Mochica
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ome
+Description: Omejes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omg
+Description: Omagua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omi
+Description: Omi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omk
+Description: Omok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oml
+Description: Ombo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omn
+Description: Minoan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omo
+Description: Utarmbung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omp
+Description: Old Manipuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omq
+Description: Oto-Manguean languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: omr
+Description: Old Marathi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omt
+Description: Omotik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omu
+Description: Omurano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omv
+Description: Omotic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: omw
+Description: South Tairora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: omx
+Description: Old Mon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ona
+Description: Ona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onb
+Description: Lingao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: one
+Description: Oneida
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ong
+Description: Olo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oni
+Description: Onin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onj
+Description: Onjob
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onk
+Description: Kabore One
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onn
+Description: Onobasulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ono
+Description: Onondaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onp
+Description: Sartang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onr
+Description: Northern One
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ons
+Description: Ono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ont
+Description: Ontenu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onu
+Description: Unua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onw
+Description: Old Nubian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: onx
+Description: Onin Based Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ood
+Description: Tohono O'odham
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oog
+Description: Ong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oon
+Description: Önge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oor
+Description: Oorlams
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oos
+Description: Old Ossetic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: opa
+Description: Okpamheri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: opk
+Description: Kopkaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: opm
+Description: Oksapmin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: opo
+Description: Opao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: opt
+Description: Opata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: opy
+Description: Ofayé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ora
+Description: Oroha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orc
+Description: Orma
+Added: 2009-07-29
+Macrolanguage: om
+%%
+Type: language
+Subtag: ore
+Description: Orejón
+Added: 2009-07-29
+%%
+Type: language
+Subtag: org
+Description: Oring
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orh
+Description: Oroqen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orn
+Description: Orang Kanaq
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: oro
+Description: Orokolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orr
+Description: Oruma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ors
+Description: Orang Seletar
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: ort
+Description: Adivasi Oriya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oru
+Description: Ormuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orv
+Description: Old Russian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orw
+Description: Oro Win
+Added: 2009-07-29
+%%
+Type: language
+Subtag: orx
+Description: Oro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ory
+Description: Oriya (individual language)
+Added: 2012-08-12
+Macrolanguage: or
+%%
+Type: language
+Subtag: orz
+Description: Ormu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: osa
+Description: Osage
+Added: 2005-10-16
+%%
+Type: language
+Subtag: osc
+Description: Oscan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: osi
+Description: Osing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oso
+Description: Ososo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: osp
+Description: Old Spanish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ost
+Description: Osatu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: osu
+Description: Southern One
+Added: 2009-07-29
+%%
+Type: language
+Subtag: osx
+Description: Old Saxon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ota
+Description: Ottoman Turkish (1500-1928)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: otb
+Description: Old Tibetan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otd
+Description: Ot Danum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ote
+Description: Mezquital Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oti
+Description: Oti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otk
+Description: Old Turkish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otl
+Description: Tilapa Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otm
+Description: Eastern Highland Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otn
+Description: Tenango Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oto
+Description: Otomian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: otq
+Description: Querétaro Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otr
+Description: Otoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ots
+Description: Estado de México Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ott
+Description: Temoaya Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otu
+Description: Otuke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otw
+Description: Ottawa
+Added: 2009-07-29
+Macrolanguage: oj
+%%
+Type: language
+Subtag: otx
+Description: Texcatepec Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oty
+Description: Old Tamil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: otz
+Description: Ixtenco Otomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oua
+Description: Tagargrent
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oub
+Description: Glio-Oubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oue
+Description: Oune
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oui
+Description: Old Uighur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oum
+Description: Ouma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oun
+Description: !O!ung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: owi
+Description: Owiniga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: owl
+Description: Old Welsh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oyb
+Description: Oy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oyd
+Description: Oyda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oym
+Description: Wayampi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: oyy
+Description: Oya'oya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ozm
+Description: Koonzime
+Added: 2009-07-29
+%%
+Type: language
+Subtag: paa
+Description: Papuan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: pab
+Description: Parecís
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pac
+Description: Pacoh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pad
+Description: Paumarí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pae
+Description: Pagibete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: paf
+Description: Paranawát
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pag
+Description: Pangasinan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pah
+Description: Tenharim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pai
+Description: Pe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pak
+Description: Parakanã
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pal
+Description: Pahlavi
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pam
+Description: Pampanga
+Description: Kapampangan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pao
+Description: Northern Paiute
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pap
+Description: Papiamento
+Added: 2005-10-16
+%%
+Type: language
+Subtag: paq
+Description: Parya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: par
+Description: Panamint
+Description: Timbisha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pas
+Description: Papasena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pat
+Description: Papitalai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pau
+Description: Palauan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pav
+Description: Pakaásnovos
+Added: 2009-07-29
+%%
+Type: language
+Subtag: paw
+Description: Pawnee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pax
+Description: Pankararé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pay
+Description: Pech
+Added: 2009-07-29
+%%
+Type: language
+Subtag: paz
+Description: Pankararú
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbb
+Description: Páez
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbc
+Description: Patamona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbe
+Description: Mezontla Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbf
+Description: Coyotepec Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbg
+Description: Paraujano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbh
+Description: E'ñapa Woromaipu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbi
+Description: Parkwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbl
+Description: Mak (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbn
+Description: Kpasam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbo
+Description: Papel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbp
+Description: Badyara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbr
+Description: Pangwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbs
+Description: Central Pame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbt
+Description: Southern Pashto
+Added: 2009-07-29
+Macrolanguage: ps
+%%
+Type: language
+Subtag: pbu
+Description: Northern Pashto
+Added: 2009-07-29
+Macrolanguage: ps
+%%
+Type: language
+Subtag: pbv
+Description: Pnar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pby
+Description: Pyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pbz
+Description: Palu
+Added: 2009-07-29
+Deprecated: 2012-08-12
+%%
+Type: language
+Subtag: pca
+Description: Santa Inés Ahuatempan Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcb
+Description: Pear
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcc
+Description: Bouyei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcd
+Description: Picard
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pce
+Description: Ruching Palaung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcf
+Description: Paliyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcg
+Description: Paniya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pch
+Description: Pardhan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pci
+Description: Duruwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcj
+Description: Parenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pck
+Description: Paite Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcl
+Description: Pardhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcm
+Description: Nigerian Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcn
+Description: Piti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcp
+Description: Pacahuara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcr
+Description: Panang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pcw
+Description: Pyapun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pda
+Description: Anam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pdc
+Description: Pennsylvania German
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pdi
+Description: Pa Di
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pdn
+Description: Podena
+Description: Fedan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pdo
+Description: Padoe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pdt
+Description: Plautdietsch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pdu
+Description: Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pea
+Description: Peranakan Indonesian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: peb
+Description: Eastern Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ped
+Description: Mala (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pee
+Description: Taje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pef
+Description: Northeastern Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: peg
+Description: Pengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: peh
+Description: Bonan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pei
+Description: Chichimeca-Jonaz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pej
+Description: Northern Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pek
+Description: Penchal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pel
+Description: Pekal
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: pem
+Description: Phende
+Added: 2009-07-29
+%%
+Type: language
+Subtag: peo
+Description: Old Persian (ca. 600-400 B.C.)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pep
+Description: Kunja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: peq
+Description: Southern Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pes
+Description: Iranian Persian
+Added: 2009-07-29
+Macrolanguage: fa
+%%
+Type: language
+Subtag: pev
+Description: Pémono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pex
+Description: Petats
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pey
+Description: Petjo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pez
+Description: Eastern Penan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pfa
+Description: Pááfang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pfe
+Description: Peere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pfl
+Description: Pfaelzisch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pga
+Description: Sudanese Creole Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: pgg
+Description: Pangwali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pgi
+Description: Pagi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pgk
+Description: Rerep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pgl
+Description: Primitive Irish
+Added: 2011-08-16
+%%
+Type: language
+Subtag: pgn
+Description: Paelignian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pgs
+Description: Pangseng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pgu
+Description: Pagu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pgy
+Description: Pongyong
+Added: 2009-07-29
+Deprecated: 2012-08-12
+%%
+Type: language
+Subtag: pha
+Description: Pa-Hng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phd
+Description: Phudagi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phg
+Description: Phuong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phh
+Description: Phukha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phi
+Description: Philippine languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: phk
+Description: Phake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phl
+Description: Phalura
+Description: Palula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phm
+Description: Phimbi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phn
+Description: Phoenician
+Added: 2005-10-16
+%%
+Type: language
+Subtag: pho
+Description: Phunoi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phq
+Description: Phana'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phr
+Description: Pahari-Potwari
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: pht
+Description: Phu Thai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phu
+Description: Phuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phv
+Description: Pahlavani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: phw
+Description: Phangduwali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pia
+Description: Pima Bajo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pib
+Description: Yine
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pic
+Description: Pinji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pid
+Description: Piaroa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pie
+Description: Piro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pif
+Description: Pingelapese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pig
+Description: Pisabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pih
+Description: Pitcairn-Norfolk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pii
+Description: Pini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pij
+Description: Pijao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pil
+Description: Yom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pim
+Description: Powhatan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pin
+Description: Piame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pio
+Description: Piapoco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pip
+Description: Pero
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pir
+Description: Piratapuyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pis
+Description: Pijin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pit
+Description: Pitta Pitta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: piu
+Description: Pintupi-Luritja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: piv
+Description: Pileni
+Description: Vaeakau-Taumako
+Added: 2009-07-29
+%%
+Type: language
+Subtag: piw
+Description: Pimbwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pix
+Description: Piu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: piy
+Description: Piya-Kwonci
+Added: 2009-07-29
+%%
+Type: language
+Subtag: piz
+Description: Pije
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pjt
+Description: Pitjantjatjara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pka
+Description: Ardhamāgadhī Prākrit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkb
+Description: Pokomo
+Description: Kipfokomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkc
+Description: Paekche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkg
+Description: Pak-Tong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkh
+Description: Pankhu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkn
+Description: Pakanha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pko
+Description: Pökoot
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: pkp
+Description: Pukapuka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkr
+Description: Attapady Kurumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pks
+Description: Pakistan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pkt
+Description: Maleng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pku
+Description: Paku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pla
+Description: Miani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plb
+Description: Polonombauk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plc
+Description: Central Palawano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pld
+Description: Polari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ple
+Description: Palu'e
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plf
+Description: Central Malayo-Polynesian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: plg
+Description: Pilagá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plh
+Description: Paulohi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plj
+Description: Polci
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plk
+Description: Kohistani Shina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pll
+Description: Shwe Palaung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pln
+Description: Palenquero
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plo
+Description: Oluta Popoluca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plp
+Description: Palpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plq
+Description: Palaic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plr
+Description: Palaka Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pls
+Description: San Marcos Tlalcoyalco Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plt
+Description: Plateau Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: plu
+Description: Palikúr
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plv
+Description: Southwest Palawano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plw
+Description: Brooke's Point Palawano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ply
+Description: Bolyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: plz
+Description: Paluan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pma
+Description: Paama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmb
+Description: Pambia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmc
+Description: Palumata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmd
+Description: Pallanganmiddang
+Added: 2012-08-12
+%%
+Type: language
+Subtag: pme
+Description: Pwaamei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmf
+Description: Pamona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmh
+Description: Māhārāṣṭri Prākrit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmi
+Description: Northern Pumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmj
+Description: Southern Pumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmk
+Description: Pamlico
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pml
+Description: Lingua Franca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmm
+Description: Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmn
+Description: Pam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmo
+Description: Pom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmq
+Description: Northern Pame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmr
+Description: Paynamar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pms
+Description: Piemontese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmt
+Description: Tuamotuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmu
+Description: Mirpur Panjabi
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: pmw
+Description: Plains Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmx
+Description: Poumei Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmy
+Description: Papuan Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pmz
+Description: Southern Pame
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pna
+Description: Punan Bah-Biau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnb
+Description: Western Panjabi
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: pnc
+Description: Pannei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pne
+Description: Western Penan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: png
+Description: Pongu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnh
+Description: Penrhyn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pni
+Description: Aoheng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnk
+Description: Paunaka
+Added: 2012-08-12
+%%
+Type: language
+Subtag: pnm
+Description: Punan Batu 1
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnn
+Description: Pinai-Hagahai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pno
+Description: Panobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnp
+Description: Pancana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnq
+Description: Pana (Burkina Faso)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnr
+Description: Panim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pns
+Description: Ponosakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnt
+Description: Pontic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnu
+Description: Jiongnai Bunu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnv
+Description: Pinigura
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnw
+Description: Panytyima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pnx
+Description: Phong-Kniang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pny
+Description: Pinyin
+Added: 2009-07-29
+Comments: a Niger-Congo language spoken in Cameroon; not to be confused
+  with the Pinyin romanization systems used for Chinese and Tibetan
+%%
+Type: language
+Subtag: pnz
+Description: Pana (Central African Republic)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poc
+Description: Poqomam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pod
+Description: Ponares
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poe
+Description: San Juan Atzingo Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pof
+Description: Poke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pog
+Description: Potiguára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poh
+Description: Poqomchi'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poi
+Description: Highland Popoluca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pok
+Description: Pokangá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pom
+Description: Southeastern Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pon
+Description: Pohnpeian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: poo
+Description: Central Pomo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pop
+Description: Pwapwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poq
+Description: Texistepec Popoluca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pos
+Description: Sayula Popoluca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pot
+Description: Potawatomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pov
+Description: Upper Guinea Crioulo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pow
+Description: San Felipe Otlaltepec Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pox
+Description: Polabian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poy
+Description: Pogolo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: poz
+Description: Malayo-Polynesian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: ppa
+Description: Pao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppe
+Description: Papi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppi
+Description: Paipai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppk
+Description: Uma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppl
+Description: Pipil
+Description: Nicarao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppm
+Description: Papuma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppn
+Description: Papapana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppo
+Description: Folopa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppp
+Description: Pelende
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppq
+Description: Pei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppr
+Description: Piru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pps
+Description: San Luís Temalacayuca Popoloca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppt
+Description: Pare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ppu
+Description: Papora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pqa
+Description: Pa'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pqe
+Description: Eastern Malayo-Polynesian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: pqm
+Description: Malecite-Passamaquoddy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pqw
+Description: Western Malayo-Polynesian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: pra
+Description: Prakrit languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: prb
+Description: Lua'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prc
+Description: Parachi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prd
+Description: Parsi-Dari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pre
+Description: Principense
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prf
+Description: Paranan
+Added: 2010-03-11
+%%
+Type: language
+Subtag: prg
+Description: Prussian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prh
+Description: Porohanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pri
+Description: Paicî
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prk
+Description: Parauk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prl
+Description: Peruvian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prm
+Description: Kibiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prn
+Description: Prasuni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pro
+Description: Old Provençal (to 1500)
+Description: Old Occitan (to 1500)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: prp
+Description: Parsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prq
+Description: Ashéninka Perené
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prr
+Description: Puri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prs
+Description: Dari
+Description: Afghan Persian
+Added: 2009-07-29
+Macrolanguage: fa
+%%
+Type: language
+Subtag: prt
+Description: Phai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pru
+Description: Puragi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prw
+Description: Parawen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prx
+Description: Purik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pry
+Description: Pray 3
+Added: 2009-07-29
+%%
+Type: language
+Subtag: prz
+Description: Providencia Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psa
+Description: Asue Awyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psc
+Description: Persian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psd
+Description: Plains Indian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pse
+Description: Central Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: psg
+Description: Penang Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psh
+Description: Southwest Pashayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psi
+Description: Southeast Pashayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psl
+Description: Puerto Rican Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psm
+Description: Pauserna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psn
+Description: Panasuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pso
+Description: Polish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psp
+Description: Philippine Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psq
+Description: Pasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psr
+Description: Portuguese Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pss
+Description: Kaulong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pst
+Description: Central Pashto
+Added: 2009-07-29
+Macrolanguage: ps
+%%
+Type: language
+Subtag: psu
+Description: Sauraseni Prākrit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psw
+Description: Port Sandwich
+Added: 2009-07-29
+%%
+Type: language
+Subtag: psy
+Description: Piscataway
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pta
+Description: Pai Tavytera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pth
+Description: Pataxó Hã-Ha-Hãe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pti
+Description: Pintiini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptn
+Description: Patani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pto
+Description: Zo'é
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptp
+Description: Patep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptr
+Description: Piamatsina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptt
+Description: Enrekang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptu
+Description: Bambam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptv
+Description: Port Vato
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ptw
+Description: Pentlatch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pty
+Description: Pathiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pua
+Description: Western Highland Purepecha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pub
+Description: Purum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puc
+Description: Punan Merap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pud
+Description: Punan Aput
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pue
+Description: Puelche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puf
+Description: Punan Merah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pug
+Description: Phuie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pui
+Description: Puinave
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puj
+Description: Punan Tubu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puk
+Description: Pu Ko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pum
+Description: Puma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puo
+Description: Puoc
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pup
+Description: Pulabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puq
+Description: Puquina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pur
+Description: Puruborá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: put
+Description: Putoh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puu
+Description: Punu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puw
+Description: Puluwatese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pux
+Description: Puare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puy
+Description: Purisimeño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: puz
+Description: Purum Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwa
+Description: Pawaia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwb
+Description: Panawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwg
+Description: Gapapaiwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwm
+Description: Molbog
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwn
+Description: Paiwan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwo
+Description: Pwo Western Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pwr
+Description: Powari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pww
+Description: Pwo Northern Karen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pxm
+Description: Quetzaltepec Mixe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pye
+Description: Pye Krumen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pym
+Description: Fyam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pyn
+Description: Poyanáwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pys
+Description: Paraguayan Sign Language
+Description: Lengua de Señas del Paraguay
+Added: 2010-03-11
+%%
+Type: language
+Subtag: pyu
+Description: Puyuma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pyx
+Description: Pyu (Myanmar)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pyy
+Description: Pyen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: pzn
+Description: Para Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qaa..qtz
+Description: Private use
+Added: 2005-10-16
+Scope: private-use
+%%
+Type: language
+Subtag: qua
+Description: Quapaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qub
+Description: Huallaga Huánuco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quc
+Description: K'iche'
+Description: Quiché
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qud
+Description: Calderón Highland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quf
+Description: Lambayeque Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qug
+Description: Chimborazo Highland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quh
+Description: South Bolivian Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qui
+Description: Quileute
+Added: 2009-07-29
+%%
+Type: language
+Subtag: quk
+Description: Chachapoyas Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qul
+Description: North Bolivian Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qum
+Description: Sipacapense
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qun
+Description: Quinault
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qup
+Description: Southern Pastaza Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quq
+Description: Quinqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qur
+Description: Yanahuanca Pasco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qus
+Description: Santiago del Estero Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quv
+Description: Sacapulteco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: quw
+Description: Tena Lowland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qux
+Description: Yauyos Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quy
+Description: Ayacucho Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: quz
+Description: Cusco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qva
+Description: Ambo-Pasco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvc
+Description: Cajamarca Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qve
+Description: Eastern Apurímac Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvh
+Description: Huamalíes-Dos de Mayo Huánuco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvi
+Description: Imbabura Highland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvj
+Description: Loja Highland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvl
+Description: Cajatambo North Lima Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvm
+Description: Margos-Yarowilca-Lauricocha Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvn
+Description: North Junín Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvo
+Description: Napo Lowland Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvp
+Description: Pacaraos Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvs
+Description: San Martín Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvw
+Description: Huaylla Wanca Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qvy
+Description: Queyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qvz
+Description: Northern Pastaza Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qwa
+Description: Corongo Ancash Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qwc
+Description: Classical Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qwe
+Description: Quechuan (family)
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: qwh
+Description: Huaylas Ancash Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qwm
+Description: Kuman (Russia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qws
+Description: Sihuas Ancash Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qwt
+Description: Kwalhioqua-Tlatskanai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qxa
+Description: Chiquián Ancash Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxc
+Description: Chincha Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxh
+Description: Panao Huánuco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxl
+Description: Salasaca Highland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxn
+Description: Northern Conchucos Ancash Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxo
+Description: Southern Conchucos Ancash Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxp
+Description: Puno Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxq
+Description: Qashqa'i
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qxr
+Description: Cañar Highland Quichua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxs
+Description: Southern Qiang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qxt
+Description: Santa Ana de Tusi Pasco Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxu
+Description: Arequipa-La Unión Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qxw
+Description: Jauja Wanca Quechua
+Added: 2009-07-29
+Macrolanguage: qu
+%%
+Type: language
+Subtag: qya
+Description: Quenya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: qyp
+Description: Quiripi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: raa
+Description: Dungmali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rab
+Description: Camling
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rac
+Description: Rasawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rad
+Description: Rade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: raf
+Description: Western Meohang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rag
+Description: Logooli
+Description: Lulogooli
+Added: 2009-07-29
+Macrolanguage: luy
+%%
+Type: language
+Subtag: rah
+Description: Rabha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rai
+Description: Ramoaaina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: raj
+Description: Rajasthani
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: rak
+Description: Tulu-Bohuai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ral
+Description: Ralte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ram
+Description: Canela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ran
+Description: Riantana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rao
+Description: Rao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rap
+Description: Rapanui
+Added: 2005-10-16
+%%
+Type: language
+Subtag: raq
+Description: Saam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rar
+Description: Rarotongan
+Description: Cook Islands Maori
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ras
+Description: Tegali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rat
+Description: Razajerdi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rau
+Description: Raute
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rav
+Description: Sampang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: raw
+Description: Rawang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rax
+Description: Rang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ray
+Description: Rapa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: raz
+Description: Rahambuu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rbb
+Description: Rumai Palaung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rbk
+Description: Northern Bontok
+Added: 2010-03-11
+Macrolanguage: bnc
+%%
+Type: language
+Subtag: rbl
+Description: Miraya Bikol
+Added: 2010-03-11
+Macrolanguage: bik
+%%
+Type: language
+Subtag: rbp
+Description: Barababaraba
+Added: 2012-08-12
+%%
+Type: language
+Subtag: rcf
+Description: Réunion Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rdb
+Description: Rudbari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rea
+Description: Rerau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: reb
+Description: Rembong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ree
+Description: Rejang Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: reg
+Description: Kara (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rei
+Description: Reli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rej
+Description: Rejang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rel
+Description: Rendille
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rem
+Description: Remo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ren
+Description: Rengao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rer
+Description: Rer Bare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: res
+Description: Reshe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ret
+Description: Retta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rey
+Description: Reyesano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rga
+Description: Roria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rge
+Description: Romano-Greek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rgk
+Description: Rangkas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rgn
+Description: Romagnol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rgr
+Description: Resígaro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rgs
+Description: Southern Roglai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rgu
+Description: Ringgou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rhg
+Description: Rohingya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rhp
+Description: Yahang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ria
+Description: Riang (India)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rie
+Description: Rien
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rif
+Description: Tarifit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ril
+Description: Riang (Myanmar)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rim
+Description: Nyaturu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rin
+Description: Nungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rir
+Description: Ribun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rit
+Description: Ritarungo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: riu
+Description: Riung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rjg
+Description: Rajong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rji
+Description: Raji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rjs
+Description: Rajbanshi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rka
+Description: Kraol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rkb
+Description: Rikbaktsa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rkh
+Description: Rakahanga-Manihiki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rki
+Description: Rakhine
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rkm
+Description: Marka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rkt
+Description: Rangpuri
+Description: Kamta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rma
+Description: Rama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmb
+Description: Rembarunga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmc
+Description: Carpathian Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmd
+Description: Traveller Danish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rme
+Description: Angloromani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmf
+Description: Kalo Finnish Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmg
+Description: Traveller Norwegian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmh
+Description: Murkim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmi
+Description: Lomavren
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmk
+Description: Romkun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rml
+Description: Baltic Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmm
+Description: Roma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmn
+Description: Balkan Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmo
+Description: Sinte Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmp
+Description: Rempi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmq
+Description: Caló
+Added: 2010-03-11
+%%
+Type: language
+Subtag: rmr
+Description: Caló
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see emx, rmq
+%%
+Type: language
+Subtag: rms
+Description: Romanian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmt
+Description: Domari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmu
+Description: Tavringer Romani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmv
+Description: Romanova
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmw
+Description: Welsh Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmx
+Description: Romam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rmy
+Description: Vlax Romani
+Added: 2009-07-29
+Macrolanguage: rom
+%%
+Type: language
+Subtag: rmz
+Description: Marma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rna
+Description: Runa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rnd
+Description: Ruund
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rng
+Description: Ronga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rnl
+Description: Ranglong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rnn
+Description: Roon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rnp
+Description: Rongpo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rnr
+Description: Nari Nari
+Added: 2012-08-20
+%%
+Type: language
+Subtag: rnw
+Description: Rungwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: roa
+Description: Romance languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: rob
+Description: Tae'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: roc
+Description: Cacgia Roglai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rod
+Description: Rogo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: roe
+Description: Ronji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rof
+Description: Rombo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rog
+Description: Northern Roglai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rol
+Description: Romblomanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rom
+Description: Romany
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: roo
+Description: Rotokas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rop
+Description: Kriol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ror
+Description: Rongga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rou
+Description: Runga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: row
+Description: Dela-Oenale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rpn
+Description: Repanbitip
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rpt
+Description: Rapting
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rri
+Description: Ririo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rro
+Description: Waima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rrt
+Description: Arritinngithigh
+Added: 2012-08-12
+%%
+Type: language
+Subtag: rsb
+Description: Romano-Serbian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rsi
+Description: Rennellese Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rsl
+Description: Russian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rtc
+Description: Rungtu Chin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: rth
+Description: Ratahan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rtm
+Description: Rotuman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rtw
+Description: Rathawi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rub
+Description: Gungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruc
+Description: Ruuli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rue
+Description: Rusyn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruf
+Description: Luguru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rug
+Description: Roviana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruh
+Description: Ruga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rui
+Description: Rufiji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruk
+Description: Che
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruo
+Description: Istro Romanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rup
+Description: Macedo-Romanian
+Description: Aromanian
+Description: Arumanian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ruq
+Description: Megleno Romanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rut
+Description: Rutul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruu
+Description: Lanas Lobu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruy
+Description: Mala (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ruz
+Description: Ruma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rwa
+Description: Rawo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rwk
+Description: Rwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rwm
+Description: Amba (Uganda)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rwo
+Description: Rawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rwr
+Description: Marwari (India)
+Added: 2009-07-29
+Macrolanguage: mwr
+%%
+Type: language
+Subtag: ryn
+Description: Northern Amami-Oshima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: rys
+Description: Yaeyama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ryu
+Description: Central Okinawan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: saa
+Description: Saba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sab
+Description: Buglere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sac
+Description: Meskwaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sad
+Description: Sandawe
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sae
+Description: Sabanê
+Added: 2009-07-29
+%%
+Type: language
+Subtag: saf
+Description: Safaliba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sah
+Description: Yakut
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sai
+Description: South American Indian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: saj
+Description: Sahu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sak
+Description: Sake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sal
+Description: Salishan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: sam
+Description: Samaritan Aramaic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sao
+Description: Sause
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sap
+Description: Sanapaná
+Added: 2009-07-29
+%%
+Type: language
+Subtag: saq
+Description: Samburu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sar
+Description: Saraveca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sas
+Description: Sasak
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sat
+Description: Santali
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sau
+Description: Saleman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sav
+Description: Saafi-Saafi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: saw
+Description: Sawi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sax
+Description: Sa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: say
+Description: Saya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: saz
+Description: Saurashtra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sba
+Description: Ngambay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbb
+Description: Simbo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbc
+Description: Kele (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbd
+Description: Southern Samo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbe
+Description: Saliba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbf
+Description: Shabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbg
+Description: Seget
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbh
+Description: Sori-Harengan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbi
+Description: Seti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbj
+Description: Surbakhal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbk
+Description: Safwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbl
+Description: Botolan Sambal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbm
+Description: Sagala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbn
+Description: Sindhi Bhil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbo
+Description: Sabüm
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbp
+Description: Sangu (Tanzania)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbq
+Description: Sileibi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbr
+Description: Sembakung Murut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbs
+Description: Subiya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbt
+Description: Kimki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbu
+Description: Stod Bhoti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbv
+Description: Sabine
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbw
+Description: Simba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbx
+Description: Seberuang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sby
+Description: Soli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sbz
+Description: Sara Kaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sca
+Description: Sansu
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: hle
+%%
+Type: language
+Subtag: scb
+Description: Chut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sce
+Description: Dongxiang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scf
+Description: San Miguel Creole French
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scg
+Description: Sanggau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sch
+Description: Sakachep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sci
+Description: Sri Lankan Creole Malay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sck
+Description: Sadri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scl
+Description: Shina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scn
+Description: Sicilian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sco
+Description: Scots
+Added: 2005-10-16
+%%
+Type: language
+Subtag: scp
+Description: Helambu Sherpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scq
+Description: Sa'och
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scs
+Description: North Slavey
+Added: 2009-07-29
+Macrolanguage: den
+%%
+Type: language
+Subtag: scu
+Description: Shumcho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scv
+Description: Sheni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scw
+Description: Sha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: scx
+Description: Sicel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sda
+Description: Toraja-Sa'dan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdb
+Description: Shabak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdc
+Description: Sassarese Sardinian
+Added: 2009-07-29
+Macrolanguage: sc
+%%
+Type: language
+Subtag: sde
+Description: Surubu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdf
+Description: Sarli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdg
+Description: Savi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdh
+Description: Southern Kurdish
+Added: 2009-07-29
+Macrolanguage: ku
+%%
+Type: language
+Subtag: sdj
+Description: Suundi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdk
+Description: Sos Kundi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdl
+Description: Saudi Arabian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdm
+Description: Semandang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdn
+Description: Gallurese Sardinian
+Added: 2009-07-29
+Macrolanguage: sc
+%%
+Type: language
+Subtag: sdo
+Description: Bukar-Sadung Bidayuh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdp
+Description: Sherdukpen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdr
+Description: Oraon Sadri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sds
+Description: Sened
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdt
+Description: Shuadit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdu
+Description: Sarudu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdv
+Description: Eastern Sudanic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: sdx
+Description: Sibu Melanau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sdz
+Description: Sallands
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sea
+Description: Semai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: seb
+Description: Shempire Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sec
+Description: Sechelt
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sed
+Description: Sedang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: see
+Description: Seneca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sef
+Description: Cebaara Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: seg
+Description: Segeju
+Added: 2009-07-29
+%%
+Type: language
+Subtag: seh
+Description: Sena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sei
+Description: Seri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sej
+Description: Sene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sek
+Description: Sekani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sel
+Description: Selkup
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sem
+Description: Semitic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: sen
+Description: Nanerigé Sénoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: seo
+Description: Suarmin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sep
+Description: Sìcìté Sénoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: seq
+Description: Senara Sénoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ser
+Description: Serrano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ses
+Description: Koyraboro Senni Songhai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: set
+Description: Sentani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: seu
+Description: Serui-Laut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sev
+Description: Nyarafolo Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sew
+Description: Sewa Bay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sey
+Description: Secoya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sez
+Description: Senthang Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sfb
+Description: Langue des signes de Belgique Francophone
+Description: French Belgian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sfe
+Description: Eastern Subanen
+Added: 2012-08-12
+%%
+Type: language
+Subtag: sfm
+Description: Small Flowery Miao
+Added: 2009-07-29
+Macrolanguage: hmn
+%%
+Type: language
+Subtag: sfs
+Description: South African Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sfw
+Description: Sehwi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sga
+Description: Old Irish (to 900)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sgb
+Description: Mag-antsi Ayta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgc
+Description: Kipsigis
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: sgd
+Description: Surigaonon
+Added: 2010-03-11
+%%
+Type: language
+Subtag: sge
+Description: Segai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgg
+Description: Swiss-German Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgh
+Description: Shughni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgi
+Description: Suga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgj
+Description: Surgujia
+Added: 2012-08-12
+%%
+Type: language
+Subtag: sgk
+Description: Sangkong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgl
+Description: Sanglechi-Ishkashimi
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see isk, sgy
+%%
+Type: language
+Subtag: sgm
+Description: Singa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgn
+Description: Sign languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: sgo
+Description: Songa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgp
+Description: Singpho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgr
+Description: Sangisari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgs
+Description: Samogitian
+Added: 2010-07-26
+%%
+Type: language
+Subtag: sgt
+Description: Brokpake
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgu
+Description: Salas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgw
+Description: Sebat Bet Gurage
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgx
+Description: Sierra Leone Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sgy
+Description: Sanglechi
+Added: 2010-03-11
+%%
+Type: language
+Subtag: sgz
+Description: Sursurunga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sha
+Description: Shall-Zwall
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shb
+Description: Ninam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shc
+Description: Sonde
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shd
+Description: Kundal Shahi
+Added: 2010-03-11
+%%
+Type: language
+Subtag: she
+Description: Sheko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shg
+Description: Shua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shh
+Description: Shoshoni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shi
+Description: Tachelhit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shj
+Description: Shatt
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shk
+Description: Shilluk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shl
+Description: Shendu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shm
+Description: Shahrudi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shn
+Description: Shan
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sho
+Description: Shanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shp
+Description: Shipibo-Conibo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shq
+Description: Sala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shr
+Description: Shi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shs
+Description: Shuswap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sht
+Description: Shasta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shu
+Description: Chadian Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: shv
+Description: Shehri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shw
+Description: Shwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shx
+Description: She
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shy
+Description: Tachawit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: shz
+Description: Syenara Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sia
+Description: Akkala Sami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sib
+Description: Sebop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sid
+Description: Sidamo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sie
+Description: Simaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sif
+Description: Siamou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sig
+Description: Paasaal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sih
+Description: Zire
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sii
+Description: Shom Peng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sij
+Description: Numbami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sik
+Description: Sikiana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sil
+Description: Tumulung Sisaala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sim
+Description: Mende (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sio
+Description: Siouan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: sip
+Description: Sikkimese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: siq
+Description: Sonia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sir
+Description: Siri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sis
+Description: Siuslaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sit
+Description: Sino-Tibetan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: siu
+Description: Sinagen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: siv
+Description: Sumariup
+Added: 2009-07-29
+%%
+Type: language
+Subtag: siw
+Description: Siwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: six
+Description: Sumau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: siy
+Description: Sivandi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: siz
+Description: Siwi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sja
+Description: Epena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjb
+Description: Sajau Basap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjd
+Description: Kildin Sami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sje
+Description: Pite Sami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjg
+Description: Assangori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjk
+Description: Kemi Sami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjl
+Description: Sajalong
+Description: Miji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjm
+Description: Mapun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjn
+Description: Sindarin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjo
+Description: Xibe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjp
+Description: Surjapuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjr
+Description: Siar-Lak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjs
+Description: Senhaja De Srair
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjt
+Description: Ter Sami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sju
+Description: Ume Sami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sjw
+Description: Shawnee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ska
+Description: Skagit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skb
+Description: Saek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skc
+Description: Ma Manda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skd
+Description: Southern Sierra Miwok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ske
+Description: Seke (Vanuatu)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skf
+Description: Sakirabiá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skg
+Description: Sakalava Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: skh
+Description: Sikule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ski
+Description: Sika
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skj
+Description: Seke (Nepal)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skk
+Description: Sok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skm
+Description: Kutong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skn
+Description: Kolibugan Subanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sko
+Description: Seko Tengah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skp
+Description: Sekapan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skq
+Description: Sininkere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skr
+Description: Seraiki
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: sks
+Description: Maia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skt
+Description: Sakata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sku
+Description: Sakao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skv
+Description: Skou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skw
+Description: Skepi Creole Dutch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skx
+Description: Seko Padang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sky
+Description: Sikaiana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: skz
+Description: Sekar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sla
+Description: Slavic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: slc
+Description: Sáliba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sld
+Description: Sissala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sle
+Description: Sholaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slf
+Description: Swiss-Italian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slg
+Description: Selungai Murut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slh
+Description: Southern Puget Sound Salish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sli
+Description: Lower Silesian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slj
+Description: Salumá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sll
+Description: Salt-Yui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slm
+Description: Pangutaran Sama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sln
+Description: Salinan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slp
+Description: Lamaholot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slq
+Description: Salchuq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slr
+Description: Salar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sls
+Description: Singapore Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slt
+Description: Sila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slu
+Description: Selaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slw
+Description: Sialum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slx
+Description: Salampasu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sly
+Description: Selayar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: slz
+Description: Ma'ya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sma
+Description: Southern Sami
+Added: 2005-10-16
+%%
+Type: language
+Subtag: smb
+Description: Simbari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smc
+Description: Som
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smd
+Description: Sama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smf
+Description: Auwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smg
+Description: Simbali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smh
+Description: Samei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smi
+Description: Sami languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: smj
+Description: Lule Sami
+Added: 2005-10-16
+%%
+Type: language
+Subtag: smk
+Description: Bolinao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sml
+Description: Central Sama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smm
+Description: Musasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smn
+Description: Inari Sami
+Added: 2005-10-16
+%%
+Type: language
+Subtag: smp
+Description: Samaritan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smq
+Description: Samo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smr
+Description: Simeulue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sms
+Description: Skolt Sami
+Added: 2005-10-16
+%%
+Type: language
+Subtag: smt
+Description: Simte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smu
+Description: Somray
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smv
+Description: Samvedi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smw
+Description: Sumbawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smx
+Description: Samba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smy
+Description: Semnani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: smz
+Description: Simeku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snb
+Description: Sebuyau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snc
+Description: Sinaugoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sne
+Description: Bau Bidayuh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snf
+Description: Noon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sng
+Description: Sanga (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snh
+Description: Shinabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sni
+Description: Sensi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snj
+Description: Riverain Sango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snk
+Description: Soninke
+Added: 2005-10-16
+%%
+Type: language
+Subtag: snl
+Description: Sangil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snm
+Description: Southern Ma'di
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snn
+Description: Siona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sno
+Description: Snohomish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snp
+Description: Siane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snq
+Description: Sangu (Gabon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snr
+Description: Sihan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sns
+Description: South West Bay
+Description: Nahavaq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snu
+Description: Senggi
+Description: Viid
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snv
+Description: Sa'ban
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snw
+Description: Selee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snx
+Description: Sam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sny
+Description: Saniyo-Hiyewe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: snz
+Description: Sinsauru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soa
+Description: Thai Song
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sob
+Description: Sobei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soc
+Description: So (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sod
+Description: Songoora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soe
+Description: Songomeno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sog
+Description: Sogdian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: soh
+Description: Aka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soi
+Description: Sonha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soj
+Description: Soi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sok
+Description: Sokoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sol
+Description: Solos
+Added: 2009-07-29
+%%
+Type: language
+Subtag: son
+Description: Songhai languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: soo
+Description: Songo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sop
+Description: Songe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soq
+Description: Kanasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sor
+Description: Somrai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sos
+Description: Seeku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sou
+Description: Southern Thai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sov
+Description: Sonsorol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sow
+Description: Sowanda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sox
+Description: Swo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soy
+Description: Miyobe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: soz
+Description: Temi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spb
+Description: Sepa (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spc
+Description: Sapé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spd
+Description: Saep
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spe
+Description: Sepa (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spg
+Description: Sian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spi
+Description: Saponi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spk
+Description: Sengo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spl
+Description: Selepet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spm
+Description: Akukem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spo
+Description: Spokane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spp
+Description: Supyire Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spq
+Description: Loreto-Ucayali Spanish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spr
+Description: Saparua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sps
+Description: Saposa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spt
+Description: Spiti Bhoti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spu
+Description: Sapuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spv
+Description: Sambalpuri
+Description: Kosli
+Added: 2012-08-12
+Macrolanguage: or
+%%
+Type: language
+Subtag: spx
+Description: South Picene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: spy
+Description: Sabaot
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: sqa
+Description: Shama-Sambuga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqh
+Description: Shau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqj
+Description: Albanian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: sqk
+Description: Albanian Sign Language
+Added: 2012-08-12
+%%
+Type: language
+Subtag: sqm
+Description: Suma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqn
+Description: Susquehannock
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqo
+Description: Sorkhei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqq
+Description: Sou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqr
+Description: Siculo Arabic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqs
+Description: Sri Lankan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sqt
+Description: Soqotri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: squ
+Description: Squamish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sra
+Description: Saruga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srb
+Description: Sora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: src
+Description: Logudorese Sardinian
+Added: 2009-07-29
+Macrolanguage: sc
+%%
+Type: language
+Subtag: sre
+Description: Sara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srf
+Description: Nafi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srg
+Description: Sulod
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srh
+Description: Sarikoli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sri
+Description: Siriano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srk
+Description: Serudung Murut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srl
+Description: Isirawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srm
+Description: Saramaccan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srn
+Description: Sranan Tongo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sro
+Description: Campidanese Sardinian
+Added: 2009-07-29
+Macrolanguage: sc
+%%
+Type: language
+Subtag: srq
+Description: Sirionó
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srr
+Description: Serer
+Added: 2005-10-16
+%%
+Type: language
+Subtag: srs
+Description: Sarsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srt
+Description: Sauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sru
+Description: Suruí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srv
+Description: Southern Sorsoganon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srw
+Description: Serua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srx
+Description: Sirmauri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sry
+Description: Sera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: srz
+Description: Shahmirzadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssa
+Description: Nilo-Saharan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ssb
+Description: Southern Sama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssc
+Description: Suba-Simbiti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssd
+Description: Siroi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sse
+Description: Balangingi
+Description: Bangingih Sama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssf
+Description: Thao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssg
+Description: Seimat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssh
+Description: Shihhi Arabic
+Added: 2009-07-29
+Macrolanguage: ar
+%%
+Type: language
+Subtag: ssi
+Description: Sansi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssj
+Description: Sausi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssk
+Description: Sunam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssl
+Description: Western Sisaala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssm
+Description: Semnam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssn
+Description: Waata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sso
+Description: Sissano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssp
+Description: Spanish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssq
+Description: So'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssr
+Description: Swiss-French Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sss
+Description: Sô
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sst
+Description: Sinasina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssu
+Description: Susuami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssv
+Description: Shark Bay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssx
+Description: Samberigi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssy
+Description: Saho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ssz
+Description: Sengseng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sta
+Description: Settla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stb
+Description: Northern Subanen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: std
+Description: Sentinel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ste
+Description: Liana-Seti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stf
+Description: Seta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stg
+Description: Trieng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sth
+Description: Shelta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sti
+Description: Bulo Stieng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stj
+Description: Matya Samo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stk
+Description: Arammba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stl
+Description: Stellingwerfs
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stm
+Description: Setaman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stn
+Description: Owa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sto
+Description: Stoney
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stp
+Description: Southeastern Tepehuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stq
+Description: Saterfriesisch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: str
+Description: Straits Salish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sts
+Description: Shumashti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stt
+Description: Budeh Stieng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stu
+Description: Samtao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stv
+Description: Silt'e
+Added: 2009-07-29
+%%
+Type: language
+Subtag: stw
+Description: Satawalese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sua
+Description: Sulka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sub
+Description: Suku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: suc
+Description: Western Subanon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sue
+Description: Suena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sug
+Description: Suganga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sui
+Description: Suki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: suj
+Description: Shubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: suk
+Description: Sukuma
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sul
+Description: Surigaonon
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see sgd, tgn
+%%
+Type: language
+Subtag: sum
+Description: Sumo-Mayangna
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see ulw, yan
+%%
+Type: language
+Subtag: suq
+Description: Suri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sur
+Description: Mwaghavul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sus
+Description: Susu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: sut
+Description: Subtiaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: suv
+Description: Puroik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: suw
+Description: Sumbwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sux
+Description: Sumerian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: suy
+Description: Suyá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: suz
+Description: Sunwar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sva
+Description: Svan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: svb
+Description: Ulau-Suain
+Added: 2009-07-29
+%%
+Type: language
+Subtag: svc
+Description: Vincentian Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sve
+Description: Serili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: svk
+Description: Slovakian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: svr
+Description: Savara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: svs
+Description: Savosavo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: svx
+Description: Skalvian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swb
+Description: Maore Comorian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swc
+Description: Congo Swahili
+Added: 2009-07-29
+Macrolanguage: sw
+%%
+Type: language
+Subtag: swf
+Description: Sere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swg
+Description: Swabian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swh
+Description: Swahili (individual language)
+Description: Kiswahili
+Added: 2009-07-29
+Macrolanguage: sw
+%%
+Type: language
+Subtag: swi
+Description: Sui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swj
+Description: Sira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swk
+Description: Malawi Sena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swl
+Description: Swedish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swm
+Description: Samosa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swn
+Description: Sawknah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swo
+Description: Shanenawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swp
+Description: Suau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swq
+Description: Sharwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swr
+Description: Saweru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sws
+Description: Seluwasan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swt
+Description: Sawila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swu
+Description: Suwawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swv
+Description: Shekhawati
+Added: 2009-07-29
+Macrolanguage: mwr
+%%
+Type: language
+Subtag: sww
+Description: Sowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swx
+Description: Suruahá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: swy
+Description: Sarua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxb
+Description: Suba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxc
+Description: Sicanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxe
+Description: Sighu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxg
+Description: Shixing
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxk
+Description: Southern Kalapuya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxl
+Description: Selian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxm
+Description: Samre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxn
+Description: Sangir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxo
+Description: Sorothaptic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxr
+Description: Saaroa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxs
+Description: Sasaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxu
+Description: Upper Saxon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sxw
+Description: Saxwe Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sya
+Description: Siang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syb
+Description: Central Subanen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syc
+Description: Classical Syriac
+Added: 2007-04-03
+%%
+Type: language
+Subtag: syd
+Description: Samoyedic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: syi
+Description: Seki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syk
+Description: Sukur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syl
+Description: Sylheti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sym
+Description: Maya Samo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syn
+Description: Senaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syo
+Description: Suoy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syr
+Description: Syriac
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: sys
+Description: Sinyar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syw
+Description: Kagate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: syy
+Description: Al-Sayyid Bedouin Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sza
+Description: Semelai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szb
+Description: Ngalum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szc
+Description: Semaq Beri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szd
+Description: Seru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: sze
+Description: Seze
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szg
+Description: Sengele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szl
+Description: Silesian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szn
+Description: Sula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szp
+Description: Suabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szv
+Description: Isu (Fako Division)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: szw
+Description: Sawai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: taa
+Description: Lower Tanana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tab
+Description: Tabassaran
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tac
+Description: Lowland Tarahumara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tad
+Description: Tause
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tae
+Description: Tariana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: taf
+Description: Tapirapé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tag
+Description: Tagoi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tai
+Description: Tai languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: taj
+Description: Eastern Tamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tak
+Description: Tala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tal
+Description: Tal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tan
+Description: Tangale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tao
+Description: Yami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tap
+Description: Taabwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: taq
+Description: Tamasheq
+Added: 2009-07-29
+Macrolanguage: tmh
+%%
+Type: language
+Subtag: tar
+Description: Central Tarahumara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tas
+Description: Tay Boi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tau
+Description: Upper Tanana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tav
+Description: Tatuyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: taw
+Description: Tai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tax
+Description: Tamki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tay
+Description: Atayal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: taz
+Description: Tocho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tba
+Description: Aikanã
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbb
+Description: Tapeba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbc
+Description: Takia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbd
+Description: Kaki Ae
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbe
+Description: Tanimbili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbf
+Description: Mandara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbg
+Description: North Tairora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbh
+Description: Thurawal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbi
+Description: Gaam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbj
+Description: Tiang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbk
+Description: Calamian Tagbanwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbl
+Description: Tboli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbm
+Description: Tagbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbn
+Description: Barro Negro Tunebo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbo
+Description: Tawala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbp
+Description: Taworta
+Description: Diebroud
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbq
+Description: Tibeto-Burman languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: tbr
+Description: Tumtum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbs
+Description: Tanguat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbt
+Description: Tembo (Kitembo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbu
+Description: Tubar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbv
+Description: Tobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbw
+Description: Tagbanwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbx
+Description: Kapin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tby
+Description: Tabaru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tbz
+Description: Ditammari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tca
+Description: Ticuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcb
+Description: Tanacross
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcc
+Description: Datooga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcd
+Description: Tafi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tce
+Description: Southern Tutchone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcf
+Description: Malinaltepec Me'phaa
+Description: Malinaltepec Tlapanec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcg
+Description: Tamagario
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tch
+Description: Turks And Caicos Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tci
+Description: Wára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tck
+Description: Tchitchege
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcl
+Description: Taman (Myanmar)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcm
+Description: Tanahmerah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcn
+Description: Tichurong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tco
+Description: Taungyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcp
+Description: Tawr Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcq
+Description: Kaiy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcs
+Description: Torres Strait Creole
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tct
+Description: T'en
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcu
+Description: Southeastern Tarahumara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcw
+Description: Tecpatlán Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcx
+Description: Toda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcy
+Description: Tulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tcz
+Description: Thado Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tda
+Description: Tagdal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdb
+Description: Panchpargania
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdc
+Description: Emberá-Tadó
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdd
+Description: Tai Nüa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tde
+Description: Tiranige Diga Dogon
+Added: 2010-03-11
+%%
+Type: language
+Subtag: tdf
+Description: Talieng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdg
+Description: Western Tamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdh
+Description: Thulung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdi
+Description: Tomadino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdj
+Description: Tajio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdk
+Description: Tambas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdl
+Description: Sur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdn
+Description: Tondano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdo
+Description: Teme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdq
+Description: Tita
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdr
+Description: Todrah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tds
+Description: Doutai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdt
+Description: Tetun Dili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdu
+Description: Tempasuk Dusun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdv
+Description: Toro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tdx
+Description: Tandroy-Mahafaly Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: tdy
+Description: Tadyawan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tea
+Description: Temiar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: teb
+Description: Tetete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tec
+Description: Terik
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: ted
+Description: Tepo Krumen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tee
+Description: Huehuetla Tepehua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tef
+Description: Teressa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: teg
+Description: Teke-Tege
+Added: 2009-07-29
+%%
+Type: language
+Subtag: teh
+Description: Tehuelche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tei
+Description: Torricelli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tek
+Description: Ibali Teke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tem
+Description: Timne
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: ten
+Description: Tama (Colombia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: teo
+Description: Teso
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tep
+Description: Tepecano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: teq
+Description: Temein
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ter
+Description: Tereno
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tes
+Description: Tengger
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tet
+Description: Tetum
+Added: 2005-10-16
+%%
+Type: language
+Subtag: teu
+Description: Soo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tev
+Description: Teor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tew
+Description: Tewa (USA)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tex
+Description: Tennet
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tey
+Description: Tulishi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tfi
+Description: Tofin Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tfn
+Description: Tanaina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tfo
+Description: Tefaro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tfr
+Description: Teribe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tft
+Description: Ternate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tga
+Description: Sagalla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgb
+Description: Tobilung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgc
+Description: Tigak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgd
+Description: Ciwogai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tge
+Description: Eastern Gorkha Tamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgf
+Description: Chalikha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgg
+Description: Tangga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgh
+Description: Tobagonian Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgi
+Description: Lawunuia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgj
+Description: Tagin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: tgn
+Description: Tandaganon
+Added: 2010-03-11
+%%
+Type: language
+Subtag: tgo
+Description: Sudest
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgp
+Description: Tangoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgq
+Description: Tring
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgr
+Description: Tareng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgs
+Description: Nume
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgt
+Description: Central Tagbanwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgu
+Description: Tanggu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgv
+Description: Tingui-Boto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgw
+Description: Tagwana Senoufo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgx
+Description: Tagish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgy
+Description: Togoyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tgz
+Description: Tagalaka
+Added: 2012-08-12
+%%
+Type: language
+Subtag: thc
+Description: Tai Hang Tong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thd
+Description: Thayore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: the
+Description: Chitwania Tharu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thf
+Description: Thangmi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thh
+Description: Northern Tarahumara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thi
+Description: Tai Long
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thk
+Description: Tharaka
+Description: Kitharaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thl
+Description: Dangaura Tharu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thm
+Description: Aheu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thn
+Description: Thachanadan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thp
+Description: Thompson
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thq
+Description: Kochila Tharu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thr
+Description: Rana Tharu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ths
+Description: Thakali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tht
+Description: Tahltan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thu
+Description: Thuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thv
+Description: Tahaggart Tamahaq
+Added: 2009-07-29
+Macrolanguage: tmh
+%%
+Type: language
+Subtag: thw
+Description: Thudam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thx
+Description: The
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thy
+Description: Tha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: thz
+Description: Tayart Tamajeq
+Added: 2009-07-29
+Macrolanguage: tmh
+%%
+Type: language
+Subtag: tia
+Description: Tidikelt Tamazight
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tic
+Description: Tira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tid
+Description: Tidong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tie
+Description: Tingal
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Preferred-Value: ras
+%%
+Type: language
+Subtag: tif
+Description: Tifal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tig
+Description: Tigre
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tih
+Description: Timugon Murut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tii
+Description: Tiene
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tij
+Description: Tilung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tik
+Description: Tikar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: til
+Description: Tillamook
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tim
+Description: Timbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tin
+Description: Tindi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tio
+Description: Teop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tip
+Description: Trimuris
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tiq
+Description: Tiéfo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tis
+Description: Masadiit Itneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tit
+Description: Tinigua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tiu
+Description: Adasen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tiv
+Description: Tiv
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tiw
+Description: Tiwi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tix
+Description: Southern Tiwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tiy
+Description: Tiruray
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tiz
+Description: Tai Hongjin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tja
+Description: Tajuasohn
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tjg
+Description: Tunjung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tji
+Description: Northern Tujia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tjl
+Description: Tai Laing
+Added: 2012-08-12
+%%
+Type: language
+Subtag: tjm
+Description: Timucua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tjn
+Description: Tonjon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tjo
+Description: Temacine Tamazight
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tjs
+Description: Southern Tujia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tju
+Description: Tjurruru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tka
+Description: Truká
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkb
+Description: Buksa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkd
+Description: Tukudede
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tke
+Description: Takwane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkf
+Description: Tukumanféd
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkg
+Description: Tesaka Malagasy
+Added: 2011-08-16
+Macrolanguage: mg
+%%
+Type: language
+Subtag: tkk
+Description: Takpa
+Added: 2009-07-29
+Deprecated: 2011-08-16
+Preferred-Value: twm
+%%
+Type: language
+Subtag: tkl
+Description: Tokelau
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: tkm
+Description: Takelma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkn
+Description: Toku-No-Shima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkp
+Description: Tikopia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkq
+Description: Tee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkr
+Description: Tsakhur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tks
+Description: Takestani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkt
+Description: Kathoriya Tharu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tku
+Description: Upper Necaxa Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkw
+Description: Teanu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkx
+Description: Tangko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tkz
+Description: Takua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tla
+Description: Southwestern Tepehuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlb
+Description: Tobelo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlc
+Description: Yecuatla Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tld
+Description: Talaud
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlf
+Description: Telefol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlg
+Description: Tofanma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlh
+Description: Klingon
+Description: tlhIngan-Hol
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tli
+Description: Tlingit
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tlj
+Description: Talinga-Bwisi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlk
+Description: Taloki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tll
+Description: Tetela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlm
+Description: Tolomako
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tln
+Description: Talondo'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlo
+Description: Talodi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlp
+Description: Filomena Mata-Coahuitlán Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlq
+Description: Tai Loi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlr
+Description: Talise
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tls
+Description: Tambotalo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlt
+Description: Teluti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlu
+Description: Tulehu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlv
+Description: Taliabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tlw
+Description: South Wemale
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: weo
+%%
+Type: language
+Subtag: tlx
+Description: Khehek
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tly
+Description: Talysh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tma
+Description: Tama (Chad)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmb
+Description: Katbol
+Description: Avava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmc
+Description: Tumak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmd
+Description: Haruai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tme
+Description: Tremembé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmf
+Description: Toba-Maskoy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmg
+Description: Ternateño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmh
+Description: Tamashek
+Added: 2005-10-16
+Suppress-Script: Latn
+Scope: macrolanguage
+%%
+Type: language
+Subtag: tmi
+Description: Tutuba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmj
+Description: Samarokena
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmk
+Description: Northwestern Tamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tml
+Description: Tamnim Citak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmm
+Description: Tai Thanh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmn
+Description: Taman (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmo
+Description: Temoq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmp
+Description: Tai Mène
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmq
+Description: Tumleo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmr
+Description: Jewish Babylonian Aramaic (ca. 200-1200 CE)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tms
+Description: Tima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmt
+Description: Tasmate
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmu
+Description: Iau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmv
+Description: Tembo (Motembo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmw
+Description: Temuan
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: tmy
+Description: Tami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tmz
+Description: Tamanaku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tna
+Description: Tacana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnb
+Description: Western Tunebo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnc
+Description: Tanimuca-Retuarã
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnd
+Description: Angosturas Tunebo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tne
+Description: Tinoc Kallahan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnf
+Description: Tangshewi
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Preferred-Value: prs
+%%
+Type: language
+Subtag: tng
+Description: Tobanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnh
+Description: Maiani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tni
+Description: Tandia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnk
+Description: Kwamera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnl
+Description: Lenakel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnm
+Description: Tabla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnn
+Description: North Tanna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tno
+Description: Toromono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnp
+Description: Whitesands
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnq
+Description: Taino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnr
+Description: Bedik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tns
+Description: Tenis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnt
+Description: Tontemboan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnu
+Description: Tay Khang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnv
+Description: Tangchangya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnw
+Description: Tonsawang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnx
+Description: Tanema
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tny
+Description: Tongwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tnz
+Description: Tonga (Thailand)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tob
+Description: Toba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toc
+Description: Coyutla Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tod
+Description: Toma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toe
+Description: Tomedes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tof
+Description: Gizrra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tog
+Description: Tonga (Nyasa)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: toh
+Description: Gitonga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toi
+Description: Tonga (Zambia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toj
+Description: Tojolabal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tol
+Description: Tolowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tom
+Description: Tombulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: too
+Description: Xicotepec De Juárez Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: top
+Description: Papantla Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toq
+Description: Toposa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tor
+Description: Togbo-Vara Banda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tos
+Description: Highland Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tou
+Description: Tho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tov
+Description: Upper Taromi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tow
+Description: Jemez
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tox
+Description: Tobian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toy
+Description: Topoiyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: toz
+Description: To
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpa
+Description: Taupota
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpc
+Description: Azoyú Me'phaa
+Description: Azoyú Tlapanec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpe
+Description: Tippera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpf
+Description: Tarpia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpg
+Description: Kula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpi
+Description: Tok Pisin
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: tpj
+Description: Tapieté
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpk
+Description: Tupinikin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpl
+Description: Tlacoapa Me'phaa
+Description: Tlacoapa Tlapanec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpm
+Description: Tampulma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpn
+Description: Tupinambá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpo
+Description: Tai Pao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpp
+Description: Pisaflores Tepehua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpq
+Description: Tukpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpr
+Description: Tuparí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpt
+Description: Tlachichilco Tepehua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpu
+Description: Tampuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpv
+Description: Tanapag
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpw
+Description: Tupí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpx
+Description: Acatepec Me'phaa
+Description: Acatepec Tlapanec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpy
+Description: Trumai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tpz
+Description: Tinputz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqb
+Description: Tembé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tql
+Description: Lehali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqm
+Description: Turumsa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqn
+Description: Tenino
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqo
+Description: Toaripi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqp
+Description: Tomoip
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqq
+Description: Tunni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqr
+Description: Torona
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqt
+Description: Western Totonac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqu
+Description: Touo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tqw
+Description: Tonkawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tra
+Description: Tirahi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trb
+Description: Terebu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trc
+Description: Copala Triqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trd
+Description: Turi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tre
+Description: East Tarangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trf
+Description: Trinidadian Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trg
+Description: Lishán Didán
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trh
+Description: Turaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tri
+Description: Trió
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trj
+Description: Toram
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trk
+Description: Turkic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: trl
+Description: Traveller Scottish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trm
+Description: Tregami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trn
+Description: Trinitario
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tro
+Description: Tarao Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trp
+Description: Kok Borok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trq
+Description: San Martín Itunyoso Triqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trr
+Description: Taushiro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trs
+Description: Chicahuaxtla Triqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trt
+Description: Tunggare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tru
+Description: Turoyo
+Description: Surayt
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trv
+Description: Taroko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trw
+Description: Torwali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trx
+Description: Tringgus-Sembaan Bidayuh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: try
+Description: Turung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: trz
+Description: Torá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsa
+Description: Tsaangi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsb
+Description: Tsamai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsc
+Description: Tswa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsd
+Description: Tsakonian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tse
+Description: Tunisian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsf
+Description: Southwestern Tamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsg
+Description: Tausug
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsh
+Description: Tsuvan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsi
+Description: Tsimshian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tsj
+Description: Tshangla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsk
+Description: Tseku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsl
+Description: Ts'ün-Lao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsm
+Description: Turkish Sign Language
+Description: Türk İşaret Dili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsp
+Description: Northern Toussian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsq
+Description: Thai Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsr
+Description: Akei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tss
+Description: Taiwan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tst
+Description: Tondi Songway Kiini
+Added: 2011-08-16
+%%
+Type: language
+Subtag: tsu
+Description: Tsou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsv
+Description: Tsogo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsw
+Description: Tsishingini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsx
+Description: Mubami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsy
+Description: Tebul Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tsz
+Description: Purepecha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tta
+Description: Tutelo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttb
+Description: Gaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttc
+Description: Tektiteko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttd
+Description: Tauade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tte
+Description: Bwanabwana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttf
+Description: Tuotomb
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttg
+Description: Tutong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tth
+Description: Upper Ta'oih
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tti
+Description: Tobati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttj
+Description: Tooro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttk
+Description: Totoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttl
+Description: Totela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttm
+Description: Northern Tutchone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttn
+Description: Towei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tto
+Description: Lower Ta'oih
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttp
+Description: Tombelala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttq
+Description: Tawallammat Tamajaq
+Added: 2009-07-29
+Macrolanguage: tmh
+%%
+Type: language
+Subtag: ttr
+Description: Tera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tts
+Description: Northeastern Thai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttt
+Description: Muslim Tat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttu
+Description: Torau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttv
+Description: Titan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttw
+Description: Long Wat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tty
+Description: Sikaritai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ttz
+Description: Tsum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tua
+Description: Wiarumus
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tub
+Description: Tübatulabal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuc
+Description: Mutu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tud
+Description: Tuxá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tue
+Description: Tuyuca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuf
+Description: Central Tunebo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tug
+Description: Tunia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuh
+Description: Taulil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tui
+Description: Tupuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuj
+Description: Tugutil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tul
+Description: Tula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tum
+Description: Tumbuka
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tun
+Description: Tunica
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuo
+Description: Tucano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tup
+Description: Tupi languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: tuq
+Description: Tedaga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tus
+Description: Tuscarora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tut
+Description: Altaic languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: tuu
+Description: Tututni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuv
+Description: Turkana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuw
+Description: Tungus languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: tux
+Description: Tuxináwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tuy
+Description: Tugen
+Added: 2009-07-29
+Macrolanguage: kln
+%%
+Type: language
+Subtag: tuz
+Description: Turka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tva
+Description: Vaghua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvd
+Description: Tsuvadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tve
+Description: Te'un
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvk
+Description: Southeast Ambrym
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvl
+Description: Tuvalu
+Added: 2005-10-16
+Suppress-Script: Latn
+%%
+Type: language
+Subtag: tvm
+Description: Tela-Masbuar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvn
+Description: Tavoyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvo
+Description: Tidore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvs
+Description: Taveta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvt
+Description: Tutsa Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvu
+Description: Tunen
+Added: 2012-08-12
+%%
+Type: language
+Subtag: tvw
+Description: Sedoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tvy
+Description: Timor Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twa
+Description: Twana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twb
+Description: Western Tawbuid
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twc
+Description: Teshenawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twd
+Description: Twents
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twe
+Description: Tewa (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twf
+Description: Northern Tiwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twg
+Description: Tereweng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twh
+Description: Tai Dón
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twl
+Description: Tawara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twm
+Description: Tawang Monpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twn
+Description: Twendi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: two
+Description: Tswapong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twp
+Description: Ere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twq
+Description: Tasawaq
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twr
+Description: Southwestern Tarahumara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twt
+Description: Turiwára
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twu
+Description: Termanu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tww
+Description: Tuwari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twx
+Description: Tewe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: twy
+Description: Tawoyan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txa
+Description: Tombonuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txb
+Description: Tokharian B
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txc
+Description: Tsetsaut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txe
+Description: Totoli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txg
+Description: Tangut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txh
+Description: Thracian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txi
+Description: Ikpeng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txm
+Description: Tomini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txn
+Description: West Tarangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txo
+Description: Toto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txq
+Description: Tii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txr
+Description: Tartessian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txs
+Description: Tonsea
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txt
+Description: Citak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txu
+Description: Kayapó
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txx
+Description: Tatana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: txy
+Description: Tanosy Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: tya
+Description: Tauya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tye
+Description: Kyenga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyh
+Description: O'du
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyi
+Description: Teke-Tsaayi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyj
+Description: Tai Do
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyl
+Description: Thu Lao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyn
+Description: Kombai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: typ
+Description: Thaypan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyr
+Description: Tai Daeng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tys
+Description: Tày Sa Pa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyt
+Description: Tày Tac
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyu
+Description: Kua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyv
+Description: Tuvinian
+Added: 2005-10-16
+%%
+Type: language
+Subtag: tyx
+Description: Teke-Tyee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tyz
+Description: Tày
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tza
+Description: Tanzanian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tzh
+Description: Tzeltal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tzj
+Description: Tz'utujil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tzm
+Description: Central Atlas Tamazight
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tzn
+Description: Tugun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tzo
+Description: Tzotzil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: tzx
+Description: Tabriak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uam
+Description: Uamué
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uan
+Description: Kuan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uar
+Description: Tairuma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uba
+Description: Ubang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ubi
+Description: Ubi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ubl
+Description: Buhi'non Bikol
+Added: 2010-03-11
+Macrolanguage: bik
+%%
+Type: language
+Subtag: ubr
+Description: Ubir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ubu
+Description: Umbu-Ungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uby
+Description: Ubykh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uda
+Description: Uda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ude
+Description: Udihe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: udg
+Description: Muduga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: udi
+Description: Udi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: udj
+Description: Ujir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: udl
+Description: Wuzlam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: udm
+Description: Udmurt
+Added: 2005-10-16
+%%
+Type: language
+Subtag: udu
+Description: Uduk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ues
+Description: Kioko
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ufi
+Description: Ufim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uga
+Description: Ugaritic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: ugb
+Description: Kuku-Ugbanh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uge
+Description: Ughele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ugn
+Description: Ugandan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ugo
+Description: Ugong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ugy
+Description: Uruguayan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uha
+Description: Uhami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uhn
+Description: Damal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uis
+Description: Uisai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uiv
+Description: Iyive
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uji
+Description: Tanjijili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uka
+Description: Kaburi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ukg
+Description: Ukuriguma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ukh
+Description: Ukhwejo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ukl
+Description: Ukrainian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ukp
+Description: Ukpe-Bayobiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ukq
+Description: Ukwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uks
+Description: Urubú-Kaapor Sign Language
+Description: Kaapor Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uku
+Description: Ukue
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ukw
+Description: Ukwuani-Aboh-Ndoni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uky
+Description: Kuuk-Yak
+Added: 2012-08-12
+%%
+Type: language
+Subtag: ula
+Description: Fungwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulb
+Description: Ulukwumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulc
+Description: Ulch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulf
+Description: Usku
+Description: Afra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uli
+Description: Ulithian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulk
+Description: Meriam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ull
+Description: Ullatan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulm
+Description: Ulumanda'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uln
+Description: Unserdeutsch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulu
+Description: Uma' Lung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ulw
+Description: Ulwa
+Added: 2010-03-11
+%%
+Type: language
+Subtag: uma
+Description: Umatilla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umb
+Description: Umbundu
+Added: 2005-10-16
+%%
+Type: language
+Subtag: umc
+Description: Marrucinian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umd
+Description: Umbindhamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umg
+Description: Umbuygamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umi
+Description: Ukit
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umm
+Description: Umon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umn
+Description: Makyan Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umo
+Description: Umotína
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ump
+Description: Umpila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umr
+Description: Umbugarla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ums
+Description: Pendau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: umu
+Description: Munsee
+Added: 2009-07-29
+Macrolanguage: del
+%%
+Type: language
+Subtag: una
+Description: North Watut
+Added: 2009-07-29
+%%
+Type: language
+Subtag: und
+Description: Undetermined
+Added: 2005-10-16
+Scope: special
+%%
+Type: language
+Subtag: une
+Description: Uneme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ung
+Description: Ngarinyin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: unk
+Description: Enawené-Nawé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: unm
+Description: Unami
+Added: 2009-07-29
+Macrolanguage: del
+%%
+Type: language
+Subtag: unp
+Description: Worora
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see wro, xgu
+%%
+Type: language
+Subtag: unr
+Description: Mundari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: unx
+Description: Munda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: unz
+Description: Unde Kaili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uok
+Description: Uokha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: upi
+Description: Umeda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: upv
+Description: Uripiv-Wala-Rano-Atchin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ura
+Description: Urarina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urb
+Description: Urubú-Kaapor
+Description: Kaapor
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urc
+Description: Urningangg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ure
+Description: Uru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urf
+Description: Uradhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urg
+Description: Urigina
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urh
+Description: Urhobo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uri
+Description: Urim
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urj
+Description: Uralic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: urk
+Description: Urak Lawoi'
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: url
+Description: Urali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urm
+Description: Urapmin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urn
+Description: Uruangnirin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uro
+Description: Ura (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urp
+Description: Uru-Pa-In
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urr
+Description: Lehalurup
+Description: Löyöp
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urt
+Description: Urat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uru
+Description: Urumi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urv
+Description: Uruava
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urw
+Description: Sop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urx
+Description: Urimo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ury
+Description: Orya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: urz
+Description: Uru-Eu-Wau-Wau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: usa
+Description: Usarufa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ush
+Description: Ushojo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: usi
+Description: Usui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: usk
+Description: Usaghade
+Added: 2009-07-29
+%%
+Type: language
+Subtag: usp
+Description: Uspanteco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: usu
+Description: Uya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uta
+Description: Otank
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ute
+Description: Ute-Southern Paiute
+Added: 2009-07-29
+%%
+Type: language
+Subtag: utp
+Description: Amba (Solomon Islands)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: utr
+Description: Etulo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: utu
+Description: Utu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uum
+Description: Urum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uun
+Description: Kulon-Pazeh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uur
+Description: Ura (Vanuatu)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uuu
+Description: U
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uve
+Description: West Uvean
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uvh
+Description: Uri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uvl
+Description: Lote
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uwa
+Description: Kuku-Uwanh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uya
+Description: Doko-Uyanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: uzn
+Description: Northern Uzbek
+Added: 2009-07-29
+Macrolanguage: uz
+%%
+Type: language
+Subtag: uzs
+Description: Southern Uzbek
+Added: 2009-07-29
+Macrolanguage: uz
+%%
+Type: language
+Subtag: vaa
+Description: Vaagri Booli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vae
+Description: Vale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vaf
+Description: Vafsi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vag
+Description: Vagla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vah
+Description: Varhadi-Nagpuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vai
+Description: Vai
+Added: 2005-10-16
+%%
+Type: language
+Subtag: vaj
+Description: Vasekela Bushman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: val
+Description: Vehes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vam
+Description: Vanimo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: van
+Description: Valman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vao
+Description: Vao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vap
+Description: Vaiphei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: var
+Description: Huarijio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vas
+Description: Vasavi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vau
+Description: Vanuma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vav
+Description: Varli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vay
+Description: Wayu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vbb
+Description: Southeast Babar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vbk
+Description: Southwestern Bontok
+Added: 2010-03-11
+Macrolanguage: bnc
+%%
+Type: language
+Subtag: vec
+Description: Venetian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ved
+Description: Veddah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vel
+Description: Veluws
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vem
+Description: Vemgo-Mabas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: veo
+Description: Ventureño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vep
+Description: Veps
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ver
+Description: Mom Jango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vgr
+Description: Vaghri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vgt
+Description: Vlaamse Gebarentaal
+Description: Flemish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vic
+Description: Virgin Islands Creole English
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vid
+Description: Vidunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vif
+Description: Vili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vig
+Description: Viemo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vil
+Description: Vilela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vin
+Description: Vinza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vis
+Description: Vishavan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vit
+Description: Viti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: viv
+Description: Iduna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vka
+Description: Kariyarra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vki
+Description: Ija-Zuba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vkj
+Description: Kujarge
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vkk
+Description: Kaur
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: vkl
+Description: Kulisusu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vkm
+Description: Kamakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vko
+Description: Kodeoha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vkp
+Description: Korlai Creole Portuguese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vkt
+Description: Tenggarong Kutai Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: vku
+Description: Kurrama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vlp
+Description: Valpei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vls
+Description: Vlaams
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vma
+Description: Martuyhunira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmb
+Description: Mbabaram
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmc
+Description: Juxtlahuaca Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmd
+Description: Mudu Koraga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vme
+Description: East Masela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmf
+Description: Mainfränkisch
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmg
+Description: Minigir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmh
+Description: Maraghei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmi
+Description: Miwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmj
+Description: Ixtayutla Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmk
+Description: Makhuwa-Shirima
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vml
+Description: Malgana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmm
+Description: Mitlatongo Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmp
+Description: Soyaltepec Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmq
+Description: Soyaltepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmr
+Description: Marenje
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vms
+Description: Moksela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmu
+Description: Muluridyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmv
+Description: Valley Maidu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmw
+Description: Makhuwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmx
+Description: Tamazola Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmy
+Description: Ayautla Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vmz
+Description: Mazatlán Mazatec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vnk
+Description: Vano
+Description: Lovono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vnm
+Description: Vinmavis
+Description: Neve'ei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vnp
+Description: Vunapu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vor
+Description: Voro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vot
+Description: Votic
+Added: 2005-10-16
+%%
+Type: language
+Subtag: vra
+Description: Vera'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vro
+Description: Võro
+Added: 2009-07-29
+Macrolanguage: et
+%%
+Type: language
+Subtag: vrs
+Description: Varisi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vrt
+Description: Burmbar
+Description: Banam Bay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vsi
+Description: Moldova Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vsl
+Description: Venezuelan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vsv
+Description: Valencian Sign Language
+Description: Llengua de signes valenciana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vto
+Description: Vitou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vum
+Description: Vumbu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vun
+Description: Vunjo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vut
+Description: Vute
+Added: 2009-07-29
+%%
+Type: language
+Subtag: vwa
+Description: Awa (China)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: waa
+Description: Walla Walla
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wab
+Description: Wab
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wac
+Description: Wasco-Wishram
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wad
+Description: Wandamen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wae
+Description: Walser
+Added: 2009-07-29
+%%
+Type: language
+Subtag: waf
+Description: Wakoná
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wag
+Description: Wa'ema
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wah
+Description: Watubela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wai
+Description: Wares
+Added: 2009-07-29
+%%
+Type: language
+Subtag: waj
+Description: Waffa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wak
+Description: Wakashan languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: wal
+Description: Wolaytta
+Description: Wolaitta
+Added: 2005-10-16
+%%
+Type: language
+Subtag: wam
+Description: Wampanoag
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wan
+Description: Wan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wao
+Description: Wappo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wap
+Description: Wapishana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: waq
+Description: Wageman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: war
+Description: Waray (Philippines)
+Added: 2005-10-16
+%%
+Type: language
+Subtag: was
+Description: Washo
+Added: 2005-10-16
+%%
+Type: language
+Subtag: wat
+Description: Kaninuwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wau
+Description: Waurá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wav
+Description: Waka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: waw
+Description: Waiwai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wax
+Description: Watam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: way
+Description: Wayana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: waz
+Description: Wampur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wba
+Description: Warao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbb
+Description: Wabo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbe
+Description: Waritai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbf
+Description: Wara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbh
+Description: Wanda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbi
+Description: Vwanji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbj
+Description: Alagwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbk
+Description: Waigali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbl
+Description: Wakhi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbm
+Description: Wa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbp
+Description: Warlpiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbq
+Description: Waddar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbr
+Description: Wagdi
+Added: 2009-07-29
+Macrolanguage: raj
+%%
+Type: language
+Subtag: wbt
+Description: Wanman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbv
+Description: Wajarri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wbw
+Description: Woi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wca
+Description: Yanomámi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wci
+Description: Waci Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wdd
+Description: Wandji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wdg
+Description: Wadaginam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wdj
+Description: Wadjiginy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wdu
+Description: Wadjigu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wea
+Description: Wewaw
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wec
+Description: Wè Western
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wed
+Description: Wedau
+Added: 2009-07-29
+%%
+Type: language
+Subtag: weh
+Description: Weh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wei
+Description: Kiunum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wem
+Description: Weme Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wen
+Description: Sorbian languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: weo
+Description: Wemale
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wep
+Description: Westphalien
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wer
+Description: Weri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wes
+Description: Cameroon Pidgin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wet
+Description: Perai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: weu
+Description: Rawngtu Chin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wew
+Description: Wejewa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wfg
+Description: Yafi
+Description: Zorop
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wga
+Description: Wagaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wgb
+Description: Wagawaga
+Added: 2010-03-11
+%%
+Type: language
+Subtag: wgg
+Description: Wangganguru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wgi
+Description: Wahgi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wgo
+Description: Waigeo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wgu
+Description: Wirangu
+Added: 2012-08-12
+%%
+Type: language
+Subtag: wgw
+Description: Wagawaga
+Added: 2009-07-29
+Deprecated: 2010-03-11
+Comments: see wgb, ylb
+%%
+Type: language
+Subtag: wgy
+Description: Warrgamay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wha
+Description: Manusela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: whg
+Description: North Wahgi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: whk
+Description: Wahau Kenyah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: whu
+Description: Wahau Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wib
+Description: Southern Toussian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wic
+Description: Wichita
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wie
+Description: Wik-Epa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wif
+Description: Wik-Keyangan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wig
+Description: Wik-Ngathana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wih
+Description: Wik-Me'anha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wii
+Description: Minidien
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wij
+Description: Wik-Iiyanh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wik
+Description: Wikalkan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wil
+Description: Wilawila
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wim
+Description: Wik-Mungkan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: win
+Description: Ho-Chunk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wir
+Description: Wiraféd
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wit
+Description: Wintu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wiu
+Description: Wiru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wiv
+Description: Vitu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wiw
+Description: Wirangu
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see nwo, wgu
+%%
+Type: language
+Subtag: wiy
+Description: Wiyot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wja
+Description: Waja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wji
+Description: Warji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wka
+Description: Kw'adza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wkb
+Description: Kumbaran
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wkd
+Description: Wakde
+Description: Mo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wkl
+Description: Kalanadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wku
+Description: Kunduvadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wkw
+Description: Wakawaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wla
+Description: Walio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlc
+Description: Mwali Comorian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wle
+Description: Wolane
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlg
+Description: Kunbarlang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wli
+Description: Waioli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlk
+Description: Wailaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wll
+Description: Wali (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlm
+Description: Middle Welsh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlo
+Description: Wolio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlr
+Description: Wailapa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wls
+Description: Wallisian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlu
+Description: Wuliwuli
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlv
+Description: Wichí Lhamtés Vejoz
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlw
+Description: Walak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wlx
+Description: Wali (Ghana)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wly
+Description: Waling
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wma
+Description: Mawa (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmb
+Description: Wambaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmc
+Description: Wamas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmd
+Description: Mamaindé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wme
+Description: Wambule
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmh
+Description: Waima'a
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmi
+Description: Wamin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmm
+Description: Maiwa (Indonesia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmn
+Description: Waamwang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmo
+Description: Wom (Papua New Guinea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wms
+Description: Wambon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmt
+Description: Walmajarri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmw
+Description: Mwani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wmx
+Description: Womo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnb
+Description: Wanambre
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnc
+Description: Wantoat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnd
+Description: Wandarang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wne
+Description: Waneci
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wng
+Description: Wanggom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wni
+Description: Ndzwani Comorian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnk
+Description: Wanukaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnm
+Description: Wanggamala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wno
+Description: Wano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnp
+Description: Wanap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wnu
+Description: Usan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wny
+Description: Wanyi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: woa
+Description: Tyaraity
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wob
+Description: Wè Northern
+Added: 2009-07-29
+%%
+Type: language
+Subtag: woc
+Description: Wogeo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wod
+Description: Wolani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: woe
+Description: Woleaian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wof
+Description: Gambian Wolof
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wog
+Description: Wogamusin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: woi
+Description: Kamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wok
+Description: Longto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wom
+Description: Wom (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: won
+Description: Wongo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: woo
+Description: Manombai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wor
+Description: Woria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wos
+Description: Hanga Hundi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wow
+Description: Wawonii
+Added: 2009-07-29
+%%
+Type: language
+Subtag: woy
+Description: Weyto
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wpc
+Description: Maco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wra
+Description: Warapu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrb
+Description: Warluwara
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrd
+Description: Warduji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrg
+Description: Warungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrh
+Description: Wiradhuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wri
+Description: Wariyangga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrk
+Description: Garrwa
+Added: 2012-08-12
+%%
+Type: language
+Subtag: wrl
+Description: Warlmanpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrm
+Description: Warumungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrn
+Description: Warnang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wro
+Description: Worrorra
+Added: 2012-08-12
+%%
+Type: language
+Subtag: wrp
+Description: Waropen
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrr
+Description: Wardaman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrs
+Description: Waris
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wru
+Description: Waru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrv
+Description: Waruna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrw
+Description: Gugu Warra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wrx
+Description: Wae Rana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wry
+Description: Merwari
+Added: 2009-07-29
+Macrolanguage: mwr
+%%
+Type: language
+Subtag: wrz
+Description: Waray (Australia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wsa
+Description: Warembori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wsi
+Description: Wusi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wsk
+Description: Waskia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wsr
+Description: Owenia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wss
+Description: Wasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wsu
+Description: Wasu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wsv
+Description: Wotapuri-Katarqalai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wtf
+Description: Watiwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wti
+Description: Berta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wtk
+Description: Watakataui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wtm
+Description: Mewati
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wtw
+Description: Wotu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wua
+Description: Wikngenchera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wub
+Description: Wunambal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wud
+Description: Wudu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wuh
+Description: Wutunhua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wul
+Description: Silimo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wum
+Description: Wumbvu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wun
+Description: Bungu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wur
+Description: Wurrugu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wut
+Description: Wutung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wuu
+Description: Wu Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: wuv
+Description: Wuvulu-Aua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wux
+Description: Wulna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wuy
+Description: Wauyai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wwa
+Description: Waama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wwb
+Description: Wakabunga
+Added: 2012-08-12
+%%
+Type: language
+Subtag: wwo
+Description: Wetamut
+Description: Dorig
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wwr
+Description: Warrwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: www
+Description: Wawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wxa
+Description: Waxianghua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wya
+Description: Wyandot
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wyb
+Description: Wangaaybuwan-Ngiyambaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wym
+Description: Wymysorys
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wyr
+Description: Wayoró
+Added: 2009-07-29
+%%
+Type: language
+Subtag: wyy
+Description: Western Fijian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xaa
+Description: Andalusian Arabic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xab
+Description: Sambe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xac
+Description: Kachari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xad
+Description: Adai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xae
+Description: Aequian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xag
+Description: Aghwan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xai
+Description: Kaimbé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xal
+Description: Kalmyk
+Description: Oirat
+Added: 2005-10-16
+%%
+Type: language
+Subtag: xam
+Description: /Xam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xan
+Description: Xamtanga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xao
+Description: Khao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xap
+Description: Apalachee
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xaq
+Description: Aquitanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xar
+Description: Karami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xas
+Description: Kamas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xat
+Description: Katawixi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xau
+Description: Kauwera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xav
+Description: Xavánte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xaw
+Description: Kawaiisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xay
+Description: Kayan Mahakam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xba
+Description: Kamba (Brazil)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbb
+Description: Lower Burdekin
+Added: 2010-03-11
+%%
+Type: language
+Subtag: xbc
+Description: Bactrian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbi
+Description: Kombio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbm
+Description: Middle Breton
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbn
+Description: Kenaboi
+Added: 2010-03-11
+%%
+Type: language
+Subtag: xbo
+Description: Bolgarian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbr
+Description: Kambera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbw
+Description: Kambiwá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xbx
+Description: Kabixí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcb
+Description: Cumbric
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcc
+Description: Camunic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xce
+Description: Celtiberian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcg
+Description: Cisalpine Gaulish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xch
+Description: Chemakum
+Description: Chimakum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcl
+Description: Classical Armenian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcm
+Description: Comecrudo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcn
+Description: Cotoname
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xco
+Description: Chorasmian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcr
+Description: Carian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xct
+Description: Classical Tibetan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcu
+Description: Curonian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcv
+Description: Chuvantsy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcw
+Description: Coahuilteco
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xcy
+Description: Cayuse
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xdc
+Description: Dacian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xdm
+Description: Edomite
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xdy
+Description: Malayic Dayak
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xeb
+Description: Eblan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xed
+Description: Hdi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xeg
+Description: //Xegwi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xel
+Description: Kelo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xem
+Description: Kembayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xep
+Description: Epi-Olmec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xer
+Description: Xerénte
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xes
+Description: Kesawai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xet
+Description: Xetá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xeu
+Description: Keoru-Ahia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xfa
+Description: Faliscan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xga
+Description: Galatian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xgb
+Description: Gbin
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xgf
+Description: Gabrielino-Fernandeño
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xgl
+Description: Galindan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xgn
+Description: Mongolian languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: xgr
+Description: Garza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xgu
+Description: Unggumi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xha
+Description: Harami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xhc
+Description: Hunnic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xhd
+Description: Hadrami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xhe
+Description: Khetrani
+Added: 2009-07-29
+Macrolanguage: lah
+%%
+Type: language
+Subtag: xhr
+Description: Hernican
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xht
+Description: Hattic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xhu
+Description: Hurrian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xhv
+Description: Khua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xia
+Description: Xiandao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xib
+Description: Iberian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xii
+Description: Xiri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xil
+Description: Illyrian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xin
+Description: Xinca
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xip
+Description: Xipináwa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xir
+Description: Xiriâna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xiv
+Description: Indus Valley Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xiy
+Description: Xipaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xka
+Description: Kalkoti
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkb
+Description: Northern Nago
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkc
+Description: Kho'ini
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkd
+Description: Mendalam Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xke
+Description: Kereho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkf
+Description: Khengkha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkg
+Description: Kagoro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkh
+Description: Karahawyana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xki
+Description: Kenyan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkj
+Description: Kajali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkk
+Description: Kaco'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkl
+Description: Mainstream Kenyah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkn
+Description: Kayan River Kayan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xko
+Description: Kiorr
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkp
+Description: Kabatei
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkq
+Description: Koroni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkr
+Description: Xakriabá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xks
+Description: Kumbewaha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkt
+Description: Kantosi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xku
+Description: Kaamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkv
+Description: Kgalagadi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkw
+Description: Kembra
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkx
+Description: Karore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xky
+Description: Uma' Lasan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xkz
+Description: Kurtokha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xla
+Description: Kamula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xlb
+Description: Loup B
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xlc
+Description: Lycian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xld
+Description: Lydian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xle
+Description: Lemnian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xlg
+Description: Ligurian (Ancient)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xli
+Description: Liburnian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xln
+Description: Alanic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xlo
+Description: Loup A
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xlp
+Description: Lepontic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xls
+Description: Lusitanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xlu
+Description: Cuneiform Luwian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xly
+Description: Elymian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xma
+Description: Mushungulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmb
+Description: Mbonga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmc
+Description: Makhuwa-Marrevone
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmd
+Description: Mbudum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xme
+Description: Median
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmf
+Description: Mingrelian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmg
+Description: Mengaka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmh
+Description: Kuku-Muminh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmj
+Description: Majera
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmk
+Description: Ancient Macedonian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xml
+Description: Malaysian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmm
+Description: Manado Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: xmn
+Description: Manichaean Middle Persian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmo
+Description: Morerebi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmp
+Description: Kuku-Mu'inh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmq
+Description: Kuku-Mangk
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmr
+Description: Meroitic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xms
+Description: Moroccan Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmt
+Description: Matbat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmu
+Description: Kamu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmv
+Description: Antankarana Malagasy
+Description: Tankarana Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: xmw
+Description: Tsimihety Malagasy
+Added: 2009-07-29
+Macrolanguage: mg
+%%
+Type: language
+Subtag: xmx
+Description: Maden
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmy
+Description: Mayaguduna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xmz
+Description: Mori Bawah
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xna
+Description: Ancient North Arabian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xnb
+Description: Kanakanabu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xnd
+Description: Na-Dene languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: xng
+Description: Middle Mongolian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xnh
+Description: Kuanhua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xnn
+Description: Northern Kankanay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xno
+Description: Anglo-Norman
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xnr
+Description: Kangri
+Added: 2009-07-29
+Macrolanguage: doi
+%%
+Type: language
+Subtag: xns
+Description: Kanashi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xnt
+Description: Narragansett
+Added: 2010-03-11
+%%
+Type: language
+Subtag: xnz
+Description: Kenzi
+Description: Mattoki
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xoc
+Description: O'chi'chi'
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xod
+Description: Kokoda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xog
+Description: Soga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xoi
+Description: Kominimung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xok
+Description: Xokleng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xom
+Description: Komo (Sudan)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xon
+Description: Konkomba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xoo
+Description: Xukurú
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xop
+Description: Kopar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xor
+Description: Korubo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xow
+Description: Kowaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpc
+Description: Pecheneg
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpe
+Description: Liberia Kpelle
+Added: 2009-07-29
+Macrolanguage: kpe
+%%
+Type: language
+Subtag: xpg
+Description: Phrygian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpi
+Description: Pictish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpj
+Description: Mpalitjanh
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xpk
+Description: Kulina Pano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpm
+Description: Pumpokol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpn
+Description: Kapinawá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpo
+Description: Pochutec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpp
+Description: Puyo-Paekche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpq
+Description: Mohegan-Pequot
+Added: 2010-03-11
+%%
+Type: language
+Subtag: xpr
+Description: Parthian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xps
+Description: Pisidian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpu
+Description: Punic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xpy
+Description: Puyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xqa
+Description: Karakhanid
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xqt
+Description: Qatabanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xra
+Description: Krahô
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xrb
+Description: Eastern Karaboro
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xre
+Description: Kreye
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xri
+Description: Krikati-Timbira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xrm
+Description: Armazic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xrn
+Description: Arin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xrr
+Description: Raetic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xrt
+Description: Aranama-Tamique
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xru
+Description: Marriammu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xrw
+Description: Karawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsa
+Description: Sabaean
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsb
+Description: Sambal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsc
+Description: Scythian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsd
+Description: Sidetic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xse
+Description: Sempan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsh
+Description: Shamang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsi
+Description: Sio
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsj
+Description: Subi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsl
+Description: South Slavey
+Added: 2009-07-29
+Macrolanguage: den
+%%
+Type: language
+Subtag: xsm
+Description: Kasem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsn
+Description: Sanga (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xso
+Description: Solano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsp
+Description: Silopi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsq
+Description: Makhuwa-Saka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsr
+Description: Sherpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xss
+Description: Assan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsu
+Description: Sanumá
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsv
+Description: Sudovian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xsy
+Description: Saisiyat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xta
+Description: Alcozauca Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtb
+Description: Chazumba Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtc
+Description: Katcha-Kadugli-Miri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtd
+Description: Diuxi-Tilantongo Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xte
+Description: Ketengban
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtg
+Description: Transalpine Gaulish
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xti
+Description: Sinicahua Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtj
+Description: San Juan Teita Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtl
+Description: Tijaltepec Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtm
+Description: Magdalena Peñasco Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtn
+Description: Northern Tlaxiaco Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xto
+Description: Tokharian A
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtp
+Description: San Miguel Piedras Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtq
+Description: Tumshuqese
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtr
+Description: Early Tripuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xts
+Description: Sindihui Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtt
+Description: Tacahua Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtu
+Description: Cuyamecalco Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtw
+Description: Tawandê
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xty
+Description: Yoloxochitl Mixtec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xtz
+Description: Tasmanian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xua
+Description: Alu Kurumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xub
+Description: Betta Kurumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xud
+Description: Umiida
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xug
+Description: Kunigami
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xuj
+Description: Jennu Kurumba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xum
+Description: Umbrian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xun
+Description: Unggarranggu
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xuo
+Description: Kuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xup
+Description: Upper Umpqua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xur
+Description: Urartian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xut
+Description: Kuthant
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xuu
+Description: Kxoe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xve
+Description: Venetic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xvi
+Description: Kamviri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xvn
+Description: Vandalic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xvo
+Description: Volscian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xvs
+Description: Vestinian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwa
+Description: Kwaza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwc
+Description: Woccon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwe
+Description: Xwela Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwg
+Description: Kwegu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwl
+Description: Western Xwla Gbe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwo
+Description: Written Oirat
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xwr
+Description: Kwerba Mamberamo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xxb
+Description: Boro (Ghana)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xxk
+Description: Ke'o
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xxr
+Description: Koropó
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xxt
+Description: Tambora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xyl
+Description: Yalakalore
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xyy
+Description: Yorta Yorta
+Added: 2012-08-12
+%%
+Type: language
+Subtag: xzh
+Description: Zhang-Zhung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xzm
+Description: Zemgalian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: xzp
+Description: Ancient Zapotec
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yaa
+Description: Yaminahua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yab
+Description: Yuhup
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yac
+Description: Pass Valley Yali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yad
+Description: Yagua
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yae
+Description: Pumé
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yaf
+Description: Yaka (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yag
+Description: Yámana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yah
+Description: Yazgulyam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yai
+Description: Yagnobi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yaj
+Description: Banda-Yangere
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yak
+Description: Yakama
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yal
+Description: Yalunka
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yam
+Description: Yamba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yan
+Description: Mayangna
+Added: 2010-03-11
+%%
+Type: language
+Subtag: yao
+Description: Yao
+Added: 2005-10-16
+%%
+Type: language
+Subtag: yap
+Description: Yapese
+Added: 2005-10-16
+%%
+Type: language
+Subtag: yaq
+Description: Yaqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yar
+Description: Yabarana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yas
+Description: Nugunu (Cameroon)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yat
+Description: Yambeta
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yau
+Description: Yuwana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yav
+Description: Yangben
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yaw
+Description: Yawalapití
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yax
+Description: Yauma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yay
+Description: Agwagwune
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yaz
+Description: Lokaa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yba
+Description: Yala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybb
+Description: Yemba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybd
+Description: Yangbye
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: rki
+%%
+Type: language
+Subtag: ybe
+Description: West Yugur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybh
+Description: Yakha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybi
+Description: Yamphu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybj
+Description: Hasha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybk
+Description: Bokha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybl
+Description: Yukuben
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybm
+Description: Yaben
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybn
+Description: Yabaâna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybo
+Description: Yabong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ybx
+Description: Yawiyo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yby
+Description: Yaweyuha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ych
+Description: Chesu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ycl
+Description: Lolopo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ycn
+Description: Yucuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ycp
+Description: Chepya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ydd
+Description: Eastern Yiddish
+Added: 2009-07-29
+Macrolanguage: yi
+%%
+Type: language
+Subtag: yde
+Description: Yangum Dey
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ydg
+Description: Yidgha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ydk
+Description: Yoidik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yds
+Description: Yiddish Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yea
+Description: Ravula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yec
+Description: Yeniche
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yee
+Description: Yimas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yei
+Description: Yeni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yej
+Description: Yevanic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yel
+Description: Yela
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yen
+Description: Yendang
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Comments: see ynq, yot
+%%
+Type: language
+Subtag: yer
+Description: Tarok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yes
+Description: Nyankpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yet
+Description: Yetfa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yeu
+Description: Yerukula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yev
+Description: Yapunda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yey
+Description: Yeyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yga
+Description: Malyangapa
+Added: 2012-08-12
+%%
+Type: language
+Subtag: ygl
+Description: Yangum Gel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ygm
+Description: Yagomi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ygp
+Description: Gepo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ygr
+Description: Yagaria
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ygw
+Description: Yagwoia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yha
+Description: Baha Buyang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yhd
+Description: Judeo-Iraqi Arabic
+Added: 2009-07-29
+Macrolanguage: jrb
+%%
+Type: language
+Subtag: yhl
+Description: Hlepho Phowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yia
+Description: Yinggarda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yif
+Description: Ache
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yig
+Description: Wusa Nasu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yih
+Description: Western Yiddish
+Added: 2009-07-29
+Macrolanguage: yi
+%%
+Type: language
+Subtag: yii
+Description: Yidiny
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yij
+Description: Yindjibarndi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yik
+Description: Dongshanba Lalo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yil
+Description: Yindjilandji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yim
+Description: Yimchungru Naga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yin
+Description: Yinchia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yip
+Description: Pholo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yiq
+Description: Miqie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yir
+Description: North Awyu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yis
+Description: Yis
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yit
+Description: Eastern Lalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yiu
+Description: Awu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yiv
+Description: Northern Nisu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yix
+Description: Axi Yi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yiy
+Description: Yir Yoront
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yiz
+Description: Azhe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yka
+Description: Yakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykg
+Description: Northern Yukaghir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yki
+Description: Yoke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykk
+Description: Yakaikeke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykl
+Description: Khlula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykm
+Description: Kap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykn
+Description: Kua-nsi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: yko
+Description: Yasa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykr
+Description: Yekora
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ykt
+Description: Kathu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yku
+Description: Kuamasi
+Added: 2012-08-12
+%%
+Type: language
+Subtag: yky
+Description: Yakoma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yla
+Description: Yaul
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ylb
+Description: Yaleba
+Added: 2010-03-11
+%%
+Type: language
+Subtag: yle
+Description: Yele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ylg
+Description: Yelogu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yli
+Description: Angguruk Yali
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yll
+Description: Yil
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ylm
+Description: Limi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yln
+Description: Langnian Buyang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ylo
+Description: Naluo Yi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ylr
+Description: Yalarnnga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ylu
+Description: Aribwaung
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yly
+Description: Nyâlayu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yma
+Description: Yamphe
+Added: 2009-07-29
+Deprecated: 2012-08-12
+Preferred-Value: lrr
+%%
+Type: language
+Subtag: ymb
+Description: Yambes
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymc
+Description: Southern Muji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymd
+Description: Muda
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yme
+Description: Yameo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymg
+Description: Yamongeri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymh
+Description: Mili
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymi
+Description: Moji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymk
+Description: Makwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yml
+Description: Iamalele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymm
+Description: Maay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymn
+Description: Yamna
+Description: Sunum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymo
+Description: Yangum Mon
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymp
+Description: Yamap
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymq
+Description: Qila Muji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymr
+Description: Malasar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yms
+Description: Mysian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymt
+Description: Mator-Taygi-Karagas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymx
+Description: Northern Muji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ymz
+Description: Muzi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yna
+Description: Aluo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynd
+Description: Yandruwandha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yne
+Description: Lang'e
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yng
+Description: Yango
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynh
+Description: Yangho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynk
+Description: Naukan Yupik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynl
+Description: Yangulam
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynn
+Description: Yana
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yno
+Description: Yong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynq
+Description: Yendang
+Added: 2012-08-12
+%%
+Type: language
+Subtag: yns
+Description: Yansi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ynu
+Description: Yahuna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yob
+Description: Yoba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yog
+Description: Yogad
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yoi
+Description: Yonaguni
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yok
+Description: Yokuts
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yol
+Description: Yola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yom
+Description: Yombe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yon
+Description: Yongkom
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yos
+Description: Yos
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yot
+Description: Yotti
+Added: 2012-08-12
+%%
+Type: language
+Subtag: yox
+Description: Yoron
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yoy
+Description: Yoy
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypa
+Description: Phala
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypb
+Description: Labo Phowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypg
+Description: Phola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yph
+Description: Phupha
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypk
+Description: Yupik languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: ypm
+Description: Phuma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypn
+Description: Ani Phowa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypo
+Description: Alo Phola
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypp
+Description: Phupa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ypz
+Description: Phuza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yra
+Description: Yerakai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yrb
+Description: Yareba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yre
+Description: Yaouré
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yri
+Description: Yarí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yrk
+Description: Nenets
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yrl
+Description: Nhengatu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yrn
+Description: Yerong
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yrs
+Description: Yarsun
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yrw
+Description: Yarawata
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysc
+Description: Yassic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysd
+Description: Samatao
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysg
+Description: Sonaga
+Added: 2012-08-12
+%%
+Type: language
+Subtag: ysl
+Description: Yugoslavian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysn
+Description: Sani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yso
+Description: Nisi (China)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysp
+Description: Southern Lolopo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysr
+Description: Sirenik Yupik
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yss
+Description: Yessan-Mayo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ysy
+Description: Sanie
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yta
+Description: Talu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ytl
+Description: Tanglang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ytp
+Description: Thopho
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ytw
+Description: Yout Wam
+Added: 2010-03-11
+%%
+Type: language
+Subtag: yua
+Description: Yucateco
+Description: Yucatec Maya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yub
+Description: Yugambal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuc
+Description: Yuchi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yud
+Description: Judeo-Tripolitanian Arabic
+Added: 2009-07-29
+Macrolanguage: jrb
+%%
+Type: language
+Subtag: yue
+Description: Yue Chinese
+Added: 2009-07-29
+Macrolanguage: zh
+%%
+Type: language
+Subtag: yuf
+Description: Havasupai-Walapai-Yavapai
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yug
+Description: Yug
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yui
+Description: Yurutí
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuj
+Description: Karkar-Yuri
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuk
+Description: Yuki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yul
+Description: Yulu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yum
+Description: Quechan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yun
+Description: Bena (Nigeria)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yup
+Description: Yukpa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuq
+Description: Yuqui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yur
+Description: Yurok
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yut
+Description: Yopno
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuu
+Description: Yugh
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuw
+Description: Yau (Morobe Province)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yux
+Description: Southern Yukaghir
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuy
+Description: East Yugur
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yuz
+Description: Yuracare
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yva
+Description: Yawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yvt
+Description: Yavitero
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywa
+Description: Kalou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywl
+Description: Western Lalu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywn
+Description: Yawanawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywq
+Description: Wuding-Luquan Yi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywr
+Description: Yawuru
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywt
+Description: Xishanba Lalo
+Description: Central Lalo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ywu
+Description: Wumeng Nasu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yww
+Description: Yawarawarga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yxg
+Description: Yagara
+Added: 2012-08-12
+%%
+Type: language
+Subtag: yxy
+Description: Yabula Yabula
+Added: 2012-08-12
+%%
+Type: language
+Subtag: yyu
+Description: Yau (Sandaun Province)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yyz
+Description: Ayizi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yzg
+Description: E'ma Buyang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: yzk
+Description: Zokhuo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zaa
+Description: Sierra de Juárez Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zab
+Description: San Juan Guelavía Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zac
+Description: Ocotlán Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zad
+Description: Cajonos Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zae
+Description: Yareni Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zaf
+Description: Ayoquesco Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zag
+Description: Zaghawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zah
+Description: Zangwal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zai
+Description: Isthmus Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zaj
+Description: Zaramo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zak
+Description: Zanaki
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zal
+Description: Zauzou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zam
+Description: Miahuatlán Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zao
+Description: Ozolotepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zap
+Description: Zapotec
+Added: 2005-10-16
+Scope: macrolanguage
+%%
+Type: language
+Subtag: zaq
+Description: Aloápam Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zar
+Description: Rincón Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zas
+Description: Santo Domingo Albarradas Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zat
+Description: Tabaa Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zau
+Description: Zangskari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zav
+Description: Yatzachi Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zaw
+Description: Mitla Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zax
+Description: Xadani Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zay
+Description: Zayse-Zergulla
+Description: Zaysete
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zaz
+Description: Zari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zbc
+Description: Central Berawan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zbe
+Description: East Berawan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zbl
+Description: Blissymbols
+Description: Bliss
+Description: Blissymbolics
+Added: 2007-08-21
+Suppress-Script: Blis
+%%
+Type: language
+Subtag: zbt
+Description: Batui
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zbw
+Description: West Berawan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zca
+Description: Coatecas Altas Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zch
+Description: Central Hongshuihe Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zdj
+Description: Ngazidja Comorian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zea
+Description: Zeeuws
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zeg
+Description: Zenag
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zeh
+Description: Eastern Hongshuihe Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zen
+Description: Zenaga
+Added: 2005-10-16
+%%
+Type: language
+Subtag: zga
+Description: Kinga
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zgb
+Description: Guibei Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zgm
+Description: Minz Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zgn
+Description: Guibian Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zgr
+Description: Magori
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zhb
+Description: Zhaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zhd
+Description: Dai Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zhi
+Description: Zhire
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zhn
+Description: Nong Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zhw
+Description: Zhoa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zhx
+Description: Chinese (family)
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: zia
+Description: Zia
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zib
+Description: Zimbabwe Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zik
+Description: Zimakani
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zil
+Description: Zialo
+Added: 2011-08-16
+%%
+Type: language
+Subtag: zim
+Description: Mesme
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zin
+Description: Zinza
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zir
+Description: Ziriya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ziw
+Description: Zigula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: ziz
+Description: Zizilivakan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zka
+Description: Kaimbulawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkb
+Description: Koibal
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkd
+Description: Kadu
+Added: 2012-08-12
+%%
+Type: language
+Subtag: zkg
+Description: Koguryo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkh
+Description: Khorezmian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkk
+Description: Karankawa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkn
+Description: Kanan
+Added: 2012-08-12
+%%
+Type: language
+Subtag: zko
+Description: Kott
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkp
+Description: São Paulo Kaingáng
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkr
+Description: Zakhring
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkt
+Description: Kitan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zku
+Description: Kaurna
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkv
+Description: Krevinian
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zkz
+Description: Khazar
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zle
+Description: East Slavic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: zlj
+Description: Liujiang Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zlm
+Description: Malay (individual language)
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: zln
+Description: Lianshan Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zlq
+Description: Liuqian Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zls
+Description: South Slavic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: zlw
+Description: West Slavic languages
+Added: 2009-07-29
+Scope: collection
+%%
+Type: language
+Subtag: zma
+Description: Manda (Australia)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmb
+Description: Zimba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmc
+Description: Margany
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmd
+Description: Maridan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zme
+Description: Mangerr
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmf
+Description: Mfinu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmg
+Description: Marti Ke
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmh
+Description: Makolkol
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmi
+Description: Negeri Sembilan Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: zmj
+Description: Maridjabin
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmk
+Description: Mandandanyi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zml
+Description: Madngele
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmm
+Description: Marimanindji
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmn
+Description: Mbangwe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmo
+Description: Molo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmp
+Description: Mpuono
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmq
+Description: Mituku
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmr
+Description: Maranunggu
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zms
+Description: Mbesa
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmt
+Description: Maringarr
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmu
+Description: Muruwari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmv
+Description: Mbariman-Gudhinma
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmw
+Description: Mbo (Democratic Republic of Congo)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmx
+Description: Bomitaba
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmy
+Description: Mariyedi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zmz
+Description: Mbandja
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zna
+Description: Zan Gula
+Added: 2009-07-29
+%%
+Type: language
+Subtag: znd
+Description: Zande languages
+Added: 2005-10-16
+Scope: collection
+%%
+Type: language
+Subtag: zne
+Description: Zande (individual language)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zng
+Description: Mang
+Added: 2009-07-29
+%%
+Type: language
+Subtag: znk
+Description: Manangkari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zns
+Description: Mangas
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zoc
+Description: Copainalá Zoque
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zoh
+Description: Chimalapa Zoque
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zom
+Description: Zou
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zoo
+Description: Asunción Mixtepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zoq
+Description: Tabasco Zoque
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zor
+Description: Rayón Zoque
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zos
+Description: Francisco León Zoque
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zpa
+Description: Lachiguiri Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpb
+Description: Yautepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpc
+Description: Choapan Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpd
+Description: Southeastern Ixtlán Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpe
+Description: Petapa Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpf
+Description: San Pedro Quiatoni Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpg
+Description: Guevea De Humboldt Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zph
+Description: Totomachapan Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpi
+Description: Santa María Quiegolani Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpj
+Description: Quiavicuzas Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpk
+Description: Tlacolulita Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpl
+Description: Lachixío Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpm
+Description: Mixtepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpn
+Description: Santa Inés Yatzechi Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpo
+Description: Amatlán Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpp
+Description: El Alto Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpq
+Description: Zoogocho Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpr
+Description: Santiago Xanica Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zps
+Description: Coatlán Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpt
+Description: San Vicente Coatlán Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpu
+Description: Yalálag Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpv
+Description: Chichicapan Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpw
+Description: Zaniza Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpx
+Description: San Baltazar Loxicha Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpy
+Description: Mazaltepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zpz
+Description: Texmelucan Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zqe
+Description: Qiubei Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zra
+Description: Kara (Korea)
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zrg
+Description: Mirgan
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zrn
+Description: Zerenkel
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zro
+Description: Záparo
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zrp
+Description: Zarphatic
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zrs
+Description: Mairasi
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zsa
+Description: Sarasira
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zsk
+Description: Kaskean
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zsl
+Description: Zambian Sign Language
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zsm
+Description: Standard Malay
+Added: 2009-07-29
+Macrolanguage: ms
+%%
+Type: language
+Subtag: zsr
+Description: Southern Rincon Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zsu
+Description: Sukurum
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zte
+Description: Elotepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztg
+Description: Xanaguía Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztl
+Description: Lapaguía-Guivini Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztm
+Description: San Agustín Mixtepec Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztn
+Description: Santa Catarina Albarradas Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztp
+Description: Loxicha Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztq
+Description: Quioquitani-Quierí Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zts
+Description: Tilquiapan Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztt
+Description: Tejalapan Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztu
+Description: Güilá Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: ztx
+Description: Zaachila Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zty
+Description: Yatee Zapotec
+Added: 2009-07-29
+Macrolanguage: zap
+%%
+Type: language
+Subtag: zua
+Description: Zeem
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zuh
+Description: Tokano
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zum
+Description: Kumzari
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zun
+Description: Zuni
+Added: 2005-10-16
+%%
+Type: language
+Subtag: zuy
+Description: Zumaya
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zwa
+Description: Zay
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zxx
+Description: No linguistic content
+Description: Not applicable
+Added: 2006-03-08
+Scope: special
+%%
+Type: language
+Subtag: zyb
+Description: Yongbei Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zyg
+Description: Yang Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zyj
+Description: Youjiang Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zyn
+Description: Yongnan Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: language
+Subtag: zyp
+Description: Zyphe
+Added: 2009-07-29
+%%
+Type: language
+Subtag: zza
+Description: Zaza
+Description: Dimili
+Description: Dimli (macrolanguage)
+Description: Kirdki
+Description: Kirmanjki (macrolanguage)
+Description: Zazaki
+Added: 2006-08-24
+Scope: macrolanguage
+%%
+Type: language
+Subtag: zzj
+Description: Zuojiang Zhuang
+Added: 2009-07-29
+Macrolanguage: za
+%%
+Type: extlang
+Subtag: aao
+Description: Algerian Saharan Arabic
+Added: 2009-07-29
+Preferred-Value: aao
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: abh
+Description: Tajiki Arabic
+Added: 2009-07-29
+Preferred-Value: abh
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: abv
+Description: Baharna Arabic
+Added: 2009-07-29
+Preferred-Value: abv
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: acm
+Description: Mesopotamian Arabic
+Added: 2009-07-29
+Preferred-Value: acm
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: acq
+Description: Ta'izzi-Adeni Arabic
+Added: 2009-07-29
+Preferred-Value: acq
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: acw
+Description: Hijazi Arabic
+Added: 2009-07-29
+Preferred-Value: acw
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: acx
+Description: Omani Arabic
+Added: 2009-07-29
+Preferred-Value: acx
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: acy
+Description: Cypriot Arabic
+Added: 2009-07-29
+Preferred-Value: acy
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: adf
+Description: Dhofari Arabic
+Added: 2009-07-29
+Preferred-Value: adf
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ads
+Description: Adamorobe Sign Language
+Added: 2009-07-29
+Preferred-Value: ads
+Prefix: sgn
+%%
+Type: extlang
+Subtag: aeb
+Description: Tunisian Arabic
+Added: 2009-07-29
+Preferred-Value: aeb
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: aec
+Description: Saidi Arabic
+Added: 2009-07-29
+Preferred-Value: aec
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: aed
+Description: Argentine Sign Language
+Added: 2009-07-29
+Preferred-Value: aed
+Prefix: sgn
+%%
+Type: extlang
+Subtag: aen
+Description: Armenian Sign Language
+Added: 2009-07-29
+Preferred-Value: aen
+Prefix: sgn
+%%
+Type: extlang
+Subtag: afb
+Description: Gulf Arabic
+Added: 2009-07-29
+Preferred-Value: afb
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: afg
+Description: Afghan Sign Language
+Added: 2009-07-29
+Preferred-Value: afg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ajp
+Description: South Levantine Arabic
+Added: 2009-07-29
+Preferred-Value: ajp
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: apc
+Description: North Levantine Arabic
+Added: 2009-07-29
+Preferred-Value: apc
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: apd
+Description: Sudanese Arabic
+Added: 2009-07-29
+Preferred-Value: apd
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: arb
+Description: Standard Arabic
+Added: 2009-07-29
+Preferred-Value: arb
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: arq
+Description: Algerian Arabic
+Added: 2009-07-29
+Preferred-Value: arq
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ars
+Description: Najdi Arabic
+Added: 2009-07-29
+Preferred-Value: ars
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ary
+Description: Moroccan Arabic
+Added: 2009-07-29
+Preferred-Value: ary
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: arz
+Description: Egyptian Arabic
+Added: 2009-07-29
+Preferred-Value: arz
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ase
+Description: American Sign Language
+Added: 2009-07-29
+Preferred-Value: ase
+Prefix: sgn
+%%
+Type: extlang
+Subtag: asf
+Description: Australian Sign Language
+Added: 2009-07-29
+Preferred-Value: asf
+Prefix: sgn
+%%
+Type: extlang
+Subtag: asp
+Description: Algerian Sign Language
+Added: 2009-07-29
+Preferred-Value: asp
+Prefix: sgn
+%%
+Type: extlang
+Subtag: asq
+Description: Austrian Sign Language
+Added: 2009-07-29
+Preferred-Value: asq
+Prefix: sgn
+%%
+Type: extlang
+Subtag: asw
+Description: Australian Aborigines Sign Language
+Added: 2009-07-29
+Preferred-Value: asw
+Prefix: sgn
+%%
+Type: extlang
+Subtag: auz
+Description: Uzbeki Arabic
+Added: 2009-07-29
+Preferred-Value: auz
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: avl
+Description: Eastern Egyptian Bedawi Arabic
+Added: 2009-07-29
+Preferred-Value: avl
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ayh
+Description: Hadrami Arabic
+Added: 2009-07-29
+Preferred-Value: ayh
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ayl
+Description: Libyan Arabic
+Added: 2009-07-29
+Preferred-Value: ayl
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ayn
+Description: Sanaani Arabic
+Added: 2009-07-29
+Preferred-Value: ayn
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ayp
+Description: North Mesopotamian Arabic
+Added: 2009-07-29
+Preferred-Value: ayp
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: bbz
+Description: Babalia Creole Arabic
+Added: 2009-07-29
+Preferred-Value: bbz
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: bfi
+Description: British Sign Language
+Added: 2009-07-29
+Preferred-Value: bfi
+Prefix: sgn
+%%
+Type: extlang
+Subtag: bfk
+Description: Ban Khor Sign Language
+Added: 2009-07-29
+Preferred-Value: bfk
+Prefix: sgn
+%%
+Type: extlang
+Subtag: bjn
+Description: Banjar
+Added: 2009-07-29
+Preferred-Value: bjn
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: bog
+Description: Bamako Sign Language
+Added: 2009-07-29
+Preferred-Value: bog
+Prefix: sgn
+%%
+Type: extlang
+Subtag: bqn
+Description: Bulgarian Sign Language
+Added: 2009-07-29
+Preferred-Value: bqn
+Prefix: sgn
+%%
+Type: extlang
+Subtag: bqy
+Description: Bengkala Sign Language
+Added: 2009-07-29
+Preferred-Value: bqy
+Prefix: sgn
+%%
+Type: extlang
+Subtag: btj
+Description: Bacanese Malay
+Added: 2009-07-29
+Preferred-Value: btj
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: bve
+Description: Berau Malay
+Added: 2009-07-29
+Preferred-Value: bve
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: bvl
+Description: Bolivian Sign Language
+Added: 2009-07-29
+Preferred-Value: bvl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: bvu
+Description: Bukit Malay
+Added: 2009-07-29
+Preferred-Value: bvu
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: bzs
+Description: Brazilian Sign Language
+Added: 2009-07-29
+Preferred-Value: bzs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: cdo
+Description: Min Dong Chinese
+Added: 2009-07-29
+Preferred-Value: cdo
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: cds
+Description: Chadian Sign Language
+Added: 2009-07-29
+Preferred-Value: cds
+Prefix: sgn
+%%
+Type: extlang
+Subtag: cjy
+Description: Jinyu Chinese
+Added: 2009-07-29
+Preferred-Value: cjy
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: cmn
+Description: Mandarin Chinese
+Added: 2009-07-29
+Preferred-Value: cmn
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: coa
+Description: Cocos Islands Malay
+Added: 2009-07-29
+Preferred-Value: coa
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: cpx
+Description: Pu-Xian Chinese
+Added: 2009-07-29
+Preferred-Value: cpx
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: csc
+Description: Catalan Sign Language
+Description: Lengua de señas catalana
+Description: Llengua de Signes Catalana
+Added: 2009-07-29
+Preferred-Value: csc
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csd
+Description: Chiangmai Sign Language
+Added: 2009-07-29
+Preferred-Value: csd
+Prefix: sgn
+%%
+Type: extlang
+Subtag: cse
+Description: Czech Sign Language
+Added: 2009-07-29
+Preferred-Value: cse
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csf
+Description: Cuba Sign Language
+Added: 2009-07-29
+Preferred-Value: csf
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csg
+Description: Chilean Sign Language
+Added: 2009-07-29
+Preferred-Value: csg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csl
+Description: Chinese Sign Language
+Added: 2009-07-29
+Preferred-Value: csl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csn
+Description: Colombian Sign Language
+Added: 2009-07-29
+Preferred-Value: csn
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csq
+Description: Croatia Sign Language
+Added: 2009-07-29
+Preferred-Value: csq
+Prefix: sgn
+%%
+Type: extlang
+Subtag: csr
+Description: Costa Rican Sign Language
+Added: 2009-07-29
+Preferred-Value: csr
+Prefix: sgn
+%%
+Type: extlang
+Subtag: czh
+Description: Huizhou Chinese
+Added: 2009-07-29
+Preferred-Value: czh
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: czo
+Description: Min Zhong Chinese
+Added: 2009-07-29
+Preferred-Value: czo
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: doq
+Description: Dominican Sign Language
+Added: 2009-07-29
+Preferred-Value: doq
+Prefix: sgn
+%%
+Type: extlang
+Subtag: dse
+Description: Dutch Sign Language
+Added: 2009-07-29
+Preferred-Value: dse
+Prefix: sgn
+%%
+Type: extlang
+Subtag: dsl
+Description: Danish Sign Language
+Added: 2009-07-29
+Preferred-Value: dsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: dup
+Description: Duano
+Added: 2009-07-29
+Preferred-Value: dup
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: ecs
+Description: Ecuadorian Sign Language
+Added: 2009-07-29
+Preferred-Value: ecs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: esl
+Description: Egypt Sign Language
+Added: 2009-07-29
+Preferred-Value: esl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: esn
+Description: Salvadoran Sign Language
+Added: 2009-07-29
+Preferred-Value: esn
+Prefix: sgn
+%%
+Type: extlang
+Subtag: eso
+Description: Estonian Sign Language
+Added: 2009-07-29
+Preferred-Value: eso
+Prefix: sgn
+%%
+Type: extlang
+Subtag: eth
+Description: Ethiopian Sign Language
+Added: 2009-07-29
+Preferred-Value: eth
+Prefix: sgn
+%%
+Type: extlang
+Subtag: fcs
+Description: Quebec Sign Language
+Added: 2009-07-29
+Preferred-Value: fcs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: fse
+Description: Finnish Sign Language
+Added: 2009-07-29
+Preferred-Value: fse
+Prefix: sgn
+%%
+Type: extlang
+Subtag: fsl
+Description: French Sign Language
+Added: 2009-07-29
+Preferred-Value: fsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: fss
+Description: Finland-Swedish Sign Language
+Description: finlandssvenskt teckenspråk
+Description: suomenruotsalainen viittomakieli
+Added: 2009-07-29
+Preferred-Value: fss
+Prefix: sgn
+%%
+Type: extlang
+Subtag: gan
+Description: Gan Chinese
+Added: 2009-07-29
+Preferred-Value: gan
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: gds
+Description: Ghandruk Sign Language
+Added: 2012-08-12
+Preferred-Value: gds
+Prefix: sgn
+%%
+Type: extlang
+Subtag: gom
+Description: Goan Konkani
+Added: 2009-07-29
+Preferred-Value: gom
+Prefix: kok
+Macrolanguage: kok
+%%
+Type: extlang
+Subtag: gse
+Description: Ghanaian Sign Language
+Added: 2009-07-29
+Preferred-Value: gse
+Prefix: sgn
+%%
+Type: extlang
+Subtag: gsg
+Description: German Sign Language
+Added: 2009-07-29
+Preferred-Value: gsg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: gsm
+Description: Guatemalan Sign Language
+Added: 2009-07-29
+Preferred-Value: gsm
+Prefix: sgn
+%%
+Type: extlang
+Subtag: gss
+Description: Greek Sign Language
+Added: 2009-07-29
+Preferred-Value: gss
+Prefix: sgn
+%%
+Type: extlang
+Subtag: gus
+Description: Guinean Sign Language
+Added: 2009-07-29
+Preferred-Value: gus
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hab
+Description: Hanoi Sign Language
+Added: 2009-07-29
+Preferred-Value: hab
+Prefix: sgn
+%%
+Type: extlang
+Subtag: haf
+Description: Haiphong Sign Language
+Added: 2009-07-29
+Preferred-Value: haf
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hak
+Description: Hakka Chinese
+Added: 2009-07-29
+Preferred-Value: hak
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: hds
+Description: Honduras Sign Language
+Added: 2009-07-29
+Preferred-Value: hds
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hji
+Description: Haji
+Added: 2009-07-29
+Preferred-Value: hji
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: hks
+Description: Hong Kong Sign Language
+Description: Heung Kong Sau Yue
+Added: 2009-07-29
+Preferred-Value: hks
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hos
+Description: Ho Chi Minh City Sign Language
+Added: 2009-07-29
+Preferred-Value: hos
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hps
+Description: Hawai'i Pidgin Sign Language
+Added: 2009-07-29
+Preferred-Value: hps
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hsh
+Description: Hungarian Sign Language
+Added: 2009-07-29
+Preferred-Value: hsh
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hsl
+Description: Hausa Sign Language
+Added: 2009-07-29
+Preferred-Value: hsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: hsn
+Description: Xiang Chinese
+Added: 2009-07-29
+Preferred-Value: hsn
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: icl
+Description: Icelandic Sign Language
+Added: 2009-07-29
+Preferred-Value: icl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ils
+Description: International Sign
+Added: 2009-07-29
+Preferred-Value: ils
+Prefix: sgn
+%%
+Type: extlang
+Subtag: inl
+Description: Indonesian Sign Language
+Added: 2009-07-29
+Preferred-Value: inl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ins
+Description: Indian Sign Language
+Added: 2009-07-29
+Preferred-Value: ins
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ise
+Description: Italian Sign Language
+Added: 2009-07-29
+Preferred-Value: ise
+Prefix: sgn
+%%
+Type: extlang
+Subtag: isg
+Description: Irish Sign Language
+Added: 2009-07-29
+Preferred-Value: isg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: isr
+Description: Israeli Sign Language
+Added: 2009-07-29
+Preferred-Value: isr
+Prefix: sgn
+%%
+Type: extlang
+Subtag: jak
+Description: Jakun
+Added: 2009-07-29
+Preferred-Value: jak
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: jax
+Description: Jambi Malay
+Added: 2009-07-29
+Preferred-Value: jax
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: jcs
+Description: Jamaican Country Sign Language
+Added: 2009-07-29
+Preferred-Value: jcs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: jhs
+Description: Jhankot Sign Language
+Added: 2009-07-29
+Preferred-Value: jhs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: jls
+Description: Jamaican Sign Language
+Added: 2010-03-11
+Preferred-Value: jls
+Prefix: sgn
+%%
+Type: extlang
+Subtag: jos
+Description: Jordanian Sign Language
+Added: 2009-07-29
+Preferred-Value: jos
+Prefix: sgn
+%%
+Type: extlang
+Subtag: jsl
+Description: Japanese Sign Language
+Added: 2009-07-29
+Preferred-Value: jsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: jus
+Description: Jumla Sign Language
+Added: 2009-07-29
+Preferred-Value: jus
+Prefix: sgn
+%%
+Type: extlang
+Subtag: kgi
+Description: Selangor Sign Language
+Added: 2009-07-29
+Preferred-Value: kgi
+Prefix: sgn
+%%
+Type: extlang
+Subtag: knn
+Description: Konkani (individual language)
+Added: 2009-07-29
+Preferred-Value: knn
+Prefix: kok
+Macrolanguage: kok
+%%
+Type: extlang
+Subtag: kvb
+Description: Kubu
+Added: 2009-07-29
+Preferred-Value: kvb
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: kvk
+Description: Korean Sign Language
+Added: 2009-07-29
+Preferred-Value: kvk
+Prefix: sgn
+%%
+Type: extlang
+Subtag: kvr
+Description: Kerinci
+Added: 2009-07-29
+Preferred-Value: kvr
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: kxd
+Description: Brunei
+Added: 2009-07-29
+Preferred-Value: kxd
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: lbs
+Description: Libyan Sign Language
+Added: 2009-07-29
+Preferred-Value: lbs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lce
+Description: Loncong
+Added: 2009-07-29
+Preferred-Value: lce
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: lcf
+Description: Lubu
+Added: 2009-07-29
+Preferred-Value: lcf
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: liw
+Description: Col
+Added: 2009-07-29
+Preferred-Value: liw
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: lls
+Description: Lithuanian Sign Language
+Added: 2009-07-29
+Preferred-Value: lls
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lsg
+Description: Lyons Sign Language
+Added: 2009-07-29
+Preferred-Value: lsg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lsl
+Description: Latvian Sign Language
+Added: 2009-07-29
+Preferred-Value: lsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lso
+Description: Laos Sign Language
+Added: 2009-07-29
+Preferred-Value: lso
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lsp
+Description: Panamanian Sign Language
+Description: Lengua de Señas Panameñas
+Added: 2009-07-29
+Preferred-Value: lsp
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lst
+Description: Trinidad and Tobago Sign Language
+Added: 2009-07-29
+Preferred-Value: lst
+Prefix: sgn
+%%
+Type: extlang
+Subtag: lsy
+Description: Mauritian Sign Language
+Added: 2010-03-11
+Preferred-Value: lsy
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ltg
+Description: Latgalian
+Added: 2010-03-11
+Preferred-Value: ltg
+Prefix: lv
+Macrolanguage: lv
+%%
+Type: extlang
+Subtag: lvs
+Description: Standard Latvian
+Added: 2010-03-11
+Preferred-Value: lvs
+Prefix: lv
+Macrolanguage: lv
+%%
+Type: extlang
+Subtag: lzh
+Description: Literary Chinese
+Added: 2009-07-29
+Preferred-Value: lzh
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: max
+Description: North Moluccan Malay
+Added: 2009-07-29
+Preferred-Value: max
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mdl
+Description: Maltese Sign Language
+Added: 2009-07-29
+Preferred-Value: mdl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: meo
+Description: Kedah Malay
+Added: 2009-07-29
+Preferred-Value: meo
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mfa
+Description: Pattani Malay
+Added: 2009-07-29
+Preferred-Value: mfa
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mfb
+Description: Bangka
+Added: 2009-07-29
+Preferred-Value: mfb
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mfs
+Description: Mexican Sign Language
+Added: 2009-07-29
+Preferred-Value: mfs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: min
+Description: Minangkabau
+Added: 2009-07-29
+Preferred-Value: min
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mnp
+Description: Min Bei Chinese
+Added: 2009-07-29
+Preferred-Value: mnp
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: mqg
+Description: Kota Bangun Kutai Malay
+Added: 2009-07-29
+Preferred-Value: mqg
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mre
+Description: Martha's Vineyard Sign Language
+Added: 2009-07-29
+Preferred-Value: mre
+Prefix: sgn
+%%
+Type: extlang
+Subtag: msd
+Description: Yucatec Maya Sign Language
+Added: 2009-07-29
+Preferred-Value: msd
+Prefix: sgn
+%%
+Type: extlang
+Subtag: msi
+Description: Sabah Malay
+Added: 2009-07-29
+Preferred-Value: msi
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: msr
+Description: Mongolian Sign Language
+Added: 2009-07-29
+Preferred-Value: msr
+Prefix: sgn
+%%
+Type: extlang
+Subtag: mui
+Description: Musi
+Added: 2009-07-29
+Preferred-Value: mui
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: mzc
+Description: Madagascar Sign Language
+Added: 2009-07-29
+Preferred-Value: mzc
+Prefix: sgn
+%%
+Type: extlang
+Subtag: mzg
+Description: Monastic Sign Language
+Added: 2009-07-29
+Preferred-Value: mzg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: mzy
+Description: Mozambican Sign Language
+Added: 2009-07-29
+Preferred-Value: mzy
+Prefix: sgn
+%%
+Type: extlang
+Subtag: nan
+Description: Min Nan Chinese
+Added: 2009-07-29
+Preferred-Value: nan
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: nbs
+Description: Namibian Sign Language
+Added: 2009-07-29
+Preferred-Value: nbs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ncs
+Description: Nicaraguan Sign Language
+Added: 2009-07-29
+Preferred-Value: ncs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: nsi
+Description: Nigerian Sign Language
+Added: 2009-07-29
+Preferred-Value: nsi
+Prefix: sgn
+%%
+Type: extlang
+Subtag: nsl
+Description: Norwegian Sign Language
+Added: 2009-07-29
+Preferred-Value: nsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: nsp
+Description: Nepalese Sign Language
+Added: 2009-07-29
+Preferred-Value: nsp
+Prefix: sgn
+%%
+Type: extlang
+Subtag: nsr
+Description: Maritime Sign Language
+Added: 2009-07-29
+Preferred-Value: nsr
+Prefix: sgn
+%%
+Type: extlang
+Subtag: nzs
+Description: New Zealand Sign Language
+Added: 2009-07-29
+Preferred-Value: nzs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: okl
+Description: Old Kentish Sign Language
+Added: 2009-07-29
+Preferred-Value: okl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: orn
+Description: Orang Kanaq
+Added: 2009-07-29
+Preferred-Value: orn
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: ors
+Description: Orang Seletar
+Added: 2009-07-29
+Preferred-Value: ors
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: pel
+Description: Pekal
+Added: 2009-07-29
+Preferred-Value: pel
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: pga
+Description: Sudanese Creole Arabic
+Added: 2009-07-29
+Preferred-Value: pga
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: pks
+Description: Pakistan Sign Language
+Added: 2009-07-29
+Preferred-Value: pks
+Prefix: sgn
+%%
+Type: extlang
+Subtag: prl
+Description: Peruvian Sign Language
+Added: 2009-07-29
+Preferred-Value: prl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: prz
+Description: Providencia Sign Language
+Added: 2009-07-29
+Preferred-Value: prz
+Prefix: sgn
+%%
+Type: extlang
+Subtag: psc
+Description: Persian Sign Language
+Added: 2009-07-29
+Preferred-Value: psc
+Prefix: sgn
+%%
+Type: extlang
+Subtag: psd
+Description: Plains Indian Sign Language
+Added: 2009-07-29
+Preferred-Value: psd
+Prefix: sgn
+%%
+Type: extlang
+Subtag: pse
+Description: Central Malay
+Added: 2009-07-29
+Preferred-Value: pse
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: psg
+Description: Penang Sign Language
+Added: 2009-07-29
+Preferred-Value: psg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: psl
+Description: Puerto Rican Sign Language
+Added: 2009-07-29
+Preferred-Value: psl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: pso
+Description: Polish Sign Language
+Added: 2009-07-29
+Preferred-Value: pso
+Prefix: sgn
+%%
+Type: extlang
+Subtag: psp
+Description: Philippine Sign Language
+Added: 2009-07-29
+Preferred-Value: psp
+Prefix: sgn
+%%
+Type: extlang
+Subtag: psr
+Description: Portuguese Sign Language
+Added: 2009-07-29
+Preferred-Value: psr
+Prefix: sgn
+%%
+Type: extlang
+Subtag: pys
+Description: Paraguayan Sign Language
+Description: Lengua de Señas del Paraguay
+Added: 2010-03-11
+Preferred-Value: pys
+Prefix: sgn
+%%
+Type: extlang
+Subtag: rms
+Description: Romanian Sign Language
+Added: 2009-07-29
+Preferred-Value: rms
+Prefix: sgn
+%%
+Type: extlang
+Subtag: rsi
+Description: Rennellese Sign Language
+Added: 2009-07-29
+Preferred-Value: rsi
+Prefix: sgn
+%%
+Type: extlang
+Subtag: rsl
+Description: Russian Sign Language
+Added: 2009-07-29
+Preferred-Value: rsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sdl
+Description: Saudi Arabian Sign Language
+Added: 2009-07-29
+Preferred-Value: sdl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sfb
+Description: Langue des signes de Belgique Francophone
+Description: French Belgian Sign Language
+Added: 2009-07-29
+Preferred-Value: sfb
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sfs
+Description: South African Sign Language
+Added: 2009-07-29
+Preferred-Value: sfs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sgg
+Description: Swiss-German Sign Language
+Added: 2009-07-29
+Preferred-Value: sgg
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sgx
+Description: Sierra Leone Sign Language
+Added: 2009-07-29
+Preferred-Value: sgx
+Prefix: sgn
+%%
+Type: extlang
+Subtag: shu
+Description: Chadian Arabic
+Added: 2009-07-29
+Preferred-Value: shu
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: slf
+Description: Swiss-Italian Sign Language
+Added: 2009-07-29
+Preferred-Value: slf
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sls
+Description: Singapore Sign Language
+Added: 2009-07-29
+Preferred-Value: sls
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sqk
+Description: Albanian Sign Language
+Added: 2012-08-12
+Preferred-Value: sqk
+Prefix: sgn
+%%
+Type: extlang
+Subtag: sqs
+Description: Sri Lankan Sign Language
+Added: 2009-07-29
+Preferred-Value: sqs
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ssh
+Description: Shihhi Arabic
+Added: 2009-07-29
+Preferred-Value: ssh
+Prefix: ar
+Macrolanguage: ar
+%%
+Type: extlang
+Subtag: ssp
+Description: Spanish Sign Language
+Added: 2009-07-29
+Preferred-Value: ssp
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ssr
+Description: Swiss-French Sign Language
+Added: 2009-07-29
+Preferred-Value: ssr
+Prefix: sgn
+%%
+Type: extlang
+Subtag: svk
+Description: Slovakian Sign Language
+Added: 2009-07-29
+Preferred-Value: svk
+Prefix: sgn
+%%
+Type: extlang
+Subtag: swc
+Description: Congo Swahili
+Added: 2009-07-29
+Preferred-Value: swc
+Prefix: sw
+Macrolanguage: sw
+%%
+Type: extlang
+Subtag: swh
+Description: Swahili (individual language)
+Description: Kiswahili
+Added: 2009-07-29
+Preferred-Value: swh
+Prefix: sw
+Macrolanguage: sw
+%%
+Type: extlang
+Subtag: swl
+Description: Swedish Sign Language
+Added: 2009-07-29
+Preferred-Value: swl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: syy
+Description: Al-Sayyid Bedouin Sign Language
+Added: 2009-07-29
+Preferred-Value: syy
+Prefix: sgn
+%%
+Type: extlang
+Subtag: tmw
+Description: Temuan
+Added: 2009-07-29
+Preferred-Value: tmw
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: tse
+Description: Tunisian Sign Language
+Added: 2009-07-29
+Preferred-Value: tse
+Prefix: sgn
+%%
+Type: extlang
+Subtag: tsm
+Description: Turkish Sign Language
+Description: Türk İşaret Dili
+Added: 2009-07-29
+Preferred-Value: tsm
+Prefix: sgn
+%%
+Type: extlang
+Subtag: tsq
+Description: Thai Sign Language
+Added: 2009-07-29
+Preferred-Value: tsq
+Prefix: sgn
+%%
+Type: extlang
+Subtag: tss
+Description: Taiwan Sign Language
+Added: 2009-07-29
+Preferred-Value: tss
+Prefix: sgn
+%%
+Type: extlang
+Subtag: tsy
+Description: Tebul Sign Language
+Added: 2009-07-29
+Preferred-Value: tsy
+Prefix: sgn
+%%
+Type: extlang
+Subtag: tza
+Description: Tanzanian Sign Language
+Added: 2009-07-29
+Preferred-Value: tza
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ugn
+Description: Ugandan Sign Language
+Added: 2009-07-29
+Preferred-Value: ugn
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ugy
+Description: Uruguayan Sign Language
+Added: 2009-07-29
+Preferred-Value: ugy
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ukl
+Description: Ukrainian Sign Language
+Added: 2009-07-29
+Preferred-Value: ukl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: uks
+Description: Urubú-Kaapor Sign Language
+Description: Kaapor Sign Language
+Added: 2009-07-29
+Preferred-Value: uks
+Prefix: sgn
+%%
+Type: extlang
+Subtag: urk
+Description: Urak Lawoi'
+Added: 2009-07-29
+Preferred-Value: urk
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: uzn
+Description: Northern Uzbek
+Added: 2009-07-29
+Preferred-Value: uzn
+Prefix: uz
+Macrolanguage: uz
+%%
+Type: extlang
+Subtag: uzs
+Description: Southern Uzbek
+Added: 2009-07-29
+Preferred-Value: uzs
+Prefix: uz
+Macrolanguage: uz
+%%
+Type: extlang
+Subtag: vgt
+Description: Vlaamse Gebarentaal
+Description: Flemish Sign Language
+Added: 2009-07-29
+Preferred-Value: vgt
+Prefix: sgn
+%%
+Type: extlang
+Subtag: vkk
+Description: Kaur
+Added: 2009-07-29
+Preferred-Value: vkk
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: vkt
+Description: Tenggarong Kutai Malay
+Added: 2009-07-29
+Preferred-Value: vkt
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: vsi
+Description: Moldova Sign Language
+Added: 2009-07-29
+Preferred-Value: vsi
+Prefix: sgn
+%%
+Type: extlang
+Subtag: vsl
+Description: Venezuelan Sign Language
+Added: 2009-07-29
+Preferred-Value: vsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: vsv
+Description: Valencian Sign Language
+Description: Llengua de signes valenciana
+Added: 2009-07-29
+Preferred-Value: vsv
+Prefix: sgn
+%%
+Type: extlang
+Subtag: wuu
+Description: Wu Chinese
+Added: 2009-07-29
+Preferred-Value: wuu
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: xki
+Description: Kenyan Sign Language
+Added: 2009-07-29
+Preferred-Value: xki
+Prefix: sgn
+%%
+Type: extlang
+Subtag: xml
+Description: Malaysian Sign Language
+Added: 2009-07-29
+Preferred-Value: xml
+Prefix: sgn
+%%
+Type: extlang
+Subtag: xmm
+Description: Manado Malay
+Added: 2009-07-29
+Preferred-Value: xmm
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: xms
+Description: Moroccan Sign Language
+Added: 2009-07-29
+Preferred-Value: xms
+Prefix: sgn
+%%
+Type: extlang
+Subtag: yds
+Description: Yiddish Sign Language
+Added: 2009-07-29
+Preferred-Value: yds
+Prefix: sgn
+%%
+Type: extlang
+Subtag: ysl
+Description: Yugoslavian Sign Language
+Added: 2009-07-29
+Preferred-Value: ysl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: yue
+Description: Yue Chinese
+Added: 2009-07-29
+Preferred-Value: yue
+Prefix: zh
+Macrolanguage: zh
+%%
+Type: extlang
+Subtag: zib
+Description: Zimbabwe Sign Language
+Added: 2009-07-29
+Preferred-Value: zib
+Prefix: sgn
+%%
+Type: extlang
+Subtag: zlm
+Description: Malay (individual language)
+Added: 2009-07-29
+Preferred-Value: zlm
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: zmi
+Description: Negeri Sembilan Malay
+Added: 2009-07-29
+Preferred-Value: zmi
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: extlang
+Subtag: zsl
+Description: Zambian Sign Language
+Added: 2009-07-29
+Preferred-Value: zsl
+Prefix: sgn
+%%
+Type: extlang
+Subtag: zsm
+Description: Standard Malay
+Added: 2009-07-29
+Preferred-Value: zsm
+Prefix: ms
+Macrolanguage: ms
+%%
+Type: script
+Subtag: Afak
+Description: Afaka
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Arab
+Description: Arabic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Armi
+Description: Imperial Aramaic
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Armn
+Description: Armenian
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Avst
+Description: Avestan
+Added: 2007-07-28
+%%
+Type: script
+Subtag: Bali
+Description: Balinese
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Bamu
+Description: Bamum
+Added: 2009-07-30
+%%
+Type: script
+Subtag: Bass
+Description: Bassa Vah
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Batk
+Description: Batak
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Beng
+Description: Bengali
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Blis
+Description: Blissymbols
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Bopo
+Description: Bopomofo
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Brah
+Description: Brahmi
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Brai
+Description: Braille
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Bugi
+Description: Buginese
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Buhd
+Description: Buhid
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cakm
+Description: Chakma
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Cans
+Description: Unified Canadian Aboriginal Syllabics
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cari
+Description: Carian
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Cham
+Description: Cham
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cher
+Description: Cherokee
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cirt
+Description: Cirth
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Copt
+Description: Coptic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cprt
+Description: Cypriot
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cyrl
+Description: Cyrillic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Cyrs
+Description: Cyrillic (Old Church Slavonic variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Deva
+Description: Devanagari
+Description: Nagari
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Dsrt
+Description: Deseret
+Description: Mormon
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Dupl
+Description: Duployan shorthand
+Description: Duployan stenography
+Added: 2010-08-16
+%%
+Type: script
+Subtag: Egyd
+Description: Egyptian demotic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Egyh
+Description: Egyptian hieratic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Egyp
+Description: Egyptian hieroglyphs
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Elba
+Description: Elbasan
+Added: 2010-08-16
+%%
+Type: script
+Subtag: Ethi
+Description: Ethiopic
+Description: Geʻez
+Description: Ge'ez
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Geok
+Description: Khutsuri (Asomtavruli and Nuskhuri)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Geor
+Description: Georgian (Mkhedruli)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Glag
+Description: Glagolitic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Goth
+Description: Gothic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Gran
+Description: Grantha
+Added: 2009-12-09
+%%
+Type: script
+Subtag: Grek
+Description: Greek
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Gujr
+Description: Gujarati
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Guru
+Description: Gurmukhi
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hang
+Description: Hangul
+Description: Hangŭl
+Description: Hangeul
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hani
+Description: Han
+Description: Hanzi
+Description: Kanji
+Description: Hanja
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hano
+Description: Hanunoo
+Description: Hanunóo
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hans
+Description: Han (Simplified variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hant
+Description: Han (Traditional variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hebr
+Description: Hebrew
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hira
+Description: Hiragana
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hluw
+Description: Anatolian Hieroglyphs
+Description: Luwian Hieroglyphs
+Description: Hittite Hieroglyphs
+Added: 2011-12-28
+%%
+Type: script
+Subtag: Hmng
+Description: Pahawh Hmong
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hrkt
+Description: Japanese syllabaries (alias for Hiragana + Katakana)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Hung
+Description: Old Hungarian
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Inds
+Description: Indus
+Description: Harappan
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Ital
+Description: Old Italic (Etruscan, Oscan, etc.)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Java
+Description: Javanese
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Jpan
+Description: Japanese (alias for Han + Hiragana + Katakana)
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Jurc
+Description: Jurchen
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Kali
+Description: Kayah Li
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Kana
+Description: Katakana
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Khar
+Description: Kharoshthi
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Khmr
+Description: Khmer
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Khoj
+Description: Khojki
+Added: 2011-08-16
+%%
+Type: script
+Subtag: Knda
+Description: Kannada
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Kore
+Description: Korean (alias for Hangul + Han)
+Added: 2007-07-05
+%%
+Type: script
+Subtag: Kpel
+Description: Kpelle
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Kthi
+Description: Kaithi
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Lana
+Description: Tai Tham
+Description: Lanna
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Laoo
+Description: Lao
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Latf
+Description: Latin (Fraktur variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Latg
+Description: Latin (Gaelic variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Latn
+Description: Latin
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Lepc
+Description: Lepcha
+Description: Róng
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Limb
+Description: Limbu
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Lina
+Description: Linear A
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Linb
+Description: Linear B
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Lisu
+Description: Lisu
+Description: Fraser
+Added: 2009-03-13
+%%
+Type: script
+Subtag: Loma
+Description: Loma
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Lyci
+Description: Lycian
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Lydi
+Description: Lydian
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Mand
+Description: Mandaic
+Description: Mandaean
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Mani
+Description: Manichaean
+Added: 2007-07-28
+%%
+Type: script
+Subtag: Maya
+Description: Mayan hieroglyphs
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Mend
+Description: Mende
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Merc
+Description: Meroitic Cursive
+Added: 2009-12-09
+%%
+Type: script
+Subtag: Mero
+Description: Meroitic Hieroglyphs
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Mlym
+Description: Malayalam
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Mong
+Description: Mongolian
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Moon
+Description: Moon
+Description: Moon code
+Description: Moon script
+Description: Moon type
+Added: 2007-01-26
+%%
+Type: script
+Subtag: Mroo
+Description: Mro
+Description: Mru
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Mtei
+Description: Meitei Mayek
+Description: Meithei
+Description: Meetei
+Added: 2007-01-26
+%%
+Type: script
+Subtag: Mymr
+Description: Myanmar
+Description: Burmese
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Narb
+Description: Old North Arabian
+Description: Ancient North Arabian
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Nbat
+Description: Nabataean
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Nkgb
+Description: Nakhi Geba
+Description: 'Na-'Khi ²Ggŏ-¹baw
+Description: Naxi Geba
+Added: 2009-03-13
+%%
+Type: script
+Subtag: Nkoo
+Description: N’Ko
+Description: N'Ko
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Nshu
+Description: Nüshu
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Ogam
+Description: Ogham
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Olck
+Description: Ol Chiki
+Description: Ol Cemet'
+Description: Ol
+Description: Santali
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Orkh
+Description: Old Turkic
+Description: Orkhon Runic
+Added: 2009-07-30
+%%
+Type: script
+Subtag: Orya
+Description: Oriya
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Osma
+Description: Osmanya
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Palm
+Description: Palmyrene
+Added: 2010-04-10
+%%
+Type: script
+Subtag: Perm
+Description: Old Permic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Phag
+Description: Phags-pa
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Phli
+Description: Inscriptional Pahlavi
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Phlp
+Description: Psalter Pahlavi
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Phlv
+Description: Book Pahlavi
+Added: 2007-07-28
+%%
+Type: script
+Subtag: Phnx
+Description: Phoenician
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Plrd
+Description: Miao
+Description: Pollard
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Prti
+Description: Inscriptional Parthian
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Qaaa..Qabx
+Description: Private use
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Rjng
+Description: Rejang
+Description: Redjang
+Description: Kaganga
+Added: 2006-10-17
+%%
+Type: script
+Subtag: Roro
+Description: Rongorongo
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Runr
+Description: Runic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Samr
+Description: Samaritan
+Added: 2007-07-28
+%%
+Type: script
+Subtag: Sara
+Description: Sarati
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Sarb
+Description: Old South Arabian
+Added: 2009-07-30
+%%
+Type: script
+Subtag: Saur
+Description: Saurashtra
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Sgnw
+Description: SignWriting
+Added: 2006-10-17
+%%
+Type: script
+Subtag: Shaw
+Description: Shavian
+Description: Shaw
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Shrd
+Description: Sharada
+Description: Śāradā
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Sind
+Description: Khudawadi
+Description: Sindhi
+Added: 2010-08-16
+%%
+Type: script
+Subtag: Sinh
+Description: Sinhala
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Sora
+Description: Sora Sompeng
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Sund
+Description: Sundanese
+Added: 2006-07-21
+%%
+Type: script
+Subtag: Sylo
+Description: Syloti Nagri
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Syrc
+Description: Syriac
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Syre
+Description: Syriac (Estrangelo variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Syrj
+Description: Syriac (Western variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Syrn
+Description: Syriac (Eastern variant)
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Tagb
+Description: Tagbanwa
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Takr
+Description: Takri
+Description: Ṭākrī
+Description: Ṭāṅkrī
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Tale
+Description: Tai Le
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Talu
+Description: New Tai Lue
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Taml
+Description: Tamil
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Tang
+Description: Tangut
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Tavt
+Description: Tai Viet
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Telu
+Description: Telugu
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Teng
+Description: Tengwar
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Tfng
+Description: Tifinagh
+Description: Berber
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Tglg
+Description: Tagalog
+Description: Baybayin
+Description: Alibata
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Thaa
+Description: Thaana
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Thai
+Description: Thai
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Tibt
+Description: Tibetan
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Tirh
+Description: Tirhuta
+Added: 2011-08-16
+%%
+Type: script
+Subtag: Ugar
+Description: Ugaritic
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Vaii
+Description: Vai
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Visp
+Description: Visible Speech
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Wara
+Description: Warang Citi
+Description: Varang Kshiti
+Added: 2009-12-09
+%%
+Type: script
+Subtag: Wole
+Description: Woleai
+Added: 2011-01-07
+%%
+Type: script
+Subtag: Xpeo
+Description: Old Persian
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Xsux
+Description: Sumero-Akkadian cuneiform
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Yiii
+Description: Yi
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Zinh
+Description: Code for inherited script
+Added: 2009-04-03
+Comments: Not intended for use as a language subtag
+%%
+Type: script
+Subtag: Zmth
+Description: Mathematical notation
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Zsym
+Description: Symbols
+Added: 2007-12-05
+%%
+Type: script
+Subtag: Zxxx
+Description: Code for unwritten documents
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Zyyy
+Description: Code for undetermined script
+Added: 2005-10-16
+%%
+Type: script
+Subtag: Zzzz
+Description: Code for uncoded script
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AA
+Description: Private use
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AC
+Description: Ascension Island
+Added: 2009-07-29
+%%
+Type: region
+Subtag: AD
+Description: Andorra
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AE
+Description: United Arab Emirates
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AF
+Description: Afghanistan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AG
+Description: Antigua and Barbuda
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AI
+Description: Anguilla
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AL
+Description: Albania
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AM
+Description: Armenia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AN
+Description: Netherlands Antilles
+Added: 2005-10-16
+Deprecated: 2011-01-07
+Comments: see BQ, CW, and SX
+%%
+Type: region
+Subtag: AO
+Description: Angola
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AQ
+Description: Antarctica
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AR
+Description: Argentina
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AS
+Description: American Samoa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AT
+Description: Austria
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AU
+Description: Australia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AW
+Description: Aruba
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AX
+Description: Åland Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: AZ
+Description: Azerbaijan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BA
+Description: Bosnia and Herzegovina
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BB
+Description: Barbados
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BD
+Description: Bangladesh
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BE
+Description: Belgium
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BF
+Description: Burkina Faso
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BG
+Description: Bulgaria
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BH
+Description: Bahrain
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BI
+Description: Burundi
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BJ
+Description: Benin
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BL
+Description: Saint Barthélemy
+Added: 2007-11-02
+%%
+Type: region
+Subtag: BM
+Description: Bermuda
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BN
+Description: Brunei Darussalam
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BO
+Description: Bolivia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BQ
+Description: Bonaire, Sint Eustatius and Saba
+Added: 2011-01-07
+%%
+Type: region
+Subtag: BR
+Description: Brazil
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BS
+Description: Bahamas
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BT
+Description: Bhutan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BU
+Description: Burma
+Added: 2005-10-16
+Deprecated: 1989-12-05
+Preferred-Value: MM
+%%
+Type: region
+Subtag: BV
+Description: Bouvet Island
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BW
+Description: Botswana
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BY
+Description: Belarus
+Added: 2005-10-16
+%%
+Type: region
+Subtag: BZ
+Description: Belize
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CA
+Description: Canada
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CC
+Description: Cocos (Keeling) Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CD
+Description: The Democratic Republic of the Congo
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CF
+Description: Central African Republic
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CG
+Description: Congo
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CH
+Description: Switzerland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CI
+Description: Côte d'Ivoire
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CK
+Description: Cook Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CL
+Description: Chile
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CM
+Description: Cameroon
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CN
+Description: China
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CO
+Description: Colombia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CP
+Description: Clipperton Island
+Added: 2009-07-29
+%%
+Type: region
+Subtag: CR
+Description: Costa Rica
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CS
+Description: Serbia and Montenegro
+Added: 2005-10-16
+Deprecated: 2006-10-05
+Comments: see RS for Serbia or ME for Montenegro
+%%
+Type: region
+Subtag: CU
+Description: Cuba
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CV
+Description: Cape Verde
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CW
+Description: Curaçao
+Added: 2011-01-07
+%%
+Type: region
+Subtag: CX
+Description: Christmas Island
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CY
+Description: Cyprus
+Added: 2005-10-16
+%%
+Type: region
+Subtag: CZ
+Description: Czech Republic
+Added: 2005-10-16
+%%
+Type: region
+Subtag: DD
+Description: German Democratic Republic
+Added: 2005-10-16
+Deprecated: 1990-10-30
+Preferred-Value: DE
+%%
+Type: region
+Subtag: DE
+Description: Germany
+Added: 2005-10-16
+%%
+Type: region
+Subtag: DG
+Description: Diego Garcia
+Added: 2009-07-29
+%%
+Type: region
+Subtag: DJ
+Description: Djibouti
+Added: 2005-10-16
+%%
+Type: region
+Subtag: DK
+Description: Denmark
+Added: 2005-10-16
+%%
+Type: region
+Subtag: DM
+Description: Dominica
+Added: 2005-10-16
+%%
+Type: region
+Subtag: DO
+Description: Dominican Republic
+Added: 2005-10-16
+%%
+Type: region
+Subtag: DZ
+Description: Algeria
+Added: 2005-10-16
+%%
+Type: region
+Subtag: EA
+Description: Ceuta, Melilla
+Added: 2009-07-29
+%%
+Type: region
+Subtag: EC
+Description: Ecuador
+Added: 2005-10-16
+%%
+Type: region
+Subtag: EE
+Description: Estonia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: EG
+Description: Egypt
+Added: 2005-10-16
+%%
+Type: region
+Subtag: EH
+Description: Western Sahara
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ER
+Description: Eritrea
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ES
+Description: Spain
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ET
+Description: Ethiopia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: EU
+Description: European Union
+Added: 2009-07-29
+%%
+Type: region
+Subtag: FI
+Description: Finland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: FJ
+Description: Fiji
+Added: 2005-10-16
+%%
+Type: region
+Subtag: FK
+Description: Falkland Islands (Malvinas)
+Added: 2005-10-16
+%%
+Type: region
+Subtag: FM
+Description: Federated States of Micronesia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: FO
+Description: Faroe Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: FR
+Description: France
+Added: 2005-10-16
+%%
+Type: region
+Subtag: FX
+Description: Metropolitan France
+Added: 2005-10-16
+Deprecated: 1997-07-14
+Preferred-Value: FR
+%%
+Type: region
+Subtag: GA
+Description: Gabon
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GB
+Description: United Kingdom
+Added: 2005-10-16
+Comments: as of 2006-03-29 GB no longer includes the Channel Islands and
+  Isle of Man; see GG, JE, IM
+%%
+Type: region
+Subtag: GD
+Description: Grenada
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GE
+Description: Georgia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GF
+Description: French Guiana
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GG
+Description: Guernsey
+Added: 2006-03-29
+%%
+Type: region
+Subtag: GH
+Description: Ghana
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GI
+Description: Gibraltar
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GL
+Description: Greenland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GM
+Description: Gambia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GN
+Description: Guinea
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GP
+Description: Guadeloupe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GQ
+Description: Equatorial Guinea
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GR
+Description: Greece
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GS
+Description: South Georgia and the South Sandwich Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GT
+Description: Guatemala
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GU
+Description: Guam
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GW
+Description: Guinea-Bissau
+Added: 2005-10-16
+%%
+Type: region
+Subtag: GY
+Description: Guyana
+Added: 2005-10-16
+%%
+Type: region
+Subtag: HK
+Description: Hong Kong
+Added: 2005-10-16
+%%
+Type: region
+Subtag: HM
+Description: Heard Island and McDonald Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: HN
+Description: Honduras
+Added: 2005-10-16
+%%
+Type: region
+Subtag: HR
+Description: Croatia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: HT
+Description: Haiti
+Added: 2005-10-16
+%%
+Type: region
+Subtag: HU
+Description: Hungary
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IC
+Description: Canary Islands
+Added: 2009-07-29
+%%
+Type: region
+Subtag: ID
+Description: Indonesia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IE
+Description: Ireland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IL
+Description: Israel
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IM
+Description: Isle of Man
+Added: 2006-03-29
+%%
+Type: region
+Subtag: IN
+Description: India
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IO
+Description: British Indian Ocean Territory
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IQ
+Description: Iraq
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IR
+Description: Islamic Republic of Iran
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IS
+Description: Iceland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: IT
+Description: Italy
+Added: 2005-10-16
+%%
+Type: region
+Subtag: JE
+Description: Jersey
+Added: 2006-03-29
+%%
+Type: region
+Subtag: JM
+Description: Jamaica
+Added: 2005-10-16
+%%
+Type: region
+Subtag: JO
+Description: Jordan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: JP
+Description: Japan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KE
+Description: Kenya
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KG
+Description: Kyrgyzstan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KH
+Description: Cambodia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KI
+Description: Kiribati
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KM
+Description: Comoros
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KN
+Description: Saint Kitts and Nevis
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KP
+Description: Democratic People's Republic of Korea
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KR
+Description: Republic of Korea
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KW
+Description: Kuwait
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KY
+Description: Cayman Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: KZ
+Description: Kazakhstan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LA
+Description: Lao People's Democratic Republic
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LB
+Description: Lebanon
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LC
+Description: Saint Lucia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LI
+Description: Liechtenstein
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LK
+Description: Sri Lanka
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LR
+Description: Liberia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LS
+Description: Lesotho
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LT
+Description: Lithuania
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LU
+Description: Luxembourg
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LV
+Description: Latvia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: LY
+Description: Libya
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MA
+Description: Morocco
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MC
+Description: Monaco
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MD
+Description: Moldova
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ME
+Description: Montenegro
+Added: 2006-10-05
+%%
+Type: region
+Subtag: MF
+Description: Saint Martin (French part)
+Added: 2007-11-02
+%%
+Type: region
+Subtag: MG
+Description: Madagascar
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MH
+Description: Marshall Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MK
+Description: The Former Yugoslav Republic of Macedonia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ML
+Description: Mali
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MM
+Description: Myanmar
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MN
+Description: Mongolia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MO
+Description: Macao
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MP
+Description: Northern Mariana Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MQ
+Description: Martinique
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MR
+Description: Mauritania
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MS
+Description: Montserrat
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MT
+Description: Malta
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MU
+Description: Mauritius
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MV
+Description: Maldives
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MW
+Description: Malawi
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MX
+Description: Mexico
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MY
+Description: Malaysia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: MZ
+Description: Mozambique
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NA
+Description: Namibia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NC
+Description: New Caledonia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NE
+Description: Niger
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NF
+Description: Norfolk Island
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NG
+Description: Nigeria
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NI
+Description: Nicaragua
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NL
+Description: Netherlands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NO
+Description: Norway
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NP
+Description: Nepal
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NR
+Description: Nauru
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NT
+Description: Neutral Zone
+Added: 2005-10-16
+Deprecated: 1993-07-12
+%%
+Type: region
+Subtag: NU
+Description: Niue
+Added: 2005-10-16
+%%
+Type: region
+Subtag: NZ
+Description: New Zealand
+Added: 2005-10-16
+%%
+Type: region
+Subtag: OM
+Description: Oman
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PA
+Description: Panama
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PE
+Description: Peru
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PF
+Description: French Polynesia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PG
+Description: Papua New Guinea
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PH
+Description: Philippines
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PK
+Description: Pakistan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PL
+Description: Poland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PM
+Description: Saint Pierre and Miquelon
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PN
+Description: Pitcairn
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PR
+Description: Puerto Rico
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PS
+Description: Occupied Palestinian Territory
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PT
+Description: Portugal
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PW
+Description: Palau
+Added: 2005-10-16
+%%
+Type: region
+Subtag: PY
+Description: Paraguay
+Added: 2005-10-16
+%%
+Type: region
+Subtag: QA
+Description: Qatar
+Added: 2005-10-16
+%%
+Type: region
+Subtag: QM..QZ
+Description: Private use
+Added: 2005-10-16
+%%
+Type: region
+Subtag: RE
+Description: Réunion
+Added: 2005-10-16
+%%
+Type: region
+Subtag: RO
+Description: Romania
+Added: 2005-10-16
+%%
+Type: region
+Subtag: RS
+Description: Serbia
+Added: 2006-10-05
+%%
+Type: region
+Subtag: RU
+Description: Russian Federation
+Added: 2005-10-16
+%%
+Type: region
+Subtag: RW
+Description: Rwanda
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SA
+Description: Saudi Arabia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SB
+Description: Solomon Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SC
+Description: Seychelles
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SD
+Description: Sudan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SE
+Description: Sweden
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SG
+Description: Singapore
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SH
+Description: Saint Helena, Ascension and Tristan da Cunha
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SI
+Description: Slovenia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SJ
+Description: Svalbard and Jan Mayen
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SK
+Description: Slovakia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SL
+Description: Sierra Leone
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SM
+Description: San Marino
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SN
+Description: Senegal
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SO
+Description: Somalia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SR
+Description: Suriname
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SS
+Description: South Sudan
+Added: 2011-08-25
+%%
+Type: region
+Subtag: ST
+Description: Sao Tome and Principe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SU
+Description: Union of Soviet Socialist Republics
+Added: 2005-10-16
+Deprecated: 1992-08-30
+%%
+Type: region
+Subtag: SV
+Description: El Salvador
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SX
+Description: Sint Maarten (Dutch part)
+Added: 2011-01-07
+%%
+Type: region
+Subtag: SY
+Description: Syrian Arab Republic
+Added: 2005-10-16
+%%
+Type: region
+Subtag: SZ
+Description: Swaziland
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TA
+Description: Tristan da Cunha
+Added: 2009-07-29
+%%
+Type: region
+Subtag: TC
+Description: Turks and Caicos Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TD
+Description: Chad
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TF
+Description: French Southern Territories
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TG
+Description: Togo
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TH
+Description: Thailand
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TJ
+Description: Tajikistan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TK
+Description: Tokelau
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TL
+Description: Timor-Leste
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TM
+Description: Turkmenistan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TN
+Description: Tunisia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TO
+Description: Tonga
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TP
+Description: East Timor
+Added: 2005-10-16
+Deprecated: 2002-05-20
+Preferred-Value: TL
+%%
+Type: region
+Subtag: TR
+Description: Turkey
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TT
+Description: Trinidad and Tobago
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TV
+Description: Tuvalu
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TW
+Description: Taiwan, Province of China
+Added: 2005-10-16
+%%
+Type: region
+Subtag: TZ
+Description: United Republic of Tanzania
+Added: 2005-10-16
+%%
+Type: region
+Subtag: UA
+Description: Ukraine
+Added: 2005-10-16
+%%
+Type: region
+Subtag: UG
+Description: Uganda
+Added: 2005-10-16
+%%
+Type: region
+Subtag: UM
+Description: United States Minor Outlying Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: US
+Description: United States
+Added: 2005-10-16
+%%
+Type: region
+Subtag: UY
+Description: Uruguay
+Added: 2005-10-16
+%%
+Type: region
+Subtag: UZ
+Description: Uzbekistan
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VA
+Description: Holy See (Vatican City State)
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VC
+Description: Saint Vincent and the Grenadines
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VE
+Description: Venezuela
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VG
+Description: British Virgin Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VI
+Description: U.S. Virgin Islands
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VN
+Description: Viet Nam
+Added: 2005-10-16
+%%
+Type: region
+Subtag: VU
+Description: Vanuatu
+Added: 2005-10-16
+%%
+Type: region
+Subtag: WF
+Description: Wallis and Futuna
+Added: 2005-10-16
+%%
+Type: region
+Subtag: WS
+Description: Samoa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: XA..XZ
+Description: Private use
+Added: 2005-10-16
+%%
+Type: region
+Subtag: YD
+Description: Democratic Yemen
+Added: 2005-10-16
+Deprecated: 1990-08-14
+Preferred-Value: YE
+%%
+Type: region
+Subtag: YE
+Description: Yemen
+Added: 2005-10-16
+%%
+Type: region
+Subtag: YT
+Description: Mayotte
+Added: 2005-10-16
+%%
+Type: region
+Subtag: YU
+Description: Yugoslavia
+Added: 2005-10-16
+Deprecated: 2003-07-23
+Comments: see BA, HR, ME, MK, RS, or SI
+%%
+Type: region
+Subtag: ZA
+Description: South Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ZM
+Description: Zambia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ZR
+Description: Zaire
+Added: 2005-10-16
+Deprecated: 1997-07-14
+Preferred-Value: CD
+%%
+Type: region
+Subtag: ZW
+Description: Zimbabwe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: ZZ
+Description: Private use
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 001
+Description: World
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 002
+Description: Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 003
+Description: North America
+Added: 2010-08-16
+Comments: Includes Northern America (021), Caribbean (029), and Central
+  America (013); see also 021
+%%
+Type: region
+Subtag: 005
+Description: South America
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 009
+Description: Oceania
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 011
+Description: Western Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 013
+Description: Central America
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 014
+Description: Eastern Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 015
+Description: Northern Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 017
+Description: Middle Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 018
+Description: Southern Africa
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 019
+Description: Americas
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 021
+Description: Northern America
+Added: 2005-10-16
+Comments: Does not include Caribbean (029) or Central America (013); see
+  also 003
+%%
+Type: region
+Subtag: 029
+Description: Caribbean
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 030
+Description: Eastern Asia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 034
+Description: Southern Asia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 035
+Description: South-Eastern Asia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 039
+Description: Southern Europe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 053
+Description: Australia and New Zealand
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 054
+Description: Melanesia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 057
+Description: Micronesia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 061
+Description: Polynesia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 142
+Description: Asia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 143
+Description: Central Asia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 145
+Description: Western Asia
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 150
+Description: Europe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 151
+Description: Eastern Europe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 154
+Description: Northern Europe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 155
+Description: Western Europe
+Added: 2005-10-16
+%%
+Type: region
+Subtag: 419
+Description: Latin America and the Caribbean
+Added: 2005-10-16
+%%
+Type: variant
+Subtag: 1606nict
+Description: Late Middle French (to 1606)
+Added: 2007-03-20
+Prefix: frm
+Comments: 16th century French as in Jean Nicot, "Thresor de la langue
+  francoyse", 1606, but also including some French similar to that of
+  Rabelais
+%%
+Type: variant
+Subtag: 1694acad
+Description: Early Modern French
+Added: 2007-03-20
+Prefix: fr
+Comments: 17th century French, as catalogued in the "Dictionnaire de
+  l'académie françoise", 4eme ed. 1694; frequently includes
+  elements of Middle French, as this is a transitional period
+%%
+Type: variant
+Subtag: 1901
+Description: Traditional German orthography
+Added: 2005-10-16
+Prefix: de
+%%
+Type: variant
+Subtag: 1959acad
+Description: "Academic" ("governmental") variant of Belarusian as
+  codified in 1959
+Added: 2008-09-30
+Prefix: be
+%%
+Type: variant
+Subtag: 1994
+Description: Standardized Resian orthography
+Added: 2007-07-28
+Prefix: sl-rozaj
+Prefix: sl-rozaj-biske
+Prefix: sl-rozaj-njiva
+Prefix: sl-rozaj-osojs
+Prefix: sl-rozaj-solba
+Comments: For standardized Resian an orthography was published in 1994.
+%%
+Type: variant
+Subtag: 1996
+Description: German orthography of 1996
+Added: 2005-10-16
+Prefix: de
+%%
+Type: variant
+Subtag: alalc97
+Description: ALA-LC Romanization, 1997 edition
+Added: 2009-12-09
+Comments: Romanizations recommended by the American Library Association
+  and the Library of Congress, in "ALA-LC Romanization Tables:
+  Transliteration Schemes for Non-Roman Scripts" (1997), ISBN
+  978-0-8444-0940-5.
+%%
+Type: variant
+Subtag: aluku
+Description: Aluku dialect
+Description: Boni dialect
+Added: 2009-09-05
+Prefix: djk
+Comments: Aluku dialect of the "Busi Nenge Tongo" English-based Creole
+  continuum in Eastern Suriname and Western French Guiana
+%%
+Type: variant
+Subtag: arevela
+Description: Eastern Armenian
+Added: 2006-09-18
+Prefix: hy
+%%
+Type: variant
+Subtag: arevmda
+Description: Western Armenian
+Added: 2006-09-18
+Prefix: hy
+%%
+Type: variant
+Subtag: baku1926
+Description: Unified Turkic Latin Alphabet (Historical)
+Added: 2007-04-18
+Prefix: az
+Prefix: ba
+Prefix: crh
+Prefix: kk
+Prefix: krc
+Prefix: ky
+Prefix: sah
+Prefix: tk
+Prefix: tt
+Prefix: uz
+Comments: Denotes alphabet used in Turkic republics/regions of the
+  former USSR in late 1920s, and throughout 1930s, which aspired to
+  represent equivalent phonemes in a unified fashion. Also known as: New
+  Turkic Alphabet; Birlәşdirilmiş Jeni Tyrk
+  Әlifbasь (Birlesdirilmis Jeni Tyrk Elifbasi);
+  Jaŋalif (Janalif).
+%%
+Type: variant
+Subtag: bauddha
+Description: Buddhist Hybrid Sanskrit
+Added: 2010-07-28
+Prefix: sa
+%%
+Type: variant
+Subtag: biscayan
+Description: Biscayan dialect of Basque
+Added: 2010-04-13
+Prefix: eu
+%%
+Type: variant
+Subtag: biske
+Description: The San Giorgio dialect of Resian
+Description: The Bila dialect of Resian
+Added: 2007-07-05
+Prefix: sl-rozaj
+Comments: The dialect of San Giorgio/Bila is one of the four major local
+  dialects of Resian
+%%
+Type: variant
+Subtag: bohoric
+Description: Slovene in Bohorič alphabet
+Added: 2012-06-27
+Prefix: sl
+Comments: The subtag represents the alphabet codified by Adam Bohorič in
+  1584 and used from the first printed Slovene book and up to the mid-
+  19th century.
+%%
+Type: variant
+Subtag: boont
+Description: Boontling
+Added: 2006-09-18
+Prefix: en
+Comments: Jargon embedded in American English
+%%
+Type: variant
+Subtag: dajnko
+Description: Slovene in Dajnko alphabet
+Added: 2012-06-27
+Prefix: sl
+Comments: The subtag represents the alphabet codified by Peter Dajnko
+  and used from 1824 to 1839 mostly in Styria (in what is now Eastern
+  Slovenia).
+%%
+Type: variant
+Subtag: emodeng
+Description: Early Modern English (1500-1700)
+Added: 2012-02-05
+Prefix: en
+%%
+Type: variant
+Subtag: fonipa
+Description: International Phonetic Alphabet
+Added: 2006-12-11
+%%
+Type: variant
+Subtag: fonupa
+Description: Uralic Phonetic Alphabet
+Added: 2006-12-11
+%%
+Type: variant
+Subtag: fonxsamp
+Description: X-SAMPA transcription
+Added: 2010-10-23
+Comments: Indicates that the content is transcribed according to X-SAMPA
+%%
+Type: variant
+Subtag: hepburn
+Description: Hepburn romanization
+Added: 2009-10-01
+Prefix: ja-Latn
+%%
+Type: variant
+Subtag: heploc
+Description: Hepburn romanization, Library of Congress method
+Added: 2009-10-01
+Deprecated: 2010-02-07
+Preferred-Value: alalc97
+Prefix: ja-Latn-hepburn
+Comments: Preferred tag is ja-Latn-alalc97
+%%
+Type: variant
+Subtag: hognorsk
+Description: Norwegian in Høgnorsk (High Norwegian) orthography
+Added: 2010-01-02
+Prefix: nn
+Comments: Norwegian following Ivar Aasen's orthographical principles,
+  including modern usage.
+%%
+Type: variant
+Subtag: itihasa
+Description: Epic Sanskrit
+Added: 2010-07-28
+Prefix: sa
+%%
+Type: variant
+Subtag: jauer
+Description: Jauer dialect of Romansh
+Added: 2010-06-29
+Prefix: rm
+Comments: The spoken dialect of the Val Müstair, which has no written
+  standard.
+%%
+Type: variant
+Subtag: jyutping
+Description: Jyutping Cantonese Romanization
+Added: 2010-10-23
+Prefix: yue
+Comments: Jyutping romanization of Cantonese
+%%
+Type: variant
+Subtag: kkcor
+Description: Common Cornish orthography of Revived Cornish
+Added: 2008-10-14
+Prefix: kw
+%%
+Type: variant
+Subtag: kscor
+Description: Standard Cornish orthography of Revived Cornish
+Description: Kernowek Standard
+Added: 2012-06-27
+Prefix: kw
+%%
+Type: variant
+Subtag: laukika
+Description: Classical Sanskrit
+Added: 2010-07-28
+Prefix: sa
+%%
+Type: variant
+Subtag: lipaw
+Description: The Lipovaz dialect of Resian
+Description: The Lipovec dialect of Resian
+Added: 2007-08-11
+Prefix: sl-rozaj
+Comments: The dialect of Lipovaz/Lipovec is one of the minor local
+  dialects of Resian
+%%
+Type: variant
+Subtag: luna1918
+Description: Post-1917 Russian orthography
+Added: 2010-10-10
+Prefix: ru
+Comments: Russian orthography as established by the 1917/1918
+  orthographic reforms
+%%
+Type: variant
+Subtag: metelko
+Description: Slovene in Metelko alphabet
+Added: 2012-06-27
+Prefix: sl
+Comments: The subtag represents the alphabet codified by Franc Serafin
+  Metelko and used from 1825 to 1833.
+%%
+Type: variant
+Subtag: monoton
+Description: Monotonic Greek
+Added: 2006-12-11
+Prefix: el
+%%
+Type: variant
+Subtag: ndyuka
+Description: Ndyuka dialect
+Description: Aukan dialect
+Added: 2009-09-05
+Prefix: djk
+Comments: Ndyuka dialect of the "Busi Nenge Tongo" English-based
+  Creole continuum in Eastern Suriname and Western French Guiana
+%%
+Type: variant
+Subtag: nedis
+Description: Natisone dialect
+Description: Nadiza dialect
+Added: 2005-10-16
+Prefix: sl
+%%
+Type: variant
+Subtag: njiva
+Description: The Gniva dialect of Resian
+Description: The Njiva dialect of Resian
+Added: 2007-07-05
+Prefix: sl-rozaj
+Comments: The dialect of Gniva/Njiva is one of the four major local
+  dialects of Resian
+%%
+Type: variant
+Subtag: nulik
+Description: Volapük nulik
+Description: Volapük perevidöl
+Description: Volapük nulädik
+Description: de Jong's Volapük
+Description: New Volapük
+Description: Revised Volapük
+Description: Modern Volapük
+Added: 2012-01-28
+Prefix: vo
+%%
+Type: variant
+Subtag: osojs
+Description: The Oseacco dialect of Resian
+Description: The Osojane dialect of Resian
+Added: 2007-07-05
+Prefix: sl-rozaj
+Comments: The dialect of Oseacco/Osojane is one of the four major local
+  dialects of Resian
+%%
+Type: variant
+Subtag: pamaka
+Description: Pamaka dialect
+Added: 2009-09-05
+Prefix: djk
+Comments: Pamaka dialect of the "Busi Nenge Tongo" English-based
+  Creole continuum in Eastern Suriname and Western French Guiana
+%%
+Type: variant
+Subtag: petr1708
+Description: Petrine orthography
+Added: 2010-10-10
+Prefix: ru
+Comments: Russian orthography from the Petrine orthographic reforms of
+  1708 to the 1917 orthographic reform
+%%
+Type: variant
+Subtag: pinyin
+Description: Pinyin romanization
+Added: 2008-10-14
+Prefix: zh-Latn
+Prefix: bo-Latn
+%%
+Type: variant
+Subtag: polyton
+Description: Polytonic Greek
+Added: 2006-12-11
+Prefix: el
+%%
+Type: variant
+Subtag: puter
+Description: Puter idiom of Romansh
+Added: 2010-06-29
+Prefix: rm
+Comments: Puter is one of the five traditional written standards or
+  "idioms" of the Romansh language.
+%%
+Type: variant
+Subtag: rigik
+Description: Volapük rigik
+Description: Schleyer's Volapük
+Description: Original Volapük
+Description: Classic Volapük
+Added: 2012-01-28
+Prefix: vo
+%%
+Type: variant
+Subtag: rozaj
+Description: Resian
+Description: Resianic
+Description: Rezijan
+Added: 2005-10-16
+Prefix: sl
+%%
+Type: variant
+Subtag: rumgr
+Description: Rumantsch Grischun
+Added: 2010-06-29
+Prefix: rm
+Comments: Supraregional Romansh written standard
+%%
+Type: variant
+Subtag: scotland
+Description: Scottish Standard English
+Added: 2007-08-31
+Prefix: en
+%%
+Type: variant
+Subtag: scouse
+Description: Scouse
+Added: 2006-09-18
+Prefix: en
+Comments: English Liverpudlian dialect known as 'Scouse'
+%%
+Type: variant
+Subtag: solba
+Description: The Stolvizza dialect of Resian
+Description: The Solbica dialect of Resian
+Added: 2007-07-05
+Prefix: sl-rozaj
+Comments: The dialect of Stolvizza/Solbica is one of the four major
+  local dialects of Resian
+%%
+Type: variant
+Subtag: surmiran
+Description: Surmiran idiom of Romansh
+Added: 2010-06-29
+Prefix: rm
+Comments: Surmiran is one of the five traditional written standards or
+  "idioms" of the Romansh language.
+%%
+Type: variant
+Subtag: sursilv
+Description: Sursilvan idiom of Romansh
+Added: 2010-06-29
+Prefix: rm
+Comments: Sursilvan is one of the five traditional written standards or
+  "idioms" of the Romansh language.
+%%
+Type: variant
+Subtag: sutsilv
+Description: Sutsilvan idiom of Romansh
+Added: 2010-06-29
+Prefix: rm
+Comments: Sutsilvan is one of the five traditional written standards or
+  "idioms" of the Romansh language.
+%%
+Type: variant
+Subtag: tarask
+Description: Belarusian in Taraskievica orthography
+Added: 2007-04-27
+Prefix: be
+Comments: The subtag represents Branislau Taraskievic's Belarusian
+  orthography as published in "Bielaruski klasycny pravapis" by Juras
+  Buslakou, Vincuk Viacorka, Zmicier Sanko, and Zmicier Sauka (Vilnia-
+  Miensk 2005).
+%%
+Type: variant
+Subtag: uccor
+Description: Unified Cornish orthography of Revived Cornish
+Added: 2008-10-14
+Prefix: kw
+%%
+Type: variant
+Subtag: ucrcor
+Description: Unified Cornish Revised orthography of Revived Cornish
+Added: 2008-10-14
+Prefix: kw
+%%
+Type: variant
+Subtag: ulster
+Description: Ulster dialect of Scots
+Added: 2010-04-10
+Prefix: sco
+%%
+Type: variant
+Subtag: vaidika
+Description: Vedic Sanskrit
+Added: 2010-07-28
+Prefix: sa
+Comments: The most ancient dialect of Sanskrit used in verse and prose
+  composed until about the 4th century B.C.E.
+%%
+Type: variant
+Subtag: valencia
+Description: Valencian
+Added: 2007-03-06
+Prefix: ca
+Comments: Variety spoken in the "Comunidad Valenciana" region of Spain,
+  where it is co-official with Spanish.
+%%
+Type: variant
+Subtag: vallader
+Description: Vallader idiom of Romansh
+Added: 2010-06-29
+Prefix: rm
+Comments: Vallader is one of the five traditional written standards or
+  "idioms" of the Romansh language.
+%%
+Type: variant
+Subtag: wadegile
+Description: Wade-Giles romanization
+Added: 2008-10-03
+Prefix: zh-Latn
+%%
+Type: grandfathered
+Tag: art-lojban
+Description: Lojban
+Added: 2001-11-11
+Deprecated: 2003-09-02
+Preferred-Value: jbo
+%%
+Type: grandfathered
+Tag: cel-gaulish
+Description: Gaulish
+Added: 2001-05-25
+%%
+Type: grandfathered
+Tag: en-GB-oed
+Description: English, Oxford English Dictionary spelling
+Added: 2003-07-09
+%%
+Type: grandfathered
+Tag: i-ami
+Description: Amis
+Added: 1999-05-25
+Deprecated: 2009-07-29
+Preferred-Value: ami
+%%
+Type: grandfathered
+Tag: i-bnn
+Description: Bunun
+Added: 1999-05-25
+Deprecated: 2009-07-29
+Preferred-Value: bnn
+%%
+Type: grandfathered
+Tag: i-default
+Description: Default Language
+Added: 1998-03-10
+%%
+Type: grandfathered
+Tag: i-enochian
+Description: Enochian
+Added: 2002-07-03
+%%
+Type: grandfathered
+Tag: i-hak
+Description: Hakka
+Added: 1999-01-31
+Deprecated: 2000-01-10
+Preferred-Value: hak
+%%
+Type: grandfathered
+Tag: i-klingon
+Description: Klingon
+Added: 1999-05-26
+Deprecated: 2004-02-24
+Preferred-Value: tlh
+%%
+Type: grandfathered
+Tag: i-lux
+Description: Luxembourgish
+Added: 1997-09-19
+Deprecated: 1998-09-09
+Preferred-Value: lb
+%%
+Type: grandfathered
+Tag: i-mingo
+Description: Mingo
+Added: 1997-09-19
+%%
+Type: grandfathered
+Tag: i-navajo
+Description: Navajo
+Added: 1997-09-19
+Deprecated: 2000-02-18
+Preferred-Value: nv
+%%
+Type: grandfathered
+Tag: i-pwn
+Description: Paiwan
+Added: 1999-05-25
+Deprecated: 2009-07-29
+Preferred-Value: pwn
+%%
+Type: grandfathered
+Tag: i-tao
+Description: Tao
+Added: 1999-05-25
+Deprecated: 2009-07-29
+Preferred-Value: tao
+%%
+Type: grandfathered
+Tag: i-tay
+Description: Tayal
+Added: 1999-05-25
+Deprecated: 2009-07-29
+Preferred-Value: tay
+%%
+Type: grandfathered
+Tag: i-tsu
+Description: Tsou
+Added: 1999-05-25
+Deprecated: 2009-07-29
+Preferred-Value: tsu
+%%
+Type: grandfathered
+Tag: no-bok
+Description: Norwegian Bokmal
+Added: 1995-08-23
+Deprecated: 2000-02-18
+Preferred-Value: nb
+%%
+Type: grandfathered
+Tag: no-nyn
+Description: Norwegian Nynorsk
+Added: 1995-08-23
+Deprecated: 2000-02-18
+Preferred-Value: nn
+%%
+Type: grandfathered
+Tag: sgn-BE-FR
+Description: Belgian-French Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: sfb
+%%
+Type: grandfathered
+Tag: sgn-BE-NL
+Description: Belgian-Flemish Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: vgt
+%%
+Type: grandfathered
+Tag: sgn-CH-DE
+Description: Swiss German Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: sgg
+%%
+Type: grandfathered
+Tag: zh-guoyu
+Description: Mandarin or Standard Chinese
+Added: 1999-12-18
+Deprecated: 2005-07-15
+Preferred-Value: cmn
+%%
+Type: grandfathered
+Tag: zh-hakka
+Description: Hakka
+Added: 1999-12-18
+Deprecated: 2009-07-29
+Preferred-Value: hak
+%%
+Type: grandfathered
+Tag: zh-min
+Description: Min, Fuzhou, Hokkien, Amoy, or Taiwanese
+Added: 1999-12-18
+Deprecated: 2009-07-29
+%%
+Type: grandfathered
+Tag: zh-min-nan
+Description: Minnan, Hokkien, Amoy, Taiwanese, Southern Min, Southern
+  Fujian, Hoklo, Southern Fukien, Ho-lo
+Added: 2001-03-26
+Deprecated: 2009-07-29
+Preferred-Value: nan
+%%
+Type: grandfathered
+Tag: zh-xiang
+Description: Xiang or Hunanese
+Added: 1999-12-18
+Deprecated: 2009-07-29
+Preferred-Value: hsn
+%%
+Type: redundant
+Tag: az-Arab
+Description: Azerbaijani in Arabic script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: az-Cyrl
+Description: Azerbaijani in Cyrillic script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: az-Latn
+Description: Azerbaijani in Latin script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: be-Latn
+Description: Belarusian in Latin script
+Added: 2005-01-06
+%%
+Type: redundant
+Tag: bs-Cyrl
+Description: Bosnian in Cyrillic script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: bs-Latn
+Description: Bosnian in Latin script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: de-1901
+Description: German, traditional orthography
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-1996
+Description: German, orthography of 1996
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-AT-1901
+Description: German, Austrian variant, traditional orthography
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-AT-1996
+Description: German, Austrian variant, orthography of 1996
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-CH-1901
+Description: German, Swiss variant, traditional orthography
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-CH-1996
+Description: German, Swiss variant, orthography of 1996
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-DE-1901
+Description: German, German variant, traditional orthography
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: de-DE-1996
+Description: German, German variant, orthography of 1996
+Added: 2001-07-17
+%%
+Type: redundant
+Tag: en-boont
+Description: Boontling
+Added: 2003-02-14
+%%
+Type: redundant
+Tag: en-scouse
+Description: Scouse
+Added: 2000-05-25
+%%
+Type: redundant
+Tag: es-419
+Description: Latin American Spanish
+Added: 2005-07-15
+%%
+Type: redundant
+Tag: iu-Cans
+Description: Inuktitut in Canadian Aboriginal Syllabic script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: iu-Latn
+Description: Inuktitut in Latin script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: mn-Cyrl
+Description: Mongolian in Cyrillic script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: mn-Mong
+Description: Mongolian in Mongolian script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: sgn-BR
+Description: Brazilian Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: bzs
+%%
+Type: redundant
+Tag: sgn-CO
+Description: Colombian Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: csn
+%%
+Type: redundant
+Tag: sgn-DE
+Description: German Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: gsg
+%%
+Type: redundant
+Tag: sgn-DK
+Description: Danish Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: dsl
+%%
+Type: redundant
+Tag: sgn-ES
+Description: Spanish Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: ssp
+%%
+Type: redundant
+Tag: sgn-FR
+Description: French Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: fsl
+%%
+Type: redundant
+Tag: sgn-GB
+Description: British Sign Language
+Added: 2001-03-02
+Deprecated: 2009-07-29
+Preferred-Value: bfi
+%%
+Type: redundant
+Tag: sgn-GR
+Description: Greek Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: gss
+%%
+Type: redundant
+Tag: sgn-IE
+Description: Irish Sign Language
+Added: 2001-03-02
+Deprecated: 2009-07-29
+Preferred-Value: isg
+%%
+Type: redundant
+Tag: sgn-IT
+Description: Italian Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: ise
+%%
+Type: redundant
+Tag: sgn-JP
+Description: Japanese Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: jsl
+%%
+Type: redundant
+Tag: sgn-MX
+Description: Mexican Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: mfs
+%%
+Type: redundant
+Tag: sgn-NI
+Description: Nicaraguan Sign Language
+Added: 2001-03-02
+Deprecated: 2009-07-29
+Preferred-Value: ncs
+%%
+Type: redundant
+Tag: sgn-NL
+Description: Dutch Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: dse
+%%
+Type: redundant
+Tag: sgn-NO
+Description: Norwegian Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: nsl
+%%
+Type: redundant
+Tag: sgn-PT
+Description: Portuguese Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: psr
+%%
+Type: redundant
+Tag: sgn-SE
+Description: Swedish Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: swl
+%%
+Type: redundant
+Tag: sgn-US
+Description: American Sign Language
+Added: 2001-03-02
+Deprecated: 2009-07-29
+Preferred-Value: ase
+%%
+Type: redundant
+Tag: sgn-ZA
+Description: South African Sign Language
+Added: 2001-11-11
+Deprecated: 2009-07-29
+Preferred-Value: sfs
+%%
+Type: redundant
+Tag: sl-nedis
+Description: Natisone dialect, Nadiza dialect
+Added: 2004-06-01
+%%
+Type: redundant
+Tag: sl-rozaj
+Description: Resian, Resianic, Rezijan
+Added: 2003-10-09
+%%
+Type: redundant
+Tag: sr-Cyrl
+Description: Serbian in Cyrillic script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: sr-Latn
+Description: Serbian in Latin script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: tg-Arab
+Description: Tajik in Arabic script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: tg-Cyrl
+Description: Tajik in Cyrillic script
+Added: 2005-02-17
+%%
+Type: redundant
+Tag: uz-Cyrl
+Description: Uzbek in Cyrillic script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: uz-Latn
+Description: Uzbek in Latin script
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: yi-Latn
+Description: Yiddish, in Latin script
+Added: 2003-01-07
+%%
+Type: redundant
+Tag: zh-cmn
+Description: Mandarin Chinese
+Added: 2005-07-15
+Deprecated: 2009-07-29
+Preferred-Value: cmn
+%%
+Type: redundant
+Tag: zh-cmn-Hans
+Description: Mandarin Chinese (Simplified)
+Added: 2005-07-15
+Deprecated: 2009-07-29
+Preferred-Value: cmn-Hans
+%%
+Type: redundant
+Tag: zh-cmn-Hant
+Description: Mandarin Chinese (Traditional)
+Added: 2005-07-15
+Deprecated: 2009-07-29
+Preferred-Value: cmn-Hant
+%%
+Type: redundant
+Tag: zh-gan
+Description: Kan or Gan
+Added: 1999-12-18
+Deprecated: 2009-07-29
+Preferred-Value: gan
+%%
+Type: redundant
+Tag: zh-Hans
+Description: simplified Chinese
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: zh-Hans-CN
+Description: PRC Mainland Chinese in simplified script
+Added: 2005-04-13
+%%
+Type: redundant
+Tag: zh-Hans-HK
+Description: Hong Kong Chinese in simplified script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hans-MO
+Description: Macao Chinese in simplified script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hans-SG
+Description: Singapore Chinese in simplified script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hans-TW
+Description: Taiwan Chinese in simplified script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hant
+Description: traditional Chinese
+Added: 2003-05-30
+%%
+Type: redundant
+Tag: zh-Hant-CN
+Description: PRC Mainland Chinese in traditional script
+Added: 2005-04-13
+%%
+Type: redundant
+Tag: zh-Hant-HK
+Description: Hong Kong Chinese in traditional script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hant-MO
+Description: Macao Chinese in traditional script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hant-SG
+Description: Singapore Chinese in traditional script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-Hant-TW
+Description: Taiwan Chinese in traditional script
+Added: 2005-04-11
+%%
+Type: redundant
+Tag: zh-wuu
+Description: Shanghaiese or Wu
+Added: 1999-12-18
+Deprecated: 2009-07-29
+Preferred-Value: wuu
+%%
+Type: redundant
+Tag: zh-yue
+Description: Cantonese
+Added: 1999-12-18
+Deprecated: 2009-07-29
+Preferred-Value: yue
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Properties/CustomProvider.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+/*
+ * @test
+ * @bug 8000354
+ * @summary Test
+ * @compile -XDignore.symbol.file CustomProvider.java MyXmlPropertiesProvider.java
+ * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=MyXmlPropertiesProvider CustomProvider
+ */
+
+import java.util.*;
+import java.io.*;
+
+/**
+ * Sanity test to verify that the property sun.util.spi.XmlPropertiesProvider
+ * can be used to specify a custom provider for loading/storing properties
+ * in XML format.
+ */
+public class CustomProvider {
+
+    public static void main(String[] args) throws IOException {
+        String provider = System.getProperty("sun.util.spi.XmlPropertiesProvider");
+        assertTrue(provider != null, "sun.util.spi.XmlPropertiesProvider not set");
+
+        OutputStream out = new ByteArrayOutputStream();
+        InputStream in = new ByteArrayInputStream(new byte[100]);
+
+        Properties props;
+
+        props = new Properties();
+        props.loadFromXML(in);
+
+        props = System.getProperties();
+        props.storeToXML(out, "comment");
+        props.storeToXML(out, "comment", "UTF-8");
+
+        // check that the provider's load and store methods have been invoked
+
+        assertTrue(MyXmlPropertiesProvider.createCount() == 1,
+            "Provider should only be created once");
+        assertTrue(MyXmlPropertiesProvider.loadCount() == 1,
+            "load method expected to be called once");
+        assertTrue(MyXmlPropertiesProvider.storeCount() == 2,
+             "store method expected to be called twice");
+    }
+
+    static void assertTrue(boolean b, String msg) {
+        if (!b) throw new RuntimeException(msg);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Properties/LoadAndStoreXML.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 8000354
+ * @summary Basic test of storeToXML and loadToXML
+ */
+
+import java.io.*;
+import java.util.*;
+import java.security.*;
+
+public class LoadAndStoreXML {
+
+    /**
+     * Simple policy implementation that grants a set of permissions to
+     * all code sources and protection domains.
+     */
+    static class SimplePolicy extends Policy {
+        private final Permissions perms;
+
+        public SimplePolicy(Permission...permissions) {
+            perms = new Permissions();
+            for (Permission permission : permissions)
+                perms.add(permission);
+        }
+
+        @Override
+        public PermissionCollection getPermissions(CodeSource cs) {
+            return perms;
+        }
+
+        @Override
+        public PermissionCollection getPermissions(ProtectionDomain pd) {
+            return perms;
+        }
+
+        @Override
+        public boolean implies(ProtectionDomain pd, Permission p) {
+            return perms.implies(p);
+        }
+    }
+
+    /**
+     * Sanity test that properties saved with Properties#storeToXML can be
+     * read with Properties#loadFromXML.
+     */
+    static void test() throws IOException {
+        Properties props = new Properties();
+        props.put("k1", "foo");
+        props.put("k2", "bar");
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        props.storeToXML(out, "no comment");
+
+        Properties p = new Properties();
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        p.loadFromXML(in);
+
+        if (!p.equals(props)) {
+            System.err.println("stored: " + props);
+            System.err.println("loaded: " + p);
+            throw new RuntimeException("Test failed");
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+
+        // run test without security manager
+        test();
+
+        // re-run test with security manager
+        Policy orig = Policy.getPolicy();
+        Policy p = new SimplePolicy(new RuntimePermission("setSecurityManager"),
+                                    new PropertyPermission("line.separator", "read"));
+        Policy.setPolicy(p);
+        System.setSecurityManager(new SecurityManager());
+        try {
+            test();
+        } finally {
+            // turn off security manager and restore policy
+            System.setSecurityManager(null);
+            Policy.setPolicy(orig);
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Properties/MyXmlPropertiesProvider.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2012, 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.util.*;
+import java.io.*;
+
+public class MyXmlPropertiesProvider
+    extends sun.util.spi.XmlPropertiesProvider
+{
+    private static int createCount;
+    private static int loadCount;
+    private static int storeCount;
+
+    static int createCount() { return createCount; }
+    static int loadCount() { return loadCount; }
+    static int storeCount() { return storeCount; }
+
+    public MyXmlPropertiesProvider() {
+        createCount++;
+    }
+
+    @Override
+    public void load(Properties props, InputStream in)
+        throws IOException, InvalidPropertiesFormatException
+    {
+        loadCount++;
+    }
+
+    @Override
+    public void store(Properties props, OutputStream out,
+                      String comment, String encoding)
+        throws IOException
+    {
+        storeCount++;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/ServiceLoader/NPE.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/**
+ * @test
+ * @bug 7197642
+ * @summary test ServiceLoader.load methods for NullPointerException.
+ */
+import java.util.ServiceLoader;
+import java.util.Arrays;
+
+public final class NPE {
+    static abstract class Test {
+        String name;
+
+        Test(String name) { this.name = name; }
+
+        abstract void run();
+    }
+
+    static Test load = new Test("ServiceLoader.load(null)") {
+        void run() { ServiceLoader.load(null); }
+    };
+
+    static Test loadWithClassLoader = new Test("ServiceLoader.load(null, loader)") {
+        void run() { ServiceLoader.load(null, NPE.class.getClassLoader()); }
+    };
+
+    static Test loadInstalled = new Test("ServiceLoader.loadInstalled(null)") {
+        void run() { ServiceLoader.loadInstalled(null); }
+    };
+
+    public static void main(String[] args) throws Exception {
+        for (Test t : Arrays.asList(load, loadWithClassLoader, loadInstalled)) {
+            NullPointerException caught = null;
+            try {
+                t.run();
+            } catch (NullPointerException e) {
+                caught = e;
+            }
+            if (caught == null) {
+                throw new RuntimeException("NullPointerException expected for method invocation of " + t.name);
+            }
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JColorChooser/Test7194184.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * Portions Copyright (c) 2012 IBM Corporation
+ */
+
+/*
+ * @test
+ * @bug 7194184
+ * @summary Tests JColorChooser Swatch keyboard accessibility.
+ * @author Sean Chou
+ * @library ../regtesthelpers
+ * @build Util
+ * @run main Test7194184
+ */
+
+import java.awt.Component;
+import java.awt.AWTException;
+import java.awt.Color;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+
+import javax.swing.JColorChooser;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+
+import java.util.concurrent.Callable;
+import sun.awt.SunToolkit;
+
+public class Test7194184 implements Runnable {
+    private static JFrame frame;
+    private static JColorChooser colorChooser;
+    private static Color selectedColor;
+
+    public static void main(String[] args) throws Exception {
+        testKeyBoardAccess();
+    }
+
+    private static void testKeyBoardAccess() throws Exception {
+        Robot robot = new Robot();
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+
+        SwingUtilities.invokeLater(new Test7194184());
+        toolkit.realSync();
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                selectedColor = colorChooser.getColor();
+
+                Component recentSwatchPanel = Util.findSubComponent(colorChooser, "RecentSwatchPanel");
+                if (recentSwatchPanel == null) {
+                    throw new RuntimeException("RecentSwatchPanel not found");
+                }
+                recentSwatchPanel.requestFocusInWindow();
+            }
+        });
+
+        toolkit.realSync();
+
+        // Tab to move the focus to MainSwatch
+        Util.hitKeys(robot, KeyEvent.VK_SHIFT, KeyEvent.VK_TAB);
+
+        // Select the color on right
+        Util.hitKeys(robot, KeyEvent.VK_RIGHT);
+        Util.hitKeys(robot, KeyEvent.VK_RIGHT);
+        Util.hitKeys(robot, KeyEvent.VK_SPACE);
+        toolkit.realSync();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                frame.dispose();
+                if (selectedColor == colorChooser.getColor()) {
+                    throw new RuntimeException("JColorChooser misses keyboard accessibility");
+                }
+            }
+        });
+    }
+
+    public void run() {
+        String title = getClass().getName();
+        frame = new JFrame(title);
+        colorChooser = new JColorChooser();
+
+        frame.add(colorChooser);
+        frame.pack();
+        frame.setVisible(true);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/ToolTipManager/7123767/bug7123767.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/* @test
+   @bug 7123767
+   @summary Wrong tooltip location in Multi-Monitor configurations
+   @author Vladislav Karnaukhov
+   @run main bug7123767
+*/
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.lang.reflect.InvocationTargetException;
+
+public class bug7123767 extends JFrame {
+
+    private static class TestFactory extends PopupFactory {
+
+        private static TestFactory newFactory = new TestFactory();
+        private static PopupFactory oldFactory;
+
+        private TestFactory() {
+            super();
+        }
+
+        public static void install() {
+            if (oldFactory == null) {
+                oldFactory = getSharedInstance();
+                setSharedInstance(newFactory);
+            }
+        }
+
+        public static void uninstall() {
+            if (oldFactory != null) {
+                setSharedInstance(oldFactory);
+            }
+        }
+
+        // Actual test happens here
+        public Popup getPopup(Component owner, Component contents, int x, int y) {
+            GraphicsConfiguration mouseGC = testGC(MouseInfo.getPointerInfo().getLocation());
+            if (mouseGC == null) {
+                throw new RuntimeException("Can't find GraphicsConfiguration that mouse pointer belongs to");
+            }
+
+            GraphicsConfiguration tipGC = testGC(new Point(x, y));
+            if (tipGC == null) {
+                throw new RuntimeException("Can't find GraphicsConfiguration that tip belongs to");
+            }
+
+            if (!mouseGC.equals(tipGC)) {
+                throw new RuntimeException("Mouse and tip GCs are not equal");
+            }
+
+            return super.getPopup(owner, contents, x, y);
+        }
+
+        private static GraphicsConfiguration testGC(Point pt) {
+            GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
+            GraphicsDevice[] devices = environment.getScreenDevices();
+            for (GraphicsDevice device : devices) {
+                GraphicsConfiguration[] configs = device.getConfigurations();
+                for (GraphicsConfiguration config : configs) {
+                    Rectangle rect = config.getBounds();
+                    Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(config);
+                    adjustInsets(rect, insets);
+                    if (rect.contains(pt))
+                        return config;
+                }
+            }
+
+            return null;
+        }
+    }
+
+    private static final int MARGIN = 10;
+    private static bug7123767 frame;
+    private static Robot robot;
+
+    public static void main(String[] args) throws Exception {
+        UIManager.setLookAndFeel(new MetalLookAndFeel());
+        setUp();
+        testToolTip();
+        TestFactory.uninstall();
+    }
+
+    // Creates a window that is stretched across all available monitors
+    // and adds itself as ContainerListener to track tooltips drawing
+    private bug7123767() {
+        super();
+
+        ToolTipManager.sharedInstance().setInitialDelay(0);
+        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+        TestFactory.install();
+
+        JLabel label1 = new JLabel("no preferred location");
+        label1.setToolTipText("tip");
+        add(label1, BorderLayout.WEST);
+
+        JLabel label2 = new JLabel("preferred location (20000, 20000)") {
+            public Point getToolTipLocation(MouseEvent event) {
+                return new Point(20000, 20000);
+            }
+        };
+
+        label2.setToolTipText("tip");
+        add(label2, BorderLayout.EAST);
+
+        setUndecorated(true);
+        pack();
+
+        Rectangle rect = new Rectangle();
+        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        GraphicsDevice[] devices = environment.getScreenDevices();
+        for (GraphicsDevice device : devices) {
+            GraphicsConfiguration[] configs = device.getConfigurations();
+            for (GraphicsConfiguration config : configs) {
+                Insets localInsets = Toolkit.getDefaultToolkit().getScreenInsets(config);
+                Rectangle localRect = config.getBounds();
+                adjustInsets(localRect, localInsets);
+                rect.add(localRect);
+            }
+        }
+        setBounds(rect);
+    }
+
+    private static void setUp() throws InterruptedException, InvocationTargetException {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                frame = new bug7123767();
+                frame.setVisible(true);
+            }
+        });
+    }
+
+    // Moves mouse pointer to the corners of every GraphicsConfiguration
+    private static void testToolTip() throws AWTException {
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        toolkit.realSync();
+
+        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        GraphicsDevice[] devices = environment.getScreenDevices();
+        for (GraphicsDevice device : devices) {
+            GraphicsConfiguration[] configs = device.getConfigurations();
+            for (GraphicsConfiguration config : configs) {
+                Rectangle rect = config.getBounds();
+                Insets insets = toolkit.getScreenInsets(config);
+                adjustInsets(rect, insets);
+
+                // Upper left
+                glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
+                        rect.x + MARGIN, rect.y + MARGIN);
+                toolkit.realSync();
+
+                // Lower left
+                glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
+                        rect.x + MARGIN, rect.y + rect.height - MARGIN);
+                toolkit.realSync();
+
+                // Upper right
+                glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
+                        rect.x + rect.width - MARGIN, rect.y + MARGIN);
+                toolkit.realSync();
+
+                // Lower right
+                glide(rect.x + rect.width / 2, rect.y + rect.height / 2,
+                        rect.x + rect.width - MARGIN, rect.y + rect.height - MARGIN);
+                toolkit.realSync();
+            }
+        }
+    }
+
+    private static void glide(int x0, int y0, int x1, int y1) throws AWTException {
+        if (robot == null) {
+            robot = new Robot();
+            robot.setAutoDelay(20);
+        }
+
+        float dmax = (float) Math.max(Math.abs(x1 - x0), Math.abs(y1 - y0));
+        float dx = (x1 - x0) / dmax;
+        float dy = (y1 - y0) / dmax;
+
+        robot.mouseMove(x0, y0);
+        for (int i = 1; i <= dmax; i += 10) {
+            robot.mouseMove((int) (x0 + dx * i), (int) (y0 + dy * i));
+        }
+    }
+
+    private static void adjustInsets(Rectangle rect, final Insets insets) {
+        rect.x += insets.left;
+        rect.y += insets.top;
+        rect.width -= (insets.left + insets.right);
+        rect.height -= (insets.top + insets.bottom);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/java2d/pipe/InterpolationQualityTest.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7188093 8000176
+ * @summary Tests each of the 3 possible methods for rendering an upscaled
+ * image via rendering hints for default, xrender and opengl pipelines.
+ *
+ * @author Vadim.Pakhnushev@oracle.com
+ * @run main/othervm -Dsun.java2d.xrender=false InterpolationQualityTest
+ * @run main/othervm -Dsun.java2d.xrender=True InterpolationQualityTest
+ * @run main/othervm -Dsun.java2d.opengl=True InterpolationQualityTest
+ * @run main/othervm -Dsun.java2d.d3d=false InterpolationQualityTest
+ * @run main/othervm -Dsun.java2d.d3d=True InterpolationQualityTest
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+
+public class InterpolationQualityTest {
+
+    private static final int testSize = 4, scaleFactor = 20, tolerance = 3;
+    private static final int sw = testSize * scaleFactor;
+    private static final int sh = testSize * scaleFactor;
+
+    private Image testImage;
+    private VolatileImage vImg;
+
+    public InterpolationQualityTest() {
+        testImage = createTestImage();
+    }
+
+    private Image createTestImage() {
+        BufferedImage bi = new BufferedImage(testSize, testSize, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g = bi.createGraphics();
+        g.setColor(Color.BLACK);
+        g.fillRect(0, 0, testSize, testSize);
+        for (int i = 0; i < testSize; i++) {
+            bi.setRGB(i, i, Color.WHITE.getRGB());
+        }
+        return bi;
+    }
+
+    private BufferedImage createReferenceImage(Object hint) {
+        BufferedImage bi = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2d = bi.createGraphics();
+        drawImage(g2d, hint);
+        return bi;
+    }
+
+    private void drawImage(Graphics2D g2d, Object hint) {
+        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
+        g2d.drawImage(testImage, 0, 0, sw, sh, null);
+    }
+
+    private GraphicsConfiguration getDefaultGC() {
+        return GraphicsEnvironment.getLocalGraphicsEnvironment().
+                getDefaultScreenDevice().getDefaultConfiguration();
+    }
+
+    private void createVImg() {
+        vImg = getDefaultGC().createCompatibleVolatileImage(sw, sh);
+    }
+
+    private void renderOffscreen(Object hint) {
+        Graphics2D g = vImg.createGraphics();
+        drawImage(g, hint);
+        g.dispose();
+    }
+
+    private BufferedImage renderImage(Object hint) {
+        BufferedImage snapshot;
+        createVImg();
+        renderOffscreen(hint);
+
+        do {
+            int status = vImg.validate(getDefaultGC());
+            if (status != VolatileImage.IMAGE_OK) {
+                if (status == VolatileImage.IMAGE_INCOMPATIBLE) {
+                    createVImg();
+                }
+                renderOffscreen(hint);
+            }
+            snapshot = vImg.getSnapshot();
+        } while (vImg.contentsLost());
+        vImg.flush();
+        return snapshot;
+    }
+
+    private boolean compareComponent(int comp1, int comp2) {
+        return Math.abs(comp1 - comp2) <= tolerance;
+    }
+
+    private boolean compareRGB(int rgb1, int rgb2) {
+        Color col1 = new Color(rgb1);
+        Color col2 = new Color(rgb2);
+        return compareComponent(col1.getRed(), col2.getRed()) &&
+                compareComponent(col1.getBlue(), col2.getBlue()) &&
+                compareComponent(col1.getGreen(), col2.getGreen()) &&
+                compareComponent(col1.getAlpha(), col2.getAlpha());
+    }
+
+    private boolean compareImages(BufferedImage img, BufferedImage ref, String imgName) {
+        for (int y = 0; y < ref.getHeight(); y++) {
+            for (int x = 0; x < ref.getWidth(); x++) {
+                if (!compareRGB(ref.getRGB(x, y), img.getRGB(x, y))) {
+                    System.out.println(imgName + ".getRGB(" + x + ", " + y + ") = "
+                            + new Color(img.getRGB(x, y)) + " != "
+                            + new Color(ref.getRGB(x, y)));
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    private boolean test(Object hint) {
+        BufferedImage refImage = createReferenceImage(hint);
+        BufferedImage resImage = renderImage(hint);
+
+        boolean passed = compareImages(resImage, refImage, "resImage");
+        System.out.println(getHintName(hint) + (passed ? " passed." : " failed."));
+        if (!passed) {
+            dumpImage(refImage, "out_" + getHintName(hint) + "_ref.png");
+            dumpImage(resImage, "out_" + getHintName(hint) + ".png");
+        }
+        return passed;
+    }
+
+    public void test() {
+        boolean passed = true;
+        passed &= test(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
+        passed &= test(RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        passed &= test(RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+        if (passed) {
+            System.out.println("Test PASSED.");
+        } else {
+            throw new RuntimeException("Test FAILED.");
+        }
+    }
+
+    private String getHintName(Object hint) {
+        if (hint == RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR) {
+            return "nearest";
+        }
+        else if (hint == RenderingHints.VALUE_INTERPOLATION_BILINEAR) {
+            return "bilinear";
+        }
+        else if (hint == RenderingHints.VALUE_INTERPOLATION_BICUBIC) {
+            return "bicubic";
+        }
+        else {
+            return "null";
+        }
+    }
+
+    private void dumpImage(BufferedImage bi, String name) {
+        try {
+            ImageIO.write(bi, "PNG", new File(name));
+        } catch (IOException ex) {
+        }
+    }
+
+    public static void main(String[] argv) {
+        InterpolationQualityTest test = new InterpolationQualityTest();
+        test.test();
+    }
+}
--- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopDoSomething.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopDoSomething.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,17 +21,27 @@
  * questions.
  */
 
-import java.io.RandomAccessFile;
+import java.io.File;
 
 public class JMXStartStopDoSomething {
 
+    private static final String lockFileName = "JMXStartStop.lck";
 
-    public void doSomething(){
+    public static void doSomething() {
         try {
-            for (int i=0; i < 10; ++i) {
-                RandomAccessFile f = new RandomAccessFile("/dev/null","r");
-                int n = f.read();
-                f.close();
+            File lockFile = new File(lockFileName);
+            lockFile.createNewFile();
+
+            while(lockFile.exists()) {
+                long datetime = lockFile.lastModified();
+                long epoch = System.currentTimeMillis()/1000;
+
+                // Don't allow test app to run more than an hour
+                if (epoch - datetime > 3600) {
+                    System.err.println("Lock is too old. Aborting");
+                    return;
+                }
+                Thread.sleep(1);
             }
 
         } catch (Throwable e) {
@@ -41,12 +51,7 @@
 
     public static void main(String args[]) throws Exception {
         System.err.println("main enter");
-        int count = 1;
-        while(count > 0) {
-            JMXStartStopDoSomething p = new JMXStartStopDoSomething();
-            p.doSomething();
-            Thread.sleep(1);
-        }
-        // System.err.println("main exit");
+        doSomething();
+        System.err.println("main exit");
     }
 }
--- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java	Wed Jul 05 18:26:11 2017 +0200
@@ -167,14 +167,14 @@
             }
         } catch (RuntimeException r) {
             dbg_print("No connection: ", r);
-            System.out.println("NO_CONN");
+            System.out.print("NO_CONN");
             System.exit(1);
         } catch (Throwable t) {
             dbg_print("No connection: ", t);
-            System.out.println("NO_CONN");
+            System.out.print("NO_CONN");
             System.exit(2);
         }
-        System.out.println("OK_CONN");
+        System.out.print("OK_CONN");
         System.exit(0);
     }
 
--- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.sh	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -27,7 +27,6 @@
 # @run shell JMXStartStopTest.sh --jtreg --no-compile
 # @summary No word Failed expected in the test output
 
-_verbose=no
 _server=no
 _jtreg=no
 _compile=yes
@@ -39,14 +38,14 @@
 _testclasses=".classes"
 _testsrc=`pwd`
 
-_logname=".classes/JMXStartStopTest_output.txt"
-
+_logname=".classes/output.txt"
+_lockFileName="JMXStartStop.lck"
 
 _compile(){
 
     if [ ! -e ${_testclasses} ]
     then
-	  mkdir -p ${_testclasses} 
+      mkdir -p ${_testclasses} 
     fi   
 
     rm -f ${_testclasses}/JMXStartStopTest.class
@@ -62,21 +61,17 @@
 }
 
 _app_start(){
+  ${TESTJAVA}/bin/java -server $* -cp ${_testclasses} JMXStartStopDoSomething  >> ${_logname} 2>&1 &
 
-  if [ "${_verbose}" = "yes" ]
-  then
-     echo "RUN: ${TESTJAVA}/bin/java -server $* -cp ${_testclasses} JMXStartStopDoSomething "
-  fi 
-  ${TESTJAVA}/bin/java -server $* -cp ${_testclasses} JMXStartStopDoSomething  >> ${_logname} 2>&1 &
-  sleep 1 
-
-  pid=`_get_pid`
-  if [ "x${pid}" = "x" ]
+  npid=`_get_pid`
+  if [ "${npid}" = "" ]
   then
      echo "ERROR: Test app not started"
-     exit -1
+     if [ "${_jtreg}" = "yes" ]
+     then
+       exit -1
+     fi  
   fi
-
 }
 
 _get_pid(){
@@ -84,32 +79,36 @@
 }
 
 _app_stop(){
-    pid=`_get_pid`
-    if [ "x${pid}" != "x" ]
-    then
-       kill $pid
-    fi
+  rm ${_lockFileName}
 
-    # Stop on first failed test under jtreg
-    if [ "x$1" = "xFailed" -a "${_jtreg}" = "yes" ]
+  # wait until VM is actually shuts down
+  while true 
+  do
+    npid=`_get_pid`
+    if [ "${npid}" = "" ] 
     then
-      exit -1
+      break
     fi
+    sleep 1
+  done 
 }
-   
-testme(){
-    ${TESTJAVA}/bin/java -cp ${_testclasses} JMXStartStopTest $*
+
+_exit_on_jtreg(){
+  # Stop on first failed test under jtreg
+  if [ "${_jtreg}" = "yes" ]
+  then
+      _app_stop
+      exit -1
+  fi
+}
+
+_testme(){
+  ${TESTJAVA}/bin/java -cp ${_testclasses} JMXStartStopTest $*
 }   
 
   
 _jcmd(){
-  if [ "${_verbose}" = "yes" ]
-  then
-     echo "RUN: ${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $*"
-     ${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $* 
-  else
-     ${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $* > /dev/null 2>/dev/null
-  fi
+  ${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $* > /dev/null 2>/dev/null
 } 
 
 _echo(){
@@ -122,139 +121,136 @@
 test_01(){
 # Run an app with JMX enabled stop it and 
 # restart on other port
-		
-    _echo "**** Test one ****"		
+        
+    _echo "**** Test one ****"      
 
     _app_start  -Dcom.sun.management.jmxremote.port=$1 \
                 -Dcom.sun.management.jmxremote.authenticate=false \
-	        -Dcom.sun.management.jmxremote.ssl=false 
+                -Dcom.sun.management.jmxremote.ssl=false 
 
-    res1=`testme $1`
+    res1=`_testme $1`
 
     _jcmd ManagementAgent.stop
 
-    res2=`testme $1`
+    res2=`_testme $1`
 
     _jcmd ManagementAgent.start jmxremote.port=$2
 
-    res3=`testme $2`
-
+    res3=`_testme $2`
 
     if [ "${res1}" = "OK_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] 
     then
-	_echo "Passed"
+        _echo "Passed"
     else
-	_echo "Failed r1(OK):${res1} r2(NO):${res2} r3(OK):${res3}"
-    _app_stop "Failed"
+        _echo "Failed r1(OK):${res1} r2(NO):${res2} r3(OK):${res3}"
+        _exit_on_jtreg
     fi
 
     _app_stop
-
 }  
    
 test_02(){
 # Run an app without JMX enabled 
 # start JMX by jcmd
 
-_echo "**** Test two ****"		
-_app_start  
+    _echo "**** Test two ****"      
+    _app_start  
 
-_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
 
-res1=`testme $1`
+    res1=`_testme $1`
 
-if [ "${res1}" = "OK_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(OK):${res1}"
-    _app_stop "Failed"
-fi
-
-_app_stop
-
+    if [ "${res1}" = "OK_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(OK):${res1}"
+        _exit_on_jtreg
+    fi
+    _app_stop
 }   
    
 test_03(){
 # Run an app without JMX enabled 
 # start JMX by jcmd on one port than on other one
 
-_echo "**** Test three ****"		
-_app_start  
+    _echo "**** Test three ****"        
+    _app_start  
 
-_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
 
 # Second agent shouldn't start
-_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
+    _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
 
 # First agent should connect
-res1=`testme $1`
+    res1=`_testme $1`
 
-if [ "${res1}" = "OK_CONN" ] 
-then
-    _echo "Passed $1"
-else
-    _echo "Failed r1(NO):${res1}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "OK_CONN" ] 
+    then
+        _echo "Passed $1"
+    else
+        _echo "Failed r1(NO):${res1}"
+        _exit_on_jtreg
+    fi
 
 #Second agent shouldn't connect
-res1=`testme $2`
+    res1=`_testme $2`
 
-if [ "${res1}" = "NO_CONN" ] 
-then
-    _echo "Passed $2"
-else
-    _echo "Failed r1(OK):${res1}"
-fi
+    if [ "${res1}" = "NO_CONN" ] 
+    then
+        _echo "Passed $2"
+    else
+        _echo "Failed r1(OK):${res1}"
+        _exit_on_jtreg
+    fi
 
-_app_stop
+    _app_stop
 }   
    
 test_04(){
 # Run an app without JMX enabled 
 # start JMX by jcmd on one port, specify rmi port explicitly
 
-_echo "**** Test four ****"		
-_app_start  
+    _echo "**** Test four ****"     
+    _app_start  
 
-_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false 
 
 # First agent should connect
-res1=`testme $1 $2`
+    res1=`_testme $1 $2`
 
-if [ "${res1}" = "OK_CONN" ] 
-then
-    _echo "Passed $1 $2"
-else
-    _echo "Failed r1(NO):${res1}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "OK_CONN" ] 
+    then
+        _echo "Passed $1 $2"
+    else
+        _echo "Failed r1(NO):${res1}"
+        _exit_on_jtreg
+    fi
 
-_app_stop
+    _app_stop
 }   
 
 test_05(){
 # Run an app without JMX enabled, it will enable local server
 # but should leave remote server disabled  
 
-_echo "**** Test five ****"		
-_app_start  
+    _echo "**** Test five ****"     
+    _app_start  
 
-_jcmd ManagementAgent.start jmxremote=1 
+    _jcmd ManagementAgent.start jmxremote=1 
 
-# First agent should connect
-res1=`testme $1`
+    # First agent should connect
+    res1=`_testme $1`
 
-if [ "${res1}" = "NO_CONN" ] 
-then
-    _echo "Passed $1 $2"
-else
-    _echo "Failed r1(OK):${res1}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" ] 
+    then
+        _echo "Passed $1 $2"
+    else
+        _echo "Failed r1(OK):${res1}"
+        _exit_on_jtreg
+    fi
 
-_app_stop
+    _app_stop
 }   
 
 test_06(){
@@ -264,35 +260,35 @@
 # 1) with the same port 
 # 2) with other port
 # 3) attempt to stop it twice
-# Check for valid messages in the output	
+# Check for valid messages in the output    
 
-_echo "**** Test six ****"		
-_app_start  
+    _echo "**** Test six ****"      
+    _app_start  
 
-_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
 
-# First agent should connect
-res1=`testme $1 $2`
+    # First agent should connect
+    res1=`_testme $1 $2`
 
-if [ "${res1}" = "OK_CONN" ] 
-then
-    _echo "Passed $1 $2"
-else
-    _echo "Failed r1(NO):${res1}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "OK_CONN" ] 
+    then
+        _echo "Passed $1 $2"
+    else
+        _echo "Failed r1(NO):${res1}"
+        _exit_on_jtreg
+    fi
 
-_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false 
 
-_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false 
 
-_jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.stop
 
-_jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.stop
 
-_jcmd ManagementAgent.start jmxremote.port=22 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false 
+    _jcmd ManagementAgent.start jmxremote.port=22 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false 
 
-_app_stop
+    _app_stop
 }   
 
 test_07(){
@@ -300,27 +296,26 @@
 # in command line.
 # make sure these properties overriden corectly 
 
-_echo "**** Test seven ****"		
-
-_app_start   -Dcom.sun.management.jmxremote.authenticate=false \
-             -Dcom.sun.management.jmxremote.ssl=true 
+    _echo "**** Test seven ****"        
 
-res1=`testme $1`
+    _app_start   -Dcom.sun.management.jmxremote.authenticate=false \
+                 -Dcom.sun.management.jmxremote.ssl=true 
 
-_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
+    res1=`_testme $1`
 
-res2=`testme $2`
+    _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
 
+    res2=`_testme $2`
 
-if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ] 
-then
-   echo "Passed"
-else
-	_echo "Failed r1(NO):${res1} r2(OK):${res2}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ] 
+    then
+        echo "Passed"
+    else
+        _echo "Failed r1(NO):${res1} r2(OK):${res2}"
+        _exit_on_jtreg
+    fi
 
-_app_stop
+    _app_stop
 }   
 
 test_08(){
@@ -329,32 +324,31 @@
 # stop JMX agent and then start it again with different property values
 # make sure these properties overriden corectly 
 
-_echo "**** Test eight ****"		
+    _echo "**** Test eight ****"        
 
-_app_start  -Dcom.sun.management.jmxremote.port=$1 \
-	    -Dcom.sun.management.jmxremote.authenticate=false \
-	    -Dcom.sun.management.jmxremote.ssl=true 
+    _app_start  -Dcom.sun.management.jmxremote.port=$1 \
+                -Dcom.sun.management.jmxremote.authenticate=false \
+                -Dcom.sun.management.jmxremote.ssl=true 
 
-res1=`testme $1`
+    res1=`_testme $1`
 
-_jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.stop
 
-res2=`testme $1`
+    res2=`_testme $1`
 
-_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
+    _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
 
-res3=`testme $2`
-
+    res3=`_testme $2`
 
-if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}"
+        _exit_on_jtreg
+    fi
  
-_app_stop
+    _app_stop
 }   
 
 test_09(){
@@ -365,31 +359,31 @@
 # in command line
 # make sure these properties overriden corectly 
 
-_echo "**** Test nine ****"		
+    _echo "**** Test nine ****"     
 
-_app_start -Dcom.sun.management.config.file=${_testsrc}/management_cl.properties \
-           -Dcom.sun.management.jmxremote.authenticate=false 
+    _app_start -Dcom.sun.management.config.file=${_testsrc}/management_cl.properties \
+               -Dcom.sun.management.jmxremote.authenticate=false 
 
-res1=`testme $1`
+    res1=`_testme $1`
 
-_jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.stop
 
-res2=`testme $1`
+    res2=`_testme $1`
 
-_jcmd ManagementAgent.start config.file=${_testsrc}/management_jcmd.properties \
-       jmxremote.authenticate=false jmxremote.port=$2
+    _jcmd ManagementAgent.start config.file=${_testsrc}/management_jcmd.properties \
+                                jmxremote.authenticate=false jmxremote.port=$2
 
-res3=`testme $2`
+    res3=`_testme $2`
 
-if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}"
+        _exit_on_jtreg
+    fi
  
-_app_stop
+    _app_stop
 }   
 
 test_10(){
@@ -399,34 +393,34 @@
 # stop JMX agent again and then start it without property value
 # make sure these properties overriden corectly 
 
-_echo "**** Test ten ****"		
+    _echo "**** Test ten ****"      
 
-_app_start  -Dcom.sun.management.jmxremote.port=$1 \
-	    -Dcom.sun.management.jmxremote.authenticate=false \
-	    -Dcom.sun.management.jmxremote.ssl=true 
+    _app_start  -Dcom.sun.management.jmxremote.port=$1 \
+                -Dcom.sun.management.jmxremote.authenticate=false \
+                -Dcom.sun.management.jmxremote.ssl=true 
 
-res1=`testme $1`
+    res1=`_testme $1`
 
-_jcmd ManagementAgent.stop
-_jcmd ManagementAgent.start jmxremote.ssl=false jmxremote.port=$1
+    _jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.start jmxremote.ssl=false jmxremote.port=$1
 
 
-res2=`testme $1`
+    res2=`_testme $1`
 
-_jcmd ManagementAgent.stop
-_jcmd ManagementAgent.start jmxremote.port=$1
+    _jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.start jmxremote.port=$1
 
-res3=`testme $1`
+    res3=`_testme $1`
 
-if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" -a "${res3}" = "NO_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(NO):${res1} r2(OK):${res2} r3(NO):${res3}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" -a "${res3}" = "NO_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(NO):${res1} r2(OK):${res2} r3(NO):${res3}"
+        _exit_on_jtreg
+    fi
  
-_app_stop
+    _app_stop
 }   
 
 test_11(){
@@ -434,102 +428,87 @@
 # stop remote agent 
 # make sure local agent is not affected
 
-_echo "**** Test eleven ****"		
+    _echo "**** Test eleven ****"       
 
-_app_start  -Dcom.sun.management.jmxremote.port=$2 \
-	    -Dcom.sun.management.jmxremote.authenticate=false \
-	    -Dcom.sun.management.jmxremote.ssl=false 
-	  
-res1=`testme $2`
+    _app_start  -Dcom.sun.management.jmxremote.port=$2 \
+                -Dcom.sun.management.jmxremote.authenticate=false \
+                -Dcom.sun.management.jmxremote.ssl=false 
+      
+    res1=`_testme $2`
 
-_jcmd ManagementAgent.stop
+    _jcmd ManagementAgent.stop
 
-pid=`${TESTJAVA}/bin/jps | sed -n "/JMXStartStopDoSomething/s/ .*//p"`
-res2=`testme local ${pid}`
+    pid=`${TESTJAVA}/bin/jps | sed -n "/JMXStartStopDoSomething/s/ .*//p"`
+    res2=`_testme local ${pid}`
 
-if [ "${res1}" = "OK_CONN" -a "${res2}" = "OK_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(OK):${res1} r2(OK):${res2}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "OK_CONN" -a "${res2}" = "OK_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(OK):${res1} r2(OK):${res2}"
+        _exit_on_jtreg
+    fi
  
-_app_stop
+    _app_stop
 }   
 
 test_12(){
 # Run an app with JMX disabled 
 # start local agent only
 
-_echo "**** Test twelve ****"		
+    _echo "**** Test twelve ****"       
 
-_app_start 
-	  
-res1=`testme $1`
+    _app_start 
+      
+    res1=`_testme $1`
 
-_jcmd ManagementAgent.start_local
+    _jcmd ManagementAgent.start_local
 
-pid=`_get_pid`
-if [ "x${pid}" = "x" ]
-then
-  res2="NO_CONN"
-else
-  res2=`testme local ${pid}`
-fi
+    pid=`_get_pid`
+    if [ "x${pid}" = "x" ]
+    then
+        res2="NO_CONN"
+    else
+        res2=`_testme local ${pid}`
+    fi
 
-if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(NO):${res1} r2(OK):${res2}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(NO):${res1} r2(OK):${res2}"
+        _exit_on_jtreg
+    fi
  
-_app_stop
+    _app_stop
 }   
 
 test_13(){
 # Run an app with -javaagent make sure it works as expected - system properties are ignored
 
-_echo "**** Test 13 ****"		
-
-AGENT="${TESTJAVA}/jre/lib/management-agent.jar"
-if [ ! -f ${AGENT} ]
- then
-  AGENT="${TESTJAVA}/lib/management-agent.jar"
-fi
+    _echo "**** Test thirteen ****"       
+			   
+    AGENT="${TESTJAVA}/jre/lib/management-agent.jar"
+    if [ ! -f ${AGENT} ]
+    then
+        AGENT="${TESTJAVA}/lib/management-agent.jar"
+    fi
 
-_app_start -javaagent:${AGENT}=com.sun.management.jmxremote.port=$1,com.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 
-	  
-res1=`testme $1`
+    _app_start -javaagent:${AGENT}=com.sun.management.jmxremote.port=$1,com.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 
+      
+    res1=`_testme $1`
 
-if [ "${res1}" = "NO_CONN" ] 
-then
-    _echo "Passed"
-else
-    _echo "Failed r1(NO):${res1}"
-    _app_stop "Failed"
-fi
+    if [ "${res1}" = "NO_CONN" ] 
+    then
+        _echo "Passed"
+    else
+        _echo "Failed r1(NO):${res1}"
+        _exit_on_jtreg
+    fi
  
-_app_stop
+    _app_stop
 }   
 
-
-#============== Server tests =======================
-
-server_test_01(){
-		
-    _echo "**** Server test one ****"		
-
-    _app_start  -Dcom.sun.management.jmxremote.port=$1 \
-                -Dcom.sun.management.jmxremote.rmi.port=$2 \
-                -Dcom.sun.management.jmxremote.authenticate=false \
-                -Dcom.sun.management.jmxremote.ssl=false 
-
-}  
-
- 
 # ============= MAIN =======================================
 
 if [ "x${TESTJAVA}" = "x" ]
@@ -542,11 +521,6 @@
 then
   echo "${TESTJAVA}/bin/jcmd"
   echo "Doesn't exist or not an executable"
-
-  if [ "${_verbose}" != "yes" ]
-  then
-    exit
-  fi
 fi
 
 
@@ -556,8 +530,6 @@
 for parm in "$@"  
 do
    case $parm in
-  --verbose)      _verbose=yes  ;;
-  --server)       _server=yes   ;;
   --jtreg)        _jtreg=yes    ;;
   --no-compile)   _compile=no   ;;
   --testsuite=*)  _testsuite=`_echo $parm | sed "s,^--.*=\(.*\),\1,"`  ;;
@@ -584,20 +556,10 @@
 
 rm -f ${_logname}
 
-# Start server mode tests
-# All of them require manual cleanup
-if [ "x${_server}" = "xyes" ]
-then
-  
- server_test_01 ${_port_one} ${_port_two}
-
-else
+# Local mode tests
+for i in `echo ${_testsuite} | sed -e "s/,/ /g"`
+do
+  test_${i} ${_port_one} ${_port_two}
+done
 
- # Local mode tests
- for i in `echo ${_testsuite} | sed -e "s/,/ /g"`
- do
-  test_${i} ${_port_one} ${_port_two}
- done
 
-fi
-
--- a/jdk/test/sun/management/jmxremote/startstop/REMOTE_TESTING.txt	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/sun/management/jmxremote/startstop/REMOTE_TESTING.txt	Wed Jul 05 18:26:11 2017 +0200
@@ -2,7 +2,15 @@
 2. Make sure tcp connection between them works
 3. run tcpdump -i <interface> host <host2_name> and 'tcp[13] & 2!=0'
    on host 1
-4. run JMXStartStopTest.sh --server on host2
+4. run 
+
+   ${TESTJAVA}/bin/java -server JMXStartStopDoSomething \
+   -Dcom.sun.management.jmxremote.port=50234 \
+   -Dcom.sun.management.jmxremote.rmi.port=50235 \
+   -Dcom.sun.management.jmxremote.authenticate=false \
+   -Dcom.sun.management.jmxremote.ssl=false
+
+    on host2
 5. run jconsole on host1
 6. connect jconsole to host2:50234
    Make sure jconsole works
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/UseCacheAndStoreKey.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7201053
+ * @summary Krb5LoginModule shows NPE when both useTicketCache and storeKey
+ *          are set to true
+ * @compile -XDignore.symbol.file UseCacheAndStoreKey.java
+ * @run main/othervm UseCacheAndStoreKey
+ */
+
+import java.io.FileOutputStream;
+import javax.security.auth.login.LoginException;
+
+// The basic krb5 test skeleton you can copy from
+public class UseCacheAndStoreKey {
+
+    public static void main(String[] args) throws Exception {
+
+        new OneKDC(null).writeJAASConf();
+
+        // KDC would save ccache for client
+        System.setProperty("test.kdc.save.ccache", "cache.here");
+        try (FileOutputStream fos = new FileOutputStream(OneKDC.JAAS_CONF)) {
+            fos.write((
+                "me {\n" +
+                "    com.sun.security.auth.module.Krb5LoginModule required\n" +
+                "    principal=\"" + OneKDC.USER + "\"\n" +
+                "    useTicketCache=true\n" +
+                "    ticketCache=cache.here\n" +
+                "    isInitiator=true\n" +
+                "    storeKey=true;\n};\n"
+                ).getBytes());
+        }
+
+        // The first login will use default callback and succeed
+        Context.fromJAAS("me");
+
+        // The second login uses ccache and won't be able to store the keys
+        try {
+            Context.fromJAAS("me");
+            throw new Exception("Should fail");
+        } catch (LoginException le) {
+            if (le.getMessage().indexOf("NullPointerException") >= 0
+                    || le.getCause() instanceof NullPointerException) {
+                throw new Exception("NPE");
+            }
+        }
+    }
+}
--- a/jdk/test/sun/security/provider/X509Factory/BigCRL.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/sun/security/provider/X509Factory/BigCRL.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,7 +25,7 @@
  * @test
  * @bug 7099399
  * @summary cannot deal with CRL file larger than 16MB
- * @run main/othervm -Xmx1024m BigCRL
+ * @run main/othervm -Xshare:off -Xmx1024m BigCRL
  */
 
 import java.io.FileInputStream;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/CertRequestOverflow.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,402 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+//
+// SunJSSE does not support dynamic system properties, no way to re-use
+// system properties in samevm/agentvm mode.
+//
+
+/*
+ * @test
+ * @bug 7200295
+ * @summary CertificateRequest message is wrapping when using large
+ *          numbers of Certs
+ * @run main/othervm CertRequestOverflow
+ */
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import javax.net.ssl.*;
+import java.security.cert.*;
+import java.security.*;
+
+public class CertRequestOverflow {
+
+    /*
+     * =============================================================
+     * Set the various variables needed for the tests, then
+     * specify what tests to run on each side.
+     */
+
+    /*
+     * Should we run the client or server in a separate thread?
+     * Both sides can throw exceptions, but do you have a preference
+     * as to which side should be the main thread.
+     */
+    static boolean separateServerThread = false;
+
+    /*
+     * Where do we find the keystores?
+     */
+    static String pathToStores = "../../../../../../../etc";
+    static String keyStoreFile = "keystore";
+    static String trustStoreFile = "truststore";
+    static String passwd = "passphrase";
+    private final static char[] cpasswd = "passphrase".toCharArray();
+
+    /*
+     * Is the server ready to serve?
+     */
+    volatile static boolean serverReady = false;
+
+    /*
+     * Turn on SSL debugging?
+     */
+    static boolean debug = false;
+
+    /*
+     * If the client or server is doing some kind of object creation
+     * that the other side depends on, and that thread prematurely
+     * exits, you may experience a hang.  The test harness will
+     * terminate all hung threads after its timeout has expired,
+     * currently 3 minutes by default, but you might try to be
+     * smart about it....
+     */
+
+    /*
+     * Define the server side of the test.
+     *
+     * If the server prematurely exits, serverReady will be set to true
+     * to avoid infinite hangs.
+     */
+    void doServerSide() throws Exception {
+        SSLServerSocketFactory sslssf =
+                                getContext(true).getServerSocketFactory();
+        SSLServerSocket sslServerSocket =
+            (SSLServerSocket) sslssf.createServerSocket(serverPort);
+        serverPort = sslServerSocket.getLocalPort();
+
+        // enable endpoint identification
+        // ignore, we may test the feature when known how to parse client
+        // hostname
+        //SSLParameters params = sslServerSocket.getSSLParameters();
+        //params.setEndpointIdentificationAlgorithm("HTTPS");
+        //sslServerSocket.setSSLParameters(params);
+
+        /*
+         * Signal Client, we're ready for his connect.
+         */
+        serverReady = true;
+
+        SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
+        sslSocket.setNeedClientAuth(true);
+        InputStream sslIS = sslSocket.getInputStream();
+        OutputStream sslOS = sslSocket.getOutputStream();
+
+        try {
+            sslIS.read();
+            sslOS.write(85);
+            sslOS.flush();
+
+            throw new Exception("SERVER TEST FAILED!  " +
+                        "It is expected to fail with field length overflow");
+        } catch (SSLException ssle) {
+            Throwable cause = ssle.getCause();
+            if (!(cause instanceof RuntimeException)) {
+                System.out.println("We are expecting a RuntimeException!");
+                throw ssle;
+            }
+            System.out.println("The expected exception!  " + ssle);
+        } finally {
+            sslSocket.close();
+        }
+
+        System.out.println("SERVER TEST PASSED!");
+    }
+
+    /*
+     * Define the client side of the test.
+     *
+     * If the server prematurely exits, serverReady will be set to true
+     * to avoid infinite hangs.
+     */
+    void doClientSide() throws Exception {
+
+        /*
+         * Wait for server to get started.
+         */
+        while (!serverReady) {
+            Thread.sleep(50);
+        }
+
+        SSLSocketFactory sslsf = getContext(false).getSocketFactory();
+        SSLSocket sslSocket = (SSLSocket)
+            sslsf.createSocket("localhost", serverPort);
+
+        // enable endpoint identification
+        SSLParameters params = sslSocket.getSSLParameters();
+        params.setEndpointIdentificationAlgorithm("HTTPS");
+        sslSocket.setSSLParameters(params);
+
+        InputStream sslIS = sslSocket.getInputStream();
+        OutputStream sslOS = sslSocket.getOutputStream();
+
+        try {
+            sslOS.write(280);
+            sslOS.flush();
+            sslIS.read();
+        } catch (SSLException ssle) {
+            System.out.println("An expected exception!");
+        } finally {
+            sslSocket.close();
+        }
+    }
+
+    MyExtendedX509TM serverTM;
+    MyExtendedX509TM clientTM;
+
+    private SSLContext getContext(boolean server) throws Exception {
+        String keyFilename =
+            System.getProperty("test.src", "./") + "/" + pathToStores +
+                "/" + keyStoreFile;
+        String trustFilename =
+            System.getProperty("test.src", "./") + "/" + pathToStores +
+                "/" + trustStoreFile;
+
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+        KeyStore ks = KeyStore.getInstance("JKS");
+        ks.load(new FileInputStream(keyFilename), cpasswd);
+        kmf.init(ks, cpasswd);
+
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+        KeyStore ts = KeyStore.getInstance("JKS");
+        ts.load(new FileInputStream(trustFilename), cpasswd);
+        tmf.init(ts);
+
+        TrustManager tms[] = tmf.getTrustManagers();
+        if (tms == null || tms.length == 0) {
+            throw new Exception("unexpected trust manager implementation");
+        } else {
+           if (!(tms[0] instanceof X509TrustManager)) {
+            throw new Exception("unexpected trust manager implementation: "
+                                + tms[0].getClass().getCanonicalName());
+           }
+        }
+
+        if (server) {
+            serverTM = new MyExtendedX509TM((X509TrustManager)tms[0]);
+
+            tms = new TrustManager[] {serverTM};
+        } else {
+            clientTM = new MyExtendedX509TM((X509TrustManager)tms[0]);
+
+            tms = new TrustManager[] {clientTM};
+        }
+
+        SSLContext ctx = SSLContext.getInstance("TLS");
+        ctx.init(kmf.getKeyManagers(), tms, null);
+
+        return ctx;
+    }
+
+    static class MyExtendedX509TM extends X509ExtendedTrustManager
+            implements X509TrustManager {
+
+        X509TrustManager tm;
+
+        boolean clientChecked;
+        boolean serverChecked;
+
+        MyExtendedX509TM(X509TrustManager tm) {
+            clientChecked = false;
+            serverChecked = false;
+
+            this.tm = tm;
+        }
+
+        public boolean wasClientChecked() {
+            return clientChecked;
+        }
+
+        public boolean wasServerChecked() {
+            return serverChecked;
+        }
+
+
+        public void checkClientTrusted(X509Certificate chain[], String authType)
+                throws CertificateException {
+            tm.checkClientTrusted(chain, authType);
+        }
+
+        public void checkServerTrusted(X509Certificate chain[], String authType)
+                throws CertificateException {
+            tm.checkServerTrusted(chain, authType);
+        }
+
+        public X509Certificate[] getAcceptedIssuers() {
+            // (hack code) increase the size of the returned array to make a
+            // overflow CertificateRequest.
+            List<X509Certificate> issuersList = new LinkedList<>();
+            X509Certificate[] issuers = tm.getAcceptedIssuers();
+            for (int i = 0; i < 800; i += issuers.length) {
+                for (X509Certificate issuer : issuers) {
+                    issuersList.add(issuer);
+                }
+            }
+
+            return issuersList.toArray(issuers);
+        }
+
+        public void checkClientTrusted(X509Certificate[] chain, String authType,
+                Socket socket) throws CertificateException {
+            clientChecked = true;
+            tm.checkClientTrusted(chain, authType);
+        }
+
+        public void checkServerTrusted(X509Certificate[] chain, String authType,
+                Socket socket) throws CertificateException {
+            serverChecked = true;
+            tm.checkServerTrusted(chain, authType);
+        }
+
+        public void checkClientTrusted(X509Certificate[] chain, String authType,
+            SSLEngine engine) throws CertificateException {
+            clientChecked = true;
+            tm.checkClientTrusted(chain, authType);
+        }
+
+        public void checkServerTrusted(X509Certificate[] chain, String authType,
+            SSLEngine engine) throws CertificateException {
+            serverChecked = true;
+            tm.checkServerTrusted(chain, authType);
+        }
+    }
+
+    /*
+     * =============================================================
+     * The remainder is just support stuff
+     */
+
+    // use any free port by default
+    volatile int serverPort = 0;
+
+    volatile Exception serverException = null;
+    volatile Exception clientException = null;
+
+    public static void main(String[] args) throws Exception {
+
+        if (debug)
+            System.setProperty("javax.net.debug", "all");
+
+        /*
+         * Start the tests.
+         */
+        new CertRequestOverflow();
+    }
+
+    Thread clientThread = null;
+    Thread serverThread = null;
+
+    /*
+     * Primary constructor, used to drive remainder of the test.
+     *
+     * Fork off the other side, then do your work.
+     */
+    CertRequestOverflow() throws Exception {
+        if (separateServerThread) {
+            startServer(true);
+            startClient(false);
+        } else {
+            startClient(true);
+            startServer(false);
+        }
+
+        /*
+         * Wait for other side to close down.
+         */
+        if (separateServerThread) {
+            serverThread.join();
+        } else {
+            clientThread.join();
+        }
+
+        /*
+         * When we get here, the test is pretty much over.
+         *
+         * If the main thread excepted, that propagates back
+         * immediately.  If the other thread threw an exception, we
+         * should report back.
+         */
+        if (serverException != null)
+            throw serverException;
+        if (clientException != null)
+            throw clientException;
+    }
+
+    void startServer(boolean newThread) throws Exception {
+        if (newThread) {
+            serverThread = new Thread() {
+                public void run() {
+                    try {
+                        doServerSide();
+                    } catch (Exception e) {
+                        /*
+                         * Our server thread just died.
+                         *
+                         * Release the client, if not active already...
+                         */
+                        System.err.println("Server died...");
+                        serverReady = true;
+                        serverException = e;
+                    }
+                }
+            };
+            serverThread.start();
+        } else {
+            doServerSide();
+        }
+    }
+
+    void startClient(boolean newThread) throws Exception {
+        if (newThread) {
+            clientThread = new Thread() {
+                public void run() {
+                    try {
+                        doClientSide();
+                    } catch (Exception e) {
+                        /*
+              * Our client thread just died.
+                         */
+                        System.err.println("Client died...");
+                        clientException = e;
+                    }
+                }
+            };
+            clientThread.start();
+        } else {
+            doClientSide();
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/keytool/ListKeychainStore.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,142 @@
+#
+# Copyright (c) 2012, 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.
+#
+
+# @test
+# @bug 7133495
+# @summary [macosx] KeyChain KeyStore implementation retrieves only one private key entry
+
+if [ "${TESTJAVA}" = "" ] ; then
+    JAVAC_CMD=`which javac`
+    TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+if [ "${TESTCLASSES}" = "" ] ; then
+    TESTCLASSES=`pwd`
+fi
+
+# Only run on MacOS
+OS=`uname -s`
+case "$OS" in
+    Darwin )
+        ;;
+    * )
+        echo "Will not run test on: ${OS}"
+        exit 0;
+        ;;
+esac
+
+PWD="xxxxxx"
+KEYTOOL="${TESTJAVA}/bin/keytool -storetype KeychainStore -keystore NONE -storepass $PWD"
+TEMPORARY_P12="$TESTCLASSES/7133495.p12"
+TEMPORARY_KC="$TESTCLASSES/7133495.keychain"
+CLEANUP_P12="rm -f $TEMPORARY_P12"
+CLEANUP_KC="security delete-keychain $TEMPORARY_KC"
+
+# Count the number of private key entries in the Keychain keystores
+
+COUNT=`$KEYTOOL -list | grep PrivateKeyEntry | wc -l`
+echo "Found $COUNT private key entries in the Keychain keystores"
+
+if [ $COUNT -gt 1 ]; then
+    exit 0
+fi
+
+# Create a temporary PKCS12 keystore containing 3 public/private keypairs
+
+RESULT=`$CLEANUP_P12`
+
+for i in X Y Z
+do
+    ${TESTJAVA}/bin/keytool -genkeypair \
+        -storetype PKCS12 \
+        -keystore $TEMPORARY_P12 \
+        -storepass $PWD \
+        -dname "CN=$i,OU=$i,O=$i,ST=$i,C=US" \
+        -alias 7133495-$i
+
+    if [ $? -ne 0 ]; then
+        echo "Error: cannot create keypair $i in the temporary PKCS12 keystore"
+        RESULT=`$CLEANUP_P12`
+        exit 1
+    fi
+done
+echo "Created a temporary PKCS12 keystore: $TEMPORARY_P12"
+
+# Create a temporary keychain
+
+security create-keychain -p $PWD $TEMPORARY_KC
+if [ $? -ne 0 ]; then
+    echo "Error: cannot create the temporary keychain"
+    RESULT=`$CLEANUP_P12`
+    exit 2
+fi
+echo "Created a temporary keychain: $TEMPORARY_KC"
+
+# Unlock the temporary keychain
+
+security unlock-keychain -p $PWD $TEMPORARY_KC
+if [ $? -ne 0 ]; then
+    echo "Error: cannot unlock the temporary keychain"
+    RESULT=`$CLEANUP_P12`
+    RESULT=`$CLEANUP_KC`
+    exit 3
+fi
+echo "Unlocked the temporary keychain"
+
+# Import the keypairs from the PKCS12 keystore into the keychain
+
+security import $TEMPORARY_P12 -k $TEMPORARY_KC -f pkcs12 -P $PWD
+if [ $? -ne 0 ]; then
+    echo "Error: cannot import keypairs from PKCS12 keystore into the keychain"
+    RESULT=`$CLEANUP_P12`
+    RESULT=`$CLEANUP_KC`
+    exit 4
+fi
+echo "Imported keypairs from PKCS12 keystore into the keychain"
+
+# Recount the number of private key entries in the Keychain keystores
+
+COUNT=`$KEYTOOL -list | grep PrivateKeyEntry | wc -l`
+echo "Found $COUNT private key entries in the Keychain keystore"
+if [ $COUNT -lt 3 ]; then
+    echo "Error: expected >2 private key entries in the Keychain keystores"
+    RESULT=`$CLEANUP_P12`
+    RESULT=`$CLEANUP_KC`
+    exit 5
+fi
+
+RESULT=`$CLEANUP_P12`
+if [ $? -ne 0 ]; then
+    echo "Error: cannot remove the temporary PKCS12 keystore"
+    exit 6
+fi
+echo "Removed the temporary PKCS12 keystore"
+
+RESULT=`$CLEANUP_KC`
+if [ $? -ne 0 ]; then
+    echo "Error: cannot remove the temporary keychain"
+    exit 7
+fi
+echo "Removed the temporary keychain"
+
+exit 0
--- a/jdk/test/sun/security/tools/keytool/autotest.sh	Wed Jul 05 18:25:14 2017 +0200
+++ b/jdk/test/sun/security/tools/keytool/autotest.sh	Wed Jul 05 18:26:11 2017 +0200
@@ -58,24 +58,18 @@
     LIBNAME="/usr/lib/mps/libsoftokn3.so"
     ;;
   Linux )
-    ARCH=`uname -m`
     FS="/"
-    case "$ARCH" in
-      i[3-6]86 )
+    ${TESTJAVA}${FS}bin${FS}java -XshowSettings:properties -version 2> allprop
+    cat allprop | grep os.arch | grep 64
+    if [ "$?" != "0" ]; then
         LIBNAME=`find_one \
             "/usr/lib/libsoftokn3.so" \
             "/usr/lib/i386-linux-gnu/nss/libsoftokn3.so"`
-        ;;
-      x86_64 )
+    else
         LIBNAME=`find_one \
             "/usr/lib64/libsoftokn3.so" \
             "/usr/lib/x86_64-linux-gnu/nss/libsoftokn3.so"`
-        ;;
-      * )
-        echo "Will not run test on: Linux ${ARCH}"
-        exit 0;
-        ;;
-    esac
+    fi
     ;;
   * )
     echo "Will not run test on: ${OS}"
--- a/langtools/.hgtags	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/.hgtags	Wed Jul 05 18:26:11 2017 +0200
@@ -181,3 +181,4 @@
 86d5740b9fdc20ababb8aefde89ae1509ff216a9 jdk8-b57
 804a3fbc86e28a4d9e77c30aa0bd4aa68056f23f jdk8-b58
 f299927fc31689385f67ab7322c18eb41d8bd71e jdk8-b59
+3d2b98ffcb534b0e5be87bb1f9f68d1518ad7729 jdk8-b60
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -195,10 +195,7 @@
         ClassUseWriter clsgen;
         String path = DirectoryManager.getDirectoryPath(classdoc.
                                                             containingPackage());
-        if (path.length() > 0) {
-            path += File.separator;
-        }
-        path += "class-use";
+        path += "class-use" + DirectoryManager.URL_FILE_SEPARATOR;
         String filename = classdoc.name() + ".html";
         String pkgname = classdoc.containingPackage().name();
         pkgname += (pkgname.length() > 0)? ".class-use": "class-use";
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, 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
@@ -302,7 +302,9 @@
         Content constHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING,
                 getResource("doclet.Constants_Summary"));
         Content liConst = HtmlTree.LI(HtmlStyle.blockList, constHead);
-        Content line29 = getResource("doclet.Help_line_29");
+        Content line29 = getResource("doclet.Help_line_29",
+                getHyperLinkString("constant-values.html",
+                configuration.getText("doclet.Constants_Summary")));
         Content constPara = HtmlTree.P(line29);
         liConst.addContent(constPara);
         ul.addContent(liConst);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties	Wed Jul 05 18:26:11 2017 +0200
@@ -160,7 +160,7 @@
 doclet.Help_line_26=These links show and hide the HTML frames.  All pages are available with or without frames.
 doclet.Help_line_27=The {0} link shows all classes and interfaces except non-static nested types.
 doclet.Help_line_28=Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
-doclet.Help_line_29=The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.
+doclet.Help_line_29=The {0} page lists the static final fields and their values.
 doclet.Help_line_30=This help file applies to API documentation generated using the standard doclet.
 doclet.Help_enum_line_1=Each enum has its own separate page with the following sections:
 doclet.Help_enum_line_2=Enum declaration
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java	Wed Jul 05 18:26:11 2017 +0200
@@ -488,17 +488,18 @@
     }
 
     /**
-     * Add a traliling file separator, if not found or strip off extra trailing
-     * file separators if any.
+     * Add a trailing file separator, if not found. Remove superfluous
+     * file separators if any. Preserve the front double file separator for
+     * UNC paths.
      *
      * @param path Path under consideration.
      * @return String Properly constructed path string.
      */
-    String addTrailingFileSep(String path) {
+    public static String addTrailingFileSep(String path) {
         String fs = System.getProperty("file.separator");
         String dblfs = fs + fs;
         int indexDblfs;
-        while ((indexDblfs = path.indexOf(dblfs)) >= 0) {
+        while ((indexDblfs = path.indexOf(dblfs, 1)) >= 0) {
             path = path.substring(0, indexDblfs) +
                 path.substring(indexDblfs + fs.length());
         }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java	Wed Jul 05 18:26:11 2017 +0200
@@ -262,11 +262,7 @@
                 urls[count++] = url;
             }
         }
-        if (urls.length != count) {
-            URL[] tmp = new URL[count];
-            System.arraycopy(urls, 0, tmp, 0, count);
-            urls = tmp;
-        }
+        urls = Arrays.copyOf(urls, count);
         return urls;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java	Wed Jul 05 18:26:11 2017 +0200
@@ -136,4 +136,11 @@
         throw new IllegalStateException();
     }
 
+    /**
+     * For internal use only.  This method will be
+     * removed without warning.
+     */
+    public void updateContext(Context newContext) {
+        context = newContext;
+    }
 }
--- a/langtools/src/share/classes/com/sun/tools/javac/api/MultiTaskListener.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/MultiTaskListener.java	Wed Jul 05 18:26:11 2017 +0200
@@ -79,10 +79,8 @@
             if (ccw.unwrap(l) == listener)
                 throw new IllegalStateException();
         }
-        TaskListener[] newListeners = new TaskListener[listeners.length + 1];
-        System.arraycopy(listeners, 0, newListeners, 0, listeners.length);
-        newListeners[newListeners.length - 1] = ccw.wrap(listener);
-        listeners = newListeners;
+        listeners = Arrays.copyOf(listeners, listeners.length + 1);
+        listeners[listeners.length - 1] = ccw.wrap(listener);
     }
 
     public void remove(TaskListener listener) {
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java	Wed Jul 05 18:26:11 2017 +0200
@@ -28,6 +28,7 @@
 import java.util.EnumSet;
 import java.util.Locale;
 
+import com.sun.source.tree.MemberReferenceTree;
 import com.sun.tools.javac.api.Formattable;
 import com.sun.tools.javac.api.Messages;
 
@@ -85,11 +86,12 @@
     public static final int AMBIGUOUS    = ERRONEOUS+1; // ambiguous reference
     public static final int HIDDEN       = ERRONEOUS+2; // hidden method or field
     public static final int STATICERR    = ERRONEOUS+3; // nonstatic member from static context
-    public static final int ABSENT_VAR   = ERRONEOUS+4; // missing variable
-    public static final int WRONG_MTHS   = ERRONEOUS+5; // methods with wrong arguments
-    public static final int WRONG_MTH    = ERRONEOUS+6; // one method with wrong arguments
-    public static final int ABSENT_MTH   = ERRONEOUS+7; // missing method
-    public static final int ABSENT_TYP   = ERRONEOUS+8; // missing type
+    public static final int MISSING_ENCL = ERRONEOUS+4; // missing enclosing class
+    public static final int ABSENT_VAR   = ERRONEOUS+5; // missing variable
+    public static final int WRONG_MTHS   = ERRONEOUS+6; // methods with wrong arguments
+    public static final int WRONG_MTH    = ERRONEOUS+7; // one method with wrong arguments
+    public static final int ABSENT_MTH   = ERRONEOUS+8; // missing method
+    public static final int ABSENT_TYP   = ERRONEOUS+9; // missing type
 
     public enum KindName implements Formattable {
         ANNOTATION("kindname.annotation"),
@@ -140,6 +142,14 @@
         }
     }
 
+    public static KindName kindName(MemberReferenceTree.ReferenceMode mode) {
+        switch (mode) {
+            case INVOKE: return KindName.METHOD;
+            case NEW: return KindName.CONSTRUCTOR;
+            default : throw new AssertionError("Unexpected mode: "+ mode);
+        }
+    }
+
     /** A KindName representing a given symbol
      */
     public static KindName kindName(Symbol sym) {
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -30,6 +30,10 @@
 import com.sun.tools.javac.api.Messages;
 import com.sun.tools.javac.code.Type.*;
 import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.comp.DeferredAttr.DeferredType;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.Pretty;
+import com.sun.tools.javac.util.Assert;
 import com.sun.tools.javac.util.List;
 import com.sun.tools.javac.util.ListBuffer;
 
@@ -51,6 +55,8 @@
     List<Type> seenCaptured = List.nil();
     static final int PRIME = 997;  // largest prime less than 1000
 
+    protected Printer() { }
+
     /**
      * This method should be overriden in order to provide proper i18n support.
      *
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java	Wed Jul 05 18:26:11 2017 +0200
@@ -194,6 +194,9 @@
     public boolean allowObjectToPrimitiveCast() {
         return compareTo(JDK1_7) >= 0;
     }
+    public boolean allowPoly() {
+        return compareTo(JDK1_8) >= 0;
+    }
     public boolean allowLambda() {
         return compareTo(JDK1_8) >= 0;
     }
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java	Wed Jul 05 18:26:11 2017 +0200
@@ -168,6 +168,10 @@
         return owner;
     }
 
+    public Symbol baseSymbol() {
+        return this;
+    }
+
     /** The symbol's erased type.
      */
     public Type erasure(Types types) {
@@ -918,7 +922,12 @@
         /** Clone this symbol with new owner.
          */
         public VarSymbol clone(Symbol newOwner) {
-            VarSymbol v = new VarSymbol(flags_field, name, type, newOwner);
+            VarSymbol v = new VarSymbol(flags_field, name, type, newOwner) {
+                @Override
+                public Symbol baseSymbol() {
+                    return VarSymbol.this;
+                }
+            };
             v.pos = pos;
             v.adr = adr;
             v.data = data;
@@ -1045,7 +1054,12 @@
         /** Clone this symbol with new owner.
          */
         public MethodSymbol clone(Symbol newOwner) {
-            MethodSymbol m = new MethodSymbol(flags_field, name, type, newOwner);
+            MethodSymbol m = new MethodSymbol(flags_field, name, type, newOwner) {
+                @Override
+                public Symbol baseSymbol() {
+                    return MethodSymbol.this;
+                }
+            };
             m.code = code;
             return m;
         }
@@ -1068,6 +1082,10 @@
             }
         }
 
+        public boolean isDynamic() {
+            return false;
+        }
+
         /** find a symbol that this (proxy method) symbol implements.
          *  @param    c       The class whose members are searched for
          *                    implementations
@@ -1356,6 +1374,27 @@
         }
     }
 
+    /** A class for invokedynamic method calls.
+     */
+    public static class DynamicMethodSymbol extends MethodSymbol {
+
+        public Object[] staticArgs;
+        public Symbol bsm;
+        public int bsmKind;
+
+        public DynamicMethodSymbol(Name name, Symbol owner, int bsmKind, MethodSymbol bsm, Type type, Object[] staticArgs) {
+            super(0, name, type, owner);
+            this.bsm = bsm;
+            this.bsmKind = bsmKind;
+            this.staticArgs = staticArgs;
+        }
+
+        @Override
+        public boolean isDynamic() {
+            return true;
+        }
+    }
+
     /** A class for predefined operators.
      */
     public static class OperatorSymbol extends MethodSymbol {
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java	Wed Jul 05 18:26:11 2017 +0200
@@ -126,6 +126,7 @@
     public final Type cloneableType;
     public final Type serializableType;
     public final Type methodHandleType;
+    public final Type methodTypeType;
     public final Type nativeHeaderType;
     public final Type throwableType;
     public final Type errorType;
@@ -182,6 +183,10 @@
      */
     public final Name[] boxedName = new Name[TypeTags.TypeTagCount];
 
+    /** A set containing all operator names.
+     */
+    public final Set<Name> operatorNames = new HashSet<Name>();
+
     /** A hashtable containing the encountered top-level and member classes,
      *  indexed by flat names. The table does not contain local classes.
      *  It should be updated from the outside to reflect classes defined
@@ -243,7 +248,7 @@
                             int opcode) {
         predefClass.members().enter(
             new OperatorSymbol(
-                names.fromString(name),
+                makeOperatorName(name),
                 new MethodType(List.of(left, right), res,
                                List.<Type>nil(), methodClass),
                 opcode,
@@ -274,7 +279,7 @@
                                      Type res,
                                      int opcode) {
         OperatorSymbol sym =
-            new OperatorSymbol(names.fromString(name),
+            new OperatorSymbol(makeOperatorName(name),
                                new MethodType(List.of(arg),
                                               res,
                                               List.<Type>nil(),
@@ -285,6 +290,16 @@
         return sym;
     }
 
+    /**
+     * Create a new operator name from corresponding String representation
+     * and add the name to the set of known operator names.
+     */
+    private Name makeOperatorName(String name) {
+        Name opName = names.fromString(name);
+        operatorNames.add(opName);
+        return opName;
+    }
+
     /** Enter a class into symbol table.
      *  @param    The name of the class.
      */
@@ -440,6 +455,7 @@
         throwableType = enterClass("java.lang.Throwable");
         serializableType = enterClass("java.io.Serializable");
         methodHandleType = enterClass("java.lang.invoke.MethodHandle");
+        methodTypeType = enterClass("java.lang.invoke.MethodType");
         errorType = enterClass("java.lang.Error");
         illegalArgumentExceptionType = enterClass("java.lang.IllegalArgumentException");
         interruptedExceptionType = enterClass("java.lang.InterruptedException");
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,14 +27,19 @@
 
 import java.util.Collections;
 
+import com.sun.tools.javac.code.Symbol.*;
 import com.sun.tools.javac.util.*;
-import com.sun.tools.javac.code.Symbol.*;
+
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
 
 import javax.lang.model.type.*;
 
+import static com.sun.tools.javac.code.BoundKind.*;
 import static com.sun.tools.javac.code.Flags.*;
 import static com.sun.tools.javac.code.Kinds.*;
-import static com.sun.tools.javac.code.BoundKind.*;
 import static com.sun.tools.javac.code.TypeTags.*;
 
 /** This class represents Java types. The class itself defines the behavior of
@@ -70,6 +75,9 @@
     /** Constant type: no type at all. */
     public static final JCNoType noType = new JCNoType(NONE);
 
+    /** Constant type: special type to be used during recovery of deferred expressions. */
+    public static final JCNoType recoveryType = new JCNoType(NONE);
+
     /** If this switch is turned on, the names of type variables
      *  and anonymous classes are printed with hashcodes appended.
      */
@@ -1168,22 +1176,59 @@
         }
     }
 
-    /** A class for instantiatable variables, for use during type
-     *  inference.
+    /** A class for inference variables, for use during method/diamond type
+     *  inference. An inference variable has upper/lower bounds and a set
+     *  of equality constraints. Such bounds are set during subtyping, type-containment,
+     *  type-equality checks, when the types being tested contain inference variables.
+     *  A change listener can be attached to an inference variable, to receive notifications
+     *  whenever the bounds of an inference variable change.
      */
     public static class UndetVar extends DelegatedType {
-        public List<Type> lobounds = List.nil();
-        public List<Type> hibounds = List.nil();
-        public List<Type> eq = List.nil();
+
+        /** Inference variable change listener. The listener method is called
+         *  whenever a change to the inference variable's bounds occurs
+         */
+        public interface UndetVarListener {
+            /** called when some inference variable bounds (of given kinds ibs) change */
+            void varChanged(UndetVar uv, Set<InferenceBound> ibs);
+        }
+
+        /**
+         * Inference variable bound kinds
+         */
+        public enum InferenceBound {
+            /** upper bounds */
+            UPPER,
+            /** lower bounds */
+            LOWER,
+            /** equality constraints */
+            EQ;
+        }
+
+        /** inference variable bounds */
+        private Map<InferenceBound, List<Type>> bounds;
+
+        /** inference variable's inferred type (set from Infer.java) */
         public Type inst = null;
 
+        /** inference variable's change listener */
+        public UndetVarListener listener = null;
+
         @Override
         public <R,S> R accept(Type.Visitor<R,S> v, S s) {
             return v.visitUndetVar(this, s);
         }
 
-        public UndetVar(Type origin) {
+        public UndetVar(TypeVar origin, Types types) {
+            this(origin, types, true);
+        }
+
+        public UndetVar(TypeVar origin, Types types, boolean includeBounds) {
             super(UNDETVAR, origin);
+            bounds = new EnumMap<InferenceBound, List<Type>>(InferenceBound.class);
+            bounds.put(InferenceBound.UPPER, includeBounds ? types.getBounds(origin) : List.<Type>nil());
+            bounds.put(InferenceBound.LOWER, List.<Type>nil());
+            bounds.put(InferenceBound.EQ, List.<Type>nil());
         }
 
         public String toString() {
@@ -1195,6 +1240,48 @@
             if (inst != null) return inst.baseType();
             else return this;
         }
+
+        /** get all bounds of a given kind */
+        public List<Type> getBounds(InferenceBound ib) {
+            return bounds.get(ib);
+        }
+
+        /** add a bound of a given kind - this might trigger listener notification */
+        public void addBound(InferenceBound ib, Type bound, Types types) {
+            List<Type> prevBounds = bounds.get(ib);
+            for (Type b : prevBounds) {
+                if (types.isSameType(b, bound)) {
+                    return;
+                }
+            }
+            bounds.put(ib, prevBounds.prepend(bound));
+            notifyChange(EnumSet.of(ib));
+        }
+
+        /** replace types in all bounds - this might trigger listener notification */
+        public void substBounds(List<Type> from, List<Type> to, Types types) {
+            EnumSet<InferenceBound> changed = EnumSet.noneOf(InferenceBound.class);
+            Map<InferenceBound, List<Type>> bounds2 = new EnumMap<InferenceBound, List<Type>>(InferenceBound.class);
+            for (Map.Entry<InferenceBound, List<Type>> _entry : bounds.entrySet()) {
+                InferenceBound ib = _entry.getKey();
+                List<Type> prevBounds = _entry.getValue();
+                List<Type> newBounds = types.subst(prevBounds, from, to);
+                bounds2.put(ib, newBounds);
+                if (prevBounds != newBounds) {
+                    changed.add(ib);
+                }
+            }
+            if (!changed.isEmpty()) {
+                bounds = bounds2;
+                notifyChange(changed);
+            }
+        }
+
+        private void notifyChange(EnumSet<InferenceBound> ibs) {
+            if (listener != null) {
+                listener.varChanged(this, ibs);
+            }
+        }
     }
 
     /** Represents VOID or NONE.
--- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java	Wed Jul 05 18:26:11 2017 +0200
@@ -102,9 +102,13 @@
      */
     public static final int FORALL = WILDCARD+1;
 
+    /** The tag of deferred expression types in method context
+     */
+    public static final int DEFERRED = FORALL+1;
+
     /** The tag of the bottom type <null>.
      */
-    public static final int BOT = FORALL+1;
+    public static final int BOT = DEFERRED+1;
 
     /** The tag of a missing type.
      */
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java	Wed Jul 05 18:26:11 2017 +0200
@@ -34,6 +34,7 @@
 import com.sun.tools.javac.jvm.ClassReader;
 import com.sun.tools.javac.code.Attribute.RetentionPolicy;
 import com.sun.tools.javac.code.Lint.LintCategory;
+import com.sun.tools.javac.code.Type.UndetVar.InferenceBound;
 import com.sun.tools.javac.comp.Check;
 
 import static com.sun.tools.javac.code.Scope.*;
@@ -78,8 +79,10 @@
     final boolean allowObjectToPrimitiveCast;
     final ClassReader reader;
     final Check chk;
+    JCDiagnostic.Factory diags;
     List<Warner> warnStack = List.nil();
     final Name capturedName;
+    private final FunctionDescriptorLookupError functionDescriptorLookupError;
 
     // <editor-fold defaultstate="collapsed" desc="Instantiating">
     public static Types instance(Context context) {
@@ -101,6 +104,8 @@
         chk = Check.instance(context);
         capturedName = names.fromString("<captured wildcard>");
         messages = JavacMessages.instance(context);
+        diags = JCDiagnostic.Factory.instance(context);
+        functionDescriptorLookupError = new FunctionDescriptorLookupError();
     }
     // </editor-fold>
 
@@ -295,6 +300,294 @@
     }
     // </editor-fold>
 
+    // <editor-fold defaultstate="collapsed" desc="findSam">
+
+    /**
+     * Exception used to report a function descriptor lookup failure. The exception
+     * wraps a diagnostic that can be used to generate more details error
+     * messages.
+     */
+    public static class FunctionDescriptorLookupError extends RuntimeException {
+        private static final long serialVersionUID = 0;
+
+        JCDiagnostic diagnostic;
+
+        FunctionDescriptorLookupError() {
+            this.diagnostic = null;
+        }
+
+        FunctionDescriptorLookupError setMessage(JCDiagnostic diag) {
+            this.diagnostic = diag;
+            return this;
+        }
+
+        public JCDiagnostic getDiagnostic() {
+            return diagnostic;
+        }
+    }
+
+    /**
+     * A cache that keeps track of function descriptors associated with given
+     * functional interfaces.
+     */
+    class DescriptorCache {
+
+        private WeakHashMap<TypeSymbol, Entry> _map = new WeakHashMap<TypeSymbol, Entry>();
+
+        class FunctionDescriptor {
+            Symbol descSym;
+
+            FunctionDescriptor(Symbol descSym) {
+                this.descSym = descSym;
+            }
+
+            public Symbol getSymbol() {
+                return descSym;
+            }
+
+            public Type getType(Type origin) {
+                return memberType(origin, descSym);
+            }
+        }
+
+        class Entry {
+            final FunctionDescriptor cachedDescRes;
+            final int prevMark;
+
+            public Entry(FunctionDescriptor cachedDescRes,
+                    int prevMark) {
+                this.cachedDescRes = cachedDescRes;
+                this.prevMark = prevMark;
+            }
+
+            boolean matches(int mark) {
+                return  this.prevMark == mark;
+            }
+        }
+
+        FunctionDescriptor get(TypeSymbol origin) throws FunctionDescriptorLookupError {
+            Entry e = _map.get(origin);
+            CompoundScope members = membersClosure(origin.type, false);
+            if (e == null ||
+                    !e.matches(members.getMark())) {
+                FunctionDescriptor descRes = findDescriptorInternal(origin, members);
+                _map.put(origin, new Entry(descRes, members.getMark()));
+                return descRes;
+            }
+            else {
+                return e.cachedDescRes;
+            }
+        }
+
+        /**
+         * Scope filter used to skip methods that should be ignored during
+         * function interface conversion (such as methods overridden by
+         * j.l.Object)
+         */
+        class DescriptorFilter implements Filter<Symbol> {
+
+            TypeSymbol origin;
+
+            DescriptorFilter(TypeSymbol origin) {
+                this.origin = origin;
+            }
+
+            @Override
+            public boolean accepts(Symbol sym) {
+                    return sym.kind == Kinds.MTH &&
+                            (sym.flags() & ABSTRACT) != 0 &&
+                            !overridesObjectMethod(origin, sym) &&
+                            notOverridden(sym);
+            }
+
+            private boolean notOverridden(Symbol msym) {
+                Symbol impl = ((MethodSymbol)msym).implementation(origin, Types.this, false);
+                return impl == null || (impl.flags() & ABSTRACT) != 0;
+            }
+        };
+
+        /**
+         * Compute the function descriptor associated with a given functional interface
+         */
+        public FunctionDescriptor findDescriptorInternal(TypeSymbol origin, CompoundScope membersCache) throws FunctionDescriptorLookupError {
+            if (!origin.isInterface()) {
+                //t must be an interface
+                throw failure("not.a.functional.intf");
+            }
+
+            final ListBuffer<Symbol> abstracts = ListBuffer.lb();
+            for (Symbol sym : membersCache.getElements(new DescriptorFilter(origin))) {
+                Type mtype = memberType(origin.type, sym);
+                if (abstracts.isEmpty() ||
+                        (sym.name == abstracts.first().name &&
+                        overrideEquivalent(mtype, memberType(origin.type, abstracts.first())))) {
+                    abstracts.append(sym);
+                } else {
+                    //the target method(s) should be the only abstract members of t
+                    throw failure("not.a.functional.intf.1",
+                            diags.fragment("incompatible.abstracts", Kinds.kindName(origin), origin));
+                }
+            }
+            if (abstracts.isEmpty()) {
+                //t must define a suitable non-generic method
+                throw failure("not.a.functional.intf.1",
+                            diags.fragment("no.abstracts", Kinds.kindName(origin), origin));
+            } else if (abstracts.size() == 1) {
+                if (abstracts.first().type.tag == FORALL) {
+                    throw failure("invalid.generic.desc.in.functional.intf",
+                            abstracts.first(),
+                            Kinds.kindName(origin),
+                            origin);
+                } else {
+                    return new FunctionDescriptor(abstracts.first());
+                }
+            } else { // size > 1
+                for (Symbol msym : abstracts) {
+                    if (msym.type.tag == FORALL) {
+                        throw failure("invalid.generic.desc.in.functional.intf",
+                                abstracts.first(),
+                                Kinds.kindName(origin),
+                                origin);
+                    }
+                }
+                FunctionDescriptor descRes = mergeDescriptors(origin, abstracts.toList());
+                if (descRes == null) {
+                    //we can get here if the functional interface is ill-formed
+                    ListBuffer<JCDiagnostic> descriptors = ListBuffer.lb();
+                    for (Symbol desc : abstracts) {
+                        String key = desc.type.getThrownTypes().nonEmpty() ?
+                                "descriptor.throws" : "descriptor";
+                        descriptors.append(diags.fragment(key, desc.name,
+                                desc.type.getParameterTypes(),
+                                desc.type.getReturnType(),
+                                desc.type.getThrownTypes()));
+                    }
+                    JCDiagnostic.MultilineDiagnostic incompatibleDescriptors =
+                            new JCDiagnostic.MultilineDiagnostic(diags.fragment("incompatible.descs.in.functional.intf",
+                            Kinds.kindName(origin), origin), descriptors.toList());
+                    throw failure(incompatibleDescriptors);
+                }
+                return descRes;
+            }
+        }
+
+        /**
+         * Compute a synthetic type for the target descriptor given a list
+         * of override-equivalent methods in the functional interface type.
+         * The resulting method type is a method type that is override-equivalent
+         * and return-type substitutable with each method in the original list.
+         */
+        private FunctionDescriptor mergeDescriptors(TypeSymbol origin, List<Symbol> methodSyms) {
+            //pick argument types - simply take the signature that is a
+            //subsignature of all other signatures in the list (as per JLS 8.4.2)
+            List<Symbol> mostSpecific = List.nil();
+            outer: for (Symbol msym1 : methodSyms) {
+                Type mt1 = memberType(origin.type, msym1);
+                for (Symbol msym2 : methodSyms) {
+                    Type mt2 = memberType(origin.type, msym2);
+                    if (!isSubSignature(mt1, mt2)) {
+                        continue outer;
+                    }
+                }
+                mostSpecific = mostSpecific.prepend(msym1);
+            }
+            if (mostSpecific.isEmpty()) {
+                return null;
+            }
+
+
+            //pick return types - this is done in two phases: (i) first, the most
+            //specific return type is chosen using strict subtyping; if this fails,
+            //a second attempt is made using return type substitutability (see JLS 8.4.5)
+            boolean phase2 = false;
+            Symbol bestSoFar = null;
+            while (bestSoFar == null) {
+                outer: for (Symbol msym1 : mostSpecific) {
+                    Type mt1 = memberType(origin.type, msym1);
+                    for (Symbol msym2 : methodSyms) {
+                        Type mt2 = memberType(origin.type, msym2);
+                        if (phase2 ?
+                                !returnTypeSubstitutable(mt1, mt2) :
+                                !isSubtypeInternal(mt1.getReturnType(), mt2.getReturnType())) {
+                            continue outer;
+                        }
+                    }
+                    bestSoFar = msym1;
+                }
+                if (phase2) {
+                    break;
+                } else {
+                    phase2 = true;
+                }
+            }
+            if (bestSoFar == null) return null;
+
+            //merge thrown types - form the intersection of all the thrown types in
+            //all the signatures in the list
+            List<Type> thrown = null;
+            for (Symbol msym1 : methodSyms) {
+                Type mt1 = memberType(origin.type, msym1);
+                thrown = (thrown == null) ?
+                    mt1.getThrownTypes() :
+                    chk.intersect(mt1.getThrownTypes(), thrown);
+            }
+
+            final List<Type> thrown1 = thrown;
+            return new FunctionDescriptor(bestSoFar) {
+                @Override
+                public Type getType(Type origin) {
+                    Type mt = memberType(origin, getSymbol());
+                    return new MethodType(mt.getParameterTypes(), mt.getReturnType(), thrown1, syms.methodClass);
+                }
+            };
+        }
+
+        boolean isSubtypeInternal(Type s, Type t) {
+            return (s.isPrimitive() && t.isPrimitive()) ?
+                    isSameType(t, s) :
+                    isSubtype(s, t);
+        }
+
+        FunctionDescriptorLookupError failure(String msg, Object... args) {
+            return failure(diags.fragment(msg, args));
+        }
+
+        FunctionDescriptorLookupError failure(JCDiagnostic diag) {
+            return functionDescriptorLookupError.setMessage(diag);
+        }
+    }
+
+    private DescriptorCache descCache = new DescriptorCache();
+
+    /**
+     * Find the method descriptor associated to this class symbol - if the
+     * symbol 'origin' is not a functional interface, an exception is thrown.
+     */
+    public Symbol findDescriptorSymbol(TypeSymbol origin) throws FunctionDescriptorLookupError {
+        return descCache.get(origin).getSymbol();
+    }
+
+    /**
+     * Find the type of the method descriptor associated to this class symbol -
+     * if the symbol 'origin' is not a functional interface, an exception is thrown.
+     */
+    public Type findDescriptorType(Type origin) throws FunctionDescriptorLookupError {
+        return descCache.get(origin.tsym).getType(origin);
+    }
+
+    /**
+     * Is given type a functional interface?
+     */
+    public boolean isFunctionalInterface(TypeSymbol tsym) {
+        try {
+            findDescriptorSymbol(tsym);
+            return true;
+        } catch (FunctionDescriptorLookupError ex) {
+            return false;
+        }
+    }
+    // </editor-fold>
+
     // <editor-fold defaultstate="collapsed" desc="isSubtype">
     /**
      * Is t an unchecked subtype of s?
@@ -510,7 +803,7 @@
                     return false;
                 }
 
-                t.hibounds = t.hibounds.prepend(s);
+                t.addBound(InferenceBound.UPPER, s, Types.this);
                 return true;
             }
 
@@ -578,7 +871,7 @@
                 undet.qtype == s ||
                 s.tag == ERROR ||
                 s.tag == BOT) return true;
-            undet.lobounds = undet.lobounds.prepend(s);
+            undet.addBound(InferenceBound.LOWER, s, this);
             return true;
         }
         default:
@@ -723,7 +1016,7 @@
                 if (t == s || t.qtype == s || s.tag == ERROR || s.tag == UNKNOWN)
                     return true;
 
-                t.eq = t.eq.prepend(s);
+                t.addBound(InferenceBound.EQ, s, Types.this);
 
                 return true;
             }
@@ -735,19 +1028,6 @@
         };
     // </editor-fold>
 
-    // <editor-fold defaultstate="collapsed" desc="fromUnknownFun">
-    /**
-     * A mapping that turns all unknown types in this type to fresh
-     * unknown variables.
-     */
-    public Mapping fromUnknownFun = new Mapping("fromUnknownFun") {
-            public Type apply(Type t) {
-                if (t.tag == UNKNOWN) return new UndetVar(t);
-                else return t.map(this);
-            }
-        };
-    // </editor-fold>
-
     // <editor-fold defaultstate="collapsed" desc="Contains Type">
     public boolean containedBy(Type t, Type s) {
         switch (t.tag) {
@@ -759,12 +1039,12 @@
                     case UNBOUND: //similar to ? extends Object
                     case EXTENDS: {
                         Type bound = upperBound(s);
-                        undetvar.hibounds = undetvar.hibounds.prepend(bound);
+                        undetvar.addBound(InferenceBound.UPPER, bound, this);
                         break;
                     }
                     case SUPER: {
                         Type bound = lowerBound(s);
-                        undetvar.lobounds = undetvar.lobounds.prepend(bound);
+                        undetvar.addBound(InferenceBound.LOWER, bound, this);
                         break;
                     }
                 }
@@ -1227,7 +1507,10 @@
      * Returns the lower bounds of the formals of a method.
      */
     public List<Type> lowerBoundArgtypes(Type t) {
-        return map(t.getParameterTypes(), lowerBoundMapping);
+        return lowerBounds(t.getParameterTypes());
+    }
+    public List<Type> lowerBounds(List<Type> ts) {
+        return map(ts, lowerBoundMapping);
     }
     private final Mapping lowerBoundMapping = new Mapping("lowerBound") {
             public Type apply(Type t) {
@@ -2019,6 +2302,15 @@
             hasSameArgs(t, erasure(s)) || hasSameArgs(erasure(t), s);
     }
 
+    public boolean overridesObjectMethod(TypeSymbol origin, Symbol msym) {
+        for (Scope.Entry e = syms.objectType.tsym.members().lookup(msym.name) ; e.scope != null ; e = e.next()) {
+            if (msym.overrides(e.sym, origin, Types.this, true)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     // <editor-fold defaultstate="collapsed" desc="Determining method implementation in given site">
     class ImplementationCache {
 
@@ -3166,6 +3458,14 @@
         }
         return Type.noType;
     }
+
+    /**
+     * Return the unboxed type if 't' is a boxed class, otherwise return 't' itself.
+     */
+    public Type unboxedTypeOrType(Type t) {
+        Type unboxedType = unboxedType(t);
+        return unboxedType.tag == NONE ? t : unboxedType;
+    }
     // </editor-fold>
 
     // <editor-fold defaultstate="collapsed" desc="Capture conversion">
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java	Wed Jul 05 18:26:11 2017 +0200
@@ -514,22 +514,6 @@
                       expectedType);
             fatalError = true;
         }
-
-        // validate that all other elements of containing type has defaults
-        scope = targetContainerType.tsym.members();
-        error = false;
-        for(Symbol elm : scope.getElements()) {
-            if (elm.name != names.value &&
-                elm.kind == Kinds.MTH &&
-                ((MethodSymbol)elm).defaultValue == null) {
-                log.error(pos,
-                          "invalid.containedby.annotation.elem.nondefault",
-                          targetContainerType,
-                          elm);
-                containerValueSymbol = null;
-                error = true;
-            }
-        }
         if (error) {
             fatalError = true;
         }
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,12 +25,10 @@
 
 package com.sun.tools.javac.comp;
 
-import java.util.*;
-import java.util.Set;
-import javax.lang.model.element.ElementKind;
-import javax.tools.JavaFileObject;
-
 import com.sun.tools.javac.code.*;
+import com.sun.tools.javac.comp.DeferredAttr.AttrMode;
+import com.sun.tools.javac.comp.Infer.InferenceContext;
+import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener;
 import com.sun.tools.javac.jvm.*;
 import com.sun.tools.javac.tree.*;
 import com.sun.tools.javac.util.*;
@@ -45,10 +43,16 @@
 import com.sun.tools.javac.comp.Check.CheckContext;
 
 import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
 import com.sun.source.tree.MemberSelectTree;
 import com.sun.source.tree.TreeVisitor;
 import com.sun.source.util.SimpleTreeVisitor;
 
+import java.util.*;
+import java.util.Set;
+import javax.lang.model.element.ElementKind;
+import javax.tools.JavaFileObject;
+
 import static com.sun.tools.javac.code.Flags.*;
 import static com.sun.tools.javac.code.Flags.ANNOTATION;
 import static com.sun.tools.javac.code.Flags.BLOCK;
@@ -80,7 +84,9 @@
     final Symtab syms;
     final Resolve rs;
     final Infer infer;
+    final DeferredAttr deferredAttr;
     final Check chk;
+    final Flow flow;
     final MemberEnter memberEnter;
     final TreeMaker make;
     final ConstFold cfolder;
@@ -106,10 +112,12 @@
         syms = Symtab.instance(context);
         rs = Resolve.instance(context);
         chk = Check.instance(context);
+        flow = Flow.instance(context);
         memberEnter = MemberEnter.instance(context);
         make = TreeMaker.instance(context);
         enter = Enter.instance(context);
         infer = Infer.instance(context);
+        deferredAttr = DeferredAttr.instance(context);
         cfolder = ConstFold.instance(context);
         target = Target.instance(context);
         types = Types.instance(context);
@@ -127,23 +135,31 @@
         allowCovariantReturns = source.allowCovariantReturns();
         allowAnonOuterThis = source.allowAnonOuterThis();
         allowStringsInSwitch = source.allowStringsInSwitch();
+        allowPoly = source.allowPoly() && options.isSet("allowPoly");
+        allowLambda = source.allowLambda();
         sourceName = source.name;
         relax = (options.isSet("-retrofit") ||
                  options.isSet("-relax"));
         findDiamonds = options.get("findDiamond") != null &&
                  source.allowDiamond();
         useBeforeDeclarationWarning = options.isSet("useBeforeDeclarationWarning");
+        identifyLambdaCandidate = options.getBoolean("identifyLambdaCandidate", false);
 
         statInfo = new ResultInfo(NIL, Type.noType);
         varInfo = new ResultInfo(VAR, Type.noType);
         unknownExprInfo = new ResultInfo(VAL, Type.noType);
         unknownTypeInfo = new ResultInfo(TYP, Type.noType);
+        recoveryInfo = new RecoveryInfo(deferredAttr.emptyDeferredAttrContext);
     }
 
     /** Switch: relax some constraints for retrofit mode.
      */
     boolean relax;
 
+    /** Switch: support target-typing inference
+     */
+    boolean allowPoly;
+
     /** Switch: support generics?
      */
     boolean allowGenerics;
@@ -164,6 +180,10 @@
      */
     boolean allowCovariantReturns;
 
+    /** Switch: support lambda expressions ?
+     */
+    boolean allowLambda;
+
     /** Switch: allow references to surrounding object from anonymous
      * objects during constructor call?
      */
@@ -186,6 +206,12 @@
     boolean useBeforeDeclarationWarning;
 
     /**
+     * Switch: generate warnings whenever an anonymous inner class that is convertible
+     * to a lambda expression is found
+     */
+    boolean identifyLambdaCandidate;
+
+    /**
      * Switch: allow strings in switch?
      */
     boolean allowStringsInSwitch;
@@ -207,15 +233,29 @@
      *  @param ownkind  The computed kind of the tree
      *  @param resultInfo  The expected result of the tree
      */
-    Type check(JCTree tree, Type owntype, int ownkind, ResultInfo resultInfo) {
+    Type check(final JCTree tree, final Type found, final int ownkind, final ResultInfo resultInfo) {
+        InferenceContext inferenceContext = resultInfo.checkContext.inferenceContext();
+        Type owntype = found;
         if (owntype.tag != ERROR && resultInfo.pt.tag != METHOD && resultInfo.pt.tag != FORALL) {
-            if ((ownkind & ~resultInfo.pkind) == 0) {
-                owntype = resultInfo.check(tree, owntype);
+            if (inferenceContext.free(found)) {
+                inferenceContext.addFreeTypeListener(List.of(found, resultInfo.pt), new FreeTypeListener() {
+                    @Override
+                    public void typesInferred(InferenceContext inferenceContext) {
+                        ResultInfo pendingResult =
+                                    resultInfo.dup(inferenceContext.asInstType(resultInfo.pt, types));
+                        check(tree, inferenceContext.asInstType(found, types), ownkind, pendingResult);
+                    }
+                });
+                return tree.type = resultInfo.pt;
             } else {
-                log.error(tree.pos(), "unexpected.type",
-                          kindNames(resultInfo.pkind),
-                          kindName(ownkind));
-                owntype = types.createErrorType(owntype);
+                if ((ownkind & ~resultInfo.pkind) == 0) {
+                    owntype = resultInfo.check(tree, owntype);
+                } else {
+                    log.error(tree.pos(), "unexpected.type",
+                            kindNames(resultInfo.pkind),
+                            kindName(ownkind));
+                    owntype = types.createErrorType(owntype);
+                }
             }
         }
         tree.type = owntype;
@@ -262,6 +302,9 @@
                 case CLASSDEF:
                     //class def is always an owner
                     return ((JCClassDecl)env.tree).sym;
+                case LAMBDA:
+                    //a lambda is an owner - return a fresh synthetic method symbol
+                    return new MethodSymbol(0, names.empty, null, syms.methodClass);
                 case BLOCK:
                     //static/instance init blocks are owner
                     Symbol blockSym = env.info.scope.owner;
@@ -297,8 +340,6 @@
             } else {
                 log.error(pos, "cant.assign.val.to.final.var", v);
             }
-        } else if ((v.flags() & EFFECTIVELY_FINAL) != 0) {
-            v.flags_field &= ~EFFECTIVELY_FINAL;
         }
     }
 
@@ -431,14 +472,38 @@
         static final long serialVersionUID = -6924771130405446405L;
         private Env<AttrContext> env;
         private BreakAttr(Env<AttrContext> env) {
-            this.env = env;
+            this.env = copyEnv(env);
+        }
+
+        private Env<AttrContext> copyEnv(Env<AttrContext> env) {
+            Env<AttrContext> newEnv =
+                    env.dup(env.tree, env.info.dup(copyScope(env.info.scope)));
+            if (newEnv.outer != null) {
+                newEnv.outer = copyEnv(newEnv.outer);
+            }
+            return newEnv;
+        }
+
+        private Scope copyScope(Scope sc) {
+            Scope newScope = new Scope(sc.owner);
+            List<Symbol> elemsList = List.nil();
+            while (sc != null) {
+                for (Scope.Entry e = sc.elems ; e != null ; e = e.sibling) {
+                    elemsList = elemsList.prepend(e.sym);
+                }
+                sc = sc.next;
+            }
+            for (Symbol s : elemsList) {
+                newScope.enter(s);
+            }
+            return newScope;
         }
     }
 
     class ResultInfo {
-        int pkind;
-        Type pt;
-        CheckContext checkContext;
+        final int pkind;
+        final Type pt;
+        final CheckContext checkContext;
 
         ResultInfo(int pkind, Type pt) {
             this(pkind, pt, chk.basicHandler);
@@ -450,15 +515,45 @@
             this.checkContext = checkContext;
         }
 
-        protected Type check(DiagnosticPosition pos, Type found) {
+        protected Type check(final DiagnosticPosition pos, final Type found) {
             return chk.checkType(pos, found, pt, checkContext);
         }
+
+        protected ResultInfo dup(Type newPt) {
+            return new ResultInfo(pkind, newPt, checkContext);
+        }
     }
 
-    private final ResultInfo statInfo;
-    private final ResultInfo varInfo;
-    private final ResultInfo unknownExprInfo;
-    private final ResultInfo unknownTypeInfo;
+    class RecoveryInfo extends ResultInfo {
+
+        public RecoveryInfo(final DeferredAttr.DeferredAttrContext deferredAttrContext) {
+            super(Kinds.VAL, Type.recoveryType, new Check.NestedCheckContext(chk.basicHandler) {
+                @Override
+                public DeferredAttr.DeferredAttrContext deferredAttrContext() {
+                    return deferredAttrContext;
+                }
+                @Override
+                public boolean compatible(Type found, Type req, Warner warn) {
+                    return true;
+                }
+                @Override
+                public void report(DiagnosticPosition pos, JCDiagnostic details) {
+                    //do nothing
+                }
+            });
+        }
+
+        @Override
+        protected Type check(DiagnosticPosition pos, Type found) {
+            return chk.checkNonVoid(pos, super.check(pos, found));
+        }
+    }
+
+    final ResultInfo statInfo;
+    final ResultInfo varInfo;
+    final ResultInfo unknownExprInfo;
+    final ResultInfo unknownTypeInfo;
+    final ResultInfo recoveryInfo;
 
     Type pt() {
         return resultInfo.pt;
@@ -491,7 +586,7 @@
      *  @param env     The environment visitor argument.
      *  @param resultInfo   The result info visitor argument.
      */
-    private Type attribTree(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) {
+    Type attribTree(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) {
         Env<AttrContext> prevEnv = this.env;
         ResultInfo prevResult = this.resultInfo;
         try {
@@ -563,9 +658,12 @@
      */
     List<Type> attribArgs(List<JCExpression> trees, Env<AttrContext> env) {
         ListBuffer<Type> argtypes = new ListBuffer<Type>();
-        for (List<JCExpression> l = trees; l.nonEmpty(); l = l.tail)
-            argtypes.append(chk.checkNonVoid(
-                l.head.pos(), types.upperBound(attribExpr(l.head, env, Infer.anyPoly))));
+        for (JCExpression arg : trees) {
+            Type argtype = allowPoly && TreeInfo.isPoly(arg, env.tree) ?
+                    deferredAttr.new DeferredType(arg, env) :
+                    chk.checkNonVoid(arg, attribExpr(arg, env, Infer.anyPoly));
+            argtypes.append(argtype);
+        }
         return argtypes.toList();
     }
 
@@ -934,7 +1032,10 @@
             chk.checkDeprecatedAnnotation(tree.pos(), v);
 
             if (tree.init != null) {
-                if ((v.flags_field & FINAL) != 0 && !tree.init.hasTag(NEWCLASS)) {
+                if ((v.flags_field & FINAL) != 0 &&
+                        !tree.init.hasTag(NEWCLASS) &&
+                        !tree.init.hasTag(LAMBDA) &&
+                        !tree.init.hasTag(REFERENCE)) {
                     // In this case, `v' is final.  Ensure that it's initializer is
                     // evaluated.
                     v.getConstValue(); // ensure initializer is evaluated
@@ -979,8 +1080,11 @@
             // Create a new local environment with a local scope.
             Env<AttrContext> localEnv =
                 env.dup(tree, env.info.dup(env.info.scope.dup()));
-            attribStats(tree.stats, localEnv);
-            localEnv.info.scope.leave();
+            try {
+                attribStats(tree.stats, localEnv);
+            } finally {
+                localEnv.info.scope.leave();
+            }
         }
         result = null;
     }
@@ -1000,43 +1104,51 @@
     public void visitForLoop(JCForLoop tree) {
         Env<AttrContext> loopEnv =
             env.dup(env.tree, env.info.dup(env.info.scope.dup()));
-        attribStats(tree.init, loopEnv);
-        if (tree.cond != null) attribExpr(tree.cond, loopEnv, syms.booleanType);
-        loopEnv.tree = tree; // before, we were not in loop!
-        attribStats(tree.step, loopEnv);
-        attribStat(tree.body, loopEnv);
-        loopEnv.info.scope.leave();
-        result = null;
+        try {
+            attribStats(tree.init, loopEnv);
+            if (tree.cond != null) attribExpr(tree.cond, loopEnv, syms.booleanType);
+            loopEnv.tree = tree; // before, we were not in loop!
+            attribStats(tree.step, loopEnv);
+            attribStat(tree.body, loopEnv);
+            result = null;
+        }
+        finally {
+            loopEnv.info.scope.leave();
+        }
     }
 
     public void visitForeachLoop(JCEnhancedForLoop tree) {
         Env<AttrContext> loopEnv =
             env.dup(env.tree, env.info.dup(env.info.scope.dup()));
-        attribStat(tree.var, loopEnv);
-        Type exprType = types.upperBound(attribExpr(tree.expr, loopEnv));
-        chk.checkNonVoid(tree.pos(), exprType);
-        Type elemtype = types.elemtype(exprType); // perhaps expr is an array?
-        if (elemtype == null) {
-            // or perhaps expr implements Iterable<T>?
-            Type base = types.asSuper(exprType, syms.iterableType.tsym);
-            if (base == null) {
-                log.error(tree.expr.pos(),
-                        "foreach.not.applicable.to.type",
-                        exprType,
-                        diags.fragment("type.req.array.or.iterable"));
-                elemtype = types.createErrorType(exprType);
-            } else {
-                List<Type> iterableParams = base.allparams();
-                elemtype = iterableParams.isEmpty()
-                    ? syms.objectType
-                    : types.upperBound(iterableParams.head);
+        try {
+            attribStat(tree.var, loopEnv);
+            Type exprType = types.upperBound(attribExpr(tree.expr, loopEnv));
+            chk.checkNonVoid(tree.pos(), exprType);
+            Type elemtype = types.elemtype(exprType); // perhaps expr is an array?
+            if (elemtype == null) {
+                // or perhaps expr implements Iterable<T>?
+                Type base = types.asSuper(exprType, syms.iterableType.tsym);
+                if (base == null) {
+                    log.error(tree.expr.pos(),
+                            "foreach.not.applicable.to.type",
+                            exprType,
+                            diags.fragment("type.req.array.or.iterable"));
+                    elemtype = types.createErrorType(exprType);
+                } else {
+                    List<Type> iterableParams = base.allparams();
+                    elemtype = iterableParams.isEmpty()
+                        ? syms.objectType
+                        : types.upperBound(iterableParams.head);
+                }
             }
+            chk.checkType(tree.expr.pos(), elemtype, tree.var.sym.type);
+            loopEnv.tree = tree; // before, we were not in loop!
+            attribStat(tree.body, loopEnv);
+            result = null;
         }
-        chk.checkType(tree.expr.pos(), elemtype, tree.var.sym.type);
-        loopEnv.tree = tree; // before, we were not in loop!
-        attribStat(tree.body, loopEnv);
-        loopEnv.info.scope.leave();
-        result = null;
+        finally {
+            loopEnv.info.scope.leave();
+        }
     }
 
     public void visitLabelled(JCLabeledStatement tree) {
@@ -1062,61 +1174,69 @@
         Env<AttrContext> switchEnv =
             env.dup(tree, env.info.dup(env.info.scope.dup()));
 
-        boolean enumSwitch =
-            allowEnums &&
-            (seltype.tsym.flags() & Flags.ENUM) != 0;
-        boolean stringSwitch = false;
-        if (types.isSameType(seltype, syms.stringType)) {
-            if (allowStringsInSwitch) {
-                stringSwitch = true;
-            } else {
-                log.error(tree.selector.pos(), "string.switch.not.supported.in.source", sourceName);
+        try {
+
+            boolean enumSwitch =
+                allowEnums &&
+                (seltype.tsym.flags() & Flags.ENUM) != 0;
+            boolean stringSwitch = false;
+            if (types.isSameType(seltype, syms.stringType)) {
+                if (allowStringsInSwitch) {
+                    stringSwitch = true;
+                } else {
+                    log.error(tree.selector.pos(), "string.switch.not.supported.in.source", sourceName);
+                }
             }
+            if (!enumSwitch && !stringSwitch)
+                seltype = chk.checkType(tree.selector.pos(), seltype, syms.intType);
+
+            // Attribute all cases and
+            // check that there are no duplicate case labels or default clauses.
+            Set<Object> labels = new HashSet<Object>(); // The set of case labels.
+            boolean hasDefault = false;      // Is there a default label?
+            for (List<JCCase> l = tree.cases; l.nonEmpty(); l = l.tail) {
+                JCCase c = l.head;
+                Env<AttrContext> caseEnv =
+                    switchEnv.dup(c, env.info.dup(switchEnv.info.scope.dup()));
+                try {
+                    if (c.pat != null) {
+                        if (enumSwitch) {
+                            Symbol sym = enumConstant(c.pat, seltype);
+                            if (sym == null) {
+                                log.error(c.pat.pos(), "enum.label.must.be.unqualified.enum");
+                            } else if (!labels.add(sym)) {
+                                log.error(c.pos(), "duplicate.case.label");
+                            }
+                        } else {
+                            Type pattype = attribExpr(c.pat, switchEnv, seltype);
+                            if (pattype.tag != ERROR) {
+                                if (pattype.constValue() == null) {
+                                    log.error(c.pat.pos(),
+                                              (stringSwitch ? "string.const.req" : "const.expr.req"));
+                                } else if (labels.contains(pattype.constValue())) {
+                                    log.error(c.pos(), "duplicate.case.label");
+                                } else {
+                                    labels.add(pattype.constValue());
+                                }
+                            }
+                        }
+                    } else if (hasDefault) {
+                        log.error(c.pos(), "duplicate.default.label");
+                    } else {
+                        hasDefault = true;
+                    }
+                    attribStats(c.stats, caseEnv);
+                } finally {
+                    caseEnv.info.scope.leave();
+                    addVars(c.stats, switchEnv.info.scope);
+                }
+            }
+
+            result = null;
         }
-        if (!enumSwitch && !stringSwitch)
-            seltype = chk.checkType(tree.selector.pos(), seltype, syms.intType);
-
-        // Attribute all cases and
-        // check that there are no duplicate case labels or default clauses.
-        Set<Object> labels = new HashSet<Object>(); // The set of case labels.
-        boolean hasDefault = false;      // Is there a default label?
-        for (List<JCCase> l = tree.cases; l.nonEmpty(); l = l.tail) {
-            JCCase c = l.head;
-            Env<AttrContext> caseEnv =
-                switchEnv.dup(c, env.info.dup(switchEnv.info.scope.dup()));
-            if (c.pat != null) {
-                if (enumSwitch) {
-                    Symbol sym = enumConstant(c.pat, seltype);
-                    if (sym == null) {
-                        log.error(c.pat.pos(), "enum.label.must.be.unqualified.enum");
-                    } else if (!labels.add(sym)) {
-                        log.error(c.pos(), "duplicate.case.label");
-                    }
-                } else {
-                    Type pattype = attribExpr(c.pat, switchEnv, seltype);
-                    if (pattype.tag != ERROR) {
-                        if (pattype.constValue() == null) {
-                            log.error(c.pat.pos(),
-                                      (stringSwitch ? "string.const.req" : "const.expr.req"));
-                        } else if (labels.contains(pattype.constValue())) {
-                            log.error(c.pos(), "duplicate.case.label");
-                        } else {
-                            labels.add(pattype.constValue());
-                        }
-                    }
-                }
-            } else if (hasDefault) {
-                log.error(c.pos(), "duplicate.default.label");
-            } else {
-                hasDefault = true;
-            }
-            attribStats(c.stats, caseEnv);
-            caseEnv.info.scope.leave();
-            addVars(c.stats, switchEnv.info.scope);
+        finally {
+            switchEnv.info.scope.leave();
         }
-
-        switchEnv.info.scope.leave();
-        result = null;
     }
     // where
         /** Add any variables defined in stats to the switch scope. */
@@ -1158,63 +1278,72 @@
     public void visitTry(JCTry tree) {
         // Create a new local environment with a local
         Env<AttrContext> localEnv = env.dup(tree, env.info.dup(env.info.scope.dup()));
-        boolean isTryWithResource = tree.resources.nonEmpty();
-        // Create a nested environment for attributing the try block if needed
-        Env<AttrContext> tryEnv = isTryWithResource ?
-            env.dup(tree, localEnv.info.dup(localEnv.info.scope.dup())) :
-            localEnv;
-        // Attribute resource declarations
-        for (JCTree resource : tree.resources) {
-            CheckContext twrContext = new Check.NestedCheckContext(resultInfo.checkContext) {
-                @Override
-                public void report(DiagnosticPosition pos, JCDiagnostic details) {
-                    chk.basicHandler.report(pos, diags.fragment("try.not.applicable.to.type", details));
+        try {
+            boolean isTryWithResource = tree.resources.nonEmpty();
+            // Create a nested environment for attributing the try block if needed
+            Env<AttrContext> tryEnv = isTryWithResource ?
+                env.dup(tree, localEnv.info.dup(localEnv.info.scope.dup())) :
+                localEnv;
+            try {
+                // Attribute resource declarations
+                for (JCTree resource : tree.resources) {
+                    CheckContext twrContext = new Check.NestedCheckContext(resultInfo.checkContext) {
+                        @Override
+                        public void report(DiagnosticPosition pos, JCDiagnostic details) {
+                            chk.basicHandler.report(pos, diags.fragment("try.not.applicable.to.type", details));
+                        }
+                    };
+                    ResultInfo twrResult = new ResultInfo(VAL, syms.autoCloseableType, twrContext);
+                    if (resource.hasTag(VARDEF)) {
+                        attribStat(resource, tryEnv);
+                        twrResult.check(resource, resource.type);
+
+                        //check that resource type cannot throw InterruptedException
+                        checkAutoCloseable(resource.pos(), localEnv, resource.type);
+
+                        VarSymbol var = (VarSymbol)TreeInfo.symbolFor(resource);
+                        var.setData(ElementKind.RESOURCE_VARIABLE);
+                    } else {
+                        attribTree(resource, tryEnv, twrResult);
+                    }
                 }
-            };
-            ResultInfo twrResult = new ResultInfo(VAL, syms.autoCloseableType, twrContext);
-            if (resource.hasTag(VARDEF)) {
-                attribStat(resource, tryEnv);
-                twrResult.check(resource, resource.type);
-
-                //check that resource type cannot throw InterruptedException
-                checkAutoCloseable(resource.pos(), localEnv, resource.type);
-
-                VarSymbol var = (VarSymbol)TreeInfo.symbolFor(resource);
-                var.setData(ElementKind.RESOURCE_VARIABLE);
-            } else {
-                attribTree(resource, tryEnv, twrResult);
+                // Attribute body
+                attribStat(tree.body, tryEnv);
+            } finally {
+                if (isTryWithResource)
+                    tryEnv.info.scope.leave();
             }
+
+            // Attribute catch clauses
+            for (List<JCCatch> l = tree.catchers; l.nonEmpty(); l = l.tail) {
+                JCCatch c = l.head;
+                Env<AttrContext> catchEnv =
+                    localEnv.dup(c, localEnv.info.dup(localEnv.info.scope.dup()));
+                try {
+                    Type ctype = attribStat(c.param, catchEnv);
+                    if (TreeInfo.isMultiCatch(c)) {
+                        //multi-catch parameter is implicitly marked as final
+                        c.param.sym.flags_field |= FINAL | UNION;
+                    }
+                    if (c.param.sym.kind == Kinds.VAR) {
+                        c.param.sym.setData(ElementKind.EXCEPTION_PARAMETER);
+                    }
+                    chk.checkType(c.param.vartype.pos(),
+                                  chk.checkClassType(c.param.vartype.pos(), ctype),
+                                  syms.throwableType);
+                    attribStat(c.body, catchEnv);
+                } finally {
+                    catchEnv.info.scope.leave();
+                }
+            }
+
+            // Attribute finalizer
+            if (tree.finalizer != null) attribStat(tree.finalizer, localEnv);
+            result = null;
         }
-        // Attribute body
-        attribStat(tree.body, tryEnv);
-        if (isTryWithResource)
-            tryEnv.info.scope.leave();
-
-        // Attribute catch clauses
-        for (List<JCCatch> l = tree.catchers; l.nonEmpty(); l = l.tail) {
-            JCCatch c = l.head;
-            Env<AttrContext> catchEnv =
-                localEnv.dup(c, localEnv.info.dup(localEnv.info.scope.dup()));
-            Type ctype = attribStat(c.param, catchEnv);
-            if (TreeInfo.isMultiCatch(c)) {
-                //multi-catch parameter is implicitly marked as final
-                c.param.sym.flags_field |= FINAL | UNION;
-            }
-            if (c.param.sym.kind == Kinds.VAR) {
-                c.param.sym.setData(ElementKind.EXCEPTION_PARAMETER);
-            }
-            chk.checkType(c.param.vartype.pos(),
-                          chk.checkClassType(c.param.vartype.pos(), ctype),
-                          syms.throwableType);
-            attribStat(c.body, catchEnv);
-            catchEnv.info.scope.leave();
+        finally {
+            localEnv.info.scope.leave();
         }
-
-        // Attribute finalizer
-        if (tree.finalizer != null) attribStat(tree.finalizer, localEnv);
-
-        localEnv.info.scope.leave();
-        result = null;
     }
 
     void checkAutoCloseable(DiagnosticPosition pos, Env<AttrContext> env, Type resource) {
@@ -1222,10 +1351,10 @@
             types.asSuper(resource, syms.autoCloseableType.tsym) != null &&
             !types.isSameType(resource, syms.autoCloseableType)) { // Don't emit warning for AutoCloseable itself
             Symbol close = syms.noSymbol;
-            boolean prevDeferDiags = log.deferDiagnostics;
+            Filter<JCDiagnostic> prevDeferDiagsFilter = log.deferredDiagFilter;
             Queue<JCDiagnostic> prevDeferredDiags = log.deferredDiagnostics;
             try {
-                log.deferDiagnostics = true;
+                log.deferAll();
                 log.deferredDiagnostics = ListBuffer.lb();
                 close = rs.resolveQualifiedMethod(pos,
                         env,
@@ -1235,7 +1364,7 @@
                         List.<Type>nil());
             }
             finally {
-                log.deferDiagnostics = prevDeferDiags;
+                log.deferredDiagFilter = prevDeferDiagsFilter;
                 log.deferredDiagnostics = prevDeferredDiags;
             }
             if (close.kind == MTH &&
@@ -1248,50 +1377,71 @@
     }
 
     public void visitConditional(JCConditional tree) {
-        attribExpr(tree.cond, env, syms.booleanType);
-        attribExpr(tree.truepart, env);
-        attribExpr(tree.falsepart, env);
-        result = check(tree,
-                       capture(condType(tree.pos(), tree.cond.type,
-                                        tree.truepart.type, tree.falsepart.type)),
-                       VAL, resultInfo);
+        Type condtype = attribExpr(tree.cond, env, syms.booleanType);
+
+        boolean standaloneConditional = !allowPoly ||
+                pt().tag == NONE && pt() != Type.recoveryType ||
+                isBooleanOrNumeric(env, tree);
+
+        if (!standaloneConditional && resultInfo.pt.tag == VOID) {
+            //cannot get here (i.e. it means we are returning from void method - which is already an error)
+            result = tree.type = types.createErrorType(resultInfo.pt);
+            return;
+        }
+
+        ResultInfo condInfo = standaloneConditional ?
+                unknownExprInfo :
+                new ResultInfo(VAL, pt(), new Check.NestedCheckContext(resultInfo.checkContext) {
+                    //this will use enclosing check context to check compatibility of
+                    //subexpression against target type; if we are in a method check context,
+                    //depending on whether boxing is allowed, we could have incompatibilities
+                    @Override
+                    public void report(DiagnosticPosition pos, JCDiagnostic details) {
+                        enclosingContext.report(pos, diags.fragment("incompatible.type.in.conditional", details));
+                    }
+                });
+
+        Type truetype = attribTree(tree.truepart, env, condInfo);
+        Type falsetype = attribTree(tree.falsepart, env, condInfo);
+
+        Type owntype = standaloneConditional ? condType(tree, truetype, falsetype) : pt();
+        if (condtype.constValue() != null &&
+                truetype.constValue() != null &&
+                falsetype.constValue() != null) {
+            //constant folding
+            owntype = cfolder.coerce(condtype.isTrue() ? truetype : falsetype, owntype);
+        }
+        result = check(tree, owntype, VAL, resultInfo);
     }
     //where
+        @SuppressWarnings("fallthrough")
+        private boolean isBooleanOrNumeric(Env<AttrContext> env, JCExpression tree) {
+            switch (tree.getTag()) {
+                case LITERAL: return ((JCLiteral)tree).typetag < CLASS;
+                case LAMBDA: case REFERENCE: return false;
+                case PARENS: return isBooleanOrNumeric(env, ((JCParens)tree).expr);
+                case CONDEXPR:
+                    JCConditional condTree = (JCConditional)tree;
+                    return isBooleanOrNumeric(env, condTree.truepart) &&
+                            isBooleanOrNumeric(env, condTree.falsepart);
+                default:
+                    Type speculativeType = deferredAttr.attribSpeculative(tree, env, unknownExprInfo).type;
+                    speculativeType = types.unboxedTypeOrType(speculativeType);
+                    return speculativeType.tag <= BOOLEAN;
+            }
+        }
+
         /** Compute the type of a conditional expression, after
-         *  checking that it exists. See Spec 15.25.
-         *
-         *  @param pos      The source position to be used for
-         *                  error diagnostics.
-         *  @param condtype The type of the expression's condition.
-         *  @param thentype The type of the expression's then-part.
-         *  @param elsetype The type of the expression's else-part.
-         */
-        private Type condType(DiagnosticPosition pos,
-                              Type condtype,
-                              Type thentype,
-                              Type elsetype) {
-            Type ctype = condType1(pos, condtype, thentype, elsetype);
-
-            // If condition and both arms are numeric constants,
-            // evaluate at compile-time.
-            return ((condtype.constValue() != null) &&
-                    (thentype.constValue() != null) &&
-                    (elsetype.constValue() != null))
-                ? cfolder.coerce(condtype.isTrue()?thentype:elsetype, ctype)
-                : ctype;
-        }
-        /** Compute the type of a conditional expression, after
-         *  checking that it exists.  Does not take into
+         *  checking that it exists.  See JLS 15.25. Does not take into
          *  account the special case where condition and both arms
          *  are constants.
          *
          *  @param pos      The source position to be used for error
          *                  diagnostics.
-         *  @param condtype The type of the expression's condition.
          *  @param thentype The type of the expression's then-part.
          *  @param elsetype The type of the expression's else-part.
          */
-        private Type condType1(DiagnosticPosition pos, Type condtype,
+        private Type condType(DiagnosticPosition pos,
                                Type thentype, Type elsetype) {
             // If same type, that is the result
             if (types.isSameType(thentype, elsetype))
@@ -1399,37 +1549,38 @@
             LOOP:
             while (env1 != null) {
                 switch (env1.tree.getTag()) {
-                case LABELLED:
-                    JCLabeledStatement labelled = (JCLabeledStatement)env1.tree;
-                    if (label == labelled.label) {
-                        // If jump is a continue, check that target is a loop.
-                        if (tag == CONTINUE) {
-                            if (!labelled.body.hasTag(DOLOOP) &&
-                                !labelled.body.hasTag(WHILELOOP) &&
-                                !labelled.body.hasTag(FORLOOP) &&
-                                !labelled.body.hasTag(FOREACHLOOP))
-                                log.error(pos, "not.loop.label", label);
-                            // Found labelled statement target, now go inwards
-                            // to next non-labelled tree.
-                            return TreeInfo.referencedStatement(labelled);
-                        } else {
-                            return labelled;
+                    case LABELLED:
+                        JCLabeledStatement labelled = (JCLabeledStatement)env1.tree;
+                        if (label == labelled.label) {
+                            // If jump is a continue, check that target is a loop.
+                            if (tag == CONTINUE) {
+                                if (!labelled.body.hasTag(DOLOOP) &&
+                                        !labelled.body.hasTag(WHILELOOP) &&
+                                        !labelled.body.hasTag(FORLOOP) &&
+                                        !labelled.body.hasTag(FOREACHLOOP))
+                                    log.error(pos, "not.loop.label", label);
+                                // Found labelled statement target, now go inwards
+                                // to next non-labelled tree.
+                                return TreeInfo.referencedStatement(labelled);
+                            } else {
+                                return labelled;
+                            }
                         }
-                    }
-                    break;
-                case DOLOOP:
-                case WHILELOOP:
-                case FORLOOP:
-                case FOREACHLOOP:
-                    if (label == null) return env1.tree;
-                    break;
-                case SWITCH:
-                    if (label == null && tag == BREAK) return env1.tree;
-                    break;
-                case METHODDEF:
-                case CLASSDEF:
-                    break LOOP;
-                default:
+                        break;
+                    case DOLOOP:
+                    case WHILELOOP:
+                    case FORLOOP:
+                    case FOREACHLOOP:
+                        if (label == null) return env1.tree;
+                        break;
+                    case SWITCH:
+                        if (label == null && tag == BREAK) return env1.tree;
+                        break;
+                    case LAMBDA:
+                    case METHODDEF:
+                    case CLASSDEF:
+                        break LOOP;
+                    default:
                 }
                 env1 = env1.next;
             }
@@ -1445,22 +1596,19 @@
     public void visitReturn(JCReturn tree) {
         // Check that there is an enclosing method which is
         // nested within than the enclosing class.
-        if (env.enclMethod == null ||
-            env.enclMethod.sym.owner != env.enclClass.sym) {
+        if (env.info.returnResult == null) {
             log.error(tree.pos(), "ret.outside.meth");
-
         } else {
             // Attribute return expression, if it exists, and check that
             // it conforms to result type of enclosing method.
-            Symbol m = env.enclMethod.sym;
-            if (m.type.getReturnType().tag == VOID) {
-                if (tree.expr != null)
+            if (tree.expr != null) {
+                if (env.info.returnResult.pt.tag == VOID) {
                     log.error(tree.expr.pos(),
                               "cant.ret.val.from.meth.decl.void");
-            } else if (tree.expr == null) {
+                }
+                attribTree(tree.expr, env, env.info.returnResult);
+            } else if (env.info.returnResult.pt.tag != VOID) {
                 log.error(tree.pos(), "missing.ret.val");
-            } else {
-                attribExpr(tree.expr, env, m.type.getReturnType());
             }
         }
         result = null;
@@ -1562,7 +1710,7 @@
                     // current instance (JLS ???).
                     boolean selectSuperPrev = localEnv.info.selectSuper;
                     localEnv.info.selectSuper = true;
-                    localEnv.info.varArgs = false;
+                    localEnv.info.pendingResolutionPhase = null;
                     Symbol sym = rs.resolveConstructor(
                         tree.meth.pos(), localEnv, site, argtypes, typeargtypes);
                     localEnv.info.selectSuper = selectSuperPrev;
@@ -1573,8 +1721,7 @@
                     // ...and check that it is legal in the current context.
                     // (this will also set the tree's type)
                     Type mpt = newMethodTemplate(resultInfo.pt, argtypes, typeargtypes);
-                    checkId(tree.meth, site, sym, localEnv, new ResultInfo(MTH, mpt),
-                            tree.varargsElement != null);
+                    checkId(tree.meth, site, sym, localEnv, new ResultInfo(MTH, mpt));
                 }
                 // Otherwise, `site' is an error type and we do nothing
             }
@@ -1589,35 +1736,18 @@
             // whose formal argument types is exactly the list of actual
             // arguments (this will also set the method symbol).
             Type mpt = newMethodTemplate(resultInfo.pt, argtypes, typeargtypes);
-            localEnv.info.varArgs = false;
-            Type mtype = attribExpr(tree.meth, localEnv, mpt);
+            localEnv.info.pendingResolutionPhase = null;
+            Type mtype = attribTree(tree.meth, localEnv, new ResultInfo(VAL, mpt, resultInfo.checkContext));
 
             // Compute the result type.
             Type restype = mtype.getReturnType();
             if (restype.tag == WILDCARD)
                 throw new AssertionError(mtype);
 
-            // as a special case, array.clone() has a result that is
-            // the same as static type of the array being cloned
-            if (tree.meth.hasTag(SELECT) &&
-                allowCovariantReturns &&
-                methName == names.clone &&
-                types.isArray(((JCFieldAccess) tree.meth).selected.type))
-                restype = ((JCFieldAccess) tree.meth).selected.type;
-
-            // as a special case, x.getClass() has type Class<? extends |X|>
-            if (allowGenerics &&
-                methName == names.getClass && tree.args.isEmpty()) {
-                Type qualifier = (tree.meth.hasTag(SELECT))
+            Type qualifier = (tree.meth.hasTag(SELECT))
                     ? ((JCFieldAccess) tree.meth).selected.type
                     : env.enclClass.sym.type;
-                restype = new
-                    ClassType(restype.getEnclosingType(),
-                              List.<Type>of(new WildcardType(types.erasure(qualifier),
-                                                               BoundKind.EXTENDS,
-                                                               syms.boundClass)),
-                              restype.tsym);
-            }
+            restype = adjustMethodReturnType(qualifier, methName, argtypes, restype);
 
             chk.checkRefTypes(tree.typeargs, typeargtypes);
 
@@ -1625,12 +1755,33 @@
             // current context.  Also, capture the return type
             result = check(tree, capture(restype), VAL, resultInfo);
 
-            if (localEnv.info.varArgs)
+            if (localEnv.info.lastResolveVarargs())
                 Assert.check(result.isErroneous() || tree.varargsElement != null);
         }
         chk.validate(tree.typeargs, localEnv);
     }
     //where
+        Type adjustMethodReturnType(Type qualifierType, Name methodName, List<Type> argtypes, Type restype) {
+            if (allowCovariantReturns &&
+                    methodName == names.clone &&
+                types.isArray(qualifierType)) {
+                // as a special case, array.clone() has a result that is
+                // the same as static type of the array being cloned
+                return qualifierType;
+            } else if (allowGenerics &&
+                    methodName == names.getClass &&
+                    argtypes.isEmpty()) {
+                // as a special case, x.getClass() has type Class<? extends |X|>
+                return new ClassType(restype.getEnclosingType(),
+                              List.<Type>of(new WildcardType(types.erasure(qualifierType),
+                                                               BoundKind.EXTENDS,
+                                                               syms.boundClass)),
+                              restype.tsym);
+            } else {
+                return restype;
+            }
+        }
+
         /** Check that given application node appears as first statement
          *  in a constructor call.
          *  @param tree   The application node
@@ -1652,11 +1803,11 @@
         /** Obtain a method type with given argument types.
          */
         Type newMethodTemplate(Type restype, List<Type> argtypes, List<Type> typeargtypes) {
-            MethodType mt = new MethodType(argtypes, restype, null, syms.methodClass);
+            MethodType mt = new MethodType(argtypes, restype, List.<Type>nil(), syms.methodClass);
             return (typeargtypes == null) ? mt : (Type)new ForAll(typeargtypes, mt);
         }
 
-    public void visitNewClass(JCNewClass tree) {
+    public void visitNewClass(final JCNewClass tree) {
         Type owntype = types.createErrorType(tree.type);
 
         // The local environment of a class creation is
@@ -1729,42 +1880,6 @@
         List<Type> argtypes = attribArgs(tree.args, localEnv);
         List<Type> typeargtypes = attribTypes(tree.typeargs, localEnv);
 
-        if (TreeInfo.isDiamond(tree) && !clazztype.isErroneous()) {
-            clazztype = attribDiamond(localEnv, tree, clazztype, argtypes, typeargtypes);
-            clazz.type = clazztype;
-        } else if (allowDiamondFinder &&
-                tree.def == null &&
-                !clazztype.isErroneous() &&
-                clazztype.getTypeArguments().nonEmpty() &&
-                findDiamonds) {
-            boolean prevDeferDiags = log.deferDiagnostics;
-            Queue<JCDiagnostic> prevDeferredDiags = log.deferredDiagnostics;
-            Type inferred = null;
-            try {
-                //disable diamond-related diagnostics
-                log.deferDiagnostics = true;
-                log.deferredDiagnostics = ListBuffer.lb();
-                inferred = attribDiamond(localEnv,
-                        tree,
-                        clazztype,
-                        argtypes,
-                        typeargtypes);
-            }
-            finally {
-                log.deferDiagnostics = prevDeferDiags;
-                log.deferredDiagnostics = prevDeferredDiags;
-            }
-            if (inferred != null &&
-                    !inferred.isErroneous() &&
-                    inferred.tag == CLASS &&
-                    types.isAssignable(inferred, pt().tag == NONE ? clazztype : pt(), Warner.noWarnings)) {
-                String key = types.isSameType(clazztype, inferred) ?
-                    "diamond.redundant.args" :
-                    "diamond.redundant.args.1";
-                log.warning(tree.clazz.pos(), key, clazztype, inferred);
-            }
-        }
-
         // If we have made no mistakes in the class type...
         if (clazztype.tag == CLASS) {
             // Enums may not be instantiated except implicitly
@@ -1791,6 +1906,45 @@
                 // Error recovery: pretend no arguments were supplied.
                 argtypes = List.nil();
                 typeargtypes = List.nil();
+            } else if (TreeInfo.isDiamond(tree)) {
+                ClassType site = new ClassType(clazztype.getEnclosingType(),
+                            clazztype.tsym.type.getTypeArguments(),
+                            clazztype.tsym);
+
+                Env<AttrContext> diamondEnv = localEnv.dup(tree);
+                diamondEnv.info.selectSuper = cdef != null;
+                diamondEnv.info.pendingResolutionPhase = null;
+
+                //if the type of the instance creation expression is a class type
+                //apply method resolution inference (JLS 15.12.2.7). The return type
+                //of the resolved constructor will be a partially instantiated type
+                Symbol constructor = rs.resolveDiamond(tree.pos(),
+                            diamondEnv,
+                            site,
+                            argtypes,
+                            typeargtypes);
+                tree.constructor = constructor.baseSymbol();
+
+                final TypeSymbol csym = clazztype.tsym;
+                ResultInfo diamondResult = new ResultInfo(MTH, newMethodTemplate(resultInfo.pt, argtypes, typeargtypes), new Check.NestedCheckContext(resultInfo.checkContext) {
+                    @Override
+                    public void report(DiagnosticPosition _unused, JCDiagnostic details) {
+                        enclosingContext.report(tree.clazz,
+                                diags.fragment("cant.apply.diamond.1", diags.fragment("diamond", csym), details));
+                    }
+                });
+                Type constructorType = tree.constructorType = types.createErrorType(clazztype);
+                constructorType = checkId(tree, site,
+                        constructor,
+                        diamondEnv,
+                        diamondResult);
+
+                tree.clazz.type = types.createErrorType(clazztype);
+                if (!constructorType.isErroneous()) {
+                    tree.clazz.type = clazztype = constructorType.getReturnType();
+                    tree.constructorType = types.createMethodTypeWithReturn(constructorType, syms.voidType);
+                }
+                clazztype = chk.checkClassType(tree.clazz, tree.clazz.type, true);
             }
 
             // Resolve the called constructor under the assumption
@@ -1802,20 +1956,19 @@
                 //order to avoid downstream failures
                 Env<AttrContext> rsEnv = localEnv.dup(tree);
                 rsEnv.info.selectSuper = cdef != null;
-                rsEnv.info.varArgs = false;
+                rsEnv.info.pendingResolutionPhase = null;
                 tree.constructor = rs.resolveConstructor(
                     tree.pos(), rsEnv, clazztype, argtypes, typeargtypes);
-                tree.constructorType = tree.constructor.type.isErroneous() ?
-                    syms.errType :
-                    checkConstructor(clazztype,
-                        tree.constructor,
-                        rsEnv,
-                        tree.args,
-                        argtypes,
-                        typeargtypes,
-                        rsEnv.info.varArgs);
-                if (rsEnv.info.varArgs)
-                    Assert.check(tree.constructorType.isErroneous() || tree.varargsElement != null);
+                if (cdef == null) { //do not check twice!
+                    tree.constructorType = checkId(tree,
+                            clazztype,
+                            tree.constructor,
+                            rsEnv,
+                            new ResultInfo(MTH, newMethodTemplate(syms.voidType, argtypes, typeargtypes)));
+                    if (rsEnv.info.lastResolveVarargs())
+                        Assert.check(tree.constructorType.isErroneous() || tree.varargsElement != null);
+                }
+                findDiamondIfNeeded(localEnv, tree, clazztype);
             }
 
             if (cdef != null) {
@@ -1861,6 +2014,8 @@
 
                 attribStat(cdef, localEnv);
 
+                checkLambdaCandidate(tree, cdef.sym, clazztype);
+
                 // If an outer instance is given,
                 // prefix it to the constructor arguments
                 // and delete it from the new expression
@@ -1872,24 +2027,15 @@
 
                 // Reassign clazztype and recompute constructor.
                 clazztype = cdef.sym.type;
-                boolean useVarargs = tree.varargsElement != null;
-                Symbol sym = rs.resolveConstructor(
-                    tree.pos(), localEnv, clazztype, argtypes,
-                    typeargtypes, true, useVarargs);
-                Assert.check(sym.kind < AMBIGUOUS || tree.constructor.type.isErroneous());
+                Symbol sym = tree.constructor = rs.resolveConstructor(
+                    tree.pos(), localEnv, clazztype, argtypes, typeargtypes);
+                Assert.check(sym.kind < AMBIGUOUS);
                 tree.constructor = sym;
-                if (tree.constructor.kind > ERRONEOUS) {
-                    tree.constructorType =  syms.errType;
-                }
-                else {
-                    tree.constructorType = checkConstructor(clazztype,
-                            tree.constructor,
-                            localEnv,
-                            tree.args,
-                            argtypes,
-                            typeargtypes,
-                            useVarargs);
-                }
+                tree.constructorType = checkId(tree,
+                    clazztype,
+                    tree.constructor,
+                    localEnv,
+                    new ResultInfo(VAL, newMethodTemplate(syms.voidType, argtypes, typeargtypes)));
             }
 
             if (tree.constructor != null && tree.constructor.kind == MTH)
@@ -1898,57 +2044,58 @@
         result = check(tree, owntype, VAL, resultInfo);
         chk.validate(tree.typeargs, localEnv);
     }
-
-    Type attribDiamond(Env<AttrContext> env,
-                        final JCNewClass tree,
-                        final Type clazztype,
-                        List<Type> argtypes,
-                        List<Type> typeargtypes) {
-        if (clazztype.isErroneous() ||
-                clazztype.isInterface()) {
-            //if the type of the instance creation expression is erroneous,
-            //or if it's an interface, or if something prevented us to form a valid
-            //mapping, return the (possibly erroneous) type unchanged
-            return clazztype;
+    //where
+        void findDiamondIfNeeded(Env<AttrContext> env, JCNewClass tree, Type clazztype) {
+            if (tree.def == null &&
+                    !clazztype.isErroneous() &&
+                    clazztype.getTypeArguments().nonEmpty() &&
+                    findDiamonds) {
+                JCTypeApply ta = (JCTypeApply)tree.clazz;
+                List<JCExpression> prevTypeargs = ta.arguments;
+                try {
+                    //create a 'fake' diamond AST node by removing type-argument trees
+                    ta.arguments = List.nil();
+                    ResultInfo findDiamondResult = new ResultInfo(VAL,
+                            resultInfo.checkContext.inferenceContext().free(resultInfo.pt) ? Type.noType : pt());
+                    Type inferred = deferredAttr.attribSpeculative(tree, env, findDiamondResult).type;
+                    if (!inferred.isErroneous() &&
+                        types.isAssignable(inferred, pt().tag == NONE ? syms.objectType : pt(), Warner.noWarnings)) {
+                        String key = types.isSameType(clazztype, inferred) ?
+                            "diamond.redundant.args" :
+                            "diamond.redundant.args.1";
+                        log.warning(tree.clazz.pos(), key, clazztype, inferred);
+                    }
+                } finally {
+                    ta.arguments = prevTypeargs;
+                }
+            }
         }
 
-        //dup attribution environment and augment the set of inference variables
-        Env<AttrContext> localEnv = env.dup(tree);
-
-        ClassType site = new ClassType(clazztype.getEnclosingType(),
-                    clazztype.tsym.type.getTypeArguments(),
-                    clazztype.tsym);
-
-        //if the type of the instance creation expression is a class type
-        //apply method resolution inference (JLS 15.12.2.7). The return type
-        //of the resolved constructor will be a partially instantiated type
-        Symbol constructor = rs.resolveDiamond(tree.pos(),
-                    localEnv,
-                    site,
-                    argtypes,
-                    typeargtypes);
-
-        Type owntype = types.createErrorType(clazztype);
-        if (constructor.kind == MTH) {
-            ResultInfo diamondResult = new ResultInfo(VAL, resultInfo.pt, new Check.NestedCheckContext(resultInfo.checkContext) {
-                @Override
-                public void report(DiagnosticPosition pos, JCDiagnostic details) {
-                    enclosingContext.report(tree.clazz.pos(),
-                            diags.fragment("cant.apply.diamond.1", diags.fragment("diamond", clazztype.tsym), details));
+            private void checkLambdaCandidate(JCNewClass tree, ClassSymbol csym, Type clazztype) {
+                if (allowLambda &&
+                        identifyLambdaCandidate &&
+                        clazztype.tag == CLASS &&
+                        pt().tag != NONE &&
+                        types.isFunctionalInterface(clazztype.tsym)) {
+                    Symbol descriptor = types.findDescriptorSymbol(clazztype.tsym);
+                    int count = 0;
+                    boolean found = false;
+                    for (Symbol sym : csym.members().getElements()) {
+                        if ((sym.flags() & SYNTHETIC) != 0 ||
+                                sym.isConstructor()) continue;
+                        count++;
+                        if (sym.kind != MTH ||
+                                !sym.name.equals(descriptor.name)) continue;
+                        Type mtype = types.memberType(clazztype, sym);
+                        if (types.overrideEquivalent(mtype, types.memberType(clazztype, descriptor))) {
+                            found = true;
+                        }
+                    }
+                    if (found && count == 1) {
+                        log.note(tree.def, "potential.lambda.found");
+                    }
                 }
-            });
-            owntype = checkMethod(site,
-                    constructor,
-                    diamondResult,
-                    localEnv,
-                    tree.args,
-                    argtypes,
-                    typeargtypes,
-                    localEnv.info.varArgs).getReturnType();
-        }
-
-        return chk.checkClassType(tree.clazz.pos(), owntype, true);
-    }
+            }
 
     /** Make an attributed null check tree.
      */
@@ -1966,13 +2113,14 @@
 
     public void visitNewArray(JCNewArray tree) {
         Type owntype = types.createErrorType(tree.type);
+        Env<AttrContext> localEnv = env.dup(tree);
         Type elemtype;
         if (tree.elemtype != null) {
-            elemtype = attribType(tree.elemtype, env);
-            chk.validate(tree.elemtype, env);
+            elemtype = attribType(tree.elemtype, localEnv);
+            chk.validate(tree.elemtype, localEnv);
             owntype = elemtype;
             for (List<JCExpression> l = tree.dims; l.nonEmpty(); l = l.tail) {
-                attribExpr(l.head, env, syms.intType);
+                attribExpr(l.head, localEnv, syms.intType);
                 owntype = new ArrayType(owntype, syms.arrayClass);
             }
         } else {
@@ -1989,7 +2137,7 @@
             }
         }
         if (tree.elems != null) {
-            attribExprs(tree.elems, env, elemtype);
+            attribExprs(tree.elems, localEnv, elemtype);
             owntype = new ArrayType(elemtype, syms.arrayClass);
         }
         if (!types.isReifiable(elemtype))
@@ -1997,14 +2145,394 @@
         result = check(tree, owntype, VAL, resultInfo);
     }
 
+    /*
+     * A lambda expression can only be attributed when a target-type is available.
+     * In addition, if the target-type is that of a functional interface whose
+     * descriptor contains inference variables in argument position the lambda expression
+     * is 'stuck' (see DeferredAttr).
+     */
     @Override
-    public void visitLambda(JCLambda that) {
-        throw new UnsupportedOperationException("Lambda expression not supported yet");
+    public void visitLambda(final JCLambda that) {
+        if (pt().isErroneous() || (pt().tag == NONE && pt() != Type.recoveryType)) {
+            if (pt().tag == NONE) {
+                //lambda only allowed in assignment or method invocation/cast context
+                log.error(that.pos(), "unexpected.lambda");
+            }
+            result = that.type = types.createErrorType(pt());
+            return;
+        }
+        //create an environment for attribution of the lambda expression
+        final Env<AttrContext> localEnv = lambdaEnv(that, env);
+        boolean needsRecovery = resultInfo.checkContext.deferredAttrContext() == deferredAttr.emptyDeferredAttrContext ||
+                resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.CHECK;
+        try {
+            List<Type> explicitParamTypes = null;
+            if (TreeInfo.isExplicitLambda(that)) {
+                //attribute lambda parameters
+                attribStats(that.params, localEnv);
+                explicitParamTypes = TreeInfo.types(that.params);
+            }
+
+            Type target = infer.instantiateFunctionalInterface(that, pt(), explicitParamTypes, resultInfo.checkContext);
+            Type lambdaType = (target == Type.recoveryType) ?
+                    fallbackDescriptorType(that) :
+                    types.findDescriptorType(target);
+
+            if (!TreeInfo.isExplicitLambda(that)) {
+                //add param type info in the AST
+                List<Type> actuals = lambdaType.getParameterTypes();
+                List<JCVariableDecl> params = that.params;
+
+                boolean arityMismatch = false;
+
+                while (params.nonEmpty()) {
+                    if (actuals.isEmpty()) {
+                        //not enough actuals to perform lambda parameter inference
+                        arityMismatch = true;
+                    }
+                    //reset previously set info
+                    Type argType = arityMismatch ?
+                            syms.errType :
+                            actuals.head;
+                    params.head.vartype = make.Type(argType);
+                    params.head.sym = null;
+                    actuals = actuals.isEmpty() ?
+                            actuals :
+                            actuals.tail;
+                    params = params.tail;
+                }
+
+                //attribute lambda parameters
+                attribStats(that.params, localEnv);
+
+                if (arityMismatch) {
+                    resultInfo.checkContext.report(that, diags.fragment("incompatible.arg.types.in.lambda"));
+                        result = that.type = types.createErrorType(target);
+                        return;
+                }
+            }
+
+            //from this point on, no recovery is needed; if we are in assignment context
+            //we will be able to attribute the whole lambda body, regardless of errors;
+            //if we are in a 'check' method context, and the lambda is not compatible
+            //with the target-type, it will be recovered anyway in Attr.checkId
+            needsRecovery = false;
+
+            ResultInfo bodyResultInfo = lambdaType.getReturnType() == Type.recoveryType ?
+                recoveryInfo :
+                new ResultInfo(VAL, lambdaType.getReturnType(), new LambdaReturnContext(resultInfo.checkContext));
+            localEnv.info.returnResult = bodyResultInfo;
+
+            if (that.getBodyKind() == JCLambda.BodyKind.EXPRESSION) {
+                attribTree(that.getBody(), localEnv, bodyResultInfo);
+            } else {
+                JCBlock body = (JCBlock)that.body;
+                attribStats(body.stats, localEnv);
+            }
+
+            result = check(that, target, VAL, resultInfo);
+
+            boolean isSpeculativeRound =
+                    resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.SPECULATIVE;
+
+            postAttr(that);
+            flow.analyzeLambda(env, that, make, isSpeculativeRound);
+
+            checkLambdaCompatible(that, lambdaType, resultInfo.checkContext, isSpeculativeRound);
+
+            if (!isSpeculativeRound) {
+                checkAccessibleFunctionalDescriptor(that, localEnv, resultInfo.checkContext.inferenceContext(), lambdaType);
+            }
+            result = check(that, target, VAL, resultInfo);
+        } catch (Types.FunctionDescriptorLookupError ex) {
+            JCDiagnostic cause = ex.getDiagnostic();
+            resultInfo.checkContext.report(that, cause);
+            result = that.type = types.createErrorType(pt());
+            return;
+        } finally {
+            localEnv.info.scope.leave();
+            if (needsRecovery) {
+                attribTree(that, env, recoveryInfo);
+            }
+        }
     }
+    //where
+        private Type fallbackDescriptorType(JCExpression tree) {
+            switch (tree.getTag()) {
+                case LAMBDA:
+                    JCLambda lambda = (JCLambda)tree;
+                    List<Type> argtypes = List.nil();
+                    for (JCVariableDecl param : lambda.params) {
+                        argtypes = param.vartype != null ?
+                                argtypes.append(param.vartype.type) :
+                                argtypes.append(syms.errType);
+                    }
+                    return new MethodType(argtypes, Type.recoveryType, List.<Type>nil(), syms.methodClass);
+                case REFERENCE:
+                    return new MethodType(List.<Type>nil(), Type.recoveryType, List.<Type>nil(), syms.methodClass);
+                default:
+                    Assert.error("Cannot get here!");
+            }
+            return null;
+        }
+
+        private void checkAccessibleFunctionalDescriptor(final DiagnosticPosition pos,
+                final Env<AttrContext> env, final InferenceContext inferenceContext, final Type desc) {
+            if (inferenceContext.free(desc)) {
+                inferenceContext.addFreeTypeListener(List.of(desc), new FreeTypeListener() {
+                    @Override
+                    public void typesInferred(InferenceContext inferenceContext) {
+                        checkAccessibleFunctionalDescriptor(pos, env, inferenceContext, inferenceContext.asInstType(desc, types));
+                    }
+                });
+            } else {
+                chk.checkAccessibleFunctionalDescriptor(pos, env, desc);
+            }
+        }
+
+        /**
+         * Lambda/method reference have a special check context that ensures
+         * that i.e. a lambda return type is compatible with the expected
+         * type according to both the inherited context and the assignment
+         * context.
+         */
+        class LambdaReturnContext extends Check.NestedCheckContext {
+            public LambdaReturnContext(CheckContext enclosingContext) {
+                super(enclosingContext);
+            }
+
+            @Override
+            public boolean compatible(Type found, Type req, Warner warn) {
+                //return type must be compatible in both current context and assignment context
+                return types.isAssignable(found, inferenceContext().asFree(req, types), warn) &&
+                        super.compatible(found, req, warn);
+            }
+            @Override
+            public void report(DiagnosticPosition pos, JCDiagnostic details) {
+                enclosingContext.report(pos, diags.fragment("incompatible.ret.type.in.lambda", details));
+            }
+        }
+
+        /**
+        * Lambda compatibility. Check that given return types, thrown types, parameter types
+        * are compatible with the expected functional interface descriptor. This means that:
+        * (i) parameter types must be identical to those of the target descriptor; (ii) return
+        * types must be compatible with the return type of the expected descriptor;
+        * (iii) thrown types must be 'included' in the thrown types list of the expected
+        * descriptor.
+        */
+        private void checkLambdaCompatible(JCLambda tree, Type descriptor, CheckContext checkContext, boolean speculativeAttr) {
+            Type returnType = checkContext.inferenceContext().asFree(descriptor.getReturnType(), types);
+
+            //return values have already been checked - but if lambda has no return
+            //values, we must ensure that void/value compatibility is correct;
+            //this amounts at checking that, if a lambda body can complete normally,
+            //the descriptor's return type must be void
+            if (tree.getBodyKind() == JCLambda.BodyKind.STATEMENT && tree.canCompleteNormally &&
+                    returnType.tag != VOID && returnType != Type.recoveryType) {
+                checkContext.report(tree, diags.fragment("incompatible.ret.type.in.lambda",
+                        diags.fragment("missing.ret.val", returnType)));
+            }
+
+            List<Type> argTypes = checkContext.inferenceContext().asFree(descriptor.getParameterTypes(), types);
+            if (!types.isSameTypes(argTypes, TreeInfo.types(tree.params))) {
+                checkContext.report(tree, diags.fragment("incompatible.arg.types.in.lambda"));
+            }
+
+            if (!speculativeAttr) {
+                List<Type> thrownTypes = checkContext.inferenceContext().asFree(descriptor.getThrownTypes(), types);
+                if (chk.unhandled(tree.inferredThrownTypes == null ? List.<Type>nil() : tree.inferredThrownTypes, thrownTypes).nonEmpty()) {
+                    log.error(tree, "incompatible.thrown.types.in.lambda", tree.inferredThrownTypes);
+                }
+            }
+        }
+
+        private Env<AttrContext> lambdaEnv(JCLambda that, Env<AttrContext> env) {
+            Env<AttrContext> lambdaEnv;
+            Symbol owner = env.info.scope.owner;
+            if (owner.kind == VAR && owner.owner.kind == TYP) {
+                //field initializer
+                lambdaEnv = env.dup(that, env.info.dup(env.info.scope.dupUnshared()));
+                lambdaEnv.info.scope.owner =
+                    new MethodSymbol(0, names.empty, null,
+                                     env.info.scope.owner);
+            } else {
+                lambdaEnv = env.dup(that, env.info.dup(env.info.scope.dup()));
+            }
+            return lambdaEnv;
+        }
 
     @Override
-    public void visitReference(JCMemberReference that) {
-        throw new UnsupportedOperationException("Member references not supported yet");
+    public void visitReference(final JCMemberReference that) {
+        if (pt().isErroneous() || (pt().tag == NONE && pt() != Type.recoveryType)) {
+            if (pt().tag == NONE) {
+                //method reference only allowed in assignment or method invocation/cast context
+                log.error(that.pos(), "unexpected.mref");
+            }
+            result = that.type = types.createErrorType(pt());
+            return;
+        }
+        final Env<AttrContext> localEnv = env.dup(that);
+        try {
+            //attribute member reference qualifier - if this is a constructor
+            //reference, the expected kind must be a type
+            Type exprType = attribTree(that.expr,
+                    env, new ResultInfo(that.getMode() == ReferenceMode.INVOKE ? VAL | TYP : TYP, Type.noType));
+
+            if (that.getMode() == JCMemberReference.ReferenceMode.NEW) {
+                exprType = chk.checkConstructorRefType(that.expr, exprType);
+            }
+
+            if (exprType.isErroneous()) {
+                //if the qualifier expression contains problems,
+                //give up atttribution of method reference
+                result = that.type = exprType;
+                return;
+            }
+
+            if (TreeInfo.isStaticSelector(that.expr, names) &&
+                    (that.getMode() != ReferenceMode.NEW || !that.expr.type.isRaw())) {
+                //if the qualifier is a type, validate it
+                chk.validate(that.expr, env);
+            }
+
+            //attrib type-arguments
+            List<Type> typeargtypes = null;
+            if (that.typeargs != null) {
+                typeargtypes = attribTypes(that.typeargs, localEnv);
+            }
+
+            Type target = infer.instantiateFunctionalInterface(that, pt(), null, resultInfo.checkContext);
+            Type desc = (target == Type.recoveryType) ?
+                    fallbackDescriptorType(that) :
+                    types.findDescriptorType(target);
+
+            List<Type> argtypes = desc.getParameterTypes();
+
+            boolean allowBoxing =
+                    resultInfo.checkContext.deferredAttrContext() == deferredAttr.emptyDeferredAttrContext ||
+                    resultInfo.checkContext.deferredAttrContext().phase.isBoxingRequired();
+            Pair<Symbol, Resolve.ReferenceLookupHelper> refResult = rs.resolveMemberReference(that.pos(), localEnv, that,
+                    that.expr.type, that.name, argtypes, typeargtypes, allowBoxing);
+
+            Symbol refSym = refResult.fst;
+            Resolve.ReferenceLookupHelper lookupHelper = refResult.snd;
+
+            if (refSym.kind != MTH) {
+                boolean targetError;
+                switch (refSym.kind) {
+                    case ABSENT_MTH:
+                        targetError = false;
+                        break;
+                    case WRONG_MTH:
+                    case WRONG_MTHS:
+                    case AMBIGUOUS:
+                    case HIDDEN:
+                    case STATICERR:
+                    case MISSING_ENCL:
+                        targetError = true;
+                        break;
+                    default:
+                        Assert.error("unexpected result kind " + refSym.kind);
+                        targetError = false;
+                }
+
+                JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT,
+                                that, exprType.tsym, exprType, that.name, argtypes, typeargtypes);
+
+                JCDiagnostic.DiagnosticType diagKind = targetError ?
+                        JCDiagnostic.DiagnosticType.FRAGMENT : JCDiagnostic.DiagnosticType.ERROR;
+
+                JCDiagnostic diag = diags.create(diagKind, log.currentSource(), that,
+                        "invalid.mref", Kinds.kindName(that.getMode()), detailsDiag);
+
+                if (targetError) {
+                    resultInfo.checkContext.report(that, diag);
+                } else {
+                    log.report(diag);
+                }
+                result = that.type = types.createErrorType(target);
+                return;
+            }
+
+            if (desc.getReturnType() == Type.recoveryType) {
+                // stop here
+                result = that.type = types.createErrorType(target);
+                return;
+            }
+
+            that.sym = refSym.baseSymbol();
+            that.kind = lookupHelper.referenceKind(that.sym);
+
+            ResultInfo checkInfo =
+                    resultInfo.dup(newMethodTemplate(
+                        desc.getReturnType().tag == VOID ? Type.noType : desc.getReturnType(),
+                        lookupHelper.argtypes,
+                        typeargtypes));
+
+            Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo);
+
+            if (!refType.isErroneous()) {
+                refType = types.createMethodTypeWithReturn(refType,
+                        adjustMethodReturnType(lookupHelper.site, that.name, checkInfo.pt.getParameterTypes(), refType.getReturnType()));
+            }
+
+            //go ahead with standard method reference compatibility check - note that param check
+            //is a no-op (as this has been taken care during method applicability)
+            boolean isSpeculativeRound =
+                    resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.SPECULATIVE;
+            checkReferenceCompatible(that, desc, refType, resultInfo.checkContext, isSpeculativeRound);
+            if (!isSpeculativeRound) {
+                checkAccessibleFunctionalDescriptor(that, localEnv, resultInfo.checkContext.inferenceContext(), desc);
+            }
+            result = check(that, target, VAL, resultInfo);
+        } catch (Types.FunctionDescriptorLookupError ex) {
+            JCDiagnostic cause = ex.getDiagnostic();
+            resultInfo.checkContext.report(that, cause);
+            result = that.type = types.createErrorType(pt());
+            return;
+        }
+    }
+
+    @SuppressWarnings("fallthrough")
+    void checkReferenceCompatible(JCMemberReference tree, Type descriptor, Type refType, CheckContext checkContext, boolean speculativeAttr) {
+        Type returnType = checkContext.inferenceContext().asFree(descriptor.getReturnType(), types);
+
+        Type resType;
+        switch (tree.getMode()) {
+            case NEW:
+                if (!tree.expr.type.isRaw()) {
+                    resType = tree.expr.type;
+                    break;
+                }
+            default:
+                resType = refType.getReturnType();
+        }
+
+        Type incompatibleReturnType = resType;
+
+        if (returnType.tag == VOID) {
+            incompatibleReturnType = null;
+        }
+
+        if (returnType.tag != VOID && resType.tag != VOID) {
+            if (resType.isErroneous() ||
+                    new LambdaReturnContext(checkContext).compatible(resType, returnType, Warner.noWarnings)) {
+                incompatibleReturnType = null;
+            }
+        }
+
+        if (incompatibleReturnType != null) {
+            checkContext.report(tree, diags.fragment("incompatible.ret.type.in.mref",
+                    diags.fragment("inconvertible.types", resType, descriptor.getReturnType())));
+        }
+
+        if (!speculativeAttr) {
+            List<Type> thrownTypes = checkContext.inferenceContext().asFree(descriptor.getThrownTypes(), types);
+            if (chk.unhandled(refType.getThrownTypes(), thrownTypes).nonEmpty()) {
+                log.error(tree, "incompatible.thrown.types.in.mref", refType.getThrownTypes());
+            }
+        }
     }
 
     public void visitParens(JCParens tree) {
@@ -2138,18 +2666,34 @@
         result = check(tree, owntype, VAL, resultInfo);
     }
 
-    public void visitTypeCast(JCTypeCast tree) {
+    public void visitTypeCast(final JCTypeCast tree) {
         Type clazztype = attribType(tree.clazz, env);
         chk.validate(tree.clazz, env, false);
         //a fresh environment is required for 292 inference to work properly ---
         //see Infer.instantiatePolymorphicSignatureInstance()
         Env<AttrContext> localEnv = env.dup(tree);
-        Type exprtype = attribExpr(tree.expr, localEnv, Infer.anyPoly);
-        Type owntype = chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
+        //should we propagate the target type?
+        final ResultInfo castInfo;
+        final boolean isPoly = TreeInfo.isPoly(tree.expr, tree);
+        if (isPoly) {
+            //expression is a poly - we need to propagate target type info
+            castInfo = new ResultInfo(VAL, clazztype, new Check.NestedCheckContext(resultInfo.checkContext) {
+                @Override
+                public boolean compatible(Type found, Type req, Warner warn) {
+                    return types.isCastable(found, req, warn);
+                }
+            });
+        } else {
+            //standalone cast - target-type info is not propagated
+            castInfo = unknownExprInfo;
+        }
+        Type exprtype = attribTree(tree.expr, localEnv, castInfo);
+        Type owntype = isPoly ? clazztype : chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
         if (exprtype.constValue() != null)
             owntype = cfolder.coerce(exprtype, owntype);
         result = check(tree, capture(owntype), VAL, resultInfo);
-        chk.checkRedundantCast(localEnv, tree);
+        if (!isPoly)
+            chk.checkRedundantCast(localEnv, tree);
     }
 
     public void visitTypeTest(JCInstanceOf tree) {
@@ -2176,15 +2720,13 @@
 
     public void visitIdent(JCIdent tree) {
         Symbol sym;
-        boolean varArgs = false;
 
         // Find symbol
         if (pt().tag == METHOD || pt().tag == FORALL) {
             // If we are looking for a method, the prototype `pt' will be a
             // method type with the type of the call's arguments as parameters.
-            env.info.varArgs = false;
+            env.info.pendingResolutionPhase = null;
             sym = rs.resolveMethod(tree.pos(), env, tree.name, pt().getParameterTypes(), pt().getTypeArguments());
-            varArgs = env.info.varArgs;
         } else if (tree.sym != null && tree.sym.kind != VAR) {
             sym = tree.sym;
         } else {
@@ -2246,7 +2788,7 @@
             while (env1.outer != null && !rs.isAccessible(env, env1.enclClass.sym.type, sym))
                 env1 = env1.outer;
         }
-        result = checkId(tree, env1.enclClass.sym.type, sym, env, resultInfo, varArgs);
+        result = checkId(tree, env1.enclClass.sym.type, sym, env, resultInfo);
     }
 
     public void visitSelect(JCFieldAccess tree) {
@@ -2289,13 +2831,13 @@
             sitesym.name == names._super;
 
         // Determine the symbol represented by the selection.
-        env.info.varArgs = false;
+        env.info.pendingResolutionPhase = null;
         Symbol sym = selectSym(tree, sitesym, site, env, resultInfo);
         if (sym.exists() && !isType(sym) && (pkind() & (PCK | TYP)) != 0) {
             site = capture(site);
             sym = selectSym(tree, sitesym, site, env, resultInfo);
         }
-        boolean varArgs = env.info.varArgs;
+        boolean varArgs = env.info.lastResolveVarargs();
         tree.sym = sym;
 
         if (site.tag == TYPEVAR && !isType(sym) && sym.kind != ERR) {
@@ -2344,9 +2886,10 @@
             } else {
                 // Check if type-qualified fields or methods are static (JLS)
                 if ((sym.flags() & STATIC) == 0 &&
+                    !env.next.tree.hasTag(REFERENCE) &&
                     sym.name != names._super &&
                     (sym.kind == VAR || sym.kind == MTH)) {
-                    rs.access(rs.new StaticError(sym),
+                    rs.accessBase(rs.new StaticError(sym),
                               tree.pos(), site, sym.name, true);
                 }
             }
@@ -2370,7 +2913,7 @@
         }
 
         env.info.selectSuper = selectSuperPrev;
-        result = checkId(tree, site, sym, env, resultInfo, varArgs);
+        result = checkId(tree, site, sym, env, resultInfo);
     }
     //where
         /** Determine symbol referenced by a Select expression,
@@ -2389,7 +2932,7 @@
             Name name = tree.name;
             switch (site.tag) {
             case PACKAGE:
-                return rs.access(
+                return rs.accessBase(
                     rs.findIdentInPackage(env, site.tsym, name, resultInfo.pkind),
                     pos, location, site, name, true);
             case ARRAY:
@@ -2413,7 +2956,7 @@
                     // We are seeing a plain identifier as selector.
                     Symbol sym = rs.findIdentInType(env, site, name, resultInfo.pkind);
                     if ((resultInfo.pkind & ERRONEOUS) == 0)
-                        sym = rs.access(sym, pos, location, site, name, true);
+                        sym = rs.accessBase(sym, pos, location, site, name, true);
                     return sym;
                 }
             case WILDCARD:
@@ -2435,7 +2978,7 @@
                     Symbol sym2 = (sym.flags() & Flags.PRIVATE) != 0 ?
                         rs.new AccessError(env, site, sym) :
                                 sym;
-                    rs.access(sym2, pos, location, site, name, true);
+                    rs.accessBase(sym2, pos, location, site, name, true);
                     return sym;
                 }
             case ERROR:
@@ -2486,9 +3029,18 @@
                      Type site,
                      Symbol sym,
                      Env<AttrContext> env,
-                     ResultInfo resultInfo,
-                     boolean useVarargs) {
-            if (resultInfo.pt.isErroneous()) return types.createErrorType(site);
+                     ResultInfo resultInfo) {
+            Type pt = resultInfo.pt.tag == FORALL || resultInfo.pt.tag == METHOD ?
+                    resultInfo.pt.map(deferredAttr.new DeferredTypeMap(AttrMode.SPECULATIVE, sym, env.info.pendingResolutionPhase)) :
+                    resultInfo.pt;
+
+            DeferredAttr.DeferredTypeMap recoveryMap =
+                    deferredAttr.new RecoveryDeferredTypeMap(AttrMode.CHECK, sym, env.info.pendingResolutionPhase);
+
+            if (pt.isErroneous()) {
+                Type.map(resultInfo.pt.getParameterTypes(), recoveryMap);
+                return types.createErrorType(site);
+            }
             Type owntype; // The computed type of this identifier occurrence.
             switch (sym.kind) {
             case TYP:
@@ -2563,14 +3115,14 @@
                 }
                 break;
             case MTH: {
-                JCMethodInvocation app = (JCMethodInvocation)env.tree;
                 owntype = checkMethod(site, sym,
                         new ResultInfo(VAL, resultInfo.pt.getReturnType(), resultInfo.checkContext),
-                        env, app.args, resultInfo.pt.getParameterTypes(),
-                        resultInfo.pt.getTypeArguments(), env.info.varArgs);
+                        env, TreeInfo.args(env.tree), resultInfo.pt.getParameterTypes(),
+                        resultInfo.pt.getTypeArguments());
                 break;
             }
             case PCK: case ERR:
+                Type.map(resultInfo.pt.getParameterTypes(), recoveryMap);
                 owntype = sym.type;
                 break;
             default:
@@ -2710,8 +3262,7 @@
                             Env<AttrContext> env,
                             final List<JCExpression> argtrees,
                             List<Type> argtypes,
-                            List<Type> typeargtypes,
-                            boolean useVarargs) {
+                            List<Type> typeargtypes) {
         // Test (5): if symbol is an instance method of a raw type, issue
         // an unchecked warning if its argument types change under erasure.
         if (allowGenerics &&
@@ -2733,18 +3284,16 @@
         // any type arguments and value arguments.
         noteWarner.clear();
         try {
-            Type owntype = rs.rawInstantiate(
+            Type owntype = rs.checkMethod(
                     env,
                     site,
                     sym,
                     resultInfo,
                     argtypes,
                     typeargtypes,
-                    allowBoxing,
-                    useVarargs,
                     noteWarner);
 
-            return chk.checkMethod(owntype, sym, env, argtrees, argtypes, useVarargs,
+            return chk.checkMethod(owntype, sym, env, argtrees, argtypes, env.info.lastResolveVarargs(),
                     noteWarner.hasNonSilentLint(LintCategory.UNCHECKED));
         } catch (Infer.InferenceException ex) {
             //invalid target type - propagate exception outwards or report error
@@ -2752,26 +3301,11 @@
             resultInfo.checkContext.report(env.tree.pos(), ex.getDiagnostic());
             return types.createErrorType(site);
         } catch (Resolve.InapplicableMethodException ex) {
-            Assert.error();
+            Assert.error(ex.getDiagnostic().getMessage(Locale.getDefault()));
             return null;
         }
     }
 
-    /**
-     * Check that constructor arguments conform to its instantiation.
-     **/
-    public Type checkConstructor(Type site,
-                            Symbol sym,
-                            Env<AttrContext> env,
-                            final List<JCExpression> argtrees,
-                            List<Type> argtypes,
-                            List<Type> typeargtypes,
-                            boolean useVarargs) {
-        Type owntype = checkMethod(site, sym, new ResultInfo(VAL, syms.voidType), env, argtrees, argtypes, typeargtypes, useVarargs);
-        chk.checkType(env.tree.pos(), owntype.getReturnType(), syms.voidType);
-        return owntype;
-    }
-
     public void visitLiteral(JCLiteral tree) {
         result = check(
             tree, litType(tree.typetag).constType(tree.value), VAL, resultInfo);
@@ -3075,8 +3609,10 @@
 
             Lint prevLint = chk.setLint(env.info.lint);
             JavaFileObject prev = log.useSource(c.sourcefile);
+            ResultInfo prevReturnRes = env.info.returnResult;
 
             try {
+                env.info.returnResult = null;
                 // java.lang.Enum may not be subclassed by a non-enum
                 if (st.tsym == syms.enumSym &&
                     ((c.flags_field & (Flags.ENUM|Flags.COMPOUND)) == 0))
@@ -3093,6 +3629,7 @@
 
                 chk.checkDeprecatedAnnotation(env.tree.pos(), c);
             } finally {
+                env.info.returnResult = prevReturnRes;
                 log.useSource(prev);
                 chk.setLint(prevLint);
             }
@@ -3280,8 +3817,8 @@
      * mode (e.g. by an IDE) and the AST contains semantic errors, this routine
      * prevents NPE to be progagated during subsequent compilation steps.
      */
-    public void postAttr(Env<AttrContext> env) {
-        new PostAttrAnalyzer().scan(env.tree);
+    public void postAttr(JCTree tree) {
+        new PostAttrAnalyzer().scan(tree);
     }
 
     class PostAttrAnalyzer extends TreeScanner {
@@ -3375,6 +3912,14 @@
                 that.operator = new OperatorSymbol(names.empty, syms.unknownType, -1, syms.noSymbol);
             super.visitUnary(that);
         }
+
+        @Override
+        public void visitReference(JCMemberReference that) {
+            super.visitReference(that);
+            if (that.sym == null) {
+                that.sym = new MethodSymbol(0, names.empty, syms.unknownType, syms.noSymbol);
+            }
+        }
     }
     // </editor-fold>
 }
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/AttrContext.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/AttrContext.java	Wed Jul 05 18:26:11 2017 +0200
@@ -56,7 +56,7 @@
 
     /** Are arguments to current function applications boxed into an array for varargs?
      */
-    boolean varArgs = false;
+    Resolve.MethodResolutionPhase pendingResolutionPhase = null;
 
     /** A record of the lint/SuppressWarnings currently in effect
      */
@@ -67,6 +67,11 @@
      */
     Symbol enclVar = null;
 
+    /** ResultInfo to be used for attributing 'return' statement expressions
+     * (set by Attr.visitMethod and Attr.visitLambda)
+     */
+    Attr.ResultInfo returnResult = null;
+
     /** Duplicate this context, replacing scope field and copying all others.
      */
     AttrContext dup(Scope scope) {
@@ -75,9 +80,10 @@
         info.staticLevel = staticLevel;
         info.isSelfCall = isSelfCall;
         info.selectSuper = selectSuper;
-        info.varArgs = varArgs;
+        info.pendingResolutionPhase = pendingResolutionPhase;
         info.lint = lint;
         info.enclVar = enclVar;
+        info.returnResult = returnResult;
         return info;
     }
 
@@ -93,6 +99,11 @@
         return scope.getElements();
     }
 
+    boolean lastResolveVarargs() {
+        return pendingResolutionPhase != null &&
+                pendingResolutionPhase.isVarargsRequired();
+    }
+
     public String toString() {
         return "AttrContext[" + scope.toString() + "]";
     }
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Wed Jul 05 18:26:11 2017 +0200
@@ -40,6 +40,9 @@
 import com.sun.tools.javac.code.Lint.LintCategory;
 import com.sun.tools.javac.code.Type.*;
 import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.comp.DeferredAttr.DeferredAttrContext;
+import com.sun.tools.javac.comp.Infer.InferenceContext;
+import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener;
 
 import static com.sun.tools.javac.code.Flags.*;
 import static com.sun.tools.javac.code.Flags.ANNOTATION;
@@ -66,6 +69,7 @@
     private final Resolve rs;
     private final Symtab syms;
     private final Enter enter;
+    private final DeferredAttr deferredAttr;
     private final Infer infer;
     private final Types types;
     private final JCDiagnostic.Factory diags;
@@ -98,6 +102,7 @@
         rs = Resolve.instance(context);
         syms = Symtab.instance(context);
         enter = Enter.instance(context);
+        deferredAttr = DeferredAttr.instance(context);
         infer = Infer.instance(context);
         this.types = Types.instance(context);
         diags = JCDiagnostic.Factory.instance(context);
@@ -416,7 +421,7 @@
      * checks - depending on the check context, meaning of 'compatibility' might
      * vary significantly.
      */
-    interface CheckContext {
+    public interface CheckContext {
         /**
          * Is type 'found' compatible with type 'req' in given context
          */
@@ -429,6 +434,12 @@
          * Obtain a warner for this check context
          */
         public Warner checkWarner(DiagnosticPosition pos, Type found, Type req);
+
+        public Infer.InferenceContext inferenceContext();
+
+        public DeferredAttr.DeferredAttrContext deferredAttrContext();
+
+        public boolean allowBoxing();
     }
 
     /**
@@ -455,6 +466,18 @@
         public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) {
             return enclosingContext.checkWarner(pos, found, req);
         }
+
+        public Infer.InferenceContext inferenceContext() {
+            return enclosingContext.inferenceContext();
+        }
+
+        public DeferredAttrContext deferredAttrContext() {
+            return enclosingContext.deferredAttrContext();
+        }
+
+        public boolean allowBoxing() {
+            return enclosingContext.allowBoxing();
+        }
     }
 
     /**
@@ -471,6 +494,18 @@
         public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) {
             return convertWarner(pos, found, req);
         }
+
+        public InferenceContext inferenceContext() {
+            return infer.emptyContext;
+        }
+
+        public DeferredAttrContext deferredAttrContext() {
+            return deferredAttr.emptyDeferredAttrContext;
+        }
+
+        public boolean allowBoxing() {
+            return true;
+        }
     };
 
     /** Check that a given type is assignable to a given proto-type.
@@ -483,7 +518,16 @@
         return checkType(pos, found, req, basicHandler);
     }
 
-    Type checkType(final DiagnosticPosition pos, Type found, Type req, CheckContext checkContext) {
+    Type checkType(final DiagnosticPosition pos, final Type found, final Type req, final CheckContext checkContext) {
+        final Infer.InferenceContext inferenceContext = checkContext.inferenceContext();
+        if (inferenceContext.free(req)) {
+            inferenceContext.addFreeTypeListener(List.of(req), new FreeTypeListener() {
+                @Override
+                public void typesInferred(InferenceContext inferenceContext) {
+                    checkType(pos, found, inferenceContext.asInstType(req, types), checkContext);
+                }
+            });
+        }
         if (req.tag == ERROR)
             return req;
         if (req.tag == NONE)
@@ -523,9 +567,9 @@
      */
     public void checkRedundantCast(Env<AttrContext> env, JCTypeCast tree) {
         if (!tree.type.isErroneous() &&
-            (env.info.lint == null || env.info.lint.isEnabled(Lint.LintCategory.CAST))
-            && types.isSameType(tree.expr.type, tree.clazz.type)
-            && !is292targetTypeCast(tree)) {
+                (env.info.lint == null || env.info.lint.isEnabled(Lint.LintCategory.CAST))
+                && types.isSameType(tree.expr.type, tree.clazz.type)
+                && !is292targetTypeCast(tree)) {
             log.warning(Lint.LintCategory.CAST,
                     tree.pos(), "redundant.cast", tree.expr.type);
         }
@@ -604,6 +648,22 @@
             return t;
     }
 
+    /** Check that type is a valid qualifier for a constructor reference expression
+     */
+    Type checkConstructorRefType(DiagnosticPosition pos, Type t) {
+        t = checkClassType(pos, t);
+        if (t.tag == CLASS) {
+            if ((t.tsym.flags() & (ABSTRACT | INTERFACE)) != 0) {
+                log.error(pos, "abstract.cant.be.instantiated");
+                t = types.createErrorType(t);
+            } else if ((t.tsym.flags() & ENUM) != 0) {
+                log.error(pos, "enum.cant.be.instantiated");
+                t = types.createErrorType(t);
+            }
+        }
+        return t;
+    }
+
     /** Check that type is a class or interface type.
      *  @param pos           Position to be used for error reporting.
      *  @param t             The type to be checked.
@@ -796,29 +856,34 @@
                 sym.owner == syms.enumSym)
                 formals = formals.tail.tail;
         List<JCExpression> args = argtrees;
-        while (formals.head != last) {
-            JCTree arg = args.head;
-            Warner warn = convertWarner(arg.pos(), arg.type, formals.head);
-            assertConvertible(arg, arg.type, formals.head, warn);
-            args = args.tail;
-            formals = formals.tail;
-        }
-        if (useVarargs) {
-            Type varArg = types.elemtype(last);
-            while (args.tail != null) {
+        DeferredAttr.DeferredTypeMap checkDeferredMap =
+                deferredAttr.new DeferredTypeMap(DeferredAttr.AttrMode.CHECK, sym, env.info.pendingResolutionPhase);
+        if (args != null) {
+            //this is null when type-checking a method reference
+            while (formals.head != last) {
                 JCTree arg = args.head;
-                Warner warn = convertWarner(arg.pos(), arg.type, varArg);
-                assertConvertible(arg, arg.type, varArg, warn);
+                Warner warn = convertWarner(arg.pos(), arg.type, formals.head);
+                assertConvertible(arg, arg.type, formals.head, warn);
                 args = args.tail;
+                formals = formals.tail;
             }
-        } else if ((sym.flags() & VARARGS) != 0 && allowVarargs) {
-            // non-varargs call to varargs method
-            Type varParam = owntype.getParameterTypes().last();
-            Type lastArg = argtypes.last();
-            if (types.isSubtypeUnchecked(lastArg, types.elemtype(varParam)) &&
-                    !types.isSameType(types.erasure(varParam), types.erasure(lastArg)))
-                log.warning(argtrees.last().pos(), "inexact.non-varargs.call",
-                        types.elemtype(varParam), varParam);
+            if (useVarargs) {
+                Type varArg = types.elemtype(last);
+                while (args.tail != null) {
+                    JCTree arg = args.head;
+                    Warner warn = convertWarner(arg.pos(), arg.type, varArg);
+                    assertConvertible(arg, arg.type, varArg, warn);
+                    args = args.tail;
+                }
+            } else if ((sym.flags() & VARARGS) != 0 && allowVarargs) {
+                // non-varargs call to varargs method
+                Type varParam = owntype.getParameterTypes().last();
+                Type lastArg = checkDeferredMap.apply(argtypes.last());
+                if (types.isSubtypeUnchecked(lastArg, types.elemtype(varParam)) &&
+                        !types.isSameType(types.erasure(varParam), types.erasure(lastArg)))
+                    log.warning(argtrees.last().pos(), "inexact.non-varargs.call",
+                            types.elemtype(varParam), varParam);
+            }
         }
         if (unchecked) {
             warnUnchecked(env.tree.pos(),
@@ -826,7 +891,7 @@
                     kindName(sym),
                     sym.name,
                     rs.methodArguments(sym.type.getParameterTypes()),
-                    rs.methodArguments(argtypes),
+                    rs.methodArguments(Type.map(argtypes, checkDeferredMap)),
                     kindName(sym.location()),
                     sym.location());
            owntype = new MethodType(owntype.getParameterTypes(),
@@ -853,6 +918,9 @@
                 case NEWCLASS:
                     ((JCNewClass) tree).varargsElement = elemtype;
                     break;
+                case REFERENCE:
+                    ((JCMemberReference) tree).varargsElement = elemtype;
+                    break;
                 default:
                     throw new AssertionError(""+tree);
             }
@@ -870,6 +938,65 @@
                 return;
         }
 
+        void checkAccessibleFunctionalDescriptor(DiagnosticPosition pos, Env<AttrContext> env, Type desc) {
+            AccessChecker accessChecker = new AccessChecker(env);
+            //check args accessibility (only if implicit parameter types)
+            for (Type arg : desc.getParameterTypes()) {
+                if (!accessChecker.visit(arg)) {
+                    log.error(pos, "cant.access.arg.type.in.functional.desc", arg);
+                    return;
+                }
+            }
+            //check return type accessibility
+            if (!accessChecker.visit(desc.getReturnType())) {
+                log.error(pos, "cant.access.return.in.functional.desc", desc.getReturnType());
+                return;
+            }
+            //check thrown types accessibility
+            for (Type thrown : desc.getThrownTypes()) {
+                if (!accessChecker.visit(thrown)) {
+                    log.error(pos, "cant.access.thrown.in.functional.desc", thrown);
+                    return;
+                }
+            }
+        }
+
+        class AccessChecker extends Types.UnaryVisitor<Boolean> {
+
+            Env<AttrContext> env;
+
+            AccessChecker(Env<AttrContext> env) {
+                this.env = env;
+            }
+
+            Boolean visit(List<Type> ts) {
+                for (Type t : ts) {
+                    if (!visit(t))
+                        return false;
+                }
+                return true;
+            }
+
+            public Boolean visitType(Type t, Void s) {
+                return true;
+            }
+
+            @Override
+            public Boolean visitArrayType(ArrayType t, Void s) {
+                return visit(t.elemtype);
+            }
+
+            @Override
+            public Boolean visitClassType(ClassType t, Void s) {
+                return rs.isAccessible(env, t, true) &&
+                        visit(t.getTypeArguments());
+            }
+
+            @Override
+            public Boolean visitWildcardType(WildcardType t, Void s) {
+                return visit(t.type);
+            }
+        };
     /**
      * Check that type 't' is a valid instantiation of a generic class
      * (see JLS 4.5)
@@ -2470,6 +2597,7 @@
         validateDocumented(t.tsym, s, pos);
         validateInherited(t.tsym, s, pos);
         validateTarget(t.tsym, s, pos);
+        validateDefault(t.tsym, s, pos);
     }
 
     /**
@@ -2650,6 +2778,21 @@
         return true;
     }
 
+    private void validateDefault(Symbol container, Symbol contained, DiagnosticPosition pos) {
+        // validate that all other elements of containing type has defaults
+        Scope scope = container.members();
+        for(Symbol elm : scope.getElements()) {
+            if (elm.name != names.value &&
+                elm.kind == Kinds.MTH &&
+                ((MethodSymbol)elm).defaultValue == null) {
+                log.error(pos,
+                          "invalid.containedby.annotation.elem.nondefault",
+                          container,
+                          elm);
+            }
+        }
+    }
+
     /** Is s a method symbol that overrides a method in a superclass? */
     boolean isOverrider(Symbol s) {
         if (s.kind != MTH || s.isStatic())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,640 @@
+/*
+ * Copyright (c) 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package com.sun.tools.javac.comp;
+
+import com.sun.tools.javac.code.*;
+import com.sun.tools.javac.tree.*;
+import com.sun.tools.javac.util.*;
+import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.code.Type.*;
+import com.sun.tools.javac.comp.Attr.ResultInfo;
+import com.sun.tools.javac.comp.Infer.InferenceContext;
+import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase;
+import com.sun.tools.javac.tree.JCTree.*;
+
+import javax.tools.JavaFileObject;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import static com.sun.tools.javac.code.TypeTags.*;
+import static com.sun.tools.javac.tree.JCTree.Tag.*;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
+
+/**
+ * This is an helper class that is used to perform deferred type-analysis.
+ * Each time a poly expression occurs in argument position, javac attributes it
+ * with a temporary 'deferred type' that is checked (possibly multiple times)
+ * against an expected formal type.
+ *
+ *  <p><b>This is NOT part of any supported API.
+ *  If you write code that depends on this, you do so at your own risk.
+ *  This code and its internal interfaces are subject to change or
+ *  deletion without notice.</b>
+ */
+public class DeferredAttr extends JCTree.Visitor {
+    protected static final Context.Key<DeferredAttr> deferredAttrKey =
+        new Context.Key<DeferredAttr>();
+
+    final Attr attr;
+    final Check chk;
+    final Enter enter;
+    final Infer infer;
+    final Log log;
+    final Symtab syms;
+    final TreeMaker make;
+    final Types types;
+
+    public static DeferredAttr instance(Context context) {
+        DeferredAttr instance = context.get(deferredAttrKey);
+        if (instance == null)
+            instance = new DeferredAttr(context);
+        return instance;
+    }
+
+    protected DeferredAttr(Context context) {
+        context.put(deferredAttrKey, this);
+        attr = Attr.instance(context);
+        chk = Check.instance(context);
+        enter = Enter.instance(context);
+        infer = Infer.instance(context);
+        log = Log.instance(context);
+        syms = Symtab.instance(context);
+        make = TreeMaker.instance(context);
+        types = Types.instance(context);
+    }
+
+    /**
+     * This type represents a deferred type. A deferred type starts off with
+     * no information on the underlying expression type. Such info needs to be
+     * discovered through type-checking the deferred type against a target-type.
+     * Every deferred type keeps a pointer to the AST node from which it originated.
+     */
+    public class DeferredType extends Type {
+
+        public JCExpression tree;
+        Env<AttrContext> env;
+        AttrMode mode;
+        SpeculativeCache speculativeCache;
+
+        DeferredType(JCExpression tree, Env<AttrContext> env) {
+            super(DEFERRED, null);
+            this.tree = tree;
+            this.env = env.dup(tree, env.info.dup());
+            this.speculativeCache = new SpeculativeCache();
+        }
+
+        /**
+         * A speculative cache is used to keep track of all overload resolution rounds
+         * that triggered speculative attribution on a given deferred type. Each entry
+         * stores a pointer to the speculative tree and the resolution phase in which the entry
+         * has been added.
+         */
+        class SpeculativeCache {
+
+            private Map<Symbol, List<Entry>> cache =
+                    new WeakHashMap<Symbol, List<Entry>>();
+
+            class Entry {
+                JCTree speculativeTree;
+                Resolve.MethodResolutionPhase phase;
+
+                public Entry(JCTree speculativeTree, MethodResolutionPhase phase) {
+                    this.speculativeTree = speculativeTree;
+                    this.phase = phase;
+                }
+
+                boolean matches(Resolve.MethodResolutionPhase phase) {
+                    return this.phase == phase;
+                }
+            }
+
+            /**
+             * Clone a speculative cache entry as a fresh entry associated
+             * with a new method (this maybe required to fixup speculative cache
+             * misses after Resolve.access())
+             */
+            void dupAllTo(Symbol from, Symbol to) {
+                Assert.check(cache.get(to) == null);
+                List<Entry> entries = cache.get(from);
+                if (entries != null) {
+                    cache.put(to, entries);
+                }
+            }
+
+            /**
+             * Retrieve a speculative cache entry corresponding to given symbol
+             * and resolution phase
+             */
+            Entry get(Symbol msym, MethodResolutionPhase phase) {
+                List<Entry> entries = cache.get(msym);
+                if (entries == null) return null;
+                for (Entry e : entries) {
+                    if (e.matches(phase)) return e;
+                }
+                return null;
+            }
+
+            /**
+             * Stores a speculative cache entry corresponding to given symbol
+             * and resolution phase
+             */
+            void put(Symbol msym, JCTree speculativeTree, MethodResolutionPhase phase) {
+                List<Entry> entries = cache.get(msym);
+                if (entries == null) {
+                    entries = List.nil();
+                }
+                cache.put(msym, entries.prepend(new Entry(speculativeTree, phase)));
+            }
+        }
+
+        /**
+         * Get the type that has been computed during a speculative attribution round
+         */
+        Type speculativeType(Symbol msym, MethodResolutionPhase phase) {
+            SpeculativeCache.Entry e = speculativeCache.get(msym, phase);
+            return e != null ? e.speculativeTree.type : Type.noType;
+        }
+
+        /**
+         * Check a deferred type against a potential target-type. Depending on
+         * the current attribution mode, a normal vs. speculative attribution
+         * round is performed on the underlying AST node. There can be only one
+         * speculative round for a given target method symbol; moreover, a normal
+         * attribution round must follow one or more speculative rounds.
+         */
+        Type check(ResultInfo resultInfo) {
+            DeferredAttrContext deferredAttrContext =
+                    resultInfo.checkContext.deferredAttrContext();
+            Assert.check(deferredAttrContext != emptyDeferredAttrContext);
+            List<Type> stuckVars = stuckVars(tree, resultInfo);
+            if (stuckVars.nonEmpty()) {
+                deferredAttrContext.addDeferredAttrNode(this, resultInfo, stuckVars);
+                return Type.noType;
+            } else {
+                try {
+                    switch (deferredAttrContext.mode) {
+                        case SPECULATIVE:
+                            Assert.check(mode == null ||
+                                    (mode == AttrMode.SPECULATIVE &&
+                                    speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).tag == NONE));
+                            JCTree speculativeTree = attribSpeculative(tree, env, resultInfo);
+                            speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase);
+                            return speculativeTree.type;
+                        case CHECK:
+                            Assert.check(mode == AttrMode.SPECULATIVE);
+                            return attr.attribTree(tree, env, resultInfo);
+                    }
+                    Assert.error();
+                    return null;
+                } finally {
+                    mode = deferredAttrContext.mode;
+                }
+            }
+        }
+    }
+
+    /**
+     * The 'mode' in which the deferred type is to be type-checked
+     */
+    public enum AttrMode {
+        /**
+         * A speculative type-checking round is used during overload resolution
+         * mainly to generate constraints on inference variables. Side-effects
+         * arising from type-checking the expression associated with the deferred
+         * type are reversed after the speculative round finishes. This means the
+         * expression tree will be left in a blank state.
+         */
+        SPECULATIVE,
+        /**
+         * This is the plain type-checking mode. Produces side-effects on the underlying AST node
+         */
+        CHECK;
+    }
+
+    /**
+     * Routine that performs speculative type-checking; the input AST node is
+     * cloned (to avoid side-effects cause by Attr) and compiler state is
+     * restored after type-checking. All diagnostics (but critical ones) are
+     * disabled during speculative type-checking.
+     */
+    JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) {
+        JCTree newTree = new TreeCopier<Object>(make).copy(tree);
+        Env<AttrContext> speculativeEnv = env.dup(newTree, env.info.dup(env.info.scope.dupUnshared()));
+        speculativeEnv.info.scope.owner = env.info.scope.owner;
+        Filter<JCDiagnostic> prevDeferDiagsFilter = log.deferredDiagFilter;
+        Queue<JCDiagnostic> prevDeferredDiags = log.deferredDiagnostics;
+        final JavaFileObject currentSource = log.currentSourceFile();
+        try {
+            log.deferredDiagnostics = new ListBuffer<JCDiagnostic>();
+            log.deferredDiagFilter = new Filter<JCDiagnostic>() {
+                public boolean accepts(JCDiagnostic t) {
+                    return t.getDiagnosticSource().getFile().equals(currentSource);
+                }
+            };
+            attr.attribTree(newTree, speculativeEnv, resultInfo);
+            unenterScanner.scan(newTree);
+            return newTree;
+        } catch (Abort ex) {
+            //if some very bad condition occurred during deferred attribution
+            //we should dump all errors before killing javac
+            log.reportDeferredDiagnostics();
+            throw ex;
+        } finally {
+            unenterScanner.scan(newTree);
+            log.deferredDiagFilter = prevDeferDiagsFilter;
+            log.deferredDiagnostics = prevDeferredDiags;
+        }
+    }
+    //where
+        protected TreeScanner unenterScanner = new TreeScanner() {
+            @Override
+            public void visitClassDef(JCClassDecl tree) {
+                ClassSymbol csym = tree.sym;
+                enter.typeEnvs.remove(csym);
+                chk.compiled.remove(csym.flatname);
+                syms.classes.remove(csym.flatname);
+                super.visitClassDef(tree);
+            }
+        };
+
+    /**
+     * A deferred context is created on each method check. A deferred context is
+     * used to keep track of information associated with the method check, such as
+     * the symbol of the method being checked, the overload resolution phase,
+     * the kind of attribution mode to be applied to deferred types and so forth.
+     * As deferred types are processed (by the method check routine) stuck AST nodes
+     * are added (as new deferred attribution nodes) to this context. The complete()
+     * routine makes sure that all pending nodes are properly processed, by
+     * progressively instantiating all inference variables on which one or more
+     * deferred attribution node is stuck.
+     */
+    class DeferredAttrContext {
+
+        /** attribution mode */
+        final AttrMode mode;
+
+        /** symbol of the method being checked */
+        final Symbol msym;
+
+        /** method resolution step */
+        final Resolve.MethodResolutionPhase phase;
+
+        /** inference context */
+        final InferenceContext inferenceContext;
+
+        /** list of deferred attribution nodes to be processed */
+        ArrayList<DeferredAttrNode> deferredAttrNodes = new ArrayList<DeferredAttrNode>();
+
+        DeferredAttrContext(AttrMode mode, Symbol msym, MethodResolutionPhase phase, InferenceContext inferenceContext) {
+            this.mode = mode;
+            this.msym = msym;
+            this.phase = phase;
+            this.inferenceContext = inferenceContext;
+        }
+
+        /**
+         * Adds a node to the list of deferred attribution nodes - used by Resolve.rawCheckArgumentsApplicable
+         * Nodes added this way act as 'roots' for the out-of-order method checking process.
+         */
+        void addDeferredAttrNode(final DeferredType dt, ResultInfo resultInfo, List<Type> stuckVars) {
+            deferredAttrNodes.add(new DeferredAttrNode(dt, resultInfo, stuckVars));
+        }
+
+        /**
+         * Incrementally process all nodes, by skipping 'stuck' nodes and attributing
+         * 'unstuck' ones. If at any point no progress can be made (no 'unstuck' nodes)
+         * some inference variable might get eagerly instantiated so that all nodes
+         * can be type-checked.
+         */
+        void complete() {
+            while (!deferredAttrNodes.isEmpty()) {
+                Set<Type> stuckVars = new HashSet<Type>();
+                boolean progress = false;
+                //scan a defensive copy of the node list - this is because a deferred
+                //attribution round can add new nodes to the list
+                for (DeferredAttrNode deferredAttrNode : List.from(deferredAttrNodes)) {
+                    if (!deferredAttrNode.isStuck()) {
+                        deferredAttrNode.process();
+                        deferredAttrNodes.remove(deferredAttrNode);
+                        progress = true;
+                    } else {
+                        stuckVars.addAll(deferredAttrNode.stuckVars);
+                    }
+                }
+                if (!progress) {
+                    //remove all variables that have already been instantiated
+                    //from the list of stuck variables
+                    inferenceContext.solveAny(inferenceContext.freeVarsIn(List.from(stuckVars)), types, infer);
+                    inferenceContext.notifyChange(types);
+                }
+            }
+        }
+
+        /**
+         * Class representing a deferred attribution node. It keeps track of
+         * a deferred type, along with the expected target type information.
+         */
+        class DeferredAttrNode implements Infer.InferenceContext.FreeTypeListener {
+
+            /** underlying deferred type */
+            DeferredType dt;
+
+            /** underlying target type information */
+            ResultInfo resultInfo;
+
+            /** list of uninferred inference variables causing this node to be stuck */
+            List<Type> stuckVars;
+
+            DeferredAttrNode(DeferredType dt, ResultInfo resultInfo, List<Type> stuckVars) {
+                this.dt = dt;
+                this.resultInfo = resultInfo;
+                this.stuckVars = stuckVars;
+                if (!stuckVars.isEmpty()) {
+                    resultInfo.checkContext.inferenceContext().addFreeTypeListener(stuckVars, this);
+                }
+            }
+
+            @Override
+            public void typesInferred(InferenceContext inferenceContext) {
+                stuckVars = List.nil();
+                resultInfo = resultInfo.dup(inferenceContext.asInstType(resultInfo.pt, types));
+            }
+
+            /**
+             * is this node stuck?
+             */
+            boolean isStuck() {
+                return stuckVars.nonEmpty();
+            }
+
+            /**
+             * Process a deferred attribution node.
+             * Invariant: a stuck node cannot be processed.
+             */
+            void process() {
+                if (isStuck()) {
+                    throw new IllegalStateException("Cannot process a stuck deferred node");
+                }
+                dt.check(resultInfo);
+            }
+        }
+    }
+
+    /** an empty deferred attribution context - all methods throw exceptions */
+    final DeferredAttrContext emptyDeferredAttrContext =
+            new DeferredAttrContext(null, null, null, null) {
+                @Override
+                void addDeferredAttrNode(DeferredType dt, ResultInfo ri, List<Type> stuckVars) {
+                    Assert.error("Empty deferred context!");
+                }
+                @Override
+                void complete() {
+                    Assert.error("Empty deferred context!");
+                }
+            };
+
+    /**
+     * Map a list of types possibly containing one or more deferred types
+     * into a list of ordinary types. Each deferred type D is mapped into a type T,
+     * where T is computed by retrieving the type that has already been
+     * computed for D during a previous deferred attribution round of the given kind.
+     */
+    class DeferredTypeMap extends Type.Mapping {
+
+        DeferredAttrContext deferredAttrContext;
+
+        protected DeferredTypeMap(AttrMode mode, Symbol msym, MethodResolutionPhase phase) {
+            super(String.format("deferredTypeMap[%s]", mode));
+            this.deferredAttrContext = new DeferredAttrContext(mode, msym, phase, infer.emptyContext);
+        }
+
+        protected boolean validState(DeferredType dt) {
+            return dt.mode != null &&
+                    deferredAttrContext.mode.ordinal() <= dt.mode.ordinal();
+        }
+
+        @Override
+        public Type apply(Type t) {
+            if (t.tag != DEFERRED) {
+                return t.map(this);
+            } else {
+                DeferredType dt = (DeferredType)t;
+                Assert.check(validState(dt));
+                return typeOf(dt);
+            }
+        }
+
+        protected Type typeOf(DeferredType dt) {
+            switch (deferredAttrContext.mode) {
+                case CHECK:
+                    return dt.tree.type == null ? Type.noType : dt.tree.type;
+                case SPECULATIVE:
+                    return dt.speculativeType(deferredAttrContext.msym, deferredAttrContext.phase);
+            }
+            Assert.error();
+            return null;
+        }
+    }
+
+    /**
+     * Specialized recovery deferred mapping.
+     * Each deferred type D is mapped into a type T, where T is computed either by
+     * (i) retrieving the type that has already been computed for D during a previous
+     * attribution round (as before), or (ii) by synthesizing a new type R for D
+     * (the latter step is useful in a recovery scenario).
+     */
+    public class RecoveryDeferredTypeMap extends DeferredTypeMap {
+
+        public RecoveryDeferredTypeMap(AttrMode mode, Symbol msym, MethodResolutionPhase phase) {
+            super(mode, msym, phase);
+        }
+
+        @Override
+        protected Type typeOf(DeferredType dt) {
+            Type owntype = super.typeOf(dt);
+            return owntype.tag == NONE ?
+                        recover(dt) : owntype;
+        }
+
+        @Override
+        protected boolean validState(DeferredType dt) {
+            return true;
+        }
+
+        /**
+         * Synthesize a type for a deferred type that hasn't been previously
+         * reduced to an ordinary type. Functional deferred types and conditionals
+         * are mapped to themselves, in order to have a richer diagnostic
+         * representation. Remaining deferred types are attributed using
+         * a default expected type (j.l.Object).
+         */
+        private Type recover(DeferredType dt) {
+            dt.check(attr.new RecoveryInfo(deferredAttrContext));
+            switch (TreeInfo.skipParens(dt.tree).getTag()) {
+                case LAMBDA:
+                case REFERENCE:
+                case CONDEXPR:
+                    //propagate those deferred types to the
+                    //diagnostic formatter
+                    return dt;
+                default:
+                    return super.apply(dt);
+            }
+        }
+    }
+
+    /**
+     * Retrieves the list of inference variables that need to be inferred before
+     * an AST node can be type-checked
+     */
+    @SuppressWarnings("fallthrough")
+    List<Type> stuckVars(JCTree tree, ResultInfo resultInfo) {
+        if (resultInfo.pt.tag == NONE || resultInfo.pt.isErroneous()) {
+            return List.nil();
+        } else {
+            StuckChecker sc = new StuckChecker(resultInfo);
+            sc.scan(tree);
+            return List.from(sc.stuckVars);
+        }
+    }
+
+    /**
+     * This visitor is used to check that structural expressions conform
+     * to their target - this step is required as inference could end up
+     * inferring types that make some of the nested expressions incompatible
+     * with their corresponding instantiated target
+     */
+    class StuckChecker extends TreeScanner {
+
+        Type pt;
+        Filter<JCTree> treeFilter;
+        Infer.InferenceContext inferenceContext;
+        Set<Type> stuckVars = new HashSet<Type>();
+
+        final Filter<JCTree> argsFilter = new Filter<JCTree>() {
+            public boolean accepts(JCTree t) {
+                switch (t.getTag()) {
+                    case CONDEXPR:
+                    case LAMBDA:
+                    case PARENS:
+                    case REFERENCE:
+                        return true;
+                    default:
+                        return false;
+                }
+            }
+        };
+
+        final Filter<JCTree> lambdaBodyFilter = new Filter<JCTree>() {
+            public boolean accepts(JCTree t) {
+                switch (t.getTag()) {
+                    case BLOCK: case CASE: case CATCH: case DOLOOP:
+                    case FOREACHLOOP: case FORLOOP: case RETURN:
+                    case SYNCHRONIZED: case SWITCH: case TRY: case WHILELOOP:
+                        return true;
+                    default:
+                        return false;
+                }
+            }
+        };
+
+        StuckChecker(ResultInfo resultInfo) {
+            this.pt = resultInfo.pt;
+            this.inferenceContext = resultInfo.checkContext.inferenceContext();
+            this.treeFilter = argsFilter;
+        }
+
+        @Override
+        public void scan(JCTree tree) {
+            if (tree != null && treeFilter.accepts(tree)) {
+                super.scan(tree);
+            }
+        }
+
+        @Override
+        public void visitLambda(JCLambda tree) {
+            Type prevPt = pt;
+            Filter<JCTree> prevFilter = treeFilter;
+            try {
+                if (inferenceContext.inferenceVars().contains(pt)) {
+                    stuckVars.add(pt);
+                }
+                if (!types.isFunctionalInterface(pt.tsym)) {
+                    return;
+                }
+                Type descType = types.findDescriptorType(pt);
+                List<Type> freeArgVars = inferenceContext.freeVarsIn(descType.getParameterTypes());
+                if (!TreeInfo.isExplicitLambda(tree) &&
+                        freeArgVars.nonEmpty()) {
+                    stuckVars.addAll(freeArgVars);
+                }
+                pt = descType.getReturnType();
+                if (tree.getBodyKind() == JCTree.JCLambda.BodyKind.EXPRESSION) {
+                    scan(tree.getBody());
+                } else {
+                    treeFilter = lambdaBodyFilter;
+                    super.visitLambda(tree);
+                }
+            } finally {
+                pt = prevPt;
+                treeFilter = prevFilter;
+            }
+        }
+
+        @Override
+        public void visitReference(JCMemberReference tree) {
+            scan(tree.expr);
+            if (inferenceContext.inferenceVars().contains(pt)) {
+                stuckVars.add(pt);
+                return;
+            }
+            if (!types.isFunctionalInterface(pt.tsym)) {
+                return;
+            }
+            Type descType = types.findDescriptorType(pt);
+            List<Type> freeArgVars = inferenceContext.freeVarsIn(descType.getParameterTypes());
+            stuckVars.addAll(freeArgVars);
+        }
+
+        @Override
+        public void visitReturn(JCReturn tree) {
+            Filter<JCTree> prevFilter = treeFilter;
+            try {
+                treeFilter = argsFilter;
+                if (tree.expr != null) {
+                    scan(tree.expr);
+                }
+            } finally {
+                treeFilter = prevFilter;
+            }
+        }
+    }
+}
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java	Wed Jul 05 18:26:11 2017 +0200
@@ -50,8 +50,8 @@
  *  (see AssignAnalyzer) ensures that each variable is assigned when used.  Definite
  *  unassignment analysis (see AssignAnalyzer) in ensures that no final variable
  *  is assigned more than once. Finally, local variable capture analysis (see CaptureAnalyzer)
- *  determines that local variables accessed within the scope of an inner class are
- *  either final or effectively-final.
+ *  determines that local variables accessed within the scope of an inner class/lambda
+ *  are either final or effectively-final.
  *
  *  <p>The JLS has a number of problems in the
  *  specification of these flow analysis problems. This implementation
@@ -211,6 +211,29 @@
         new CaptureAnalyzer().analyzeTree(env, make);
     }
 
+    public void analyzeLambda(Env<AttrContext> env, JCLambda that, TreeMaker make, boolean speculative) {
+        java.util.Queue<JCDiagnostic> prevDeferredDiagnostics = log.deferredDiagnostics;
+        Filter<JCDiagnostic> prevDeferDiagsFilter = log.deferredDiagFilter;
+        //we need to disable diagnostics temporarily; the problem is that if
+        //a lambda expression contains e.g. an unreachable statement, an error
+        //message will be reported and will cause compilation to skip the flow analyis
+        //step - if we suppress diagnostics, we won't stop at Attr for flow-analysis
+        //related errors, which will allow for more errors to be detected
+        if (!speculative) {
+            log.deferAll();
+            log.deferredDiagnostics = ListBuffer.lb();
+        }
+        try {
+            new AliveAnalyzer().analyzeTree(env, that, make);
+            new FlowAnalyzer().analyzeTree(env, that, make);
+        } finally {
+            if (!speculative) {
+                log.deferredDiagFilter = prevDeferDiagsFilter;
+                log.deferredDiagnostics = prevDeferredDiagnostics;
+            }
+        }
+    }
+
     /**
      * Definite assignment scan mode
      */
@@ -659,6 +682,27 @@
             }
         }
 
+        @Override
+        public void visitLambda(JCLambda tree) {
+            if (tree.type != null &&
+                    tree.type.isErroneous()) {
+                return;
+            }
+
+            ListBuffer<PendingExit> prevPending = pendingExits;
+            boolean prevAlive = alive;
+            try {
+                pendingExits = ListBuffer.lb();
+                alive = true;
+                scanStat(tree.body);
+                tree.canCompleteNormally = alive;
+            }
+            finally {
+                pendingExits = prevPending;
+                alive = prevAlive;
+            }
+        }
+
         public void visitTopLevel(JCCompilationUnit tree) {
             // Do nothing for TopLevel since each class is visited individually
         }
@@ -670,6 +714,9 @@
         /** Perform definite assignment/unassignment analysis on a tree.
          */
         public void analyzeTree(Env<AttrContext> env, TreeMaker make) {
+            analyzeTree(env, env.tree, make);
+        }
+        public void analyzeTree(Env<AttrContext> env, JCTree tree, TreeMaker make) {
             try {
                 attrEnv = env;
                 Flow.this.make = make;
@@ -1185,6 +1232,29 @@
             }
         }
 
+        @Override
+        public void visitLambda(JCLambda tree) {
+            if (tree.type != null &&
+                    tree.type.isErroneous()) {
+                return;
+            }
+            List<Type> prevCaught = caught;
+            List<Type> prevThrown = thrown;
+            ListBuffer<FlowPendingExit> prevPending = pendingExits;
+            try {
+                pendingExits = ListBuffer.lb();
+                caught = List.of(syms.throwableType); //inhibit exception checking
+                thrown = List.nil();
+                scan(tree.body);
+                tree.inferredThrownTypes = thrown;
+            }
+            finally {
+                pendingExits = prevPending;
+                caught = prevCaught;
+                thrown = prevThrown;
+            }
+        }
+
         public void visitTopLevel(JCCompilationUnit tree) {
             // Do nothing for TopLevel since each class is visited individually
         }
@@ -1267,6 +1337,10 @@
          */
         int nextadr;
 
+        /** The first variable sequence number in a block that can return.
+         */
+        int returnadr;
+
         /** The list of unreferenced automatic resources.
          */
         Scope unrefdResources;
@@ -1296,8 +1370,8 @@
 
         @Override
         void markDead() {
-            inits.inclRange(firstadr, nextadr);
-            uninits.inclRange(firstadr, nextadr);
+            inits.inclRange(returnadr, nextadr);
+            uninits.inclRange(returnadr, nextadr);
         }
 
         /*-------------- Processing variables ----------------------*/
@@ -1318,11 +1392,7 @@
          *  index into the vars array.
          */
         void newVar(VarSymbol sym) {
-            if (nextadr == vars.length) {
-                VarSymbol[] newvars = new VarSymbol[nextadr * 2];
-                System.arraycopy(vars, 0, newvars, 0, nextadr);
-                vars = newvars;
-            }
+            vars = ArrayUtils.ensureCapacity(vars, nextadr);
             if ((sym.flags() & FINAL) == 0) {
                 sym.flags_field |= EFFECTIVELY_FINAL;
             }
@@ -1556,6 +1626,7 @@
             Bits uninitsPrev = uninits.dup();
             int nextadrPrev = nextadr;
             int firstadrPrev = firstadr;
+            int returnadrPrev = returnadr;
             Lint lintPrev = lint;
 
             lint = lint.augment(tree.sym.annotations);
@@ -1600,6 +1671,7 @@
                 uninits = uninitsPrev;
                 nextadr = nextadrPrev;
                 firstadr = firstadrPrev;
+                returnadr = returnadrPrev;
                 lint = lintPrev;
             }
         }
@@ -1984,6 +2056,35 @@
             scan(tree.def);
         }
 
+        @Override
+        public void visitLambda(JCLambda tree) {
+            Bits prevUninits = uninits;
+            Bits prevInits = inits;
+            int returnadrPrev = returnadr;
+            ListBuffer<AssignPendingExit> prevPending = pendingExits;
+            try {
+                returnadr = nextadr;
+                pendingExits = new ListBuffer<AssignPendingExit>();
+                for (List<JCVariableDecl> l = tree.params; l.nonEmpty(); l = l.tail) {
+                    JCVariableDecl def = l.head;
+                    scan(def);
+                    inits.incl(def.sym.adr);
+                    uninits.excl(def.sym.adr);
+                }
+                if (tree.getBodyKind() == JCLambda.BodyKind.EXPRESSION) {
+                    scanExpr(tree.body);
+                } else {
+                    scan(tree.body);
+                }
+            }
+            finally {
+                returnadr = returnadrPrev;
+                uninits = prevUninits;
+                inits = prevInits;
+                pendingExits = prevPending;
+            }
+        }
+
         public void visitNewArray(JCNewArray tree) {
             scanExprs(tree.dims);
             scanExprs(tree.elems);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,18 +25,24 @@
 
 package com.sun.tools.javac.comp;
 
+import com.sun.tools.javac.code.*;
+import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.code.Type.*;
+import com.sun.tools.javac.code.Type.UndetVar.InferenceBound;
+import com.sun.tools.javac.comp.DeferredAttr.AttrMode;
+import com.sun.tools.javac.comp.Resolve.InapplicableMethodException;
+import com.sun.tools.javac.comp.Resolve.VerboseResolutionMode;
 import com.sun.tools.javac.tree.JCTree;
 import com.sun.tools.javac.tree.JCTree.JCTypeCast;
 import com.sun.tools.javac.tree.TreeInfo;
 import com.sun.tools.javac.util.*;
 import com.sun.tools.javac.util.List;
-import com.sun.tools.javac.code.*;
-import com.sun.tools.javac.code.Type.*;
-import com.sun.tools.javac.code.Symbol.*;
-import com.sun.tools.javac.comp.Resolve.InapplicableMethodException;
-import com.sun.tools.javac.comp.Resolve.VerboseResolutionMode;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
 import static com.sun.tools.javac.code.TypeTags.*;
 
 /** Helper class for type parameter inference, used by the attribution phase.
@@ -57,6 +63,7 @@
     Types types;
     Check chk;
     Resolve rs;
+    DeferredAttr deferredAttr;
     Log log;
     JCDiagnostic.Factory diags;
 
@@ -72,55 +79,54 @@
         syms = Symtab.instance(context);
         types = Types.instance(context);
         rs = Resolve.instance(context);
+        deferredAttr = DeferredAttr.instance(context);
         log = Log.instance(context);
         chk = Check.instance(context);
         diags = JCDiagnostic.Factory.instance(context);
         inferenceException = new InferenceException(diags);
-
     }
 
+   /**
+    * This exception class is design to store a list of diagnostics corresponding
+    * to inference errors that can arise during a method applicability check.
+    */
     public static class InferenceException extends InapplicableMethodException {
         private static final long serialVersionUID = 0;
 
+        List<JCDiagnostic> messages = List.nil();
+
         InferenceException(JCDiagnostic.Factory diags) {
             super(diags);
         }
+
+        @Override
+        InapplicableMethodException setMessage(JCDiagnostic diag) {
+            messages = messages.append(diag);
+            return this;
+        }
+
+        @Override
+        public JCDiagnostic getDiagnostic() {
+            return messages.head;
+        }
+
+        void clear() {
+            messages = List.nil();
+        }
     }
 
     private final InferenceException inferenceException;
 
 /***************************************************************************
- * Auxiliary type values and classes
- ***************************************************************************/
-
-    /** A mapping that turns type variables into undetermined type variables.
-     */
-    List<Type> makeUndetvars(List<Type> tvars) {
-        List<Type> undetvars = Type.map(tvars, fromTypeVarFun);
-        for (Type t : undetvars) {
-            UndetVar uv = (UndetVar)t;
-            uv.hibounds = types.getBounds((TypeVar)uv.qtype);
-        }
-        return undetvars;
-    }
-    //where
-            Mapping fromTypeVarFun = new Mapping("fromTypeVarFun") {
-                public Type apply(Type t) {
-                    if (t.tag == TYPEVAR) return new UndetVar(t);
-                    else return t.map(this);
-                }
-            };
-
-/***************************************************************************
  * Mini/Maximization of UndetVars
  ***************************************************************************/
 
     /** Instantiate undetermined type variable to its minimal upper bound.
      *  Throw a NoInstanceException if this not possible.
      */
-    void maximizeInst(UndetVar that, Warner warn) throws InferenceException {
-        List<Type> hibounds = Type.filter(that.hibounds, errorFilter);
-        if (that.eq.isEmpty()) {
+   void maximizeInst(UndetVar that, Warner warn) throws InferenceException {
+        List<Type> hibounds = Type.filter(that.getBounds(InferenceBound.UPPER), boundFilter);
+        if (that.getBounds(InferenceBound.EQ).isEmpty()) {
             if (hibounds.isEmpty())
                 that.inst = syms.objectType;
             else if (hibounds.tail.isEmpty())
@@ -128,7 +134,7 @@
             else
                 that.inst = types.glb(hibounds);
         } else {
-            that.inst = that.eq.head;
+            that.inst = that.getBounds(InferenceBound.EQ).head;
         }
         if (that.inst == null ||
             that.inst.isErroneous())
@@ -137,10 +143,10 @@
                             that.qtype, hibounds);
     }
 
-    private Filter<Type> errorFilter = new Filter<Type>() {
+    private Filter<Type> boundFilter = new Filter<Type>() {
         @Override
         public boolean accepts(Type t) {
-            return !t.isErroneous();
+            return !t.isErroneous() && t.tag != BOT;
         }
     };
 
@@ -148,11 +154,12 @@
      *  Throw a NoInstanceException if this not possible.
      */
     void minimizeInst(UndetVar that, Warner warn) throws InferenceException {
-        List<Type> lobounds = Type.filter(that.lobounds, errorFilter);
-        if (that.eq.isEmpty()) {
-            if (lobounds.isEmpty())
-                that.inst = syms.botType;
-            else if (lobounds.tail.isEmpty())
+        List<Type> lobounds = Type.filter(that.getBounds(InferenceBound.LOWER), boundFilter);
+        if (that.getBounds(InferenceBound.EQ).isEmpty()) {
+            if (lobounds.isEmpty()) {
+                //do nothing - the inference variable is under-constrained
+                return;
+            } else if (lobounds.tail.isEmpty())
                 that.inst = lobounds.head.isPrimitive() ? syms.errType : lobounds.head;
             else {
                 that.inst = types.lub(lobounds);
@@ -162,120 +169,99 @@
                         .setMessage("no.unique.minimal.instance.exists",
                                     that.qtype, lobounds);
         } else {
-            that.inst = that.eq.head;
+            that.inst = that.getBounds(InferenceBound.EQ).head;
         }
     }
 
-    Type asUndetType(Type t, List<Type> undetvars) {
-        return types.subst(t, inferenceVars(undetvars), undetvars);
-    }
-
-    List<Type> inferenceVars(List<Type> undetvars) {
-        ListBuffer<Type> tvars = ListBuffer.lb();
-        for (Type uv : undetvars) {
-            tvars.append(((UndetVar)uv).qtype);
-        }
-        return tvars.toList();
-    }
-
 /***************************************************************************
  * Exported Methods
  ***************************************************************************/
 
-    /** Try to instantiate expression type `that' to given type `to'.
-     *  If a maximal instantiation exists which makes this type
-     *  a subtype of type `to', return the instantiated type.
-     *  If no instantiation exists, or if several incomparable
-     *  best instantiations exist throw a NoInstanceException.
+    /**
+     * Instantiate uninferred inference variables (JLS 15.12.2.8). First
+     * if the method return type is non-void, we derive constraints from the
+     * expected type - then we use declared bound well-formedness to derive additional
+     * constraints. If no instantiation exists, or if several incomparable
+     * best instantiations exist throw a NoInstanceException.
      */
-    public List<Type> instantiateUninferred(DiagnosticPosition pos,
-                                List<Type> undetvars,
-                                List<Type> tvars,
-                                MethodType mtype,
-                                Attr.ResultInfo resultInfo,
-                                Warner warn) throws InferenceException {
+    public void instantiateUninferred(DiagnosticPosition pos,
+            InferenceContext inferenceContext,
+            MethodType mtype,
+            Attr.ResultInfo resultInfo,
+            Warner warn) throws InferenceException {
         Type to = resultInfo.pt;
-        if (to.tag == NONE) {
+        if (to.tag == NONE || resultInfo.checkContext.inferenceContext().free(resultInfo.pt)) {
             to = mtype.getReturnType().tag <= VOID ?
                     mtype.getReturnType() : syms.objectType;
         }
-        Type qtype1 = types.subst(mtype.getReturnType(), tvars, undetvars);
+        Type qtype1 = inferenceContext.asFree(mtype.getReturnType(), types);
         if (!types.isSubtype(qtype1,
                 qtype1.tag == UNDETVAR ? types.boxedTypeOrType(to) : to)) {
             throw inferenceException
-                .setMessage("infer.no.conforming.instance.exists",
-                            tvars, mtype.getReturnType(), to);
+                    .setMessage("infer.no.conforming.instance.exists",
+                    inferenceContext.restvars(), mtype.getReturnType(), to);
         }
 
-        List<Type> insttypes;
         while (true) {
             boolean stuck = true;
-            insttypes = List.nil();
-            for (Type t : undetvars) {
+            for (Type t : inferenceContext.undetvars) {
                 UndetVar uv = (UndetVar)t;
-                if (uv.inst == null && (uv.eq.nonEmpty() || !Type.containsAny(uv.hibounds, tvars))) {
+                if (uv.inst == null && (uv.getBounds(InferenceBound.EQ).nonEmpty() ||
+                        !inferenceContext.free(uv.getBounds(InferenceBound.UPPER)))) {
                     maximizeInst((UndetVar)t, warn);
                     stuck = false;
                 }
-                insttypes = insttypes.append(uv.inst == null ? uv.qtype : uv.inst);
             }
-            if (!Type.containsAny(insttypes, tvars)) {
+            if (inferenceContext.restvars().isEmpty()) {
                 //all variables have been instantiated - exit
                 break;
             } else if (stuck) {
                 //some variables could not be instantiated because of cycles in
                 //upper bounds - provide a (possibly recursive) default instantiation
-                insttypes = types.subst(insttypes,
-                    tvars,
-                    instantiateAsUninferredVars(undetvars, tvars));
+                instantiateAsUninferredVars(inferenceContext);
                 break;
             } else {
                 //some variables have been instantiated - replace newly instantiated
                 //variables in remaining upper bounds and continue
-                for (Type t : undetvars) {
+                for (Type t : inferenceContext.undetvars) {
                     UndetVar uv = (UndetVar)t;
-                    uv.hibounds = types.subst(uv.hibounds, tvars, insttypes);
+                    uv.substBounds(inferenceContext.inferenceVars(), inferenceContext.instTypes(), types);
                 }
             }
         }
-        return insttypes;
     }
 
     /**
      * Infer cyclic inference variables as described in 15.12.2.8.
      */
-    private List<Type> instantiateAsUninferredVars(List<Type> undetvars, List<Type> tvars) {
-        Assert.check(undetvars.length() == tvars.length());
-        ListBuffer<Type> insttypes = ListBuffer.lb();
+    private void instantiateAsUninferredVars(InferenceContext inferenceContext) {
         ListBuffer<Type> todo = ListBuffer.lb();
         //step 1 - create fresh tvars
-        for (Type t : undetvars) {
+        for (Type t : inferenceContext.undetvars) {
             UndetVar uv = (UndetVar)t;
             if (uv.inst == null) {
                 TypeSymbol fresh_tvar = new TypeSymbol(Flags.SYNTHETIC, uv.qtype.tsym.name, null, uv.qtype.tsym.owner);
-                fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.hibounds), null);
+                fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null);
                 todo.append(uv);
                 uv.inst = fresh_tvar.type;
             }
-            insttypes.append(uv.inst);
         }
         //step 2 - replace fresh tvars in their bounds
-        List<Type> formals = tvars;
+        List<Type> formals = inferenceContext.inferenceVars();
         for (Type t : todo) {
             UndetVar uv = (UndetVar)t;
             TypeVar ct = (TypeVar)uv.inst;
-            ct.bound = types.glb(types.subst(types.getBounds(ct), tvars, insttypes.toList()));
+            ct.bound = types.glb(inferenceContext.asInstTypes(types.getBounds(ct), types));
             if (ct.bound.isErroneous()) {
                 //report inference error if glb fails
                 reportBoundError(uv, BoundErrorKind.BAD_UPPER);
             }
             formals = formals.tail;
         }
-        return insttypes.toList();
     }
 
-    /** Instantiate method type `mt' by finding instantiations of
-     *  `tvars' so that method can be applied to `argtypes'.
+    /** Instantiate a generic method type by finding instantiations for all its
+     * inference variables so that it can be applied to a given argument type list.
      */
     public Type instantiateMethod(Env<AttrContext> env,
                                   List<Type> tvars,
@@ -285,85 +271,65 @@
                                   List<Type> argtypes,
                                   boolean allowBoxing,
                                   boolean useVarargs,
+                                  Resolve.MethodResolutionContext resolveContext,
                                   Warner warn) throws InferenceException {
         //-System.err.println("instantiateMethod(" + tvars + ", " + mt + ", " + argtypes + ")"); //DEBUG
-        List<Type> undetvars =  makeUndetvars(tvars);
+        final InferenceContext inferenceContext = new InferenceContext(tvars, this, true);
+        inferenceException.clear();
 
-        List<Type> capturedArgs =
-                rs.checkRawArgumentsAcceptable(env, undetvars, argtypes, mt.getParameterTypes(),
-                    allowBoxing, useVarargs, warn, new InferenceCheckHandler(undetvars));
-
-        // minimize as yet undetermined type variables
-        for (Type t : undetvars)
-            minimizeInst((UndetVar) t, warn);
+        try {
+            rs.checkRawArgumentsAcceptable(env, msym, resolveContext.attrMode(), inferenceContext,
+                    argtypes, mt.getParameterTypes(), allowBoxing, useVarargs, warn,
+                    new InferenceCheckHandler(inferenceContext));
 
-        /** Type variables instantiated to bottom */
-        ListBuffer<Type> restvars = new ListBuffer<Type>();
-
-        /** Undet vars instantiated to bottom */
-        final ListBuffer<Type> restundet = new ListBuffer<Type>();
+            // minimize as yet undetermined type variables
+            for (Type t : inferenceContext.undetvars) {
+                minimizeInst((UndetVar)t, warn);
+            }
 
-        /** Instantiated types or TypeVars if under-constrained */
-        ListBuffer<Type> insttypes = new ListBuffer<Type>();
+            checkWithinBounds(inferenceContext, warn);
 
-        /** Instantiated types or UndetVars if under-constrained */
-        ListBuffer<Type> undettypes = new ListBuffer<Type>();
+            mt = (MethodType)inferenceContext.asInstType(mt, types);
 
-        for (Type t : undetvars) {
-            UndetVar uv = (UndetVar)t;
-            if (uv.inst.tag == BOT) {
-                restvars.append(uv.qtype);
-                restundet.append(uv);
-                insttypes.append(uv.qtype);
-                undettypes.append(uv);
-                uv.inst = null;
-            } else {
-                insttypes.append(uv.inst);
-                undettypes.append(uv.inst);
-            }
-        }
-        checkWithinBounds(tvars, undetvars, insttypes.toList(), warn);
-
-        mt = (MethodType)types.subst(mt, tvars, insttypes.toList());
+            List<Type> restvars = inferenceContext.restvars();
 
-        if (!restvars.isEmpty() && resultInfo != null) {
-            List<Type> restInferred =
-                    instantiateUninferred(env.tree.pos(), restundet.toList(), restvars.toList(), mt, resultInfo, warn);
-            checkWithinBounds(tvars, undetvars,
-                           types.subst(insttypes.toList(), restvars.toList(), restInferred), warn);
-            mt = (MethodType)types.subst(mt, restvars.toList(), restInferred);
-            if (rs.verboseResolutionMode.contains(VerboseResolutionMode.DEFERRED_INST)) {
-                log.note(env.tree.pos, "deferred.method.inst", msym, mt, resultInfo.pt);
+            if (!restvars.isEmpty()) {
+                if (resultInfo != null && !warn.hasNonSilentLint(Lint.LintCategory.UNCHECKED)) {
+                    instantiateUninferred(env.tree.pos(), inferenceContext, mt, resultInfo, warn);
+                    checkWithinBounds(inferenceContext, warn);
+                    mt = (MethodType)inferenceContext.asInstType(mt, types);
+                    if (rs.verboseResolutionMode.contains(VerboseResolutionMode.DEFERRED_INST)) {
+                        log.note(env.tree.pos, "deferred.method.inst", msym, mt, resultInfo.pt);
+                    }
+                }
             }
+
+            // return instantiated version of method type
+            return mt;
+        } finally {
+            inferenceContext.notifyChange(types);
         }
-
-        if (restvars.isEmpty() || resultInfo != null) {
-            // check that actuals conform to inferred formals
-            checkArgumentsAcceptable(env, capturedArgs, mt.getParameterTypes(), allowBoxing, useVarargs, warn);
-        }
-        // return instantiated version of method type
-        return mt;
     }
     //where
 
         /** inference check handler **/
         class InferenceCheckHandler implements Resolve.MethodCheckHandler {
 
-            List<Type> undetvars;
+            InferenceContext inferenceContext;
 
-            public InferenceCheckHandler(List<Type> undetvars) {
-                this.undetvars = undetvars;
+            public InferenceCheckHandler(InferenceContext inferenceContext) {
+                this.inferenceContext = inferenceContext;
             }
 
             public InapplicableMethodException arityMismatch() {
-                return inferenceException.setMessage("infer.arg.length.mismatch", inferenceVars(undetvars));
+                return inferenceException.setMessage("infer.arg.length.mismatch", inferenceContext.inferenceVars());
             }
             public InapplicableMethodException argumentMismatch(boolean varargs, JCDiagnostic details) {
                 String key = varargs ?
                         "infer.varargs.argument.mismatch" :
                         "infer.no.conforming.assignment.exists";
                 return inferenceException.setMessage(key,
-                        inferenceVars(undetvars), details);
+                        inferenceContext.inferenceVars(), details);
             }
             public InapplicableMethodException inaccessibleVarargs(Symbol location, Type expected) {
                 return inferenceException.setMessage("inaccessible.varargs.type",
@@ -371,51 +337,61 @@
             }
         }
 
-        private void checkArgumentsAcceptable(Env<AttrContext> env, List<Type> actuals, List<Type> formals,
-                boolean allowBoxing, boolean useVarargs, Warner warn) {
-            try {
-                rs.checkRawArgumentsAcceptable(env, actuals, formals,
-                       allowBoxing, useVarargs, warn);
-            }
-            catch (InapplicableMethodException ex) {
-                // inferred method is not applicable
-                throw inferenceException.setMessage(ex.getDiagnostic());
-            }
-        }
-
     /** check that type parameters are within their bounds.
      */
-    void checkWithinBounds(List<Type> tvars,
-                           List<Type> undetvars,
-                           List<Type> arguments,
-                           Warner warn)
-        throws InferenceException {
-        List<Type> args = arguments;
-        for (Type t : undetvars) {
+    void checkWithinBounds(InferenceContext inferenceContext,
+                           Warner warn) throws InferenceException {
+        //step 1 - check compatibility of instantiated type w.r.t. initial bounds
+        for (Type t : inferenceContext.undetvars) {
             UndetVar uv = (UndetVar)t;
-            uv.hibounds = types.subst(uv.hibounds, tvars, arguments);
-            uv.lobounds = types.subst(uv.lobounds, tvars, arguments);
-            uv.eq = types.subst(uv.eq, tvars, arguments);
-            checkCompatibleUpperBounds(uv, tvars);
-            if (args.head.tag != TYPEVAR || !args.head.containsAny(tvars)) {
-                Type inst = args.head;
-                for (Type u : uv.hibounds) {
-                    if (!types.isSubtypeUnchecked(inst, types.subst(u, tvars, undetvars), warn)) {
+            uv.substBounds(inferenceContext.inferenceVars(), inferenceContext.instTypes(), types);
+            checkCompatibleUpperBounds(uv, inferenceContext.inferenceVars());
+            if (!inferenceContext.restvars().contains(uv.qtype)) {
+                Type inst = inferenceContext.asInstType(t, types);
+                for (Type u : uv.getBounds(InferenceBound.UPPER)) {
+                    if (!types.isSubtypeUnchecked(inst, inferenceContext.asFree(u, types), warn)) {
                         reportBoundError(uv, BoundErrorKind.UPPER);
                     }
                 }
-                for (Type l : uv.lobounds) {
-                    if (!types.isSubtypeUnchecked(types.subst(l, tvars, undetvars), inst, warn)) {
+                for (Type l : uv.getBounds(InferenceBound.LOWER)) {
+                    Assert.check(!inferenceContext.free(l));
+                    if (!types.isSubtypeUnchecked(l, inst, warn)) {
                         reportBoundError(uv, BoundErrorKind.LOWER);
                     }
                 }
-                for (Type e : uv.eq) {
-                    if (!types.isSameType(inst, types.subst(e, tvars, undetvars))) {
+                for (Type e : uv.getBounds(InferenceBound.EQ)) {
+                    Assert.check(!inferenceContext.free(e));
+                    if (!types.isSameType(inst, e)) {
                         reportBoundError(uv, BoundErrorKind.EQ);
                     }
                 }
             }
-            args = args.tail;
+        }
+
+        //step 2 - check that eq bounds are consistent w.r.t. eq/lower bounds
+        for (Type t : inferenceContext.undetvars) {
+            UndetVar uv = (UndetVar)t;
+            //check eq bounds consistency
+            Type eq = null;
+            for (Type e : uv.getBounds(InferenceBound.EQ)) {
+                Assert.check(!inferenceContext.free(e));
+                if (eq != null && !types.isSameType(e, eq)) {
+                    reportBoundError(uv, BoundErrorKind.EQ);
+                }
+                eq = e;
+                for (Type l : uv.getBounds(InferenceBound.LOWER)) {
+                    Assert.check(!inferenceContext.free(l));
+                    if (!types.isSubtypeUnchecked(l, e, warn)) {
+                        reportBoundError(uv, BoundErrorKind.BAD_EQ_LOWER);
+                    }
+                }
+                for (Type u : uv.getBounds(InferenceBound.UPPER)) {
+                    if (inferenceContext.free(u)) continue;
+                    if (!types.isSubtypeUnchecked(e, u, warn)) {
+                        reportBoundError(uv, BoundErrorKind.BAD_EQ_UPPER);
+                    }
+                }
+            }
         }
     }
 
@@ -423,7 +399,7 @@
         // VGJ: sort of inlined maximizeInst() below.  Adding
         // bounds can cause lobounds that are above hibounds.
         ListBuffer<Type> hiboundsNoVars = ListBuffer.lb();
-        for (Type t : Type.filter(uv.hibounds, errorFilter)) {
+        for (Type t : Type.filter(uv.getBounds(InferenceBound.UPPER), boundFilter)) {
             if (!t.containsAny(tvars)) {
                 hiboundsNoVars.append(t);
             }
@@ -444,25 +420,43 @@
         BAD_UPPER() {
             @Override
             InapplicableMethodException setMessage(InferenceException ex, UndetVar uv) {
-                return ex.setMessage("incompatible.upper.bounds", uv.qtype, uv.hibounds);
+                return ex.setMessage("incompatible.upper.bounds", uv.qtype,
+                        uv.getBounds(InferenceBound.UPPER));
+            }
+        },
+        BAD_EQ_UPPER() {
+            @Override
+            InapplicableMethodException setMessage(InferenceException ex, UndetVar uv) {
+                return ex.setMessage("incompatible.eq.upper.bounds", uv.qtype,
+                        uv.getBounds(InferenceBound.EQ), uv.getBounds(InferenceBound.UPPER));
+            }
+        },
+        BAD_EQ_LOWER() {
+            @Override
+            InapplicableMethodException setMessage(InferenceException ex, UndetVar uv) {
+                return ex.setMessage("incompatible.eq.lower.bounds", uv.qtype,
+                        uv.getBounds(InferenceBound.EQ), uv.getBounds(InferenceBound.LOWER));
             }
         },
         UPPER() {
             @Override
             InapplicableMethodException setMessage(InferenceException ex, UndetVar uv) {
-                return ex.setMessage("inferred.do.not.conform.to.upper.bounds", uv.inst, uv.hibounds);
+                return ex.setMessage("inferred.do.not.conform.to.upper.bounds", uv.inst,
+                        uv.getBounds(InferenceBound.UPPER));
             }
         },
         LOWER() {
             @Override
             InapplicableMethodException setMessage(InferenceException ex, UndetVar uv) {
-                return ex.setMessage("inferred.do.not.conform.to.lower.bounds", uv.inst, uv.lobounds);
+                return ex.setMessage("inferred.do.not.conform.to.lower.bounds", uv.inst,
+                        uv.getBounds(InferenceBound.LOWER));
             }
         },
         EQ() {
             @Override
             InapplicableMethodException setMessage(InferenceException ex, UndetVar uv) {
-                return ex.setMessage("inferred.do.not.conform.to.eq.bounds", uv.inst, uv.eq);
+                return ex.setMessage("inferred.do.not.conform.to.eq.bounds", uv.inst,
+                        uv.getBounds(InferenceBound.EQ));
             }
         };
 
@@ -473,6 +467,75 @@
         throw bk.setMessage(inferenceException, uv);
     }
 
+    // <editor-fold desc="functional interface instantiation">
+    /**
+     * This method is used to infer a suitable target functional interface in case
+     * the original parameterized interface contains wildcards. An inference process
+     * is applied so that wildcard bounds, as well as explicit lambda/method ref parameters
+     * (where applicable) are used to constraint the solution.
+     */
+    public Type instantiateFunctionalInterface(DiagnosticPosition pos, Type funcInterface,
+            List<Type> paramTypes, Check.CheckContext checkContext) {
+        if (types.capture(funcInterface) == funcInterface) {
+            //if capture doesn't change the type then return the target unchanged
+            //(this means the target contains no wildcards!)
+            return funcInterface;
+        } else {
+            Type formalInterface = funcInterface.tsym.type;
+            InferenceContext funcInterfaceContext =
+                    new InferenceContext(funcInterface.tsym.type.getTypeArguments(), this, false);
+            if (paramTypes != null) {
+                //get constraints from explicit params (this is done by
+                //checking that explicit param types are equal to the ones
+                //in the functional interface descriptors)
+                List<Type> descParameterTypes = types.findDescriptorType(formalInterface).getParameterTypes();
+                if (descParameterTypes.size() != paramTypes.size()) {
+                    checkContext.report(pos, diags.fragment("incompatible.arg.types.in.lambda"));
+                    return types.createErrorType(funcInterface);
+                }
+                for (Type p : descParameterTypes) {
+                    if (!types.isSameType(funcInterfaceContext.asFree(p, types), paramTypes.head)) {
+                        checkContext.report(pos, diags.fragment("no.suitable.functional.intf.inst", funcInterface));
+                        return types.createErrorType(funcInterface);
+                    }
+                    paramTypes = paramTypes.tail;
+                }
+                for (Type t : funcInterfaceContext.undetvars) {
+                    UndetVar uv = (UndetVar)t;
+                    minimizeInst(uv, Warner.noWarnings);
+                    if (uv.inst == null &&
+                            Type.filter(uv.getBounds(InferenceBound.UPPER), boundFilter).nonEmpty()) {
+                        maximizeInst(uv, Warner.noWarnings);
+                    }
+                }
+
+                formalInterface = funcInterfaceContext.asInstType(formalInterface, types);
+            }
+            ListBuffer<Type> typeargs = ListBuffer.lb();
+            List<Type> actualTypeargs = funcInterface.getTypeArguments();
+            //for remaining uninferred type-vars in the functional interface type,
+            //simply replace the wildcards with its bound
+            for (Type t : formalInterface.getTypeArguments()) {
+                if (actualTypeargs.head.tag == WILDCARD) {
+                    WildcardType wt = (WildcardType)actualTypeargs.head;
+                    typeargs.append(wt.type);
+                } else {
+                    typeargs.append(actualTypeargs.head);
+                }
+                actualTypeargs = actualTypeargs.tail;
+            }
+            Type owntype = types.subst(formalInterface, funcInterfaceContext.inferenceVars(), typeargs.toList());
+            if (!chk.checkValidGenericType(owntype)) {
+                //if the inferred functional interface type is not well-formed,
+                //or if it's not a subtype of the original target, issue an error
+                checkContext.report(pos, diags.fragment("no.suitable.functional.intf.inst", funcInterface));
+                return types.createErrorType(funcInterface);
+            }
+            return owntype;
+        }
+    }
+    // </editor-fold>
+
     /**
      * Compute a synthetic method type corresponding to the requested polymorphic
      * method signature. The target return type is computed from the immediately
@@ -480,6 +543,7 @@
      */
     Type instantiatePolymorphicSignatureInstance(Env<AttrContext> env,
                                             MethodSymbol spMethod,  // sig. poly. method or null if none
+                                            Resolve.MethodResolutionContext resolveContext,
                                             List<Type> argtypes) {
         final Type restype;
 
@@ -509,7 +573,7 @@
                 restype = syms.objectType;
         }
 
-        List<Type> paramtypes = Type.map(argtypes, implicitArgType);
+        List<Type> paramtypes = Type.map(argtypes, new ImplicitArgType(spMethod, resolveContext.step));
         List<Type> exType = spMethod != null ?
             spMethod.getThrownTypes() :
             List.of(syms.throwableType); // make it throw all exceptions
@@ -521,14 +585,234 @@
         return mtype;
     }
     //where
-        Mapping implicitArgType = new Mapping ("implicitArgType") {
-                public Type apply(Type t) {
-                    t = types.erasure(t);
-                    if (t.tag == BOT)
-                        // nulls type as the marker type Null (which has no instances)
-                        // infer as java.lang.Void for now
-                        t = types.boxedClass(syms.voidType).type;
-                    return t;
+        class ImplicitArgType extends DeferredAttr.DeferredTypeMap {
+
+            public ImplicitArgType(Symbol msym, Resolve.MethodResolutionPhase phase) {
+                deferredAttr.super(AttrMode.SPECULATIVE, msym, phase);
+            }
+
+            public Type apply(Type t) {
+                t = types.erasure(super.apply(t));
+                if (t.tag == BOT)
+                    // nulls type as the marker type Null (which has no instances)
+                    // infer as java.lang.Void for now
+                    t = types.boxedClass(syms.voidType).type;
+                return t;
+            }
+        }
+
+    /**
+     * Mapping that turns inference variables into undet vars
+     * (used by inference context)
+     */
+    class FromTypeVarFun extends Mapping {
+
+        boolean includeBounds;
+
+        FromTypeVarFun(boolean includeBounds) {
+            super("fromTypeVarFunWithBounds");
+            this.includeBounds = includeBounds;
+        }
+
+        public Type apply(Type t) {
+            if (t.tag == TYPEVAR) return new UndetVar((TypeVar)t, types, includeBounds);
+            else return t.map(this);
+        }
+    };
+
+    /**
+     * An inference context keeps track of the set of variables that are free
+     * in the current context. It provides utility methods for opening/closing
+     * types to their corresponding free/closed forms. It also provide hooks for
+     * attaching deferred post-inference action (see PendingCheck). Finally,
+     * it can be used as an entry point for performing upper/lower bound inference
+     * (see InferenceKind).
+     */
+    static class InferenceContext {
+
+        /**
+        * Single-method-interface for defining inference callbacks. Certain actions
+        * (i.e. subtyping checks) might need to be redone after all inference variables
+        * have been fixed.
+        */
+        interface FreeTypeListener {
+            void typesInferred(InferenceContext inferenceContext);
+        }
+
+        /** list of inference vars as undet vars */
+        List<Type> undetvars;
+
+        /** list of inference vars in this context */
+        List<Type> inferencevars;
+
+        java.util.Map<FreeTypeListener, List<Type>> freeTypeListeners =
+                new java.util.HashMap<FreeTypeListener, List<Type>>();
+
+        List<FreeTypeListener> freetypeListeners = List.nil();
+
+        public InferenceContext(List<Type> inferencevars, Infer infer, boolean includeBounds) {
+            this.undetvars = Type.map(inferencevars, infer.new FromTypeVarFun(includeBounds));
+            this.inferencevars = inferencevars;
+        }
+
+        /**
+         * returns the list of free variables (as type-variables) in this
+         * inference context
+         */
+        List<Type> inferenceVars() {
+            return inferencevars;
+        }
+
+        /**
+         * returns the list of uninstantiated variables (as type-variables) in this
+         * inference context (usually called after instantiate())
+         */
+        List<Type> restvars() {
+            List<Type> undetvars = this.undetvars;
+            ListBuffer<Type> restvars = ListBuffer.lb();
+            for (Type t : instTypes()) {
+                UndetVar uv = (UndetVar)undetvars.head;
+                if (uv.qtype == t) {
+                    restvars.append(t);
                 }
-        };
+                undetvars = undetvars.tail;
+            }
+            return restvars.toList();
+        }
+
+        /**
+         * is this type free?
+         */
+        final boolean free(Type t) {
+            return t.containsAny(inferencevars);
+        }
+
+        final boolean free(List<Type> ts) {
+            for (Type t : ts) {
+                if (free(t)) return true;
+            }
+            return false;
+        }
+
+        /**
+         * Returns a list of free variables in a given type
+         */
+        final List<Type> freeVarsIn(Type t) {
+            ListBuffer<Type> buf = ListBuffer.lb();
+            for (Type iv : inferenceVars()) {
+                if (t.contains(iv)) {
+                    buf.add(iv);
+                }
+            }
+            return buf.toList();
+        }
+
+        final List<Type> freeVarsIn(List<Type> ts) {
+            ListBuffer<Type> buf = ListBuffer.lb();
+            for (Type t : ts) {
+                buf.appendList(freeVarsIn(t));
+            }
+            ListBuffer<Type> buf2 = ListBuffer.lb();
+            for (Type t : buf) {
+                if (!buf2.contains(t)) {
+                    buf2.add(t);
+                }
+            }
+            return buf2.toList();
+        }
+
+        /**
+         * Replace all free variables in a given type with corresponding
+         * undet vars (used ahead of subtyping/compatibility checks to allow propagation
+         * of inference constraints).
+         */
+        final Type asFree(Type t, Types types) {
+            return types.subst(t, inferencevars, undetvars);
+        }
+
+        final List<Type> asFree(List<Type> ts, Types types) {
+            ListBuffer<Type> buf = ListBuffer.lb();
+            for (Type t : ts) {
+                buf.append(asFree(t, types));
+            }
+            return buf.toList();
+        }
+
+        List<Type> instTypes() {
+            ListBuffer<Type> buf = ListBuffer.lb();
+            for (Type t : undetvars) {
+                UndetVar uv = (UndetVar)t;
+                buf.append(uv.inst != null ? uv.inst : uv.qtype);
+            }
+            return buf.toList();
+        }
+
+        /**
+         * Replace all free variables in a given type with corresponding
+         * instantiated types - if one or more free variable has not been
+         * fully instantiated, it will still be available in the resulting type.
+         */
+        Type asInstType(Type t, Types types) {
+            return types.subst(t, inferencevars, instTypes());
+        }
+
+        List<Type> asInstTypes(List<Type> ts, Types types) {
+            ListBuffer<Type> buf = ListBuffer.lb();
+            for (Type t : ts) {
+                buf.append(asInstType(t, types));
+            }
+            return buf.toList();
+        }
+
+        /**
+         * Add custom hook for performing post-inference action
+         */
+        void addFreeTypeListener(List<Type> types, FreeTypeListener ftl) {
+            freeTypeListeners.put(ftl, freeVarsIn(types));
+        }
+
+        /**
+         * Mark the inference context as complete and trigger evaluation
+         * of all deferred checks.
+         */
+        void notifyChange(Types types) {
+            InferenceException thrownEx = null;
+            for (Map.Entry<FreeTypeListener, List<Type>> entry :
+                    new HashMap<FreeTypeListener, List<Type>>(freeTypeListeners).entrySet()) {
+                if (!Type.containsAny(entry.getValue(), restvars())) {
+                    try {
+                        entry.getKey().typesInferred(this);
+                        freeTypeListeners.remove(entry.getKey());
+                    } catch (InferenceException ex) {
+                        if (thrownEx == null) {
+                            thrownEx = ex;
+                        }
+                    }
+                }
+            }
+            //inference exception multiplexing - present any inference exception
+            //thrown when processing listeners as a single one
+            if (thrownEx != null) {
+                throw thrownEx;
+            }
+        }
+
+        void solveAny(List<Type> varsToSolve, Types types, Infer infer) {
+            boolean progress = false;
+            for (Type t : varsToSolve) {
+                UndetVar uv = (UndetVar)asFree(t, types);
+                if (uv.inst == null) {
+                    infer.minimizeInst(uv, Warner.noWarnings);
+                    if (uv.inst != null) {
+                        progress = true;
+                    }
+                }
+            }
+            if (!progress) {
+                throw infer.inferenceException.setMessage("cyclic.inference", varsToSolve);
+            }
+        }
     }
+
+    final InferenceContext emptyContext = new InferenceContext(List.<Type>nil(), this, false);
+}
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1998,7 +1998,7 @@
             // replace with <BoxedClass>.TYPE
             ClassSymbol c = types.boxedClass(type);
             Symbol typeSym =
-                rs.access(
+                rs.accessBase(
                     rs.findIdentInType(attrEnv, c.type, names.TYPE, VAR),
                     pos, c.type, names.TYPE, true);
             if (typeSym.kind == VAR)
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -604,6 +604,10 @@
             env.dup(tree, env.info.dup(env.info.scope.dupUnshared()));
         localEnv.enclMethod = tree;
         localEnv.info.scope.owner = tree.sym;
+        if (tree.sym.type != null) {
+            //when this is called in the enter stage, there's no type to be set
+            localEnv.info.returnResult = attr.new ResultInfo(VAL, tree.sym.type.getReturnType());
+        }
         if ((tree.mods.flags & STATIC) != 0) localEnv.info.staticLevel++;
         return localEnv;
     }
@@ -642,7 +646,9 @@
         tree.sym = v;
         if (tree.init != null) {
             v.flags_field |= HASINIT;
-            if ((v.flags_field & FINAL) != 0 && !tree.init.hasTag(NEWCLASS)) {
+            if ((v.flags_field & FINAL) != 0 &&
+                    !tree.init.hasTag(NEWCLASS) &&
+                    !tree.init.hasTag(LAMBDA)) {
                 Env<AttrContext> initEnv = getInitEnv(tree, env);
                 initEnv.info.enclVar = v;
                 v.setLazyConstValue(initEnv(tree, initEnv), attr, tree.init);
@@ -667,7 +673,7 @@
     Env<AttrContext> initEnv(JCVariableDecl tree, Env<AttrContext> env) {
         Env<AttrContext> localEnv = env.dupto(new AttrContextEnv(tree, env.info.dup()));
         if (tree.sym.owner.kind == TYP) {
-            localEnv.info.scope = new Scope.DelegatedScope(env.info.scope);
+            localEnv.info.scope = env.info.scope.dupUnshared();
             localEnv.info.scope.owner = tree.sym;
         }
         if ((tree.mods.flags & STATIC) != 0 ||
@@ -970,9 +976,11 @@
                 List<Type> thrown = List.nil();
                 long ctorFlags = 0;
                 boolean based = false;
+                boolean addConstructor = true;
                 if (c.name.isEmpty()) {
                     JCNewClass nc = (JCNewClass)env.next.tree;
                     if (nc.constructor != null) {
+                        addConstructor = nc.constructor.kind != ERR;
                         Type superConstrType = types.memberType(c.type,
                                                                 nc.constructor);
                         argtypes = superConstrType.getParameterTypes();
@@ -985,10 +993,12 @@
                         thrown = superConstrType.getThrownTypes();
                     }
                 }
-                JCTree constrDef = DefaultConstructor(make.at(tree.pos), c,
-                                                    typarams, argtypes, thrown,
-                                                    ctorFlags, based);
-                tree.defs = tree.defs.prepend(constrDef);
+                if (addConstructor) {
+                    JCTree constrDef = DefaultConstructor(make.at(tree.pos), c,
+                                                        typarams, argtypes, thrown,
+                                                        ctorFlags, based);
+                    tree.defs = tree.defs.prepend(constrDef);
+                }
             }
 
             // If this is a class, enter symbols for this and super into
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,14 +27,20 @@
 
 import com.sun.tools.javac.api.Formattable.LocalizedString;
 import com.sun.tools.javac.code.*;
+import com.sun.tools.javac.code.Symbol.*;
 import com.sun.tools.javac.code.Type.*;
-import com.sun.tools.javac.code.Symbol.*;
 import com.sun.tools.javac.comp.Attr.ResultInfo;
 import com.sun.tools.javac.comp.Check.CheckContext;
+import com.sun.tools.javac.comp.DeferredAttr.AttrMode;
+import com.sun.tools.javac.comp.DeferredAttr.DeferredAttrContext;
+import com.sun.tools.javac.comp.DeferredAttr.DeferredType;
+import com.sun.tools.javac.comp.Infer.InferenceContext;
+import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener;
 import com.sun.tools.javac.comp.Resolve.MethodResolutionContext.Candidate;
 import com.sun.tools.javac.jvm.*;
 import com.sun.tools.javac.tree.*;
 import com.sun.tools.javac.tree.JCTree.*;
+import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind;
 import com.sun.tools.javac.util.*;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@@ -44,9 +50,8 @@
 import java.util.Collection;
 import java.util.EnumMap;
 import java.util.EnumSet;
-import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
 
 import javax.lang.model.element.ElementVisitor;
 
@@ -73,6 +78,7 @@
     Log log;
     Symtab syms;
     Attr attr;
+    DeferredAttr deferredAttr;
     Check chk;
     Infer infer;
     ClassReader reader;
@@ -93,10 +99,6 @@
 
         varNotFound = new
             SymbolNotFoundError(ABSENT_VAR);
-        wrongMethod = new
-            InapplicableSymbolError();
-        wrongMethods = new
-            InapplicableSymbolsError();
         methodNotFound = new
             SymbolNotFoundError(ABSENT_MTH);
         typeNotFound = new
@@ -105,6 +107,7 @@
         names = Names.instance(context);
         log = Log.instance(context);
         attr = Attr.instance(context);
+        deferredAttr = DeferredAttr.instance(context);
         chk = Check.instance(context);
         infer = Infer.instance(context);
         reader = ClassReader.instance(context);
@@ -127,8 +130,6 @@
     /** error symbols, which are returned when resolution fails
      */
     private final SymbolNotFoundError varNotFound;
-    private final InapplicableSymbolError wrongMethod;
-    private final InapplicableSymbolsError wrongMethods;
     private final SymbolNotFoundError methodNotFound;
     private final SymbolNotFoundError typeNotFound;
 
@@ -215,9 +216,12 @@
             }
         }
         String key = success ? "verbose.resolve.multi" : "verbose.resolve.multi.1";
+        List<Type> argtypes2 = Type.map(argtypes,
+                    deferredAttr.new RecoveryDeferredTypeMap(AttrMode.SPECULATIVE, bestSoFar, currentResolutionContext.step));
         JCDiagnostic main = diags.note(log.currentSource(), dpos, key, name,
                 site.tsym, mostSpecificPos, currentResolutionContext.step,
-                methodArguments(argtypes), methodArguments(typeargtypes));
+                methodArguments(argtypes2),
+                methodArguments(typeargtypes));
         JCDiagnostic d = new JCDiagnostic.MultilineDiagnostic(main, subDiags.toList());
         log.report(d);
     }
@@ -247,7 +251,7 @@
     /** An environment is "static" if its static level is greater than
      *  the one of its outer environment
      */
-    static boolean isStatic(Env<AttrContext> env) {
+    protected static boolean isStatic(Env<AttrContext> env) {
         return env.info.staticLevel > env.outer.info.staticLevel;
     }
 
@@ -445,8 +449,18 @@
                         boolean useVarargs,
                         Warner warn)
         throws Infer.InferenceException {
-        if (useVarargs && (m.flags() & VARARGS) == 0)
-            throw inapplicableMethodException.setMessage();
+        if (useVarargs && (m.flags() & VARARGS) == 0) {
+            //better error recovery - if we stumbled upon a non-varargs method
+            //during varargs applicability phase, the method should be treated as
+            //not applicable; the reason for inapplicability can be found in the
+            //candidate for 'm' that was created during the BOX phase.
+            Candidate prevCandidate = currentResolutionContext.getCandidate(m, BOX);
+            JCDiagnostic details = null;
+            if (prevCandidate != null && !prevCandidate.isApplicable()) {
+                details = prevCandidate.details;
+            }
+            throw inapplicableMethodException.setMessage(details);
+        }
         Type mt = types.memberType(site, m);
 
         // tvars is the list of formal type variables for which type arguments
@@ -497,13 +511,34 @@
                                     argtypes,
                                     allowBoxing,
                                     useVarargs,
+                                    currentResolutionContext,
                                     warn);
 
-        checkRawArgumentsAcceptable(env, argtypes, mt.getParameterTypes(),
+        checkRawArgumentsAcceptable(env, m, argtypes, mt.getParameterTypes(),
                                 allowBoxing, useVarargs, warn);
         return mt;
     }
 
+    Type checkMethod(Env<AttrContext> env,
+                     Type site,
+                     Symbol m,
+                     ResultInfo resultInfo,
+                     List<Type> argtypes,
+                     List<Type> typeargtypes,
+                     Warner warn) {
+        MethodResolutionContext prevContext = currentResolutionContext;
+        try {
+            currentResolutionContext = new MethodResolutionContext();
+            currentResolutionContext.attrMode = DeferredAttr.AttrMode.CHECK;
+            MethodResolutionPhase step = currentResolutionContext.step = env.info.pendingResolutionPhase;
+            return rawInstantiate(env, site, m, resultInfo, argtypes, typeargtypes,
+                    step.isBoxingRequired(), step.isVarargsRequired(), warn);
+        }
+        finally {
+            currentResolutionContext = prevContext;
+        }
+    }
+
     /** Same but returns null instead throwing a NoInstanceException
      */
     Type instantiate(Env<AttrContext> env,
@@ -526,13 +561,14 @@
     /** Check if a parameter list accepts a list of args.
      */
     boolean argumentsAcceptable(Env<AttrContext> env,
+                                Symbol msym,
                                 List<Type> argtypes,
                                 List<Type> formals,
                                 boolean allowBoxing,
                                 boolean useVarargs,
                                 Warner warn) {
         try {
-            checkRawArgumentsAcceptable(env, argtypes, formals, allowBoxing, useVarargs, warn);
+            checkRawArgumentsAcceptable(env, msym, argtypes, formals, allowBoxing, useVarargs, warn);
             return true;
         } catch (InapplicableMethodException ex) {
             return false;
@@ -579,12 +615,13 @@
     };
 
     void checkRawArgumentsAcceptable(Env<AttrContext> env,
+                                Symbol msym,
                                 List<Type> argtypes,
                                 List<Type> formals,
                                 boolean allowBoxing,
                                 boolean useVarargs,
                                 Warner warn) {
-        checkRawArgumentsAcceptable(env, List.<Type>nil(), argtypes, formals,
+        checkRawArgumentsAcceptable(env, msym, currentResolutionContext.attrMode(), infer.emptyContext, argtypes, formals,
                 allowBoxing, useVarargs, warn, resolveHandler);
     }
 
@@ -594,35 +631,41 @@
      * compatible (by method invocation conversion) with the types in F.
      *
      * Since this routine is shared between overload resolution and method
-     * type-inference, it is crucial that actual types are converted to the
-     * corresponding 'undet' form (i.e. where inference variables are replaced
-     * with undetvars) so that constraints can be propagated and collected.
+     * type-inference, a (possibly empty) inference context is used to convert
+     * formal types to the corresponding 'undet' form ahead of a compatibility
+     * check so that constraints can be propagated and collected.
      *
-     * Moreover, if one or more types in A is a poly type, this routine calls
-     * Infer.instantiateArg in order to complete the poly type (this might involve
-     * deferred attribution).
+     * Moreover, if one or more types in A is a deferred type, this routine uses
+     * DeferredAttr in order to perform deferred attribution. If one or more actual
+     * deferred types are stuck, they are placed in a queue and revisited later
+     * after the remainder of the arguments have been seen. If this is not sufficient
+     * to 'unstuck' the argument, a cyclic inference error is called out.
      *
      * A method check handler (see above) is used in order to report errors.
      */
-    List<Type> checkRawArgumentsAcceptable(Env<AttrContext> env,
-                                List<Type> undetvars,
+    void checkRawArgumentsAcceptable(final Env<AttrContext> env,
+                                Symbol msym,
+                                DeferredAttr.AttrMode mode,
+                                final Infer.InferenceContext inferenceContext,
                                 List<Type> argtypes,
                                 List<Type> formals,
                                 boolean allowBoxing,
                                 boolean useVarargs,
                                 Warner warn,
-                                MethodCheckHandler handler) {
+                                final MethodCheckHandler handler) {
         Type varargsFormal = useVarargs ? formals.last() : null;
-        ListBuffer<Type> checkedArgs = ListBuffer.lb();
 
         if (varargsFormal == null &&
                 argtypes.size() != formals.size()) {
             throw handler.arityMismatch(); // not enough args
         }
 
+        DeferredAttr.DeferredAttrContext deferredAttrContext =
+                deferredAttr.new DeferredAttrContext(mode, msym, currentResolutionContext.step, inferenceContext);
+
         while (argtypes.nonEmpty() && formals.head != varargsFormal) {
-            ResultInfo resultInfo = methodCheckResult(formals.head, allowBoxing, false, undetvars, handler, warn);
-            checkedArgs.append(resultInfo.check(env.tree.pos(), argtypes.head));
+            ResultInfo mresult = methodCheckResult(formals.head, allowBoxing, false, inferenceContext, deferredAttrContext, handler, warn);
+            mresult.check(null, argtypes.head);
             argtypes = argtypes.tail;
             formals = formals.tail;
         }
@@ -634,19 +677,33 @@
         if (useVarargs) {
             //note: if applicability check is triggered by most specific test,
             //the last argument of a varargs is _not_ an array type (see JLS 15.12.2.5)
-            Type elt = types.elemtype(varargsFormal);
+            final Type elt = types.elemtype(varargsFormal);
+            ResultInfo mresult = methodCheckResult(elt, allowBoxing, true, inferenceContext, deferredAttrContext, handler, warn);
             while (argtypes.nonEmpty()) {
-                ResultInfo resultInfo = methodCheckResult(elt, allowBoxing, true, undetvars, handler, warn);
-                checkedArgs.append(resultInfo.check(env.tree.pos(), argtypes.head));
+                mresult.check(null, argtypes.head);
                 argtypes = argtypes.tail;
             }
             //check varargs element type accessibility
-            if (undetvars.isEmpty() && !isAccessible(env, elt)) {
+            varargsAccessible(env, elt, handler, inferenceContext);
+        }
+
+        deferredAttrContext.complete();
+    }
+
+    void varargsAccessible(final Env<AttrContext> env, final Type t, final Resolve.MethodCheckHandler handler, final InferenceContext inferenceContext) {
+        if (inferenceContext.free(t)) {
+            inferenceContext.addFreeTypeListener(List.of(t), new FreeTypeListener() {
+                @Override
+                public void typesInferred(InferenceContext inferenceContext) {
+                    varargsAccessible(env, inferenceContext.asInstType(t, types), handler, inferenceContext);
+                }
+            });
+        } else {
+            if (!isAccessible(env, t)) {
                 Symbol location = env.enclClass.sym;
-                throw handler.inaccessibleVarargs(location, elt);
+                throw handler.inaccessibleVarargs(location, t);
             }
         }
-        return checkedArgs.toList();
     }
 
     /**
@@ -657,13 +714,16 @@
 
         MethodCheckHandler handler;
         boolean useVarargs;
-        List<Type> undetvars;
+        Infer.InferenceContext inferenceContext;
+        DeferredAttrContext deferredAttrContext;
         Warner rsWarner;
 
-        public MethodCheckContext(MethodCheckHandler handler, boolean useVarargs, List<Type> undetvars, Warner rsWarner) {
+        public MethodCheckContext(MethodCheckHandler handler, boolean useVarargs,
+                Infer.InferenceContext inferenceContext, DeferredAttrContext deferredAttrContext, Warner rsWarner) {
             this.handler = handler;
             this.useVarargs = useVarargs;
-            this.undetvars = undetvars;
+            this.inferenceContext = inferenceContext;
+            this.deferredAttrContext = deferredAttrContext;
             this.rsWarner = rsWarner;
         }
 
@@ -674,6 +734,14 @@
         public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) {
             return rsWarner;
         }
+
+        public InferenceContext inferenceContext() {
+            return inferenceContext;
+        }
+
+        public DeferredAttrContext deferredAttrContext() {
+            return deferredAttrContext;
+        }
     }
 
     /**
@@ -682,12 +750,17 @@
      */
     class StrictMethodContext extends MethodCheckContext {
 
-        public StrictMethodContext(MethodCheckHandler handler, boolean useVarargs, List<Type> undetvars, Warner rsWarner) {
-            super(handler, useVarargs, undetvars, rsWarner);
+        public StrictMethodContext(MethodCheckHandler handler, boolean useVarargs,
+                Infer.InferenceContext inferenceContext, DeferredAttrContext deferredAttrContext, Warner rsWarner) {
+            super(handler, useVarargs, inferenceContext, deferredAttrContext, rsWarner);
         }
 
         public boolean compatible(Type found, Type req, Warner warn) {
-            return types.isSubtypeUnchecked(found, infer.asUndetType(req, undetvars), warn);
+            return types.isSubtypeUnchecked(found, inferenceContext.asFree(req, types), warn);
+        }
+
+        public boolean allowBoxing() {
+            return false;
         }
     }
 
@@ -697,12 +770,17 @@
      */
     class LooseMethodContext extends MethodCheckContext {
 
-        public LooseMethodContext(MethodCheckHandler handler, boolean useVarargs, List<Type> undetvars, Warner rsWarner) {
-            super(handler, useVarargs, undetvars, rsWarner);
+        public LooseMethodContext(MethodCheckHandler handler, boolean useVarargs,
+                Infer.InferenceContext inferenceContext, DeferredAttrContext deferredAttrContext, Warner rsWarner) {
+            super(handler, useVarargs, inferenceContext, deferredAttrContext, rsWarner);
         }
 
         public boolean compatible(Type found, Type req, Warner warn) {
-            return types.isConvertible(found, infer.asUndetType(req, undetvars), warn);
+            return types.isConvertible(found, inferenceContext.asFree(req, types), warn);
+        }
+
+        public boolean allowBoxing() {
+            return true;
         }
     }
 
@@ -710,16 +788,37 @@
      * Create a method check context to be used during method applicability check
      */
     ResultInfo methodCheckResult(Type to, boolean allowBoxing, boolean useVarargs,
-            List<Type> undetvars, MethodCheckHandler methodHandler, Warner rsWarner) {
+            Infer.InferenceContext inferenceContext, DeferredAttr.DeferredAttrContext deferredAttrContext,
+            MethodCheckHandler methodHandler, Warner rsWarner) {
         MethodCheckContext checkContext = allowBoxing ?
-                new LooseMethodContext(methodHandler, useVarargs, undetvars, rsWarner) :
-                new StrictMethodContext(methodHandler, useVarargs, undetvars, rsWarner);
-        return attr.new ResultInfo(VAL, to, checkContext) {
-            @Override
-            protected Type check(DiagnosticPosition pos, Type found) {
-                return super.check(pos, chk.checkNonVoid(pos, types.capture(types.upperBound(found))));
+                new LooseMethodContext(methodHandler, useVarargs, inferenceContext, deferredAttrContext, rsWarner) :
+                new StrictMethodContext(methodHandler, useVarargs, inferenceContext, deferredAttrContext, rsWarner);
+        return new MethodResultInfo(to, checkContext, deferredAttrContext);
+    }
+
+    class MethodResultInfo extends ResultInfo {
+
+        DeferredAttr.DeferredAttrContext deferredAttrContext;
+
+        public MethodResultInfo(Type pt, MethodCheckContext checkContext, DeferredAttr.DeferredAttrContext deferredAttrContext) {
+            attr.super(VAL, pt, checkContext);
+            this.deferredAttrContext = deferredAttrContext;
+        }
+
+        @Override
+        protected Type check(DiagnosticPosition pos, Type found) {
+            if (found.tag == DEFERRED) {
+                DeferredType dt = (DeferredType)found;
+                return dt.check(this);
+            } else {
+                return super.check(pos, chk.checkNonVoid(pos, types.capture(types.upperBound(found.baseType()))));
             }
-        };
+        }
+
+        @Override
+        protected MethodResultInfo dup(Type newPt) {
+            return new MethodResultInfo(newPt, (MethodCheckContext)checkContext, deferredAttrContext);
+        }
     }
 
     public static class InapplicableMethodException extends RuntimeException {
@@ -733,16 +832,13 @@
             this.diags = diags;
         }
         InapplicableMethodException setMessage() {
-            this.diagnostic = null;
-            return this;
+            return setMessage((JCDiagnostic)null);
         }
         InapplicableMethodException setMessage(String key) {
-            this.diagnostic = key != null ? diags.fragment(key) : null;
-            return this;
+            return setMessage(key != null ? diags.fragment(key) : null);
         }
         InapplicableMethodException setMessage(String key, Object... args) {
-            this.diagnostic = key != null ? diags.fragment(key, args) : null;
-            return this;
+            return setMessage(key != null ? diags.fragment(key, args) : null);
         }
         InapplicableMethodException setMessage(JCDiagnostic diag) {
             this.diagnostic = diag;
@@ -937,11 +1033,10 @@
                 currentResolutionContext.addInapplicableCandidate(sym, ex.getDiagnostic());
             switch (bestSoFar.kind) {
             case ABSENT_MTH:
-                return wrongMethod;
+                return new InapplicableSymbolError(currentResolutionContext);
             case WRONG_MTH:
                 if (operator) return bestSoFar;
-            case WRONG_MTHS:
-                return wrongMethods;
+                bestSoFar = new InapplicableSymbolsError(currentResolutionContext);
             default:
                 return bestSoFar;
             }
@@ -953,7 +1048,7 @@
         }
         return (bestSoFar.kind > AMBIGUOUS)
             ? sym
-            : mostSpecific(sym, bestSoFar, env, site,
+            : mostSpecific(argtypes, sym, bestSoFar, env, site,
                            allowBoxing && operator, useVarargs);
     }
 
@@ -967,7 +1062,7 @@
      *  @param allowBoxing Allow boxing conversions of arguments.
      *  @param useVarargs Box trailing arguments into an array for varargs.
      */
-    Symbol mostSpecific(Symbol m1,
+    Symbol mostSpecific(List<Type> argtypes, Symbol m1,
                         Symbol m2,
                         Env<AttrContext> env,
                         final Type site,
@@ -976,8 +1071,10 @@
         switch (m2.kind) {
         case MTH:
             if (m1 == m2) return m1;
-            boolean m1SignatureMoreSpecific = signatureMoreSpecific(env, site, m1, m2, allowBoxing, useVarargs);
-            boolean m2SignatureMoreSpecific = signatureMoreSpecific(env, site, m2, m1, allowBoxing, useVarargs);
+            boolean m1SignatureMoreSpecific =
+                    signatureMoreSpecific(argtypes, env, site, m1, m2, allowBoxing, useVarargs);
+            boolean m2SignatureMoreSpecific =
+                    signatureMoreSpecific(argtypes, env, site, m2, m1, allowBoxing, useVarargs);
             if (m1SignatureMoreSpecific && m2SignatureMoreSpecific) {
                 Type mt1 = types.memberType(site, m1);
                 Type mt2 = types.memberType(site, m2);
@@ -1035,8 +1132,8 @@
                             return this;
                         else
                             return super.implementation(origin, types, checkResult);
-                    }
-                };
+                        }
+                    };
                 return result;
             }
             if (m1SignatureMoreSpecific) return m1;
@@ -1044,8 +1141,8 @@
             return ambiguityError(m1, m2);
         case AMBIGUOUS:
             AmbiguityError e = (AmbiguityError)m2;
-            Symbol err1 = mostSpecific(m1, e.sym, env, site, allowBoxing, useVarargs);
-            Symbol err2 = mostSpecific(m1, e.sym2, env, site, allowBoxing, useVarargs);
+            Symbol err1 = mostSpecific(argtypes, m1, e.sym, env, site, allowBoxing, useVarargs);
+            Symbol err2 = mostSpecific(argtypes, m1, e.sym2, env, site, allowBoxing, useVarargs);
             if (err1 == err2) return err1;
             if (err1 == e.sym && err2 == e.sym2) return m2;
             if (err1 instanceof AmbiguityError &&
@@ -1059,13 +1156,83 @@
         }
     }
     //where
-    private boolean signatureMoreSpecific(Env<AttrContext> env, Type site, Symbol m1, Symbol m2, boolean allowBoxing, boolean useVarargs) {
+    private boolean signatureMoreSpecific(List<Type> actuals, Env<AttrContext> env, Type site, Symbol m1, Symbol m2, boolean allowBoxing, boolean useVarargs) {
+        Symbol m12 = adjustVarargs(m1, m2, useVarargs);
+        Symbol m22 = adjustVarargs(m2, m1, useVarargs);
+        Type mtype1 = types.memberType(site, m12);
+        Type mtype2 = types.memberType(site, m22);
+
+        //check if invocation is more specific
+        if (invocationMoreSpecific(env, site, m22, mtype1.getParameterTypes(), allowBoxing, useVarargs)) {
+            return true;
+        }
+
+        //perform structural check
+
+        List<Type> formals1 = mtype1.getParameterTypes();
+        Type lastFormal1 = formals1.last();
+        List<Type> formals2 = mtype2.getParameterTypes();
+        Type lastFormal2 = formals2.last();
+        ListBuffer<Type> newFormals = ListBuffer.lb();
+
+        boolean hasStructuralPoly = false;
+        for (Type actual : actuals) {
+            //perform formal argument adaptation in case actuals > formals (varargs)
+            Type f1 = formals1.isEmpty() ?
+                    lastFormal1 : formals1.head;
+            Type f2 = formals2.isEmpty() ?
+                    lastFormal2 : formals2.head;
+
+            //is this a structural actual argument?
+            boolean isStructuralPoly = actual.tag == DEFERRED &&
+                    (((DeferredType)actual).tree.hasTag(LAMBDA) ||
+                    ((DeferredType)actual).tree.hasTag(REFERENCE));
+
+            Type newFormal = f1;
+
+            if (isStructuralPoly) {
+                //for structural arguments only - check that corresponding formals
+                //are related - if so replace formal with <null>
+                hasStructuralPoly = true;
+                DeferredType dt = (DeferredType)actual;
+                Type t1 = deferredAttr.new DeferredTypeMap(AttrMode.SPECULATIVE, m1, currentResolutionContext.step).apply(dt);
+                Type t2 = deferredAttr.new DeferredTypeMap(AttrMode.SPECULATIVE, m2, currentResolutionContext.step).apply(dt);
+                if (t1.isErroneous() || t2.isErroneous() || !isStructuralSubtype(t1, t2)) {
+                    //not structural subtypes - simply fail
+                    return false;
+                } else {
+                    newFormal = syms.botType;
+                }
+            }
+
+            newFormals.append(newFormal);
+            if (newFormals.length() > mtype2.getParameterTypes().length()) {
+                //expand m2's type so as to fit the new formal arity (varargs)
+                m22.type = types.createMethodTypeWithParameters(m22.type, m22.type.getParameterTypes().append(f2));
+            }
+
+            formals1 = formals1.isEmpty() ? formals1 : formals1.tail;
+            formals2 = formals2.isEmpty() ? formals2 : formals2.tail;
+        }
+
+        if (!hasStructuralPoly) {
+            //if no structural actual was found, we're done
+            return false;
+        }
+        //perform additional adaptation if actuals < formals (varargs)
+        for (Type t : formals1) {
+            newFormals.append(t);
+        }
+        //check if invocation (with tweaked args) is more specific
+        return invocationMoreSpecific(env, site, m22, newFormals.toList(), allowBoxing, useVarargs);
+    }
+    //where
+    private boolean invocationMoreSpecific(Env<AttrContext> env, Type site, Symbol m2, List<Type> argtypes1, boolean allowBoxing, boolean useVarargs) {
         noteWarner.clear();
-        Type mtype1 = types.memberType(site, adjustVarargs(m1, m2, useVarargs));
-        Type mtype2 = instantiate(env, site, adjustVarargs(m2, m1, useVarargs), null,
-                types.lowerBoundArgtypes(mtype1), null,
+        Type mst = instantiate(env, site, m2, null,
+                types.lowerBounds(argtypes1), null,
                 allowBoxing, false, noteWarner);
-        return mtype2 != null &&
+        return mst != null &&
                 !noteWarner.hasLint(Lint.LintCategory.UNCHECKED);
     }
     //where
@@ -1104,6 +1271,32 @@
         }
     }
     //where
+    boolean isStructuralSubtype(Type s, Type t) {
+
+        Type ret_s = types.findDescriptorType(s).getReturnType();
+        Type ret_t = types.findDescriptorType(t).getReturnType();
+
+        //covariant most specific check for function descriptor return type
+        if (!types.isSubtype(ret_s, ret_t)) {
+            return false;
+        }
+
+        List<Type> args_s = types.findDescriptorType(s).getParameterTypes();
+        List<Type> args_t = types.findDescriptorType(t).getParameterTypes();
+
+        //arity must be identical
+        if (args_s.length() != args_t.length()) {
+            return false;
+        }
+
+        //invariant most specific check for function descriptor parameter types
+        if (!types.isSameTypes(args_t, args_s)) {
+            return false;
+        }
+
+        return true;
+    }
+    //where
     Type mostSpecificReturnType(Type mt1, Type mt2) {
         Type rt1 = mt1.getReturnType();
         Type rt2 = mt2.getReturnType();
@@ -1160,12 +1353,10 @@
                           argtypes,
                           typeargtypes,
                           site.tsym.type,
-                          true,
                           bestSoFar,
                           allowBoxing,
                           useVarargs,
-                          operator,
-                          new HashSet<TypeSymbol>());
+                          operator);
         reportVerboseResolutionDiagnostic(env.tree.pos(), name, site, argtypes, typeargtypes, bestSoFar);
         return bestSoFar;
     }
@@ -1176,56 +1367,134 @@
                               List<Type> argtypes,
                               List<Type> typeargtypes,
                               Type intype,
-                              boolean abstractok,
                               Symbol bestSoFar,
                               boolean allowBoxing,
                               boolean useVarargs,
-                              boolean operator,
-                              Set<TypeSymbol> seen) {
-        for (Type ct = intype; ct.tag == CLASS || ct.tag == TYPEVAR; ct = types.supertype(ct)) {
-            while (ct.tag == TYPEVAR)
-                ct = ct.getUpperBound();
-            ClassSymbol c = (ClassSymbol)ct.tsym;
-            if (!seen.add(c)) return bestSoFar;
-            if ((c.flags() & (ABSTRACT | INTERFACE | ENUM)) == 0)
-                abstractok = false;
-            for (Scope.Entry e = c.members().lookup(name);
-                 e.scope != null;
-                 e = e.next()) {
-                //- System.out.println(" e " + e.sym);
-                if (e.sym.kind == MTH &&
-                    (e.sym.flags_field & SYNTHETIC) == 0) {
-                    bestSoFar = selectBest(env, site, argtypes, typeargtypes,
-                                           e.sym, bestSoFar,
-                                           allowBoxing,
-                                           useVarargs,
-                                           operator);
+                              boolean operator) {
+        boolean abstractOk = true;
+        List<Type> itypes = List.nil();
+        for (TypeSymbol s : superclasses(intype)) {
+            bestSoFar = lookupMethod(env, site, name, argtypes, typeargtypes,
+                    s.members(), bestSoFar, allowBoxing, useVarargs, operator, true);
+            //We should not look for abstract methods if receiver is a concrete class
+            //(as concrete classes are expected to implement all abstracts coming
+            //from superinterfaces)
+            abstractOk &= (s.flags() & (ABSTRACT | INTERFACE | ENUM)) != 0;
+            if (abstractOk) {
+                for (Type itype : types.interfaces(s.type)) {
+                    itypes = types.union(types.closure(itype), itypes);
                 }
             }
-            if (name == names.init)
-                break;
-            //- System.out.println(" - " + bestSoFar);
-            if (abstractok) {
-                Symbol concrete = methodNotFound;
-                if ((bestSoFar.flags() & ABSTRACT) == 0)
-                    concrete = bestSoFar;
-                for (List<Type> l = types.interfaces(c.type);
-                     l.nonEmpty();
-                     l = l.tail) {
-                    bestSoFar = findMethod(env, site, name, argtypes,
-                                           typeargtypes,
-                                           l.head, abstractok, bestSoFar,
-                                           allowBoxing, useVarargs, operator, seen);
-                }
-                if (concrete != bestSoFar &&
-                    concrete.kind < ERR  && bestSoFar.kind < ERR &&
-                    types.isSubSignature(concrete.type, bestSoFar.type))
-                    bestSoFar = concrete;
+            if (name == names.init) break;
+        }
+
+        Symbol concrete = bestSoFar.kind < ERR &&
+                (bestSoFar.flags() & ABSTRACT) == 0 ?
+                bestSoFar : methodNotFound;
+
+        if (name != names.init) {
+            //keep searching for abstract methods
+            for (Type itype : itypes) {
+                if (!itype.isInterface()) continue; //skip j.l.Object (included by Types.closure())
+                bestSoFar = lookupMethod(env, site, name, argtypes, typeargtypes,
+                    itype.tsym.members(), bestSoFar, allowBoxing, useVarargs, operator, true);
+                    if (concrete != bestSoFar &&
+                            concrete.kind < ERR  && bestSoFar.kind < ERR &&
+                            types.isSubSignature(concrete.type, bestSoFar.type)) {
+                        //this is an hack - as javac does not do full membership checks
+                        //most specific ends up comparing abstract methods that might have
+                        //been implemented by some concrete method in a subclass and,
+                        //because of raw override, it is possible for an abstract method
+                        //to be more specific than the concrete method - so we need
+                        //to explicitly call that out (see CR 6178365)
+                        bestSoFar = concrete;
+                    }
             }
         }
         return bestSoFar;
     }
 
+    /**
+     * Return an Iterable object to scan the superclasses of a given type.
+     * It's crucial that the scan is done lazily, as we don't want to accidentally
+     * access more supertypes than strictly needed (as this could trigger completion
+     * errors if some of the not-needed supertypes are missing/ill-formed).
+     */
+    Iterable<TypeSymbol> superclasses(final Type intype) {
+        return new Iterable<TypeSymbol>() {
+            public Iterator<TypeSymbol> iterator() {
+                return new Iterator<TypeSymbol>() {
+
+                    List<TypeSymbol> seen = List.nil();
+                    TypeSymbol currentSym = symbolFor(intype);
+                    TypeSymbol prevSym = null;
+
+                    public boolean hasNext() {
+                        if (currentSym == syms.noSymbol) {
+                            currentSym = symbolFor(types.supertype(prevSym.type));
+                        }
+                        return currentSym != null;
+                    }
+
+                    public TypeSymbol next() {
+                        prevSym = currentSym;
+                        currentSym = syms.noSymbol;
+                        Assert.check(prevSym != null || prevSym != syms.noSymbol);
+                        return prevSym;
+                    }
+
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+
+                    TypeSymbol symbolFor(Type t) {
+                        if (t.tag != CLASS &&
+                                t.tag != TYPEVAR) {
+                            return null;
+                        }
+                        while (t.tag == TYPEVAR)
+                            t = t.getUpperBound();
+                        if (seen.contains(t.tsym)) {
+                            //degenerate case in which we have a circular
+                            //class hierarchy - because of ill-formed classfiles
+                            return null;
+                        }
+                        seen = seen.prepend(t.tsym);
+                        return t.tsym;
+                    }
+                };
+            }
+        };
+    }
+
+    /**
+     * Lookup a method with given name and argument types in a given scope
+     */
+    Symbol lookupMethod(Env<AttrContext> env,
+            Type site,
+            Name name,
+            List<Type> argtypes,
+            List<Type> typeargtypes,
+            Scope sc,
+            Symbol bestSoFar,
+            boolean allowBoxing,
+            boolean useVarargs,
+            boolean operator,
+            boolean abstractok) {
+        for (Symbol s : sc.getElementsByName(name, lookupFilter)) {
+            bestSoFar = selectBest(env, site, argtypes, typeargtypes, s,
+                    bestSoFar, allowBoxing, useVarargs, operator);
+        }
+        return bestSoFar;
+    }
+    //where
+        Filter<Symbol> lookupFilter = new Filter<Symbol>() {
+            public boolean accepts(Symbol s) {
+                return s.kind == MTH &&
+                        (s.flags() & SYNTHETIC) == 0;
+            }
+        };
+
     /** Find unqualified method matching given name, type and value arguments.
      *  @param env       The current environment.
      *  @param name      The method's name.
@@ -1521,14 +1790,41 @@
      *
      *  @param sym       The symbol that was found, or a ResolveError.
      *  @param pos       The position to use for error reporting.
+     *  @param location  The symbol the served as a context for this lookup
      *  @param site      The original type from where the selection took place.
      *  @param name      The symbol's name.
+     *  @param qualified Did we get here through a qualified expression resolution?
      *  @param argtypes  The invocation's value arguments,
      *                   if we looked for a method.
      *  @param typeargtypes  The invocation's type arguments,
      *                   if we looked for a method.
+     *  @param logResolveHelper helper class used to log resolve errors
      */
-    Symbol access(Symbol sym,
+    Symbol accessInternal(Symbol sym,
+                  DiagnosticPosition pos,
+                  Symbol location,
+                  Type site,
+                  Name name,
+                  boolean qualified,
+                  List<Type> argtypes,
+                  List<Type> typeargtypes,
+                  LogResolveHelper logResolveHelper) {
+        if (sym.kind >= AMBIGUOUS) {
+            ResolveError errSym = (ResolveError)sym;
+            sym = errSym.access(name, qualified ? site.tsym : syms.noSymbol);
+            argtypes = logResolveHelper.getArgumentTypes(errSym, sym, name, argtypes);
+            if (logResolveHelper.resolveDiagnosticNeeded(site, argtypes, typeargtypes)) {
+                logResolveError(errSym, pos, location, site, name, argtypes, typeargtypes);
+            }
+        }
+        return sym;
+    }
+
+    /**
+     * Variant of the generalized access routine, to be used for generating method
+     * resolution diagnostics
+     */
+    Symbol accessMethod(Symbol sym,
                   DiagnosticPosition pos,
                   Symbol location,
                   Type site,
@@ -1536,53 +1832,91 @@
                   boolean qualified,
                   List<Type> argtypes,
                   List<Type> typeargtypes) {
-        if (sym.kind >= AMBIGUOUS) {
-            ResolveError errSym = (ResolveError)sym;
-            if (!site.isErroneous() &&
-                !Type.isErroneous(argtypes) &&
-                (typeargtypes==null || !Type.isErroneous(typeargtypes)))
-                logResolveError(errSym, pos, location, site, name, argtypes, typeargtypes);
-            sym = errSym.access(name, qualified ? site.tsym : syms.noSymbol);
-        }
-        return sym;
+        return accessInternal(sym, pos, location, site, name, qualified, argtypes, typeargtypes, methodLogResolveHelper);
     }
 
-    /** Same as original access(), but without location.
+    /** Same as original accessMethod(), but without location.
      */
-    Symbol access(Symbol sym,
+    Symbol accessMethod(Symbol sym,
                   DiagnosticPosition pos,
                   Type site,
                   Name name,
                   boolean qualified,
                   List<Type> argtypes,
                   List<Type> typeargtypes) {
-        return access(sym, pos, site.tsym, site, name, qualified, argtypes, typeargtypes);
+        return accessMethod(sym, pos, site.tsym, site, name, qualified, argtypes, typeargtypes);
     }
 
-    /** Same as original access(), but without type arguments and arguments.
+    /**
+     * Variant of the generalized access routine, to be used for generating variable,
+     * type resolution diagnostics
      */
-    Symbol access(Symbol sym,
+    Symbol accessBase(Symbol sym,
                   DiagnosticPosition pos,
                   Symbol location,
                   Type site,
                   Name name,
                   boolean qualified) {
-        if (sym.kind >= AMBIGUOUS)
-            return access(sym, pos, location, site, name, qualified, List.<Type>nil(), null);
-        else
-            return sym;
+        return accessInternal(sym, pos, location, site, name, qualified, List.<Type>nil(), null, basicLogResolveHelper);
     }
 
-    /** Same as original access(), but without location, type arguments and arguments.
+    /** Same as original accessBase(), but without location.
      */
-    Symbol access(Symbol sym,
+    Symbol accessBase(Symbol sym,
                   DiagnosticPosition pos,
                   Type site,
                   Name name,
                   boolean qualified) {
-        return access(sym, pos, site.tsym, site, name, qualified);
+        return accessBase(sym, pos, site.tsym, site, name, qualified);
+    }
+
+    interface LogResolveHelper {
+        boolean resolveDiagnosticNeeded(Type site, List<Type> argtypes, List<Type> typeargtypes);
+        List<Type> getArgumentTypes(ResolveError errSym, Symbol accessedSym, Name name, List<Type> argtypes);
     }
 
+    LogResolveHelper basicLogResolveHelper = new LogResolveHelper() {
+        public boolean resolveDiagnosticNeeded(Type site, List<Type> argtypes, List<Type> typeargtypes) {
+            return !site.isErroneous();
+        }
+        public List<Type> getArgumentTypes(ResolveError errSym, Symbol accessedSym, Name name, List<Type> argtypes) {
+            return argtypes;
+        }
+    };
+
+    LogResolveHelper methodLogResolveHelper = new LogResolveHelper() {
+        public boolean resolveDiagnosticNeeded(Type site, List<Type> argtypes, List<Type> typeargtypes) {
+            return !site.isErroneous() &&
+                        !Type.isErroneous(argtypes) &&
+                        (typeargtypes == null || !Type.isErroneous(typeargtypes));
+        }
+        public List<Type> getArgumentTypes(ResolveError errSym, Symbol accessedSym, Name name, List<Type> argtypes) {
+            if (syms.operatorNames.contains(name)) {
+                return argtypes;
+            } else {
+                Symbol msym = errSym.kind == WRONG_MTH ?
+                        ((InapplicableSymbolError)errSym).errCandidate().sym : accessedSym;
+
+                List<Type> argtypes2 = Type.map(argtypes,
+                        deferredAttr.new RecoveryDeferredTypeMap(AttrMode.SPECULATIVE, msym, currentResolutionContext.firstErroneousResolutionPhase()));
+
+                if (msym != accessedSym) {
+                    //fixup deferred type caches - this 'hack' is required because the symbol
+                    //returned by InapplicableSymbolError.access() will hide the candidate
+                    //method symbol that can be used for lookups in the speculative cache,
+                    //causing problems in Attr.checkId()
+                    for (Type t : argtypes) {
+                        if (t.tag == DEFERRED) {
+                            DeferredType dt = (DeferredType)t;
+                            dt.speculativeCache.dupAllTo(msym, accessedSym);
+                        }
+                    }
+                }
+                return argtypes2;
+            }
+        }
+    };
+
     /** Check that sym is not an abstract method.
      */
     void checkNonAbstract(DiagnosticPosition pos, Symbol sym) {
@@ -1641,7 +1975,7 @@
      */
     Symbol resolveIdent(DiagnosticPosition pos, Env<AttrContext> env,
                         Name name, int kind) {
-        return access(
+        return accessBase(
             findIdent(env, name, kind),
             pos, env.enclClass.sym.type, name, false);
     }
@@ -1666,19 +2000,19 @@
             while (steps.nonEmpty() &&
                    steps.head.isApplicable(boxingEnabled, varargsEnabled) &&
                    sym.kind >= ERRONEOUS) {
-                currentResolutionContext.step = steps.head;
+                currentResolutionContext.step = env.info.pendingResolutionPhase = steps.head;
                 sym = findFun(env, name, argtypes, typeargtypes,
                         steps.head.isBoxingRequired,
-                        env.info.varArgs = steps.head.isVarargsRequired);
+                        steps.head.isVarargsRequired);
                 currentResolutionContext.resolutionCache.put(steps.head, sym);
                 steps = steps.tail;
             }
             if (sym.kind >= AMBIGUOUS) {//if nothing is found return the 'first' error
                 MethodResolutionPhase errPhase =
                         currentResolutionContext.firstErroneousResolutionPhase();
-                sym = access(currentResolutionContext.resolutionCache.get(errPhase),
+                sym = accessMethod(currentResolutionContext.resolutionCache.get(errPhase),
                         pos, env.enclClass.sym.type, name, false, argtypes, typeargtypes);
-                env.info.varArgs = errPhase.isVarargsRequired;
+                env.info.pendingResolutionPhase = errPhase;
             }
             return sym;
         }
@@ -1718,10 +2052,10 @@
             while (steps.nonEmpty() &&
                    steps.head.isApplicable(boxingEnabled, varargsEnabled) &&
                    sym.kind >= ERRONEOUS) {
-                currentResolutionContext.step = steps.head;
+                currentResolutionContext.step = env.info.pendingResolutionPhase = steps.head;
                 sym = findMethod(env, site, name, argtypes, typeargtypes,
                         steps.head.isBoxingRequired(),
-                        env.info.varArgs = steps.head.isVarargsRequired(), false);
+                        steps.head.isVarargsRequired(), false);
                 currentResolutionContext.resolutionCache.put(steps.head, sym);
                 steps = steps.tail;
             }
@@ -1729,13 +2063,13 @@
                 //if nothing is found return the 'first' error
                 MethodResolutionPhase errPhase =
                         currentResolutionContext.firstErroneousResolutionPhase();
-                sym = access(currentResolutionContext.resolutionCache.get(errPhase),
+                sym = accessMethod(currentResolutionContext.resolutionCache.get(errPhase),
                         pos, location, site, name, true, argtypes, typeargtypes);
-                env.info.varArgs = errPhase.isVarargsRequired;
+                env.info.pendingResolutionPhase = errPhase;
             } else if (allowMethodHandles) {
                 MethodSymbol msym = (MethodSymbol)sym;
                 if (msym.isSignaturePolymorphic(types)) {
-                    env.info.varArgs = false;
+                    env.info.pendingResolutionPhase = BASIC;
                     return findPolymorphicSignatureInstance(env, sym, argtypes);
                 }
             }
@@ -1757,7 +2091,7 @@
                                             Symbol spMethod,
                                             List<Type> argtypes) {
         Type mtype = infer.instantiatePolymorphicSignatureInstance(env,
-                (MethodSymbol)spMethod, argtypes);
+                (MethodSymbol)spMethod, currentResolutionContext, argtypes);
         for (Symbol sym : polymorphicSignatureScope.getElementsByName(spMethod.name)) {
             if (types.isSameType(mtype, sym.type)) {
                return sym;
@@ -1825,18 +2159,18 @@
             while (steps.nonEmpty() &&
                    steps.head.isApplicable(boxingEnabled, varargsEnabled) &&
                    sym.kind >= ERRONEOUS) {
-                currentResolutionContext.step = steps.head;
+                currentResolutionContext.step = env.info.pendingResolutionPhase = steps.head;
                 sym = findConstructor(pos, env, site, argtypes, typeargtypes,
                         steps.head.isBoxingRequired(),
-                        env.info.varArgs = steps.head.isVarargsRequired());
+                        steps.head.isVarargsRequired());
                 currentResolutionContext.resolutionCache.put(steps.head, sym);
                 steps = steps.tail;
             }
             if (sym.kind >= AMBIGUOUS) {//if nothing is found return the 'first' error
                 MethodResolutionPhase errPhase = currentResolutionContext.firstErroneousResolutionPhase();
-                sym = access(currentResolutionContext.resolutionCache.get(errPhase),
+                sym = accessMethod(currentResolutionContext.resolutionCache.get(errPhase),
                         pos, site, names.init, true, argtypes, typeargtypes);
-                env.info.varArgs = errPhase.isVarargsRequired();
+                env.info.pendingResolutionPhase = errPhase;
             }
             return sym;
         }
@@ -1868,18 +2202,20 @@
             while (steps.nonEmpty() &&
                    steps.head.isApplicable(boxingEnabled, varargsEnabled) &&
                    sym.kind >= ERRONEOUS) {
-                currentResolutionContext.step = steps.head;
+                currentResolutionContext.step = env.info.pendingResolutionPhase = steps.head;
                 sym = findDiamond(env, site, argtypes, typeargtypes,
                         steps.head.isBoxingRequired(),
-                        env.info.varArgs = steps.head.isVarargsRequired());
+                        steps.head.isVarargsRequired());
                 currentResolutionContext.resolutionCache.put(steps.head, sym);
                 steps = steps.tail;
             }
             if (sym.kind >= AMBIGUOUS) {
-                final JCDiagnostic details = sym.kind == WRONG_MTH ?
-                                currentResolutionContext.candidates.head.details :
+                Symbol errSym =
+                        currentResolutionContext.resolutionCache.get(currentResolutionContext.firstErroneousResolutionPhase());
+                final JCDiagnostic details = errSym.kind == WRONG_MTH ?
+                                ((InapplicableSymbolError)errSym).errCandidate().details :
                                 null;
-                Symbol errSym = new ResolveError(WRONG_MTH, "diamond error") {
+                errSym = new InapplicableSymbolError(errSym.kind, "diamondError", currentResolutionContext) {
                     @Override
                     JCDiagnostic getDiagnostic(DiagnosticType dkind, DiagnosticPosition pos,
                             Symbol location, Type site, Name name, List<Type> argtypes, List<Type> typeargtypes) {
@@ -1891,8 +2227,8 @@
                     }
                 };
                 MethodResolutionPhase errPhase = currentResolutionContext.firstErroneousResolutionPhase();
-                sym = access(errSym, pos, site, names.init, true, argtypes, typeargtypes);
-                env.info.varArgs = errPhase.isVarargsRequired();
+                sym = accessMethod(errSym, pos, site, names.init, true, argtypes, typeargtypes);
+                env.info.pendingResolutionPhase = errPhase;
             }
             return sym;
         }
@@ -1919,16 +2255,23 @@
         for (Scope.Entry e = site.tsym.members().lookup(names.init);
              e.scope != null;
              e = e.next()) {
+            final Symbol sym = e.sym;
             //- System.out.println(" e " + e.sym);
-            if (e.sym.kind == MTH &&
-                (e.sym.flags_field & SYNTHETIC) == 0) {
+            if (sym.kind == MTH &&
+                (sym.flags_field & SYNTHETIC) == 0) {
                     List<Type> oldParams = e.sym.type.tag == FORALL ?
-                            ((ForAll)e.sym.type).tvars :
+                            ((ForAll)sym.type).tvars :
                             List.<Type>nil();
                     Type constrType = new ForAll(site.tsym.type.getTypeArguments().appendList(oldParams),
-                            types.createMethodTypeWithReturn(e.sym.type.asMethodType(), site));
+                            types.createMethodTypeWithReturn(sym.type.asMethodType(), site));
+                    MethodSymbol newConstr = new MethodSymbol(sym.flags(), names.init, constrType, site.tsym) {
+                        @Override
+                        public Symbol baseSymbol() {
+                            return sym;
+                        }
+                    };
                     bestSoFar = selectBest(env, site, argtypes, typeargtypes,
-                            new MethodSymbol(e.sym.flags(), names.init, constrType, site.tsym),
+                            newConstr,
                             bestSoFar,
                             allowBoxing,
                             useVarargs,
@@ -1938,6 +2281,335 @@
         return bestSoFar;
     }
 
+    /**
+     * Resolution of member references is typically done as a single
+     * overload resolution step, where the argument types A are inferred from
+     * the target functional descriptor.
+     *
+     * If the member reference is a method reference with a type qualifier,
+     * a two-step lookup process is performed. The first step uses the
+     * expected argument list A, while the second step discards the first
+     * type from A (which is treated as a receiver type).
+     *
+     * There are two cases in which inference is performed: (i) if the member
+     * reference is a constructor reference and the qualifier type is raw - in
+     * which case diamond inference is used to infer a parameterization for the
+     * type qualifier; (ii) if the member reference is an unbound reference
+     * where the type qualifier is raw - in that case, during the unbound lookup
+     * the receiver argument type is used to infer an instantiation for the raw
+     * qualifier type.
+     *
+     * When a multi-step resolution process is exploited, it is an error
+     * if two candidates are found (ambiguity).
+     *
+     * This routine returns a pair (T,S), where S is the member reference symbol,
+     * and T is the type of the class in which S is defined. This is necessary as
+     * the type T might be dynamically inferred (i.e. if constructor reference
+     * has a raw qualifier).
+     */
+    Pair<Symbol, ReferenceLookupHelper> resolveMemberReference(DiagnosticPosition pos,
+                                  Env<AttrContext> env,
+                                  JCMemberReference referenceTree,
+                                  Type site,
+                                  Name name, List<Type> argtypes,
+                                  List<Type> typeargtypes,
+                                  boolean boxingAllowed) {
+        //step 1 - bound lookup
+        ReferenceLookupHelper boundLookupHelper = name.equals(names.init) ?
+                new ConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, boxingAllowed) :
+                new MethodReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, boxingAllowed);
+        Env<AttrContext> boundEnv = env.dup(env.tree, env.info.dup());
+        Symbol boundSym = findMemberReference(boundEnv, boundLookupHelper);
+
+        //step 2 - unbound lookup
+        ReferenceLookupHelper unboundLookupHelper = boundLookupHelper.unboundLookup();
+        Env<AttrContext> unboundEnv = env.dup(env.tree, env.info.dup());
+        Symbol unboundSym = findMemberReference(unboundEnv, unboundLookupHelper);
+
+        //merge results
+        Pair<Symbol, ReferenceLookupHelper> res;
+        if (unboundSym.kind != MTH) {
+            res = new Pair<Symbol, ReferenceLookupHelper>(boundSym, boundLookupHelper);
+            env.info.pendingResolutionPhase = boundEnv.info.pendingResolutionPhase;
+        } else if (boundSym.kind == MTH) {
+            res = new Pair<Symbol, ReferenceLookupHelper>(ambiguityError(boundSym, unboundSym), boundLookupHelper);
+            env.info.pendingResolutionPhase = boundEnv.info.pendingResolutionPhase;
+        } else {
+            res = new Pair<Symbol, ReferenceLookupHelper>(unboundSym, unboundLookupHelper);
+            env.info.pendingResolutionPhase = unboundEnv.info.pendingResolutionPhase;
+        }
+
+        return res;
+    }
+
+    /**
+     * Helper for defining custom method-like lookup logic; a lookup helper
+     * provides hooks for (i) the actual lookup logic and (ii) accessing the
+     * lookup result (this step might result in compiler diagnostics to be generated)
+     */
+    abstract class LookupHelper {
+
+        /** name of the symbol to lookup */
+        Name name;
+
+        /** location in which the lookup takes place */
+        Type site;
+
+        /** actual types used during the lookup */
+        List<Type> argtypes;
+
+        /** type arguments used during the lookup */
+        List<Type> typeargtypes;
+
+        LookupHelper(Name name, Type site, List<Type> argtypes, List<Type> typeargtypes) {
+            this.name = name;
+            this.site = site;
+            this.argtypes = argtypes;
+            this.typeargtypes = typeargtypes;
+        }
+
+        /**
+         * Search for a symbol under a given overload resolution phase - this method
+         * is usually called several times, once per each overload resolution phase
+         */
+        abstract Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase);
+
+        /**
+         * Validate the result of the lookup
+         */
+        abstract Symbol access(Env<AttrContext> env, Symbol symbol);
+    }
+
+    /**
+     * Helper class for member reference lookup. A reference lookup helper
+     * defines the basic logic for member reference lookup; a method gives
+     * access to an 'unbound' helper used to perform an unbound member
+     * reference lookup.
+     */
+    abstract class ReferenceLookupHelper extends LookupHelper {
+
+        /** The member reference tree */
+        JCMemberReference referenceTree;
+
+        /** Max overload resolution phase handled by this helper */
+        MethodResolutionPhase maxPhase;
+
+        ReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
+                List<Type> argtypes, List<Type> typeargtypes, boolean boxingAllowed) {
+            super(name, site, argtypes, typeargtypes);
+            this.referenceTree = referenceTree;
+            this.maxPhase = boxingAllowed ? VARARITY : BASIC;
+        }
+
+        /**
+         * Returns an unbound version of this lookup helper. By default, this
+         * method returns an dummy lookup helper.
+         */
+        ReferenceLookupHelper unboundLookup() {
+            //dummy loopkup helper that always return 'methodNotFound'
+            return new ReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase.isBoxingRequired()) {
+                @Override
+                ReferenceLookupHelper unboundLookup() {
+                    return this;
+                }
+                @Override
+                Symbol lookupReference(Env<AttrContext> env, MethodResolutionPhase phase) {
+                    return methodNotFound;
+                }
+                @Override
+                ReferenceKind referenceKind(Symbol sym) {
+                    Assert.error();
+                    return null;
+                }
+            };
+        }
+
+        /**
+         * Get the kind of the member reference
+         */
+        abstract JCMemberReference.ReferenceKind referenceKind(Symbol sym);
+
+        @Override
+        Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase) {
+            return (env.info.pendingResolutionPhase.ordinal() > maxPhase.ordinal()) ?
+                    methodNotFound : lookupReference(env, phase);
+        }
+
+        abstract Symbol lookupReference(Env<AttrContext> env, MethodResolutionPhase phase);
+
+        Symbol access(Env<AttrContext> env, Symbol sym) {
+            if (sym.kind >= AMBIGUOUS) {
+                MethodResolutionPhase errPhase = currentResolutionContext.firstErroneousResolutionPhase();
+                if (errPhase.ordinal() > maxPhase.ordinal()) {
+                    errPhase = maxPhase;
+                }
+                env.info.pendingResolutionPhase = errPhase;
+                sym = currentResolutionContext.resolutionCache.get(errPhase);
+            }
+            return sym;
+        }
+    }
+
+    /**
+     * Helper class for method reference lookup. The lookup logic is based
+     * upon Resolve.findMethod; in certain cases, this helper class has a
+     * corresponding unbound helper class (see UnboundMethodReferenceLookupHelper).
+     * In such cases, non-static lookup results are thrown away.
+     */
+    class MethodReferenceLookupHelper extends ReferenceLookupHelper {
+
+        MethodReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
+                List<Type> argtypes, List<Type> typeargtypes, boolean boxingAllowed) {
+            super(referenceTree, name, site, argtypes, typeargtypes, boxingAllowed);
+        }
+
+        protected Symbol lookupReferenceInternal(Env<AttrContext> env, MethodResolutionPhase phase) {
+            return findMethod(env, site, name, argtypes, typeargtypes,
+                    phase.isBoxingRequired(), phase.isVarargsRequired(), syms.operatorNames.contains(name));
+        }
+
+        protected Symbol adjustLookupResult(Env<AttrContext> env, Symbol sym) {
+            return !TreeInfo.isStaticSelector(referenceTree.expr, names) ||
+                        sym.kind != MTH ||
+                        sym.isStatic() ? sym : new StaticError(sym);
+        }
+
+        @Override
+        final Symbol lookupReference(Env<AttrContext> env, MethodResolutionPhase phase) {
+            return adjustLookupResult(env, lookupReferenceInternal(env, phase));
+        }
+
+        @Override
+        ReferenceLookupHelper unboundLookup() {
+            if (TreeInfo.isStaticSelector(referenceTree.expr, names) &&
+                    argtypes.nonEmpty() &&
+                    types.isSubtypeUnchecked(argtypes.head, site)) {
+                return new UnboundMethodReferenceLookupHelper(referenceTree, name,
+                        site, argtypes, typeargtypes, maxPhase.isBoxingRequired());
+            } else {
+                return super.unboundLookup();
+            }
+        }
+
+        @Override
+        ReferenceKind referenceKind(Symbol sym) {
+            if (sym.isStatic()) {
+                return TreeInfo.isStaticSelector(referenceTree.expr, names) ?
+                        ReferenceKind.STATIC : ReferenceKind.STATIC_EVAL;
+            } else {
+                Name selName = TreeInfo.name(referenceTree.getQualifierExpression());
+                return selName != null && selName == names._super ?
+                        ReferenceKind.SUPER :
+                        ReferenceKind.BOUND;
+            }
+        }
+    }
+
+    /**
+     * Helper class for unbound method reference lookup. Essentially the same
+     * as the basic method reference lookup helper; main difference is that static
+     * lookup results are thrown away. If qualifier type is raw, an attempt to
+     * infer a parameterized type is made using the first actual argument (that
+     * would otherwise be ignored during the lookup).
+     */
+    class UnboundMethodReferenceLookupHelper extends MethodReferenceLookupHelper {
+
+        UnboundMethodReferenceLookupHelper(JCMemberReference referenceTree, Name name, Type site,
+                List<Type> argtypes, List<Type> typeargtypes, boolean boxingAllowed) {
+            super(referenceTree, name,
+                    site.isRaw() ? types.asSuper(argtypes.head, site.tsym) : site,
+                    argtypes.tail, typeargtypes, boxingAllowed);
+        }
+
+        @Override
+        protected Symbol adjustLookupResult(Env<AttrContext> env, Symbol sym) {
+            return sym.kind != MTH || !sym.isStatic() ? sym : new StaticError(sym);
+        }
+
+        @Override
+        ReferenceLookupHelper unboundLookup() {
+            return this;
+        }
+
+        @Override
+        ReferenceKind referenceKind(Symbol sym) {
+            return ReferenceKind.UNBOUND;
+        }
+    }
+
+    /**
+     * Helper class for constructor reference lookup. The lookup logic is based
+     * upon either Resolve.findMethod or Resolve.findDiamond - depending on
+     * whether the constructor reference needs diamond inference (this is the case
+     * if the qualifier type is raw). A special erroneous symbol is returned
+     * if the lookup returns the constructor of an inner class and there's no
+     * enclosing instance in scope.
+     */
+    class ConstructorReferenceLookupHelper extends ReferenceLookupHelper {
+
+        boolean needsInference;
+
+        ConstructorReferenceLookupHelper(JCMemberReference referenceTree, Type site, List<Type> argtypes,
+                List<Type> typeargtypes, boolean boxingAllowed) {
+            super(referenceTree, names.init, site, argtypes, typeargtypes, boxingAllowed);
+            if (site.isRaw()) {
+                this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym);
+                needsInference = true;
+            }
+        }
+
+        @Override
+        protected Symbol lookupReference(Env<AttrContext> env, MethodResolutionPhase phase) {
+            Symbol sym = needsInference ?
+                findDiamond(env, site, argtypes, typeargtypes, phase.isBoxingRequired(), phase.isVarargsRequired()) :
+                findMethod(env, site, name, argtypes, typeargtypes,
+                        phase.isBoxingRequired(), phase.isVarargsRequired(), syms.operatorNames.contains(name));
+            return sym.kind != MTH ||
+                          site.getEnclosingType().tag == NONE ||
+                          hasEnclosingInstance(env, site) ?
+                          sym : new InvalidSymbolError(Kinds.MISSING_ENCL, sym, null) {
+                    @Override
+                    JCDiagnostic getDiagnostic(DiagnosticType dkind, DiagnosticPosition pos, Symbol location, Type site, Name name, List<Type> argtypes, List<Type> typeargtypes) {
+                       return diags.create(dkind, log.currentSource(), pos,
+                            "cant.access.inner.cls.constr", site.tsym.name, argtypes, site.getEnclosingType());
+                    }
+                };
+        }
+
+        @Override
+        ReferenceKind referenceKind(Symbol sym) {
+            return site.getEnclosingType().tag == NONE ?
+                    ReferenceKind.TOPLEVEL : ReferenceKind.IMPLICIT_INNER;
+        }
+    }
+
+    /**
+     * Resolution step for member reference. This generalizes a standard
+     * method/constructor lookup - on each overload resolution step, a
+     * lookup helper class is used to perform the reference lookup; at the end
+     * of the lookup, the helper is used to validate the results.
+     */
+    Symbol findMemberReference(Env<AttrContext> env, LookupHelper lookupHelper) {
+        MethodResolutionContext prevResolutionContext = currentResolutionContext;
+        try {
+            currentResolutionContext = new MethodResolutionContext();
+            Symbol sym = methodNotFound;
+            List<MethodResolutionPhase> steps = methodResolutionSteps;
+            while (steps.nonEmpty() &&
+                   steps.head.isApplicable(boxingEnabled, varargsEnabled) &&
+                   sym.kind >= ERRONEOUS) {
+                currentResolutionContext.step = env.info.pendingResolutionPhase = steps.head;
+                sym = lookupHelper.lookup(env, steps.head);
+                currentResolutionContext.resolutionCache.put(steps.head, sym);
+                steps = steps.tail;
+            }
+            return lookupHelper.access(env, sym);
+        }
+        finally {
+            currentResolutionContext = prevResolutionContext;
+        }
+    }
+
     /** Resolve constructor.
      *  @param pos       The position to use for error reporting.
      *  @param env       The environment current at the constructor invocation.
@@ -2013,7 +2685,7 @@
             if (boxingEnabled && sym.kind >= WRONG_MTHS)
                 sym = findMethod(env, syms.predefClass.type, name, argtypes,
                                  null, true, false, true);
-            return access(sym, pos, env.enclClass.sym.type, name,
+            return accessMethod(sym, pos, env.enclClass.sym.type, name,
                           false, argtypes, null);
         }
         finally {
@@ -2065,7 +2737,7 @@
                 Symbol sym = env1.info.scope.lookup(name).sym;
                 if (sym != null) {
                     if (staticOnly) sym = new StaticError(sym);
-                    return access(sym, pos, env.enclClass.sym.type,
+                    return accessBase(sym, pos, env.enclClass.sym.type,
                                   name, true);
                 }
             }
@@ -2087,6 +2759,23 @@
                                  Env<AttrContext> env,
                                  Symbol member,
                                  boolean isSuperCall) {
+        Symbol sym = resolveSelfContainingInternal(env, member, isSuperCall);
+        if (sym == null) {
+            log.error(pos, "encl.class.required", member);
+            return syms.errSymbol;
+        } else {
+            return accessBase(sym, pos, env.enclClass.sym.type, sym.name, true);
+        }
+    }
+
+    boolean hasEnclosingInstance(Env<AttrContext> env, Type type) {
+        Symbol encl = resolveSelfContainingInternal(env, type.tsym, false);
+        return encl != null && encl.kind < ERRONEOUS;
+    }
+
+    private Symbol resolveSelfContainingInternal(Env<AttrContext> env,
+                                 Symbol member,
+                                 boolean isSuperCall) {
         Name name = names._this;
         Env<AttrContext> env1 = isSuperCall ? env.outer : env;
         boolean staticOnly = false;
@@ -2097,8 +2786,7 @@
                     Symbol sym = env1.info.scope.lookup(name).sym;
                     if (sym != null) {
                         if (staticOnly) sym = new StaticError(sym);
-                        return access(sym, pos, env.enclClass.sym.type,
-                                      name, true);
+                        return sym;
                     }
                 }
                 if ((env1.enclClass.sym.flags() & STATIC) != 0)
@@ -2106,8 +2794,7 @@
                 env1 = env1.outer;
             }
         }
-        log.error(pos, "encl.class.required", member);
-        return syms.errSymbol;
+        return null;
     }
 
     /**
@@ -2155,7 +2842,19 @@
     private final LocalizedString noArgs = new LocalizedString("compiler.misc.no.args");
 
     public Object methodArguments(List<Type> argtypes) {
-        return argtypes == null || argtypes.isEmpty() ? noArgs : argtypes;
+        if (argtypes == null || argtypes.isEmpty()) {
+            return noArgs;
+        } else {
+            ListBuffer<Object> diagArgs = ListBuffer.lb();
+            for (Type t : argtypes) {
+                if (t.tag == DEFERRED) {
+                    diagArgs.append(((DeferredAttr.DeferredType)t).tree);
+                } else {
+                    diagArgs.append(t);
+                }
+            }
+            return diagArgs;
+        }
     }
 
     /**
@@ -2163,7 +2862,7 @@
      * represent a different kinds of resolution error - as such they must
      * specify how they map into concrete compiler diagnostics.
      */
-    private abstract class ResolveError extends Symbol {
+    abstract class ResolveError extends Symbol {
 
         /** The name of the kind of error, for debugging only. */
         final String debugName;
@@ -2220,17 +2919,6 @@
                 Name name,
                 List<Type> argtypes,
                 List<Type> typeargtypes);
-
-        /**
-         * A name designates an operator if it consists
-         * of a non-empty sequence of operator symbols {@literal +-~!/*%&|^<>= }
-         */
-        boolean isOperator(Name name) {
-            int i = 0;
-            while (i < name.getByteLength() &&
-                   "+-~!*/%&|^<>=".indexOf(name.getByteAt(i)) >= 0) i++;
-            return i > 0 && i == name.getByteLength();
-        }
     }
 
     /**
@@ -2291,7 +2979,7 @@
             if (name == names.error)
                 return null;
 
-            if (isOperator(name)) {
+            if (syms.operatorNames.contains(name)) {
                 boolean isUnaryOp = argtypes.size() == 1;
                 String key = argtypes.size() == 1 ?
                     "operator.cant.be.applied" :
@@ -2313,8 +3001,7 @@
                 hasLocation = !location.name.equals(names._this) &&
                         !location.name.equals(names._super);
             }
-            boolean isConstructor = kind == ABSENT_MTH &&
-                    name == names.table.names.init;
+            boolean isConstructor = kind == ABSENT_MTH && name == names.init;
             KindName kindname = isConstructor ? KindName.CONSTRUCTOR : absentKind(kind);
             Name idname = isConstructor ? site.tsym.name : name;
             String errKey = getErrorKey(kindname, typeargtypes.nonEmpty(), hasLocation);
@@ -2365,12 +3052,15 @@
      */
     class InapplicableSymbolError extends ResolveError {
 
-        InapplicableSymbolError() {
-            super(WRONG_MTH, "inapplicable symbol error");
+        protected MethodResolutionContext resolveContext;
+
+        InapplicableSymbolError(MethodResolutionContext context) {
+            this(WRONG_MTH, "inapplicable symbol error", context);
         }
 
-        protected InapplicableSymbolError(int kind, String debugName) {
+        protected InapplicableSymbolError(int kind, String debugName, MethodResolutionContext context) {
             super(kind, debugName);
+            this.resolveContext = context;
         }
 
         @Override
@@ -2394,7 +3084,7 @@
             if (name == names.error)
                 return null;
 
-            if (isOperator(name)) {
+            if (syms.operatorNames.contains(name)) {
                 boolean isUnaryOp = argtypes.size() == 1;
                 String key = argtypes.size() == 1 ?
                     "operator.cant.be.applied" :
@@ -2408,7 +3098,7 @@
                 Candidate c = errCandidate();
                 Symbol ws = c.sym.asMemberOf(site, types);
                 return diags.create(dkind, log.currentSource(), pos,
-                          "cant.apply.symbol" + (c.details != null ? ".1" : ""),
+                          "cant.apply.symbol",
                           kindName(ws),
                           ws.name == names.init ? ws.owner.name : ws.name,
                           methodArguments(ws.type.getParameterTypes()),
@@ -2425,13 +3115,13 @@
         }
 
         protected boolean shouldReport(Candidate c) {
+            MethodResolutionPhase errPhase = resolveContext.firstErroneousResolutionPhase();
             return !c.isApplicable() &&
-                    (((c.sym.flags() & VARARGS) != 0 && c.step == VARARITY) ||
-                      (c.sym.flags() & VARARGS) == 0 && c.step == (boxingEnabled ? BOX : BASIC));
+                    c.step == errPhase;
         }
 
         private Candidate errCandidate() {
-            for (Candidate c : currentResolutionContext.candidates) {
+            for (Candidate c : resolveContext.candidates) {
                 if (shouldReport(c)) {
                     return c;
                 }
@@ -2448,8 +3138,8 @@
      */
     class InapplicableSymbolsError extends InapplicableSymbolError {
 
-        InapplicableSymbolsError() {
-            super(WRONG_MTHS, "inapplicable symbols");
+        InapplicableSymbolsError(MethodResolutionContext context) {
+            super(WRONG_MTHS, "inapplicable symbols", context);
         }
 
         @Override
@@ -2460,7 +3150,7 @@
                 Name name,
                 List<Type> argtypes,
                 List<Type> typeargtypes) {
-            if (currentResolutionContext.candidates.nonEmpty()) {
+            if (!resolveContext.candidates.isEmpty()) {
                 JCDiagnostic err = diags.create(dkind,
                         log.currentSource(),
                         pos,
@@ -2478,7 +3168,7 @@
         //where
         List<JCDiagnostic> candidateDetails(Type site) {
             List<JCDiagnostic> details = List.nil();
-            for (Candidate c : currentResolutionContext.candidates) {
+            for (Candidate c : resolveContext.candidates) {
                 if (!shouldReport(c)) continue;
                 JCDiagnostic detailDiag = diags.fragment("inapplicable.method",
                         Kinds.kindName(c.sym),
@@ -2491,7 +3181,7 @@
         }
 
         private Name getName() {
-            Symbol sym = currentResolutionContext.candidates.head.sym;
+            Symbol sym = resolveContext.candidates.head.sym;
             return sym.name == names.init ?
                 sym.owner.name :
                 sym.name;
@@ -2672,9 +3362,10 @@
         private Map<MethodResolutionPhase, Symbol> resolutionCache =
             new EnumMap<MethodResolutionPhase, Symbol>(MethodResolutionPhase.class);
 
-        private MethodResolutionPhase step = null;
+        MethodResolutionPhase step = null;
 
         private boolean internalResolution = false;
+        private DeferredAttr.AttrMode attrMode = DeferredAttr.AttrMode.SPECULATIVE;
 
         private MethodResolutionPhase firstErroneousResolutionPhase() {
             MethodResolutionPhase bestSoFar = BASIC;
@@ -2684,6 +3375,7 @@
                    steps.head.isApplicable(boxingEnabled, varargsEnabled) &&
                    sym.kind >= WRONG_MTHS) {
                 sym = resolutionCache.get(steps.head);
+                if (sym.kind == ABSENT_MTH) break; //ignore spurious empty entries
                 bestSoFar = steps.head;
                 steps = steps.tail;
             }
@@ -2692,8 +3384,7 @@
 
         void addInapplicableCandidate(Symbol sym, JCDiagnostic details) {
             Candidate c = new Candidate(currentResolutionContext.step, sym, details, null);
-            if (!candidates.contains(c))
-                candidates = candidates.append(c);
+            candidates = candidates.append(c);
         }
 
         void addApplicableCandidate(Symbol sym, Type mtype) {
@@ -2701,6 +3392,16 @@
             candidates = candidates.append(c);
         }
 
+        Candidate getCandidate(Symbol sym, MethodResolutionPhase phase) {
+            for (Candidate c : currentResolutionContext.candidates) {
+                if (c.step == phase &&
+                        c.sym.baseSymbol() == sym.baseSymbol()) {
+                    return c;
+                }
+            }
+            return null;
+        }
+
         /**
          * This class represents an overload resolution candidate. There are two
          * kinds of candidates: applicable methods and inapplicable methods;
@@ -2728,9 +3429,9 @@
                     Symbol s1 = this.sym;
                     Symbol s2 = ((Candidate)o).sym;
                     if  ((s1 != s2 &&
-                        (s1.overrides(s2, s1.owner.type.tsym, types, false) ||
-                        (s2.overrides(s1, s2.owner.type.tsym, types, false)))) ||
-                        ((s1.isConstructor() || s2.isConstructor()) && s1.owner != s2.owner))
+                            (s1.overrides(s2, s1.owner.type.tsym, types, false) ||
+                            (s2.overrides(s1, s2.owner.type.tsym, types, false)))) ||
+                            ((s1.isConstructor() || s2.isConstructor()) && s1.owner != s2.owner))
                         return true;
                 }
                 return false;
@@ -2740,6 +3441,14 @@
                 return mtype != null;
             }
         }
+
+        DeferredAttr.AttrMode attrMode() {
+            return attrMode;
+        }
+
+        boolean internal() {
+            return internalResolution;
+        }
     }
 
     MethodResolutionContext currentResolutionContext = null;
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java	Wed Jul 05 18:26:11 2017 +0200
@@ -627,6 +627,16 @@
         result = tree;
     }
 
+    @Override
+    public void visitLambda(JCLambda tree) {
+        Assert.error("Translation of lambda expression not supported yet");
+    }
+
+    @Override
+    public void visitReference(JCMemberReference tree) {
+        Assert.error("Translation of method reference not supported yet");
+    }
+
     public void visitParens(JCParens tree) {
         tree.expr = translate(tree.expr, pt);
         tree.type = erasure(tree.type);
--- a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java	Wed Jul 05 18:26:11 2017 +0200
@@ -733,11 +733,7 @@
                 urls[count++] = url;
             }
         }
-        if (urls.length != count) {
-            URL[] tmp = new URL[count];
-            System.arraycopy(urls, 0, tmp, 0, count);
-            urls = tmp;
-        }
+        urls = Arrays.copyOf(urls, count);
         return urls;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java	Wed Jul 05 18:26:11 2017 +0200
@@ -84,6 +84,16 @@
     public final static int CONSTANT_MethodType = 16;
     public final static int CONSTANT_InvokeDynamic = 18;
 
+    public final static int REF_getField = 1;
+    public final static int REF_getStatic = 2;
+    public final static int REF_putField = 3;
+    public final static int REF_putStatic = 4;
+    public final static int REF_invokeVirtual = 5;
+    public final static int REF_invokeStatic = 6;
+    public final static int REF_invokeSpecial = 7;
+    public final static int REF_newInvokeSpecial = 8;
+    public final static int REF_invokeInterface = 9;
+
     public final static int MAX_PARAMETERS = 0xff;
     public final static int MAX_DIMENSIONS = 0xff;
     public final static int MAX_CODE = 0xffff;
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -26,6 +26,8 @@
 package com.sun.tools.javac.jvm;
 
 import java.io.*;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.HashSet;
 
@@ -137,6 +139,11 @@
      */
     ListBuffer<ClassSymbol> innerClassesQueue;
 
+    /** The bootstrap methods to be written in the corresponding class attribute
+     *  (one for each invokedynamic)
+     */
+    Map<MethodSymbol, Pool.MethodHandle> bootstrapMethods;
+
     /** The log to use for verbose output.
      */
     private final Log log;
@@ -477,11 +484,27 @@
 
             if (value instanceof MethodSymbol) {
                 MethodSymbol m = (MethodSymbol)value;
-                poolbuf.appendByte((m.owner.flags() & INTERFACE) != 0
-                          ? CONSTANT_InterfaceMethodref
-                          : CONSTANT_Methodref);
-                poolbuf.appendChar(pool.put(m.owner));
-                poolbuf.appendChar(pool.put(nameType(m)));
+                if (!m.isDynamic()) {
+                    poolbuf.appendByte((m.owner.flags() & INTERFACE) != 0
+                              ? CONSTANT_InterfaceMethodref
+                              : CONSTANT_Methodref);
+                    poolbuf.appendChar(pool.put(m.owner));
+                    poolbuf.appendChar(pool.put(nameType(m)));
+                } else {
+                    //invokedynamic
+                    DynamicMethodSymbol dynSym = (DynamicMethodSymbol)m;
+                    Pool.MethodHandle handle = new Pool.MethodHandle(dynSym.bsmKind, dynSym.bsm);
+                    bootstrapMethods.put(dynSym, handle);
+                    //init cp entries
+                    pool.put(names.BootstrapMethods);
+                    pool.put(handle);
+                    for (Object staticArg : dynSym.staticArgs) {
+                        pool.put(staticArg);
+                    }
+                    poolbuf.appendByte(CONSTANT_InvokeDynamic);
+                    poolbuf.appendChar(bootstrapMethods.size() - 1);
+                    poolbuf.appendChar(pool.put(nameType(dynSym)));
+                }
             } else if (value instanceof VarSymbol) {
                 VarSymbol v = (VarSymbol)value;
                 poolbuf.appendByte(CONSTANT_Fieldref);
@@ -526,11 +549,20 @@
             } else if (value instanceof String) {
                 poolbuf.appendByte(CONSTANT_String);
                 poolbuf.appendChar(pool.put(names.fromString((String)value)));
+            } else if (value instanceof MethodType) {
+                MethodType mtype = (MethodType)value;
+                poolbuf.appendByte(CONSTANT_MethodType);
+                poolbuf.appendChar(pool.put(typeSig(mtype)));
             } else if (value instanceof Type) {
                 Type type = (Type)value;
                 if (type.tag == CLASS) enterInner((ClassSymbol)type.tsym);
                 poolbuf.appendByte(CONSTANT_Class);
                 poolbuf.appendChar(pool.put(xClassName(type)));
+            } else if (value instanceof Pool.MethodHandle) {
+                Pool.MethodHandle ref = (Pool.MethodHandle)value;
+                poolbuf.appendByte(CONSTANT_MethodHandle);
+                poolbuf.appendByte(ref.refKind);
+                poolbuf.appendChar(pool.put(ref.refSym));
             } else {
                 Assert.error("writePool " + value);
             }
@@ -914,6 +946,25 @@
         endAttr(alenIdx);
     }
 
+    /** Write "bootstrapMethods" attribute.
+     */
+    void writeBootstrapMethods() {
+        int alenIdx = writeAttr(names.BootstrapMethods);
+        databuf.appendChar(bootstrapMethods.size());
+        for (Map.Entry<MethodSymbol, Pool.MethodHandle> entry : bootstrapMethods.entrySet()) {
+            DynamicMethodSymbol dsym = (DynamicMethodSymbol)entry.getKey();
+            //write BSM handle
+            databuf.appendChar(pool.get(entry.getValue()));
+            //write static args length
+            databuf.appendChar(dsym.staticArgs.length);
+            //write static args array
+            for (Object o : dsym.staticArgs) {
+                databuf.appendChar(pool.get(o));
+            }
+        }
+        endAttr(alenIdx);
+    }
+
     /** Write field symbol, entering all references into constant pool.
      */
     void writeField(VarSymbol v) {
@@ -1483,6 +1534,7 @@
         pool = c.pool;
         innerClasses = null;
         innerClassesQueue = null;
+        bootstrapMethods = new LinkedHashMap<MethodSymbol, Pool.MethodHandle>();
 
         Type supertype = types.supertype(c.type);
         List<Type> interfaces = types.interfaces(c.type);
@@ -1589,6 +1641,12 @@
             writeInnerClasses();
             acount++;
         }
+
+        if (!bootstrapMethods.isEmpty()) {
+            writeBootstrapMethods();
+            acount++;
+        }
+
         endAttrs(acountIdx, acount);
 
         poolbuf.appendBytes(databuf.elems, 0, databuf.length);
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java	Wed Jul 05 18:26:11 2017 +0200
@@ -314,11 +314,7 @@
      */
     private  void emit1(int od) {
         if (!alive) return;
-        if (cp == code.length) {
-            byte[] newcode = new byte[cp * 2];
-            System.arraycopy(code, 0, newcode, 0, cp);
-            code = newcode;
-        }
+        code = ArrayUtils.ensureCapacity(code, cp);
         code[cp++] = (byte)od;
     }
 
@@ -903,6 +899,8 @@
         if (o instanceof Double) return syms.doubleType;
         if (o instanceof ClassSymbol) return syms.classType;
         if (o instanceof Type.ArrayType) return syms.classType;
+        if (o instanceof Type.MethodType) return syms.methodTypeType;
+        if (o instanceof Pool.MethodHandle) return syms.methodHandleType;
         throw new AssertionError(o);
     }
 
@@ -1245,12 +1243,8 @@
 
         if (stackMapBuffer == null) {
             stackMapBuffer = new StackMapFrame[20];
-        } else if (stackMapBuffer.length == stackMapBufferSize) {
-            StackMapFrame[] newStackMapBuffer =
-                new StackMapFrame[stackMapBufferSize << 1];
-            System.arraycopy(stackMapBuffer, 0, newStackMapBuffer,
-                             0, stackMapBufferSize);
-            stackMapBuffer = newStackMapBuffer;
+        } else {
+            stackMapBuffer = ArrayUtils.ensureCapacity(stackMapBuffer, stackMapBufferSize);
         }
         StackMapFrame frame =
             stackMapBuffer[stackMapBufferSize++] = new StackMapFrame();
@@ -1318,12 +1312,10 @@
 
         if (stackMapTableBuffer == null) {
             stackMapTableBuffer = new StackMapTableFrame[20];
-        } else if (stackMapTableBuffer.length == stackMapBufferSize) {
-            StackMapTableFrame[] newStackMapTableBuffer =
-                new StackMapTableFrame[stackMapBufferSize << 1];
-            System.arraycopy(stackMapTableBuffer, 0, newStackMapTableBuffer,
-                             0, stackMapBufferSize);
-            stackMapTableBuffer = newStackMapTableBuffer;
+        } else {
+            stackMapTableBuffer = ArrayUtils.ensureCapacity(
+                                    stackMapTableBuffer,
+                                    stackMapBufferSize);
         }
         stackMapTableBuffer[stackMapBufferSize++] =
                 StackMapTableFrame.getInstance(frame, lastFrame.pc, lastFrame.locals, types);
@@ -1649,10 +1641,8 @@
         void lock(int register) {
             if (locks == null) {
                 locks = new int[20];
-            } else if (locks.length == nlocks) {
-                int[] newLocks = new int[locks.length << 1];
-                System.arraycopy(locks, 0, newLocks, 0, locks.length);
-                locks = newLocks;
+            } else {
+                locks = ArrayUtils.ensureCapacity(locks, nlocks);
             }
             locks[nlocks] = register;
             nlocks++;
@@ -1678,11 +1668,7 @@
             default:
                 break;
             }
-            if (stacksize+2 >= stack.length) {
-                Type[] newstack = new Type[2*stack.length];
-                System.arraycopy(stack, 0, newstack, 0, stack.length);
-                stack = newstack;
-            }
+            stack = ArrayUtils.ensureCapacity(stack, stacksize+2);
             stack[stacksize++] = t;
             switch (width(t)) {
             case 1:
@@ -1869,13 +1855,7 @@
     /** Add a new local variable. */
     private void addLocalVar(VarSymbol v) {
         int adr = v.adr;
-        if (adr+1 >= lvar.length) {
-            int newlength = lvar.length << 1;
-            if (newlength <= adr) newlength = adr + 10;
-            LocalVar[] new_lvar = new LocalVar[newlength];
-            System.arraycopy(lvar, 0, new_lvar, 0, lvar.length);
-            lvar = new_lvar;
-        }
+        lvar = ArrayUtils.ensureCapacity(lvar, adr+1);
         Assert.checkNull(lvar[adr]);
         if (pendingJumps != null) resolvePending();
         lvar[adr] = new LocalVar(v);
@@ -1955,11 +1935,8 @@
         if ((var.sym.flags() & Flags.SYNTHETIC) != 0) return;
         if (varBuffer == null)
             varBuffer = new LocalVar[20];
-        else if (varBufferSize >= varBuffer.length) {
-            LocalVar[] newVarBuffer = new LocalVar[varBufferSize*2];
-            System.arraycopy(varBuffer, 0, newVarBuffer, 0, varBuffer.length);
-            varBuffer = newVarBuffer;
-        }
+        else
+            varBuffer = ArrayUtils.ensureCapacity(varBuffer, varBufferSize);
         varBuffer[varBufferSize++] = var;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java	Wed Jul 05 18:26:11 2017 +0200
@@ -2103,6 +2103,8 @@
             result = res;
         } else if (sym.kind == VAR && sym.owner.kind == MTH) {
             result = items.makeLocalItem((VarSymbol)sym);
+        } else if (isInvokeDynamic(sym)) {
+            result = items.makeDynamicItem(sym);
         } else if ((sym.flags() & STATIC) != 0) {
             if (!isAccessSuper(env.enclMethod))
                 sym = binaryQualifier(sym, env.enclClass.type);
@@ -2152,8 +2154,12 @@
             result = items.
                 makeImmediateItem(sym.type, ((VarSymbol) sym).getConstValue());
         } else {
-            if (!accessSuper)
+            if (isInvokeDynamic(sym)) {
+                result = items.makeDynamicItem(sym);
+                return;
+            } else if (!accessSuper) {
                 sym = binaryQualifier(sym, tree.selected.type);
+            }
             if ((sym.flags() & STATIC) != 0) {
                 if (!selectSuper && (ssym == null || ssym.kind != TYP))
                     base = base.load();
@@ -2174,6 +2180,10 @@
         }
     }
 
+    public boolean isInvokeDynamic(Symbol sym) {
+        return sym.kind == MTH && ((MethodSymbol)sym).isDynamic();
+    }
+
     public void visitLiteral(JCLiteral tree) {
         if (tree.type.tag == TypeTags.BOT) {
             code.emitop0(aconst_null);
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Items.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Items.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -110,6 +110,13 @@
         return stackItem[Code.typecode(type)];
     }
 
+    /** Make an item representing a dynamically invoked method.
+     *  @param member   The represented symbol.
+     */
+    Item makeDynamicItem(Symbol member) {
+        return new DynamicItem(member);
+    }
+
     /** Make an item representing an indexed expression.
      *  @param type    The expression's type.
      */
@@ -457,6 +464,35 @@
         }
     }
 
+    /** An item representing a dynamic call site.
+     */
+    class DynamicItem extends StaticItem {
+        DynamicItem(Symbol member) {
+            super(member);
+        }
+
+        Item load() {
+            assert false;
+            return null;
+        }
+
+        void store() {
+            assert false;
+        }
+
+        Item invoke() {
+            // assert target.hasNativeInvokeDynamic();
+            MethodType mtype = (MethodType)member.erasure(types);
+            int rescode = Code.typecode(mtype.restype);
+            code.emitInvokedynamic(pool.put(member), mtype);
+            return stackItem[rescode];
+        }
+
+        public String toString() {
+            return "dynamic(" + member + ")";
+        }
+    }
+
     /** An item representing an instance variable or method.
      */
     class MemberItem extends Item {
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -25,9 +25,16 @@
 
 package com.sun.tools.javac.jvm;
 
-import java.util.*;
+import com.sun.tools.javac.code.Kinds;
+import com.sun.tools.javac.code.Symbol;
+import com.sun.tools.javac.code.Symbol.*;
 
-import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.util.ArrayUtils;
+import com.sun.tools.javac.util.Assert;
+import com.sun.tools.javac.util.Filter;
+import com.sun.tools.javac.util.Name;
+
+import java.util.*;
 
 /** An internal structure that corresponds to the constant pool of a classfile.
  *
@@ -83,14 +90,6 @@
         indices.clear();
     }
 
-    /** Double pool buffer in size.
-     */
-    private void doublePool() {
-        Object[] newpool = new Object[pool.length * 2];
-        System.arraycopy(pool, 0, newpool, 0, pool.length);
-        pool = newpool;
-    }
-
     /** Place an object in the pool, unless it is already there.
      *  If object is a symbol also enter its owner unless the owner is a
      *  package.  Return the object's index in the pool.
@@ -106,10 +105,10 @@
 //          System.err.println("put " + value + " " + value.getClass());//DEBUG
             index = pp;
             indices.put(value, index);
-            if (pp == pool.length) doublePool();
+            pool = ArrayUtils.ensureCapacity(pool, pp);
             pool[pp++] = value;
             if (value instanceof Long || value instanceof Double) {
-                if (pp == pool.length) doublePool();
+                pool = ArrayUtils.ensureCapacity(pool, pp);
                 pool[pp++] = null;
             }
         }
@@ -167,4 +166,86 @@
                 v.type.hashCode();
         }
     }
+
+    public static class MethodHandle {
+
+        /** Reference kind - see ClassFile */
+        int refKind;
+
+        /** Reference symbol */
+        Symbol refSym;
+
+        public MethodHandle(int refKind, Symbol refSym) {
+            this.refKind = refKind;
+            this.refSym = refSym;
+            checkConsistent();
+        }
+        public boolean equals(Object other) {
+            if (!(other instanceof MethodHandle)) return false;
+            MethodHandle mr = (MethodHandle) other;
+            if (mr.refKind != refKind)  return false;
+            Symbol o = mr.refSym;
+            return
+                o.name == refSym.name &&
+                o.owner == refSym.owner &&
+                o.type.equals(refSym.type);
+        }
+        public int hashCode() {
+            return
+                refKind * 65 +
+                refSym.name.hashCode() * 33 +
+                refSym.owner.hashCode() * 9 +
+                refSym.type.hashCode();
+        }
+
+        /**
+         * Check consistency of reference kind and symbol (see JVMS 4.4.8)
+         */
+        @SuppressWarnings("fallthrough")
+        private void checkConsistent() {
+            boolean staticOk = false;
+            int expectedKind = -1;
+            Filter<Name> nameFilter = nonInitFilter;
+            boolean interfaceOwner = false;
+            switch (refKind) {
+                case ClassFile.REF_getStatic:
+                case ClassFile.REF_putStatic:
+                    staticOk = true;
+                case ClassFile.REF_getField:
+                case ClassFile.REF_putField:
+                    expectedKind = Kinds.VAR;
+                    break;
+                case ClassFile.REF_newInvokeSpecial:
+                    nameFilter = initFilter;
+                    expectedKind = Kinds.MTH;
+                    break;
+                case ClassFile.REF_invokeInterface:
+                    interfaceOwner = true;
+                    expectedKind = Kinds.MTH;
+                    break;
+                case ClassFile.REF_invokeStatic:
+                    staticOk = true;
+                case ClassFile.REF_invokeVirtual:
+                case ClassFile.REF_invokeSpecial:
+                    expectedKind = Kinds.MTH;
+                    break;
+            }
+            Assert.check(!refSym.isStatic() || staticOk);
+            Assert.check(refSym.kind == expectedKind);
+            Assert.check(nameFilter.accepts(refSym.name));
+            Assert.check(!refSym.owner.isInterface() || interfaceOwner);
+        }
+        //where
+                Filter<Name> nonInitFilter = new Filter<Name>() {
+                    public boolean accepts(Name n) {
+                        return n != n.table.names.init && n != n.table.names.clinit;
+                    }
+                };
+
+                Filter<Name> initFilter = new Filter<Name>() {
+                    public boolean accepts(Name n) {
+                        return n == n.table.names.init;
+                    }
+                };
+    }
 }
--- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Wed Jul 05 18:26:11 2017 +0200
@@ -406,10 +406,17 @@
             ? names.fromString(options.get("failcomplete"))
             : null;
 
-        shouldStopPolicy =
-            options.isSet("shouldStopPolicy")
+        shouldStopPolicyIfError =
+            options.isSet("shouldStopPolicy") // backwards compatible
             ? CompileState.valueOf(options.get("shouldStopPolicy"))
-            : null;
+            : options.isSet("shouldStopPolicyIfError")
+            ? CompileState.valueOf(options.get("shouldStopPolicyIfError"))
+            : CompileState.INIT;
+        shouldStopPolicyIfNoError =
+            options.isSet("shouldStopPolicyIfNoError")
+            ? CompileState.valueOf(options.get("shouldStopPolicyIfNoError"))
+            : CompileState.GENERATE;
+
         if (options.isUnset("oldDiags"))
             log.setDiagnosticFormatter(RichDiagnosticFormatter.instance(context));
     }
@@ -486,12 +493,20 @@
     public boolean verboseCompilePolicy;
 
     /**
-     * Policy of how far to continue processing. null means until first
-     * error.
+     * Policy of how far to continue compilation after errors have occurred.
+     * Set this to minimum CompileState (INIT) to stop as soon as possible
+     * after errors.
      */
-    public CompileState shouldStopPolicy;
+    public CompileState shouldStopPolicyIfError;
 
-    /** A queue of all as yet unattributed classes.
+    /**
+     * Policy of how far to continue compilation when no errors have occurred.
+     * Set this to maximum CompileState (GENERATE) to perform full compilation.
+     * Set this lower to perform partial compilation, such as -proc:only.
+     */
+    public CompileState shouldStopPolicyIfNoError;
+
+    /** A queue of all as yet unattributed classes.oLo
      */
     public Todo todo;
 
@@ -501,6 +516,7 @@
 
     /** Ordered list of compiler phases for each compilation unit. */
     public enum CompileState {
+        INIT(0),
         PARSE(1),
         ENTER(2),
         PROCESS(3),
@@ -512,8 +528,11 @@
         CompileState(int value) {
             this.value = value;
         }
-        boolean isDone(CompileState other) {
-            return value >= other.value;
+        boolean isAfter(CompileState other) {
+            return value > other.value;
+        }
+        public static CompileState max(CompileState a, CompileState b) {
+            return a.value > b.value ? a : b;
         }
         private int value;
     };
@@ -524,7 +543,7 @@
         private static final long serialVersionUID = 1812267524140424433L;
         boolean isDone(Env<AttrContext> env, CompileState cs) {
             CompileState ecs = get(env);
-            return ecs != null && ecs.isDone(cs);
+            return (ecs != null) && !cs.isAfter(ecs);
         }
     }
     private CompileStates compileStates = new CompileStates();
@@ -536,10 +555,10 @@
     protected Set<JavaFileObject> inputFiles = new HashSet<JavaFileObject>();
 
     protected boolean shouldStop(CompileState cs) {
-        if (shouldStopPolicy == null)
-            return (errorCount() > 0 || unrecoverableError());
-        else
-            return cs.ordinal() > shouldStopPolicy.ordinal();
+        CompileState shouldStopPolicy = (errorCount() > 0 || unrecoverableError())
+            ? shouldStopPolicyIfError
+            : shouldStopPolicyIfNoError;
+        return cs.isAfter(shouldStopPolicy);
     }
 
     /** The number of errors reported so far.
@@ -924,6 +943,18 @@
     }
 
     /**
+     * Enter the symbols found in a list of parse trees if the compilation
+     * is expected to proceed beyond anno processing into attr.
+     * As a side-effect, this puts elements on the "todo" list.
+     * Also stores a list of all top level classes in rootClasses.
+     */
+    public List<JCCompilationUnit> enterTreesIfNeeded(List<JCCompilationUnit> roots) {
+       if (shouldStop(CompileState.ATTR))
+           return List.nil();
+        return enterTrees(roots);
+    }
+
+    /**
      * Enter the symbols found in a list of parse trees.
      * As a side-effect, this puts elements on the "todo" list.
      * Also stores a list of all top level classes in rootClasses.
@@ -1010,7 +1041,7 @@
                 genEndPos = true;
                 if (!taskListener.isEmpty())
                     taskListener.started(new TaskEvent(TaskEvent.Kind.ANNOTATION_PROCESSING));
-                log.deferDiagnostics = true;
+                log.deferAll();
             } else { // free resources
                 procEnvImpl.close();
             }
@@ -1120,7 +1151,7 @@
                 if (c != this)
                     annotationProcessingOccurred = c.annotationProcessingOccurred = true;
                 // doProcessing will have handled deferred diagnostics
-                Assert.check(c.log.deferDiagnostics == false
+                Assert.check(c.log.deferredDiagFilter == null
                         && c.log.deferredDiagnostics.size() == 0);
                 return c;
             } finally {
@@ -1196,7 +1227,7 @@
             if (errorCount() > 0 && !shouldStop(CompileState.ATTR)) {
                 //if in fail-over mode, ensure that AST expression nodes
                 //are correctly initialized (e.g. they have a type/symbol)
-                attr.postAttr(env);
+                attr.postAttr(env.tree);
             }
             compileStates.put(env, CompileState.ATTR);
         }
@@ -1648,6 +1679,8 @@
         hasBeenUsed = true;
         closeables = prev.closeables;
         prev.closeables = List.nil();
+        shouldStopPolicyIfError = prev.shouldStopPolicyIfError;
+        shouldStopPolicyIfNoError = prev.shouldStopPolicyIfNoError;
     }
 
     public static void enableLogging() {
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -638,10 +638,6 @@
                         lexError(pos, "unclosed.str.lit");
                     }
                     break loop;
-                case '#':
-                    reader.scanChar();
-                    tk = TokenKind.HASH;
-                    break loop;
                 default:
                     if (isSpecial(reader.ch)) {
                         scanOperator();
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Wed Jul 05 18:26:11 2017 +0200
@@ -950,12 +950,13 @@
             break;
         case LPAREN:
             if (typeArgs == null && (mode & EXPR) != 0) {
-                if (peekToken(FINAL) ||
+                if (peekToken(MONKEYS_AT) ||
+                        peekToken(FINAL) ||
                         peekToken(RPAREN) ||
                         peekToken(IDENTIFIER, COMMA) ||
                         peekToken(IDENTIFIER, RPAREN, ARROW)) {
                     //implicit n-ary lambda
-                    t = lambdaExpressionOrStatement(true, peekToken(FINAL), pos);
+                    t = lambdaExpressionOrStatement(true, peekToken(MONKEYS_AT) || peekToken(FINAL), pos);
                     break;
                 } else {
                     nextToken();
@@ -1159,7 +1160,7 @@
                     case LT:
                         if ((mode & TYPE) == 0 && isUnboundMemberRef()) {
                             //this is an unbound method reference whose qualifier
-                            //is a generic type i.e. A<S>#m
+                            //is a generic type i.e. A<S>::m
                             int pos1 = token.pos;
                             accept(LT);
                             ListBuffer<JCExpression> args = new ListBuffer<JCExpression>();
@@ -1177,7 +1178,8 @@
                                 t = toP(F.at(token.pos).Select(t, ident()));
                                 t = typeArgumentsOpt(t);
                             }
-                            if (token.kind != HASH) {
+                            t = bracketsOpt(t);
+                            if (token.kind != COLCOL) {
                                 //method reference expected here
                                 t = illegal();
                             }
@@ -1237,6 +1239,10 @@
                         nextToken();
                         t = bracketsOpt(t);
                         t = toP(F.at(pos1).TypeArray(t));
+                        if (token.kind == COLCOL) {
+                            mode = EXPR;
+                            continue;
+                        }
                         return t;
                     }
                     mode = oldmode;
@@ -1269,10 +1275,10 @@
                     t = argumentsOpt(typeArgs, typeArgumentsOpt(t));
                     typeArgs = null;
                 }
-            } else if ((mode & EXPR) != 0 && token.kind == HASH) {
+            } else if ((mode & EXPR) != 0 && token.kind == COLCOL) {
                 mode = EXPR;
                 if (typeArgs != null) return illegal();
-                accept(HASH);
+                accept(COLCOL);
                 t = memberReferenceSuffix(pos1, t);
             } else {
                 break;
@@ -1311,9 +1317,11 @@
                 case GT:
                     depth--;
                     if (depth == 0) {
+                        TokenKind nextKind = S.token(pos + 1).kind;
                         return
-                            S.token(pos + 1).kind == TokenKind.DOT ||
-                            S.token(pos + 1).kind == TokenKind.HASH;
+                            nextKind == TokenKind.DOT ||
+                            nextKind == TokenKind.LBRACKET ||
+                            nextKind == TokenKind.COLCOL;
                     }
                     break;
                 default:
@@ -1343,11 +1351,6 @@
     }
 
     JCExpression lambdaExpressionOrStatementRest(List<JCVariableDecl> args, int pos) {
-        if (token.kind != ARROW) {
-            //better error recovery
-            return F.at(pos).Erroneous(args);
-        }
-
         checkLambda();
         accept(ARROW);
 
@@ -1372,7 +1375,7 @@
         nextToken();
         if (token.kind == LPAREN || typeArgs != null) {
             t = arguments(typeArgs, t);
-        } else if (token.kind == HASH) {
+        } else if (token.kind == COLCOL) {
             if (typeArgs != null) return illegal();
             t = memberReferenceSuffix(t);
         } else {
@@ -1583,20 +1586,22 @@
                 t = toP(F.at(pos).Select(t, names._class));
             }
         } else if ((mode & TYPE) != 0) {
-            mode = TYPE;
-        } else {
+            if (token.kind != COLCOL) {
+                mode = TYPE;
+            }
+        } else if (token.kind != COLCOL) {
             syntaxError(token.pos, "dot.class.expected");
         }
         return t;
     }
 
     /**
-     * MemberReferenceSuffix = "#" [TypeArguments] Ident
-     *                       | "#" [TypeArguments] "new"
+     * MemberReferenceSuffix = "::" [TypeArguments] Ident
+     *                       | "::" [TypeArguments] "new"
      */
     JCExpression memberReferenceSuffix(JCExpression t) {
         int pos1 = token.pos;
-        accept(HASH);
+        accept(COLCOL);
         return memberReferenceSuffix(pos1, t);
     }
 
@@ -2165,27 +2170,10 @@
         while (true) {
             int pos = token.pos;
             switch (token.kind) {
-            case CASE: {
-                nextToken();
-                JCExpression pat = parseExpression();
-                accept(COLON);
-                List<JCStatement> stats = blockStatements();
-                JCCase c = F.at(pos).Case(pat, stats);
-                if (stats.isEmpty())
-                    storeEnd(c, S.prevToken().endPos);
-                cases.append(c);
+            case CASE:
+            case DEFAULT:
+                cases.append(switchBlockStatementGroup());
                 break;
-            }
-            case DEFAULT: {
-                nextToken();
-                accept(COLON);
-                List<JCStatement> stats = blockStatements();
-                JCCase c = F.at(pos).Case(null, stats);
-                if (stats.isEmpty())
-                    storeEnd(c, S.prevToken().endPos);
-                cases.append(c);
-                break;
-            }
             case RBRACE: case EOF:
                 return cases.toList();
             default:
@@ -2196,6 +2184,32 @@
         }
     }
 
+    protected JCCase switchBlockStatementGroup() {
+        int pos = token.pos;
+        List<JCStatement> stats;
+        JCCase c;
+        switch (token.kind) {
+        case CASE:
+            nextToken();
+            JCExpression pat = parseExpression();
+            accept(COLON);
+            stats = blockStatements();
+            c = F.at(pos).Case(pat, stats);
+            if (stats.isEmpty())
+                storeEnd(c, S.prevToken().endPos);
+            return c;
+        case DEFAULT:
+            nextToken();
+            accept(COLON);
+            stats = blockStatements();
+            c = F.at(pos).Case(null, stats);
+            if (stats.isEmpty())
+                storeEnd(c, S.prevToken().endPos);
+            return c;
+        }
+        throw new AssertionError("should not reach here");
+    }
+
     /** MoreStatementExpressions = { COMMA StatementExpression }
      */
     <T extends ListBuffer<? super JCExpressionStatement>> T moreStatementExpressions(int pos,
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/Tokens.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/Tokens.java	Wed Jul 05 18:26:11 2017 +0200
@@ -177,7 +177,7 @@
         FALSE("false", Tag.NAMED),
         NULL("null", Tag.NAMED),
         ARROW("->"),
-        HASH("#"),
+        COLCOL("::"),
         LPAREN("("),
         RPAREN(")"),
         LBRACE("{"),
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -25,13 +25,15 @@
 
 package com.sun.tools.javac.parser;
 
+import java.nio.CharBuffer;
+import java.util.Arrays;
+
 import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.util.ArrayUtils;
 import com.sun.tools.javac.util.Log;
 import com.sun.tools.javac.util.Name;
 import com.sun.tools.javac.util.Names;
 
-import java.nio.CharBuffer;
-
 import static com.sun.tools.javac.util.LayoutCharacters.*;
 
 /** The char reader used by the javac lexer/tokenizer. Returns the sequence of
@@ -91,9 +93,7 @@
             if (input.length > 0 && Character.isWhitespace(input[input.length - 1])) {
                 inputLength--;
             } else {
-                char[] newInput = new char[inputLength + 1];
-                System.arraycopy(input, 0, newInput, 0, input.length);
-                input = newInput;
+                input = Arrays.copyOf(input, inputLength + 1);
             }
         }
         buf = input;
@@ -130,11 +130,7 @@
     /** Append a character to sbuf.
      */
     protected void putChar(char ch, boolean scan) {
-        if (sp == sbuf.length) {
-            char[] newsbuf = new char[sbuf.length * 2];
-            System.arraycopy(sbuf, 0, newsbuf, 0, sbuf.length);
-            sbuf = newsbuf;
-        }
+        sbuf = ArrayUtils.ensureCapacity(sbuf, sp);
         sbuf[sp++] = ch;
         if (scan)
             scanChar();
--- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -49,7 +49,7 @@
 
 import com.sun.source.util.JavacTask;
 import com.sun.source.util.TaskEvent;
-import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.api.BasicJavacTask;
 import com.sun.tools.javac.api.JavacTrees;
 import com.sun.tools.javac.api.MultiTaskListener;
 import com.sun.tools.javac.code.*;
@@ -97,11 +97,9 @@
     private final boolean printRounds;
     private final boolean verbose;
     private final boolean lint;
-    private final boolean procOnly;
     private final boolean fatalErrors;
     private final boolean werror;
     private final boolean showResolveErrors;
-    private boolean foundTypeProcessors;
 
     private final JavacFiler filer;
     private final JavacMessager messager;
@@ -167,12 +165,14 @@
         printRounds = options.isSet(XPRINTROUNDS);
         verbose = options.isSet(VERBOSE);
         lint = Lint.instance(context).isEnabled(PROCESSING);
-        procOnly = options.isSet(PROC, "only") || options.isSet(XPRINT);
+        if (options.isSet(PROC, "only") || options.isSet(XPRINT)) {
+            JavaCompiler compiler = JavaCompiler.instance(context);
+            compiler.shouldStopPolicyIfNoError = CompileState.PROCESS;
+        }
         fatalErrors = options.isSet("fatalEnterError");
         showResolveErrors = options.isSet("showResolveErrors");
         werror = options.isSet(WERROR);
         platformAnnotations = initPlatformAnnotations();
-        foundTypeProcessors = false;
 
         // Initialize services before any processors are initialized
         // in case processors use them.
@@ -462,7 +462,7 @@
      * State about how a processor has been used by the tool.  If a
      * processor has been used on a prior round, its process method is
      * called on all subsequent rounds, perhaps with an empty set of
-     * annotations to process.  The {@code annotatedSupported} method
+     * annotations to process.  The {@code annotationSupported} method
      * caches the supported annotation information from the first (and
      * only) getSupportedAnnotationTypes call to the processor.
      */
@@ -806,7 +806,7 @@
             log = Log.instance(context);
             log.nerrors = priorErrors;
             log.nwarnings += priorWarnings;
-            log.deferDiagnostics = true;
+            log.deferAll();
 
             // the following is for the benefit of JavacProcessingEnvironment.getContext()
             JavacProcessingEnvironment.this.context = context;
@@ -882,7 +882,9 @@
         /** Create the compiler to be used for the final compilation. */
         JavaCompiler finalCompiler(boolean errorStatus) {
             try {
-                JavaCompiler c = JavaCompiler.instance(nextContext());
+                Context nextCtx = nextContext();
+                JavacProcessingEnvironment.this.context = nextCtx;
+                JavaCompiler c = JavaCompiler.instance(nextCtx);
                 c.log.nwarnings += compiler.log.nwarnings;
                 if (errorStatus) {
                     c.log.nerrors += compiler.log.nerrors;
@@ -1021,7 +1023,7 @@
         }
 
         /** Get the context for the next round of processing.
-         * Important values are propogated from round to round;
+         * Important values are propagated from round to round;
          * other values are implicitly reset.
          */
         private Context nextContext() {
@@ -1086,10 +1088,11 @@
             elementUtils.setContext(next);
             typeUtils.setContext(next);
 
-            JavacTaskImpl task = (JavacTaskImpl) context.get(JavacTask.class);
+            JavacTask task = context.get(JavacTask.class);
             if (task != null) {
                 next.put(JavacTask.class, task);
-                task.updateContext(next);
+                if (task instanceof BasicJavacTask)
+                    ((BasicJavacTask) task).updateContext(next);
             }
 
             JavacTrees trees = context.get(JavacTrees.class);
@@ -1189,14 +1192,7 @@
             return compiler;
         }
 
-        if (procOnly && !foundTypeProcessors) {
-            compiler.todo.clear();
-        } else {
-            if (procOnly && foundTypeProcessors)
-                compiler.shouldStopPolicy = CompileState.FLOW;
-
-            compiler.enterTrees(roots);
-        }
+        compiler.enterTreesIfNeeded(roots);
 
         return compiler;
     }
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties	Wed Jul 05 18:26:11 2017 +0200
@@ -148,13 +148,8 @@
 compiler.err.call.must.be.first.stmt.in.ctor=\
     call to {0} must be first statement in constructor
 
+# 0: symbol kind, 1: name, 2: list of type or message segment, 3: list of type or message segment, 4: symbol kind, 5: type, 6: message segment
 compiler.err.cant.apply.symbol=\
-    {0} {1} in {4} {5} cannot be applied to given types\n\
-    required: {2}\n\
-    found: {3}
-
-# 0: symbol kind, 1: name, 2: list of type or message segment, 3: list of type or message segment, 4: symbol kind, 5: type, 6: message segment
-compiler.err.cant.apply.symbol.1=\
     {0} {1} in {4} {5} cannot be applied to given types;\n\
     required: {2}\n\
     found: {3}\n\
@@ -164,6 +159,74 @@
 compiler.err.cant.apply.symbols=\
     no suitable {0} found for {1}({2})
 
+# 0: symbol kind, 1: name, 2: list of type or message segment, 3: list of type or message segment, 4: symbol kind, 5: type, 6: message segment
+compiler.misc.cant.apply.symbol=\
+    {0} {1} in {4} {5} cannot be applied to given types\n\
+    required: {2}\n\
+    found: {3}\n\
+    reason: {6}
+
+# 0: symbol kind, 1: name, 2: list of type
+compiler.misc.cant.apply.symbols=\
+    no suitable {0} found for {1}({2})
+
+
+# 0: type
+compiler.err.cant.access.arg.type.in.functional.desc=\
+    cannot access parameter type {0} in target functional descriptor
+
+# 0: type
+compiler.err.cant.access.return.in.functional.desc=\
+    cannot access return type {0} in target functional descriptor
+
+# 0: type
+compiler.err.cant.access.thrown.in.functional.desc=\
+    cannot access thrown type {0} in target functional descriptor
+
+# 0: symbol kind, 1: symbol
+compiler.misc.no.abstracts=\
+    no abstract method found in {0} {1}
+
+# 0: symbol kind, 1: symbol
+compiler.misc.incompatible.abstracts=\
+    multiple non-overriding abstract methods found in {0} {1}
+
+compiler.misc.not.a.functional.intf=\
+    the target type must be a functional interface
+
+# 0: message segment
+compiler.misc.not.a.functional.intf.1=\
+    the target type must be a functional interface\n\
+    {0}
+
+# 0: symbol, 1: symbol kind, 2: symbol
+compiler.misc.invalid.generic.desc.in.functional.intf=\
+    invalid functional descriptor: method {0} in {1} {2} is generic
+
+# 0: symbol kind, 1: symbol
+compiler.misc.incompatible.descs.in.functional.intf=\
+    incompatible function descriptors found in {0} {1}
+
+# 0: name, 1: list of type, 2: type, 3: list of type
+compiler.misc.descriptor=\
+    descriptor: {2} {0}({1})
+
+# 0: name, 1: list of type, 2: type, 3: list of type
+compiler.misc.descriptor.throws=\
+    descriptor: {2} {0}({1}) throws {3}
+
+# 0: type
+compiler.misc.no.suitable.functional.intf.inst=\
+    cannot infer functional interface descriptor for {0}
+
+# 0: symbol kind, 1: message segment
+compiler.err.invalid.mref=\
+    invalid {0} reference; {1}
+
+# 0: symbol kind, 1: message segment
+compiler.misc.invalid.mref=\
+    invalid {0} reference; {1}
+
 # 0: symbol
 compiler.err.cant.assign.val.to.final.var=\
     cannot assign a value to final variable {0}
@@ -173,6 +236,9 @@
     local variables referenced from {1} must be final or effectively final
 
 
+compiler.misc.lambda=\
+    a lambda expression
+
 compiler.misc.inner.cls=\
     an inner class
 
@@ -292,7 +358,7 @@
 
 # 0: type, 1: symbol
 compiler.err.invalid.containedby.annotation.elem.nondefault=\
-    duplicate annotation, element {1} in containing annotation {0} does not have a default value
+    containing annotation {0} does not have a default value for element {1}
 
 # 0: symbol, 1: type, 2: symbol, 3: type
 compiler.err.invalid.containedby.annotation.retention=\
@@ -592,6 +658,9 @@
 compiler.err.missing.ret.stmt=\
     missing return statement
 
+compiler.misc.missing.ret.val=\
+    missing return value
+
 compiler.err.missing.ret.val=\
     missing return value
 
@@ -635,6 +704,31 @@
     second operand: {0}\n\
     third operand : {1}
 
+# 0: message segment
+compiler.misc.incompatible.type.in.conditional=\
+    bad type in conditional expression; {0}
+
+# 0: type
+compiler.misc.incompatible.ret.type.in.lambda=\
+    bad return type in lambda expression\n\
+    {0}
+
+# 0: type
+compiler.misc.incompatible.ret.type.in.mref=\
+    bad return type in method reference\n\
+    {0}
+
+# 0: list of type
+compiler.err.incompatible.thrown.types.in.lambda=\
+    incompatible thrown types {0} in lambda expression
+
+# 0: list of type
+compiler.err.incompatible.thrown.types.in.mref=\
+    incompatible thrown types {0} in method reference
+
+compiler.misc.incompatible.arg.types.in.lambda=\
+    incompatible parameter types in lambda expression
+
 compiler.err.new.not.allowed.in.annotation=\
     ''new'' not allowed in an annotation
 
@@ -658,6 +752,15 @@
     {0} in {1} is defined in an inaccessible class or interface
 
 # 0: symbol, 1: symbol
+compiler.misc.not.def.access.class.intf.cant.access=\
+    {0} in {1} is defined in an inaccessible class or interface
+
+# 0: symbol, 1: list of type, 2: type
+compiler.misc.cant.access.inner.cls.constr=\
+    cannot access constructor {0}({1})\n\
+    an enclosing instance of type {2} is not in scope
+
+# 0: symbol, 1: symbol
 compiler.err.not.def.public.cant.access=\
     {0} is not public in {1}; cannot be accessed from outside package
 
@@ -755,7 +858,13 @@
 
 # 0: name, 1: symbol kind, 2: symbol, 3: symbol, 4: symbol kind, 5: symbol, 6: symbol
 compiler.err.ref.ambiguous=\
-    reference to {0} is ambiguous, both {1} {2} in {3} and {4} {5} in {6} match
+    reference to {0} is ambiguous\n\
+    both {1} {2} in {3} and {4} {5} in {6} match
+
+# 0: name, 1: symbol kind, 2: symbol, 3: symbol, 4: symbol kind, 5: symbol, 6: symbol
+compiler.misc.ref.ambiguous=\
+    reference to {0} is ambiguous\n\
+    both {1} {2} in {3} and {4} {5} in {6} match
 
 compiler.err.repeated.annotation.target=\
     repeated annotation target
@@ -991,6 +1100,10 @@
 
 ## The following string will appear before all messages keyed as:
 ## "compiler.note".
+
+compiler.note.potential.lambda.found=\
+    This anonymous inner class creation can be turned into a lambda expression.
+
 compiler.note.note=\
     Note:\u0020
 
@@ -1652,6 +1765,18 @@
 compiler.misc.incompatible.upper.bounds=\
     inference variable {0} has incompatible upper bounds {1}
 
+# 0: type, 1: list of type, 2: list of type
+compiler.misc.incompatible.eq.upper.bounds=\
+    inference variable {0} has incompatible bounds\n\
+    equality constraints: {1}\n\
+    upper bounds: {2}
+
+# 0: type, 1: list of type, 2: list of type
+compiler.misc.incompatible.eq.lower.bounds=\
+    inference variable {0} has incompatible bounds\n\
+    equality constraints: {1}\n\
+    lower bounds: {2}
+
 # 0: list of type, 1: type, 2: type
 compiler.misc.infer.no.conforming.instance.exists=\
     no instance(s) of type variable(s) {0} exist so that {1} conforms to {2}
@@ -1689,6 +1814,10 @@
     inferred: {0}\n\
     equality constraints(s): {1}
 
+# 0: list of type
+compiler.misc.cyclic.inference=\
+    Cannot instantiate inference variables {0} because of an inference loop
+
 # 0: symbol
 compiler.misc.diamond=\
     {0}<>
@@ -1728,6 +1857,10 @@
 compiler.err.non-static.cant.be.ref=\
     non-static {0} {1} cannot be referenced from a static context
 
+# 0: symbol kind, 1: symbol
+compiler.misc.non-static.cant.be.ref=\
+    non-static {0} {1} cannot be referenced from a static context
+
 ## Both arguments ({0}, {1}) are "kindname"s.  {0} is a comma-separated list
 ## of kindnames (the list should be identical to that provided in source.
 compiler.err.unexpected.type=\
@@ -1735,6 +1868,12 @@
     required: {0}\n\
     found:    {1}
 
+compiler.err.unexpected.lambda=\
+   lambda expression not expected here
+
+compiler.err.unexpected.mref=\
+   method reference not expected here
+
 ## The first argument {0} is a "kindname" (e.g. 'constructor', 'field', etc.)
 ## The second argument {1} is the non-resolved symbol
 ## The third argument {2} is a list of type parameters (non-empty if {1} is a method)
@@ -1774,6 +1913,20 @@
     symbol:   {0} <{2}>{1}({3})\n\
     location: {4}
 
+### Following are replicated/used for method reference diagnostics
+
+# 0: symbol kind, 1: name, 2: unused, 3: list of type, 4: message segment
+compiler.misc.cant.resolve.location.args=\
+    cannot find symbol\n\
+    symbol:   {0} {1}({3})\n\
+    location: {4}
+
+# 0: symbol kind, 1: name, 2: list of type, 3: list, 4: message segment
+compiler.misc.cant.resolve.location.args.params=\
+    cannot find symbol\n\
+    symbol:   {0} <{2}>{1}({3})\n\
+    location: {4}
+
 ##a location subdiagnostic is composed as follows:
 ## The first argument {0} is the location "kindname" (e.g. 'constructor', 'field', etc.)
 ## The second argument {1} is the location name
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1810,11 +1810,46 @@
      */
     public static class JCMemberReference extends JCExpression implements MemberReferenceTree {
         public ReferenceMode mode;
+        public ReferenceKind kind;
         public Name name;
         public JCExpression expr;
         public List<JCExpression> typeargs;
         public Type targetType;
         public Symbol sym;
+        public Type varargsElement;
+
+        /**
+         * Javac-dependent classification for member references, based
+         * on relevant properties w.r.t. code-generation
+         */
+        public enum ReferenceKind {
+            /** super # instMethod */
+            SUPER(ReferenceMode.INVOKE, false),
+            /** Type # instMethod */
+            UNBOUND(ReferenceMode.INVOKE, true),
+            /** Type # staticMethod */
+            STATIC(ReferenceMode.INVOKE, false),
+            /** Expr # instMethod */
+            BOUND(ReferenceMode.INVOKE, false),
+            /** Expr # staticMethod */
+            STATIC_EVAL(ReferenceMode.INVOKE, false),
+            /** Inner # new */
+            IMPLICIT_INNER(ReferenceMode.NEW, false),
+            /** Toplevel # new */
+            TOPLEVEL(ReferenceMode.NEW, false);
+
+            ReferenceMode mode;
+            boolean unbound;
+
+            private ReferenceKind(ReferenceMode mode, boolean unbound) {
+                this.mode = mode;
+                this.unbound = unbound;
+            }
+
+            public boolean isUnbound() {
+                return unbound;
+            }
+        }
 
         protected JCMemberReference(ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {
             this.mode = mode;
@@ -1843,6 +1878,9 @@
         public Tag getTag() {
             return REFERENCE;
         }
+        public boolean hasKind(ReferenceKind kind) {
+            return this.kind == kind;
+        }
     }
 
     /**
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java	Wed Jul 05 18:26:11 2017 +0200
@@ -81,6 +81,17 @@
      */
     DocCommentTable docComments = null;
 
+    /**
+     * A string sequence to be used when Pretty output should be constrained
+     * to fit into a given size
+     */
+    private final static String trimSequence = "[...]";
+
+    /**
+     * Max number of chars to be generated when output should fit into a single line
+     */
+    private final static int PREFERRED_LENGTH = 20;
+
     /** Align code to be indented to left margin.
      */
     void align() throws IOException {
@@ -129,6 +140,31 @@
         out.write(lineSep);
     }
 
+    public static String toSimpleString(JCTree tree) {
+        return toSimpleString(tree, PREFERRED_LENGTH);
+    }
+
+    public static String toSimpleString(JCTree tree, int maxLength) {
+        StringWriter s = new StringWriter();
+        try {
+            new Pretty(s, false).printExpr(tree);
+        }
+        catch (IOException e) {
+            // should never happen, because StringWriter is defined
+            // never to throw any IOExceptions
+            throw new AssertionError(e);
+        }
+        //we need to (i) replace all line terminators with a space and (ii) remove
+        //occurrences of 'missing' in the Pretty output (generated when types are missing)
+        String res = s.toString().replaceAll("\\s+", " ").replaceAll("/\\*missing\\*/", "");
+        if (res.length() < maxLength) {
+            return res;
+        } else {
+            int split = (maxLength - trimSequence.length()) * 2 / 3;
+            return res.substring(0, split) + trimSequence + res.substring(split);
+        }
+    }
+
     String lineSep = System.getProperty("line.separator");
 
     /**************************************************************************
@@ -911,7 +947,16 @@
     public void visitLambda(JCLambda tree) {
         try {
             print("(");
-            printExprs(tree.params);
+            if (TreeInfo.isExplicitLambda(tree)) {
+                printExprs(tree.params);
+            } else {
+                String sep = "";
+                for (JCVariableDecl param : tree.params) {
+                    print(sep);
+                    print(param.name);
+                    sep = ",";
+                }
+            }
             print(")->");
             printExpr(tree.body);
         } catch (IOException e) {
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java	Wed Jul 05 18:26:11 2017 +0200
@@ -245,6 +245,27 @@
         }
     }
 
+    /** Return true if a a tree corresponds to a poly expression. */
+    public static boolean isPoly(JCTree tree, JCTree origin) {
+        switch (tree.getTag()) {
+            case APPLY:
+            case NEWCLASS:
+            case CONDEXPR:
+                return !origin.hasTag(TYPECAST);
+            case LAMBDA:
+            case REFERENCE:
+                return true;
+            case PARENS:
+                return isPoly(((JCParens)tree).expr, origin);
+            default:
+                return false;
+        }
+    }
+
+    public static boolean isExplicitLambda(JCLambda lambda) {
+        return lambda.params.isEmpty() ||
+                lambda.params.head.vartype != null;
+    }
     /**
      * Return true if the AST corresponds to a static select of the kind A.B
      */
@@ -261,6 +282,7 @@
                 return isStaticSym(base) &&
                     isStaticSelector(((JCFieldAccess)base).selected, names);
             case TYPEAPPLY:
+            case TYPEARRAY:
                 return true;
             default:
                 return false;
@@ -383,6 +405,10 @@
                 JCVariableDecl node = (JCVariableDecl)tree;
                 if (node.mods.pos != Position.NOPOS) {
                     return node.mods.pos;
+                } else if (node.vartype == null) {
+                    //if there's no type (partially typed lambda parameter)
+                    //simply return node position
+                    return node.pos;
                 } else {
                     return getStartPos(node.vartype);
                 }
--- a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -43,8 +43,10 @@
 import com.sun.tools.javac.code.Symbol;
 import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.code.Type.CapturedType;
+import com.sun.tools.javac.tree.JCTree.*;
 
 import com.sun.tools.javac.file.BaseFileObject;
+import com.sun.tools.javac.tree.Pretty;
 import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*;
 
 /**
@@ -180,6 +182,9 @@
             }
             return s;
         }
+        else if (arg instanceof JCExpression) {
+            return expr2String((JCExpression)arg);
+        }
         else if (arg instanceof Iterable<?>) {
             return formatIterable(d, (Iterable<?>)arg, l);
         }
@@ -199,6 +204,20 @@
             return String.valueOf(arg);
         }
     }
+    //where
+            private String expr2String(JCExpression tree) {
+                switch(tree.getTag()) {
+                    case PARENS:
+                        return expr2String(((JCParens)tree).expr);
+                    case LAMBDA:
+                    case REFERENCE:
+                    case CONDEXPR:
+                        return Pretty.toSimpleString(tree);
+                    default:
+                        Assert.error("unexpected tree kind " + tree.getKind());
+                        return null;
+                }
+            }
 
     /**
      * Format an iterable argument of a given diagnostic.
@@ -490,6 +509,7 @@
      * lead to infinite loops.
      */
     protected Printer printer = new Printer() {
+
         @Override
         protected String localize(Locale locale, String key, Object... args) {
             return AbstractDiagnosticFormatter.this.localize(locale, key, args);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/ArrayUtils.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 1999, 2012, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package com.sun.tools.javac.util;
+
+import java.lang.reflect.Array;
+
+/** <p><b>This is NOT part of any supported API.
+ *  If you write code that depends on this, you do so at your own risk.
+ *  This code and its internal interfaces are subject to change or
+ *  deletion without notice.</b>
+ */
+public class ArrayUtils {
+
+    private static int calculateNewLength(int currentLength, int maxIndex) {
+        while (currentLength < maxIndex + 1)
+            currentLength = currentLength * 2;
+        return currentLength;
+    }
+
+    public static <T> T[] ensureCapacity(T[] array, int maxIndex) {
+        if (maxIndex < array.length) {
+            return array;
+        } else {
+            int newLength = calculateNewLength(array.length, maxIndex);
+            @SuppressWarnings("unchecked")
+            T[] result = (T[]) Array.newInstance(array.getClass().getComponentType(), newLength);
+            System.arraycopy(array, 0, result, 0, array.length);
+            return result;
+        }
+    }
+
+    public static byte[] ensureCapacity(byte[] array, int maxIndex) {
+        if (maxIndex < array.length) {
+            return array;
+        } else {
+            int newLength = calculateNewLength(array.length, maxIndex);
+            byte[] result = new byte[newLength];
+            System.arraycopy(array, 0, result, 0, array.length);
+            return result;
+        }
+    }
+
+    public static char[] ensureCapacity(char[] array, int maxIndex) {
+        if (maxIndex < array.length) {
+            return array;
+        } else {
+            int newLength = calculateNewLength(array.length, maxIndex);
+            char[] result = new char[newLength];
+            System.arraycopy(array, 0, result, 0, array.length);
+            return result;
+        }
+    }
+
+    public static int[] ensureCapacity(int[] array, int maxIndex) {
+        if (maxIndex < array.length) {
+            return array;
+        } else {
+            int newLength = calculateNewLength(array.length, maxIndex);
+            int[] result = new int[newLength];
+            System.arraycopy(array, 0, result, 0, array.length);
+            return result;
+        }
+    }
+}
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Bits.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Bits.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,6 +25,8 @@
 
 package com.sun.tools.javac.util;
 
+import java.util.Arrays;
+
 /** A class for extensible, mutable bit sets.
  *
  *  <p><b>This is NOT part of any supported API.
@@ -62,9 +64,7 @@
 
     private void sizeTo(int len) {
         if (bits.length < len) {
-            int[] newbits = new int[len];
-            System.arraycopy(bits, 0, newbits, 0, bits.length);
-            bits = newbits;
+            bits = Arrays.copyOf(bits, len);
         }
     }
 
--- a/langtools/src/share/classes/com/sun/tools/javac/util/ByteBuffer.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/ByteBuffer.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -60,16 +60,10 @@
         length = 0;
     }
 
-    private void copy(int size) {
-        byte[] newelems = new byte[size];
-        System.arraycopy(elems, 0, newelems, 0, elems.length);
-        elems = newelems;
-    }
-
     /** Append byte to this buffer.
      */
     public void appendByte(int b) {
-        if (length >= elems.length) copy(elems.length * 2);
+        elems = ArrayUtils.ensureCapacity(elems, length);
         elems[length++] = (byte)b;
     }
 
@@ -77,7 +71,7 @@
      *  starting at given `start' offset.
      */
     public void appendBytes(byte[] bs, int start, int len) {
-        while (length + len > elems.length) copy(elems.length * 2);
+        elems = ArrayUtils.ensureCapacity(elems, length + len);
         System.arraycopy(bs, start, elems, length, len);
         length += len;
     }
@@ -91,7 +85,7 @@
     /** Append a character as a two byte number.
      */
     public void appendChar(int x) {
-        while (length + 1 >= elems.length) copy(elems.length * 2);
+        elems = ArrayUtils.ensureCapacity(elems, length + 1);
         elems[length  ] = (byte)((x >>  8) & 0xFF);
         elems[length+1] = (byte)((x      ) & 0xFF);
         length = length + 2;
@@ -100,7 +94,7 @@
     /** Append an integer as a four byte number.
      */
     public void appendInt(int x) {
-        while (length + 3 >= elems.length) copy(elems.length * 2);
+        elems = ArrayUtils.ensureCapacity(elems, length + 3);
         elems[length  ] = (byte)((x >> 24) & 0xFF);
         elems[length+1] = (byte)((x >> 16) & 0xFF);
         elems[length+2] = (byte)((x >>  8) & 0xFF);
--- a/langtools/src/share/classes/com/sun/tools/javac/util/List.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/List.java	Wed Jul 05 18:26:11 2017 +0200
@@ -83,6 +83,19 @@
         }
     };
 
+    /** Returns the list obtained from 'l' after removing all elements 'elem'
+     */
+    public static <A> List<A> filter(List<A> l, A elem) {
+        Assert.checkNonNull(elem);
+        List<A> res = List.nil();
+        for (A a : l) {
+            if (a != null && !a.equals(elem)) {
+                res = res.prepend(a);
+            }
+        }
+        return res.reverse();
+    }
+
     /** Construct a list consisting of given element.
      */
     public static <A> List<A> of(A x1) {
@@ -120,6 +133,14 @@
         return xs;
     }
 
+    public static <A> List<A> from(Iterable<? extends A> coll) {
+        List<A> xs = nil();
+        for (A a : coll) {
+            xs = new List<A>(a, xs);
+        }
+        return xs;
+    }
+
     /** Construct a list consisting of a given number of identical elements.
      *  @param len    The number of elements in the list.
      *  @param init   The value of each element.
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Wed Jul 05 18:26:11 2017 +0200
@@ -130,7 +130,7 @@
     /**
      * Deferred diagnostics
      */
-    public boolean deferDiagnostics;
+    public Filter<JCDiagnostic> deferredDiagFilter;
     public Queue<JCDiagnostic> deferredDiagnostics = new ListBuffer<JCDiagnostic>();
 
     /** Construct a log with given I/O redirections.
@@ -450,7 +450,7 @@
 
     /** Report selected deferred diagnostics, and clear the deferDiagnostics flag. */
     public void reportDeferredDiagnostics(Set<JCDiagnostic.Kind> kinds) {
-        deferDiagnostics = false;
+        deferredDiagFilter = null;
         JCDiagnostic d;
         while ((d = deferredDiagnostics.poll()) != null) {
             if (kinds.contains(d.getKind()))
@@ -464,7 +464,7 @@
      * reported so far, the diagnostic may be handed off to writeDiagnostic.
      */
     public void report(JCDiagnostic diagnostic) {
-        if (deferDiagnostics) {
+        if (deferredDiagFilter != null && deferredDiagFilter.accepts(diagnostic)) {
             deferredDiagnostics.add(diagnostic);
             return;
         }
@@ -551,6 +551,18 @@
         }
     }
 
+    public void deferAll() {
+        deferredDiagFilter = new Filter<JCDiagnostic>() {
+            public boolean accepts(JCDiagnostic t) {
+                return true;
+            }
+        };
+    }
+
+    public void deferNone() {
+        deferredDiagFilter = null;
+    }
+
     /** Find a localized string in the resource bundle.
      *  Because this method is static, it ignores the locale.
      *  Use localize(key, args) when possible.
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java	Wed Jul 05 18:26:11 2017 +0200
@@ -118,6 +118,7 @@
     // attribute names
     public final Name Annotation;
     public final Name AnnotationDefault;
+    public final Name BootstrapMethods;
     public final Name Bridge;
     public final Name CharacterRangeTable;
     public final Name Code;
@@ -246,6 +247,7 @@
         // attribute names
         Annotation = fromString("Annotation");
         AnnotationDefault = fromString("AnnotationDefault");
+        BootstrapMethods = fromString("BootstrapMethods");
         Bridge = fromString("Bridge");
         CharacterRangeTable = fromString("CharacterRangeTable");
         Code = fromString("Code");
--- a/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -32,6 +32,7 @@
 import com.sun.tools.javac.api.DiagnosticFormatter.Configuration.*;
 import com.sun.tools.javac.api.Formattable;
 import com.sun.tools.javac.file.BaseFileObject;
+import com.sun.tools.javac.tree.JCTree.*;
 import com.sun.tools.javac.util.AbstractDiagnosticFormatter.SimpleConfiguration;
 
 import static com.sun.tools.javac.api.DiagnosticFormatter.PositionKind.*;
@@ -117,16 +118,17 @@
     @Override
     protected String formatArgument(JCDiagnostic diag, Object arg, Locale l) {
         String s;
-        if (arg instanceof Formattable)
+        if (arg instanceof Formattable) {
             s = arg.toString();
-        else if (arg instanceof BaseFileObject)
+        } else if (arg instanceof JCExpression) {
+            JCExpression tree = (JCExpression)arg;
+            s = "@" + tree.getStartPosition();
+        } else if (arg instanceof BaseFileObject) {
             s = ((BaseFileObject) arg).getShortName();
-        else
+        } else {
             s = super.formatArgument(diag, arg, null);
-        if (arg instanceof JCDiagnostic)
-            return "(" + s + ")";
-        else
-            return s;
+        }
+        return (arg instanceof JCDiagnostic) ? "(" + s + ")" : s;
     }
 
     @Override
--- a/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -393,11 +393,6 @@
         }
 
         @Override
-        protected String printMethodArgs(List<Type> args, boolean varArgs, Locale locale) {
-            return super.printMethodArgs(args, varArgs, locale);
-        }
-
-        @Override
         public String visitClassSymbol(ClassSymbol s, Locale locale) {
             String name = nameSimplifier.simplify(s);
             if (name.length() == 0 ||
--- a/langtools/src/share/classes/com/sun/tools/javac/util/SharedNameTable.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/SharedNameTable.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, 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
@@ -93,13 +93,7 @@
     @Override
     public Name fromChars(char[] cs, int start, int len) {
         int nc = this.nc;
-        byte[] bytes = this.bytes;
-        while (nc + len * 3 >= bytes.length) {
-            //          System.err.println("doubling name buffer of length " + names.length + " to fit " + len + " chars");//DEBUG
-            byte[] newnames = new byte[bytes.length * 2];
-            System.arraycopy(bytes, 0, newnames, 0, bytes.length);
-            bytes = this.bytes = newnames;
-        }
+        byte[] bytes = this.bytes = ArrayUtils.ensureCapacity(this.bytes, nc + len * 3);
         int nbytes = Convert.chars2utf(cs, start, bytes, nc, len) - nc;
         int h = hashValue(bytes, nc, nbytes) & hashMask;
         NameImpl n = hashes[h];
@@ -133,12 +127,7 @@
         }
         if (n == null) {
             int nc = this.nc;
-            while (nc + len > names.length) {
-                //              System.err.println("doubling name buffer of length + " + names.length + " to fit " + len + " bytes");//DEBUG
-                byte[] newnames = new byte[names.length * 2];
-                System.arraycopy(names, 0, newnames, 0, names.length);
-                names = this.bytes = newnames;
-            }
+            names = this.bytes = ArrayUtils.ensureCapacity(names, nc + len);
             System.arraycopy(cs, start, names, nc, len);
             n = new NameImpl(this);
             n.index = nc;
--- a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2012, 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
@@ -45,8 +45,8 @@
  *  This code and its internal interfaces are subject to change or
  *  deletion without notice.</b>
  */
-class CodeWriter extends BasicWriter {
-    static CodeWriter instance(Context context) {
+public class CodeWriter extends BasicWriter {
+    public static CodeWriter instance(Context context) {
         CodeWriter instance = context.get(CodeWriter.class);
         if (instance == null)
             instance = new CodeWriter(context);
--- a/langtools/src/share/classes/com/sun/tools/javap/StackMapWriter.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javap/StackMapWriter.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, 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
@@ -25,10 +25,11 @@
 
 package com.sun.tools.javap;
 
-import com.sun.tools.classfile.AccessFlags;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.sun.tools.classfile.AccessFlags;
 import com.sun.tools.classfile.Attribute;
 import com.sun.tools.classfile.Code_attribute;
 import com.sun.tools.classfile.ConstantPool;
@@ -233,8 +234,7 @@
             StackMap prev = map.get(pc);
             assert (prev != null);
             int k = 251 - frame.frame_type;
-            verification_type_info[] new_locals = new verification_type_info[prev.locals.length - k];
-            System.arraycopy(prev.locals, 0, new_locals, 0, new_locals.length);
+            verification_type_info[] new_locals = Arrays.copyOf(prev.locals, prev.locals.length - k);
             StackMap m = new StackMap(new_locals, empty);
             map.put(new_pc, m);
             return new_pc;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug      7132631
+ * @summary  Make sure that the help file is generated correctly.
+ * @author   Bhavesh Patel
+ * @library  ../lib/
+ * @build    JavadocTester TestHelpFile
+ * @run main TestHelpFile
+ */
+
+public class TestHelpFile extends JavadocTester {
+
+    //Test information.
+    private static final String BUG_ID = "7132631";
+
+    //Javadoc arguments.
+    private static final String[] ARGS = new String[] {
+        "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            SRC_DIR + FS + "TestHelpFile.java"
+    };
+
+    private static final String[][] NEGATED_TEST = NO_TEST;
+
+    private static final String[][] TEST = {
+        {BUG_ID + FS + "help-doc.html",
+            "<a href=\"constant-values.html\">Constant Field Values</a>"
+        },
+    };
+
+    /**
+     * The entry point of the test.
+     * @param args the array of command line arguments.
+     */
+    public static void main(String[] args) {
+        TestHelpFile tester = new TestHelpFile();
+        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.printSummary();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBugId() {
+        return BUG_ID;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBugName() {
+        return getClass().getName();
+    }
+}
--- a/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, 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
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 4496290 4985072 7006178
+ * @bug 4496290 4985072 7006178 7068595
  * @summary A simple test to determine if -use works.
  * @author jamieh
  * @library ../lib/
@@ -34,7 +34,7 @@
 
 public class TestUseOption extends JavadocTester {
 
-    private static final String BUG_ID = "4496290-4985072-7006178";
+    private static final String BUG_ID = "4496290-4985072-7006178-7068595";
 
     //Input for string search tests.
     private static final String[] TEST2 = {
@@ -64,6 +64,13 @@
         }
     };
 
+    private static final String[][] TEST4 = {
+        {BUG_ID + "-4" + FS + "pkg2" + FS + "class-use" + FS + "C3.html", "<a href=" +
+                 "\"../../index.html?pkg2/class-use/C3.html\" target=\"_top\">" +
+                 "Frames</a></li>"
+        }
+    };
+
     private static final String[] ARGS = new String[] {
         "-d", BUG_ID, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2"
     };
@@ -76,6 +83,10 @@
         "-d", BUG_ID + "-3", "-sourcepath", SRC_DIR, "-use", SRC_DIR + FS + "C.java", SRC_DIR + FS + "UsedInC.java"
     };
 
+    private static final String[] ARGS4 = new String[] {
+        "-d", BUG_ID + "-4", "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2"
+    };
+
     /**
      * The entry point of the test.
      * @param args the array of command line arguments.
@@ -108,6 +119,7 @@
         }
         tester.printSummary();
         run(tester, ARGS3, TEST3, NO_TEST);
+        run(tester, ARGS4, TEST4, NO_TEST);
         tester.printSummary();
     }
 
--- a/langtools/test/tools/javac/6402516/TestLocalElements.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/6402516/TestLocalElements.java	Wed Jul 05 18:26:11 2017 +0200
@@ -43,9 +43,9 @@
 
     boolean b = new Object() {
             public boolean equals(Object other) {
-                String p = "p, other, super, this; super, this; List, Test2, Test; java.io.*, java.lang.*";
-                String q = "q, p, other, super, this; super, this; List, Test2, Test; java.io.*, java.lang.*";
-                String r = "r, q, p, other, super, this; super, this; List, Test2, Test; java.io.*, java.lang.*";
+                String p = "p, other, super, this; -, super, this; List, Test2, Test; java.io.*, java.lang.*";
+                String q = "q, p, other, super, this; -, super, this; List, Test2, Test; java.io.*, java.lang.*";
+                String r = "r, q, p, other, super, this; -, super, this; List, Test2, Test; java.io.*, java.lang.*";
                 return (this == other);
             }
 
--- a/langtools/test/tools/javac/6758789/T6758789a.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/6758789/T6758789a.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,3 @@
-T6758789a.java:14:9: compiler.err.cant.apply.symbol.1: kindname.method, m1, compiler.misc.no.args, int, kindname.class, T6758789a, (compiler.misc.arg.length.mismatch)
-T6758789a.java:15:9: compiler.err.cant.apply.symbol.1: kindname.method, m2, int, compiler.misc.no.args, kindname.class, T6758789a, (compiler.misc.arg.length.mismatch)
+T6758789a.java:14:9: compiler.err.cant.apply.symbol: kindname.method, m1, compiler.misc.no.args, int, kindname.class, T6758789a, (compiler.misc.arg.length.mismatch)
+T6758789a.java:15:9: compiler.err.cant.apply.symbol: kindname.method, m2, int, compiler.misc.no.args, kindname.class, T6758789a, (compiler.misc.arg.length.mismatch)
 2 errors
--- a/langtools/test/tools/javac/6758789/T6758789b.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/6758789/T6758789b.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,4 +1,4 @@
-T6758789b.java:16:11: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), T6758789a.Foo, T6758789a.Foo<java.lang.Object>
+T6758789b.java:16:11: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), T6758789a.Foo, T6758789a.Foo<X>
 T6758789b.java:16:10: compiler.warn.unchecked.meth.invocation.applied: kindname.method, m, T6758789a.Foo<X>, T6758789a.Foo, kindname.class, T6758789a
 - compiler.err.warnings.and.werror
 1 error
--- a/langtools/test/tools/javac/6840059/T6840059.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/6840059/T6840059.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,2 @@
-T6840059.java:15:9: compiler.err.cant.apply.symbol.1: kindname.constructor, T6840059, java.lang.Integer, java.lang.String, kindname.class, T6840059, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
-T6840059.java:15:25: compiler.err.cant.apply.symbol.1: kindname.constructor, T6840059, java.lang.Integer, compiler.misc.no.args, kindname.class, T6840059, (compiler.misc.arg.length.mismatch)
-2 errors
+T6840059.java:15:9: compiler.err.cant.apply.symbol: kindname.constructor, T6840059, java.lang.Integer, java.lang.String, kindname.class, T6840059, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+1 error
--- a/langtools/test/tools/javac/6857948/T6857948.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/6857948/T6857948.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,2 @@
 T6857948.java:16:32: compiler.err.cant.resolve.location.args: kindname.method, nosuchfunction, , , (compiler.misc.location: kindname.class, Test, null)
-T6857948.java:16:50: compiler.err.cant.apply.symbol.1: kindname.constructor, Foo, java.lang.String, compiler.misc.no.args, kindname.class, Foo, (compiler.misc.arg.length.mismatch)
-2 errors
+1 error
--- a/langtools/test/tools/javac/7132880/T7132880.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/7132880/T7132880.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,4 +1,4 @@
-T7132880.java:23:12: compiler.err.cant.apply.symbol.1: kindname.method, m1, java.lang.Integer, java.lang.String, kindname.class, Outer.Inner1, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+T7132880.java:23:12: compiler.err.cant.apply.symbol: kindname.method, m1, java.lang.Integer, java.lang.String, kindname.class, Outer.Inner1, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
 T7132880.java:33:12: compiler.err.cant.apply.symbols: kindname.method, m1, java.lang.String,{(compiler.misc.inapplicable.method: kindname.method, Outer.Inner2, m1(java.lang.Double), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Double))),(compiler.misc.inapplicable.method: kindname.method, Outer.Inner2, m1(java.lang.Integer), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer)))}
 T7132880.java:43:12: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Object,int), Outer.Inner3, kindname.method, m2(int,java.lang.Object), Outer.Inner3
 3 errors
--- a/langtools/test/tools/javac/Diagnostics/6722234/T6722234a_1.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6722234/T6722234a_1.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6722234a.java:12:9: compiler.err.cant.apply.symbol.1: kindname.method, m, compiler.misc.type.var: T, 1, compiler.misc.type.var: T, 2, kindname.class, T6722234a<compiler.misc.type.var: T, 1>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: compiler.misc.type.var: T, 2, compiler.misc.type.var: T, 1))
+T6722234a.java:12:9: compiler.err.cant.apply.symbol: kindname.method, m, compiler.misc.type.var: T, 1, compiler.misc.type.var: T, 2, kindname.class, T6722234a<compiler.misc.type.var: T, 1>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: compiler.misc.type.var: T, 2, compiler.misc.type.var: T, 1))
 1 error
--- a/langtools/test/tools/javac/Diagnostics/6722234/T6722234a_2.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6722234/T6722234a_2.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,3 @@
-T6722234a.java:12:9: compiler.err.cant.apply.symbol.1: kindname.method, m, compiler.misc.type.var: T, 1, compiler.misc.type.var: T, 2, kindname.class, T6722234a<compiler.misc.type.var: T, 1>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: compiler.misc.type.var: T, 2, compiler.misc.type.var: T, 1))
+T6722234a.java:12:9: compiler.err.cant.apply.symbol: kindname.method, m, compiler.misc.type.var: T, 1, compiler.misc.type.var: T, 2, kindname.class, T6722234a<compiler.misc.type.var: T, 1>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: compiler.misc.type.var: T, 2, compiler.misc.type.var: T, 1))
 - compiler.misc.where.description.typevar.1: compiler.misc.type.var: T, 1,compiler.misc.type.var: T, 2,{(compiler.misc.where.typevar: compiler.misc.type.var: T, 1, java.lang.String, kindname.class, T6722234a),(compiler.misc.where.typevar: compiler.misc.type.var: T, 2, java.lang.Integer, kindname.method, <compiler.misc.type.var: T, 2>test(compiler.misc.type.var: T, 2))}
 1 error
--- a/langtools/test/tools/javac/Diagnostics/6722234/T6722234b_1.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6722234/T6722234b_1.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6722234b.java:16:9: compiler.err.cant.apply.symbol.1: kindname.method, m, List<T>,List<T>, List<compiler.misc.type.captureof: 1, ? extends T6722234b>,List<compiler.misc.type.captureof: 2, ? extends T6722234b>, kindname.class, T6722234b, (compiler.misc.inferred.do.not.conform.to.eq.bounds: compiler.misc.type.captureof: 2, ? extends T6722234b, compiler.misc.type.captureof: 2, ? extends T6722234b,compiler.misc.type.captureof: 1, ? extends T6722234b)
+T6722234b.java:16:9: compiler.err.cant.apply.symbol: kindname.method, m, List<T>,List<T>, List<compiler.misc.type.captureof: 1, ? extends T6722234b>,List<compiler.misc.type.captureof: 2, ? extends T6722234b>, kindname.class, T6722234b, (compiler.misc.inferred.do.not.conform.to.eq.bounds: compiler.misc.type.captureof: 2, ? extends T6722234b, compiler.misc.type.captureof: 2, ? extends T6722234b,compiler.misc.type.captureof: 1, ? extends T6722234b)
 1 error
--- a/langtools/test/tools/javac/Diagnostics/6722234/T6722234b_2.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6722234/T6722234b_2.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,4 +1,4 @@
-T6722234b.java:16:9: compiler.err.cant.apply.symbol.1: kindname.method, m, List<T>,List<T>, List<compiler.misc.captured.type: 1>,List<compiler.misc.captured.type: 2>, kindname.class, T6722234b, (compiler.misc.inferred.do.not.conform.to.eq.bounds: compiler.misc.captured.type: 2, compiler.misc.captured.type: 2,compiler.misc.captured.type: 1)
+T6722234b.java:16:9: compiler.err.cant.apply.symbol: kindname.method, m, List<T>,List<T>, List<compiler.misc.captured.type: 1>,List<compiler.misc.captured.type: 2>, kindname.class, T6722234b, (compiler.misc.inferred.do.not.conform.to.eq.bounds: compiler.misc.captured.type: 2, compiler.misc.captured.type: 2,compiler.misc.captured.type: 1)
 - compiler.misc.where.description.typevar: T,{(compiler.misc.where.typevar: T, Object, kindname.method, <T>m(List<T>,List<T>))}
 - compiler.misc.where.description.captured.1: compiler.misc.captured.type: 1,compiler.misc.captured.type: 2,{(compiler.misc.where.captured.1: compiler.misc.captured.type: 1, T6722234b, compiler.misc.type.null, ? extends T6722234b),(compiler.misc.where.captured.1: compiler.misc.captured.type: 2, T6722234b, compiler.misc.type.null, ? extends T6722234b)}
 1 error
--- a/langtools/test/tools/javac/Diagnostics/6722234/T6722234c.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6722234/T6722234c.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6722234c.java:14:9: compiler.err.cant.apply.symbol.1: kindname.method, m, T6722234c.String, java.lang.String, kindname.class, T6722234c, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.lang.String, T6722234c.String))
+T6722234c.java:14:9: compiler.err.cant.apply.symbol: kindname.method, m, T6722234c.String, java.lang.String, kindname.class, T6722234c, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.lang.String, T6722234c.String))
 1 error
--- a/langtools/test/tools/javac/Diagnostics/6862608/T6862608a.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6862608/T6862608a.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,3 @@
-T6862608a.java:19:33: compiler.err.cant.apply.symbol.1: kindname.method, compound, java.lang.Iterable<? extends java.util.Comparator<? super T>>, java.util.List<java.util.Comparator<?>>, kindname.class, T6862608a, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<java.util.Comparator<?>>, java.lang.Iterable<? extends java.util.Comparator<? super T>>))
+T6862608a.java:19:33: compiler.err.cant.apply.symbol: kindname.method, compound, java.lang.Iterable<? extends java.util.Comparator<? super T>>, java.util.List<java.util.Comparator<?>>, kindname.class, T6862608a, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<java.util.Comparator<?>>, java.lang.Iterable<? extends java.util.Comparator<? super T>>))
 - compiler.misc.where.description.typevar: T,{(compiler.misc.where.typevar: T, java.lang.Object, kindname.method, <T>compound(java.lang.Iterable<? extends java.util.Comparator<? super T>>))}
 1 error
--- a/langtools/test/tools/javac/Diagnostics/6862608/T6862608b.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/Diagnostics/6862608/T6862608b.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,3 @@
-T6862608b.java:11:7: compiler.err.cant.apply.symbol.1: kindname.method, test, compiler.misc.type.var: T, 1, compiler.misc.type.var: T, 2, kindname.class, T66862608b<compiler.misc.type.var: T, 1,compiler.misc.type.var: S, 2>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: compiler.misc.type.var: T, 2, compiler.misc.type.var: T, 1))
+T6862608b.java:11:7: compiler.err.cant.apply.symbol: kindname.method, test, compiler.misc.type.var: T, 1, compiler.misc.type.var: T, 2, kindname.class, T66862608b<compiler.misc.type.var: T, 1,compiler.misc.type.var: S, 2>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: compiler.misc.type.var: T, 2, compiler.misc.type.var: T, 1))
 - compiler.misc.where.description.typevar.1: compiler.misc.type.var: T, 1,compiler.misc.type.var: T, 2,compiler.misc.type.var: S, 1,compiler.misc.type.var: S, 2,{(compiler.misc.where.typevar: compiler.misc.type.var: T, 1, java.lang.String, kindname.class, T66862608b),(compiler.misc.where.typevar: compiler.misc.type.var: T, 2, compiler.misc.type.var: S, 1, kindname.method, <compiler.misc.type.var: S, 1,compiler.misc.type.var: T, 2>foo(compiler.misc.type.var: T, 2)),(compiler.misc.where.typevar: compiler.misc.type.var: S, 1, java.lang.Object, kindname.method, <compiler.misc.type.var: S, 1,compiler.misc.type.var: T, 2>foo(compiler.misc.type.var: T, 2)),(compiler.misc.where.typevar: compiler.misc.type.var: S, 2, java.lang.Object, kindname.class, T66862608b)}
 1 error
--- a/langtools/test/tools/javac/T6326754.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/T6326754.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,7 +1,7 @@
 T6326754.java:44:12: compiler.err.name.clash.same.erasure: TestConstructor(T), TestConstructor(K)
 T6326754.java:52:17: compiler.err.name.clash.same.erasure: setT(K), setT(T)
 T6326754.java:64:18: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: T, T)
-T6326754.java:70:11: compiler.err.cant.apply.symbol.1: kindname.method, setT, java.lang.Object, compiler.misc.no.args, kindname.class, TestC<T>, (compiler.misc.arg.length.mismatch)
+T6326754.java:70:11: compiler.err.cant.apply.symbol: kindname.method, setT, java.lang.Object, compiler.misc.no.args, kindname.class, TestC<T>, (compiler.misc.arg.length.mismatch)
 - compiler.note.unchecked.filename: T6326754.java
 - compiler.note.unchecked.recompile
 4 errors
--- a/langtools/test/tools/javac/conditional/Conditional.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/conditional/Conditional.java	Wed Jul 05 18:26:11 2017 +0200
@@ -27,6 +27,7 @@
  * @summary Conditional operator applies assignment conversion
  * @author Tim Hanson, BEA
  *
+ * @compile -XDallowPoly Conditional.java
  * @compile/fail Conditional.java
  */
 
--- a/langtools/test/tools/javac/diags/CheckResourceKeys.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/CheckResourceKeys.java	Wed Jul 05 18:26:11 2017 +0200
@@ -185,6 +185,8 @@
         "compiler.err.cant.resolve.args.params",
         "compiler.err.cant.resolve.location.args",
         "compiler.err.cant.resolve.location.args.params",
+        "compiler.misc.cant.resolve.location.args",
+        "compiler.misc.cant.resolve.location.args.params",
         // JavaCompiler, reports #errors and #warnings
         "compiler.misc.count.error",
         "compiler.misc.count.error.plural",
--- a/langtools/test/tools/javac/diags/examples.not-yet.txt	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples.not-yet.txt	Wed Jul 05 18:26:11 2017 +0200
@@ -1,7 +1,6 @@
 compiler.err.already.annotated                          # internal compiler error?
 compiler.err.already.defined.this.unit                  # seems to be masked by compiler.err.duplicate.class
 compiler.err.annotation.value.not.allowable.type        # cannot happen: precluded by complete type-specific tests
-compiler.err.cant.apply.symbol
 compiler.err.cant.read.file                             # (apt.JavaCompiler?)
 compiler.err.cant.select.static.class.from.param.type
 compiler.err.illegal.char.for.encoding
@@ -65,6 +64,7 @@
 compiler.misc.kindname.type.variable
 compiler.misc.kindname.type.variable.bound
 compiler.misc.kindname.value
+compiler.misc.incompatible.eq.lower.bounds              # cannot happen?
 compiler.misc.no.unique.minimal.instance.exists
 compiler.misc.resume.abort                              # prompt for a response
 compiler.misc.source.unavailable                        # DiagnosticSource
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantAccessArgTypeInFunctionalDesc.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.cant.access.arg.type.in.functional.desc
+// key: compiler.err.report.access
+// options: -XDallowLambda
+
+interface SAM_InaccessibleArg {
+    void m(Foo.Bar bar);
+    static class Foo { private class Bar { } }
+}
+
+class CantAccessArgTypeInFunctionalDesc {
+    SAM_InaccessibleArg s = x-> { };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantAccessInnerClsConstr.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.cant.access.inner.cls.constr
+// key: compiler.misc.invalid.mref
+// options: -XDallowMethodReferences
+
+class CantAccessInnerClsConstructor {
+
+    interface SAM {
+        Outer m();
+    }
+
+    class Outer { }
+
+    static void test() {
+        SAM s = Outer::new;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantAccessReturnTypeInFunctionalDesc.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.cant.access.return.in.functional.desc
+// options: -XDallowLambda
+
+interface SAM_InaccessibleRet {
+    Foo.Bar m();
+    static class Foo { private class Bar { } }
+}
+
+class CantAccessReturnTypeInFunctionalDesc {
+    SAM_InaccessibleRet s = ()->null;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantAccessThrownTypesInFunctionalDesc.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.cant.access.thrown.in.functional.desc
+// options: -XDallowLambda
+
+interface SAM_InaccessibleThrown {
+    void m() throws Foo.Bar;
+    static class Foo { private class Bar extends Exception { } }
+}
+
+class CantAccessThrownTypesInFunctionalDesc {
+    SAM_InaccessibleThrown s = ()-> { };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantApplySymbolFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.inconvertible.types
+// key: compiler.misc.no.conforming.assignment.exists
+// key: compiler.misc.cant.apply.symbol
+// key: compiler.misc.invalid.mref
+// options: -XDallowMethodReferences
+
+class CantApplySymbolFragment {
+
+    interface SAM {
+        void m(Integer u);
+    }
+
+    static void f(String s) { }
+
+    void test() {
+        SAM s = CantApplySymbolFragment::f;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantApplySymbolsFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.inconvertible.types
+// key: compiler.misc.no.conforming.assignment.exists
+// key: compiler.misc.arg.length.mismatch
+// key: compiler.misc.inapplicable.method
+// key: compiler.misc.cant.apply.symbols
+// key: compiler.misc.invalid.mref
+// options: -XDallowMethodReferences
+
+class CantApplySymbolsFragment {
+
+    interface SAM {
+        void m(Integer u);
+    }
+
+    static void f() { }
+
+    static void f(String s) { }
+
+    void test() {
+        SAM s = CantApplySymbolsFragment::f;
+    }
+}
--- a/langtools/test/tools/javac/diags/examples/CantRefNonEffectivelyFinalVar.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/CantRefNonEffectivelyFinalVar.java	Wed Jul 05 18:26:11 2017 +0200
@@ -23,7 +23,8 @@
 
 // key: compiler.err.cant.ref.non.effectively.final.var
 // key: compiler.misc.inner.cls
-// options: -XDallowEffectivelyFinalInInnerClasses
+// key: compiler.misc.lambda
+// options: -XDallowLambda -XDallowEffectivelyFinalInInnerClasses
 
 class CantRefNonEffectivelyFinalVar {
     void test() {
@@ -31,4 +32,14 @@
         new Object() { int j = i; };
         i = 2;
     }
+
+    interface SAM {
+        void m();
+    }
+
+    void test2() {
+        int i = 0;
+        SAM s = ()-> { int j = i; };
+        i++;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantResolveLocationArgsFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.misc.cant.resolve.location.args
+// key: compiler.misc.location
+// key: compiler.err.invalid.mref
+// options: -XDallowMethodReferences
+
+class CantResolveLocationArgsFragment {
+
+    interface SAM {
+        void m(Integer u);
+    }
+
+    void test() {
+        SAM s = CantResolveLocationArgsFragment::f;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CantResolveLocationArgsParamsFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.misc.cant.resolve.location.args.params
+// key: compiler.misc.location
+// key: compiler.err.invalid.mref
+// options: -XDallowMethodReferences
+
+class CantResolveLocationArgsParamsFragment {
+
+    interface SAM {
+        void m(Integer u);
+    }
+
+    void test() {
+        SAM s = CantResolveLocationArgsParamsFragment::<String>f;
+    }
+}
--- a/langtools/test/tools/javac/diags/examples/CatchWithoutTry.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/CatchWithoutTry.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2012, 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
@@ -23,6 +23,8 @@
 
 // key: compiler.err.catch.without.try
 // key: compiler.err.expected
+// key: compiler.err.not.stmt
+// key: compiler.err.lambda.not.supported.in.source
 
 class CatchWithoutTry {
     void m() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/CyclicInference.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.cant.apply.symbol
+// key: compiler.misc.cyclic.inference
+// options: -XDallowLambda -XDallowPoly
+
+class CyclicInference {
+    interface SAM<X> {
+        void m(X x);
+    }
+
+    <Z> void g(SAM<Z> sz) { }
+
+    void test() {
+        g(x-> {});
+    }
+}
--- a/langtools/test/tools/javac/diags/examples/ExplicitParamsDoNotConformToBounds.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/ExplicitParamsDoNotConformToBounds.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.explicit.param.do.not.conform.to.bounds
 
 class ExplicitParamsDoNotConformToBounds {
--- a/langtools/test/tools/javac/diags/examples/InaccessibleVarargsType/InaccessibleVarargsType.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/InaccessibleVarargsType/InaccessibleVarargsType.java	Wed Jul 05 18:26:11 2017 +0200
@@ -22,7 +22,7 @@
  */
 
 // key: compiler.misc.inaccessible.varargs.type
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 
 import p1.B;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleAbstracts.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.not.a.functional.intf.1
+// key: compiler.misc.incompatible.abstracts
+// options: -XDallowLambda
+
+class IncompatibleAbstracts {
+
+    interface SAM {
+        void m(String s);
+        void m(Integer i);
+    }
+
+    SAM s = x-> { };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleArgTypesInLambda.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.incompatible.arg.types.in.lambda
+// options: -XDallowLambda -XDallowPoly
+
+class IncompatibleArgTypesInLambda {
+    interface SAM {
+        void m(Integer x);
+    }
+
+    SAM s = (String x)-> {};
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleDescsInFunctionalIntf.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.types.incompatible.diff.ret
+// key: compiler.err.prob.found.req
+// key: compiler.misc.incompatible.descs.in.functional.intf
+// key: compiler.misc.descriptor
+// key: compiler.misc.descriptor.throws
+// options: -XDallowLambda
+
+class IncompatibleDescsInFunctionalIntf {
+    interface A {
+        Integer m(String i) throws Exception;
+    }
+
+    interface B {
+        String m(String i);
+    }
+
+    interface SAM extends A,B { }
+
+    SAM s = x-> { };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleEqUpperBounds.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+//key: compiler.err.cant.apply.symbol
+//key: compiler.misc.incompatible.eq.upper.bounds
+
+import java.util.List;
+
+class IncompatibleEqUpperBounds {
+    <S, T extends List<S>> void m(List<? super S> s1, T s2) { }
+
+    void test(List<Integer> li, List<String> ls) {
+        m(li, ls);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleRetTypeInLambda.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.inconvertible.types
+// key: compiler.misc.incompatible.ret.type.in.lambda
+// options: -XDallowLambda -XDallowPoly
+
+class IncompatibleRetTypeInLambda {
+    interface SAM {
+        Integer m();
+    }
+
+    SAM s = ()-> "";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleRetTypeInMref.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.inconvertible.types
+// key: compiler.misc.incompatible.ret.type.in.mref
+// options: -XDallowMethodReferences -XDallowPoly
+
+class IncompatibleRetTypeInMref {
+    interface SAM {
+        Integer m();
+    }
+
+    static String f() { }
+
+    SAM s = IncompatibleRetTypeInMref::f;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleThrownTypesInLambda.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.incompatible.thrown.types.in.lambda
+// options: -XDallowLambda
+
+class IncompatibleThrownTypesInLambda {
+    interface SAM {
+        void m();
+    }
+
+    SAM s = ()-> { throw new Exception(); };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleThrownTypesInMref.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.incompatible.thrown.types.in.mref
+// options: -XDallowMethodReferences
+
+class IncompatibleThrownTypesInMref {
+    interface SAM {
+        void m();
+    }
+
+    static void f() throws Exception { }
+
+    SAM s = IncompatibleThrownTypesInMref::f;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/IncompatibleTypesInConditional.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.incompatible.type.in.conditional
+// key: compiler.misc.inconvertible.types
+// options: -XDallowPoly
+
+class IncompatibleTypesInConditional {
+
+    interface A { }
+    interface B { }
+
+    B b = true ? (A)null : (B)null;
+}
--- a/langtools/test/tools/javac/diags/examples/InferArgsLengthMismatch.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/InferArgsLengthMismatch.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.infer.arg.length.mismatch
 
 class InferArgsLengthMismatch {
--- a/langtools/test/tools/javac/diags/examples/InferNoConformingAssignment.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/InferNoConformingAssignment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.inconvertible.types
 // key: compiler.misc.infer.no.conforming.assignment.exists
 
--- a/langtools/test/tools/javac/diags/examples/InferVarargsArgumentMismatch.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/InferVarargsArgumentMismatch.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.infer.varargs.argument.mismatch
 // key: compiler.misc.inconvertible.types
 
--- a/langtools/test/tools/javac/diags/examples/InferredDoNotConformToEq.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/InferredDoNotConformToEq.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.inferred.do.not.conform.to.eq.bounds
 
 import java.util.*;
--- a/langtools/test/tools/javac/diags/examples/InferredDoNotConformToUpper.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/InferredDoNotConformToUpper.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.inferred.do.not.conform.to.upper.bounds
 
 import java.util.*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/InvalidGenericDescInFunctionalInterface.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.invalid.generic.desc.in.functional.intf
+// options: -XDallowLambda
+
+class InvalidGenericDescInFunctionalIntf {
+
+    interface SAM {
+        <Z> void m();
+    }
+
+    SAM s = x-> { };
+}
--- a/langtools/test/tools/javac/diags/examples/KindnameConstructor.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/KindnameConstructor.java	Wed Jul 05 18:26:11 2017 +0200
@@ -23,12 +23,10 @@
 
 // key: compiler.misc.kindname.constructor
 // key: compiler.misc.kindname.class
-// key: compiler.misc.no.args
-// key: compiler.err.cant.apply.symbol.1
-// key: compiler.misc.arg.length.mismatch
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.no.conforming.assignment.exists
 // key: compiler.misc.inconvertible.types
-// key: compiler.misc.count.error.plural
+// key: compiler.misc.count.error
 // key: compiler.err.error
 // run: backdoor
 
--- a/langtools/test/tools/javac/diags/examples/MethodReferencesNotSupported.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/MethodReferencesNotSupported.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,5 +25,5 @@
 // options: -source 7 -Xlint:-options
 
 class MethodReferencesNotSupported {
-    S s = A#foo;
+    S s = A::foo;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/MissingReturnValueFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.incompatible.ret.type.in.lambda
+// key: compiler.misc.missing.ret.val
+// options: -XDallowLambda
+
+class MissingReturnValueFragment {
+    interface SAM {
+        String m();
+    }
+
+    void test() {
+        SAM s = ()->{};
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/NoAbstracts.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.not.a.functional.intf.1
+// key: compiler.misc.no.abstracts
+// options: -XDallowLambda
+
+class NoAbstracts {
+
+    interface SAM { }
+
+    SAM s = x-> { };
+}
--- a/langtools/test/tools/javac/diags/examples/NoArgs.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/NoArgs.java	Wed Jul 05 18:26:11 2017 +0200
@@ -22,7 +22,7 @@
  */
 
 // key: compiler.misc.no.args
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.arg.length.mismatch
 // run: simple
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/NoSuitableFunctionalIntfInst.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.no.suitable.functional.intf.inst
+// options: -XDallowLambda
+
+class NoSuitableFunctionalIntfInst {
+
+    interface SAM<X extends Number> {
+        void m(X x);
+    }
+
+    SAM<?> ss = (String s)-> { };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/NonStaticCantBeRefFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.non-static.cant.be.ref
+// key: compiler.misc.invalid.mref
+// options: -XDallowMethodReferences
+
+class NonStaticCantBeRefFragment {
+
+    interface SAM {
+        void m(Integer u);
+    }
+
+    void f(Integer i) { }
+
+    static void test() {
+        SAM s = NonStaticCantBeRefFragment::f;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/NotAFunctionalIntf.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.not.a.functional.intf
+// options: -XDallowLambda
+
+class NotAFunctionalIntf {
+
+    abstract class SAM {
+        abstract <Z> void m();
+    }
+
+    SAM s = x-> { };
+}
--- a/langtools/test/tools/javac/diags/examples/NotApplicableMethodFound.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/NotApplicableMethodFound.java	Wed Jul 05 18:26:11 2017 +0200
@@ -23,7 +23,7 @@
 
 // key: compiler.misc.not.applicable.method.found
 // key: compiler.note.verbose.resolve.multi.1
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.no.conforming.assignment.exists
 // key: compiler.misc.inconvertible.types
 // options: -XDverboseResolution=inapplicable,failure
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/NotDefAccessClassIntfCantAccessFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.not.def.access.class.intf.cant.access
+// key: compiler.misc.invalid.mref
+// options: -XDallowMethodReferences
+
+class NotDefAccessClassIntfCantAccessFragment {
+
+    private class Private {
+        void m() { }
+    }
+
+    Private getPrivate() { return new Private(); }
+}
+
+class NotDefAccessClassIntfCantAccessFragmentTest {
+
+    interface SAM {
+        void m();
+    }
+
+    static void test() {
+        SAM s = new NotDefAccessClassIntfCantAccessFragment().getPrivate()::m;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/PotentialLambdaFound.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.note.potential.lambda.found
+// options: -XDallowLambda -XDidentifyLambdaCandidate=true
+
+class PotentialLambdaFound {
+
+    interface SAM {
+        void m();
+    }
+
+    SAM s = new SAM() { public void m() { } };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/RefAmbiguousFragment.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.prob.found.req
+// key: compiler.misc.ref.ambiguous
+// key: compiler.misc.invalid.mref
+// options: -XDallowMethodReferences
+
+class RefAmbiguousFragment {
+
+    interface SAM {
+        void m(Integer i1, Integer i2);
+    }
+
+    void f(Number n, Integer i) { }
+    void f(Integer i, Number n) { }
+
+    void test() {
+        SAM s = RefAmbiguousFragment::f;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/UnexpectedLambda.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.unexpected.lambda
+// options: -XDallowLambda
+
+class UnexpectedLambda {
+    { (()-> { })++; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/UnexpectedMref.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+// key: compiler.err.unexpected.mref
+// options: -XDallowMethodReferences
+
+class UnexpectedLambda {
+    { (Foo::bar)++; }
+}
--- a/langtools/test/tools/javac/diags/examples/VarargsArgumentMismatch.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/VarargsArgumentMismatch.java	Wed Jul 05 18:26:11 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.varargs.argument.mismatch
 // key: compiler.misc.inconvertible.types
 
--- a/langtools/test/tools/javac/diags/examples/VerboseResolveMulti1.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/VerboseResolveMulti1.java	Wed Jul 05 18:26:11 2017 +0200
@@ -23,7 +23,7 @@
 
 // key: compiler.misc.not.applicable.method.found
 // key: compiler.note.verbose.resolve.multi.1
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.no.conforming.assignment.exists
 // key: compiler.misc.inconvertible.types
 // options: -XDverboseResolution=inapplicable,failure
--- a/langtools/test/tools/javac/diags/examples/WhereCaptured.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/WhereCaptured.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,7 +25,7 @@
 // key: compiler.misc.where.description.captured.1
 // key: compiler.misc.where.description.typevar
 // key: compiler.misc.where.typevar
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.inferred.do.not.conform.to.eq.bounds
 // key: compiler.misc.captured.type
 // options: -XDdiags=where,simpleNames
--- a/langtools/test/tools/javac/diags/examples/WhereCaptured1.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/WhereCaptured1.java	Wed Jul 05 18:26:11 2017 +0200
@@ -25,7 +25,7 @@
 // key: compiler.misc.where.description.captured.1
 // key: compiler.misc.where.description.typevar
 // key: compiler.misc.where.typevar
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.inferred.do.not.conform.to.eq.bounds
 // key: compiler.misc.captured.type
 // key: compiler.misc.type.null
--- a/langtools/test/tools/javac/diags/examples/WhereTypeVar.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples/WhereTypeVar.java	Wed Jul 05 18:26:11 2017 +0200
@@ -24,7 +24,7 @@
 // key: compiler.misc.where.typevar
 // key: compiler.misc.where.description.typevar.1
 // key: compiler.misc.type.var
-// key: compiler.err.cant.apply.symbol.1
+// key: compiler.err.cant.apply.symbol
 // key: compiler.misc.no.conforming.assignment.exists
 // key: compiler.misc.inconvertible.types
 // options: -XDdiags=where,disambiguateTvars
--- a/langtools/test/tools/javac/failover/CheckAttributedTree.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/failover/CheckAttributedTree.java	Wed Jul 05 18:26:11 2017 +0200
@@ -376,7 +376,7 @@
                     that.hasTag(CLASSDEF);
         }
 
-        private final List<String> excludedFields = Arrays.asList("varargsElement");
+        private final List<String> excludedFields = Arrays.asList("varargsElement", "targetType");
 
         void check(boolean ok, String label, Info self) {
             if (!ok) {
--- a/langtools/test/tools/javac/generics/7015430/T7015430.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/7015430/T7015430.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,14 +1,14 @@
-T7015430.java:41:15: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.Exception>
+T7015430.java:41:15: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<E>
 T7015430.java:41:14: compiler.warn.unchecked.meth.invocation.applied: kindname.method, empty, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
 T7015430.java:50:42: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.RuntimeException>
 T7015430.java:50:41: compiler.warn.unchecked.meth.invocation.applied: kindname.method, empty, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
-T7015430.java:68:22: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.Exception>
+T7015430.java:68:22: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<E>
 T7015430.java:68:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
 T7015430.java:77:40: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.RuntimeException>
 T7015430.java:77:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
 T7015430.java:104:41: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.RuntimeException>
 T7015430.java:104:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
-T7015430.java:113:22: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<java.lang.Exception>
+T7015430.java:113:22: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.lang.Iterable, java.lang.Iterable<E>
 T7015430.java:113:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.lang.Iterable<E>, java.lang.Iterable, kindname.class, T7015430
 T7015430.java:41:14: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
 T7015430.java:68:9: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Exception
--- a/langtools/test/tools/javac/generics/7034511/T7034511a.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/7034511/T7034511a.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T7034511a.java:18:14: compiler.err.cant.apply.symbol.1: kindname.method, foo, compiler.misc.type.captureof: 1, ?[], java.lang.String[], kindname.interface, T7034511a.A<T>, (compiler.misc.no.conforming.assignment.exists: java.lang.String[], compiler.misc.type.captureof: 1, ?[])
+T7034511a.java:18:14: compiler.err.cant.apply.symbol: kindname.method, foo, compiler.misc.type.captureof: 1, ?[], java.lang.String[], kindname.interface, T7034511a.A<T>, (compiler.misc.no.conforming.assignment.exists: java.lang.String[], compiler.misc.type.captureof: 1, ?[])
 1 error
--- a/langtools/test/tools/javac/generics/7034511/T7034511b.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/7034511/T7034511b.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T7034511b.java:14:11: compiler.err.cant.apply.symbol.1: kindname.method, toArray, compiler.misc.type.captureof: 1, ?[], java.lang.Object[], kindname.class, T7034511b.MyList<E>, (compiler.misc.no.conforming.assignment.exists: java.lang.Object[], compiler.misc.type.captureof: 1, ?[])
+T7034511b.java:14:11: compiler.err.cant.apply.symbol: kindname.method, toArray, compiler.misc.type.captureof: 1, ?[], java.lang.Object[], kindname.class, T7034511b.MyList<E>, (compiler.misc.no.conforming.assignment.exists: java.lang.Object[], compiler.misc.type.captureof: 1, ?[])
 1 error
--- a/langtools/test/tools/javac/generics/7151802/T7151802.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/7151802/T7151802.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 T7151802.java:14:31: compiler.warn.unchecked.meth.invocation.applied: kindname.method, get1, Z, T7151802.Foo, kindname.class, T7151802
-T7151802.java:22:31: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), T7151802.Foo, T7151802.Foo<java.lang.Object>
+T7151802.java:22:31: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), T7151802.Foo, T7151802.Foo<Z>
 T7151802.java:22:30: compiler.warn.unchecked.meth.invocation.applied: kindname.method, get3, T7151802.Foo<Z>, T7151802.Foo, kindname.class, T7151802
 T7151802.java:30:36: compiler.warn.unchecked.meth.invocation.applied: kindname.method, get5, compiler.misc.no.args, compiler.misc.no.args, kindname.class, T7151802
 T7151802.java:38:32: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), T7151802.Foo, T7151802.Foo<java.lang.String>
--- a/langtools/test/tools/javac/generics/diamond/7002837/T7002837.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/diamond/7002837/T7002837.java	Wed Jul 05 18:26:11 2017 +0200
@@ -4,7 +4,7 @@
  *
  * @summary  Diamond: javac generates diamond inference errors when in 'finder' mode
  * @author mcimadamore
- * @compile -Werror -XDfindDiamond T7002837.java
+ * @compile/fail/ref=T7002837.out -Werror -XDrawDiagnostics -XDfindDiamond T7002837.java
  *
  */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/7002837/T7002837.out	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,4 @@
+T7002837.java:13:19: compiler.warn.diamond.redundant.args.1: T7002837<java.lang.Integer>, T7002837<java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>
+- compiler.err.warnings.and.werror
+1 error
+1 warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/7188968/T7188968.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,25 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7188968
+ *
+ * @summary  Diamond: javac generates diamond inference errors when in 'finder' mode
+ * @author mcimadamore
+ * @compile/fail/ref=T7188968.out -Xlint:unchecked -XDrawDiagnostics T7188968.java
+ *
+ */
+import java.util.List;
+
+class T7188968 {
+
+    static class Foo<X> {
+        Foo(List<X> ls, Object o) { }
+        static <Z> Foo<Z> makeFoo(List<Z> lz, Object o) { return null; }
+    }
+
+    void test(List l) {
+        new Foo(l, unknown);
+        new Foo(l, unknown) { };
+        new Foo<>(l, unknown);
+        Foo.makeFoo(l, unknown);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/7188968/T7188968.out	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,7 @@
+T7188968.java:20:20: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+T7188968.java:21:20: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+T7188968.java:21:29: compiler.warn.unchecked.call.mbr.of.raw.type: T7188968.Foo(java.util.List<X>,java.lang.Object), T7188968.Foo
+T7188968.java:22:22: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+T7188968.java:23:24: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+4 errors
+1 warning
--- a/langtools/test/tools/javac/generics/inference/6611449/T6611449.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/6611449/T6611449.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 T6611449.java:18:9: compiler.err.cant.apply.symbols: kindname.constructor, T6611449, int,{(compiler.misc.inapplicable.method: kindname.constructor, T6611449, <T>T6611449(T,T), (compiler.misc.infer.arg.length.mismatch: T)),(compiler.misc.inapplicable.method: kindname.constructor, T6611449, <T>T6611449(T), (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, S))}
 T6611449.java:19:9: compiler.err.cant.apply.symbols: kindname.constructor, T6611449, int,int,{(compiler.misc.inapplicable.method: kindname.constructor, T6611449, <T>T6611449(T,T), (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, S)),(compiler.misc.inapplicable.method: kindname.constructor, T6611449, <T>T6611449(T), (compiler.misc.infer.arg.length.mismatch: T))}
-T6611449.java:20:9: compiler.err.cant.apply.symbol.1: kindname.method, m1, T, int, kindname.class, T6611449<S>, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, S)
-T6611449.java:21:9: compiler.err.cant.apply.symbol.1: kindname.method, m2, T,T, int,int, kindname.class, T6611449<S>, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, S)
+T6611449.java:20:9: compiler.err.cant.apply.symbol: kindname.method, m1, T, int, kindname.class, T6611449<S>, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, S)
+T6611449.java:21:9: compiler.err.cant.apply.symbol: kindname.method, m2, T,T, int,int, kindname.class, T6611449<S>, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, S)
 4 errors
--- a/langtools/test/tools/javac/generics/inference/6638712/T6638712a.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/6638712/T6638712a.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6638712a.java:16:33: compiler.err.cant.apply.symbol.1: kindname.method, compound, java.lang.Iterable<? extends java.util.Comparator<? super T>>, java.util.List<java.util.Comparator<?>>, kindname.class, T6638712a, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<java.util.Comparator<?>>, java.lang.Iterable<? extends java.util.Comparator<? super T>>))
+T6638712a.java:16:33: compiler.err.cant.apply.symbol: kindname.method, compound, java.lang.Iterable<? extends java.util.Comparator<? super T>>, java.util.List<java.util.Comparator<?>>, kindname.class, T6638712a, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<java.util.Comparator<?>>, java.lang.Iterable<? extends java.util.Comparator<? super T>>))
 1 error
--- a/langtools/test/tools/javac/generics/inference/6638712/T6638712c.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/6638712/T6638712c.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6638712c.java:16:9: compiler.err.cant.apply.symbol.1: kindname.method, sort, T[],java.util.Comparator<? super T>, java.lang.Enum[],java.util.Comparator<java.lang.Enum<?>>, kindname.class, T6638712c, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.Comparator<java.lang.Enum<?>>, java.util.Comparator<? super java.lang.Enum>))
+T6638712c.java:16:9: compiler.err.cant.apply.symbol: kindname.method, sort, T[],java.util.Comparator<? super T>, java.lang.Enum[],java.util.Comparator<java.lang.Enum<?>>, kindname.class, T6638712c, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.Comparator<java.lang.Enum<?>>, java.util.Comparator<? super java.lang.Enum>))
 1 error
--- a/langtools/test/tools/javac/generics/inference/6638712/T6638712d.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/6638712/T6638712d.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6638712d.java:16:9: compiler.err.cant.apply.symbol.1: kindname.method, m, U,java.util.List<java.util.List<U>>, int,java.util.List<java.util.List<java.lang.String>>, kindname.class, T6638712d, (compiler.misc.inferred.do.not.conform.to.lower.bounds: java.lang.String, java.lang.Integer)
+T6638712d.java:16:9: compiler.err.cant.apply.symbol: kindname.method, m, U,java.util.List<java.util.List<U>>, int,java.util.List<java.util.List<java.lang.String>>, kindname.class, T6638712d, (compiler.misc.inferred.do.not.conform.to.lower.bounds: java.lang.String, java.lang.Integer)
 1 error
--- a/langtools/test/tools/javac/generics/inference/6838943/T6838943.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/6838943/T6838943.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,2 +1,2 @@
-T6838943.java:13:14: compiler.err.cant.apply.symbol.1: kindname.method, m, T6838943.A<Z>,Z, T6838943.A<T6838943.B>,T6838943.B, kindname.class, T6838943.C<X>, (compiler.misc.infer.no.conforming.assignment.exists: Z, (compiler.misc.inconvertible.types: T6838943.A<T6838943.B>, T6838943.A<Z>))
+T6838943.java:13:14: compiler.err.cant.apply.symbol: kindname.method, m, T6838943.A<Z>,Z, T6838943.A<T6838943.B>,T6838943.B, kindname.class, T6838943.C<X>, (compiler.misc.infer.no.conforming.assignment.exists: Z, (compiler.misc.inconvertible.types: T6838943.A<T6838943.B>, T6838943.A<Z>))
 1 error
--- a/langtools/test/tools/javac/generics/inference/7086586/T7086586.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/7086586/T7086586.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
-T7086586.java:14:20: compiler.err.cant.apply.symbol.1: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
-T7086586.java:15:20: compiler.err.cant.apply.symbol.1: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
-T7086586.java:16:23: compiler.err.cant.apply.symbol.1: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
-T7086586.java:17:9: compiler.err.cant.apply.symbol.1: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
+T7086586.java:14:20: compiler.err.cant.apply.symbol: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
+T7086586.java:15:20: compiler.err.cant.apply.symbol: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
+T7086586.java:16:23: compiler.err.cant.apply.symbol: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
+T7086586.java:17:9: compiler.err.cant.apply.symbol: kindname.method, m, java.util.List<? super T>, java.util.List<compiler.misc.type.captureof: 1, ?>, kindname.class, T7086586, (compiler.misc.infer.no.conforming.assignment.exists: T, (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.List<? super T>))
 4 errors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306a.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,19 @@
+/**
+ * @test /nodynamiccopyright/
+ * @bug 7177306
+ * @summary Regression: unchecked method call does not erase return type
+ * @compile/fail/ref=T7177306a.out -Werror -Xlint:unchecked -XDrawDiagnostics T7177306a.java
+ */
+
+import java.util.List;
+
+class T7177306a<A> {
+
+    public static void test(List l) {
+        T7177306a<Object> to = m(l);
+    }
+
+    public static <E> T7177306a<String> m(List<E> le) {
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306a.out	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,6 @@
+T7177306a.java:13:34: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.util.List, java.util.List<E>
+T7177306a.java:13:33: compiler.warn.unchecked.meth.invocation.applied: kindname.method, m, java.util.List<E>, java.util.List, kindname.class, T7177306a
+T7177306a.java:13:33: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), T7177306a, T7177306a<java.lang.Object>
+- compiler.err.warnings.and.werror
+1 error
+3 warnings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306b.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,18 @@
+/**
+ * @test /nodynamiccopyright/
+ * @bug 7177306
+ * @summary Regression: unchecked method call does not erase return type
+ * @compile/fail/ref=T7177306b.out -Werror -Xlint:unchecked -XDrawDiagnostics T7177306b.java
+ */
+
+import java.util.List;
+
+class T7177306b {
+
+    <T, S extends List<T>> List<T> m(List<? super T> arg1, S arg2, Class<Object> arg3) { return arg2; }
+
+    void test(List<Integer> li, List<String> ls, Class c) {
+        m(li, ls, c);
+        // should fail, because of bounds T <: Integer, S :> List<String>
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306b.out	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,2 @@
+T7177306b.java:15:9: compiler.err.cant.apply.symbol: kindname.method, m, java.util.List<? super T>,S,java.lang.Class<java.lang.Object>, java.util.List<java.lang.Integer>,java.util.List<java.lang.String>,java.lang.Class, kindname.class, T7177306b, (compiler.misc.incompatible.eq.upper.bounds: T, java.lang.String, java.lang.Integer,java.lang.Object)
+1 error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306c.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7177306
+ * @summary Regression: unchecked method call does not erase return type
+ */
+public class T7177306c {
+
+    static <T> T m(T t) { return (T)"Null"; }
+
+    public static void main(String[] args) {
+        if (m("NonNullConst") != "Null") {
+            throw new AssertionError("should not get there!");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306d.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7177306
+ * @summary Regression: unchecked method call does not erase return type
+ */
+import java.util.List;
+
+public class T7177306d {
+
+    static int assertionCount = 0;
+
+    static void assertTrue(boolean cond) {
+        if (!cond) {
+            throw new AssertionError();
+        }
+        assertionCount++;
+    }
+
+    static <T, S extends List<T>> void m(List<? super T> arg1, S arg2, Class<Object> arg3) { assertTrue(false); }
+    static void m(Object o1, Object o2, Object o3) { assertTrue(true); }
+
+    static void test(List<Integer> li, List<String> ls, Class c) {
+        m(li, ls, c);
+    }
+
+    public static void main(String[] args) {
+        test(null, null, null);
+        assertTrue(assertionCount == 1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306e.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,17 @@
+/**
+ * @test /nodynamiccopyright/
+ * @bug 7177306
+ * @summary Regression: unchecked method call does not erase return type
+ * @compile/fail/ref=T7177306e.out -XDrawDiagnostics T7177306e.java
+ */
+
+import java.util.List;
+
+class T7177306e {
+
+    <Z, U extends List<Z>> void m(List<U> lu) { }
+
+    void test(List<List<?>> llw) {
+       m(llw);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/7177306/T7177306e.out	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,2 @@
+T7177306e.java:15:9: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.util.List<?>, java.util.List<compiler.misc.type.captureof: 1, ?>)
+1 error
--- a/langtools/test/tools/javac/lambda/MethodReferenceParserTest.java	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/lambda/MethodReferenceParserTest.java	Wed Jul 05 18:26:11 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, 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
@@ -42,14 +42,14 @@
     static int checkCount = 0;
 
     enum ReferenceKind {
-        METHOD_REF("#Q##Gm"),
-        CONSTRUCTOR_REF("#Q##Gnew"),
+        METHOD_REF("#Q::#Gm"),
+        CONSTRUCTOR_REF("#Q::#Gnew"),
         FALSE_REF("min < max"),
-        ERR_SUPER("#Q##Gsuper"),
-        ERR_METH0("#Q##Gm()"),
-        ERR_METH1("#Q##Gm(X)"),
-        ERR_CONSTR0("#Q##Gnew()"),
-        ERR_CONSTR1("#Q##Gnew(X)");
+        ERR_SUPER("#Q::#Gsuper"),
+        ERR_METH0("#Q::#Gm()"),
+        ERR_METH1("#Q::#Gm(X)"),
+        ERR_CONSTR0("#Q::#Gnew()"),
+        ERR_CONSTR1("#Q::#Gnew(X)");
 
         String referenceTemplate;
 
@@ -110,6 +110,8 @@
         METHOD("m()"),
         FIELD("a.f"),
         UBOUND_SIMPLE("A"),
+        UNBOUND_ARRAY1("int[]"),
+        UNBOUND_ARRAY2("A<G>[][]"),
         UNBOUND_GENERIC1("A<X>"),
         UNBOUND_GENERIC2("A<X, Y>"),
         UNBOUND_GENERIC3("A<? extends X, ? super Y>"),
@@ -125,7 +127,7 @@
     }
 
     enum ExprKind {
-        NONE("#R#S"),
+        NONE("#R::S"),
         SINGLE_PAREN1("(#R#S)"),
         SINGLE_PAREN2("(#R)#S"),
         DOUBLE_PAREN1("((#R#S))"),
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/TestInvokeDynamic.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,442 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7194586
+ *
+ * @summary Add back-end support for invokedynamic
+ *
+ */
+
+import com.sun.source.tree.MethodInvocationTree;
+import com.sun.source.tree.MethodTree;
+import com.sun.source.util.TaskEvent;
+import com.sun.source.util.TaskListener;
+import com.sun.source.util.TreeScanner;
+
+import com.sun.tools.classfile.Attribute;
+import com.sun.tools.classfile.BootstrapMethods_attribute;
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.Code_attribute;
+import com.sun.tools.classfile.ConstantPool.*;
+import com.sun.tools.classfile.Instruction;
+import com.sun.tools.classfile.Method;
+
+import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.api.JavacTool;
+import com.sun.tools.javac.code.Symbol;
+import com.sun.tools.javac.code.Symbol.MethodSymbol;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.jvm.Pool;
+import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
+import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
+import com.sun.tools.javac.tree.JCTree.JCIdent;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.Names;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+
+import javax.tools.Diagnostic;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+
+import static com.sun.tools.javac.jvm.ClassFile.*;
+
+public class TestInvokeDynamic {
+
+    static int checkCount = 0;
+
+    enum StaticArgumentKind {
+        STRING("Hello!", "String", "Ljava/lang/String;") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_String_info) &&
+                        ((CONSTANT_String_info)cpInfo).getString().equals(value);
+            }
+        },
+        CLASS(null, "Class<?>", "Ljava/lang/Class;") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_Class_info) &&
+                        ((CONSTANT_Class_info)cpInfo).getName().equals("java/lang/String");
+            }
+        },
+        INTEGER(1, "int", "I") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_Integer_info) &&
+                        ((CONSTANT_Integer_info)cpInfo).value == ((Integer)value).intValue();
+            }
+        },
+        LONG(1L, "long", "J") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_Long_info) &&
+                        ((CONSTANT_Long_info)cpInfo).value == ((Long)value).longValue();
+            }
+        },
+        FLOAT(1.0f, "float", "F") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_Float_info) &&
+                        ((CONSTANT_Float_info)cpInfo).value == ((Float)value).floatValue();
+            }
+        },
+        DOUBLE(1.0, "double","D") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_Double_info) &&
+                        ((CONSTANT_Double_info)cpInfo).value == ((Double)value).doubleValue();
+            }
+        },
+        METHOD_HANDLE(null, "MethodHandle", "Ljava/lang/invoke/MethodHandle;") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                if (!(cpInfo instanceof CONSTANT_MethodHandle_info)) return false;
+                CONSTANT_MethodHandle_info handleInfo = (CONSTANT_MethodHandle_info)cpInfo;
+                return handleInfo.getCPRefInfo().getClassName().equals("Array") &&
+                        handleInfo.reference_kind == RefKind.REF_invokeVirtual &&
+                        handleInfo.getCPRefInfo().getNameAndTypeInfo().getName().equals("clone") &&
+                        handleInfo.getCPRefInfo().getNameAndTypeInfo().getType().equals("()Ljava/lang/Object;");
+            }
+        },
+        METHOD_TYPE(null, "MethodType", "Ljava/lang/invoke/MethodType;") {
+            @Override
+            boolean check(CPInfo cpInfo) throws Exception {
+                return (cpInfo instanceof CONSTANT_MethodType_info) &&
+                        ((CONSTANT_MethodType_info)cpInfo).getType().equals("()Ljava/lang/Object;");
+            }
+        };
+
+        Object value;
+        String sourceTypeStr;
+        String bytecodeTypeStr;
+
+        StaticArgumentKind(Object value, String sourceTypeStr, String bytecodeTypeStr) {
+            this.value = value;
+            this.sourceTypeStr = sourceTypeStr;
+            this.bytecodeTypeStr = bytecodeTypeStr;
+        }
+
+        abstract boolean check(CPInfo cpInfo) throws Exception;
+
+        Object getValue(Symtab syms, Names names) {
+            switch (this) {
+                case STRING:
+                case INTEGER:
+                case LONG:
+                case FLOAT:
+                case DOUBLE:
+                    return value;
+                case CLASS:
+                    return syms.stringType.tsym;
+                case METHOD_HANDLE:
+                    return new Pool.MethodHandle(REF_invokeVirtual, syms.arrayCloneMethod);
+                case METHOD_TYPE:
+                    return syms.arrayCloneMethod.type;
+                default:
+                    throw new AssertionError();
+            }
+        }
+    }
+
+    enum StaticArgumentsArity {
+        ZERO(0),
+        ONE(1),
+        TWO(2),
+        THREE(3);
+
+        int arity;
+
+        StaticArgumentsArity(int arity) {
+            this.arity = arity;
+        }
+    }
+
+    public static void main(String... args) throws Exception {
+        // Create a single file manager and compiler and reuse it for each compile to save time.
+        StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
+        final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
+        for (StaticArgumentsArity arity : StaticArgumentsArity.values()) {
+            if (arity.arity == 0) {
+                new TestInvokeDynamic(arity).compileAndCheck(fm, tool);
+            } else {
+                for (StaticArgumentKind sak1 : StaticArgumentKind.values()) {
+                    if (arity.arity == 1) {
+                        new TestInvokeDynamic(arity, sak1).compileAndCheck(fm, tool);
+                    } else {
+                        for (StaticArgumentKind sak2 : StaticArgumentKind.values()) {
+                            if (arity.arity == 2) {
+                                new TestInvokeDynamic(arity, sak1, sak2).compileAndCheck(fm, tool);
+                            } else {
+                                for (StaticArgumentKind sak3 : StaticArgumentKind.values()) {
+                                    new TestInvokeDynamic(arity, sak1, sak2, sak3).compileAndCheck(fm, tool);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        System.out.println("Total checks made: " + checkCount);
+    }
+
+    StaticArgumentsArity arity;
+    StaticArgumentKind[] saks;
+    JavaSource source;
+    DiagChecker dc;
+
+    TestInvokeDynamic(StaticArgumentsArity arity, StaticArgumentKind... saks) {
+        this.arity = arity;
+        this.saks = saks;
+        source = new JavaSource();
+        dc = new DiagChecker();
+    }
+
+    void compileAndCheck(JavaFileManager fm, JavaCompiler tool) throws Exception {
+        JavacTaskImpl ct = (JavacTaskImpl)tool.getTask(null, fm, dc,
+                null, null, Arrays.asList(source));
+        Context context = ct.getContext();
+        Symtab syms = Symtab.instance(context);
+        Names names = Names.instance(context);
+        ct.addTaskListener(new Indifier(syms, names));
+        try {
+            ct.generate();
+        } catch (Throwable t) {
+            t.printStackTrace();
+            throw new AssertionError(String.format("Error thrown when compiling following code\n%s", source.source));
+        }
+        if (dc.diagFound) {
+            throw new AssertionError(String.format("Diags found when compiling following code\n%s\n\n%s", source.source, dc.printDiags()));
+        }
+        verifyBytecode();
+    }
+
+    void verifyBytecode() {
+        File compiledTest = new File("Test.class");
+        try {
+            ClassFile cf = ClassFile.read(compiledTest);
+            Method testMethod = null;
+            for (Method m : cf.methods) {
+                if (m.getName(cf.constant_pool).equals("test")) {
+                    testMethod = m;
+                    break;
+                }
+            }
+            if (testMethod == null) {
+                throw new Error("Test method not found");
+            }
+            Code_attribute ea = (Code_attribute)testMethod.attributes.get(Attribute.Code);
+            if (testMethod == null) {
+                throw new Error("Code attribute for test() method not found");
+            }
+
+            int bsmIdx = -1;
+
+            for (Instruction i : ea.getInstructions()) {
+                if (i.getMnemonic().equals("invokedynamic")) {
+                    CONSTANT_InvokeDynamic_info indyInfo =
+                            (CONSTANT_InvokeDynamic_info)cf.constant_pool.get(i.getShort(1));
+                    bsmIdx = indyInfo.bootstrap_method_attr_index;
+                    if (!indyInfo.getNameAndTypeInfo().getType().equals("()V")) {
+                        throw new AssertionError("type mismatch for CONSTANT_InvokeDynamic_info");
+                    }
+                }
+            }
+            if (bsmIdx == -1) {
+                throw new Error("Missing invokedynamic in generated code");
+            }
+
+            BootstrapMethods_attribute bsm_attr = (BootstrapMethods_attribute)cf.getAttribute(Attribute.BootstrapMethods);
+            if (bsm_attr.bootstrap_method_specifiers.length != 1) {
+                throw new Error("Bad number of method specifiers in BootstrapMethods attribute");
+            }
+            BootstrapMethods_attribute.BootstrapMethodSpecifier bsm_spec =
+                    bsm_attr.bootstrap_method_specifiers[0];
+
+            if (bsm_spec.bootstrap_arguments.length != arity.arity) {
+                throw new Error("Bad number of static invokedynamic args in BootstrapMethod attribute");
+            }
+
+            int count = 0;
+            for (StaticArgumentKind sak : saks) {
+                if (!sak.check(cf.constant_pool.get(bsm_spec.bootstrap_arguments[count]))) {
+                    throw new Error("Bad static argument value " + sak);
+                }
+                count++;
+            }
+
+            CONSTANT_MethodHandle_info bsm_handle =
+                    (CONSTANT_MethodHandle_info)cf.constant_pool.get(bsm_spec.bootstrap_method_ref);
+
+            if (bsm_handle.reference_kind != RefKind.REF_invokeStatic) {
+                throw new Error("Bad kind on boostrap method handle");
+            }
+
+            CONSTANT_Methodref_info bsm_ref =
+                    (CONSTANT_Methodref_info)cf.constant_pool.get(bsm_handle.reference_index);
+
+            if (!bsm_ref.getClassInfo().getName().equals("Bootstrap")) {
+                throw new Error("Bad owner of boostrap method");
+            }
+
+            if (!bsm_ref.getNameAndTypeInfo().getName().equals("bsm")) {
+                throw new Error("Bad boostrap method name");
+            }
+
+            if (!bsm_ref.getNameAndTypeInfo().getType().equals(asBSMSignatureString())) {
+                throw new Error("Bad boostrap method type" + bsm_ref.getNameAndTypeInfo().getType() + " " + asBSMSignatureString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new Error("error reading " + compiledTest +": " + e);
+        }
+    }
+
+    String asBSMSignatureString() {
+        StringBuilder buf = new StringBuilder();
+        buf.append("(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;");
+        for (StaticArgumentKind sak : saks) {
+            buf.append(sak.bytecodeTypeStr);
+        }
+        buf.append(")Ljava/lang/invoke/CallSite;");
+        return buf.toString();
+    }
+
+    class JavaSource extends SimpleJavaFileObject {
+
+        static final String source_template = "import java.lang.invoke.*;\n" +
+                "class Bootstrap {\n" +
+                "   public static CallSite bsm(MethodHandles.Lookup lookup, String name, MethodType methodType #SARGS) {\n" +
+                "       return null;\n" +
+                "   }\n" +
+                "}\n" +
+                "class Test {\n" +
+                "   void m() { }\n" +
+                "   void test() { m(); }\n" +
+                "}";
+
+        String source;
+
+        JavaSource() {
+            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
+            source = source_template.replace("#SARGS", asSignatureString());
+        }
+
+        @Override
+        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+            return source;
+        }
+
+        String asSignatureString() {
+            int count = 0;
+            StringBuilder buf = new StringBuilder();
+            for (StaticArgumentKind sak : saks) {
+                buf.append(",");
+                buf.append(sak.sourceTypeStr);
+                buf.append(' ');
+                buf.append(String.format("x%d", count++));
+            }
+            return buf.toString();
+        }
+    }
+
+    class Indifier extends TreeScanner<Void, Void> implements TaskListener {
+
+        MethodSymbol bsm;
+        Symtab syms;
+        Names names;
+
+        Indifier(Symtab syms, Names names) {
+            this.syms = syms;
+            this.names = names;
+        }
+
+        @Override
+        public void started(TaskEvent e) {
+            //do nothing
+        }
+
+        @Override
+        public void finished(TaskEvent e) {
+            if (e.getKind() == TaskEvent.Kind.ANALYZE) {
+                scan(e.getCompilationUnit(), null);
+            }
+        }
+
+        @Override
+        public Void visitMethodInvocation(MethodInvocationTree node, Void p) {
+            super.visitMethodInvocation(node, p);
+            JCMethodInvocation apply = (JCMethodInvocation)node;
+            JCIdent ident = (JCIdent)apply.meth;
+            Symbol oldSym = ident.sym;
+            if (!oldSym.isConstructor()) {
+                Object[] staticArgs = new Object[arity.arity];
+                for (int i = 0; i < arity.arity ; i++) {
+                    staticArgs[i] = saks[i].getValue(syms, names);
+                }
+                ident.sym = new Symbol.DynamicMethodSymbol(oldSym.name, oldSym.owner, REF_invokeStatic, bsm, oldSym.type, staticArgs);
+            }
+            return null;
+        }
+
+        @Override
+        public Void visitMethod(MethodTree node, Void p) {
+            super.visitMethod(node, p);
+            if (node.getName().toString().equals("bsm")) {
+                bsm = ((JCMethodDecl)node).sym;
+            }
+            return null;
+        }
+    }
+
+    static class DiagChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
+
+        boolean diagFound;
+        ArrayList<String> diags = new ArrayList<>();
+
+        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
+            diags.add(diagnostic.getMessage(Locale.getDefault()));
+            diagFound = true;
+        }
+
+        String printDiags() {
+            StringBuilder buf = new StringBuilder();
+            for (String s : diags) {
+                buf.append(s);
+                buf.append("\n");
+            }
+            return buf.toString();
+        }
+    }
+}
--- a/langtools/test/tools/javac/positions/T6264029.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/positions/T6264029.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,3 +1,2 @@
-T6264029.java:15:19: compiler.warn.unchecked.call.mbr.of.raw.type: T6264029A(K), T6264029A
 T6264029.java:15:41: compiler.warn.unchecked.call.mbr.of.raw.type: T6264029A(K), T6264029A
-2 warnings
+1 warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/T7196462.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7196462
+ * @summary JavacProcessingEnvironment should tolerate BasicJavacTask
+ * @library ../lib
+ * @build JavacTestingAbstractProcessor T7196462
+ * @compile/process -processor T7196462 T7196462.java
+ */
+
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import com.sun.source.util.*;
+
+public class T7196462 extends JavacTestingAbstractProcessor {
+    public boolean process(Set<? extends TypeElement> annos,RoundEnvironment rEnv) {
+        JavacTask t = JavacTask.instance(processingEnv);
+        System.err.println(t);
+        return true;
+    }
+}
--- a/langtools/test/tools/javac/quid/T6999438.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/quid/T6999438.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,4 +1,4 @@
-T6999438.java:8:8: compiler.err.expected: token.identifier
+T6999438.java:8:9: compiler.err.illegal.char: 35
 T6999438.java:8:10: compiler.err.illegal.start.of.type
 T6999438.java:8:25: compiler.err.expected: token.identifier
 T6999438.java:8:26: compiler.err.expected: ';'
--- a/langtools/test/tools/javac/typeAnnotations/newlocations/BasicTest.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/typeAnnotations/newlocations/BasicTest.out	Wed Jul 05 18:26:11 2017 +0200
@@ -9,13 +9,9 @@
 BasicTest.java:52:22: compiler.err.illegal.start.of.expr
 BasicTest.java:52:31: compiler.err.expected: ';'
 BasicTest.java:52:37: compiler.err.expected: token.identifier
-BasicTest.java:53:21: compiler.err.illegal.start.of.expr
-BasicTest.java:53:23: compiler.err.expected: ';'
 BasicTest.java:53:30: compiler.err.expected: token.identifier
-BasicTest.java:53:32: compiler.err.illegal.start.of.type
-BasicTest.java:53:37: compiler.err.expected: token.identifier
-BasicTest.java:53:38: compiler.err.expected: ';'
-BasicTest.java:56:17: compiler.err.expected: token.identifier
+BasicTest.java:53:32: compiler.err.lambda.not.supported.in.source: 1.8
+BasicTest.java:53:31: compiler.err.expected: ->
 BasicTest.java:56:23: compiler.err.expected: token.identifier
 BasicTest.java:56:24: compiler.err.expected2: '(', '['
 BasicTest.java:56:25: compiler.err.expected: ';'
@@ -63,4 +59,4 @@
 BasicTest.java:74:25: compiler.err.illegal.start.of.type
 BasicTest.java:74:33: compiler.err.expected: ';'
 BasicTest.java:77:2: compiler.err.premature.eof
-65 errors
+61 errors
--- a/langtools/test/tools/javac/varargs/6313164/T6313164.out	Wed Jul 05 18:25:14 2017 +0200
+++ b/langtools/test/tools/javac/varargs/6313164/T6313164.out	Wed Jul 05 18:26:11 2017 +0200
@@ -1,4 +1,4 @@
-T6313164.java:12:8: compiler.err.cant.apply.symbol.1: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
+T6313164.java:12:8: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
 T6313164.java:14:13: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
 T6313164.java:15:13: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164)
 - compiler.note.unchecked.filename: B.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/varargs/6313164/T7175433.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2012, 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.
+ */
+
+/*
+ * @test
+ * @bug 7175433 6313164
+ * @summary Inference cleanup: add helper class to handle inference variables
+ *
+ */
+
+import java.util.List;
+
+class Bar {
+
+    private class Foo { }
+
+    <Z> List<Z> m(Object... o) { T7175433.assertTrue(true); return null; }
+    <Z> List<Z> m(Foo... o) { T7175433.assertTrue(false); return null; }
+
+    Foo getFoo() { return null; }
+}
+
+public class T7175433 {
+
+    static int assertionCount;
+
+    static void assertTrue(boolean b) {
+        assertionCount++;
+        if (!b) {
+            throw new AssertionError();
+        }
+    }
+
+    public static void main(String[] args) {
+        Bar b = new Bar();
+        b.m(b.getFoo());
+        assertTrue(assertionCount == 1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/T4696488.java	Wed Jul 05 18:26:11 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2012, 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 com.sun.tools.doclets.internal.toolkit.Configuration;
+
+/**
+ * @test
+ * @bug     4696488
+ * @summary javadoc doesn't handle UNC paths for destination directory
+ * @author  Jesse Glick
+ * @run main T4696488 T4696488.java
+ */
+public class T4696488 {
+
+    public static void main(String... args) {
+        System.setProperty("file.separator", "/");
+        assertAddTrailingFileSep("/path/to/dir", "/path/to/dir/");
+        assertAddTrailingFileSep("/path/to/dir/", "/path/to/dir/");
+        assertAddTrailingFileSep("/path/to/dir//", "/path/to/dir/");
+        System.setProperty("file.separator", "\\");
+        assertAddTrailingFileSep("C:\\path\\to\\dir", "C:\\path\\to\\dir\\");
+        assertAddTrailingFileSep("C:\\path\\to\\dir\\", "C:\\path\\to\\dir\\");
+        assertAddTrailingFileSep("C:\\path\\to\\dir\\\\", "C:\\path\\to\\dir\\");
+        assertAddTrailingFileSep("\\\\server\\share\\path\\to\\dir", "\\\\server\\share\\path\\to\\dir\\");
+        assertAddTrailingFileSep("\\\\server\\share\\path\\to\\dir\\", "\\\\server\\share\\path\\to\\dir\\");
+        assertAddTrailingFileSep("\\\\server\\share\\path\\to\\dir\\\\", "\\\\server\\share\\path\\to\\dir\\");
+    }
+
+    private static void assertAddTrailingFileSep(String input, String expectedOutput) {
+        String output = Configuration.addTrailingFileSep(input);
+        if (!expectedOutput.equals(output)) {
+            throw new Error("expected " + expectedOutput + " but was " + output);
+        }
+    }
+
+}