diff --git a/.hgtags b/.hgtags index d58e898362d..c8a158f5305 100644 --- a/.hgtags +++ b/.hgtags @@ -466,3 +466,4 @@ d8c634b016c628622c9abbdc6bf50509e5dedbec jdk-10+35 e569e83139fdfbecfeb3cd9014d560917787f158 jdk-10+38 5b834ec962366e00d4445352a999a3ac14e26f64 jdk-10+39 860326263d1f6a83996d7da0f4c66806ae4aa1eb jdk-10+40 +3eae36c6baa5f916a3024cf1513e22357e00185d jdk-10+41 diff --git a/make/data/tzdata/VERSION b/make/data/tzdata/VERSION index 66429083107..561bd27bce5 100644 --- a/make/data/tzdata/VERSION +++ b/make/data/tzdata/VERSION @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2017c +tzdata2018c diff --git a/make/data/tzdata/africa b/make/data/tzdata/africa index 10d4dfaabbc..92c0b43ecf0 100644 --- a/make/data/tzdata/africa +++ b/make/data/tzdata/africa @@ -181,7 +181,6 @@ Link Africa/Abidjan Africa/Freetown # Sierra Leone Link Africa/Abidjan Africa/Lome # Togo Link Africa/Abidjan Africa/Nouakchott # Mauritania Link Africa/Abidjan Africa/Ouagadougou # Burkina Faso -Link Africa/Abidjan Africa/Sao_Tome # São Tomé and Príncipe Link Africa/Abidjan Atlantic/St_Helena # St Helena # Djibouti @@ -448,7 +447,7 @@ Link Africa/Nairobi Indian/Mayotte # # The Nautical Almanac for the Year 1970, p 264, is the source for -0:44:30. # -# In 1972 Liberia was the last country to switch from a UTC offset +# In 1972 Liberia was the last country to switch from a UT offset # that was not a multiple of 15 or 20 minutes. The 1972 change was on # 1972-01-07, according to an entry dated 1972-01-04 on p 330 of: # Presidential Papers: First year of the administration of @@ -1060,6 +1059,19 @@ Zone Indian/Reunion 3:41:52 - LMT 1911 Jun # Saint-Denis # Inaccessible, Nightingale: uninhabited # São Tomé and Príncipe + +# From Steffen Thorsen (2018-01-08): +# Multiple sources tell that São Tomé changed from UTC to UTC+1 as +# they entered the year 2018. +# From Michael Deckers (2018-01-08): +# the switch is from 01:00 to 02:00 ... [Decree No. 25/2017] +# http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017 + +Zone Africa/Sao_Tome 0:26:56 - LMT 1884 + -0:36:45 - LMT 1912 # Lisbon Mean Time + 0:00 - GMT 2018 Jan 1 01:00 + 1:00 - WAT + # Senegal # See Africa/Abidjan. diff --git a/make/data/tzdata/asia b/make/data/tzdata/asia index 71f5d0cfc83..c281ece84de 100644 --- a/make/data/tzdata/asia +++ b/make/data/tzdata/asia @@ -73,7 +73,7 @@ # 9:00 KST KDT Korea when at +09 # 9:30 ACST Australian Central Standard Time # Otherwise, these tables typically use numeric abbreviations like +03 -# and +0330 for integer hour and minute UTC offsets. Although earlier +# and +0330 for integer hour and minute UT offsets. Although earlier # editions invented alphabetic time zone abbreviations for every # offset, this did not reflect common practice. # @@ -670,17 +670,17 @@ Zone Asia/Hong_Kong 7:36:42 - LMT 1904 Oct 30 # time", in which abolished the adoption of Western Standard Time in # western islands (listed above), which means the whole Japan # territory, including later occupations, adopt Japan Central Time -# (UTC+9). The adoption began on Oct 1, 1937. The original text can +# (UT+9). The adoption began on Oct 1, 1937. The original text can # be found on Wikisource: # https://ja.wikisource.org/wiki/明治二十八年勅令第百六十七號標準時ニ關スル件中改正ノ件 # -# That is, the time zone of Taipei switched to UTC+9 on Oct 1, 1937. +# That is, the time zone of Taipei switched to UT+9 on Oct 1, 1937. # From Yu-Cheng Chuang (2014-07-02): -# I've found more evidence about when the time zone was switched from UTC+9 -# back to UTC+8 after WW2. I believe it was on Sep 21, 1945. In a document +# I've found more evidence about when the time zone was switched from UT+9 +# back to UT+8 after WW2. I believe it was on Sep 21, 1945. In a document # during Japanese era [1] in which the officer told the staff to change time -# zone back to Western Standard Time (UTC+8) on Sep 21. And in another +# zone back to Western Standard Time (UT+8) on Sep 21. And in another # history page of National Cheng Kung University [2], on Sep 21 there is a # note "from today, switch back to Western Standard Time". From these two # materials, I believe that the time zone change happened on Sep 21. And @@ -1487,17 +1487,17 @@ Zone Asia/Jerusalem 2:20:54 - LMT 1880 # of the Japanese wanted to scrap daylight-saving time, as opposed to 30% who # wanted to keep it.) -# From Paul Eggert (2006-03-22): -# Shanks & Pottenger write that DST in Japan during those years was as follows: +# From Takayuki Nikai (2018-01-19): +# The source of information is Japanese law. +# http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/00219480428029.htm +# http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/00719500331039.htm +# ... In summary, it is written as follows. From 24:00 on the first Saturday +# in May, until 0:00 on the day after the second Saturday in September. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S -Rule Japan 1948 only - May Sun>=1 2:00 1:00 D -Rule Japan 1948 1951 - Sep Sat>=8 2:00 0 S -Rule Japan 1949 only - Apr Sun>=1 2:00 1:00 D -Rule Japan 1950 1951 - May Sun>=1 2:00 1:00 D -# but the only locations using it (for birth certificates, presumably, since -# their audience is astrologers) were US military bases. For now, assume -# that for most purposes daylight-saving time was observed; otherwise, what -# would have been the point of the 1951 poll? +Rule Japan 1948 only - May Sat>=1 24:00 1:00 D +Rule Japan 1948 1951 - Sep Sun>=9 0:00 0 S +Rule Japan 1949 only - Apr Sat>=1 24:00 1:00 D +Rule Japan 1950 1951 - May Sat>=1 24:00 1:00 D # From Hideyuki Suzuki (1998-11-09): # 'Tokyo' usually stands for the former location of Tokyo Astronomical @@ -1528,7 +1528,7 @@ Rule Japan 1950 1951 - May Sun>=1 2:00 1:00 D # # ...the Showa Emperor announced Ordinance No. 529 of Showa Year 12 ... which # means the whole Japan territory, including later occupations, adopt Japan -# Central Time (UTC+9). The adoption began on Oct 1, 1937. +# Central Time (UT+9). The adoption began on Oct 1, 1937. # https://ja.wikisource.org/wiki/明治二十八年勅令第百六十七號標準時ニ關スル件中改正ノ件 # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -2089,8 +2089,8 @@ Zone Asia/Kuching 7:21:20 - LMT 1926 Mar # Maldives # Zone NAME GMTOFF RULES FORMAT [UNTIL] -Zone Indian/Maldives 4:54:00 - LMT 1880 # Male - 4:54:00 - MMT 1960 # Male Mean Time +Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé + 4:54:00 - MMT 1960 # Malé Mean Time 5:00 - +05 # Mongolia diff --git a/make/data/tzdata/australasia b/make/data/tzdata/australasia index 6726ef33816..f97957d3b0a 100644 --- a/make/data/tzdata/australasia +++ b/make/data/tzdata/australasia @@ -706,8 +706,8 @@ Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct # Honiara # From Steffen Thorsen (2012-07-25) # ... we double checked by calling hotels and offices based in Tokelau asking # about the time there, and they all told a time that agrees with UTC+13.... -# Shanks says UTC-10 from 1901 [but] ... there is a good chance the change -# actually was to UTC-11 back then. +# Shanks says UT-10 from 1901 [but] ... there is a good chance the change +# actually was to UT-11 back then. # # From Paul Eggert (2012-07-25) # A Google Books snippet of Appendix to the Journals of the House of @@ -1473,7 +1473,7 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901 # # From Paul Eggert (2006-03-22): # The Department of Internal Affairs (DIA) maintains a brief history, -# as does Carol Squires; see tz-link.htm for the full references. +# as does Carol Squires; see tz-link.html for the full references. # Use these sources in preference to Shanks & Pottenger. # # For Chatham, IATA SSIM (1991/1999) gives the NZ rules but with diff --git a/make/data/tzdata/europe b/make/data/tzdata/europe index 6359279d2fa..1565814a3e3 100644 --- a/make/data/tzdata/europe +++ b/make/data/tzdata/europe @@ -91,14 +91,15 @@ # 0:00 WET WEST WEMT Western Europe # 0:19:32.13 AMT* NST* Amsterdam, Netherlands Summer (1835-1937) # 1:00 BST British Standard (1968-1971) +# 1:00 IST GMT Irish Standard (1968-) with winter DST # 1:00 CET CEST CEMT Central Europe # 1:00:14 SET Swedish (1879-1899) # 1:36:34 RMT* LST* Riga, Latvian Summer (1880-1926)* # 2:00 EET EEST Eastern Europe # 3:00 MSK MSD MDST* Moscow -# From Peter Ilieve (1994-12-04), -# The original six [EU members]: Belgium, France, (West) Germany, Italy, +# From Peter Ilieve (1994-12-04), re EEC/EC/EU members: +# The original six: Belgium, France, (West) Germany, Italy, # Luxembourg, the Netherlands. # Plus, from 1 Jan 73: Denmark, Ireland, United Kingdom. # Plus, from 1 Jan 81: Greece. @@ -301,16 +302,31 @@ # The following claim by Shanks & Pottenger is possible though doubtful; # we'll ignore it for now. # * Dublin's 1971-10-31 switch was at 02:00, even though London's was 03:00. + +# From Paul Eggert (2017-12-04): # -# -# Whitman says Dublin Mean Time was -0:25:21, which is more precise than -# Shanks & Pottenger. -# Perhaps this was Dunsink Observatory Time, as Dunsink Observatory -# (8 km NW of Dublin's center) seemingly was to Dublin as Greenwich was -# to London. For example: +# Dunsink Observatory (8 km NW of Dublin's center) was to Dublin as +# Greenwich was to London. For example: # # "Timeball on the ballast office is down. Dunsink time." # -- James Joyce, Ulysses +# +# The abbreviation DMT stood for "Dublin Mean Time" or "Dunsink Mean Time"; +# this being Ireland, opinions differed. +# +# Whitman says Dublin/Dunsink Mean Time was UT-00:25:21, which agrees +# with measurements of recent visitors to the Meridian Room of Dunsink +# Observatory; see Malone D. Dunsink and timekeeping. 2016-01-24. +# . Malone +# writes that the Nautical Almanac listed UT-00:25:22 until 1896, when +# it moved to UT-00:25:21.1 (I confirmed that the 1893 edition used +# the former and the 1896 edition used the latter). Evidently the +# news of this change propagated slowly, as Milne 1899 still lists +# UT-00:25:22 and cites the International Telegraph Bureau. As it is +# not clear that there was any practical significance to the change +# from UT-00:25:22 to UT-00:25:21.1 in civil timekeeping, omit this +# transition for now and just use the latter value, omitting its +# fraction since our format cannot represent fractions. # "Countess Markievicz ... claimed that the [1916] abolition of Dublin Mean Time # was among various actions undertaken by the 'English' government that @@ -370,12 +386,28 @@ # regulations. I spoke this morning with the Secretary of the Department of # Justice (tel +353 1 678 9711) who confirmed to me that the correct name is # "Irish Summer Time", abbreviated to "IST". +# +# From Paul Eggert (2017-12-07): +# The 1996 anonymous contributor's goal was to determine the correct +# abbreviation for summer time in Dublin and so the contributor +# focused on the "IST", not on the "Irish Summer Time". Though the +# "IST" was correct, the "Irish Summer Time" appears to have been an +# error, as Ireland's Standard Time (Amendment) Act, 1971 states that +# standard time in Ireland remains at UT +01 and is observed in +# summer, and that Greenwich mean time is observed in winter. (Thanks +# to Derick Rethans for pointing out the error.) That is, when +# Ireland amended the 1968 act that established UT +01 as Irish +# Standard Time, it left standard time unchanged and established GMT +# as a negative daylight saving time in winter. So, in this database +# IST stands for Irish Summer Time for timestamps before 1968, and for +# Irish Standard Time after that. See: +# http://www.irishstatutebook.ie/eli/1971/act/17/enacted/en/print # Michael Deckers (2017-06-01) gave the following URLs for Ireland's # Summer Time Act, 1925 and Summer Time Orders, 1926 and 1947: -# http://www.irishstatutebook.ie/eli/1925/act/8/enacted/en/print.html -# http://www.irishstatutebook.ie/eli/1926/sro/919/made/en/print.html -# http://www.irishstatutebook.ie/eli/1947/sro/71/made/en/print.html +# http://www.irishstatutebook.ie/eli/1925/act/8/enacted/en/print +# http://www.irishstatutebook.ie/eli/1926/sro/919/made/en/print +# http://www.irishstatutebook.ie/eli/1947/sro/71/made/en/print # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Summer Time Act, 1916 @@ -499,9 +531,23 @@ Link Europe/London Europe/Jersey Link Europe/London Europe/Guernsey Link Europe/London Europe/Isle_of_Man +# From Paul Eggert (2018-01-19): +# The following is like GB-Eire and EU, except with standard time in +# summer and negative daylight saving time in winter. +# Although currently commented out, this will need to become uncommented +# once the ICU/OpenJDK workaround is removed; see below. +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +#Rule Eire 1971 only - Oct 31 2:00u -1:00 GMT +#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 IST +#Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 GMT +#Rule Eire 1981 max - Mar lastSun 1:00u 0 IST +#Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 GMT +#Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 GMT +#Rule Eire 1996 max - Oct lastSun 1:00u -1:00 GMT + # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2 - -0:25:21 - DMT 1916 May 21 2:00s # Dublin MT + -0:25:21 - DMT 1916 May 21 2:00s -0:25:21 1:00 IST 1916 Oct 1 2:00s 0:00 GB-Eire %s 1921 Dec 6 # independence 0:00 GB-Eire GMT/IST 1940 Feb 25 2:00s @@ -510,16 +556,33 @@ Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2 0:00 1:00 IST 1947 Nov 2 2:00s 0:00 - GMT 1948 Apr 18 2:00s 0:00 GB-Eire GMT/IST 1968 Oct 27 +# From Paul Eggert (2018-01-18): +# The next line should look like this: +# 1:00 Eire IST/GMT +# However, in January 2018 we discovered that the Eire rules cause +# problems with tests for ICU: +# https://mm.icann.org/pipermail/tz/2018-January/025825.html +# and with tests for OpenJDK: +# https://mm.icann.org/pipermail/tz/2018-January/025822.html +# To work around this problem, use a traditional approximation for +# time stamps after 1971-10-31 02:00 UTC, to give ICU and OpenJDK +# developers breathing room to fix bugs. This approximation has +# correct UTC offsets, but results in tm_isdst flags are the reverse +# of what they should be. This workaround is temporary and should be +# removed reasonably soon. 1:00 - IST 1971 Oct 31 2:00u 0:00 GB-Eire GMT/IST 1996 0:00 EU GMT/IST +# End of workaround for ICU and OpenJDK bugs. + ############################################################################### # Europe -# EU rules are for the European Union, previously known as the EC, EEC, -# Common Market, etc. +# The following rules are for the European Union and for its +# predecessor organization, the European Communities. +# For brevity they are called "EU rules" elsewhere in this file. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule EU 1977 1980 - Apr Sun>=1 1:00u 1:00 S @@ -952,7 +1015,7 @@ Zone Europe/Prague 0:57:44 - LMT 1850 # The page http://www.retsinfo.dk/_GETDOCI_/ACCN/A18930008330-REGL # confirms this, and states that the law was put forth 1893-03-29. # -# The EU treaty with effect from 1973: +# The EU [actually, EEC and Euratom] treaty with effect from 1973: # http://www.retsinfo.dk/_GETDOCI_/ACCN/A19722110030-REGL # # This provoked a new law from 1974 to make possible summer time changes @@ -1008,9 +1071,10 @@ Zone Atlantic/Faroe -0:27:04 - LMT 1908 Jan 11 # Tórshavn # East Greenland and Franz Josef Land, but we don't know their time zones. # My source for this is Wilhelm Dege's book mentioned under Svalbard. # -# From Paul Eggert (2006-03-22): -# Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01, -# and left the EU on 1985-02-01. It therefore should have been using EU +# From Paul Eggert (2017-12-10): +# Greenland joined the European Communities as part of Denmark, +# obtained home rule on 1979-05-01, and left the European Communities +# on 1985-02-01. It therefore should have been using EU # rules at least through 1984. Shanks & Pottenger say Scoresbysund and Godthåb # used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU # rules since at least 1991. Assume EU rules since 1980. @@ -1324,7 +1388,7 @@ Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01 # From Markus Kuhn (1998-09-29): # The German time zone web site by the Physikalisch-Technische # Bundesanstalt contains DST information back to 1916. -# [See tz-link.htm for the URL.] +# [See tz-link.html for the URL.] # From Jörg Schilling (2002-10-23): # In 1945, Berlin was switched to Moscow Summer time (GMT+4) by @@ -1421,7 +1485,7 @@ Zone Europe/Athens 1:34:52 - LMT 1895 Sep 14 1:00 Greece CE%sT 1944 Apr 4 2:00 Greece EE%sT 1981 # Shanks & Pottenger say it switched to C-Eur in 1981; - # go with EU instead, since Greece joined it on Jan 1. + # go with EU rules instead, since Greece joined Jan 1. 2:00 EU EE%sT # Hungary @@ -2120,7 +2184,7 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880 # IATA SSIM (1991/1992) reports that the Azores were at -1:00. # IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00. # Guess that the Azores changed to EU rules in 1992 (since that's when Portugal -# harmonized with the EU), and that they stayed +0:00 that winter. +# harmonized with EU rules), and that they stayed +0:00 that winter. # # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # DSH writes that despite Decree 1,469 (1915), the change to the clocks was not @@ -2795,9 +2859,9 @@ Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14 # # https://regnum.ru/news/society/1957270.html # has some historical data for Altai Krai: -# before 1957: west part on UTC+6, east on UTC+7 -# after 1957: UTC+7 -# since 1995: UTC+6 +# before 1957: west part on UT+6, east on UT+7 +# after 1957: UT+7 +# since 1995: UT+6 # http://barnaul.rusplt.ru/index/pochemu_altajskij_kraj_okazalsja_v_neprivychnom_chasovom_pojase-17648.html # confirms that and provides more details including 1995-05-28 transition date. @@ -3605,6 +3669,17 @@ Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment. # The change is permanent, so this is the new standard time in Turkey. # It takes effect today, which is not much notice. +# From Kıvanç Yazan (2017-10-28): +# Turkey will go back to Daylight Saving Time starting 2018-10. +# http://www.resmigazete.gov.tr/eskiler/2017/10/20171028-5.pdf +# +# From Even Scharning (2017-11-08): +# ... today it was announced that the DST will become "continuous": +# http://www.hurriyet.com.tr/son-dakika-yaz-saati-uygulamasi-surekli-hale-geldi-40637482 +# From Paul Eggert (2017-11-08): +# Although Google Translate misfires on that source, it looks like +# Turkey reversed last month's decision, and so will stay at +03. + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Turkey 1916 only - May 1 0:00 1:00 S Rule Turkey 1916 only - Oct 1 0:00 0 - diff --git a/make/data/tzdata/leapseconds b/make/data/tzdata/leapseconds index 9b4ec9ad474..cc5d9288987 100644 --- a/make/data/tzdata/leapseconds +++ b/make/data/tzdata/leapseconds @@ -80,5 +80,5 @@ Leap 2012 Jun 30 23:59:60 + S Leap 2015 Jun 30 23:59:60 + S Leap 2016 Dec 31 23:59:60 + S -# Updated through IERS Bulletin C54 -# File expires on: 28 June 2018 +# Updated through IERS Bulletin C55 +# File expires on: 28 December 2018 diff --git a/make/data/tzdata/northamerica b/make/data/tzdata/northamerica index 99dcc938fa9..2aa184bc6bf 100644 --- a/make/data/tzdata/northamerica +++ b/make/data/tzdata/northamerica @@ -371,6 +371,18 @@ Zone America/New_York -4:56:02 - LMT 1883 Nov 18 12:03:58 # Nebraska, eastern North Dakota, Oklahoma, eastern South Dakota, # western Tennessee, most of Texas, Wisconsin +# From Paul Eggert (2018-01-07): +# In 1869 the Chicago Astronomical Society contracted with the city to keep +# time. Though delayed by the Great Fire, by 1880 a wire ran from the +# Dearborn Observatory (on the University of Chicago campus) to City Hall, +# which then sent signals to police and fire stations. However, railroads got +# their time signals from the Allegheny Observatory, the Madison Observatory, +# the Ann Arbor Observatory, etc., so their clocks did not agree with each +# other or with the city's official time. The confusion took some years to +# clear up. See: +# Moser M. How Chicago gave America its time zones. Chicago. 2018-01-04. +# http://www.chicagomag.com/city-life/January-2018/How-Chicago-Gave-America-Its-Time-Zones/ + # From Larry M. Smith (2006-04-26) re Wisconsin: # https://docs.legis.wisconsin.gov/statutes/statutes/175.pdf # is currently enforced at the 01:00 time of change. Because the local @@ -1919,7 +1931,7 @@ Zone America/Edmonton -7:33:52 - LMT 1906 Sep # manager of the Creston & District Museum. The article was written in May 2009. # http://www.ilovecreston.com/?p=articles&t=spec&ar=260 # According to the article, Creston has not changed its clocks since June 1918. -# i.e. Creston has been stuck on UTC-7 for 93 years. +# i.e. Creston has been stuck on UT-7 for 93 years. # Dawson Creek, on the other hand, changed its clocks as recently as April 1972. # Unfortunately the exact date for the time change in June 1918 remains diff --git a/make/data/tzdata/southamerica b/make/data/tzdata/southamerica index d15e8344db0..38dd275398f 100644 --- a/make/data/tzdata/southamerica +++ b/make/data/tzdata/southamerica @@ -48,7 +48,7 @@ # https://www.jstor.org/stable/1774359 # # These tables use numeric abbreviations like -03 and -0330 for -# integer hour and minute UTC offsets. Although earlier editions used +# integer hour and minute UT offsets. Although earlier editions used # alphabetic time zone abbreviations, these abbreviations were # invented and did not reflect common practice. @@ -602,7 +602,7 @@ Link America/Curacao America/Aruba # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone America/La_Paz -4:32:36 - LMT 1890 -4:32:36 - CMT 1931 Oct 15 # Calamarca MT - -4:32:36 1:00 BOST 1932 Mar 21 # Bolivia ST + -4:32:36 1:00 BST 1932 Mar 21 # Bolivia ST -4:00 - -04 # Brazil @@ -931,12 +931,25 @@ Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S # [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the # 3rd Feb Sunday. There is an exception on the return date when this is # the Carnival Sunday then the return date will be the next Sunday... -Rule Brazil 2008 max - Oct Sun>=15 0:00 1:00 S +Rule Brazil 2008 2017 - Oct Sun>=15 0:00 1:00 S Rule Brazil 2008 2011 - Feb Sun>=15 0:00 0 - +# Decree 7,584 (2011-10-13) +# added Bahia. Rule Brazil 2012 only - Feb Sun>=22 0:00 0 - +# Decree 7,826 (2012-10-15) +# removed Bahia and added Tocantins. +# Decree 8,112 (2013-09-30) +# removed Tocantins. Rule Brazil 2013 2014 - Feb Sun>=15 0:00 0 - Rule Brazil 2015 only - Feb Sun>=22 0:00 0 - Rule Brazil 2016 2022 - Feb Sun>=15 0:00 0 - +# From Steffen Thorsen (2017-12-18): +# According to many media sources, next year's DST start in Brazil will move to +# the first Sunday of November, and it will stay like that for the years after. +# ... https://www.timeanddate.com/news/time/brazil-delays-dst-2018.html +# From Steffen Thorsen (2017-12-20): +# http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2017/decreto/D9242.htm +Rule Brazil 2018 max - Nov Sun>=1 0:00 1:00 S Rule Brazil 2023 only - Feb Sun>=22 0:00 0 - Rule Brazil 2024 2025 - Feb Sun>=15 0:00 0 - Rule Brazil 2026 only - Feb Sun>=22 0:00 0 - @@ -1091,7 +1104,7 @@ Zone America/Rio_Branco -4:31:12 - LMT 1914 # From Paul Eggert (2015-04-03): # Shanks & Pottenger says America/Santiago introduced standard time in -# 1890 and rounds its UTC offset to 70W40; guess that in practice this +# 1890 and rounds its UT offset to 70W40; guess that in practice this # was the same offset as in 1916-1919. It also says Pacific/Easter # standardized on 109W22 in 1890; assume this didn't change the clocks. # diff --git a/make/data/tzdata/zone.tab b/make/data/tzdata/zone.tab index b1a7f077242..f6d9c667734 100644 --- a/make/data/tzdata/zone.tab +++ b/make/data/tzdata/zone.tab @@ -395,7 +395,7 @@ SM +4355+01228 Europe/San_Marino SN +1440-01726 Africa/Dakar SO +0204+04522 Africa/Mogadishu SR +0550-05510 America/Paramaribo -SS +0451+03136 Africa/Juba +SS +0451+03137 Africa/Juba ST +0020+00644 Africa/Sao_Tome SV +1342-08912 America/El_Salvador SX +180305-0630250 America/Lower_Princes diff --git a/src/hotspot/cpu/ppc/vtableStubs_ppc_64.cpp b/src/hotspot/cpu/ppc/vtableStubs_ppc_64.cpp index 480e3e55fa2..2479e2bae53 100644 --- a/src/hotspot/cpu/ppc/vtableStubs_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/vtableStubs_ppc_64.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2017 SAP SE. All rights reserved. + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,7 +104,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { int v_off = entry_offset + vtableEntry::method_offset_in_bytes(); - __ ld(R19_method, v_off, rcvr_klass); + __ ld(R19_method, (RegisterOrConstant)v_off, rcvr_klass); #ifndef PRODUCT if (DebugVtables) { diff --git a/src/hotspot/cpu/zero/methodHandles_zero.cpp b/src/hotspot/cpu/zero/methodHandles_zero.cpp index b6ae15df6a2..43a55653a31 100644 --- a/src/hotspot/cpu/zero/methodHandles_zero.cpp +++ b/src/hotspot/cpu/zero/methodHandles_zero.cpp @@ -183,3 +183,9 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* return NULL; } } + +#ifndef PRODUCT +void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { + // This is just a stub. +} +#endif //PRODUCT diff --git a/src/hotspot/share/interpreter/bytecodeInterpreter.cpp b/src/hotspot/share/interpreter/bytecodeInterpreter.cpp index 75068b29e85..c2d6fdfe719 100644 --- a/src/hotspot/share/interpreter/bytecodeInterpreter.cpp +++ b/src/hotspot/share/interpreter/bytecodeInterpreter.cpp @@ -2535,13 +2535,35 @@ run: // this could definitely be cleaned up QQQ Method* callee; - Klass* iclass = cache->f1_as_klass(); - // InstanceKlass* interface = (InstanceKlass*) iclass; + Method *interface_method = cache->f2_as_interface_method(); + InstanceKlass* iclass = interface_method->method_holder(); + // get receiver int parms = cache->parameter_size(); oop rcvr = STACK_OBJECT(-parms); CHECK_NULL(rcvr); InstanceKlass* int2 = (InstanceKlass*) rcvr->klass(); + + // Receiver subtype check against resolved interface klass (REFC). + { + Klass* refc = cache->f1_as_klass(); + itableOffsetEntry* scan; + for (scan = (itableOffsetEntry*) int2->start_of_itable(); + scan->interface_klass() != NULL; + scan++) { + if (scan->interface_klass() == refc) { + break; + } + } + // Check that the entry is non-null. A null entry means + // that the receiver class doesn't implement the + // interface, and wasn't the same as when the caller was + // compiled. + if (scan->interface_klass() == NULL) { + VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap); + } + } + itableOffsetEntry* ki = (itableOffsetEntry*) int2->start_of_itable(); int i; for ( i = 0 ; i < int2->itable_length() ; i++, ki++ ) { @@ -2553,7 +2575,8 @@ run: if (i == int2->itable_length()) { VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap); } - int mindex = cache->f2_as_index(); + int mindex = interface_method->itable_index(); + itableMethodEntry* im = ki->first_method_entry(rcvr->klass()); callee = im[mindex].method(); if (callee == NULL) { diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index 59ab59de1df..3f63a3bf6b2 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -1260,6 +1260,10 @@ void OuterStripMinedLoopNode::adjust_strip_mined_loop(PhaseIterGVN* igvn) { assert(inner_cl->is_strip_mined(), "inner loop should be strip mined"); Node* inner_iv_phi = inner_cl->phi(); if (inner_iv_phi == NULL) { + IfNode* outer_le = outer_loop_end(); + Node* iff = igvn->transform(new IfNode(outer_le->in(0), outer_le->in(1), outer_le->_prob, outer_le->_fcnt)); + igvn->replace_node(outer_le, iff); + inner_cl->clear_strip_mined(); return; } CountedLoopEndNode* inner_cle = inner_cl->loopexit(); diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index bcdc58ecf51..df7f652d8ad 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -1036,7 +1036,7 @@ Node *PhaseIdealLoop::place_near_use( Node *useblock ) const { bool PhaseIdealLoop::identical_backtoback_ifs(Node *n) { - if (!n->is_If()) { + if (!n->is_If() || n->is_CountedLoopEnd()) { return false; } if (!n->in(0)->is_Region()) { diff --git a/src/hotspot/share/opto/mathexactnode.cpp b/src/hotspot/share/opto/mathexactnode.cpp index 196dd343e06..dddac5e581e 100644 --- a/src/hotspot/share/opto/mathexactnode.cpp +++ b/src/hotspot/share/opto/mathexactnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,23 +117,33 @@ bool OverflowSubLNode::will_overflow(jlong v1, jlong v2) const { return SubHelper::will_overflow(v1, v2); } -bool OverflowMulLNode::will_overflow(jlong val1, jlong val2) const { - jlong result = val1 * val2; - jlong ax = (val1 < 0 ? -val1 : val1); - jlong ay = (val2 < 0 ? -val2 : val2); - - bool overflow = false; - if ((ax | ay) & CONST64(0xFFFFFFFF00000000)) { - // potential overflow if any bit in upper 32 bits are set - if ((val1 == min_jlong && val2 == -1) || (val2 == min_jlong && val1 == -1)) { - // -1 * Long.MIN_VALUE will overflow - overflow = true; - } else if (val2 != 0 && (result / val2 != val1)) { - overflow = true; - } +bool OverflowMulLNode::is_overflow(jlong val1, jlong val2) { + // x * { 0, 1 } will never overflow. Even for x = min_jlong + if (val1 == 0 || val2 == 0 || val1 == 1 || val2 == 1) { + return false; } - return overflow; + // x * min_jlong for x not in { 0, 1 } overflows + // even -1 as -1 * min_jlong is an overflow + if (val1 == min_jlong || val2 == min_jlong) { + return true; + } + + // if (x * y) / y == x there is no overflow + // + // the multiplication here is done as unsigned to avoid undefined behaviour which + // can be used by the compiler to assume that the check further down (result / val2 != val1) + // is always false and breaks the overflow check + julong v1 = (julong) val1; + julong v2 = (julong) val2; + julong tmp = v1 * v2; + jlong result = (jlong) tmp; + + if (result / val2 != val1) { + return true; + } + + return false; } bool OverflowAddINode::can_overflow(const Type* t1, const Type* t2) const { diff --git a/src/hotspot/share/opto/mathexactnode.hpp b/src/hotspot/share/opto/mathexactnode.hpp index 0c948e3dc34..f807183bce8 100644 --- a/src/hotspot/share/opto/mathexactnode.hpp +++ b/src/hotspot/share/opto/mathexactnode.hpp @@ -129,8 +129,10 @@ public: OverflowMulLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {} virtual int Opcode() const; - virtual bool will_overflow(jlong v1, jlong v2) const; + virtual bool will_overflow(jlong v1, jlong v2) const { return is_overflow(v1, v2); } virtual bool can_overflow(const Type* t1, const Type* t2) const; + + static bool is_overflow(jlong v1, jlong v2); }; #endif diff --git a/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template b/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template index e85fd913406..416c16b3aab 100644 --- a/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template +++ b/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -534,7 +534,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ get(ByteBufferHandle handle, Object obb, int index) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); #if[floatingPoint] $rawType$ rawValue = UNSAFE.get$RawType$Unaligned( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -551,7 +551,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static void set(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); #if[floatingPoint] UNSAFE.put$RawType$Unaligned( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -569,7 +569,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getVolatile(ByteBufferHandle handle, Object obb, int index) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.get$RawType$Volatile( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -578,7 +578,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static void setVolatile(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); UNSAFE.put$RawType$Volatile( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -587,7 +587,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAcquire(ByteBufferHandle handle, Object obb, int index) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.get$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -596,7 +596,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static void setRelease(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); UNSAFE.put$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -605,7 +605,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getOpaque(ByteBufferHandle handle, Object obb, int index) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.get$RawType$Opaque( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -614,7 +614,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static void setOpaque(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); UNSAFE.put$RawType$Opaque( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -624,7 +624,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean compareAndSet(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return UNSAFE.compareAndSet$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -633,7 +633,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ compareAndExchange(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.compareAndExchange$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -643,7 +643,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ compareAndExchangeAcquire(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.compareAndExchange$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -653,7 +653,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ compareAndExchangeRelease(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.compareAndExchange$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -663,7 +663,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean weakCompareAndSetPlain(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return UNSAFE.weakCompareAndSet$RawType$Plain( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -672,7 +672,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean weakCompareAndSet(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return UNSAFE.weakCompareAndSet$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -681,7 +681,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean weakCompareAndSetAcquire(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return UNSAFE.weakCompareAndSet$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -690,7 +690,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean weakCompareAndSetRelease(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return UNSAFE.weakCompareAndSet$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), @@ -699,7 +699,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndSet(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.getAndSet$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -709,7 +709,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndSetAcquire(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.getAndSet$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -719,7 +719,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndSetRelease(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); return convEndian(handle.be, UNSAFE.getAndSet$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -731,7 +731,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndAdd(ByteBufferHandle handle, Object obb, int index, $type$ delta) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndAdd$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -744,7 +744,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndAddAcquire(ByteBufferHandle handle, Object obb, int index, $type$ delta) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndAdd$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -757,7 +757,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndAddRelease(ByteBufferHandle handle, Object obb, int index, $type$ delta) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndAdd$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -785,7 +785,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseOr(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseOr$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -798,7 +798,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseOrRelease(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseOr$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -811,7 +811,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseOrAcquire(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseOr$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -837,7 +837,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseAnd(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseAnd$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -850,7 +850,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseAndRelease(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseAnd$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -863,7 +863,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseAndAcquire(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseAnd$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -890,7 +890,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseXor(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseXor$RawType$( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -903,7 +903,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseXorRelease(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseXor$RawType$Release( UNSAFE.getObject(bb, BYTE_BUFFER_HB), @@ -916,7 +916,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static $type$ getAndBitwiseXorAcquire(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; + ByteBuffer bb = (ByteBuffer) Objects.requireNonNull(obb); if (handle.be == BE) { return UNSAFE.getAndBitwiseXor$RawType$Acquire( UNSAFE.getObject(bb, BYTE_BUFFER_HB), diff --git a/src/java.base/share/classes/java/security/KeyStore.java b/src/java.base/share/classes/java/security/KeyStore.java index fec312740f4..83533472042 100644 --- a/src/java.base/share/classes/java/security/KeyStore.java +++ b/src/java.base/share/classes/java/security/KeyStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1802,11 +1802,11 @@ public class KeyStore { // Load the keystore data if (keystore != null) { + dataStream.reset(); // prepare the stream for loading if (hasPassword) { - dataStream.reset(); // prepare the stream for loading keystore.load(dataStream, password); } else { - keystore.load(param); + keystore.keyStoreSpi.engineLoad(dataStream, param); } return keystore; } diff --git a/src/java.base/share/classes/java/security/KeyStoreSpi.java b/src/java.base/share/classes/java/security/KeyStoreSpi.java index 096a7b48dc1..55f25e8998b 100644 --- a/src/java.base/share/classes/java/security/KeyStoreSpi.java +++ b/src/java.base/share/classes/java/security/KeyStoreSpi.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -395,6 +395,12 @@ public abstract class KeyStoreSpi { public void engineLoad(KeyStore.LoadStoreParameter param) throws IOException, NoSuchAlgorithmException, CertificateException { + engineLoad(null, param); + } + + void engineLoad(InputStream stream, KeyStore.LoadStoreParameter param) + throws IOException, NoSuchAlgorithmException, + CertificateException { if (param == null) { engineLoad((InputStream)null, (char[])null); @@ -425,7 +431,7 @@ public abstract class KeyStoreSpi { throw new NoSuchAlgorithmException("ProtectionParameter must" + " be PasswordProtection or CallbackHandlerProtection"); } - engineLoad(null, password); + engineLoad(stream, password); return; } diff --git a/src/java.base/share/classes/java/time/format/ZoneName.java b/src/java.base/share/classes/java/time/format/ZoneName.java index b76e6949939..9f0a09bd579 100644 --- a/src/java.base/share/classes/java/time/format/ZoneName.java +++ b/src/java.base/share/classes/java/time/format/ZoneName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -411,7 +411,7 @@ class ZoneName { "Pacific/Wake", "Wake", "Pacific/Wake", "Pacific/Pago_Pago", "Samoa", "Pacific/Apia", "America/Moncton", "Atlantic", "America/Halifax", - "Africa/Sao_Tome", "GMT", "Atlantic/Reykjavik", + "Africa/Sao_Tome", "Africa_Western", "Africa/Lagos", "America/Glace_Bay", "Atlantic", "America/Halifax", "Asia/Jakarta", "Indonesia_Western", "Asia/Jakarta", "Africa/Asmera", "Africa_Eastern", "Africa/Nairobi", @@ -494,7 +494,6 @@ class ZoneName { "America/Kralendijk", "Atlantic", "America/Halifax", }; private static final String[] mzoneMap = new String[] { - "GMT", "ST", "Africa/Sao_Tome", "GMT", "ML", "Africa/Bamako", "GMT", "IE", "Europe/Dublin", "GMT", "SN", "Africa/Dakar", @@ -509,6 +508,7 @@ class ZoneName { "GMT", "GB", "Europe/London", "GMT", "LR", "Africa/Monrovia", "GMT", "TG", "Africa/Lome", + "Africa_Western", "ST", "Africa/Sao_Tome", "Africa_Western", "CF", "Africa/Bangui", "Africa_Western", "NE", "Africa/Niamey", "Africa_Western", "CM", "Africa/Douala", diff --git a/src/java.base/share/classes/sun/util/resources/TimeZoneNames.java b/src/java.base/share/classes/sun/util/resources/TimeZoneNames.java index 0636a445760..d95927dd494 100644 --- a/src/java.base/share/classes/sun/util/resources/TimeZoneNames.java +++ b/src/java.base/share/classes/sun/util/resources/TimeZoneNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -370,7 +370,7 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { {"Africa/Nouakchott", GMT}, {"Africa/Ouagadougou", GMT}, {"Africa/Porto-Novo", WAT}, - {"Africa/Sao_Tome", GMT}, + {"Africa/Sao_Tome", WAT}, {"Africa/Timbuktu", GMT}, {"Africa/Tripoli", EET}, {"Africa/Tunis", CET}, diff --git a/src/java.desktop/share/classes/java/awt/Desktop.java b/src/java.desktop/share/classes/java/awt/Desktop.java index f1dc4429af6..beac851c998 100644 --- a/src/java.desktop/share/classes/java/awt/Desktop.java +++ b/src/java.desktop/share/classes/java/awt/Desktop.java @@ -83,6 +83,10 @@ import sun.security.util.SecurityConstants; * application is executed, it will be executed on the same system as * the one on which the Java application was launched. * + *

Note: the methods in the {@code Desktop} class may require + * platform-dependent permissions in addition to those described in the + * specification. + * * @see Action * * @since 1.6 diff --git a/src/java.desktop/share/legal/libpng.md b/src/java.desktop/share/legal/libpng.md index 5619bd1c8bb..d236ad3ae83 100644 --- a/src/java.desktop/share/legal/libpng.md +++ b/src/java.desktop/share/legal/libpng.md @@ -1,4 +1,4 @@ -## libpng v1.6.23 +## libpng v1.6.34 ### libpng License

@@ -14,8 +14,8 @@ this sentence.
 
 This code is released under the libpng license.
 
-libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
-Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
+libpng versions 1.0.7, July 1, 2000 through 1.6.34, September 29, 2017 are
+Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are
 derived from libpng-1.0.6, and are distributed according to the same
 disclaimer and license as libpng-1.0.6 with the following individuals
 added to the list of Contributing Authors:
@@ -26,6 +26,9 @@ added to the list of Contributing Authors:
    Cosmin Truta
    Gilles Vollant
    James Yu
+   Mandar Sahastrabuddhe
+   Google Inc.
+   Vadim Barkov
 
 and with the following additions to the disclaimer:
 
diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XTextAreaPeer.java b/src/java.desktop/unix/classes/sun/awt/X11/XTextAreaPeer.java
index 78107842321..ef0a64995c6 100644
--- a/src/java.desktop/unix/classes/sun/awt/X11/XTextAreaPeer.java
+++ b/src/java.desktop/unix/classes/sun/awt/X11/XTextAreaPeer.java
@@ -630,19 +630,6 @@ final class XTextAreaPeer extends XComponentPeer implements TextAreaPeer {
             super.focusLost(e);
             getComponent().repaint();
         }
-
-        // Fix for 5100950: textarea.getSelectedText() returns the de-selected text, on XToolkit
-        // Restoring Motif behaviour
-        // If the text is unhighlighted then we should sets the selection range to zero
-        @Override
-        public void setSelectionVisible(boolean vis) {
-            if (vis){
-                super.setSelectionVisible(vis);
-            }else{
-                // In order to de-select the selection
-                setDot(getDot());
-            }
-        }
     }
 
     @SuppressWarnings("serial") // JDK-implementation class
diff --git a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java
index 2a35ffb3eb0..eca5957bc0d 100644
--- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java
+++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -307,7 +307,7 @@ class ResponseContent {
 
                 int bytes2return = Math.min(bytesread, unfulfilled);
                 debug.log(Level.DEBUG,  "Returning chunk bytes: %d", bytes2return);
-                returnBuffer = Utils.slice(chunk, bytes2return);
+                returnBuffer = Utils.sliceWithLimitedCapacity(chunk, bytes2return);
                 unfulfilled = bytesremaining -= bytes2return;
                 if (unfulfilled == 0) bytesToConsume = 2;
             }
@@ -439,7 +439,7 @@ class ResponseContent {
                     assert hasDemand;
                     int amount = Math.min(b.remaining(), unfulfilled);
                     unfulfilled = remaining -= amount;
-                    ByteBuffer buffer = Utils.slice(b, amount);
+                    ByteBuffer buffer = Utils.sliceWithLimitedCapacity(b, amount);
                     pusher.onNext(List.of(buffer));
                 }
                 if (unfulfilled == 0) {
diff --git a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java
index a76e838c270..4556c839192 100644
--- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java
+++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java
@@ -767,7 +767,7 @@ class Stream extends ExchangeImpl {
         // blocks waiting for stream send window, if exhausted
         int actualAmount = windowController.tryAcquire(requestAmount, streamid, this);
         if (actualAmount <= 0) return null;
-        ByteBuffer outBuf = Utils.slice(buffer,  actualAmount);
+        ByteBuffer outBuf = Utils.sliceWithLimitedCapacity(buffer,  actualAmount);
         DataFrame df = new DataFrame(streamid, 0 , outBuf);
         return df;
     }
diff --git a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/common/Utils.java b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/common/Utils.java
index ec0c4a65e14..1a6ce734b45 100644
--- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/common/Utils.java
+++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/common/Utils.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -464,10 +464,28 @@ public final class Utils {
     public static final List EMPTY_BB_LIST = List.of();
     public static final ByteBufferReference[] EMPTY_BBR_ARRAY = new ByteBufferReference[0];
 
-    public static ByteBuffer slice(ByteBuffer buffer, int amount) {
+    /**
+     * Returns a slice of size {@code amount} from the given buffer. If the
+     * buffer contains more data than {@code amount}, then the slice's capacity
+     * ( and, but not just, its limit ) is set to {@code amount}. If the buffer
+     * does not contain more data than {@code amount}, then the slice's capacity
+     * will be the same as the given buffer's capacity.
+     */
+    public static ByteBuffer sliceWithLimitedCapacity(ByteBuffer buffer, int amount) {
+        final int index = buffer.position() + amount;
+        final int limit = buffer.limit();
+        if (index != limit) {
+            // additional data in the buffer
+            buffer.limit(index);  // ensures that the slice does not go beyond
+        } else {
+            // no additional data in the buffer
+            buffer.limit(buffer.capacity());  // allows the slice full capacity
+        }
+
         ByteBuffer newb = buffer.slice();
-        newb.limit(amount);
-        buffer.position(buffer.position() + amount);
+        buffer.position(index);
+        buffer.limit(limit);    // restore the original buffer's limit
+        newb.limit(amount);     // slices limit to amount (capacity may be greater)
         return newb;
     }
 
diff --git a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/frame/FramesDecoder.java b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/frame/FramesDecoder.java
index 1b8ff4ac0b1..9e8ce3485b8 100644
--- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/frame/FramesDecoder.java
+++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/internal/frame/FramesDecoder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -281,14 +281,14 @@ public class FramesDecoder {
             int extract = Math.min(remaining, bytecount);
             ByteBuffer extractedBuf;
             if (isDataFrame) {
-                extractedBuf = Utils.slice(currentBuffer, extract);
+                extractedBuf = Utils.sliceWithLimitedCapacity(currentBuffer, extract);
                 slicedToDataFrame = true;
             } else {
                 // Header frames here
                 // HPACK decoding should performed under lock and immediately after frame decoding.
                 // in that case it is safe to release original buffer,
                 // because of sliced buffer has a very short life
-                extractedBuf = Utils.slice(currentBuffer, extract);
+                extractedBuf = Utils.sliceWithLimitedCapacity(currentBuffer, extract);
             }
             res.add(extractedBuf);
             bytecount -= extract;
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionDescriptor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionDescriptor.java
deleted file mode 100644
index a59c27bf072..00000000000
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionDescriptor.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
- * 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 org.graalvm.options;
-
-import java.util.Objects;
-
-/**
- * Represents metadata for a single option.
- *
- * @since 1.0
- */
-public final class OptionDescriptor {
-
-    private final OptionKey key;
-    private final String name;
-    private final String help;
-    private final OptionCategory kind;
-    private final boolean deprecated;
-
-    OptionDescriptor(OptionKey key, String name, String help, OptionCategory kind, boolean deprecated) {
-        this.key = key;
-        this.name = name;
-        this.help = help;
-        this.kind = kind;
-        this.deprecated = deprecated;
-    }
-
-    /**
-     * Returns the name of the option that this descriptor represents.
-     *
-     * @since 1.0
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the key for this option.
-     *
-     * @since 1.0
-     */
-    public OptionKey getKey() {
-        return key;
-    }
-
-    /**
-     * Returns true if this option was marked deprecated. This indicates that the
-     * option is going to be removed in a future release or its use is not recommended.
-     *
-     * @since 1.0
-     */
-    public boolean isDeprecated() {
-        return deprecated;
-    }
-
-    /**
-     * Returns the user category of this option.
-     *
-     * @since 1.0
-     */
-    public OptionCategory getCategory() {
-        return kind;
-    }
-
-    /**
-     * Returns a human-readable description on how to use the option.
-     *
-     * @since 1.0
-     */
-    public String getHelp() {
-        return help;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @since 1.0
-     */
-    @Override
-    public String toString() {
-        return "OptionDescriptor [key=" + key + ", help=" + help + ", kind=" + kind + ", deprecated=" + deprecated + "]";
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @since 1.0
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + (deprecated ? 1231 : 1237);
-        result = prime * result + ((help == null) ? 0 : help.hashCode());
-        result = prime * result + ((key == null) ? 0 : key.hashCode());
-        result = prime * result + ((kind == null) ? 0 : kind.hashCode());
-        result = prime * result + ((name == null) ? 0 : name.hashCode());
-        return result;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @since 1.0
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        } else if (obj == null) {
-            return false;
-        } else if (getClass() != obj.getClass()) {
-            return false;
-        }
-        OptionDescriptor other = (OptionDescriptor) obj;
-        return Objects.equals(name, other.name) &&
-                        Objects.equals(deprecated, other.deprecated) &&
-                        Objects.equals(help, other.help) &&
-                        Objects.equals(key, other.key) &&
-                        Objects.equals(kind, other.kind);
-    }
-
-    /**
-     * Creates a new option descriptor builder by key. The option group and name is inferred by the
-     * key.
-     *
-     * @since 1.0
-     */
-    public static  Builder newBuilder(OptionKey key, String name) {
-        Objects.requireNonNull(key);
-        Objects.requireNonNull(name);
-        return EMPTY.new Builder(key, name);
-    }
-
-    private static final OptionDescriptor EMPTY = new OptionDescriptor(null, null, null, null, false);
-
-    /**
-     * Represents an option descriptor builder.
-     *
-     * @since 1.0
-     */
-    public final class Builder {
-
-        private final OptionKey key;
-        private final String name;
-        private boolean deprecated;
-        private OptionCategory category;
-        private String help;
-
-        Builder(OptionKey key, String name) {
-            this.key = key;
-            this.name = name;
-        }
-
-        /**
-         * Defines the user category for this option. The default value is
-         * {@link OptionCategory#DEBUG}.
-         *
-         * @since 1.0
-         */
-        public Builder category(@SuppressWarnings("hiding") OptionCategory category) {
-            Objects.requireNonNull(category);
-            this.category = category;
-            return this;
-        }
-
-        /**
-         * Defines if this option is deprecated. The default value for deprecated is
-         * false. This can be used to evolve options between releases.
-         *
-         * @since 1.0
-         */
-        public Builder deprecated(@SuppressWarnings("hiding") boolean deprecated) {
-            this.deprecated = deprecated;
-            return this;
-        }
-
-        /**
-         * Specifies a human-readable description on how to use the option.
-         *
-         * @since 1.0
-         */
-        public Builder help(@SuppressWarnings("hiding") String help) {
-            Objects.requireNonNull(help);
-            this.help = help;
-            return this;
-        }
-
-        /**
-         * Builds and returns a new option descriptor.
-         *
-         * @since 1.0
-         */
-        public OptionDescriptor build() {
-            return new OptionDescriptor(key, name, help == null ? "" : help, category == null ? OptionCategory.DEBUG : category, deprecated);
-        }
-
-    }
-
-}
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionDescriptors.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionDescriptors.java
deleted file mode 100644
index 786299fa1e3..00000000000
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionDescriptors.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
- * 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 org.graalvm.options;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
-/**
- * An interface to a set of {@link OptionDescriptor}s.
- *
- * @since 1.0
- */
-public interface OptionDescriptors extends Iterable {
-
-    /**
-     * An empty set of option descriptors.
-     *
-     * @since 1.0
-     */
-    OptionDescriptors EMPTY = new OptionDescriptors() {
-
-        public Iterator iterator() {
-            return Collections. emptyList().iterator();
-        }
-
-        public OptionDescriptor get(String key) {
-            return null;
-        }
-    };
-
-    /**
-     * Gets the {@link OptionDescriptor} matching a given option name or {@code null} if this option
-     * descriptor set does not contain a matching option name.
-     *
-     * @since 1.0
-     */
-    OptionDescriptor get(String optionName);
-
-    /**
-     * Creates a union options descriptor out of multiple given descriptors. The operation
-     * descriptors are not checked for duplicate keys. The option descriptors are iterated in
-     * declaration order.
-     *
-     * @since 1.0
-     */
-    static OptionDescriptors createUnion(OptionDescriptors... descriptors) {
-        if (descriptors.length == 0) {
-            return EMPTY;
-        } else if (descriptors.length == 1) {
-            return descriptors[0];
-        } else {
-            return new UnionOptionDescriptors(descriptors);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @since 1.0
-     */
-    @Override
-    Iterator iterator();
-
-    /**
-     * Creates an {@link OptionDescriptors} instance from a list. The option descriptors
-     * implementation is backed by a {@link LinkedHashMap} that preserves ordering.
-     *
-     * @since 1.0
-     */
-    static OptionDescriptors create(List descriptors) {
-        if (descriptors == null || descriptors.isEmpty()) {
-            return EMPTY;
-        }
-        return new OptionDescriptorsMap(descriptors);
-    }
-}
-
-class OptionDescriptorsMap implements OptionDescriptors {
-
-    final Map descriptors = new LinkedHashMap<>();
-
-    OptionDescriptorsMap(List descriptorList) {
-        for (OptionDescriptor descriptor : descriptorList) {
-            descriptors.put(descriptor.getName(), descriptor);
-        }
-    }
-
-    @Override
-    public OptionDescriptor get(String optionName) {
-        return descriptors.get(optionName);
-    }
-
-    @Override
-    public Iterator iterator() {
-        return descriptors.values().iterator();
-    }
-
-}
-
-final class UnionOptionDescriptors implements OptionDescriptors {
-
-    final OptionDescriptors[] descriptorsList;
-
-    UnionOptionDescriptors(OptionDescriptors[] descriptors) {
-        // defensive copy
-        this.descriptorsList = Arrays.copyOf(descriptors, descriptors.length);
-    }
-
-    public Iterator iterator() {
-        return new Iterator() {
-
-            Iterator descriptors = descriptorsList[0].iterator();
-            int descriptorsIndex = 0;
-            OptionDescriptor next = null;
-
-            public boolean hasNext() {
-                return fetchNext() != null;
-            }
-
-            private OptionDescriptor fetchNext() {
-                if (next != null) {
-                    return next;
-                }
-                if (descriptors.hasNext()) {
-                    next = descriptors.next();
-                    return next;
-                } else if (descriptorsIndex < descriptorsList.length - 1) {
-                    descriptorsIndex++;
-                    descriptors = descriptorsList[descriptorsIndex].iterator();
-                    return fetchNext();
-                } else {
-                    return null;
-                }
-            }
-
-            public OptionDescriptor next() {
-                OptionDescriptor fetchedNext = fetchNext();
-                if (fetchedNext != null) {
-                    // consume next
-                    this.next = null;
-                    return fetchedNext;
-                } else {
-                    throw new NoSuchElementException();
-                }
-            }
-        };
-    }
-
-    public OptionDescriptor get(String value) {
-        for (OptionDescriptors descriptors : descriptorsList) {
-            OptionDescriptor descriptor = descriptors.get(value);
-            if (descriptor != null) {
-                return descriptor;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionKey.java
deleted file mode 100644
index 68098ea270d..00000000000
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionKey.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
- * 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 org.graalvm.options;
-
-import java.util.Objects;
-
-/**
- * Represents the option key for an option specification.
- *
- * @since 1.0
- */
-public final class OptionKey {
-
-    private final OptionType type;
-    private final T defaultValue;
-
-    /**
-     * Constructs a new option key given a default value. Throws {@link IllegalArgumentException} if
-     * no default {@link OptionType} could be {@link OptionType#defaultType(Object) resolved} for
-     * the given type. The default value must not be null.
-     *
-     * @since 1.0
-     */
-    public OptionKey(T defaultValue) {
-        Objects.requireNonNull(defaultValue);
-        this.defaultValue = defaultValue;
-        this.type = OptionType.defaultType(defaultValue);
-        if (type == null) {
-            throw new IllegalArgumentException("No default type specified for type " + defaultValue.getClass().getName() + ". Specify the option type explicitly to resolve this.");
-        }
-    }
-
-    /**
-     * Constructs a new option key given a default value and option key.
-     *
-     * @since 1.0
-     */
-    public OptionKey(T defaultValue, OptionType type) {
-        Objects.requireNonNull(type);
-        this.defaultValue = defaultValue;
-        this.type = type;
-    }
-
-    /**
-     * Returns the option type of this key.
-     *
-     * @since 1.0
-     */
-    public OptionType getType() {
-        return type;
-    }
-
-    /**
-     * Returns the default value for this option.
-     *
-     * @since 1.0
-     */
-    public T getDefaultValue() {
-        return defaultValue;
-    }
-
-    /**
-     * Returns the value of this key given the {@link OptionValues values}.
-     *
-     * @since 1.0
-     */
-    public T getValue(OptionValues values) {
-        return values.get(this);
-    }
-
-    /**
-     * Returns true if a value for this key has been set for the given option values or
-     * false if no value has been set.
-     *
-     * @since 1.0
-     */
-    public boolean hasBeenSet(OptionValues values) {
-        return values.hasBeenSet(this);
-    }
-
-}
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionType.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionType.java
deleted file mode 100644
index d1533db49db..00000000000
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionType.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
- * 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 org.graalvm.options;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-/**
- * Represents a type of an option that allows to convert string values to Java values.
- *
- * @since 1.0
- */
-public final class OptionType {
-
-    private final String name;
-    private final Function stringConverter;
-    private final Consumer validator;
-    private final T defaultValue;
-
-    /**
-     * Constructs a new option type with name, defaultValue, and function that allows to convert a
-     * string to the option type.
-     *
-     * @param name the name of the type.
-     * @param defaultValue the default value to use if no value is given.
-     * @param stringConverter a function that converts a string value to the option value. Can throw
-     *            {@link IllegalArgumentException} to indicate an invalid string.
-     * @param validator used for validating the option value. Throws
-     *            {@link IllegalArgumentException} if the value is invalid.
-     *
-     * @since 1.0
-     */
-    public OptionType(String name, T defaultValue, Function stringConverter, Consumer validator) {
-        Objects.requireNonNull(name);
-        Objects.requireNonNull(stringConverter);
-        Objects.requireNonNull(validator);
-        this.name = name;
-        this.stringConverter = stringConverter;
-        this.defaultValue = defaultValue;
-        this.validator = validator;
-    }
-
-    /**
-     * Constructs a new option type with name, defaultValue, and function that allows to convert a
-     * string to the option type.
-     *
-     * @param name the name of the type.
-     * @param defaultValue the default value to use if no value is given.
-     * @param stringConverter a function that converts a string value to the option value. Can throw
-     *            {@link IllegalArgumentException} to indicate an invalid string.
-     *
-     * @since 1.0
-     */
-    public OptionType(String name, T defaultValue, Function stringConverter) {
-        this(name, defaultValue, stringConverter, new Consumer() {
-            public void accept(T t) {
-            }
-        });
-    }
-
-    /**
-     * Returns the default value of this type. Used if no value is available.
-     *
-     * @since 1.0
-     */
-    public T getDefaultValue() {
-        return defaultValue;
-    }
-
-    /**
-     * Returns the name of this type.
-     *
-     * @since 1.0
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Converts a string value, validates it, and converts it to an object of this type.
-     *
-     * @throws IllegalArgumentException if the value is invalid or cannot be converted.
-     * @since 1.0
-     */
-    public T convert(String value) {
-        T v = stringConverter.apply(value);
-        validate(v);
-        return v;
-    }
-
-    /**
-     * Validates an option value and throws an {@link IllegalArgumentException} if the value is
-     * invalid.
-     *
-     * @throws IllegalArgumentException if the value is invalid or cannot be converted.
-     * @since 1.0
-     */
-    public void validate(T value) {
-        validator.accept(value);
-    }
-
-    /**
-     * @since 1.0
-     */
-    @Override
-    public String toString() {
-        return "OptionType[name=" + name + ", defaultValue=" + defaultValue + "]";
-    }
-
-    private static final Map, OptionType> DEFAULTTYPES = new HashMap<>();
-    static {
-        DEFAULTTYPES.put(Boolean.class, new OptionType<>("Boolean", false, new Function() {
-            public Boolean apply(String t) {
-                if ("true".equals(t)) {
-                    return Boolean.TRUE;
-                } else if ("false".equals(t)) {
-                    return Boolean.FALSE;
-                } else {
-                    throw new IllegalArgumentException(String.format("Invalid boolean option value '%s'. The value of the option must be '%s' or '%s'.", t, "true", "false"));
-                }
-            }
-        }));
-        DEFAULTTYPES.put(Byte.class, new OptionType<>("Byte", (byte) 0, new Function() {
-            public Byte apply(String t) {
-                try {
-                    return Byte.parseByte(t);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException(e.getMessage(), e);
-                }
-            }
-        }));
-        DEFAULTTYPES.put(Integer.class, new OptionType<>("Integer", 0, new Function() {
-            public Integer apply(String t) {
-                try {
-                    return Integer.parseInt(t);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException(e.getMessage(), e);
-                }
-            }
-        }));
-        DEFAULTTYPES.put(Long.class, new OptionType<>("Long", 0L, new Function() {
-            public Long apply(String t) {
-                try {
-                    return Long.parseLong(t);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException(e.getMessage(), e);
-                }
-            }
-        }));
-        DEFAULTTYPES.put(Float.class, new OptionType<>("Float", 0.0f, new Function() {
-            public Float apply(String t) {
-                try {
-                    return Float.parseFloat(t);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException(e.getMessage(), e);
-                }
-            }
-        }));
-        DEFAULTTYPES.put(Double.class, new OptionType<>("Double", 0.0d, new Function() {
-            public Double apply(String t) {
-                try {
-                    return Double.parseDouble(t);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException(e.getMessage(), e);
-                }
-            }
-        }));
-        DEFAULTTYPES.put(String.class, new OptionType<>("String", "0", new Function() {
-            public String apply(String t) {
-                return t;
-            }
-        }));
-    }
-
-    /**
-     * Returns the default option type for a given value. Returns null if no default
-     * option type is available for the Java type of this value.
-     *
-     * @since 1.0
-     */
-    @SuppressWarnings("unchecked")
-    public static  OptionType defaultType(T value) {
-        return defaultType((Class) value.getClass());
-    }
-
-    /**
-     * Returns the default option type for a class. Returns null if no default option
-     * type is available for this Java type.
-     *
-     * @since 1.0
-     */
-    @SuppressWarnings("unchecked")
-    public static  OptionType defaultType(Class clazz) {
-        return (OptionType) DEFAULTTYPES.get(clazz);
-    }
-
-}
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionValues.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionValues.java
deleted file mode 100644
index 0342356db1a..00000000000
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionValues.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
- * 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 org.graalvm.options;
-
-/**
- * Represents a set of option values based on an {@link OptionDescriptor}.
- *
- * @since 1.0
- */
-public interface OptionValues {
-
-    /**
-     * Returns all available options.
-     *
-     * @since 1.0
-     */
-    OptionDescriptors getDescriptors();
-
-    /**
-     * Sets the value of {@code optionKey} to {@code value}.
-     *
-     * @throws IllegalArgumentException if the given value is not {@link OptionType#validate(Object)
-     *             validated} by the {@link OptionKey#getType() option type} of the key. Note that
-     *             the operation succeeds if the option key is not described by any of the
-     *             associated {@link #getDescriptors() descriptors}.
-     *
-     * @since 1.0
-     */
-     void set(OptionKey optionKey, T value);
-
-    /**
-     * Returns the value of a given option. If no value is set or the key is not described by any
-     * {@link #getDescriptors() descriptors} the {@link OptionType#getDefaultValue() default value}
-     * of the given key is returned.
-     *
-     * @since 1.0
-     */
-     T get(OptionKey optionKey);
-
-    /**
-     * Determines if a value for {@code optionKey} has been {@link #set} in this set of option
-     * values.
-     *
-     * @since 1.0
-     */
-    boolean hasBeenSet(OptionKey optionKey);
-
-}
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_de.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_de.java
index 67ae3596ff9..9c33f32624a 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_de.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_de.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_es.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_es.java
index 36326e49f8c..f29fc7c7525 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_es.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_es.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_fr.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_fr.java
index d5475e34615..5401504b8d5 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_fr.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_fr.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_it.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_it.java
index c1334d06b28..15ab8b4d52f 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_it.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_it.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ja.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ja.java
index 6661bfdc837..5fa26431c0a 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ja.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ja.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ko.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ko.java
index 665ea8bb6ab..350f167c9d7 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ko.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_ko.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_pt_BR.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_pt_BR.java
index ea890dd6ebc..e281083fba6 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_pt_BR.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_pt_BR.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_pt_BR extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_sv.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_sv.java
index ced9600226a..8c130a7dadd 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_sv.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_sv.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_CN.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_CN.java
index f0a99da1625..511587d8dd6 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_CN.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_CN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_TW.java b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_TW.java
index bb6ac9fcf5c..5f8db1732b6 100644
--- a/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_TW.java
+++ b/src/jdk.localedata/share/classes/sun/util/resources/ext/TimeZoneNames_zh_TW.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -371,7 +371,7 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle {
             {"Africa/Nouakchott", GMT},
             {"Africa/Ouagadougou", GMT},
             {"Africa/Porto-Novo", WAT},
-            {"Africa/Sao_Tome", GMT},
+            {"Africa/Sao_Tome", WAT},
             {"Africa/Timbuktu", GMT},
             {"Africa/Tripoli", EET},
             {"Africa/Tunis", CET},
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionCategory.java b/test/hotspot/gtest/opto/test_mathexact.cpp
similarity index 55%
rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionCategory.java
rename to test/hotspot/gtest/opto/test_mathexact.cpp
index fddb093576c..f4d50285c01 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/OptionCategory.java
+++ b/test/hotspot/gtest/opto/test_mathexact.cpp
@@ -1,12 +1,10 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
  * 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.
+ * 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
@@ -21,35 +19,22 @@
  * 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 org.graalvm.options;
-
-/**
- * Categorizes options according to user relevance.
  *
- * @since 1.0
  */
-public enum OptionCategory {
 
-    /**
-     * An option common for users to apply.
-     *
-     * @since 1.0
-     */
-    USER,
-
-    /**
-     * An option only relevant in corner cases and for fine-tuning.
-     *
-     * @since 1.0
-     */
-    EXPERT,
-
-    /**
-     * An option only relevant when debugging language or instrument implementations.
-     *
-     * @since 1.0
-     */
-    DEBUG
+#include "precompiled.hpp"
+#include "opto/mulnode.hpp"
+#include "opto/mathexactnode.hpp"
+#include "unittest.hpp"
 
+TEST_VM(opto, mathexact) {
+  ASSERT_FALSE(OverflowMulLNode::is_overflow(1, 1));
+  ASSERT_FALSE(OverflowMulLNode::is_overflow(1, min_jlong));
+  ASSERT_TRUE(OverflowMulLNode::is_overflow(-1, min_jlong));
+  ASSERT_FALSE(OverflowMulLNode::is_overflow(-1, max_jlong));
+  ASSERT_TRUE(OverflowMulLNode::is_overflow(max_jlong / 2 + 1, 2));
+  ASSERT_FALSE(OverflowMulLNode::is_overflow(min_jlong, 0));
+  ASSERT_FALSE(OverflowMulLNode::is_overflow(min_jlong + 1, -1));
+  ASSERT_TRUE(OverflowMulLNode::is_overflow(min_jlong + 1, 2));
 }
+
diff --git a/test/hotspot/jtreg/compiler/intrinsics/mathexact/LongMulOverflowTest.java b/test/hotspot/jtreg/compiler/intrinsics/mathexact/LongMulOverflowTest.java
new file mode 100644
index 00000000000..42dab1ef990
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/intrinsics/mathexact/LongMulOverflowTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 8191915
+ * @summary Regression test for multiplyExact intrinsic
+ * @library /test/lib /
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *
+ * @run main/othervm -Xcomp -XX:-TieredCompilation compiler.intrinsics.mathexact.LongMulOverflowTest
+ */
+
+package compiler.intrinsics.mathexact;
+
+public class LongMulOverflowTest {
+    public static void main(String[] args) {
+        LongMulOverflowTest test = new LongMulOverflowTest();
+        for (int i = 0; i < 10; ++i) {
+            try {
+                test.runTest();
+                throw new RuntimeException("Error, runTest() did not overflow!");
+            } catch (ArithmeticException e) {
+                // success
+            }
+
+            try {
+                test.runTestOverflow();
+                throw new RuntimeException("Error, runTestOverflow() did not overflow!");
+            } catch (ArithmeticException e) {
+                // success
+            }
+        }
+    }
+
+    public void runTest() {
+        java.lang.Math.multiplyExact(Long.MIN_VALUE, 7);
+    }
+
+    public void runTestOverflow() {
+      java.lang.Math.multiplyExact((Long.MAX_VALUE / 2) + 1, 2);
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/loopopts/TestStripMinedBackToBackIfs.java b/test/hotspot/jtreg/compiler/loopopts/TestStripMinedBackToBackIfs.java
new file mode 100644
index 00000000000..d4cc5bce9df
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/loopopts/TestStripMinedBackToBackIfs.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
+ * 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 8196296
+ * @summary Bad graph when unrolled loop bounds conflicts with range checks
+ *
+ * @run main/othervm -XX:-BackgroundCompilation -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=0 TestStripMinedBackToBackIfs
+ *
+ */
+
+
+public class TestStripMinedBackToBackIfs {
+    public static void main(String[] args) {
+        for (int i = 0; i < 20_000; i++) {
+            test(100);
+        }
+    }
+
+    private static double test(int limit) {
+        double v = 1;
+        for (int i = 0; i < limit; i++) {
+            v = v * 4;
+            // We don't want this test to be merged with identical
+            // loop end test
+            if (i+1 < limit) {
+                v = v * 2;
+            }
+        }
+        return v;
+    }
+}
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java
index 89d22695e55..7d0cce20885 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,6 +138,9 @@ public class VarHandleTestByteArrayAsChar extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -162,6 +165,9 @@ public class VarHandleTestByteArrayAsChar extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -192,6 +198,88 @@ public class VarHandleTestByteArrayAsChar extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            char x = (char) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            char x = (char) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            char x = (char) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            char x = (char) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+
+
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            char x = (char) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            char x = (char) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            char x = (char) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            char x = (char) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+
+
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java
index 5757d1958c1..8d2c9359ae1 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,6 +138,9 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -162,6 +165,9 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -192,6 +198,174 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            double x = (double) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double x = (double) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            double x = (double) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            double x = (double) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            double r = (double) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double r = (double) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double r = (double) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            double o = (double) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double o = (double) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double o = (double) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            double x = (double) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double x = (double) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            double x = (double) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            double x = (double) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            double r = (double) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double r = (double) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double r = (double) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            double o = (double) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double o = (double) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            double o = (double) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java
index 89d8fe91502..b9be42bb311 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,6 +138,9 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -162,6 +165,9 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -192,6 +198,174 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            float x = (float) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float x = (float) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            float x = (float) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            float x = (float) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            float r = (float) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float r = (float) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float r = (float) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            float o = (float) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float o = (float) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float o = (float) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            float x = (float) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float x = (float) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            float x = (float) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            float x = (float) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            float r = (float) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float r = (float) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float r = (float) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            float o = (float) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float o = (float) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            float o = (float) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java
index 79e9daba605..d8c48ddafec 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,6 +138,9 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -162,6 +165,9 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -192,6 +198,266 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            int x = (int) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int x = (int) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            int x = (int) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            int x = (int) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            int r = (int) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int r = (int) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int r = (int) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndAdd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndAddAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndAddRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseOr(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseAnd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseXor(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
+        });
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            int x = (int) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int x = (int) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            int x = (int) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            int x = (int) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            int r = (int) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int r = (int) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int r = (int) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndAdd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndAddAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndAddRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseOr(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseAnd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseXor(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            int o = (int) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
+        });
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
index 01cdfcef554..8f622f188a1 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,6 +138,9 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -162,6 +165,9 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -192,6 +198,266 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            long x = (long) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long x = (long) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            long x = (long) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            long x = (long) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndAdd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
+        });
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            long x = (long) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long x = (long) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            long x = (long) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            long x = (long) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            long r = (long) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long r = (long) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long r = (long) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndAdd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndAddAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndAddRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseOr(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseAnd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseXor(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            long o = (long) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
+        });
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java
index 29e45a04c0e..7e8f99f7500 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,6 +138,9 @@ public class VarHandleTestByteArrayAsShort extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -162,6 +165,9 @@ public class VarHandleTestByteArrayAsShort extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -192,6 +198,88 @@ public class VarHandleTestByteArrayAsShort extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            short x = (short) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            short x = (short) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            short x = (short) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            short x = (short) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+
+
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            short x = (short) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            short x = (short) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            short x = (short) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            short x = (short) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+
+
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java
index 858913fc99e..46b752d2b25 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java
@@ -2906,4 +2906,3 @@ public class VarHandleTestMethodTypeBoolean extends VarHandleBaseTest {
         }
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java
index 0f9097acd33..ce45525d213 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java
@@ -3252,4 +3252,3 @@ public class VarHandleTestMethodTypeByte extends VarHandleBaseTest {
         }
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java
index 46ffc0f8cc7..0498c622ffb 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java
@@ -3252,4 +3252,3 @@ public class VarHandleTestMethodTypeChar extends VarHandleBaseTest {
         }
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java
index af37433385c..a9f7eb78260 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java
@@ -2400,4 +2400,3 @@ public class VarHandleTestMethodTypeDouble extends VarHandleBaseTest {
 
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java
index b5d6711a3cb..8064bdcdfa3 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java
@@ -2400,4 +2400,3 @@ public class VarHandleTestMethodTypeFloat extends VarHandleBaseTest {
 
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java
index 9f0b995663c..7ab15c22ef3 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java
@@ -3252,4 +3252,3 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest {
         }
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java
index 576d5a197f2..7d39ab590bd 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java
@@ -3252,4 +3252,3 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest {
         }
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java
index b3f52611dcd..d0d414fe13d 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java
@@ -3252,4 +3252,3 @@ public class VarHandleTestMethodTypeShort extends VarHandleBaseTest {
         }
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java
index 9e2debed693..11a5a0feee9 100644
--- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java
+++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java
@@ -2054,4 +2054,3 @@ public class VarHandleTestMethodTypeString extends VarHandleBaseTest {
 
     }
 }
-
diff --git a/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template b/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template
index caf18e0566a..e476324489b 100644
--- a/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template
+++ b/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -170,6 +170,9 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest {
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "read write", bav, vh, h -> testArrayReadWrite(bas, h),
                                 true));
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null array", bav, vh, h -> testArrayNPE(bas, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bas, h),
                                 false));
@@ -194,6 +197,9 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest {
                                     true));
                         }
 
+                        cases.add(new VarHandleSourceAccessTestCase(
+                                "null buffer", bav, vh, h -> testArrayNPE(bbs, h),
+                                false));
                         cases.add(new VarHandleSourceAccessTestCase(
                                 "unsupported", bav, vh, h -> testArrayUnsupported(bbs, h),
                                 false));
@@ -224,6 +230,278 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest {
     }
 
 
+    static void testArrayNPE(ByteArraySource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        byte[] array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+#if[CAS]
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            $type$ r = ($type$) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ r = ($type$) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ r = ($type$) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+#end[CAS]
+
+#if[AtomicAdd]
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndAdd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndAddAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndAddRelease(array, ci, VALUE_1);
+        });
+#end[AtomicAdd]
+
+#if[Bitwise]
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseOr(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseAnd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseXor(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
+        });
+#end[Bitwise]
+    }
+
+    static void testArrayNPE(ByteBufferSource bs, VarHandleSource vhs) {
+        VarHandle vh = vhs.s;
+        ByteBuffer array = null;
+        int ci = 1;
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.get(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.set(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.getVolatile(array, ci);
+        });
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.getAcquire(array, ci);
+        });
+
+        checkNPE(() -> {
+            $type$ x = ($type$) vh.getOpaque(array, ci);
+        });
+
+        checkNPE(() -> {
+            vh.setVolatile(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            vh.setOpaque(array, ci, VALUE_1);
+        });
+
+#if[CAS]
+        checkNPE(() -> {
+            boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            $type$ r = ($type$) vh.compareAndExchange(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ r = ($type$) vh.compareAndExchangeAcquire(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ r = ($type$) vh.compareAndExchangeRelease(array, ci, VALUE_2, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetPlain(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSet(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetAcquire(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            boolean r = vh.weakCompareAndSetRelease(array, ci, VALUE_1, VALUE_2);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndSet(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndSetAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndSetRelease(array, ci, VALUE_1);
+        });
+#end[CAS]
+
+#if[AtomicAdd]
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndAdd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndAddAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndAddRelease(array, ci, VALUE_1);
+        });
+#end[AtomicAdd]
+
+#if[Bitwise]
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseOr(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseOrAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseOrRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseAnd(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseAndAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseAndRelease(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseXor(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseXorAcquire(array, ci, VALUE_1);
+        });
+
+        checkNPE(() -> {
+            $type$ o = ($type$) vh.getAndBitwiseXorRelease(array, ci, VALUE_1);
+        });
+#end[Bitwise]
+    }
+
     static void testArrayUnsupported(ByteArraySource bs, VarHandleSource vhs) {
         VarHandle vh = vhs.s;
         byte[] array = bs.s;
diff --git a/test/jdk/java/lang/invoke/VarHandles/generate-vh-tests.sh b/test/jdk/java/lang/invoke/VarHandles/generate-vh-tests.sh
index 2641f8d58d5..5d489a16f09 100644
--- a/test/jdk/java/lang/invoke/VarHandles/generate-vh-tests.sh
+++ b/test/jdk/java/lang/invoke/VarHandles/generate-vh-tests.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-javac -d . ../../../../../make/src/classes/build/tools/spp/Spp.java
+javac -d . ../../../../../../make/jdk/src/classes/build/tools/spp/Spp.java
 
 SPP=build.tools.spp.Spp
 
diff --git a/test/jdk/java/net/httpclient/ConcurrentResponses.java b/test/jdk/java/net/httpclient/ConcurrentResponses.java
new file mode 100644
index 00000000000..0d3cba9a82a
--- /dev/null
+++ b/test/jdk/java/net/httpclient/ConcurrentResponses.java
@@ -0,0 +1,377 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 8195823
+ * @summary Buffers given to response body subscribers should not contain
+ *          unprocessed HTTP data
+ * @modules java.base/sun.net.www.http
+ *          jdk.incubator.httpclient/jdk.incubator.http.internal.common
+ *          jdk.incubator.httpclient/jdk.incubator.http.internal.frame
+ *          jdk.incubator.httpclient/jdk.incubator.http.internal.hpack
+ *          java.logging
+ *          jdk.httpserver
+ * @library /lib/testlibrary http2/server
+ * @build Http2TestServer
+ * @build jdk.testlibrary.SimpleSSLContext
+ * @run testng/othervm -Djdk.internal.httpclient.debug=true ConcurrentResponses
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.Flow;
+import java.util.stream.IntStream;
+import javax.net.ssl.SSLContext;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+import com.sun.net.httpserver.HttpsConfigurator;
+import com.sun.net.httpserver.HttpsServer;
+import jdk.incubator.http.HttpClient;
+import jdk.incubator.http.HttpRequest;
+import jdk.incubator.http.HttpResponse;
+import jdk.incubator.http.HttpResponse.BodyHandler;
+import jdk.incubator.http.HttpResponse.BodySubscriber;
+import jdk.testlibrary.SimpleSSLContext;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static jdk.incubator.http.HttpResponse.BodyHandler.asString;
+import static jdk.incubator.http.HttpResponse.BodyHandler.discard;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.fail;
+
+public class ConcurrentResponses {
+
+    SSLContext sslContext;
+    HttpServer httpTestServer;         // HTTP/1.1    [ 4 servers ]
+    HttpsServer httpsTestServer;       // HTTPS/1.1
+    Http2TestServer http2TestServer;   // HTTP/2 ( h2c )
+    Http2TestServer https2TestServer;  // HTTP/2 ( h2  )
+    String httpFixedURI, httpsFixedURI, httpChunkedURI, httpsChunkedURI;
+    String http2FixedURI, https2FixedURI, http2VariableURI, https2VariableURI;
+
+    static final int CONCURRENT_REQUESTS = 13;
+
+    static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    static final int ALPHABET_LENGTH = ALPHABET.length();
+
+    static final String stringOfLength(int requiredLength) {
+        StringBuilder sb = new StringBuilder(requiredLength);
+        IntStream.range(0, requiredLength)
+                 .mapToObj(i -> ALPHABET.charAt(i % ALPHABET_LENGTH))
+                 .forEach(c -> sb.append(c));
+        return sb.toString();
+    }
+
+    /** An array of different Strings, to be used as bodies. */
+    static final String[] BODIES = bodies();
+
+    static String[] bodies() {
+        String[] bodies = new String[CONCURRENT_REQUESTS];
+        for (int i=0;i CompletionStage>
+    assert200ResponseCode(HttpResponse response) {
+        assertEquals(response.statusCode(), 200);
+        return CompletableFuture.completedFuture(response);
+    }
+
+    /**
+     * Asserts that the given response's body is equal to the given body.
+     * Returns a CF that completes with the given response.
+     */
+    static final  CompletionStage>
+    assertbody(HttpResponse response, T body) {
+        assertEquals(response.body(), body);
+        return CompletableFuture.completedFuture(response);
+    }
+
+    @DataProvider(name = "uris")
+    public Object[][] variants() {
+        return new Object[][]{
+                { httpFixedURI },
+                { httpsFixedURI },
+                { httpChunkedURI },
+                { httpsChunkedURI },
+                { http2FixedURI },
+                { https2FixedURI },
+                { http2VariableURI },
+                { https2VariableURI }
+        };
+    }
+
+
+    // The asString implementation accumulates data, below a certain threshold
+    // into the byte buffers it is given.
+    @Test(dataProvider = "uris")
+    void testAsString(String uri) throws Exception {
+        HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
+
+        Map requests = new HashMap<>();
+        for (int i=0;i client.sendAsync(request, asString()))
+                .map(cf -> cf.thenCompose(ConcurrentResponses::assert200ResponseCode))
+                .map(cf -> cf.thenCompose(response -> assertbody(response, requests.get(response.request()))))
+                .toArray(CompletableFuture[]::new))
+                .join();
+    }
+
+    // The custom subscriber aggressively attacks any area, between the limit
+    // and the capacity, in the byte buffers it is given, by writing 'X' into it.
+    @Test(dataProvider = "uris")
+    void testWithCustomSubscriber(String uri) throws Exception {
+        HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
+
+        Map requests = new HashMap<>();
+        for (int i=0;i client.sendAsync(request, CustomSubscriber.handler))
+                .map(cf -> cf.thenCompose(ConcurrentResponses::assert200ResponseCode))
+                .map(cf -> cf.thenCompose(response -> assertbody(response, requests.get(response.request()))))
+                .toArray(CompletableFuture[]::new))
+                .join();
+    }
+
+    /**
+     * A subscriber that wraps asString, but mucks with any data between limit
+     * and capacity, if the client mistakenly passes it any that is should not.
+     */
+    static class CustomSubscriber implements BodySubscriber {
+        static final BodyHandler handler = (r,h) -> new CustomSubscriber();
+        private final BodySubscriber asString = BodySubscriber.asString(UTF_8);
+
+        @Override
+        public CompletionStage getBody() {
+            return asString.getBody();
+        }
+
+        @Override
+        public void onSubscribe(Flow.Subscription subscription) {
+            asString.onSubscribe(subscription);
+        }
+
+        @Override
+        public void onNext(List buffers) {
+            // Muck any data beyond the give limit, since there shouldn't
+            // be any of interest to the HTTP Client.
+            for (ByteBuffer buffer : buffers) {
+                if (buffer.limit() != buffer.capacity()) {
+                    final int limit = buffer.limit();
+                    final int position = buffer.position();
+                    buffer.position(buffer.limit());
+                    buffer.limit(buffer.capacity());
+                    while (buffer.hasRemaining())
+                        buffer.put((byte)'X');
+                    buffer.position(position); // restore original position
+                    buffer.limit(limit);       // restore original limit
+                }
+            }
+            asString.onNext(buffers);
+        }
+
+        @Override
+        public void onError(Throwable throwable) {
+            asString.onError(throwable);
+            throwable.printStackTrace();
+            fail("UNEXPECTED:" + throwable);
+        }
+
+        @Override
+        public void onComplete() {
+            asString.onComplete();
+        }
+    }
+
+
+    @BeforeTest
+    public void setup() throws Exception {
+        sslContext = new SimpleSSLContext().get();
+        if (sslContext == null)
+            throw new AssertionError("Unexpected null sslContext");
+
+        InetSocketAddress sa = new InetSocketAddress("localhost", 0);
+        httpTestServer = HttpServer.create(sa, 0);
+        httpTestServer.createContext("/http1/fixed", new Http1FixedHandler());
+        httpFixedURI = "http://127.0.0.1:" + httpTestServer.getAddress().getPort() + "/http1/fixed";
+        httpTestServer.createContext("/http1/chunked", new Http1ChunkedHandler());
+        httpChunkedURI = "http://127.0.0.1:" + httpTestServer.getAddress().getPort() + "/http1/chunked";
+
+        httpsTestServer = HttpsServer.create(sa, 0);
+        httpsTestServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
+        httpsTestServer.createContext("/https1/fixed", new Http1FixedHandler());
+        httpsFixedURI = "https://127.0.0.1:" + httpsTestServer.getAddress().getPort() + "/https1/fixed";
+        httpsTestServer.createContext("/https1/chunked", new Http1ChunkedHandler());
+        httpsChunkedURI = "https://127.0.0.1:" + httpsTestServer.getAddress().getPort() + "/https1/chunked";
+
+        http2TestServer = new Http2TestServer("127.0.0.1", false, 0);
+        http2TestServer.addHandler(new Http2FixedHandler(), "/http2/fixed");
+        http2FixedURI = "http://127.0.0.1:" + http2TestServer.getAddress().getPort() + "/http2/fixed";
+        http2TestServer.addHandler(new Http2VariableHandler(), "/http2/variable");
+        http2VariableURI = "http://127.0.0.1:" + http2TestServer.getAddress().getPort() + "/http2/variable";
+
+        https2TestServer = new Http2TestServer("127.0.0.1", true, 0);
+        https2TestServer.addHandler(new Http2FixedHandler(), "/https2/fixed");
+        https2FixedURI = "https://127.0.0.1:" + https2TestServer.getAddress().getPort() + "/https2/fixed";
+        https2TestServer.addHandler(new Http2VariableHandler(), "/https2/variable");
+        https2VariableURI = "https://127.0.0.1:" + https2TestServer.getAddress().getPort() + "/https2/variable";
+
+        httpTestServer.start();
+        httpsTestServer.start();
+        http2TestServer.start();
+        https2TestServer.start();
+    }
+
+    @AfterTest
+    public void teardown() throws Exception {
+        httpTestServer.stop(0);
+        httpsTestServer.stop(0);
+        http2TestServer.stop();
+        https2TestServer.stop();
+    }
+
+    interface SendResponseHeadersFunction {
+        void apply(int responseCode, long responseLength) throws IOException;
+    }
+
+    // A handler implementation that replies with 200 OK. If the exchange's uri
+    // has a query, then it must be an integer, which is used as an index to
+    // select the particular response body, e.g. /http2/x?5 -> BODIES[5]
+    static void serverHandlerImpl(InputStream inputStream,
+                                  OutputStream outputStream,
+                                  URI uri,
+                                  SendResponseHeadersFunction sendResponseHeadersFunction)
+        throws IOException
+    {
+        try (InputStream is = inputStream;
+             OutputStream os = outputStream) {
+            is.readAllBytes();
+
+            String magicQuery = uri.getQuery();
+            if (magicQuery != null) {
+                int bodyIndex = Integer.valueOf(magicQuery);
+                String body = BODIES[bodyIndex];
+                byte[] bytes = body.getBytes(UTF_8);
+                sendResponseHeadersFunction.apply(200, bytes.length);
+                int offset = 0;
+                // Deliberately attempt to reply with several relatively
+                // small data frames ( each write corresponds to its own
+                // data frame ). Additionally, yield, to encourage other
+                // handlers to execute, therefore increasing the likelihood
+                // of multiple different-stream related frames in the
+                // client's read buffer.
+                while (offset < bytes.length) {
+                    int length = Math.min(bytes.length - offset, 64);
+                    os.write(bytes, offset, length);
+                    os.flush();
+                    offset += length;
+                    Thread.yield();
+                }
+            } else {
+                sendResponseHeadersFunction.apply(200, 1);
+                os.write('A');
+            }
+        }
+    }
+
+    static class Http1FixedHandler implements HttpHandler {
+        @Override
+        public void handle(HttpExchange t) throws IOException {
+            serverHandlerImpl(t.getRequestBody(),
+                              t.getResponseBody(),
+                              t.getRequestURI(),
+                              (rcode, length) -> t.sendResponseHeaders(rcode, length));
+        }
+    }
+
+    static class Http1ChunkedHandler implements HttpHandler {
+        @Override
+        public void handle(HttpExchange t) throws IOException {
+            serverHandlerImpl(t.getRequestBody(),
+                              t.getResponseBody(),
+                              t.getRequestURI(),
+                              (rcode, ignored) -> t.sendResponseHeaders(rcode, 0 /*chunked*/));
+        }
+    }
+
+    static class Http2FixedHandler implements Http2Handler {
+        @Override
+        public void handle(Http2TestExchange t) throws IOException {
+            serverHandlerImpl(t.getRequestBody(),
+                              t.getResponseBody(),
+                              t.getRequestURI(),
+                              (rcode, length) -> t.sendResponseHeaders(rcode, length));
+        }
+    }
+
+    static class Http2VariableHandler implements Http2Handler {
+        @Override
+        public void handle(Http2TestExchange t) throws IOException {
+            serverHandlerImpl(t.getRequestBody(),
+                              t.getResponseBody(),
+                              t.getRequestURI(),
+                              (rcode, ignored) -> t.sendResponseHeaders(rcode, 0 /* no Content-Length */));
+        }
+    }
+}
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/package-info.java b/test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java
similarity index 65%
rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/package-info.java
rename to test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java
index 8108fab34e4..358123b8105 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.options/src/org/graalvm/options/package-info.java
+++ b/test/jdk/java/net/httpclient/whitebox/FramesDecoderTestDriver.java
@@ -1,12 +1,10 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
  * 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.
+ * 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
@@ -22,12 +20,11 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-/**
- * The Graal-SDK options package contains reusable collection classes for options.
- *
- * @see org.graalvm.options.OptionDescriptor
- * @see org.graalvm.options.OptionValues
- *
- * @since 1.0
+
+/*
+ * @test
+ * @bug 8195823
+ * @modules jdk.incubator.httpclient/jdk.incubator.http.internal.frame
+ * @run testng/othervm -Djdk.internal.httpclient.debug=true jdk.incubator.httpclient/jdk.incubator.http.internal.frame.FramesDecoderTest
  */
-package org.graalvm.options;
\ No newline at end of file
+
diff --git a/test/jdk/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/internal/frame/FramesDecoderTest.java b/test/jdk/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/internal/frame/FramesDecoderTest.java
new file mode 100644
index 00000000000..a6f8162bea8
--- /dev/null
+++ b/test/jdk/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/internal/frame/FramesDecoderTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 jdk.incubator.http.internal.frame;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+import static java.lang.System.out;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.testng.Assert.*;
+
+public class FramesDecoderTest {
+
+    abstract class TestFrameProcessor implements FramesDecoder.FrameProcessor {
+        protected volatile int count;
+        public int numberOfFramesDecoded() { return count; }
+    }
+
+    /**
+     * Verifies that a ByteBuffer containing more that one frame, destined
+     * to be returned to the user's subscriber, i.e. a data frame, does not
+     * inadvertently expose the following frame ( between its limit and
+     * capacity ).
+     */
+    @Test
+    public void decodeDataFrameFollowedByAnother() throws Exception {
+        // input frames for to the decoder
+        List data1 = List.of(ByteBuffer.wrap("XXXX".getBytes(UTF_8)));
+        DataFrame dataFrame1 = new DataFrame(1, 0, data1);
+        List data2 = List.of(ByteBuffer.wrap("YYYY".getBytes(UTF_8)));
+        DataFrame dataFrame2 = new DataFrame(1, 0, data2);
+
+        List buffers = new ArrayList<>();
+        FramesEncoder encoder = new FramesEncoder();
+        buffers.addAll(encoder.encodeFrame(dataFrame1));
+        buffers.addAll(encoder.encodeFrame(dataFrame2));
+
+        ByteBuffer combined = ByteBuffer.allocate(1024);
+        buffers.stream().forEach(combined::put);
+        combined.flip();
+
+        TestFrameProcessor testFrameProcessor = new TestFrameProcessor() {
+            @Override
+            public void processFrame(Http2Frame frame) throws IOException {
+                assertTrue(frame instanceof DataFrame);
+                DataFrame dataFrame = (DataFrame) frame;
+                List list = dataFrame.getData();
+                assertEquals(list.size(), 1);
+                ByteBuffer data = list.get(0);
+                byte[] bytes = new byte[data.remaining()];
+                data.get(bytes);
+                if (count == 0) {
+                    assertEquals(new String(bytes, UTF_8), "XXXX");
+                    out.println("First data received:" + data);
+                    assertEquals(data.position(), data.limit());  // since bytes read
+                    assertEquals(data.limit(), data.capacity());
+                } else {
+                    assertEquals(new String(bytes, UTF_8), "YYYY");
+                    out.println("Second data received:" + data);
+                }
+                count++;
+            }
+        };
+        FramesDecoder decoder = new FramesDecoder(testFrameProcessor);
+
+        out.println("Sending " + combined + " to decoder: ");
+        decoder.decode(combined);
+        Assert.assertEquals(testFrameProcessor.numberOfFramesDecoded(), 2);
+    }
+
+
+    /**
+     * Verifies that a ByteBuffer containing ONLY data one frame, destined
+     * to be returned to the user's subscriber, does not restrict the capacity.
+     * The complete buffer ( all its capacity ), since no longer used by the
+     * HTTP Client, should be returned to the user.
+     */
+    @Test
+    public void decodeDataFrameEnsureNotCapped() throws Exception {
+        // input frames for to the decoder
+        List data1 = List.of(ByteBuffer.wrap("XXXX".getBytes(UTF_8)));
+        DataFrame dataFrame1 = new DataFrame(1, 0, data1);
+
+        List buffers = new ArrayList<>();
+        FramesEncoder encoder = new FramesEncoder();
+        buffers.addAll(encoder.encodeFrame(dataFrame1));
+
+        ByteBuffer combined = ByteBuffer.allocate(1024);
+        buffers.stream().forEach(combined::put);
+        combined.flip();
+
+        TestFrameProcessor testFrameProcessor = new TestFrameProcessor() {
+            @Override
+            public void processFrame(Http2Frame frame) throws IOException {
+                assertTrue(frame instanceof DataFrame);
+                DataFrame dataFrame = (DataFrame) frame;
+                List list = dataFrame.getData();
+                assertEquals(list.size(), 1);
+                ByteBuffer data = list.get(0);
+                byte[] bytes = new byte[data.remaining()];
+                data.get(bytes);
+                assertEquals(new String(bytes, UTF_8), "XXXX");
+                out.println("First data received:" + data);
+                assertEquals(data.position(), data.limit());  // since bytes read
+                //assertNotEquals(data.limit(), data.capacity());
+                assertEquals(data.capacity(), 1024 - 9 /*frame header*/);
+                count++;
+            }
+        };
+        FramesDecoder decoder = new FramesDecoder(testFrameProcessor);
+
+        out.println("Sending " + combined + " to decoder: ");
+        decoder.decode(combined);
+        Assert.assertEquals(testFrameProcessor.numberOfFramesDecoded(), 1);
+    }
+}
diff --git a/test/jdk/java/security/KeyStore/ProbeKeystores.java b/test/jdk/java/security/KeyStore/ProbeKeystores.java
index f97c416cfe4..76d1da59507 100644
--- a/test/jdk/java/security/KeyStore/ProbeKeystores.java
+++ b/test/jdk/java/security/KeyStore/ProbeKeystores.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
  * 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 8044445
+ * @bug 8044445 8194307
  * @summary test new methods from JEP-229: Create PKCS12 Keystores by Default
  */
 
@@ -37,9 +37,26 @@ import javax.security.auth.callback.*;
 public class ProbeKeystores {
     private static final char[] PASSWORD = "changeit".toCharArray();
     private static final char[] BAD_PASSWORD = "badpasword".toCharArray();
+    private static final LoadStoreParameter LOAD_STORE_PARAM =
+        new MyLoadStoreParameter(new PasswordProtection(PASSWORD));
+    private static final LoadStoreParameter BAD_LOAD_STORE_PARAM =
+        new MyLoadStoreParameter(new PasswordProtection(BAD_PASSWORD));
     private static final String DIR = System.getProperty("test.src", ".");
     private static final String CERT_FILE = "trusted.pem";
 
+    private static class MyLoadStoreParameter implements LoadStoreParameter {
+
+        private ProtectionParameter protection;
+
+        MyLoadStoreParameter(ProtectionParameter protection) {
+            this.protection = protection;
+        }
+
+        public ProtectionParameter getProtectionParameter() {
+            return protection;
+        }
+    }
+
     public static final void main(String[] args) throws Exception {
 
         // Testing empty keystores
@@ -173,6 +190,23 @@ public class ProbeKeystores {
         } catch (IOException e) {
             System.out.println("Failed to load a " + type + " keystore named '" + file + "' (as expected)");
         }
+
+        // Now try with the correct password within a LoadStoreParameter
+        ks = KeyStore.getInstance(new File(file), LOAD_STORE_PARAM);
+        if (!type.equalsIgnoreCase(ks.getType())) {
+            throw new Exception("ERROR: expected a " + type + " keystore, " +
+                "got a " + ks.getType() + " keystore instead");
+        } else {
+            System.out.println("Probed a " + type + " keystore named '" + file + "'");
+        }
+
+        // Next try with an incorrect password within a LoadStoreParameter
+        try {
+            ks = KeyStore.getInstance(new File(file), BAD_LOAD_STORE_PARAM);
+            throw new Exception("ERROR: expected an exception but got success");
+        } catch (IOException e) {
+            System.out.println("Failed to load a " + type + " keystore named '" + file + "' (as expected)");
+        }
     }
 
     // Instantiate a keystore by probing the supplied file for the keystore type
diff --git a/test/jdk/java/time/test/java/time/format/ZoneName.java b/test/jdk/java/time/test/java/time/format/ZoneName.java
index 591626d1981..a94f1466dea 100644
--- a/test/jdk/java/time/test/java/time/format/ZoneName.java
+++ b/test/jdk/java/time/test/java/time/format/ZoneName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -194,7 +194,7 @@ class ZoneName {
         "Pacific/Rarotonga", "Cook", "Pacific/Rarotonga",
         "America/Louisville", "America_Eastern", "America/New_York",
         "Africa/El_Aaiun", "Europe_Western", "Atlantic/Canary",
-        "Africa/Sao_Tome", "GMT", "Atlantic/Reykjavik",
+        "Africa/Sao_Tome", "Africa_Western", "Africa/Lagos",
         "Pacific/Fiji", "Fiji", "Pacific/Fiji",
         "Asia/Damascus", "Europe_Eastern", "Europe/Bucharest",
         "Asia/Ulaanbaatar", "Mongolia", "Asia/Ulaanbaatar",
@@ -508,6 +508,7 @@ class ZoneName {
         "Africa_Central", "CD", "Africa/Lubumbashi",
         "Africa_Central", "BI", "Africa/Bujumbura",
         "Africa_Central", "RW", "Africa/Kigali",
+        "Africa_Western", "ST", "Africa/Sao_Tome",
         "Africa_Western", "CF", "Africa/Bangui",
         "Africa_Western", "AO", "Africa/Luanda",
         "Africa_Western", "NE", "Africa/Niamey",
@@ -549,7 +550,6 @@ class ZoneName {
         "GMT", "GN", "Africa/Conakry",
         "GMT", "SL", "Africa/Freetown",
         "GMT", "BF", "Africa/Ouagadougou",
-        "GMT", "ST", "Africa/Sao_Tome",
         "GMT", "SN", "Africa/Dakar",
         "GMT", "CI", "Africa/Abidjan",
         "GMT", "IE", "Europe/Dublin",
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/VERSION b/test/jdk/sun/util/calendar/zi/tzdata/VERSION
index 66429083107..561bd27bce5 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/VERSION
+++ b/test/jdk/sun/util/calendar/zi/tzdata/VERSION
@@ -21,4 +21,4 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-tzdata2017c
+tzdata2018c
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/africa b/test/jdk/sun/util/calendar/zi/tzdata/africa
index 10d4dfaabbc..92c0b43ecf0 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/africa
+++ b/test/jdk/sun/util/calendar/zi/tzdata/africa
@@ -181,7 +181,6 @@ Link Africa/Abidjan Africa/Freetown	# Sierra Leone
 Link Africa/Abidjan Africa/Lome		# Togo
 Link Africa/Abidjan Africa/Nouakchott	# Mauritania
 Link Africa/Abidjan Africa/Ouagadougou	# Burkina Faso
-Link Africa/Abidjan Africa/Sao_Tome	# São Tomé and Príncipe
 Link Africa/Abidjan Atlantic/St_Helena	# St Helena
 
 # Djibouti
@@ -448,7 +447,7 @@ Link Africa/Nairobi Indian/Mayotte
 #
 # The Nautical Almanac for the Year 1970, p 264, is the source for -0:44:30.
 #
-# In 1972 Liberia was the last country to switch from a UTC offset
+# In 1972 Liberia was the last country to switch from a UT offset
 # that was not a multiple of 15 or 20 minutes.  The 1972 change was on
 # 1972-01-07, according to an entry dated 1972-01-04 on p 330 of:
 # Presidential Papers: First year of the administration of
@@ -1060,6 +1059,19 @@ Zone	Indian/Reunion	3:41:52 -	LMT	1911 Jun # Saint-Denis
 #	Inaccessible, Nightingale: uninhabited
 
 # São Tomé and Príncipe
+
+# From Steffen Thorsen (2018-01-08):
+# Multiple sources tell that São Tomé changed from UTC to UTC+1 as
+# they entered the year 2018.
+# From Michael Deckers (2018-01-08):
+# the switch is from 01:00 to 02:00 ... [Decree No. 25/2017]
+# http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017
+
+Zone	Africa/Sao_Tome	 0:26:56 -	LMT	1884
+			-0:36:45 -	LMT	1912 # Lisbon Mean Time
+			 0:00	-	GMT	2018 Jan  1 01:00
+			 1:00	-	WAT
+
 # Senegal
 # See Africa/Abidjan.
 
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/asia b/test/jdk/sun/util/calendar/zi/tzdata/asia
index 71f5d0cfc83..c281ece84de 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/asia
+++ b/test/jdk/sun/util/calendar/zi/tzdata/asia
@@ -73,7 +73,7 @@
 #	9:00 KST  KDT	Korea when at +09
 #	9:30 ACST	Australian Central Standard Time
 # Otherwise, these tables typically use numeric abbreviations like +03
-# and +0330 for integer hour and minute UTC offsets.  Although earlier
+# and +0330 for integer hour and minute UT offsets.  Although earlier
 # editions invented alphabetic time zone abbreviations for every
 # offset, this did not reflect common practice.
 #
@@ -670,17 +670,17 @@ Zone	Asia/Hong_Kong	7:36:42 -	LMT	1904 Oct 30
 # time", in which abolished the adoption of Western Standard Time in
 # western islands (listed above), which means the whole Japan
 # territory, including later occupations, adopt Japan Central Time
-# (UTC+9). The adoption began on Oct 1, 1937. The original text can
+# (UT+9). The adoption began on Oct 1, 1937. The original text can
 # be found on Wikisource:
 # https://ja.wikisource.org/wiki/明治二十八年勅令第百六十七號標準時ニ關スル件中改正ノ件
 #
-# That is, the time zone of Taipei switched to UTC+9 on Oct 1, 1937.
+# That is, the time zone of Taipei switched to UT+9 on Oct 1, 1937.
 
 # From Yu-Cheng Chuang (2014-07-02):
-# I've found more evidence about when the time zone was switched from UTC+9
-# back to UTC+8 after WW2.  I believe it was on Sep 21, 1945.  In a document
+# I've found more evidence about when the time zone was switched from UT+9
+# back to UT+8 after WW2.  I believe it was on Sep 21, 1945.  In a document
 # during Japanese era [1] in which the officer told the staff to change time
-# zone back to Western Standard Time (UTC+8) on Sep 21.  And in another
+# zone back to Western Standard Time (UT+8) on Sep 21.  And in another
 # history page of National Cheng Kung University [2], on Sep 21 there is a
 # note "from today, switch back to Western Standard Time".  From these two
 # materials, I believe that the time zone change happened on Sep 21.  And
@@ -1487,17 +1487,17 @@ Zone	Asia/Jerusalem	2:20:54 -	LMT	1880
 # of the Japanese wanted to scrap daylight-saving time, as opposed to 30% who
 # wanted to keep it.)
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that DST in Japan during those years was as follows:
+# From Takayuki Nikai (2018-01-19):
+# The source of information is Japanese law.
+# http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/00219480428029.htm
+# http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/00719500331039.htm
+# ... In summary, it is written as follows.  From 24:00 on the first Saturday
+# in May, until 0:00 on the day after the second Saturday in September.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Japan	1948	only	-	May	Sun>=1	2:00	1:00	D
-Rule	Japan	1948	1951	-	Sep	Sat>=8	2:00	0	S
-Rule	Japan	1949	only	-	Apr	Sun>=1	2:00	1:00	D
-Rule	Japan	1950	1951	-	May	Sun>=1	2:00	1:00	D
-# but the only locations using it (for birth certificates, presumably, since
-# their audience is astrologers) were US military bases.  For now, assume
-# that for most purposes daylight-saving time was observed; otherwise, what
-# would have been the point of the 1951 poll?
+Rule	Japan	1948	only	-	May	Sat>=1	24:00	1:00	D
+Rule	Japan	1948	1951	-	Sep	Sun>=9	 0:00	0	S
+Rule	Japan	1949	only	-	Apr	Sat>=1	24:00	1:00	D
+Rule	Japan	1950	1951	-	May	Sat>=1	24:00	1:00	D
 
 # From Hideyuki Suzuki (1998-11-09):
 # 'Tokyo' usually stands for the former location of Tokyo Astronomical
@@ -1528,7 +1528,7 @@ Rule	Japan	1950	1951	-	May	Sun>=1	2:00	1:00	D
 #
 # ...the Showa Emperor announced Ordinance No. 529 of Showa Year 12 ... which
 # means the whole Japan territory, including later occupations, adopt Japan
-# Central Time (UTC+9). The adoption began on Oct 1, 1937.
+# Central Time (UT+9). The adoption began on Oct 1, 1937.
 # https://ja.wikisource.org/wiki/明治二十八年勅令第百六十七號標準時ニ關スル件中改正ノ件
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -2089,8 +2089,8 @@ Zone Asia/Kuching	7:21:20	-	LMT	1926 Mar
 
 # Maldives
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Indian/Maldives	4:54:00 -	LMT	1880 # Male
-			4:54:00	-	MMT	1960 # Male Mean Time
+Zone	Indian/Maldives	4:54:00 -	LMT	1880 # Malé
+			4:54:00	-	MMT	1960 # Malé Mean Time
 			5:00	-	+05
 
 # Mongolia
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/australasia b/test/jdk/sun/util/calendar/zi/tzdata/australasia
index 6726ef33816..f97957d3b0a 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/australasia
+++ b/test/jdk/sun/util/calendar/zi/tzdata/australasia
@@ -706,8 +706,8 @@ Zone Pacific/Guadalcanal 10:39:48 -	LMT	1912 Oct # Honiara
 # From Steffen Thorsen (2012-07-25)
 # ... we double checked by calling hotels and offices based in Tokelau asking
 # about the time there, and they all told a time that agrees with UTC+13....
-# Shanks says UTC-10 from 1901 [but] ... there is a good chance the change
-# actually was to UTC-11 back then.
+# Shanks says UT-10 from 1901 [but] ... there is a good chance the change
+# actually was to UT-11 back then.
 #
 # From Paul Eggert (2012-07-25)
 # A Google Books snippet of Appendix to the Journals of the House of
@@ -1473,7 +1473,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 #
 # From Paul Eggert (2006-03-22):
 # The Department of Internal Affairs (DIA) maintains a brief history,
-# as does Carol Squires; see tz-link.htm for the full references.
+# as does Carol Squires; see tz-link.html for the full references.
 # Use these sources in preference to Shanks & Pottenger.
 #
 # For Chatham, IATA SSIM (1991/1999) gives the NZ rules but with
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/europe b/test/jdk/sun/util/calendar/zi/tzdata/europe
index 6359279d2fa..1565814a3e3 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/europe
+++ b/test/jdk/sun/util/calendar/zi/tzdata/europe
@@ -91,14 +91,15 @@
 #        0:00       WET  WEST WEMT  Western Europe
 #        0:19:32.13 AMT* NST*       Amsterdam, Netherlands Summer (1835-1937)
 #        1:00       BST             British Standard (1968-1971)
+#        1:00       IST  GMT        Irish Standard (1968-) with winter DST
 #        1:00       CET  CEST CEMT  Central Europe
 #        1:00:14    SET             Swedish (1879-1899)
 #        1:36:34    RMT* LST*       Riga, Latvian Summer (1880-1926)*
 #        2:00       EET  EEST       Eastern Europe
 #        3:00       MSK  MSD  MDST* Moscow
 
-# From Peter Ilieve (1994-12-04),
-# The original six [EU members]: Belgium, France, (West) Germany, Italy,
+# From Peter Ilieve (1994-12-04), re EEC/EC/EU members:
+# The original six: Belgium, France, (West) Germany, Italy,
 # Luxembourg, the Netherlands.
 # Plus, from 1 Jan 73: Denmark, Ireland, United Kingdom.
 # Plus, from 1 Jan 81: Greece.
@@ -301,16 +302,31 @@
 # The following claim by Shanks & Pottenger is possible though doubtful;
 # we'll ignore it for now.
 #     * Dublin's 1971-10-31 switch was at 02:00, even though London's was 03:00.
+
+# From Paul Eggert (2017-12-04):
 #
-#
-# Whitman says Dublin Mean Time was -0:25:21, which is more precise than
-# Shanks & Pottenger.
-# Perhaps this was Dunsink Observatory Time, as Dunsink Observatory
-# (8 km NW of Dublin's center) seemingly was to Dublin as Greenwich was
-# to London.  For example:
+# Dunsink Observatory (8 km NW of Dublin's center) was to Dublin as
+# Greenwich was to London.  For example:
 #
 #   "Timeball on the ballast office is down.  Dunsink time."
 #   -- James Joyce, Ulysses
+#
+# The abbreviation DMT stood for "Dublin Mean Time" or "Dunsink Mean Time";
+# this being Ireland, opinions differed.
+#
+# Whitman says Dublin/Dunsink Mean Time was UT-00:25:21, which agrees
+# with measurements of recent visitors to the Meridian Room of Dunsink
+# Observatory; see Malone D. Dunsink and timekeeping. 2016-01-24.
+# .  Malone
+# writes that the Nautical Almanac listed UT-00:25:22 until 1896, when
+# it moved to UT-00:25:21.1 (I confirmed that the 1893 edition used
+# the former and the 1896 edition used the latter).  Evidently the
+# news of this change propagated slowly, as Milne 1899 still lists
+# UT-00:25:22 and cites the International Telegraph Bureau.  As it is
+# not clear that there was any practical significance to the change
+# from UT-00:25:22 to UT-00:25:21.1 in civil timekeeping, omit this
+# transition for now and just use the latter value, omitting its
+# fraction since our format cannot represent fractions.
 
 # "Countess Markievicz ... claimed that the [1916] abolition of Dublin Mean Time
 # was among various actions undertaken by the 'English' government that
@@ -370,12 +386,28 @@
 # regulations. I spoke this morning with the Secretary of the Department of
 # Justice (tel +353 1 678 9711) who confirmed to me that the correct name is
 # "Irish Summer Time", abbreviated to "IST".
+#
+# From Paul Eggert (2017-12-07):
+# The 1996 anonymous contributor's goal was to determine the correct
+# abbreviation for summer time in Dublin and so the contributor
+# focused on the "IST", not on the "Irish Summer Time".  Though the
+# "IST" was correct, the "Irish Summer Time" appears to have been an
+# error, as Ireland's Standard Time (Amendment) Act, 1971 states that
+# standard time in Ireland remains at UT +01 and is observed in
+# summer, and that Greenwich mean time is observed in winter.  (Thanks
+# to Derick Rethans for pointing out the error.)  That is, when
+# Ireland amended the 1968 act that established UT +01 as Irish
+# Standard Time, it left standard time unchanged and established GMT
+# as a negative daylight saving time in winter.  So, in this database
+# IST stands for Irish Summer Time for timestamps before 1968, and for
+# Irish Standard Time after that.  See:
+# http://www.irishstatutebook.ie/eli/1971/act/17/enacted/en/print
 
 # Michael Deckers (2017-06-01) gave the following URLs for Ireland's
 # Summer Time Act, 1925 and Summer Time Orders, 1926 and 1947:
-# http://www.irishstatutebook.ie/eli/1925/act/8/enacted/en/print.html
-# http://www.irishstatutebook.ie/eli/1926/sro/919/made/en/print.html
-# http://www.irishstatutebook.ie/eli/1947/sro/71/made/en/print.html
+# http://www.irishstatutebook.ie/eli/1925/act/8/enacted/en/print
+# http://www.irishstatutebook.ie/eli/1926/sro/919/made/en/print
+# http://www.irishstatutebook.ie/eli/1947/sro/71/made/en/print
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 # Summer Time Act, 1916
@@ -499,9 +531,23 @@ Link	Europe/London	Europe/Jersey
 Link	Europe/London	Europe/Guernsey
 Link	Europe/London	Europe/Isle_of_Man
 
+# From Paul Eggert (2018-01-19):
+# The following is like GB-Eire and EU, except with standard time in
+# summer and negative daylight saving time in winter.
+# Although currently commented out, this will need to become uncommented
+# once the ICU/OpenJDK workaround is removed; see below.
+# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
+#Rule	Eire	1971	only	-	Oct	31	 2:00u	-1:00	GMT
+#Rule	Eire	1972	1980	-	Mar	Sun>=16	 2:00u	0	IST
+#Rule	Eire	1972	1980	-	Oct	Sun>=23	 2:00u	-1:00	GMT
+#Rule	Eire	1981	max	-	Mar	lastSun	 1:00u	0	IST
+#Rule	Eire	1981	1989	-	Oct	Sun>=23	 1:00u	-1:00	GMT
+#Rule	Eire	1990	1995	-	Oct	Sun>=22	 1:00u	-1:00	GMT
+#Rule	Eire	1996	max	-	Oct	lastSun	 1:00u	-1:00	GMT
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Dublin	-0:25:00 -	LMT	1880 Aug  2
-			-0:25:21 -	DMT	1916 May 21  2:00s # Dublin MT
+			-0:25:21 -	DMT	1916 May 21  2:00s
 			-0:25:21 1:00	IST	1916 Oct  1  2:00s
 			 0:00	GB-Eire	%s	1921 Dec  6 # independence
 			 0:00	GB-Eire	GMT/IST	1940 Feb 25  2:00s
@@ -510,16 +556,33 @@ Zone	Europe/Dublin	-0:25:00 -	LMT	1880 Aug  2
 			 0:00	1:00	IST	1947 Nov  2  2:00s
 			 0:00	-	GMT	1948 Apr 18  2:00s
 			 0:00	GB-Eire	GMT/IST	1968 Oct 27
+# From Paul Eggert (2018-01-18):
+# The next line should look like this:
+#			 1:00	Eire	IST/GMT
+# However, in January 2018 we discovered that the Eire rules cause
+# problems with tests for ICU:
+# https://mm.icann.org/pipermail/tz/2018-January/025825.html
+# and with tests for OpenJDK:
+# https://mm.icann.org/pipermail/tz/2018-January/025822.html
+# To work around this problem, use a traditional approximation for
+# time stamps after 1971-10-31 02:00 UTC, to give ICU and OpenJDK
+# developers breathing room to fix bugs.  This approximation has
+# correct UTC offsets, but results in tm_isdst flags are the reverse
+# of what they should be.  This workaround is temporary and should be
+# removed reasonably soon.
 			 1:00	-	IST	1971 Oct 31  2:00u
 			 0:00	GB-Eire	GMT/IST	1996
 			 0:00	EU	GMT/IST
+# End of workaround for ICU and OpenJDK bugs.
+
 
 ###############################################################################
 
 # Europe
 
-# EU rules are for the European Union, previously known as the EC, EEC,
-# Common Market, etc.
+# The following rules are for the European Union and for its
+# predecessor organization, the European Communities.
+# For brevity they are called "EU rules" elsewhere in this file.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	EU	1977	1980	-	Apr	Sun>=1	 1:00u	1:00	S
@@ -952,7 +1015,7 @@ Zone	Europe/Prague	0:57:44 -	LMT	1850
 # The page http://www.retsinfo.dk/_GETDOCI_/ACCN/A18930008330-REGL
 # confirms this, and states that the law was put forth 1893-03-29.
 #
-# The EU treaty with effect from 1973:
+# The EU [actually, EEC and Euratom] treaty with effect from 1973:
 # http://www.retsinfo.dk/_GETDOCI_/ACCN/A19722110030-REGL
 #
 # This provoked a new law from 1974 to make possible summer time changes
@@ -1008,9 +1071,10 @@ Zone Atlantic/Faroe	-0:27:04 -	LMT	1908 Jan 11 # Tórshavn
 # East Greenland and Franz Josef Land, but we don't know their time zones.
 # My source for this is Wilhelm Dege's book mentioned under Svalbard.
 #
-# From Paul Eggert (2006-03-22):
-# Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01,
-# and left the EU on 1985-02-01.  It therefore should have been using EU
+# From Paul Eggert (2017-12-10):
+# Greenland joined the European Communities as part of Denmark,
+# obtained home rule on 1979-05-01, and left the European Communities
+# on 1985-02-01.  It therefore should have been using EU
 # rules at least through 1984.  Shanks & Pottenger say Scoresbysund and Godthåb
 # used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU
 # rules since at least 1991.  Assume EU rules since 1980.
@@ -1324,7 +1388,7 @@ Zone	Europe/Paris	0:09:21 -	LMT	1891 Mar 15  0:01
 # From Markus Kuhn (1998-09-29):
 # The German time zone web site by the Physikalisch-Technische
 # Bundesanstalt contains DST information back to 1916.
-# [See tz-link.htm for the URL.]
+# [See tz-link.html for the URL.]
 
 # From Jörg Schilling (2002-10-23):
 # In 1945, Berlin was switched to Moscow Summer time (GMT+4) by
@@ -1421,7 +1485,7 @@ Zone	Europe/Athens	1:34:52 -	LMT	1895 Sep 14
 			1:00	Greece	CE%sT	1944 Apr  4
 			2:00	Greece	EE%sT	1981
 			# Shanks & Pottenger say it switched to C-Eur in 1981;
-			# go with EU instead, since Greece joined it on Jan 1.
+			# go with EU rules instead, since Greece joined Jan 1.
 			2:00	EU	EE%sT
 
 # Hungary
@@ -2120,7 +2184,7 @@ Zone	Europe/Warsaw	1:24:00 -	LMT	1880
 # IATA SSIM (1991/1992) reports that the Azores were at -1:00.
 # IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
 # Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
-# harmonized with the EU), and that they stayed +0:00 that winter.
+# harmonized with EU rules), and that they stayed +0:00 that winter.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 # DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
@@ -2795,9 +2859,9 @@ Zone Asia/Omsk		 4:53:30 -	LMT	1919 Nov 14
 #
 # https://regnum.ru/news/society/1957270.html
 # has some historical data for Altai Krai:
-# before 1957: west part on UTC+6, east on UTC+7
-# after 1957: UTC+7
-# since 1995: UTC+6
+# before 1957: west part on UT+6, east on UT+7
+# after 1957: UT+7
+# since 1995: UT+6
 # http://barnaul.rusplt.ru/index/pochemu_altajskij_kraj_okazalsja_v_neprivychnom_chasovom_pojase-17648.html
 # confirms that and provides more details including 1995-05-28 transition date.
 
@@ -3605,6 +3669,17 @@ Zone	Europe/Zurich	0:34:08 -	LMT	1853 Jul 16 # See above comment.
 # The change is permanent, so this is the new standard time in Turkey.
 # It takes effect today, which is not much notice.
 
+# From Kıvanç Yazan (2017-10-28):
+# Turkey will go back to Daylight Saving Time starting 2018-10.
+# http://www.resmigazete.gov.tr/eskiler/2017/10/20171028-5.pdf
+#
+# From Even Scharning (2017-11-08):
+# ... today it was announced that the DST will become "continuous":
+# http://www.hurriyet.com.tr/son-dakika-yaz-saati-uygulamasi-surekli-hale-geldi-40637482
+# From Paul Eggert (2017-11-08):
+# Although Google Translate misfires on that source, it looks like
+# Turkey reversed last month's decision, and so will stay at +03.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Turkey	1916	only	-	May	 1	0:00	1:00	S
 Rule	Turkey	1916	only	-	Oct	 1	0:00	0	-
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/leapseconds b/test/jdk/sun/util/calendar/zi/tzdata/leapseconds
index 9b4ec9ad474..cc5d9288987 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/leapseconds
+++ b/test/jdk/sun/util/calendar/zi/tzdata/leapseconds
@@ -80,5 +80,5 @@ Leap	2012	Jun	30	23:59:60	+	S
 Leap	2015	Jun	30	23:59:60	+	S
 Leap	2016	Dec	31	23:59:60	+	S
 
-#	Updated through IERS Bulletin C54
-#	File expires on:  28 June 2018
+#	Updated through IERS Bulletin C55
+#	File expires on:  28 December 2018
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/northamerica b/test/jdk/sun/util/calendar/zi/tzdata/northamerica
index 99dcc938fa9..2aa184bc6bf 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/northamerica
+++ b/test/jdk/sun/util/calendar/zi/tzdata/northamerica
@@ -371,6 +371,18 @@ Zone America/New_York	-4:56:02 -	LMT	1883 Nov 18 12:03:58
 # Nebraska, eastern North Dakota, Oklahoma, eastern South Dakota,
 # western Tennessee, most of Texas, Wisconsin
 
+# From Paul Eggert (2018-01-07):
+# In 1869 the Chicago Astronomical Society contracted with the city to keep
+# time.  Though delayed by the Great Fire, by 1880 a wire ran from the
+# Dearborn Observatory (on the University of Chicago campus) to City Hall,
+# which then sent signals to police and fire stations.  However, railroads got
+# their time signals from the Allegheny Observatory, the Madison Observatory,
+# the Ann Arbor Observatory, etc., so their clocks did not agree with each
+# other or with the city's official time.  The confusion took some years to
+# clear up.  See:
+# Moser M. How Chicago gave America its time zones. Chicago. 2018-01-04.
+# http://www.chicagomag.com/city-life/January-2018/How-Chicago-Gave-America-Its-Time-Zones/
+
 # From Larry M. Smith (2006-04-26) re Wisconsin:
 # https://docs.legis.wisconsin.gov/statutes/statutes/175.pdf
 # is currently enforced at the 01:00 time of change.  Because the local
@@ -1919,7 +1931,7 @@ Zone America/Edmonton	-7:33:52 -	LMT	1906 Sep
 # manager of the Creston & District Museum. The article was written in May 2009.
 # http://www.ilovecreston.com/?p=articles&t=spec&ar=260
 # According to the article, Creston has not changed its clocks since June 1918.
-# i.e. Creston has been stuck on UTC-7 for 93 years.
+# i.e. Creston has been stuck on UT-7 for 93 years.
 # Dawson Creek, on the other hand, changed its clocks as recently as April 1972.
 
 # Unfortunately the exact date for the time change in June 1918 remains
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/southamerica b/test/jdk/sun/util/calendar/zi/tzdata/southamerica
index d15e8344db0..38dd275398f 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/southamerica
+++ b/test/jdk/sun/util/calendar/zi/tzdata/southamerica
@@ -48,7 +48,7 @@
 # https://www.jstor.org/stable/1774359
 #
 # These tables use numeric abbreviations like -03 and -0330 for
-# integer hour and minute UTC offsets.  Although earlier editions used
+# integer hour and minute UT offsets.  Although earlier editions used
 # alphabetic time zone abbreviations, these abbreviations were
 # invented and did not reflect common practice.
 
@@ -602,7 +602,7 @@ Link America/Curacao America/Aruba
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/La_Paz	-4:32:36 -	LMT	1890
 			-4:32:36 -	CMT	1931 Oct 15 # Calamarca MT
-			-4:32:36 1:00	BOST	1932 Mar 21 # Bolivia ST
+			-4:32:36 1:00	BST	1932 Mar 21 # Bolivia ST
 			-4:00	-	-04
 
 # Brazil
@@ -931,12 +931,25 @@ Rule	Brazil	2007	only	-	Oct	Sun>=8	 0:00	1:00	S
 # [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the
 # 3rd Feb Sunday. There is an exception on the return date when this is
 # the Carnival Sunday then the return date will be the next Sunday...
-Rule	Brazil	2008	max	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Brazil	2008	2017	-	Oct	Sun>=15	0:00	1:00	S
 Rule	Brazil	2008	2011	-	Feb	Sun>=15	0:00	0	-
+# Decree 7,584  (2011-10-13)
+# added Bahia.
 Rule	Brazil	2012	only	-	Feb	Sun>=22	0:00	0	-
+# Decree 7,826  (2012-10-15)
+# removed Bahia and added Tocantins.
+# Decree 8,112  (2013-09-30)
+# removed Tocantins.
 Rule	Brazil	2013	2014	-	Feb	Sun>=15	0:00	0	-
 Rule	Brazil	2015	only	-	Feb	Sun>=22	0:00	0	-
 Rule	Brazil	2016	2022	-	Feb	Sun>=15	0:00	0	-
+# From Steffen Thorsen (2017-12-18):
+# According to many media sources, next year's DST start in Brazil will move to
+# the first Sunday of November, and it will stay like that for the years after.
+# ... https://www.timeanddate.com/news/time/brazil-delays-dst-2018.html
+# From Steffen Thorsen (2017-12-20):
+# http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2017/decreto/D9242.htm
+Rule	Brazil	2018	max	-	Nov	Sun>=1	0:00	1:00	S
 Rule	Brazil	2023	only	-	Feb	Sun>=22	0:00	0	-
 Rule	Brazil	2024	2025	-	Feb	Sun>=15	0:00	0	-
 Rule	Brazil	2026	only	-	Feb	Sun>=22	0:00	0	-
@@ -1091,7 +1104,7 @@ Zone America/Rio_Branco	-4:31:12 -	LMT	1914
 
 # From Paul Eggert (2015-04-03):
 # Shanks & Pottenger says America/Santiago introduced standard time in
-# 1890 and rounds its UTC offset to 70W40; guess that in practice this
+# 1890 and rounds its UT offset to 70W40; guess that in practice this
 # was the same offset as in 1916-1919.  It also says Pacific/Easter
 # standardized on 109W22 in 1890; assume this didn't change the clocks.
 #
diff --git a/test/jdk/sun/util/calendar/zi/tzdata/zone.tab b/test/jdk/sun/util/calendar/zi/tzdata/zone.tab
index b1a7f077242..f6d9c667734 100644
--- a/test/jdk/sun/util/calendar/zi/tzdata/zone.tab
+++ b/test/jdk/sun/util/calendar/zi/tzdata/zone.tab
@@ -395,7 +395,7 @@ SM	+4355+01228	Europe/San_Marino
 SN	+1440-01726	Africa/Dakar
 SO	+0204+04522	Africa/Mogadishu
 SR	+0550-05510	America/Paramaribo
-SS	+0451+03136	Africa/Juba
+SS	+0451+03137	Africa/Juba
 ST	+0020+00644	Africa/Sao_Tome
 SV	+1342-08912	America/El_Salvador
 SX	+180305-0630250	America/Lower_Princes
diff --git a/test/jdk/tools/jimage/JImageExtractTest.java b/test/jdk/tools/jimage/JImageExtractTest.java
index 9c015471414..6399aa9773c 100644
--- a/test/jdk/tools/jimage/JImageExtractTest.java
+++ b/test/jdk/tools/jimage/JImageExtractTest.java
@@ -124,18 +124,21 @@ public class JImageExtractTest extends JImageCliTest {
 
     public void testExtractToDirBySymlink() throws IOException {
         Path tmp = Files.createTempDirectory(Paths.get("."), getClass().getName());
+        Path symlink;
         try {
-            Path symlink = Files.createSymbolicLink(Paths.get(".", "symlink"), tmp);
-            jimage("extract", "--dir", symlink.toString(), getImagePath())
-                    .assertSuccess()
-                    .resultChecker(r -> {
-                        assertTrue(r.output.isEmpty(), "Output is not expected");
-                    });
-            verifyExplodedImage(tmp);
-        } catch (UnsupportedOperationException e) {
+            symlink = Files.createSymbolicLink(Paths.get(".", "symlink"), tmp);
+        } catch (IOException|UnsupportedOperationException e) {
             // symlinks are not supported
             // nothing to test
+            return;
         }
+
+        jimage("extract", "--dir", symlink.toString(), getImagePath())
+                .assertSuccess()
+                .resultChecker(r -> {
+                    assertTrue(r.output.isEmpty(), "Output is not expected");
+                });
+        verifyExplodedImage(tmp);
     }
 
     public void testExtractToReadOnlyDir() throws IOException {
diff --git a/test/jdk/tools/jmod/JmodTest.java b/test/jdk/tools/jmod/JmodTest.java
index d6a80deaec7..5038dea0465 100644
--- a/test/jdk/tools/jmod/JmodTest.java
+++ b/test/jdk/tools/jmod/JmodTest.java
@@ -104,7 +104,7 @@ public class JmodTest {
             Path link = Files.createSymbolicLink(
                 libDir.resolve("baz"), libDir.resolve("foo").toAbsolutePath());
             assertTrue(Files.exists(link));
-        } catch (UnsupportedOperationException uoe) {
+        } catch (IOException|UnsupportedOperationException uoe) {
             // OS does not support symlinks. Nothing to test!
             return;
         }