summary refs log tree commit diff
path: root/timezone
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-12 18:26:36 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-12 18:26:36 +0000
commit0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch)
tree2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /timezone
parent7d58530341304d403a6626d7f7a1913165fe2f32 (diff)
downloadglibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.xz
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.zip
2.5-18.1
Diffstat (limited to 'timezone')
-rw-r--r--timezone/Makefile30
-rw-r--r--timezone/africa33
-rw-r--r--timezone/antarctica51
-rw-r--r--timezone/asia355
-rw-r--r--timezone/australasia155
-rw-r--r--timezone/backward34
-rw-r--r--timezone/checktab.awk4
-rw-r--r--timezone/etcetera7
-rw-r--r--timezone/europe213
-rw-r--r--timezone/factory2
-rw-r--r--timezone/iso3166.tab6
-rw-r--r--timezone/leapseconds65
-rw-r--r--timezone/northamerica560
-rw-r--r--timezone/pacificnew2
-rw-r--r--timezone/private.h123
-rw-r--r--timezone/scheck.c9
-rw-r--r--timezone/solar878
-rw-r--r--timezone/solar888
-rw-r--r--timezone/solar898
-rw-r--r--timezone/southamerica79
-rw-r--r--timezone/systemv36
-rw-r--r--timezone/tst-timezone.c6
-rw-r--r--timezone/tzfile.h62
-rw-r--r--timezone/tzselect.ksh4
-rwxr-xr-xtimezone/yearistype8
-rw-r--r--timezone/zdump.c460
-rw-r--r--timezone/zic.c988
-rw-r--r--timezone/zone.tab43
28 files changed, 2350 insertions, 1009 deletions
diff --git a/timezone/Makefile b/timezone/Makefile
index cf2c7d7f42..9947d45b17 100644
--- a/timezone/Makefile
+++ b/timezone/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1998,1999,2000,2002,2005 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -190,28 +190,24 @@ $(objpfx)tst-timezone.out: $(addprefix $(testdata)/, \
 test-tz-ENV = TZDIR=$(testdata)
 tst-timezone-ENV = TZDIR=$(testdata)
 
-$(testdata)/America/New_York: northamerica $(objpfx)zic $(leapseconds) \
-			      yearistype
-	$(build-testdata)
-$(testdata)/Etc/UTC: etcetera $(objpfx)zic $(leapseconds) yearistype
-	$(build-testdata)
-$(testdata)/UTC: simplebackw $(objpfx)zic $(testdata)/Etc/UTC \
-		 $(leapseconds) yearistype
+# Note this must come second in the deps list for $(built-program-cmd) to work.
+zic-deps = $(objpfx)zic $(leapseconds) yearistype
+
+$(testdata)/America/New_York: northamerica $(zic-deps)
 	$(build-testdata)
-$(testdata)/Europe/Berlin: europe $(objpfx)zic $(leapseconds) yearistype
+$(testdata)/Etc/UTC: etcetera $(zic-deps)
 	$(build-testdata)
-$(testdata)/Universal: simplebackw $(objpfx)zic $(testdata)/Etc/UTC \
-		       $(leapseconds) yearistype
+# Use a pattern rule to indicate the command produces both targets at once.
+# Two separate targets built separately can collide if in parallel.
+%/UTC %/Universal: simplebackw $(zic-deps) %/Etc/UTC
 	$(build-testdata)
-$(testdata)/Australia/Melbourne: australasia $(objpfx)zic $(leapseconds) \
-				 yearistype
+$(testdata)/%/Berlin $(testdata)/%/London: europe $(zic-deps)
 	$(build-testdata)
-$(testdata)/America/Sao_Paulo: southamerica $(objpfx)zic $(leapseconds) \
-			       yearistype
+$(testdata)/Australia/Melbourne: australasia $(zic-deps)
 	$(build-testdata)
-$(testdata)/Asia/Tokyo: asia $(objpfx)zic $(leapseconds) yearistype
+$(testdata)/America/Sao_Paulo: southamerica $(zic-deps)
 	$(build-testdata)
-$(testdata)/Europe/London: europe $(objpfx)zic $(leapseconds) yearistype
+$(testdata)/Asia/Tokyo: asia $(zic-deps)
 	$(build-testdata)
 
 
diff --git a/timezone/africa b/timezone/africa
index e8223f78f5..29625df934 100644
--- a/timezone/africa
+++ b/timezone/africa
@@ -1,10 +1,11 @@
-# @(#)africa	7.36
+# @(#)africa	8.1
+# <pre>
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert <eggert@twinsun.com> (1999-03-22):
+# From Paul Eggert (1999-03-22):
 #
 # A good source for time zone historical data outside the U.S. is
 # Thomas G. Shanks, The International Atlas (5th edition),
@@ -28,7 +29,7 @@
 #
 # Previous editions of this database used WAT, CAT, SAT, and EAT
 # for +0:00 through +3:00, respectively,
-# but Mark R V Murray <markm@grondar.za> reports that
+# but Mark R V Murray reports that
 # `SAST' is the official abbreviation for +2:00 in the country of South Africa,
 # `CAT' is commonly used for +2:00 in countries north of South Africa, and
 # `WAT' is probably the best name for +1:00, as the common phrase for
@@ -287,7 +288,7 @@ Zone	Africa/Maseru	1:50:00 -	LMT	1903 Mar
 			2:00	-	SAST
 
 # Liberia
-# From Paul Eggert <eggert@twinsun.com> (2001-07-17):
+# From Paul Eggert (2001-07-17):
 # In 1972 Liberia was the last country to switch
 # from a UTC offset that was not a multiple of 15 or 20 minutes.
 # Howse reports that it was in honor of their president's birthday.
@@ -317,7 +318,7 @@ Rule	Libya	1985	only	-	Apr	 6	0:00	1:00	S
 Rule	Libya	1986	only	-	Apr	 4	0:00	1:00	S
 Rule	Libya	1986	only	-	Oct	 3	0:00	0	-
 Rule	Libya	1987	1989	-	Apr	 1	0:00	1:00	S
-Rule	Libya	1987	1990	-	Oct	 1	0:00	0	-
+Rule	Libya	1987	1989	-	Oct	 1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Tripoli	0:52:44 -	LMT	1920
 			1:00	Libya	CE%sT	1959
@@ -348,9 +349,6 @@ Zone	Africa/Bamako	-0:32:00 -	LMT	1912
 			 0:00	-	GMT	1934 Feb 26
 			-1:00	-	WAT	1960 Jun 20
 			 0:00	-	GMT
-# no longer different from Bamako, but too famous to omit
-Zone	Africa/Timbuktu	-0:12:04 -	LMT	1912
-			 0:00	-	GMT
 
 # Mauritania
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -557,6 +555,23 @@ Zone	Africa/Lome	0:04:52 -	LMT	1893
 			0:00	-	GMT
 
 # Tunisia
+
+# From Gwillim Law (2005-04-30):
+#
+# My correspondent, Risto Nykanen, has alerted me to another adoption of DST,
+# this time in Tunisia.  According to Yahoo France News
+# <http://fr.news.yahoo.com/050426/5/4dumk.html>, in a story attributed to AP
+# and dated 2005-04-26, "Tunisia has decided to advance its official time by
+# one hour, starting on Sunday, May 1.  Henceforth, Tunisian time will be
+# UTC+2 instead of UTC+1.  The change will take place at 23:00 UTC next
+# Saturday."  (My translation)
+#
+# From Oscar van Vlijmen (2005-05-02):
+# LaPresse, the first national daily newspaper ...
+# <http://www.lapresse.tn/archives/archives280405/actualites/lheure.html>
+# ... DST for 2005: on: Sun May 1 0h standard time, off: Fri Sept. 30,
+# 1h standard time.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Tunisia	1939	only	-	Apr	15	23:00s	1:00	S
 Rule	Tunisia	1939	only	-	Nov	18	23:00s	0	-
@@ -579,6 +594,8 @@ Rule	Tunisia	1988	only	-	Jun	 1	 0:00s	1:00	S
 Rule	Tunisia	1988	1990	-	Sep	lastSun	 0:00s	0	-
 Rule	Tunisia	1989	only	-	Mar	26	 0:00s	1:00	S
 Rule	Tunisia	1990	only	-	May	 1	 0:00s	1:00	S
+Rule	Tunisia	2005	only	-	May	 1	 0:00s	1:00	S
+Rule	Tunisia	2005	only	-	Sep	30	 1:00s	0	-
 # Shanks gives 0:09 for Paris Mean Time; go with Howse's more precise 0:09:21.
 # Shanks says the 1911 switch occurred on Mar 9; go with Howse's Mar 11.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
diff --git a/timezone/antarctica b/timezone/antarctica
index b5c12cbaee..8a9ea939c9 100644
--- a/timezone/antarctica
+++ b/timezone/antarctica
@@ -1,4 +1,5 @@
-# @(#)antarctica	7.23
+# @(#)antarctica	8.1
+# <pre>
 
 # From Paul Eggert (1999-11-15):
 # To keep things manageable, we list only locations occupied year-round; see
@@ -59,7 +60,7 @@ Rule	ChileAQ	2000	max	-	Mar	Sun>=9	0:00	0	-
 # Australia - territories
 # Heard Island, McDonald Islands (uninhabited)
 #	previously sealers and scientific personnel wintered
-#	<a href="http://www.dstc.qut.edu.au/DST/marg/daylight.html">
+#	<a href="http://web.archive.org/web/20021204222245/http://www.dstc.qut.edu.au/DST/marg/daylight.html">
 #	Margaret Turner reports
 #	</a> (1999-09-30) that they're UTC+5, with no DST;
 #	presumably this is when they have visitors.
@@ -90,23 +91,23 @@ Zone Antarctica/Mawson	0	-	zzz	1954 Feb 13
 # </a>
 
 # Brazil - year-round base
-# Ferraz, King George Island, since 1983/4
+# Comandante Ferraz, King George Island, -6205+05824, since 1983/4
 
 # Chile - year-round bases and towns
 # Escudero, South Shetland Is, -621157-0585735, since 1994
-# Frei, King George Island, -6214-05848, since 1969-03-07
-# O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02
-# Prat, -6230-05941
-# Villa Las Estrellas (a town), King George Island, since 1984-04-09
+# Presidente Eduadro Frei, King George Island, -6214-05848, since 1969-03-07
+# General Bernardo O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02
+# Capitan Arturo Prat, -6230-05941
+# Villa Las Estrellas (a town), around the Frei base, since 1984-04-09
 # These locations have always used Santiago time; use TZ='America/Santiago'.
 
 # China - year-round bases
-# Great Wall, King George Island, since 1985-02-20
-# Zhongshan, Larsemann Hills, Prydz Bay, since 1989-02-26
+# Great Wall, King George Island, -6213-05858, since 1985-02-20
+# Zhongshan, Larsemann Hills, Prydz Bay, -6922+07623, since 1989-02-26
 
 # France - year-round bases
 #
-# From Antoine Leca <Antoine.Leca@Renault.FR> (1997-01-20):
+# From Antoine Leca (1997-01-20):
 # Time data are from Nicole Pailleau at the IFRTP
 # (French Institute for Polar Research and Technology).
 # She confirms that French Southern Territories and Terre Adelie bases
@@ -139,25 +140,22 @@ Zone Antarctica/DumontDUrville 0 -	zzz	1947
 			0	-	zzz	1956 Nov
 			10:00	-	DDUT	# Dumont-d'Urville Time
 # Reference:
-# <a href="http://www.icair.iac.org.nz/science/reports/fr/IFRTP.html">
-# Support and Development of Polar Research and Technology (1997-02-03)
+# <a href="http://en.wikipedia.org/wiki/Dumont_d'Urville_Station">
+# Dumont d'Urville Station (2005-12-05)
 # </a>
 
-
 # Germany - year-round base
-# Georg von Neumayer
+# Georg von Neumayer, -7039-00815
 
 # India - year-round base
-# Dakshin Gangotri
+# Dakshin Gangotri, -7005+01200
 
 # Japan - year-round bases
-# Dome Fuji
-# Syowa
+# Dome Fuji, -7719+03942
+# Syowa, -690022+0393524
 #
 # From Hideyuki Suzuki (1999-02-06):
-# In all Japanese stations, +0300 is used as the standard time.  [See]
-# <a href="http://www.crl.go.jp/uk/uk201/basyo.htm">[reference in Japanese]</a>
-# and information from KAMO Hiroyasu <wd@ics.nara-wu.ac.jp>.
+# In all Japanese stations, +0300 is used as the standard time.
 #
 # Syowa station, which is the first antarctic station of Japan,
 # was established on 1957-01-29.  Since Syowa station is still the main
@@ -171,7 +169,7 @@ Zone Antarctica/Syowa	0	-	zzz	1957 Jan 29
 # </a>
 
 # S Korea - year-round base
-# King Sejong, King George Island, since 1988
+# King Sejong, King George Island, -6213-05847, since 1988
 
 # New Zealand - claims
 # Balleny Islands (never inhabited)
@@ -202,7 +200,8 @@ Rule	NZAQ	1990	max	-	Mar	Sun>=15	2:00s	0	S
 # Russia - year-round bases
 # Bellingshausen, King George Island, -621159-0585337, since 1968-02-22
 # Mirny, Davis coast, -6633+09301, since 1956-02
-# Molodezhnaya, Alasheyev Bay, year-round from 1962-02 to 1999-07-01
+# Molodezhnaya, Alasheyev Bay, -6740+04551,
+#	year-round from 1962-02 to 1999-07-01
 # Novolazarevskaya, Queen Maud Land, -7046+01150,
 #	year-round from 1960/61 to 1992
 
@@ -234,8 +233,8 @@ Zone Antarctica/Vostok	0	-	zzz	1957 Dec 16
 			6:00	-	VOST	# Vostok time
 
 # S Africa - year-round bases
-# Marion Island
-# Sanae
+# Marion Island, -4653+03752
+# Sanae, -7141-00250
 
 # UK
 #
@@ -270,7 +269,7 @@ Zone Antarctica/Rothera	0	-	zzz	1976 Dec  1
 #
 # Palmer, Anvers Island, since 1965 (moved 2 miles in 1968)
 #
-# From Ethan Dicks <erd@mcmsun5.mcmurdo.gov> (1996-10-06):
+# From Ethan Dicks (1996-10-06):
 # It keeps the same time as Punta Arenas, Chile, because, just like us
 # and the South Pole, that's the other end of their supply line....
 # I verified with someone who was there that since 1980,
@@ -295,7 +294,7 @@ Zone Antarctica/McMurdo	0	-	zzz	1956
 # Normally it wouldn't have a separate entry, since it's like the
 # larger Antarctica/McMurdo since 1970, but it's too famous to omit.
 #
-# From Chris Carrier <72157.3334@CompuServe.COM> (1996-06-27):
+# From Chris Carrier (1996-06-27):
 # Siple, the first commander of the South Pole station,
 # stated that he would have liked to have kept GMT at the station,
 # but that he found it more convenient to keep GMT+12
diff --git a/timezone/asia b/timezone/asia
index 3c2c1a1868..446cc16e6f 100644
--- a/timezone/asia
+++ b/timezone/asia
@@ -1,10 +1,11 @@
-# @(#)asia	7.77
+# @(#)asia	8.1
+# <pre>
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert <eggert@twinsun.com> (1999-03-22):
+# From Paul Eggert (1999-03-22):
 #
 # A good source for time zone historical data outside the U.S. is
 # Thomas G. Shanks, The International Atlas (5th edition),
@@ -43,8 +44,8 @@
 #	8:00 CST	China
 #	9:00 CJT	Central Japanese Time (1896/1937)*
 #	9:00 EIT	east Indonesia
-#	9:00 JST	Japan
-#	9:00 KST	Korea
+#	9:00 JST  JDT	Japan
+#	9:00 KST  KDT	Korea
 #	9:30 CST	(Australian) Central Standard Time
 #
 # See the `europe' file for Russia and Turkey in Asia.
@@ -85,7 +86,7 @@ Zone	Asia/Kabul	4:36:48 -	LMT	1890
 # Shanks has Yerevan switching to 3:00 (with Russian DST) in spring 1991,
 # then to 4:00 with no DST in fall 1995, then readopting Russian DST in 1997.
 # Go with Shanks, even when he disagrees with others.  Edgar Der-Danieliantz
-# <edd@AIC.NET> reported (1996-05-04) that Yerevan probably wouldn't use DST
+# reported (1996-05-04) that Yerevan probably wouldn't use DST
 # in 1996, though it did use DST in 1995.  IATA SSIM (1991/1998) reports that
 # Armenia switched from 3:00 to 4:00 in 1998 and observed DST after 1991,
 # but started switching at 3:00s in 1998.
@@ -99,15 +100,18 @@ Zone	Asia/Yerevan	2:58:00 -	LMT	1924 May  2
 			4:00 RussiaAsia	AM%sT
 
 # Azerbaijan
+# From Rustam Aliyev of the Azerbaijan Internet Forum (2005-10-23):
+# According to the resolution of Cabinet of Ministers, 1997
+# Resolution available at: http://aif.az/docs/daylight_res.pdf
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Azer	1997	max	-	Mar	lastSun	 1:00	1:00	S
-Rule	Azer	1997	max	-	Oct	lastSun	 1:00	0	-
+Rule	Azer	1997	max	-	Mar	lastSun	 4:00	1:00	S
+Rule	Azer	1997	max	-	Oct	lastSun	 5:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Baku	3:19:24 -	LMT	1924 May  2
 			3:00	-	BAKT	1957 Mar    # Baku Time
 			4:00 RussiaAsia BAK%sT	1991 Mar 31 2:00s
 			3:00	1:00	BAKST	1991 Aug 30 # independence
-			3:00 RussiaAsia	AZ%sT	1992 Sep lastSun 2:00s
+			3:00 RussiaAsia	AZ%sT	1992 Sep lastSat 23:00
 			4:00	-	AZT	1996 # Azerbaijan time
 			4:00	EUAsia	AZ%sT	1997
 			4:00	Azer	AZ%sT
@@ -137,8 +141,12 @@ Zone	Asia/Thimphu	5:58:36 -	LMT	1947 Aug 15 # or Thimbu
 # British Indian Ocean Territory
 # Whitman and the 1995 CIA time zone map say 5:00, but the
 # 1997 and later maps say 6:00.  Assume the switch occurred in 1996.
+# We have no information as to when standard time was introduced;
+# assume it occurred in 1907, the same year as Mauritius (which
+# then contained the Chagos Archipelago).
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Indian/Chagos	5:00	-	IOT	1996 # BIOT Time
+Zone	Indian/Chagos	4:49:40	-	LMT	1907
+			5:00	-	IOT	1996 # BIOT Time
 			6:00	-	IOT
 
 # Brunei
@@ -186,7 +194,7 @@ Zone	Asia/Phnom_Penh	6:59:40 -	LMT	1906 Jun  9
 # CHINA               8 H  AHEAD OF UTC  ALL OF CHINA, INCL TAIWAN
 # CHINA               9 H  AHEAD OF UTC  APR 17 - SEP 10
 
-# From Paul Eggert <eggert@twinsun.com> (1995-12-19):
+# From Paul Eggert (1995-12-19):
 # Shanks writes that China has had a single time zone since 1980 May 1,
 # observing summer DST from 1986 through 1991; this contradicts Devine's
 # note about Time magazine, though apparently _something_ happened in 1986.
@@ -197,7 +205,6 @@ Zone	Asia/Phnom_Penh	6:59:40 -	LMT	1906 Jun  9
 Rule	Shang	1940	only	-	Jun	 3	0:00	1:00	D
 Rule	Shang	1940	1941	-	Oct	 1	0:00	0	S
 Rule	Shang	1941	only	-	Mar	16	0:00	1:00	D
-Rule	PRC	1949	only	-	Jan	 1	0:00	0	S
 Rule	PRC	1986	only	-	May	 4	0:00	1:00	D
 Rule	PRC	1986	1991	-	Sep	Sun>=11	0:00	0	S
 Rule	PRC	1987	1991	-	Apr	Sun>=10	0:00	1:00	D
@@ -325,19 +332,19 @@ Zone	Asia/Nicosia	2:13:28 -	LMT	1921 Nov 14
 Link	Asia/Nicosia	Europe/Nicosia
 
 # Georgia
-# From Paul Eggert <eggert@twinsun.com> (1994-11-19):
+# From Paul Eggert (1994-11-19):
 # Today's _Economist_ (p 60) reports that Georgia moved its clocks forward
 # an hour recently, due to a law proposed by Zurab Murvanidze,
 # an MP who went on a hunger strike for 11 days to force discussion about it!
 # We have no details, but we'll guess they didn't move the clocks back in fall.
 #
-# From Mathew Englander <mathew@io.org>, quoting AP (1996-10-23 13:05-04):
+# From Mathew Englander, quoting AP (1996-10-23 13:05-04):
 # Instead of putting back clocks at the end of October, Georgia
 # will stay on daylight savings time this winter to save energy,
 # President Eduard Shevardnadze decreed Wednesday.
 #
 # From the BBC via Joseph S. Myers (2004-06-27):
-#  	
+#
 # Georgia moved closer to Western Europe on Sunday...  The former Soviet
 # republic has changed its time zone back to that of Moscow.  As a result it
 # is now just four hours ahead of Greenwich Mean Time, rather than five hours
@@ -345,6 +352,17 @@ Link	Asia/Nicosia	Europe/Nicosia
 # Mikhail Saakashvili, who said the change was partly prompted by the process
 # of integration into Europe.
 
+# From Teimuraz Abashidze (2005-11-07):
+# Government of Georgia ... decided to NOT CHANGE daylight savings time on
+# [Oct.] 30, as it was done before during last more than 10 years.
+# Currently, we are in fact GMT +4:00, as before 30 October it was GMT
+# +3:00.... The problem is, there is NO FORMAL LAW or governmental document
+# about it.  As far as I can find, I was told, that there is no document,
+# because we just DIDN'T ISSUE document about switching to winter time....
+# I don't know what can be done, especially knowing that some years ago our
+# DST rules where changed THREE TIMES during one month.
+
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Tbilisi	2:59:16 -	LMT	1880
 			2:59:16	-	TBMT	1924 May  2 # Tbilisi Mean Time
@@ -356,7 +374,8 @@ Zone	Asia/Tbilisi	2:59:16 -	LMT	1880
 			4:00 E-EurAsia	GE%sT	1996 Oct lastSun
 			4:00	1:00	GEST	1997 Mar lastSun
 			4:00 E-EurAsia	GE%sT	2004 Jun 27
-			3:00 RussiaAsia	GE%sT
+			3:00 RussiaAsia	GE%sT	2005 Mar lastSun 2:00
+			4:00	-	GET
 
 # East Timor
 
@@ -383,11 +402,11 @@ Zone	Asia/Tbilisi	2:59:16 -	LMT	1880
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Dili	8:22:20 -	LMT	1912
-			8:00	-	TPT	1942 Feb 21 23:00 # E Timor Time
+			8:00	-	TLT	1942 Feb 21 23:00 # E Timor Time
 			9:00	-	JST	1945 Aug
-			9:00	-	TPT	1976 May  3
+			9:00	-	TLT	1976 May  3
 			8:00	-	CIT	2000 Sep 17 00:00
-			9:00	-	TPT
+			9:00	-	TLT
 
 # India
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -472,12 +491,33 @@ Zone Asia/Jayapura	9:22:48 -	LMT	1932 Nov
 # Thursday night of Shahrivar, but I can't give exact dates....
 # I have also changed the abbreviations to what is considered correct
 # here in Iran, IRST for regular time and IRDT for daylight saving time.
-
-# From Paul Eggert (2003-03-15)
+#
+# From Roozbeh Pournader (2005-04-05):
+# The text of the Iranian law, in effect since 1925, clearly mentions
+# that the true solar year is the measure, and there is no arithmetic
+# leap year calculation involved.  There has never been any serious
+# plan to change that law....
+#
+# From Paul Eggert (2005-04-05):
 # Go with Shanks before September 1991, and with Pournader thereafter.
-# I used Ed Reingold's cal-persia in GNU Emacs 21.2 to check Persian dates.
-# The Persian calendar is based on the sun, and dates after around 2050
-# are approximate; stop after 2037 when 32-bit time_t's overflow.
+# I used Ed Reingold's cal-persia in GNU Emacs 21.2 to check Persian dates,
+# stopping after 2037 when 32-bit time_t's overflow.
+# That cal-persia used Birashk's approximation, which disagrees with the solar
+# calendar predictions for the year 2025, so I corrected those dates by hand.
+#
+# From Oscar van Vlijmen (2005-03-30), writing about future
+# discrepancies between cal-persia and the Iranian calendar:
+# For 2091 solar-longitude-after yields 2091-03-20 08:40:07.7 UT for
+# the vernal equinox and that gets so close to 12:00 some local
+# Iranian time that the definition of the correct location needs to be
+# known exactly, amongst other factors.  2157 is even closer:
+# 2157-03-20 08:37:15.5 UT.  But the Gregorian year 2025 should give
+# no interpretation problem whatsoever.  By the way, another instant
+# in the near future where there will be a discrepancy between
+# arithmetical and astronomical Iranian calendars will be in 2058:
+# vernal equinox on 2058-03-20 09:03:05.9 UT.  The Java version of
+# Reingold's/Dershowitz' calculator gives correctly the Gregorian date
+# 2058-03-21 for 1 Farvardin 1437 (astronomical).
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Iran	1978	1980	-	Mar	21	0:00	1:00	D
@@ -515,10 +555,10 @@ Rule	Iran	2020	only	-	Mar	21	0:00	1:00	D
 Rule	Iran	2020	only	-	Sep	21	0:00	0	S
 Rule	Iran	2021	2023	-	Mar	22	0:00	1:00	D
 Rule	Iran	2021	2023	-	Sep	22	0:00	0	S
-Rule	Iran	2024	2025	-	Mar	21	0:00	1:00	D
-Rule	Iran	2024	2025	-	Sep	21	0:00	0	S
-Rule	Iran	2026	2027	-	Mar	22	0:00	1:00	D
-Rule	Iran	2026	2027	-	Sep	22	0:00	0	S
+Rule	Iran	2024	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2024	only	-	Sep	21	0:00	0	S
+Rule	Iran	2025	2027	-	Mar	22	0:00	1:00	D
+Rule	Iran	2025	2027	-	Sep	22	0:00	0	S
 Rule	Iran	2028	2029	-	Mar	21	0:00	1:00	D
 Rule	Iran	2028	2029	-	Sep	21	0:00	0	S
 Rule	Iran	2030	2031	-	Mar	22	0:00	1:00	D
@@ -539,7 +579,7 @@ Zone	Asia/Tehran	3:25:44	-	LMT	1916
 
 # Iraq
 #
-# From Jonathan Lennox <lennox@cs.columbia.edu> (2000-06-12):
+# From Jonathan Lennox (2000-06-12):
 # An article in this week's Economist ("Inside the Saddam-free zone", p. 50 in
 # the U.S. edition) on the Iraqi Kurds contains a paragraph:
 # "The three northern provinces ... switched their clocks this spring and
@@ -638,8 +678,9 @@ Rule	Zion	1987	only	-	Sep	13	0:00	0	S
 Rule	Zion	1988	only	-	Apr	 9	0:00	1:00	D
 Rule	Zion	1988	only	-	Sep	 3	0:00	0	S
 
-# From Ephraim Silverberg <ephraim@cs.huji.ac.il>
-# (1997-03-04, 1998-03-16, 1998-12-28, 2000-01-17 and 2000-07-25):
+# From Ephraim Silverberg
+# (1997-03-04, 1998-03-16, 1998-12-28, 2000-01-17, 2000-07-25, 2004-12-22,
+# and 2005-02-17):
 
 # According to the Office of the Secretary General of the Ministry of
 # Interior, there is NO set rule for Daylight-Savings/Standard time changes.
@@ -690,13 +731,13 @@ Rule	Zion	1995	only	-	Sep	 3	0:00	0	S
 # time, Haim Ramon.  The official announcement regarding 1996-1998
 # (with the dates for 1997-1998 no longer being relevant) can be viewed at:
 #
-#   ftp://ftp.huji.ac.il/pub/tz/announcements/1996-1998.ramon.ps.gz
+#   ftp://ftp.cs.huji.ac.il/pub/tz/announcements/1996-1998.ramon.ps.gz
 #
 # The dates for 1997-1998 were altered by his successor, Rabbi Eli Suissa.
 #
 # The official announcements for the years 1997-1999 can be viewed at:
 #
-#   ftp://ftp.huji.ac.il/pub/tz/announcements/YYYY.ps.gz
+#   ftp://ftp.cs.huji.ac.il/pub/tz/announcements/YYYY.ps.gz
 #
 #       where YYYY is the relevant year.
 
@@ -716,12 +757,12 @@ Rule	Zion	1999	only	-	Sep	 3	2:00	0	S
 #
 # The official announcement for the start date of 2000 can be viewed at:
 #
-#	ftp://ftp.huji.ac.il/pub/tz/announcements/2000-start.ps.gz
+#	ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-start.ps.gz
 #
 # The official announcement for the end date of 2000 and the dates
 # for the years 2001-2004 can be viewed at:
 #
-#	ftp://ftp.huji.ac.il/pub/tz/announcements/2000-2004.ps.gz
+#	ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-2004.ps.gz
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Zion	2000	only	-	Apr	14	2:00	1:00	D
@@ -735,52 +776,80 @@ Rule	Zion	2003	only	-	Oct	 3	1:00	0	S
 Rule	Zion	2004	only	-	Apr	 7	1:00	1:00	D
 Rule	Zion	2004	only	-	Sep	22	1:00	0	S
 
-# From Paul Eggert (2000-07-25):
-# Here are guesses for rules after 2004.
-# They are probably wrong, but they are more likely than no DST at all.
-# Rule	NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
-Rule	Zion	2005	max	-	Apr	 1	1:00	1:00	D
-Rule	Zion	2005	max	-	Oct	 1	1:00	0	S
+# The proposed law agreed upon by the Knesset Interior Committee on
+# 2005-02-14 is that, for 2005 and beyond, DST starts at 02:00 the
+# last Friday before April 2nd (i.e. the last Friday in March or April
+# 1st itself if it falls on a Friday) and ends at 02:00 on the Saturday
+# night _before_ the fast of Yom Kippur.
+#
+# Those who can read Hebrew can view the announcement at:
+#
+#	ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2005+beyond.ps
+
+# From Paul Eggert (2005-02-22):
+# I used Ephraim Silverberg's dst-israel.el program
+# <ftp://ftp.cs.huji.ac.il/pub/tz/software/dst-israel.el> (2005-02-20)
+# along with Ed Reingold's cal-hebrew in GNU Emacs 21.4,
+# to generate the transitions in this list.
+# (I replaced "lastFri" with "Fri>=26" by hand.)
+# The spring transitions below all correspond to the following Rule:
+#
+# Rule	Zion	2005	max	-	Mar	Fri>=26	2:00	1:00	D
+#
+# but older zic implementations (e.g., Solaris 8) do not support
+# "Fri>=26" to mean April 1 in years like 2005, so for now we list the
+# springtime transitions explicitly.
+
+# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
+Rule	Zion	2005	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2005	only	-	Oct	 9	2:00	0	S
+Rule	Zion	2006	2010	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2006	only	-	Oct	 1	2:00	0	S
+Rule	Zion	2007	only	-	Sep	16	2:00	0	S
+Rule	Zion	2008	only	-	Oct	 5	2:00	0	S
+Rule	Zion	2009	only	-	Sep	27	2:00	0	S
+Rule	Zion	2010	only	-	Sep	12	2:00	0	S
+Rule	Zion	2011	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2011	only	-	Oct	 2	2:00	0	S
+Rule	Zion	2012	2015	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2012	only	-	Sep	23	2:00	0	S
+Rule	Zion	2013	only	-	Sep	 8	2:00	0	S
+Rule	Zion	2014	only	-	Sep	28	2:00	0	S
+Rule	Zion	2015	only	-	Sep	20	2:00	0	S
+Rule	Zion	2016	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2016	only	-	Oct	 9	2:00	0	S
+Rule	Zion	2017	2021	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2017	only	-	Sep	24	2:00	0	S
+Rule	Zion	2018	only	-	Sep	16	2:00	0	S
+Rule	Zion	2019	only	-	Oct	 6	2:00	0	S
+Rule	Zion	2020	only	-	Sep	27	2:00	0	S
+Rule	Zion	2021	only	-	Sep	12	2:00	0	S
+Rule	Zion	2022	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2022	only	-	Oct	 2	2:00	0	S
+Rule	Zion	2023	2032	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2023	only	-	Sep	24	2:00	0	S
+Rule	Zion	2024	only	-	Oct	 6	2:00	0	S
+Rule	Zion	2025	only	-	Sep	28	2:00	0	S
+Rule	Zion	2026	only	-	Sep	20	2:00	0	S
+Rule	Zion	2027	only	-	Oct	10	2:00	0	S
+Rule	Zion	2028	only	-	Sep	24	2:00	0	S
+Rule	Zion	2029	only	-	Sep	16	2:00	0	S
+Rule	Zion	2030	only	-	Oct	 6	2:00	0	S
+Rule	Zion	2031	only	-	Sep	21	2:00	0	S
+Rule	Zion	2032	only	-	Sep	12	2:00	0	S
+Rule	Zion	2033	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2033	only	-	Oct	 2	2:00	0	S
+Rule	Zion	2034	2037	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2034	only	-	Sep	17	2:00	0	S
+Rule	Zion	2035	only	-	Oct	 7	2:00	0	S
+Rule	Zion	2036	only	-	Sep	28	2:00	0	S
+Rule	Zion	2037	only	-	Sep	13	2:00	0	S
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Jerusalem	2:20:56 -	LMT	1880
 			2:20:40	-	JMT	1918	# Jerusalem Mean Time?
 			2:00	Zion	I%sT
 
-# From Ephraim Silverberg (2003-03-23):
-#
-# Minister of Interior Poraz has announced that he will respect the law
-# passed in July 2000 (proposed at the time jointly by himself and
-# then-MK David Azulai [Shas]) fixing the dates for 2000-2004.  Hence,
-# the dates for 2003 and 2004 remain unchanged....
-#
-# As far as 2005 and beyond, no dates have been set.  However, the
-# minister has mentioned that he wishes to propose to move Israel's
-# timezone in 2005 from GMT+2 to GMT+3 and upon that have DST during
-# the summer months (i.e. GMT+4).  However, no legislation in this
-# direction is expected until the latter part of 2004 which is a long
-# time off in terms of Israeli politics.
-
-# (2004-09-20):
-# The latest rumour, however, is that in 2005, when the clock changes to
-# Daylight Saving Time (date as yet unknown), the move will be a two-hour leap
-# forward (from UTC+0200 to UTC+0400) and then, in the fall, the clock will
-# move back only an hour to UTC+0300 thus effectively moving Israel's timezone
-# from UTC+0200 to UTC+0300.  However, no actual draft has been put before the
-# Knesset (Israel's Parliament) though the intention is to do so this
-# month [2004-09].
-
-# (2004-09-26):
-# Even though the draft law for the above did pass the Ministerial Committee
-# for Legislative Matters three months ago, it was voted down in today's
-# Cabinet meeting.  The current suggestion is to keep the current timezone at
-# UTC+0200 but have an extended period of Daylight Saving Time (UTC+0300) from
-# the beginning of Passover holiday in the spring to after the Tabernacle
-# holiday in the fall (i.e. the dates of which are governed by the Hebrew
-# calendar but this means at least 184 days of DST).  However, this is only a
-# suggestion that was raised in today's cabinet meeting and has not yet been
-# drafted.
-
 
 
 ###############################################################################
@@ -789,18 +858,32 @@ Zone	Asia/Jerusalem	2:20:56 -	LMT	1880
 
 # `9:00' and `JST' is from Guy Harris.
 
-# From Paul Eggert <eggert@twinsun.com> (1995-03-06):
+# From Paul Eggert (1995-03-06):
 # Today's _Asahi Evening News_ (page 4) reports that Japan had
 # daylight saving between 1948 and 1951, but ``the system was discontinued
 # because the public believed it would lead to longer working hours.''
+
+# From Mayumi Negishi in the 2005-08-10 Japan Times
+# <http://www.japantimes.co.jp/cgi-bin/getarticle.pl5?nn20050810f2.htm>:
+# Occupation authorities imposed daylight-saving time on Japan on
+# [1948-05-01]....  But lack of prior debate and the execution of
+# daylight-saving time just three days after the bill was passed generated
+# deep hatred of the concept....  The Diet unceremoniously passed a bill to
+# dump the unpopular system in October 1951, less than a month after the San
+# Francisco Peace Treaty was signed.  (A government poll in 1951 showed 53%
+# of the Japanese wanted to scrap daylight-saving time, as opposed to 30% who
+# wanted to keep it.)
+
 # Shanks writes that daylight saving in Japan during those years was as follows:
 # 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 were US military bases.
-# We go with Shanks and omit daylight saving in those years for Asia/Tokyo.
+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
+# Shanks's 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?
 
 # From Hideyuki Suzuki (1998-11-09):
 # 'Tokyo' usually stands for the former location of Tokyo Astronomical
@@ -830,7 +913,7 @@ Zone	Asia/Jerusalem	2:20:56 -	LMT	1880
 Zone	Asia/Tokyo	9:18:59	-	LMT	1887 Dec 31 15:00u
 			9:00	-	JST	1896
 			9:00	-	CJT	1938
-			9:00	-	JST
+			9:00	Japan	J%sT
 # Since 1938, all Japanese possessions have been like Asia/Tokyo.
 
 # Jordan
@@ -848,6 +931,13 @@ Zone	Asia/Tokyo	9:18:59	-	LMT	1887 Dec 31 15:00u
 # The decision was taken because of the increase in working hours in
 # government's departments from six to seven hours.
 #
+# From Paul Eggert (2005-11-22):
+# Starting 2003 transitions are from Steffen Thorsen's web site timeanddate.com.
+#
+# From Steffen Thorsen (2005-11-23):
+# For Jordan I have received multiple independent user reports every year
+# about DST end dates, as the end-rule is different every year.
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Jordan	1973	only	-	Jun	6	0:00	1:00	S
 Rule	Jordan	1973	1975	-	Oct	1	0:00	0	-
@@ -870,20 +960,25 @@ Rule	Jordan	1993	1998	-	Apr	Fri>=1	0:00	1:00	S
 Rule	Jordan	1994	only	-	Sep	Fri>=15	0:00	0	-
 Rule	Jordan	1995	1998	-	Sep	Fri>=15	0:00s	0	-
 Rule	Jordan	1999	only	-	Jul	 1	0:00s	1:00	S
-Rule	Jordan	1999	max	-	Sep	lastThu	0:00s	0	-
+Rule	Jordan	1999	2002	-	Sep	lastThu	0:00s	0	-
 Rule	Jordan	2000	max	-	Mar	lastThu	0:00s	1:00	S
+Rule	Jordan	2003	only	-	Oct	24	0:00s	0	-
+Rule	Jordan	2004	only	-	Oct	15	0:00s	0	-
+Rule	Jordan	2005	max	-	Sep	lastFri	0:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Amman	2:23:44 -	LMT	1931
 			2:00	Jordan	EE%sT
 
+
 # Kazakhstan
+
 # From Paul Eggert (1996-11-22):
-# Andrew Evtichov <evti@chevron.com> (1996-04-13) writes that Kazakhstan
+# Andrew Evtichov (1996-04-13) writes that Kazakhstan
 # stayed in sync with Moscow after 1990, and that Aqtobe (formerly Aktyubinsk)
 # and Aqtau (formerly Shevchenko) are the largest cities in their zones.
 # Guess that Aqtau and Aqtobe diverged in 1995, since that's the first time
 # IATA SSIM mentions a third time zone in Kazakhstan.
-#
+
 # From Paul Eggert (2001-10-18):
 # German Iofis, ELSI, Almaty (2001-10-09) reports that Kazakhstan uses
 # RussiaAsia rules, instead of switching at 00:00 as the IATA has it.
@@ -893,7 +988,24 @@ Zone	Asia/Amman	2:23:44 -	LMT	1931
 # - Kazakhstan did not observe DST in 1991.
 # - Qyzylorda switched from +5:00 to +6:00 on 1992-01-19 02:00.
 # - Oral switched from +5:00 to +4:00 in spring 1989.
+
+# <a href="http://www.kazsociety.org.uk/news/2005/03/30.htm">
+# From Kazakhstan Embassy's News Bulletin #11 (2005-03-21):
+# </a>
+# The Government of Kazakhstan passed a resolution March 15 abolishing
+# daylight saving time citing lack of economic benefits and health
+# complications coupled with a decrease in productivity.
 #
+# From Branislav Kojic (in Astana) via Gwillim Law (2005-06-28):
+# ... what happened was that the former Kazakhstan Eastern time zone
+# was "blended" with the Central zone.  Therefore, Kazakhstan now has
+# two time zones, and difference between them is one hour.  The zone
+# closer to UTC is the former Western zone (probably still called the
+# same), encompassing four provinces in the west: Aqtobe, Atyrau,
+# Mangghystau, and West Kazakhstan.  The other zone encompasses
+# everything else....  I guess that would make Kazakhstan time zones
+# de jure UTC+5 and UTC+6 respectively.
+
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 #
@@ -902,7 +1014,8 @@ Zone	Asia/Almaty	5:07:48 -	LMT	1924 May  2 # or Alma-Ata
 			5:00	-	ALMT	1930 Jun 21 # Alma-Ata Time
 			6:00 RussiaAsia ALM%sT	1991
 			6:00	-	ALMT	1992
-			6:00 RussiaAsia	ALM%sT
+			6:00 RussiaAsia	ALM%sT	2005 Mar 15
+			6:00	-	ALMT
 # Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.)
 Zone	Asia/Qyzylorda	4:21:52 -	LMT	1924 May  2
 			4:00	-	KIZT	1930 Jun 21 # Kizilorda Time
@@ -912,7 +1025,8 @@ Zone	Asia/Qyzylorda	4:21:52 -	LMT	1924 May  2
 			5:00 RussiaAsia	KIZ%sT	1991
 			5:00	-	KIZT	1991 Dec 16 # independence
 			5:00	-	QYZT	1992 Jan 19 2:00
-			6:00 RussiaAsia	QYZ%sT
+			6:00 RussiaAsia	QYZ%sT	2005 Mar 15
+			6:00	-	QYZT
 # Aqtobe (aka Aktobe, formerly Akt'ubinsk)
 Zone	Asia/Aqtobe	3:48:40	-	LMT	1924 May  2
 			4:00	-	AKTT	1930 Jun 21 # Aktyubinsk Time
@@ -921,7 +1035,8 @@ Zone	Asia/Aqtobe	3:48:40	-	LMT	1924 May  2
 			6:00	-	AKTT	1982 Apr  1
 			5:00 RussiaAsia	AKT%sT	1991
 			5:00	-	AKTT	1991 Dec 16 # independence
-			5:00 RussiaAsia	AQT%sT	# Aqtobe Time
+			5:00 RussiaAsia	AQT%sT	2005 Mar 15 # Aqtobe Time
+			5:00	-	AQTT
 # Mangghystau
 # Aqtau was not founded until 1963, but it represents an inhabited region,
 # so include time stamps before 1963.
@@ -933,7 +1048,8 @@ Zone	Asia/Aqtau	3:21:04	-	LMT	1924 May  2
 			5:00 RussiaAsia	SHE%sT	1991
 			5:00	-	SHET	1991 Dec 16 # independence
 			5:00 RussiaAsia	AQT%sT	1995 Mar lastSun 2:00 # Aqtau Time
-			4:00 RussiaAsia	AQT%sT
+			4:00 RussiaAsia	AQT%sT	2005 Mar 15
+			5:00	-	AQTT
 # West Kazakhstan
 Zone	Asia/Oral	3:25:24	-	LMT	1924 May  2 # or Ural'sk
 			4:00	-	URAT	1930 Jun 21 # Ural'sk time
@@ -943,21 +1059,33 @@ Zone	Asia/Oral	3:25:24	-	LMT	1924 May  2 # or Ural'sk
 			5:00 RussiaAsia	URA%sT	1989 Mar 26 2:00
 			4:00 RussiaAsia	URA%sT	1991
 			4:00	-	URAT	1991 Dec 16 # independence
-			4:00 RussiaAsia	ORA%sT	# Oral Time
+			4:00 RussiaAsia	ORA%sT	2005 Mar 15 # Oral Time
+			5:00	-	ORAT
 
 # Kyrgyzstan (Kirgizstan)
 # Transitions through 1991 are from Shanks.
+
+# From Paul Eggert (2005-08-15):
+# According to an article dated today in the Kyrgyzstan Development Gateway
+# <http://eng.gateway.kg/cgi-bin/page.pl?id=1&story_name=doc9979.shtml>
+# Kyrgyzstan is canceling the daylight saving time system.  I take the article
+# to mean that they will leave their clocks at 6 hours ahead of UTC.
+# From Malik Abdugaliev (2005-09-21):
+# Our government cancels daylight saving time 6th of August 2005.
+# From 2005-08-12 our GMT-offset is +6, w/o any daylight saving.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Kirgiz	1992	1996	-	Apr	Sun>=7	0:00s	1:00	S
-Rule	Kirgiz	1992	1996	-	Sep	lastSun	0:00	0	-
-Rule	Kirgiz	1997	max	-	Mar	lastSun	2:30	1:00	S
-Rule	Kirgiz	1997	max	-	Oct	lastSun	2:30	0	-
+Rule	Kyrgyz	1992	1996	-	Apr	Sun>=7	0:00s	1:00	S
+Rule	Kyrgyz	1992	1996	-	Sep	lastSun	0:00	0	-
+Rule	Kyrgyz	1997	2005	-	Mar	lastSun	2:30	1:00	S
+Rule	Kyrgyz	1997	2004	-	Oct	lastSun	2:30	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Bishkek	4:58:24 -	LMT	1924 May  2
 			5:00	-	FRUT	1930 Jun 21 # Frunze Time
 			6:00 RussiaAsia FRU%sT	1991 Mar 31 2:00s
 			5:00	1:00	FRUST	1991 Aug 31 2:00 # independence
-			5:00	Kirgiz	KG%sT		    # Kirgizstan Time
+			5:00	Kyrgyz	KG%sT	2005 Aug 12    # Kyrgyzstan Time
+			6:00	-	KGT
 
 ###############################################################################
 
@@ -1116,7 +1244,7 @@ Zone	Indian/Maldives	4:54:00 -	LMT	1880	# Male
 #
 # [The province of Selenge is omitted from the above lists.]
 
-# From Ganbold Ts., Ulaanbaatar <ganbold@micom.mng.net> (2004-04-17):
+# From Ganbold Ts., Ulaanbaatar (2004-04-17):
 # Daylight saving occurs at 02:00 local time last Saturday of March.
 # It will change back to normal at 02:00 local time last Saturday of
 # September.... As I remember this rule was changed in 2001.
@@ -1125,6 +1253,24 @@ Zone	Indian/Maldives	4:54:00 -	LMT	1880	# Male
 # For now, assume Rives McDow's informant got confused about Friday vs
 # Saturday, and that his 2001 dates should have 1 added to them.
 
+# From Paul Eggert (2005-07-26):
+# We have wildly conflicting information about Mongolia's time zones.
+# Bill Bonnet (2005-05-19) reports that the US Embassy in Ulaanbaatar says
+# there is only one time zone and that DST is observed, citing Microsoft
+# Windows XP as the source.  Risto Nykanen (2005-05-16) reports that
+# travelmongolia.org says there are two time zones (UTC+7, UTC+8) with no DST.
+# Oscar van Vlijmen (2005-05-20) reports that the Mongolian Embassy in
+# Washington, DC says there are two time zones, with DST observed.
+# He also found
+# <http://ubpost.mongolnews.mn/index.php?subaction=showcomments&id=1111634894&archive=&start_from=&ucat=1&>
+# which also says that there is DST, and which has a comment by "Toddius"
+# (2005-03-31 06:05 +0700) saying "Mongolia actually has 3.5 time zones.
+# The West (OLGII) is +7 GMT, most of the country is ULAT is +8 GMT
+# and some Eastern provinces are +9 GMT but Sukhbaatar Aimag is SUHK +8.5 GMT.
+# The SUKH timezone is new this year, it is one of the few things the
+# parliament passed during the tumultuous winter session."
+# For now, let's ignore this information, until we have more confirmation.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Mongol	1983	1984	-	Apr	1	0:00	1:00	S
 Rule	Mongol	1983	only	-	Oct	1	0:00	0	-
@@ -1216,7 +1362,7 @@ Zone	Asia/Karachi	4:28:12 -	LMT	1907
 
 # Palestine
 
-# From Amos Shapir <amos@nsof.co.il> (1998-02-15):
+# From Amos Shapir (1998-02-15):
 #
 # From 1917 until 1948-05-15, all of Palestine, including the parts now
 # known as the Gaza Strip and the West Bank, was under British rule.
@@ -1288,6 +1434,15 @@ Zone	Asia/Karachi	4:28:12 -	LMT	1907
 # For now, let's assume that the spring switch was at 24:00,
 # and that they switch at 0:00 on the 3rd Fridays of April and October.
 
+# From Paul Eggert (2005-11-22):
+# Starting 2004 transitions are from Steffen Thorsen's web site timeanddate.com.
+
+# From Steffen Thorsen (2005-11-23):
+# A user from Gaza reported that Gaza made the change early because of
+# the Ramadan.  Next year Ramadan will be even earlier, so I think
+# there is a good chance next year's end date will be around two weeks
+# earlier--the same goes for Jordan.
+
 # The rules for Egypt are stolen from the `africa' file.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule EgyptAsia	1957	only	-	May	10	0:00	1:00	S
@@ -1298,7 +1453,9 @@ Rule EgyptAsia	1959	1965	-	Sep	30	3:00	0	-
 Rule EgyptAsia	1966	only	-	Oct	 1	3:00	0	-
 
 Rule Palestine	1999	max	-	Apr	Fri>=15	0:00	1:00	S
-Rule Palestine	1999	max	-	Oct	Fri>=15	0:00	0	-
+Rule Palestine	1999	2003	-	Oct	Fri>=15	0:00	0	-
+Rule Palestine	2004	only	-	Oct	 1	1:00	0	-
+Rule Palestine	2005	max	-	Oct	 4	2:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Gaza	2:17:52	-	LMT	1900 Oct
@@ -1478,7 +1635,7 @@ Zone	Asia/Tashkent	4:37:12 -	LMT	1924 May  2
 			5:00	-	UZT
 
 # Vietnam
-# From Paul Eggert <eggert@twinsun.com> (1993-11-18):
+# From Paul Eggert (1993-11-18):
 # Saigon's official name is Thanh-Pho Ho Chi Minh, but it's too long.
 # We'll stick with the traditional name for now.
 # From Shanks:
diff --git a/timezone/australasia b/timezone/australasia
index d8a8e36d53..70b845560e 100644
--- a/timezone/australasia
+++ b/timezone/australasia
@@ -1,4 +1,6 @@
-# @(#)australasia	7.69
+# @(#)australasia	8.1
+# <pre>
+
 # This file also includes Pacific islands.
 
 # Notes are at the end of this file
@@ -38,7 +40,7 @@ Zone Australia/Perth	 7:43:24 -	LMT	1895 Dec
 			 8:00	-	WST
 # Queensland
 #
-# From Alex Livingston <alex@agsm.unsw.edu.au> (1996-11-01):
+# From Alex Livingston (1996-11-01):
 # I have heard or read more than once that some resort islands off the coast
 # of Queensland chose to keep observing daylight-saving time even after
 # Queensland ceased to.
@@ -77,7 +79,9 @@ Rule	AS	1991	only	-	Mar	Sun>=1	2:00s	0	-
 Rule	AS	1992	only	-	Mar	Sun>=18	2:00s	0	-
 Rule	AS	1993	only	-	Mar	Sun>=1	2:00s	0	-
 Rule	AS	1994	only	-	Mar	Sun>=18	2:00s	0	-
-Rule	AS	1995	max	-	Mar	lastSun	2:00s	0	-
+Rule	AS	1995	2005	-	Mar	lastSun	2:00s	0	-
+Rule	AS	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AS	2007	max	-	Mar	lastSun	2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Australia/Adelaide	9:14:20 -	LMT	1895 Feb
 			9:00	-	CST	1899 May
@@ -85,6 +89,11 @@ Zone Australia/Adelaide	9:14:20 -	LMT	1895 Feb
 			9:30	AS	CST
 
 # Tasmania
+#
+# From Paul Eggert (2005-08-16):
+# <http://www.bom.gov.au/climate/averages/tables/dst_times.shtml>
+# says King Island didn't observe DST from WWII until late 1971.
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	AT	1967	only	-	Oct	Sun>=1	2:00s	1:00	-
 Rule	AT	1968	only	-	Mar	lastSun	2:00s	0	-
@@ -99,15 +108,22 @@ Rule	AT	1987	1990	-	Mar	Sun>=15	2:00s	0	-
 Rule	AT	1987	only	-	Oct	Sun>=22	2:00s	1:00	-
 Rule	AT	1988	1990	-	Oct	lastSun	2:00s	1:00	-
 Rule	AT	1991	1999	-	Oct	Sun>=1	2:00s	1:00	-
-Rule	AT	1991	max	-	Mar	lastSun	2:00s	0	-
+Rule	AT	1991	2005	-	Mar	lastSun	2:00s	0	-
 Rule	AT	2000	only	-	Aug	lastSun	2:00s	1:00	-
 Rule	AT	2001	max	-	Oct	Sun>=1	2:00s	1:00	-
+Rule	AT	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AT	2007	max	-	Mar	lastSun	2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Australia/Hobart	9:49:16	-	LMT	1895 Sep
 			10:00	-	EST	1916 Oct 1 2:00
 			10:00	1:00	EST	1917 Feb
 			10:00	Aus	EST	1967
 			10:00	AT	EST
+Zone Australia/Currie	9:35:28	-	LMT	1895 Sep
+			10:00	-	EST	1916 Oct 1 2:00
+			10:00	1:00	EST	1917 Feb
+			10:00	Aus	EST	1971 Jul
+			10:00	AT	EST
 
 # Victoria
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -118,9 +134,11 @@ Rule	AV	1986	1990	-	Mar	Sun>=15	2:00s	0	-
 Rule	AV	1986	1987	-	Oct	Sun>=15	2:00s	1:00	-
 Rule	AV	1988	1999	-	Oct	lastSun	2:00s	1:00	-
 Rule	AV	1991	1994	-	Mar	Sun>=1	2:00s	0	-
-Rule	AV	1995	max	-	Mar	lastSun	2:00s	0	-
+Rule	AV	1995	2005	-	Mar	lastSun	2:00s	0	-
 Rule	AV	2000	only	-	Aug	lastSun	2:00s	1:00	-
 Rule	AV	2001	max	-	Oct	lastSun	2:00s	1:00	-
+Rule	AV	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AV	2007	max	-	Mar	lastSun	2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Australia/Melbourne 9:39:52 -	LMT	1895 Feb
 			10:00	Aus	EST	1971
@@ -137,9 +155,11 @@ Rule	AN	1986	1989	-	Mar	Sun>=15	2:00s	0	-
 Rule	AN	1986	only	-	Oct	19	2:00s	1:00	-
 Rule	AN	1987	1999	-	Oct	lastSun	2:00s	1:00	-
 Rule	AN	1990	1995	-	Mar	Sun>=1	2:00s	0	-
-Rule	AN	1996	max	-	Mar	lastSun	2:00s	0	-
+Rule	AN	1996	2005	-	Mar	lastSun	2:00s	0	-
 Rule	AN	2000	only	-	Aug	lastSun	2:00s	1:00	-
 Rule	AN	2001	max	-	Oct	lastSun	2:00s	1:00	-
+Rule	AN	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AN	2007	max	-	Mar	lastSun	2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Australia/Sydney	10:04:52 -	LMT	1895 Feb
 			10:00	Aus	EST	1971
@@ -160,9 +180,11 @@ Rule	LH	1986	1989	-	Mar	Sun>=15	2:00	0	-
 Rule	LH	1986	only	-	Oct	19	2:00	0:30	-
 Rule	LH	1987	1999	-	Oct	lastSun	2:00	0:30	-
 Rule	LH	1990	1995	-	Mar	Sun>=1	2:00	0	-
-Rule	LH	1996	max	-	Mar	lastSun	2:00	0	-
+Rule	LH	1996	2005	-	Mar	lastSun	2:00	0	-
 Rule	LH	2000	only	-	Aug	lastSun	2:00	0:30	-
 Rule	LH	2001	max	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	2006	only	-	Apr	Sun>=1	2:00	0	-
+Rule	LH	2007	max	-	Mar	lastSun	2:00	0	-
 Zone Australia/Lord_Howe 10:36:20 -	LMT	1895 Feb
 			10:00	-	EST	1981 Mar
 			10:30	LH	LHST
@@ -199,9 +221,11 @@ Zone Pacific/Rarotonga	-10:39:04 -	LMT	1901		# Avarua
 			-10:00	Cook	CK%sT
 
 # Cocos
-# From USNO (1989):
+# These islands were ruled by the Ross family from about 1830 to 1978.
+# We don't know when standard time was introduced; for now, we guess 1900.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Indian/Cocos	6:30	-	CCT	# Cocos Islands Time
+Zone	Indian/Cocos	6:27:40	-	LMT	1900
+			6:30	-	CCT	# Cocos Islands Time
 
 # Fiji
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -262,9 +286,6 @@ Zone Pacific/Kwajalein	11:09:20 -	LMT	1901
 
 # Micronesia
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone Pacific/Yap	9:12:32	-	LMT	1901		# Colonia
-			9:00	-	YAPT	1969 Oct	# Yap Time
-			10:00	-	YAPT
 Zone Pacific/Truk	10:07:08 -	LMT	1901
 			10:00	-	TRUT			# Truk Time
 Zone Pacific/Ponape	10:32:52 -	LMT	1901		# Kolonia
@@ -381,11 +402,11 @@ Zone Pacific/Pago_Pago	 12:37:12 -	LMT	1879 Jul  5
 			-11:00	-	BST	1983 Nov 30	# B=Bering
 			-11:00	-	SST			# S=Samoa
 
-# W Samoa
+# Samoa
 Zone Pacific/Apia	 12:33:04 -	LMT	1879 Jul  5
 			-11:26:56 -	LMT	1911
 			-11:30	-	SAMT	1950		# Samoa Time
-			-11:00	-	WST			# W Samoa Time
+			-11:00	-	WST			# Samoa Time
 
 # Solomon Is
 # excludes Bougainville, for which see Papua New Guinea
@@ -434,6 +455,17 @@ Zone Pacific/Johnston	-10:00	-	HST
 # uninhabited
 
 # Midway
+#
+# From Mark Brader (2005-01-23):
+# [Fallacies and Fantasies of Air Transport History, by R.E.G. Davies,
+# published 1994 by Paladwr Press, McLean, VA, USA; ISBN 0-9626483-5-3]
+# reproduced a Pan American Airways timeables from 1936, for their weekly
+# "Orient Express" flights between San Francisco and Manila, and connecting
+# flights to Chicago and the US East Coast.  As it uses some time zone
+# designations that I've never seen before:....
+# Fri. 6:30A Lv. HONOLOLU (Pearl Harbor), H.I.   H.L.T. Ar. 5:30P Sun.
+#  "   3:00P Ar. MIDWAY ISLAND . . . . . . . . . M.L.T. Lv. 6:00A  "
+#
 Zone Pacific/Midway	-11:49:28 -	LMT	1901
 			-11:00	-	NST	1956 Jun  3
 			-11:00	1:00	NDT	1956 Sep  2
@@ -475,7 +507,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert <eggert@twinsun.com> (1999-10-29):
+# From Paul Eggert (1999-10-29):
 # A good source for time zone historical data outside the U.S. is
 # Thomas G. Shanks, The International Atlas (5th edition),
 # San Diego: ACS Publications, Inc. (1999).
@@ -521,9 +553,15 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 
 # Australia
 
-# <a href="http://www.dstc.qut.edu.au/DST/marg/daylight.html">
-# Australia's Daylight Saving Times
-# </a>, by Margaret Turner, summarizes daylight saving issues in Australia.
+# From Paul Eggert (2005-12-08):
+# <a href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml">
+# Implementation Dates of Daylight Saving Time within Australia
+# </a> summarizes daylight saving issues in Australia.
+
+# From Arthur David Olson (2005-12-12):
+# <a href="http://www.lawlink.nsw.gov.au/lawlink/Corporate/ll_agdinfo.nsf/pages/community_relations_daylight_saving">
+# Lawlink NSW:Daylight Saving in New South Wales
+# </a> covers New South Wales in particular.
 
 # From John Mackin (1991-03-06):
 # We in Australia have _never_ referred to DST as `daylight' time.
@@ -632,13 +670,13 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 
 # From Paul Eggert (1995-12-19):
 # Shanks reports 2:00 for all autumn changes in Australia and New Zealand.
-# Mark Prior <mrp@itd.adelaide.edu.au> writes that his newspaper
+# Mark Prior writes that his newspaper
 # reports that NSW's fall 1995 change will occur at 2:00,
 # but Robert Elz says it's been 3:00 in Victoria since 1970
 # and perhaps the newspaper's `2:00' is referring to standard time.
 # For now we'll continue to assume 2:00s for changes since 1960.
 
-# From Eric Ulevik <eau@zip.com.au> (1998-01-05):
+# From Eric Ulevik (1998-01-05):
 #
 # Here are some URLs to Australian time legislation. These URLs are stable,
 # and should probably be included in the data file. There are probably more
@@ -657,6 +695,24 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # Standard Time Act, 1898
 # </a>
 
+# From David Grosz (2005-06-13):
+# It was announced last week that Daylight Saving would be extended by
+# one week next year to allow for the 2006 Commonwealth Games.
+# Daylight Saving is now to end for next year only on the first Sunday
+# in April instead of the last Sunday in March.
+#
+# From Gwillim Law (2005-06-14):
+# I did some Googling and found that all of those states (and territory) plan
+# to extend DST together in 2006.
+# ACT: http://www.cmd.act.gov.au/mediareleases/fileread.cfm?file=86.txt
+# New South Wales: http://www.thecouriermail.news.com.au/common/story_page/0,5936,15538869%255E1702,00.html
+# South Australia: http://www.news.com.au/story/0,10117,15555031-1246,00.html
+# Tasmania: http://www.media.tas.gov.au/release.php?id=14772
+# Victoria: I wasn't able to find anything separate, but the other articles
+# allude to it.
+# But not Queensland
+# http://www.news.com.au/story/0,10117,15564030-1248,00.html.
+
 # Northern Territory
 
 # From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
@@ -843,7 +899,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # 1994 was at +0930 as John Connolly's customer seems to assert, then I can
 # only conclude that the actual rule is more complicated....
 
-# From John Warburton <jwarb@SACBH.com.au> (1994-10-07):
+# From John Warburton (1994-10-07):
 # The new Daylight Savings dates for South Australia ...
 # was gazetted in the Government Hansard on Sep 26 1994....
 # start on last Sunday in October and end in last sunday in March.
@@ -903,7 +959,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 
 # From Arthur David Olson:
 # New South Wales and subjurisdictions have their own ideas of a fun time.
-# Based on law library research by John Mackin (john@basser.cs.su.oz),
+# Based on law library research by John Mackin,
 # who notes:
 #	In Australia, time is not legislated federally, but rather by the
 #	individual states.  Thus, while such terms as ``Eastern Standard Time''
@@ -912,18 +968,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 #	legislation.  This is very important to understand.
 #	I have researched New South Wales time only...
 
-# From Paul Eggert (1999-09-27):
-# The Information Service of the Australian National Standards Commission
-# <a href="http://www.nsc.gov.au/InfoServ/Ileaflet/il27.htm">
-# Daylight Saving
-# </a> page (1995-04) has an excellent overall history of Australian DST.
-# The Community Relations Division of the NSW Attorney General's Department
-# publishes a history of daylight saving in NSW.  See:
-# <a href="http://www.lawlink.nsw.gov.au/crd.nsf/pages/time2">
-# Lawlink NSW: Daylight Saving in New South Wales
-# </a>
-
-# From Eric Ulevik <eau@ozemail.com.au> (1999-05-26):
+# From Eric Ulevik (1999-05-26):
 # DST will start in NSW on the last Sunday of August, rather than the usual
 # October in 2000.  [See: Matthew Moore,
 # <a href="http://www.smh.com.au/news/9905/26/pageone/pageone4.html">
@@ -1000,7 +1045,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # Lord Howe Island
 
 # From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
-# LHI...		[ Courtesy of Pauline Van Winsen.. pauline@Aus ]
+# LHI...		[ Courtesy of Pauline Van Winsen ]
 #					[ Dec 1990 ]
 # Lord Howe Island is located off the New South Wales coast, and is half an
 # hour ahead of NSW time.
@@ -1040,7 +1085,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
 # # The Country of New Zealand   (Australia's east island -) Gee they hate that!
 # #				   or is Australia the west island of N.Z.
-# #	[ courtesy of Geoff Tribble.. Geofft@Aus.. Auckland N.Z. ]
+# #	[ courtesy of Geoff Tribble.. Auckland N.Z. ]
 # #				[ Nov 1990 ]
 # ...
 # Rule	NZ      1974    1988	-	Oct	lastSun	2:00	1:00	D
@@ -1057,7 +1102,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 
 # From Paul Eggert (1995-12-19);
 # Shanks reports 2:00 for all autumn changes in Australia and New Zealand.
-# Robert Uzgalis <buz@cs.aukuni.ac.nz> writes that the New Zealand Daylight
+# Robert Uzgalis writes that the New Zealand Daylight
 # Savings Time Order in Council dated 1990-06-18 specifies 2:00 standard
 # time on both the first Sunday in October and the third Sunday in March.
 # As with Australia, we'll assume the tradition is 2:00s, not 2:00.
@@ -1136,7 +1181,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 
 # Micronesia
 
-# Alan Eugene Davis <adavis@kuentos.guam.net> writes (1996-03-16),
+# Alan Eugene Davis writes (1996-03-16),
 # ``I am certain, having lived there for the past decade, that "Truk"
 # (now properly known as Chuuk) ... is in the time zone GMT+10.''
 #
@@ -1244,10 +1289,10 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # October to March, which has won approval in principle from the Tongan
 # Government.
 
-# From Steffen Thorsen [straen@thorsen.priv.no] (1999-09-09):
+# From Steffen Thorsen (1999-09-09):
 # * Tonga will introduce DST in November
 #
-# I was given this link by John Letts <johnletts@earthlink.net>:
+# I was given this link by John Letts:
 # <a hef="http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm">
 # http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm
 # </a>
@@ -1257,7 +1302,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # of UTC as well, but as far as I know Fiji will only be 13 hours ahead
 # (12 + 1 hour DST).
 
-# From Arthur David Olson [arthur_david_olson@nih.gov] (1999-09-20):
+# From Arthur David Olson (1999-09-20):
 # According to <a href="http://www.tongaonline.com/news/sept1799.html>
 # http://www.tongaonline.com/news/sept1799.html
 # </a>:
@@ -1327,12 +1372,30 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # mapmakers redrew the IDL following the boundary of Kiribati.  Even that line
 # has a rather arbitrary nature.  The straight-line boundaries between Pacific
 # island nations that are shown on many maps are based on an international
-# convention, but are not legally binding national borders.
-#
-# An Anglo-French Conference on Time-Keeping at Sea (June, 1917) agreed that
-# legal time on the high seas would be zone time, i.e., the standard time at
-# the nearest meridian that is a multiple of fifteen degrees.  The date is
+# convention, but are not legally binding national borders.... The date is
 # governed by the IDL; therefore, even on the high seas, there may be some
 # places as late as fourteen hours later than UTC.  And, since the IDL is not
 # an international standard, there are some places on the high seas where the
 # correct date is ambiguous.
+
+# From Wikipedia <http://en.wikipedia.org/wiki/Time_zone> (2005-08-31):
+# Before 1920, all ships kept local apparent time on the high seas by setting
+# their clocks at night or at the morning sight so that, given the ship's
+# speed and direction, it would be 12 o'clock when the Sun crossed the ship's
+# meridian (12 o'clock = local apparent noon).  During 1917, at the
+# Anglo-French Conference on Time-keeping at Sea, it was recommended that all
+# ships, both military and civilian, should adopt hourly standard time zones
+# on the high seas.  Whenever a ship was within the territorial waters of any
+# nation it would use that nation's standard time.  The captain was permitted
+# to change his ship's clocks at a time of his choice following his ship's
+# entry into another zone time--he often chose midnight.  These zones were
+# adopted by all major fleets between 1920 and 1925 but not by many
+# independent merchant ships until World War II.
+
+# From Paul Eggert, using references suggested by Oscar van Vlijmen
+# (2005-03-20):
+#
+# The American Practical Navigator (2002)
+# <http://pollux.nss.nima.mil/pubs/pubs_j_apn_sections.html?rid=187>
+# talks only about the 180-degree meridian with respect to ships in
+# international waters; it ignores the international date line.
diff --git a/timezone/backward b/timezone/backward
index 6e118c2726..66fbf30618 100644
--- a/timezone/backward
+++ b/timezone/backward
@@ -1,27 +1,31 @@
-# @(#)backward	7.26
+# @(#)backward	8.1
 
 # This file provides links between current names for time zones
 # and their old names.  Many names changed in late 1993.
 
+Link	Africa/Bamako		Africa/Timbuktu
+Link	America/Argentina/Catamarca	America/Argentina/ComodRivadavia
 Link	America/Adak		America/Atka
 Link	America/Argentina/Buenos_Aires	America/Buenos_Aires
 Link	America/Argentina/Catamarca	America/Catamarca
 Link	America/Argentina/Cordoba	America/Cordoba
 Link	America/Tijuana		America/Ensenada
-Link	America/Indianapolis	America/Fort_Wayne
+Link	America/Indiana/Indianapolis	America/Fort_Wayne
+Link	America/Indiana/Indianapolis	America/Indianapolis
 Link	America/Argentina/Jujuy	America/Jujuy
 Link	America/Indiana/Knox	America/Knox_IN
+Link	America/Kentucky/Louisville	America/Louisville
 Link	America/Argentina/Mendoza	America/Mendoza
 Link	America/Rio_Branco	America/Porto_Acre
-Link	America/Cordoba		America/Rosario
+Link	America/Argentina/Cordoba	America/Rosario
 Link	America/St_Thomas	America/Virgin
 Link	Asia/Ashgabat		Asia/Ashkhabad
 Link	Asia/Chongqing		Asia/Chungking
 Link	Asia/Dhaka		Asia/Dacca
 Link	Asia/Macau		Asia/Macao
-Link	Asia/Makassar		Asia/Ujung_Pandang
 Link	Asia/Jerusalem		Asia/Tel_Aviv
 Link	Asia/Thimphu		Asia/Thimbu
+Link	Asia/Makassar		Asia/Ujung_Pandang
 Link	Asia/Ulaanbaatar	Asia/Ulan_Bator
 Link	Australia/Sydney	Australia/ACT
 Link	Australia/Sydney	Australia/Canberra
@@ -34,7 +38,7 @@ Link	Australia/Hobart	Australia/Tasmania
 Link	Australia/Melbourne	Australia/Victoria
 Link	Australia/Perth		Australia/West
 Link	Australia/Broken_Hill	Australia/Yancowinna
-Link	America/Porto_Acre	Brazil/Acre
+Link	America/Rio_Branco	Brazil/Acre
 Link	America/Noronha		Brazil/DeNoronha
 Link	America/Sao_Paulo	Brazil/East
 Link	America/Manaus		Brazil/West
@@ -52,13 +56,14 @@ Link	Pacific/Easter		Chile/EasterIsland
 Link	America/Havana		Cuba
 Link	Africa/Cairo		Egypt
 Link	Europe/Dublin		Eire
+Link	Europe/London		Europe/Belfast
 Link	Europe/Chisinau		Europe/Tiraspol
 Link	Europe/London		GB
 Link	Europe/London		GB-Eire
-Link	Etc/GMT+0		GMT+0
-Link	Etc/GMT-0		GMT-0
-Link	Etc/GMT0		GMT0
-Link	Etc/Greenwich		Greenwich
+Link	Etc/GMT			GMT+0
+Link	Etc/GMT			GMT-0
+Link	Etc/GMT			GMT0
+Link	Etc/GMT			Greenwich
 Link	Asia/Hong_Kong		Hongkong
 Link	Atlantic/Reykjavik	Iceland
 Link	Asia/Tehran		Iran
@@ -70,13 +75,14 @@ Link	Africa/Tripoli		Libya
 Link	America/Tijuana		Mexico/BajaNorte
 Link	America/Mazatlan	Mexico/BajaSur
 Link	America/Mexico_City	Mexico/General
-Link	America/Shiprock	Navajo
 Link	Pacific/Auckland	NZ
 Link	Pacific/Chatham		NZ-CHAT
+Link	America/Denver		Navajo
+Link	Asia/Shanghai		PRC
 Link	Pacific/Pago_Pago	Pacific/Samoa
+Link	Pacific/Truk		Pacific/Yap
 Link	Europe/Warsaw		Poland
 Link	Europe/Lisbon		Portugal
-Link	Asia/Shanghai		PRC
 Link	Asia/Taipei		ROC
 Link	Asia/Seoul		ROK
 Link	Asia/Singapore		Singapore
@@ -86,7 +92,7 @@ Link	America/Anchorage	US/Alaska
 Link	America/Adak		US/Aleutian
 Link	America/Phoenix		US/Arizona
 Link	America/Chicago		US/Central
-Link	America/Indianapolis	US/East-Indiana
+Link	America/Indiana/Indianapolis	US/East-Indiana
 Link	America/New_York	US/Eastern
 Link	Pacific/Honolulu	US/Hawaii
 Link	America/Indiana/Knox	US/Indiana-Starke
@@ -95,6 +101,6 @@ Link	America/Denver		US/Mountain
 Link	America/Los_Angeles	US/Pacific
 Link	Pacific/Pago_Pago	US/Samoa
 Link	Etc/UTC			UTC
-Link	Etc/Universal		Universal
+Link	Etc/UTC			Universal
 Link	Europe/Moscow		W-SU
-Link	Etc/Zulu		Zulu
+Link	Etc/UTC			Zulu
diff --git a/timezone/checktab.awk b/timezone/checktab.awk
index 6a2d19ae00..6d532141e6 100644
--- a/timezone/checktab.awk
+++ b/timezone/checktab.awk
@@ -1,8 +1,8 @@
 # Check tz tables for consistency.
 
-# @(#)checktab.awk	1.6
+# @(#)checktab.awk	1.7
 
-# Contributed by Paul Eggert <eggert@twinsun.com>.
+# Contributed by Paul Eggert.
 
 BEGIN {
 	FS = "\t"
diff --git a/timezone/etcetera b/timezone/etcetera
index f87a76ea48..cddbe8a294 100644
--- a/timezone/etcetera
+++ b/timezone/etcetera
@@ -1,10 +1,11 @@
-# @(#)etcetera	7.11
+# @(#)etcetera	8.1
 
 # These entries are mostly present for historical reasons, so that
 # people in areas not otherwise covered by the tz files could "zic -l"
 # to a time zone that was right for their area.  These days, the
-# tz files cover almost all the inhabited world, so there's little
-# need now for the entries that are not on UTC.
+# tz files cover almost all the inhabited world, and the only practical
+# need now for the entries that are not on UTC are for ships at sea
+# that cannot use POSIX TZ settings.
 
 Zone	Etc/GMT		0	-	GMT
 Zone	Etc/UTC		0	-	UTC
diff --git a/timezone/europe b/timezone/europe
index eeb114f881..54146d7400 100644
--- a/timezone/europe
+++ b/timezone/europe
@@ -1,10 +1,11 @@
-# @(#)europe	7.88
+# @(#)europe	8.1
+# <pre>
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert <eggert@twinsun.com> (1999-10-29):
+# From Paul Eggert (1999-10-29):
 # A good source for time zone historical data outside the U.S. is
 # Thomas G. Shanks, The International Atlas (5th edition),
 # San Diego: ACS Publications, Inc. (1999).
@@ -55,7 +56,7 @@
 # A reliable and entertaining source about time zones, especially in Britain,
 # Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
 
-# From Peter Ilieve <peter@memex.co.uk> (1994-12-04),
+# From Peter Ilieve (1994-12-04),
 # The original six [EU members]: Belgium, France, (West) Germany, Italy,
 # Luxembourg, the Netherlands.
 # Plus, from 1 Jan 73: Denmark, Ireland, United Kingdom.
@@ -81,7 +82,7 @@
 
 # Britain (United Kingdom) and Ireland (Eire)
 
-# From Peter Ilieve <peter@memex.co.uk> (1994-07-06):
+# From Peter Ilieve (1994-07-06):
 #
 # On 17 Jan 1994 the Independent, a UK quality newspaper, had a piece about
 # historical vistas along the Thames in west London. There was a photo
@@ -102,7 +103,7 @@
 #
 # [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
 
-# From Paul Eggert <eggert@twinsun.com> (1993-11-18):
+# From Paul Eggert (1993-11-18):
 #
 # Howse writes that Britain was the first country to use standard time.
 # The railways cared most about the inconsistencies of local mean time,
@@ -168,12 +169,12 @@
 # known as "British" Summer Time in all parts of the United Kingdom.
 
 # Date: 4 Jan 89 08:57:25 GMT (Wed)
-# From: Jonathan Leffler <nih-csl!uunet!mcvax!sphinx.co.uk!john>
+# From: Jonathan Leffler
 # [British Summer Time] is fixed annually by Act of Parliament.
 # If you can predict what Parliament will do, you should be in
 # politics making a fortune, not computing.
 
-# From Chris Carrier <72157.3334@CompuServe.COM> (1996-06-14):
+# From Chris Carrier (1996-06-14):
 # I remember reading in various wartime issues of the London Times the
 # acronym BDST for British Double Summer Time.  Look for the published
 # time of sunrise and sunset in The Times, when BDST was in effect, and
@@ -204,15 +205,15 @@
 # and follows the more usual convention of putting the location name first,
 # so we use `BDST'.
 
-# Peter Ilieve <peter@aldie.co.uk> (1998-04-19) described at length
+# Peter Ilieve (1998-04-19) described at length
 # the history of summer time legislation in the United Kingdom.
-# Since 1998 Joseph S. Myers <jsm28@cam.ac.uk> has been updating
+# Since 1998 Joseph S. Myers has been updating
 # and extending this list, which can be found in
 # <a href="http://student.cusu.cam.ac.uk/~jsm28/british-time/">
 # History of legal time in Britain
 # </a>
 
-# From Joseph S. Myers <jsm28@cam.ac.uk> (1998-01-06):
+# From Joseph S. Myers (1998-01-06):
 #
 # The legal time in the UK outside of summer time is definitely GMT, not UTC;
 # see Lord Tanlaw's speech
@@ -255,6 +256,35 @@
 #   "Timeball on the ballast office is down.  Dunsink time."
 #   -- James Joyce, Ulysses
 
+# From Joseph S. Myers (2005-01-26):
+# Irish laws are available online at www.irishstatutebook.ie.  These include 
+# various relating to legal time, for example:
+# 
+# ZZA13Y1923.html ZZA12Y1924.html ZZA8Y1925.html ZZSIV20PG1267.html
+# 
+# ZZSI71Y1947.html ZZSI128Y1948.html ZZSI23Y1949.html ZZSI41Y1950.html
+# ZZSI27Y1951.html ZZSI73Y1952.html
+# 
+# ZZSI11Y1961.html ZZSI232Y1961.html ZZSI182Y1962.html
+# ZZSI167Y1963.html ZZSI257Y1964.html ZZSI198Y1967.html
+# ZZA23Y1968.html ZZA17Y1971.html
+# 
+# ZZSI67Y1981.html ZZSI212Y1982.html ZZSI45Y1986.html
+# ZZSI264Y1988.html ZZSI52Y1990.html ZZSI371Y1992.html
+# ZZSI395Y1994.html ZZSI484Y1997.html ZZSI506Y2001.html
+#
+# [These are all relative to the root, e.g., the first is
+# <http://www.irishstatutebook.ie/ZZA13Y1923.html>.]
+# 
+# (These are those I found, but there could be more.  In any case these 
+# should allow various updates to the comments in the europe file to cover 
+# the laws applicable in Ireland.)
+# 
+# (Note that the time in the Republic of Ireland since 1968 has been defined 
+# in terms of standard time being GMT+1 with a period of winter time when it 
+# is GMT, rather than standard time being GMT with a period of summer time 
+# being GMT+1.)
+
 # From Paul Eggert (1999-03-28):
 # Clive Feather (<news:859845706.26043.0@office.demon.net>, 1997-03-31)
 # reports that Folkestone (Cheriton) Shuttle Terminal uses Concession Time
@@ -393,13 +423,6 @@ Zone	Europe/London	-0:01:15 -	LMT	1847 Dec  1
 			 1:00	-	BST	1971 Oct 31 2:00u
 			 0:00	GB-Eire	%s	1996
 			 0:00	EU	GMT/BST
-Zone	Europe/Belfast	-0:23:40 -	LMT	1880 Aug  2
-			-0:25:21 -	DMT	1916 May 21 2:00 # Dublin/Dunsink MT
-			-0:25:21 1:00	IST	1916 Oct  1 2:00s   # Irish Summer Time
-			 0:00	GB-Eire	%s	1968 Oct 27
-			 1:00	-	BST	1971 Oct 31 2:00u
-			 0:00	GB-Eire	%s	1996
-			 0:00	EU	GMT/BST
 Zone	Europe/Dublin	-0:25:00 -	LMT	1880 Aug  2
 			-0:25:21 -	DMT	1916 May 21 2:00
 			-0:25:21 1:00	IST	1916 Oct  1 2:00s
@@ -507,7 +530,7 @@ Zone	EET		2:00	EU	EE%sT
 # Previous editions of this database used abbreviations like MET DST
 # for Central European Summer Time, but this didn't agree with common usage.
 
-# From Markus Kuhn <mskuhn@unrza3.dialin.rrze.uni-erlangen.de> (1996-07-12):
+# From Markus Kuhn (1996-07-12):
 # The official German names ... are
 #
 #	Mitteleuropaeische Zeit (MEZ)         = UTC+01:00
@@ -623,7 +646,7 @@ Zone	Europe/Minsk	1:50:16 -	LMT	1880
 #	pp 8-9.
 # LMT before 1892 was 0:17:30, according to the official journal of Belgium:
 #	Moniteur Belge, Samedi 30 Avril 1892, N.121.
-# Thanks to Pascal Delmoitie <pascal@belnet.be> for these references.
+# Thanks to Pascal Delmoitie for these references.
 # The 1918 rules are listed for completeness; they apply to unoccupied Belgium.
 # Assume Brussels switched to WET in 1918 when the armistice took effect.
 #
@@ -682,7 +705,7 @@ Zone	Europe/Brussels	0:17:30 -	LMT	1880
 
 # Bulgaria
 #
-# From Plamen Simenov <P.Simeonov@cnsys.bg> via Steffen Thorsen (1999-09-09):
+# From Plamen Simenov via Steffen Thorsen (1999-09-09):
 # A document of Government of Bulgaria (No.94/1997) says:
 # EET --> EETDST is in 03:00 Local time in last Sunday of March ...
 # EETDST --> EET is in 04:00 Local time in last Sunday of October
@@ -708,7 +731,7 @@ Zone	Europe/Sofia	1:33:16 -	LMT	1880
 # see Serbia and Montenegro
 
 # Cyprus
-# See the `asia' file.
+# Please see the `asia' file for Asia/Nicosia.
 
 # Czech Republic
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -727,6 +750,40 @@ Zone	Europe/Prague	0:57:44 -	LMT	1850
 			1:00	EU	CE%sT
 
 # Denmark, Faeroe Islands, and Greenland
+
+# From Jesper Norgaard Welen (2005-04-26):
+# http://www.hum.aau.dk/~poe/tid/tine/DanskTid.htm says that the law
+# [introducing standard time] was in effect from 1894-01-01....
+# 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:
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/A19722110030-REGL
+#
+# This provoked a new law from 1974 to make possible summer time changes
+# in subsequenet decrees with the law
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/A19740022330-REGL
+#
+# It seems however that no decree was set forward until 1980.  I have
+# not found any decree, but in another related law, the effecting DST
+# changes are stated explicitly to be from 1980-04-06 at 02:00 to
+# 1980-09-28 at 02:00.  If this is true, this differs slightly from
+# the EU rule in that DST runs to 02:00, not 03:00.  We don't know
+# when Denmark began using the EU rule correctly, but we have only
+# confirmation of the 1980-time, so I presume it was correct in 1981:
+# The law is about the management of the extra hour, concerning
+# working hours reported and effect on obligatory-rest rules (which
+# was suspended on that night):
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/C19801120554-REGL
+
+# From Jesper Norgaard Welen (2005-06-11):
+# The Herning Folkeblad (1980-09-26) reported that the night between
+# Saturday and Sunday the clock is set back from three to two.
+
+# From Paul Eggert (2005-06-11):
+# Hence the "02:00" of the 1980 law refers to standard time, not
+# wall-clock time, and so the EU rules were in effect in 1980.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Denmark	1916	only	-	May	14	23:00	1:00	S
 Rule	Denmark	1916	only	-	Sep	30	23:00	0	-
@@ -739,13 +796,10 @@ Rule	Denmark	1947	only	-	May	 4	 2:00s	1:00	S
 Rule	Denmark	1947	only	-	Aug	10	 2:00s	0	-
 Rule	Denmark	1948	only	-	May	 9	 2:00s	1:00	S
 Rule	Denmark	1948	only	-	Aug	 8	 2:00s	0	-
-# Whitman also gives 1949 Apr 9 to 1949 Oct 1, and disagrees in minor ways
-# about many of the above dates; go with Shanks.
 #
-# For 1894, Shanks says Jan, Whitman Apr; go with Whitman.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Europe/Copenhagen	 0:50:20 -	LMT	1890
-			 0:50:20 -	CMT	1894 Apr  # Copenhagen Mean Time
+			 0:50:20 -	CMT	1894 Jan  1 # Copenhagen MT
 			 1:00	Denmark	CE%sT	1942 Nov  2 2:00s
 			 1:00	C-Eur	CE%sT	1945 Apr  2 2:00
 			 1:00	Denmark	CE%sT	1980
@@ -754,6 +808,11 @@ Zone Atlantic/Faeroe	-0:27:04 -	LMT	1908 Jan 11	# Torshavn
 			 0:00	-	WET	1981
 			 0:00	EU	WE%sT
 #
+# From Paul Eggert (2004-10-31):
+# During World War II, Germany maintained secret manned weather stations in
+# 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 (1996-11-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
@@ -840,12 +899,12 @@ Zone America/Thule	-4:35:08 -	LMT	1916 Jul 28 # Pituffik air base
 			-4:00	Thule	A%sT
 
 # Estonia
-# From Peter Ilieve <peter@memex.co.uk> (1994-10-15):
+# From Peter Ilieve (1994-10-15):
 # A relative in Tallinn confirms the accuracy of the data for 1989 onwards
 # [through 1994] and gives the legal authority for it,
 # a regulation of the Government of Estonia, No. 111 of 1989....
 #
-# From Peter Ilieve <peter@aldie.co.uk> (1996-10-28):
+# From Peter Ilieve (1996-10-28):
 # [IATA SSIM (1992/1996) claims that the Baltic republics switch at 01:00s,
 # but a relative confirms that Estonia still switches at 02:00s, writing:]
 # ``I do not [know] exactly but there are some little different
@@ -855,7 +914,7 @@ Zone America/Thule	-4:35:08 -	LMT	1916 Jul 28 # Pituffik air base
 # human physiology.  It seems that Estonia maybe will not change to
 # summer time next spring.''
 
-# From Peter Ilieve <peter@aldie.co.uk> (1998-11-04), heavily edited:
+# From Peter Ilieve (1998-11-04), heavily edited:
 # <a href="http://trip.rk.ee/cgi-bin/thw?${BASE}=akt&${OOHTML}=rtd&TA=1998&TO=1&AN=1390">
 # The 1998-09-22 Estonian time law
 # </a>
@@ -904,11 +963,11 @@ Zone	Europe/Tallinn	1:39:00	-	LMT	1880
 
 # Finland
 #
-# From Hannu Strang <chs@apu.fi> (25 Sep 1994 06:03:37 UTC):
+# From Hannu Strang (25 Sep 1994 06:03:37 UTC):
 # Well, here in Helsinki we're just changing from summer time to regular one,
 # and it's supposed to change at 4am...
 #
-# From Paul Eggert <eggert@twinsun.com> (25 Sep 1994):
+# From Paul Eggert (25 Sep 1994):
 # Shanks says Finland has switched at 02:00 standard time since 1981.
 # Go with Strang instead.
 #
@@ -985,7 +1044,7 @@ Rule	France	1940	only	-	Feb	25	 2:00	1:00	S
 # Dole, Morez, St-Claude, and Collognes (Haute-Savioe).
 Rule	France	1941	only	-	May	 5	 0:00	2:00	M # Midsummer
 # Shanks says this transition occurred at Oct 6 1:00,
-# but go with Denis.Excoffier@ens.fr (1997-12-12),
+# but go with Denis Excoffier (1997-12-12),
 # who quotes the Ephemerides Astronomiques for 1998 from Bureau des Longitudes
 # as saying 5/10/41 22hUT.
 Rule	France	1941	only	-	Oct	 6	 0:00	1:00	S
@@ -1019,7 +1078,7 @@ Zone	Europe/Paris	0:09:21 -	LMT	1891 Mar 15  0:01
 
 # Germany
 
-# From Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk> (1998-09-29):
+# 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.]
@@ -1055,6 +1114,11 @@ Zone	Europe/Berlin	0:53:28 -	LMT	1893 Apr
 			1:00	Germany	CE%sT	1980
 			1:00	EU	CE%sT
 
+# Georgia
+# Please see the "asia" file for Asia/Tbilisi.
+# Herodotus (Histories, IV.45) says Georgia north of the Phasis (now Rioni)
+# is in Europe.  Our reference location Tbilisi is in the Asian part.
+
 # Gibraltar
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Europe/Gibraltar	-0:21:24 -	LMT	1880 Aug  2
@@ -1129,7 +1193,7 @@ Zone	Europe/Budapest	1:16:20 -	LMT	1890 Oct
 
 # Iceland
 #
-# From Adam David <adam@veda.is> (1993-11-06):
+# From Adam David (1993-11-06):
 # The name of the timezone in Iceland for system / mail / news purposes is GMT.
 #
 # (1993-12-05):
@@ -1156,7 +1220,7 @@ Zone	Europe/Budapest	1:16:20 -	LMT	1890 Oct
 # might be a reference to the Julian calendar as opposed to Gregorian, or it
 # might mean something else (???).
 #
-# From Paul Eggert <eggert@twinsun.com> (1999-10-29):
+# From Paul Eggert (1999-10-29):
 # The Iceland Almanak, Shanks and Whitman disagree on many points.
 # We go with the Almanak, except for one claim from Shanks, namely that
 # Reykavik was 21W57 from 1837 to 1908, local mean time before that.
@@ -1272,7 +1336,7 @@ Link	Europe/Rome	Europe/San_Marino
 
 # Latvia
 
-# From Liene Kanepe <Liene_Kanepe@lm.gov.lv> (1998-09-17):
+# From Liene Kanepe (1998-09-17):
 
 # I asked about this matter Scientific Secretary of the Institute of Astronomy
 # of The University of Latvia Dr. paed Mr. Ilgonis Vilks. I also searched the
@@ -1359,7 +1423,7 @@ Zone	Europe/Vaduz	0:38:04 -	LMT	1894 Jun
 # IATA SSIM (1992/1996) says Lithuania uses W-Eur rules, but since it is
 # known to be wrong about Estonia and Latvia, assume it's wrong here too.
 
-# From Marius Gedminas <mgedmin@pub.osf.lt> (1998-08-07):
+# From Marius Gedminas (1998-08-07):
 # I would like to inform that in this year Lithuanian time zone
 # (Europe/Vilnius) was changed.
 
@@ -1466,7 +1530,7 @@ Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2	# Valletta
 # on 1991-08-27 (the 1992-01-19 date is that of a Russian decree).
 # In early 1992 there was large-scale interethnic violence in the area
 # and it's possible that some Russophones continued to observe Moscow time.
-# But moldavizolit@tirastel.md and mk@tirastel.md separately reported via
+# But [two people] separately reported via
 # Jesper Norgaard that as of 2001-01-24 Tiraspol was like Chisinau.
 # The Tiraspol entry has therefore been removed for now.
 
@@ -1569,12 +1633,10 @@ Zone Europe/Amsterdam	0:19:32 -	LMT	1835
 			1:00	EU	CE%sT
 
 # Norway
+# http://met.no/met/met_lex/q_u/sommertid.html (2004-01) agrees with Shanks.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman gives 1916 May 21 - 1916 Oct 21; go with Shanks.
 Rule	Norway	1916	only	-	May	22	1:00	1:00	S
 Rule	Norway	1916	only	-	Sep	30	0:00	0	-
-# Whitman says DST observed 1935-08-11/1942-11-01, then 1943-03-29/10-04,
-# 1944-04-03/10-02, and 1945-04-01/10-01; go with Shanks.
 Rule	Norway	1945	only	-	Apr	 2	2:00s	1:00	S
 Rule	Norway	1945	only	-	Oct	 1	2:00s	0	-
 Rule	Norway	1959	1964	-	Mar	Sun>=15	2:00s	1:00	S
@@ -1611,7 +1673,7 @@ Zone	Europe/Oslo	0:43:00 -	LMT	1895 Jan  1
 # From Paul Eggert (2001-05-01):
 #
 # Actually, Jan Mayen was never occupied by Germany during World War II,
-# so it must have diverged from Oslo time during the war, as Olso was
+# so it must have diverged from Oslo time during the war, as Oslo was
 # keeping Berlin time.
 #
 # <http://home.no.net/janmayen/history.htm> says that the meteorologists
@@ -1628,7 +1690,7 @@ Zone	Europe/Oslo	0:43:00 -	LMT	1895 Jan  1
 # <http://www.svalbard.com/SvalbardFAQ.html> says that the Germans were
 # expelled on 1942-05-14.  However, small parties of Germans did return,
 # and according to Wilhelm Dege's book "War North of 80" (1954)
-# <http://www.utpress.utoronto.ca/publishing/rights/dege_warnorthof80.htm>
+# <http://www.ucalgary.ca/UofC/departments/UP/1-55238/1-55238-110-2.html>
 # the German armed forces at the Svalbard weather station code-named
 # Haudegen did not surrender to the Allies until September 1945.
 #
@@ -1647,19 +1709,26 @@ Rule	Poland	1944	only	-	Oct	 4	2:00	0	-
 # For 1944-1948 Whitman gives the previous day; go with Shanks.
 Rule	Poland	1945	only	-	Apr	29	0:00	1:00	S
 Rule	Poland	1945	only	-	Nov	 1	0:00	0	-
-Rule	Poland	1946	only	-	Apr	14	0:00	1:00	S
-Rule	Poland	1946	only	-	Sep	 7	0:00	0	-
-Rule	Poland	1947	only	-	May	 4	0:00	1:00	S
-Rule	Poland	1947	1948	-	Oct	Sun>=1	0:00	0	-
-Rule	Poland	1948	only	-	Apr	18	0:00	1:00	S
-# Whitman also gives 1949 Apr 9 - 1949 Oct 1; go with Shanks.
+# For 1946 on the source is Kazimierz Borkowski,
+# Torun Center for Astronomy, Dept. of Radio Astronomy, Nicolaus Copernicus U.,
+# <http://www.astro.uni.torun.pl/~kb/Artykuly/U-PA/Czas2.htm#tth_tAb1>
+# Thanks to Przemyslaw Augustyniak (2005-05-28) for this reference.
+# He also gives these further references:
+# Mon Pol nr 13, poz 162 (1995) <http://www.abc.com.pl/serwis/mp/1995/0162.htm>
+# Druk nr 2180 (2003) <http://www.senat.gov.pl/k5/dok/sejm/053/2180.pdf>
+Rule	Poland	1946	only	-	Apr	14	0:00s	1:00	S
+Rule	Poland	1946	only	-	Oct	 7	2:00s	0	-
+Rule	Poland	1947	only	-	May	 4	2:00s	1:00	S
+Rule	Poland	1947	1949	-	Oct	Sun>=1	2:00s	0	-
+Rule	Poland	1948	only	-	Apr	18	2:00s	1:00	S
+Rule	Poland	1949	only	-	Apr	10	2:00s	1:00	S
 Rule	Poland	1957	only	-	Jun	 2	1:00s	1:00	S
 Rule	Poland	1957	1958	-	Sep	lastSun	1:00s	0	-
 Rule	Poland	1958	only	-	Mar	30	1:00s	1:00	S
 Rule	Poland	1959	only	-	May	31	1:00s	1:00	S
 Rule	Poland	1959	1961	-	Oct	Sun>=1	1:00s	0	-
 Rule	Poland	1960	only	-	Apr	 3	1:00s	1:00	S
-Rule	Poland	1961	1964	-	May	Sun>=25	1:00s	1:00	S
+Rule	Poland	1961	1964	-	May	lastSun	1:00s	1:00	S
 Rule	Poland	1962	1964	-	Sep	lastSun	1:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Warsaw	1:24:00 -	LMT	1880
@@ -1668,33 +1737,17 @@ Zone	Europe/Warsaw	1:24:00 -	LMT	1880
 			2:00	Poland	EE%sT	1922 Jun
 			1:00	Poland	CE%sT	1940 Jun 23 2:00
 			1:00	C-Eur	CE%sT	1944 Oct
-			1:00	Poland	CE%sT	1977 Apr  3 1:00
-			1:00	W-Eur	CE%sT	1999
-# IATA SSIM (1991/1996) gives EU rules, but the _The Warsaw Voice_
-# <a href="http://www.warsawvoice.com.pl/v361/NewsInBrief.shtml">
-# http://www.warsawvoice.com/pl/v361/NewsInBrief.shtml (1995-09-24)
-# </a>
-# says the autumn 1995 switch was at 02:00.
-# Stick with W-Eur for now.
-#
-# From Marcin.Kasperski@softax.com.pl (1999-06-10):
-# According to my colleagues someone recently decided, that Poland would
-# follow European Union regulations, so - I think - the matter is not
-# worth further discussion.
-#
-# From Paul Eggert (1999-06-10):
-# Kasperski also writes that the government futzed with the rules in 1997
-# or 1998 but he doesn't remember the details.  Assume they switched to
-# EU rules in 1999.
+			1:00	Poland	CE%sT	1977
+			1:00	W-Eur	CE%sT	1988
 			1:00	EU	CE%sT
 
 # Portugal
 #
-# From Rui Pedro Salgueiro <rps@inescca.inescc.pt> (1992-11-12):
+# From Rui Pedro Salgueiro (1992-11-12):
 # Portugal has recently (September, 27) changed timezone
 # (from WET to MET or CET) to harmonize with EEC.
 #
-# Martin Bruckmann <martin@ua.pt> (1996-02-29) reports via Peter Ilieve
+# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
 # that Portugal is reverting to 0:00 by not moving its clocks this spring.
 # The new Prime Minister was fed up with getting up in the dark in the winter.
 #
@@ -1824,25 +1877,25 @@ Zone Europe/Bucharest	1:44:24 -	LMT	1891 Oct
 
 # Russia
 
-# From Paul Eggert <eggert@twinsun.com> (1999-11-12):
+# From Paul Eggert (1999-11-12):
 # Except for Moscow after 1919-07-01, I invented the time zone abbreviations.
 # Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991,
 # are from Andrey A. Chernov.  The rest is from Shanks, except we follow
 # Chernov's report that 1992 DST transitions were Sat 23:00, not Sun 02:00s.
 #
-# From Stanislaw A. Kuzikowski <S.A.Kuz@iae.nsk.su> (1994-06-29):
+# From Stanislaw A. Kuzikowski (1994-06-29):
 # But now it is some months since Novosibirsk is 3 hours ahead of Moscow!
 # I do not know why they have decided to make this change;
 # as far as I remember it was done exactly during winter->summer switching
 # so we (Novosibirsk) simply did not switch.
 #
-# From Andrey A. Chernov <ache@nagual.ru> (1996-10-04):
+# From Andrey A. Chernov (1996-10-04):
 # `MSK' and `MSD' were born and used initially on Moscow computers with
 # UNIX-like OSes by several developer groups (e.g. Demos group, Kiae group)....
 # The next step was the UUCP network, the Relcom predecessor
 # (used mainly for mail), and MSK/MSD was actively used there.
 #
-# From Chris Carrier <72157.3334@CompuServe.COM> (1996-10-30):
+# From Chris Carrier (1996-10-30):
 # According to a friend of mine who rode the Trans-Siberian Railroad from
 # Moscow to Irkutsk in 1995, public air and rail transport in Russia ...
 # still follows Moscow time, no matter where in Russia it is located.
@@ -2030,7 +2083,7 @@ Zone	Europe/Belgrade	1:22:00	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
 			1:00	C-Eur	CE%sT	1945 May  8  2:00s
 			1:00	1:00	CEST	1945 Sep 16  2:00s
-# Metod Kozelj <metod.kozelj@rzs-hm.si> reports that the legal date of
+# Metod Kozelj reports that the legal date of
 # transition to EU rules was 1982-11-27, for all of Yugoslavia at the time.
 # Shanks doesn't give as much detail, so go with Kozelj.
 			1:00	-	CET	1982 Nov 27
@@ -2304,7 +2357,7 @@ Zone Europe/Simferopol	2:16:24 -	LMT	1880
 			3:00	Russia	MSK/MSD	1990
 			3:00	-	MSK	1990 Jul  1 2:00
 			2:00	-	EET	1992
-# From Paul Eggert <eggert@twinsun.com> (1999-11-12):
+# From Paul Eggert (1999-11-12):
 # The _Economist_ (1994-05-28, p 45) reports that central Crimea switched
 # from Kiev to Moscow time sometime after the January 1994 elections.
 # Shanks says ``date of change uncertain'', but implies that it happened
@@ -2334,8 +2387,7 @@ Zone Europe/Simferopol	2:16:24 -	LMT	1880
 
 # ...
 # Date: Wed, 28 Jan 87 16:56:27 -0100
-# From: seismo!mcvax!cgcha!wtho (Tom Hofmann)
-# Message-Id: <8701281556.AA22174@cgcha.uucp>
+# From: Tom Hofmann
 # ...
 #
 # ...the European time rules are...standardized since 1981, when
@@ -2354,11 +2406,11 @@ Zone Europe/Simferopol	2:16:24 -	LMT	1880
 #
 # Tom Hofmann, Scientific Computer Center, CIBA-GEIGY AG,
 # 4002 Basle, Switzerland
-# UUCP: ...!mcvax!cernvax!cgcha!wtho
+# ...
 
 # ...
 # Date: Wed, 4 Feb 87 22:35:22 +0100
-# From: seismo!mcvax!cwi.nl!dik (Dik T. Winter)
+# From: Dik T. Winter
 # ...
 #
 # The information from Tom Hofmann is (as far as I know) not entirely correct.
@@ -2384,8 +2436,7 @@ Zone Europe/Simferopol	2:16:24 -	LMT	1880
 #
 # ...
 # dik t. winter, cwi, amsterdam, nederland
-# INTERNET   : dik@cwi.nl
-# BITNET/EARN: dik@mcvax
+# ...
 
 # From Bob Devine (1988-01-28):
 # ...
diff --git a/timezone/factory b/timezone/factory
index ba27c63269..946063c0dd 100644
--- a/timezone/factory
+++ b/timezone/factory
@@ -1,4 +1,4 @@
-# @(#)factory	7.3
+# @(#)factory	8.1
 
 # For companies who don't want to put time zone specification in
 # their installation procedures.  When users run date, they'll get the message.
diff --git a/timezone/iso3166.tab b/timezone/iso3166.tab
index b17843ac8e..1cfaf265c2 100644
--- a/timezone/iso3166.tab
+++ b/timezone/iso3166.tab
@@ -1,8 +1,8 @@
 # ISO 3166 alpha-2 country codes
 #
-# @(#)iso3166.tab	1.15
+# @(#)iso3166.tab	8.1
 #
-# From Paul Eggert <eggert@twinsun.com> (2004-06-14):
+# From Paul Eggert (2004-06-14):
 #
 # This file contains a table with the following columns:
 # 1.  ISO 3166-1 alpha-2 country code, current as of
@@ -255,7 +255,7 @@ VI	Virgin Islands (US)
 VN	Vietnam
 VU	Vanuatu
 WF	Wallis & Futuna
-WS	Samoa (Western)
+WS	Samoa (western)
 YE	Yemen
 YT	Mayotte
 ZA	South Africa
diff --git a/timezone/leapseconds b/timezone/leapseconds
index 7add3303f2..d2b506bab5 100644
--- a/timezone/leapseconds
+++ b/timezone/leapseconds
@@ -1,4 +1,4 @@
-# @(#)leapseconds	7.17
+# @(#)leapseconds	8.1
 
 # Allowance for leapseconds added to each timezone file.
 
@@ -43,39 +43,50 @@ Leap	1994	Jun	30	23:59:60	+	S
 Leap	1995	Dec	31	23:59:60	+	S
 Leap	1997	Jun	30	23:59:60	+	S
 Leap	1998	Dec	31	23:59:60	+	S
+Leap	2005	Dec	31	23:59:60	+	S
 
-# 	INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
-# 
+#	INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
+#
 # SERVICE INTERNATIONAL DE LA ROTATION TERRESTRE ET DES SYSTEMES DE REFERENCE
-# 
+#
 # SERVICE DE LA ROTATION TERRESTRE
 # OBSERVATOIRE DE PARIS
 # 61, Av. de l'Observatoire 75014 PARIS (France)
 # Tel.      : 33 (0) 1 40 51 22 26
 # FAX       : 33 (0) 1 40 51 22 91
-# Internet  : services.iers@obspm.fr
-# 
-# 						Paris, 15 January 2004
-# 
-# 						Bulletin C 27
-# 
-# 						To authorities responsible
-# 						for the measurement and
-# 						distribution of time
-# 
-# 			INFORMATION ON UTC - TAI
-# 
-# NO positive leap second will be introduced at the end of June 2004.
+# ...
+# http://hpiers.obspm.fr/eop-pc
+#
+#						Paris, 4 July 2005
+#							
+#						Bulletin C 30
+#
+#						To authorities responsible
+#						for the measurement and
+#						distribution of time
+#
+#
+#                                    UTC TIME STEP
+#                             on the 1st of January 2006
+#
+# A positive leap second will be introduced at the end of December 2005.
+# The sequence of dates of the UTC second markers will be:
+#
+#			2005 December 31,     23h 59m 59s
+#			2005 December 31,     23h 59m 60s
+#			2006 January   1,      0h  0m  0s
+#
 # The difference between UTC and the International Atomic Time TAI is:
-# 
-# 	from 1999 January 1, 0h UTC, until further notice : UTC-TAI = -32 s
-# 
-# Leap seconds can be introduced in UTC at the end of the months of December
+#
+# from 1999 January 1, 0h UTC, to 2006 January 1  0h UTC  : UTC-TAI = - 32s
+# from 2006 January 1, 0h UTC, until further notice       : UTC-TAI = - 33s
+#
+# Leap seconds can be introduced in UtC at the end of the months of December
 # or June, depending on the evolution of UT1-TAI. Bulletin C is mailed every
-# six months, either to announce a time step in UTC, or to confirm that there
+# six months, either to announce a time step in UTC or to confirm that there
 # will be no time step at the next possible date.
-# 
-# 					Daniel GAMBIS
-# 					Director
-# 					Earth Orientation Center of IERS
-# 					Observatoire de Paris, France
+#
+#					Daniel GAMBIS
+#					Head
+#					Earth Orientation Center of IERS
+#					Observatoire de Paris, France
diff --git a/timezone/northamerica b/timezone/northamerica
index 6e755b04b3..73e2470e0b 100644
--- a/timezone/northamerica
+++ b/timezone/northamerica
@@ -1,11 +1,13 @@
-# @(#)northamerica	7.69
+# @(#)northamerica	8.1
+# <pre>
+
 # also includes Central America and the Caribbean
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert <eggert@twinsun.com> (1999-03-22):
+# From Paul Eggert (1999-03-22):
 # A reliable and entertaining source about time zones is
 # Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
 
@@ -24,12 +26,16 @@
 # His proposal was adopted by the railroads on 1883-11-18 at 12:00,
 # and the most of the country soon followed suit.
 
-# From Paul Eggert <eggert@twinsun.com> (1995-12-19):
+# From Paul Eggert (2005-04-16):
+# That 1883 transition occurred at 12:00 new time, not at 12:00 old time.
+# See p 46 of David Prerau, Seize the daylight, Thunder's Mouth Press (2005).
+
+# From Paul Eggert (1995-12-19):
 # A good source for time zone historical data in the US is
 # Thomas G. Shanks, The American Atlas (5th edition),
 # San Diego: ACS Publications, Inc. (1991).
 # Make sure you have the errata sheet; the book is somewhat useless without it.
-# It is the source for the US and Puerto Rico entries below.
+# It is the source for most of the pre-1991 US and Puerto Rico entries below.
 
 # From Paul Eggert (2001-03-06):
 # Daylight Saving Time was first suggested as a joke by Benjamin Franklin
@@ -48,7 +54,8 @@
 #	to push people into bed earlier, and get them up earlier, to make
 #	them healthy, wealthy and wise in spite of themselves.
 #
-#	-- Robertson Davies, The Diary of Samuel Marchbanks (1947), XIX, Sunday
+#	-- Robertson Davies, The diary of Samuel Marchbanks,
+#	   Clarke, Irwin (1947), XIX, Sunday
 #
 # For more about the first ten years of DST in the United States, see
 # Robert Garland's <a href="http://www.clpgh.org/exhibit/dst.html">
@@ -78,7 +85,7 @@
 # Time' instead of the old familiar 'Eastern War Time.'  Peace is wonderful."
 # </a> (August 1945) by way of confirmation.
 
-# From Joseph Gallant <notquite@hotmail.com>, citing
+# From Joseph Gallant citing
 # George H. Douglas, _The Early Days of Radio Broadcasting_ (1987):
 # At 7 P.M. (Eastern War Time) [on 1945-08-14], the networks were set
 # to switch to London for Attlee's address, but the American people
@@ -105,21 +112,46 @@
 #
 # He had scored a 20-second scoop on other broadcasters.
 
+# From Arthur David Olson (2005-08-22):
+# Paul has been careful to use the "US" rules only in those locations
+# that are part of the United States; this reflects the real scope of
+# U.S. government action.  So even though the "US" rules have changed
+# in the latest release, other countries won't be affected.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	US	1918	1919	-	Mar	lastSun	2:00	1:00	D
 Rule	US	1918	1919	-	Oct	lastSun	2:00	0	S
 Rule	US	1942	only	-	Feb	9	2:00	1:00	W # War
 Rule	US	1945	only	-	Aug	14	23:00u	1:00	P # Peace
 Rule	US	1945	only	-	Sep	30	2:00	0	S
-Rule	US	1967	max	-	Oct	lastSun	2:00	0	S
+Rule	US	1967	2006	-	Oct	lastSun	2:00	0	S
 Rule	US	1967	1973	-	Apr	lastSun	2:00	1:00	D
 Rule	US	1974	only	-	Jan	6	2:00	1:00	D
 Rule	US	1975	only	-	Feb	23	2:00	1:00	D
 Rule	US	1976	1986	-	Apr	lastSun	2:00	1:00	D
-Rule	US	1987	max	-	Apr	Sun>=1	2:00	1:00	D
-# <a href="http://thomas.loc.gov/cgi-bin/bdquery/z?d106:h.r.00177:">
-# H.R.177
-# </a> (introduced 1999-01-06) would change April to March in the above rule.
+Rule	US	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	US	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	US	2007	max	-	Nov	Sun>=1	2:00	0	S
+
+# From Arthur David Olson, 2005-12-19
+# We generate the files specified below to guard against old files with
+# obsolete information being left in the time zone binary directory.
+# We limit the list to names that have appeared in previous versions of
+# this time zone package.
+# We do these as separate Zones rather than as Links to avoid problems if
+# a particular place changes whether it observes DST.
+# We put these specifications here in the northamerica file both to
+# increase the chances that they'll actually get compiled and to
+# avoid the need to duplicate the US rules in another file.
+
+# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+Zone	EST		 -5:00	-	EST
+Zone	MST		 -7:00	-	MST
+Zone	HST		-10:00	-	HST
+Zone	EST5EDT		 -5:00	US	E%sT
+Zone	CST6CDT		 -6:00	US	C%sT
+Zone	MST7MDT		 -7:00	US	M%sT
+Zone	PST8PDT		 -8:00	US	P%sT
 
 # From Bob Devine (1988-01-28):
 # ...Alaska (and Hawaii) had the timezone names changed in 1967.
@@ -197,17 +229,53 @@ Rule	US	1987	max	-	Apr	Sun>=1	2:00	1:00	D
 # Public law 106-564 (2000-12-23) introduced the abbreviation
 # "Chamorro Standard Time" for time in Guam and the Northern Marianas.
 # See the file "australasia".
-
+ 
+# From Arthur David Olson, 2005-08-09
+# The following was signed into law on 2005-08-08.
+#
+# H.R. 6, Energy Policy Act of 2005, SEC. 110. DAYLIGHT SAVINGS.
+#   (a) Amendment- Section 3(a) of the Uniform Time Act of 1966 (15
+#   U.S.C. 260a(a)) is amended--
+#     (1) by striking `first Sunday of April' and inserting `second
+#     Sunday of March'; and
+#     (2) by striking `last Sunday of October' and inserting `first
+#     Sunday of November'.
+#   (b) Effective Date- Subsection (a) shall take effect 1 year after the
+#   date of enactment of this Act or March 1, 2007, whichever is later.
+#   (c) Report to Congress- Not later than 9 months after the effective
+#   date stated in subsection (b), the Secretary shall report to Congress
+#   on the impact of this section on energy consumption in the United
+#   States.
+#   (d) Right to Revert- Congress retains the right to revert the
+#   Daylight Saving Time back to the 2005 time schedules once the
+#   Department study is complete.
 
 # US eastern time, represented by New York
 
 # Connecticut, Delaware, District of Columbia, most of Florida,
-# Georgia, southeast Indiana (Clark, Dearborn, Floyd, Harrison, and
-# Ohio counties), eastern Kentucky, Maine, Maryland, Massachusetts,
+# Georgia, southeast Indiana (Dearborn and Ohio counties), eastern Kentucky
+# (except America/Kentucky/Louisville below), Maine, Maryland, Massachusetts,
 # New Hampshire, New Jersey, New York, North Carolina, Ohio,
 # Pennsylvania, Rhode Island, South Carolina, eastern Tennessee,
 # Vermont, Virginia, West Virginia
 
+# From Dave Cantor (2004-11-02):
+# Early this summer I had the occasion to visit the Mount Washington
+# Observatory weather station atop (of course!) Mount Washington [, NH]....
+# One of the staff members said that the station was on Eastern Standard Time
+# and didn't change their clocks for Daylight Saving ... so that their
+# reports will always have times which are 5 hours behind UTC.
+
+# From Paul Eggert (2005-08-26):
+# According to today's Huntsville Times
+# <http://www.al.com/news/huntsvilletimes/index.ssf?/base/news/1125047783228320.xml&coll=1>
+# a few towns on Alabama's "eastern border with Georgia, such as Phenix City
+# in Russell County, Lanett in Chambers County and some towns in Lee County,
+# set their watches and clocks on Eastern time."  It quotes H.H. "Bubba"
+# Roberts, city administrator in Phenix City. as saying "We are in the Central
+# time zone, but we do go by the Eastern time zone because so many people work
+# in Columbus." 
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule	NYC	1920	only	-	Mar	lastSun	2:00	1:00	D
 Rule	NYC	1920	only	-	Oct	lastSun	2:00	0	S
@@ -215,7 +283,7 @@ Rule	NYC	1921	1966	-	Apr	lastSun	2:00	1:00	D
 Rule	NYC	1921	1954	-	Sep	lastSun	2:00	0	S
 Rule	NYC	1955	1966	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/New_York	-4:56:02 -	LMT	1883 Nov 18 12:00
+Zone America/New_York	-4:56:02 -	LMT	1883 Nov 18 12:03:58
 			-5:00	US	E%sT	1920
 			-5:00	NYC	E%sT	1942
 			-5:00	US	E%sT	1946
@@ -241,7 +309,7 @@ Rule	Chicago	1922	1966	-	Apr	lastSun	2:00	1:00	D
 Rule	Chicago	1922	1954	-	Sep	lastSun	2:00	0	S
 Rule	Chicago	1955	1966	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Chicago	-5:50:36 -	LMT	1883 Nov 18 12:00
+Zone America/Chicago	-5:50:36 -	LMT	1883 Nov 18 12:09:24
 			-6:00	US	C%sT	1920
 			-6:00	Chicago	C%sT	1936 Mar  1 2:00
 			-5:00	-	EST	1936 Nov 15 2:00
@@ -250,9 +318,17 @@ Zone America/Chicago	-5:50:36 -	LMT	1883 Nov 18 12:00
 			-6:00	Chicago	C%sT	1967
 			-6:00	US	C%sT
 # Oliver County, ND switched from mountain to central time on 1992-10-25.
-Zone America/North_Dakota/Center -6:45:12 - LMT	1883 Nov 18 12:00
+Zone America/North_Dakota/Center -6:45:12 - LMT	1883 Nov 18 12:14:48
 			-7:00	US	M%sT	1992 Oct 25 02:00
 			-6:00	US	C%sT
+# From Paul Eggert (2006-01-20):
+# The following is not implemented yet.
+# What is the most populous city in that area?
+# From http://www.statoids.com/tus.html (2006-01-20):
+# 2003-10-26 02:00: All of Morton County, ND, and the part of Sioux
+# County, ND east of ND route 31 moved from MT to CT.  (The area
+# around Fort Yates in Sioux County and the area around Mandan in
+# Morton County were already in CT.)
 
 # US mountain time, represented by Denver
 #
@@ -269,7 +345,7 @@ Rule	Denver	1921	only	-	May	22	2:00	0	S
 Rule	Denver	1965	1966	-	Apr	lastSun	2:00	1:00	D
 Rule	Denver	1965	1966	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Denver	-6:59:56 -	LMT	1883 Nov 18 12:00
+Zone America/Denver	-6:59:56 -	LMT	1883 Nov 18 12:00:04
 			-7:00	US	M%sT	1920
 			-7:00	Denver	M%sT	1942
 			-7:00	US	M%sT	1946
@@ -289,7 +365,7 @@ Rule	CA	1950	1966	-	Apr	lastSun	2:00	1:00	D
 Rule	CA	1950	1961	-	Sep	lastSun	2:00	0	S
 Rule	CA	1962	1966	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Los_Angeles -7:52:58 -	LMT	1883 Nov 18 12:00
+Zone America/Los_Angeles -7:52:58 -	LMT	1883 Nov 18 12:07:02
 			-8:00	US	P%sT	1946
 			-8:00	CA	P%sT	1967
 			-8:00	US	P%sT
@@ -355,10 +431,26 @@ Zone America/Adak	 12:13:21 -	LMT	1867 Oct 18
 			-11:00	US	B%sT	1983 Oct 30 2:00
 			-10:00	US	AH%sT	1983 Nov 30
 			-10:00	US	HA%sT
+# The following switches don't quite make our 1970 cutoff.
+#
 # Shanks writes that part of southwest Alaska (e.g. Aniak)
 # switched from -11:00 to -10:00 on 1968-09-22 at 02:00,
 # and another part (e.g. Akiak) made the same switch five weeks later.
-# These switches don't quite make our 1970 cutoff.
+#
+# From David Flater (2004-11-09):
+# In e-mail, 2004-11-02, Ray Hudson, historian/liaison to the Unalaska
+# Historic Preservation Commission, provided this information, which
+# suggests that Unalaska deviated from statutory time from early 1967
+# possibly until 1983:
+#
+#  Minutes of the Unalaska City Council Meeting, January 10, 1967:
+#  "Except for St. Paul and Akutan, Unalaska is the only important
+#  location not on Alaska Standard Time.  The following resolution was
+#  made by William Robinson and seconded by Henry Swanson:  Be it
+#  resolved that the City of Unalaska hereby goes to Alaska Standard
+#  Time as of midnight Friday, January 13, 1967 (1 A.M. Saturday,
+#  January 14, Alaska Standard Time.)  This resolution was passed with
+#  three votes for and one against."
 
 # Hawaii
 #
@@ -400,7 +492,7 @@ Zone Pacific/Honolulu	-10:31:26 -	LMT	1900 Jan  1 12:00
 # Shanks says the 1944 experiment came to an end on 1944-03-17.
 # Go with the Arizona State Library instead.
 
-Zone America/Phoenix	-7:28:18 -	LMT	1883 Nov 18 12:00
+Zone America/Phoenix	-7:28:18 -	LMT	1883 Nov 18 11:31:42
 			-7:00	US	M%sT	1944 Jan  1 00:01
 			-7:00	-	MST	1944 Apr  1 00:01
 			-7:00	US	M%sT	1944 Oct  1 00:01
@@ -422,9 +514,9 @@ Link America/Denver America/Shiprock
 # Lemhi, Lincoln, Madison, Minidoka, Oneida, Owyhee, Payette, Power,
 # Teton, Twin Falls, Valley, Washington counties) and eastern Oregon
 # switched four weeks late in 1974.
-# 
+#
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:00
+Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:15:11
 			-8:00	US	P%sT	1923 May 13 2:00
 			-7:00	US	M%sT	1974
 			-7:00	-	MST	1974 Feb  3 2:00
@@ -435,40 +527,55 @@ Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:00
 # For a map of Indiana's time zone regions, see:
 # <a href="http://www.mccsc.edu/time.html">
 # What time is it in Indiana?
-# </a> (1999-04-06)
+# </a> (2005-10-30)
 #
-# From Paul Eggert (1995-12-19):
-# Indiana generally observes either EST all year, or CST/CDT,
-# but areas near Cincinnati and Louisville use those cities' timekeeping
-# and in 1969 and 1970 the whole state observed daylight time;
-# and there are other exceptions as noted below.
-# Shanks partitions Indiana into 345 regions, each with its own time history,
-# and writes ``Even newspaper reports present contradictory information.''
-# Fortunately, most of the complexity occurred before our cutoff date of 1970.
+# From Paul Eggert (2006-01-20):
+# Since 1970, most of Indiana has been like America/Indiana/Indianapolis,
+# with the following exceptions:
+#
+# - Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer,
+#   Vandenburgh, and Warrick counties have been like America/Chicago.
 #
-# Since 1970, EST-only Indiana has been like America/Indianapolis,
-# with exceptions noted below for Crawford, Starke, and Switzerland counties.
-# The parts of Indiana not listed below have been like America/Chicago,
-# America/Louisville, or America/New_York.
+# - Dearborn and Ohio counties have been like America/New_York.
+#
+# - Clark, Floyd, and Harrison counties have been like
+#   America/Kentucky/Louisville.
+#
+# - Daviess, Dubois, Knox, Martin, Perry, and Pulaski counties
+#   have been like America/Indiana/Vincennes.
+#
+# - Crawford, Pike, Starke, and Switzerland counties have their own time zone
+#   histories as noted below.
+#
+# Shanks partitioned Indiana into 345 regions, each with its own time history,
+# and wrote ``Even newspaper reports present contradictory information.''
+# Fortunately, most of the complexity occurred before our cutoff date of 1970.
 #
 # Other than Indianapolis, the Indiana place names are so nondescript
 # that they would be ambiguous if we left them at the `America' level.
 # So we reluctantly put them all in a subdirectory `America/Indiana'.
-#
-# Most of EST-only Indiana last observed DST in 1970.
 
-# From Paul Eggert (2001-03-06), following a tip by Markus Kuhn:
-# Pam Belluck reported in the New York Times (2001-01-31) that the
-# Indiana Legislature is considering a bill to adopt DST statewide.
-# Her article mentioned Vevay, whose post office observes a different
-# time zone from Danner's Hardware across the street.
+# From Paul Eggert (2005-08-16):
+# http://www.mccsc.edu/time.html says that Indiana will use DST starting 2006.
+
+# From Deborah Goldsmith (2006-01-18):
+# http://dmses.dot.gov/docimages/pdf95/382329_web.pdf
+# From Paul Eggert (2006-01-20):
+# It says "DOT is relocating the time zone boundary in Indiana to move Starke,
+# Pulaski, Knox, Daviess, Martin, Pike, Dubois, and Perry Counties from the
+# Eastern Time Zone to the Central Time Zone.... The effective date of
+# this rule is 2:OO a.m. EST Sunday, April 2, 2006, which is the
+# changeover date from standard time to Daylight Saving Time."
+# Strictly speaking, this means the affected counties will change their
+# clocks twice that night, but this obviously is in error.  The intent
+# is that 01:59:59 EST be followed by 02:00:00 CDT.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule Indianapolis 1941	only	-	Jun	22	2:00	1:00	D
 Rule Indianapolis 1941	1954	-	Sep	lastSun	2:00	0	S
 Rule Indianapolis 1946	1954	-	Apr	lastSun	2:00	1:00	D
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:00
+Zone America/Indiana/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:15:22
 			-6:00	US	C%sT	1920
 			-6:00 Indianapolis C%sT	1942
 			-6:00	US	C%sT	1946
@@ -477,27 +584,66 @@ Zone America/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:00
 			-6:00	-	CST	1958 Apr 27 2:00
 			-5:00	-	EST	1969
 			-5:00	US	E%sT	1971
-			-5:00	-	EST
-Link America/Indianapolis America/Indiana/Indianapolis
+			-5:00	-	EST	2006
+			-5:00	US	E%sT
 #
-# Part of Crawford County, Indiana, last observed DST in 1975,
-# and left its clocks alone in 1974.
+# Eastern Crawford County, Indiana, left its clocks alone in 1974,
+# as well as from 1976 through 2005.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule	Marengo	1951	only	-	Apr	lastSun	2:00	1:00	D
 Rule	Marengo	1951	only	-	Sep	lastSun	2:00	0	S
 Rule	Marengo	1954	1960	-	Apr	lastSun	2:00	1:00	D
 Rule	Marengo	1954	1960	-	Sep	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Indiana/Marengo -5:45:23 -	LMT	1883 Nov 18 12:00
+Zone America/Indiana/Marengo -5:45:23 -	LMT	1883 Nov 18 12:14:37
 			-6:00	US	C%sT	1951
 			-6:00	Marengo	C%sT	1961 Apr 30 2:00
 			-5:00	-	EST	1969
 			-5:00	US	E%sT	1974 Jan  6 2:00
 			-6:00	1:00	CDT	1974 Oct 27 2:00
 			-5:00	US	E%sT	1976
-			-5:00	-	EST
+			-5:00	-	EST	2006
+			-5:00	US	E%sT
+#
+# Daviess, Dubois, Knox, Martin, Perry, and Pulaski Counties, Indiana,
+# switched from eastern to central time in April 2006.
+# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
+Rule Vincennes	1946	only	-	Apr	lastSun	2:00	1:00	D
+Rule Vincennes	1946	only	-	Sep	lastSun	2:00	0	S
+Rule Vincennes	1953	1954	-	Apr	lastSun	2:00	1:00	D
+Rule Vincennes	1953	1959	-	Sep	lastSun	2:00	0	S
+Rule Vincennes	1955	only	-	May	 1	0:00	1:00	D
+Rule Vincennes	1956	1963	-	Apr	lastSun	2:00	1:00	D
+Rule Vincennes	1960	only	-	Oct	lastSun	2:00	0	S
+Rule Vincennes	1961	only	-	Sep	lastSun	2:00	0	S
+Rule Vincennes	1962	1963	-	Oct	lastSun	2:00	0	S
+# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+Zone America/Indiana/Vincennes -5:50:07 - LMT	1883 Nov 18 12:09:53
+			-6:00	US	C%sT	1946
+			-6:00 Vincennes	C%sT	1964 Apr 26 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1971
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT
+# 
+# Pike County, Indiana moved from central to eastern time in 1977,
+# then switched back in 2006.
+# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
+Rule	Pike	1955	only	-	May	 1	0:00	1:00	D
+Rule	Pike	1955	1960	-	Sep	lastSun	2:00	0	S
+Rule	Pike	1956	1964	-	Apr	lastSun	2:00	1:00	D
+Rule	Pike	1961	1964	-	Oct	lastSun	2:00	0	S
+# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+Zone America/Indiana/Petersburg -5:49:07 - LMT	1883 Nov 18 12:10:53
+			-6:00	US	C%sT	1955
+			-6:00	Pike	C%sT	1965 Apr 25 2:00
+			-5:00	-	EST	1966 Oct 30 2:00
+			-6:00	US	C%sT	1977 Oct 30 2:00
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT
 #
-# Starke County, Indiana
+# Starke County, Indiana moved from central to eastern time in 1991,
+# then switched back in 2006.
 # From Arthur David Olson (1991-10-28):
 # An article on page A3 of the Sunday, 1991-10-27 Washington Post
 # notes that Starke County switched from Central time to Eastern time as of
@@ -509,23 +655,25 @@ Rule	Starke	1955	1956	-	Oct	lastSun	2:00	0	S
 Rule	Starke	1957	1958	-	Sep	lastSun	2:00	0	S
 Rule	Starke	1959	1961	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Indiana/Knox -5:46:30 -	LMT	1883 Nov 18 12:00
+Zone America/Indiana/Knox -5:46:30 -	LMT	1883 Nov 18 12:13:30
 			-6:00	US	C%sT	1947
 			-6:00	Starke	C%sT	1962 Apr 29 2:00
 			-5:00	-	EST	1963 Oct 27 2:00
 			-6:00	US	C%sT	1991 Oct 27 2:00
-			-5:00	-	EST
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT
 #
-# Switzerland County, Indiana, last observed DST in 1972.
+# Switzerland County, Indiana, did not observe DST from 1973 through 2005.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Indiana/Vevay -5:40:16 -	LMT	1883 Nov 18 12:00
+Zone America/Indiana/Vevay -5:40:16 -	LMT	1883 Nov 18 12:19:44
 			-6:00	US	C%sT	1954 Apr 25 2:00
 			-5:00	-	EST	1969
 			-5:00	US	E%sT	1973
-			-5:00	-	EST
+			-5:00	-	EST	2006
+			-5:00	US	E%sT
 
 # Part of Kentucky left its clocks alone in 1974.
-# This also includes a part of Indiana immediately adjacent to Louisville.
+# This also includes Clark, Floyd, and Harrison counties in Indiana.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule Louisville	1921	only	-	May	1	2:00	1:00	D
 Rule Louisville	1921	only	-	Sep	1	2:00	0	S
@@ -535,7 +683,7 @@ Rule Louisville	1946	only	-	Jun	2	2:00	0	S
 Rule Louisville	1950	1955	-	Sep	lastSun	2:00	0	S
 Rule Louisville	1956	1960	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Louisville	-5:43:02 -	LMT	1883 Nov 18 12:00
+Zone America/Kentucky/Louisville -5:43:02 -	LMT	1883 Nov 18 12:16:58
 			-6:00	US	C%sT	1921
 			-6:00 Louisville C%sT	1942
 			-6:00	US	C%sT	1946
@@ -544,9 +692,8 @@ Zone America/Louisville	-5:43:02 -	LMT	1883 Nov 18 12:00
 			-5:00	US	E%sT	1974 Jan  6 2:00
 			-6:00	1:00	CDT	1974 Oct 27 2:00
 			-5:00	US	E%sT
-Link America/Louisville America/Kentucky/Louisville
 #
-# Wayne, Clinton, and Russell Counties, Kentucky
+# Wayne County, Kentucky
 #
 # From
 # <a href="http://www.lake-cumberland.com/life/archive/news990129time.shtml">
@@ -572,7 +719,7 @@ Link America/Louisville America/Kentucky/Louisville
 # Federal Register 65, 160 (2000-08-17), page 50154-50158.
 # </a>
 #
-Zone America/Kentucky/Monticello -5:39:24 - LMT	1883 Nov 18 12:00
+Zone America/Kentucky/Monticello -5:39:24 - LMT	1883 Nov 18 12:20:36
 			-6:00	US	C%sT	1946
 			-6:00	-	CST	1968
 			-6:00	US	C%sT	2000 Oct 29  2:00
@@ -643,7 +790,8 @@ Zone America/Detroit	-5:32:11 -	LMT	1905
 			-5:00	-	EST	1975 Apr 27 2:00
 			-5:00	US	E%sT
 #
-# The Michigan border with Wisconsin switched from EST to CST/CDT in 1973.
+# Dickinson, Gogebic, Iron, and Menominee Counties, Michigan,
+# switched from EST to CST/CDT in 1973.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule Menominee	1946	only	-	Apr	lastSun	2:00	1:00	D
 Rule Menominee	1946	only	-	Sep	lastSun	2:00	0	S
@@ -667,21 +815,10 @@ Zone America/Menominee	-5:50:27 -	LMT	1885 Sep 18 12:00
 # _Los Angeles Times_ (1998-11-10), A1, A10; it cites
 # Jimmy Skaggs, _The Great Guano Rush_ (1994).
 
-# Old names, for S5 users
-
-# Link	LINK-FROM		LINK-TO
-Link	America/New_York	EST5EDT
-Link	America/Chicago		CST6CDT
-Link	America/Denver		MST7MDT
-Link	America/Los_Angeles	PST8PDT
-Link	America/Indianapolis	EST
-Link	America/Phoenix		MST
-Link	Pacific/Honolulu	HST
-
 ################################################################################
 
 
-# From Paul Eggert <eggert@twinsun.com> (1999-10-29):
+# From Paul Eggert (1999-10-29):
 # A good source for time zone historical data outside the US is
 # Thomas G. Shanks, The International Atlas (5th edition),
 # San Diego: ACS Publications, Inc. (1999).
@@ -709,7 +846,7 @@ Link	Pacific/Honolulu	HST
 
 # Canada
 
-# From Alain LaBont<e'> <ALB@immedia.ca> (1994-11-14):
+# From Alain LaBont<e'> (1994-11-14):
 # I post here the time zone abbreviations standardized in Canada
 # for both English and French in the CAN/CSA-Z234.4-89 standard....
 #
@@ -738,23 +875,42 @@ Link	Pacific/Honolulu	HST
 #	T: de Terre-Neuve
 #	Y: du Yukon		Yukon
 #
-# From Paul Eggert <eggert@twinsun.com> (1994-11-22):
+# From Paul Eggert (1994-11-22):
 # Alas, this sort of thing must be handled by localization software.
 
 # Unless otherwise specified, the data for Canada are all from Shanks.
 
-# From Paul Eggert (2000-10-02):
+# From Paul Eggert (2005-12-21):
 # H. David Matthews and Mary Vincent's map
-# <a href="http://www.canadiangeographic.ca/SO98/geomap.htm">
+# <a href="http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp">
 # "It's about TIME", _Canadian Geographic_ (September-October 1998)
 # </a> contains detailed boundaries for regions observing nonstandard
 # time and daylight saving time arrangements in Canada circa 1998.
 #
-# INMS, the Institute for National Measurement Standards in Ottawa, has
-# <a href="http://www.nrc.ca/inms/time/tze.html">
+# INMS, the Institute for National Measurement Standards in Ottawa, has <a
+# href="http://inms-ienm.nrc-cnrc.gc.ca/en/time_services/daylight_saving_e.php">
 # information about standard and daylight saving time zones in Canada.
 # </a> (updated periodically).
 # Its unofficial information is often taken from Matthews and Vincent.
+#
+# CBC News reported that Ontario and Manitoba have announced plans to
+# follow the US change, and that Nova Scotia is considering it; see
+# <http://www.cbc.ca/news/background/daylightsavingtime/> (2005-10-21).
+# CBC news also reported that Prince Edward Island is the first
+# province in Atlantic Canada to follow the US change, and that Quebec
+# had agreed; see <http://www.cbc.ca/pei/story/pe_daylight_20051207.html>
+# (2005-12-07).
+#
+# To reflect all this, the Canada and Winn rules have been adjusted to
+# agree with the 2007 US change.  This means we assume most of Canada
+# will fall into line.  However, Alberta, British Columbia,
+# Newfoundland, Northwest Territories, and Yukon already have separate
+# rules in our database, so for now we'll leave them alone, which
+# means that we currently assume these regions will not change their
+# rules and will disagree with the US starting in 2007.  This
+# assumption is probably incorrect, with the possible exception of
+# Newfoundland.  We plan to adjust the Edm, Vanc, StJohns, and NT_YK
+# rules as the corresponding provinces make their announcements.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Canada	1918	only	-	Apr	14	2:00	1:00	D
@@ -763,8 +919,10 @@ Rule	Canada	1942	only	-	Feb	 9	2:00	1:00	W # War
 Rule	Canada	1945	only	-	Aug	14	23:00u	1:00	P # Peace
 Rule	Canada	1945	only	-	Sep	30	2:00	0	S
 Rule	Canada	1974	1986	-	Apr	lastSun	2:00	1:00	D
-Rule	Canada	1974	max	-	Oct	lastSun	2:00	0	S
-Rule	Canada	1987	max	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Canada	1974	2006	-	Oct	lastSun	2:00	0	S
+Rule	Canada	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Canada	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	Canada	2007	max	-	Nov	Sun>=1	2:00	0	S
 
 
 # Newfoundland (and far southeast Labrador)
@@ -829,7 +987,7 @@ Zone America/Goose_Bay	-4:01:40 -	LMT	1884 # Happy Valley-Goose Bay
 			-4:00	StJohns	A%sT
 
 
-# west Labrador, New Brunswick, Nova Scotia, Prince Edward I
+# west Labrador, Nova Scotia, Prince Edward I
 
 # From Paul Eggert (1996-06-12):
 # Shanks writes that since 1970 most of this region has been like Halifax.
@@ -838,53 +996,48 @@ Zone America/Goose_Bay	-4:01:40 -	LMT	1884 # Happy Valley-Goose Bay
 # Shanks also writes that Liverpool, NS was the only town in Canada to observe
 # DST in 1971 but not 1970; for now we'll assume this is a typo.
 
-# From Paul Eggert (2000-10-02):
-# INMS (2000-09-12) says that, since 1988 at least, New Brunswick switches
-# at 00:01 local time.  FIXME: verify and create a new Zone for this.
-
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule Halifax	1916	only	-	Apr	 1	0:00	1:00	D
-Rule Halifax	1916	only	-	Oct	 1	0:00	0	S
-Rule Halifax	1920	only	-	May	 9	0:00	1:00	D
-Rule Halifax	1920	only	-	Aug	29	0:00	0	S
-Rule Halifax	1921	only	-	May	 6	0:00	1:00	D
-Rule Halifax	1921	1922	-	Sep	 5	0:00	0	S
-Rule Halifax	1922	only	-	Apr	30	0:00	1:00	D
-Rule Halifax	1923	1925	-	May	Sun>=1	0:00	1:00	D
-Rule Halifax	1923	only	-	Sep	 4	0:00	0	S
-Rule Halifax	1924	only	-	Sep	15	0:00	0	S
-Rule Halifax	1925	only	-	Sep	28	0:00	0	S
-Rule Halifax	1926	only	-	May	16	0:00	1:00	D
-Rule Halifax	1926	only	-	Sep	13	0:00	0	S
-Rule Halifax	1927	only	-	May	 1	0:00	1:00	D
-Rule Halifax	1927	only	-	Sep	26	0:00	0	S
-Rule Halifax	1928	1931	-	May	Sun>=8	0:00	1:00	D
-Rule Halifax	1928	only	-	Sep	 9	0:00	0	S
-Rule Halifax	1929	only	-	Sep	 3	0:00	0	S
-Rule Halifax	1930	only	-	Sep	15	0:00	0	S
-Rule Halifax	1931	1932	-	Sep	Mon>=24	0:00	0	S
-Rule Halifax	1932	only	-	May	 1	0:00	1:00	D
-Rule Halifax	1933	only	-	Apr	30	0:00	1:00	D
-Rule Halifax	1933	only	-	Oct	 2	0:00	0	S
-Rule Halifax	1934	only	-	May	20	0:00	1:00	D
-Rule Halifax	1934	only	-	Sep	16	0:00	0	S
-Rule Halifax	1935	only	-	Jun	 2	0:00	1:00	D
-Rule Halifax	1935	only	-	Sep	30	0:00	0	S
-Rule Halifax	1936	only	-	Jun	 1	0:00	1:00	D
-Rule Halifax	1936	only	-	Sep	14	0:00	0	S
-Rule Halifax	1937	1938	-	May	Sun>=1	0:00	1:00	D
-Rule Halifax	1937	1941	-	Sep	Mon>=24	0:00	0	S
-Rule Halifax	1939	only	-	May	28	0:00	1:00	D
-Rule Halifax	1940	1941	-	May	Sun>=1	0:00	1:00	D
-Rule Halifax	1946	1949	-	Sep	lastSun	2:00	0	S
-Rule Halifax	1946	1949	-	Apr	lastSun	2:00	1:00	D
-Rule Halifax	1951	1954	-	Sep	lastSun	2:00	0	S
-Rule Halifax	1951	1954	-	Apr	lastSun	2:00	1:00	D
-Rule Halifax	1956	1959	-	Sep	lastSun	2:00	0	S
-Rule Halifax	1956	1959	-	Apr	lastSun	2:00	1:00	D
-Rule Halifax	1962	1973	-	Apr	lastSun	2:00	1:00	D
-Rule Halifax	1962	1973	-	Oct	lastSun	2:00	0	S
+Rule	Halifax	1916	only	-	Apr	 1	0:00	1:00	D
+Rule	Halifax	1916	only	-	Oct	 1	0:00	0	S
+Rule	Halifax	1920	only	-	May	 9	0:00	1:00	D
+Rule	Halifax	1920	only	-	Aug	29	0:00	0	S
+Rule	Halifax	1921	only	-	May	 6	0:00	1:00	D
+Rule	Halifax	1921	1922	-	Sep	 5	0:00	0	S
+Rule	Halifax	1922	only	-	Apr	30	0:00	1:00	D
+Rule	Halifax	1923	1925	-	May	Sun>=1	0:00	1:00	D
+Rule	Halifax	1923	only	-	Sep	 4	0:00	0	S
+Rule	Halifax	1924	only	-	Sep	15	0:00	0	S
+Rule	Halifax	1925	only	-	Sep	28	0:00	0	S
+Rule	Halifax	1926	only	-	May	16	0:00	1:00	D
+Rule	Halifax	1926	only	-	Sep	13	0:00	0	S
+Rule	Halifax	1927	only	-	May	 1	0:00	1:00	D
+Rule	Halifax	1927	only	-	Sep	26	0:00	0	S
+Rule	Halifax	1928	1931	-	May	Sun>=8	0:00	1:00	D
+Rule	Halifax	1928	only	-	Sep	 9	0:00	0	S
+Rule	Halifax	1929	only	-	Sep	 3	0:00	0	S
+Rule	Halifax	1930	only	-	Sep	15	0:00	0	S
+Rule	Halifax	1931	1932	-	Sep	Mon>=24	0:00	0	S
+Rule	Halifax	1932	only	-	May	 1	0:00	1:00	D
+Rule	Halifax	1933	only	-	Apr	30	0:00	1:00	D
+Rule	Halifax	1933	only	-	Oct	 2	0:00	0	S
+Rule	Halifax	1934	only	-	May	20	0:00	1:00	D
+Rule	Halifax	1934	only	-	Sep	16	0:00	0	S
+Rule	Halifax	1935	only	-	Jun	 2	0:00	1:00	D
+Rule	Halifax	1935	only	-	Sep	30	0:00	0	S
+Rule	Halifax	1936	only	-	Jun	 1	0:00	1:00	D
+Rule	Halifax	1936	only	-	Sep	14	0:00	0	S
+Rule	Halifax	1937	1938	-	May	Sun>=1	0:00	1:00	D
+Rule	Halifax	1937	1941	-	Sep	Mon>=24	0:00	0	S
+Rule	Halifax	1939	only	-	May	28	0:00	1:00	D
+Rule	Halifax	1940	1941	-	May	Sun>=1	0:00	1:00	D
+Rule	Halifax	1946	1949	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1946	1949	-	Sep	lastSun	2:00	0	S
+Rule	Halifax	1951	1954	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1951	1954	-	Sep	lastSun	2:00	0	S
+Rule	Halifax	1956	1959	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1956	1959	-	Sep	lastSun	2:00	0	S
+Rule	Halifax	1962	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1962	1973	-	Oct	lastSun	2:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Halifax	-4:14:24 -	LMT	1902 Jun 15
 			-4:00	Halifax	A%sT	1918
@@ -900,6 +1053,43 @@ Zone America/Glace_Bay	-3:59:48 -	LMT	1902 Jun 15
 			-4:00	Halifax	A%sT	1974
 			-4:00	Canada	A%sT
 
+# New Brunswick
+
+# From Paul Eggert (2006-01-20):
+# New Brunswick's Time Definition Act
+# <http://www.gnb.ca/0062/PDF-acts/t-06.pdf> says they change at 00:01, and
+# <http://www.canlii.org/nb/laws/sta/t-6/20030127/whole.html> makes it
+# clear that this has been the case since at least 1993.
+# For now, assume it started in 1993.  The Office of the Premier announced
+# <http://www.gnb.ca/cnb/news/pre/2005e1737pr.htm> (2005-12-23)
+# that they will bring forward proposed amendments to harmonize with the US;
+# for now assume that this will happen, but they'll still switch at 00:01.
+
+# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
+Rule	Moncton	1933	1935	-	Jun	Sun>=8	1:00	1:00	D
+Rule	Moncton	1933	1935	-	Sep	Sun>=8	1:00	0	S
+Rule	Moncton	1936	1938	-	Jun	Sun>=1	1:00	1:00	D
+Rule	Moncton	1936	1938	-	Sep	Sun>=1	1:00	0	S
+Rule	Moncton	1939	only	-	May	27	1:00	1:00	D
+Rule	Moncton	1939	1941	-	Sep	Sat>=21	1:00	0	S
+Rule	Moncton	1940	only	-	May	19	1:00	1:00	D
+Rule	Moncton	1941	only	-	May	 4	1:00	1:00	D
+Rule	Moncton	1946	1972	-	Apr	lastSun	2:00	1:00	D
+Rule	Moncton	1946	1956	-	Sep	lastSun	2:00	0	S
+Rule	Moncton	1956	1972	-	Oct	lastSun	2:00	0	S
+Rule	Moncton	1993	2006	-	Apr	Sun>=1	0:01	1:00	D
+Rule	Moncton	1993	2006	-	Oct	lastSun	0:01	0	S
+Rule	Moncton	2007	max	-	Mar	Sun>=8	0:01	1:00	D
+Rule	Moncton	2007	max	-	Nov	Sun>=1	0:01	0	S
+# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+Zone America/Moncton	-4:19:08 -	LMT	1883 Dec  9
+			-5:00	-	EST	1902 Jun 15
+			-4:00	Canada	A%sT	1933
+			-4:00	Moncton	A%sT	1942
+			-4:00	Canada	A%sT	1946
+			-4:00	Moncton	A%sT	1973
+			-4:00	Canada	A%sT	1993
+			-4:00	Moncton	A%sT
 
 # Ontario, Quebec
 
@@ -1090,11 +1280,13 @@ Rule	Winn	1963	only	-	Apr	lastSun	2:00	1:00	D
 Rule	Winn	1963	only	-	Sep	22	2:00	0	S
 Rule	Winn	1966	1986	-	Apr	lastSun	2:00	1:00	D
 Rule	Winn	1966	1986	-	Oct	lastSun	2:00	0	S
-Rule	Winn	1987	max	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Winn	1987	2006	-	Apr	Sun>=1	2:00s	1:00	D
 # From Paul Eggert (2000-10-02):
 # INMS (2000-09-12) says that, since 1988 at least, Manitoba switches from
 # DST at 03:00 local time.  For now, assume it started in 1987.
-Rule	Winn	1987	max	-	Oct	lastSun	2:00s	0	S
+Rule	Winn	1987	2006	-	Oct	lastSun	2:00s	0	S
+Rule	Winn	2007	max	-	Mar	Sun>=8	2:00s	1:00	D
+Rule	Winn	2007	max	-	Nov	Sun>=1	2:00s	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Winnipeg	-6:28:36 -	LMT	1887 Jul 16
 			-6:00	Winn	C%sT
@@ -1123,7 +1315,7 @@ Zone America/Winnipeg	-6:28:36 -	LMT	1887 Jul 16
 # Matthews and Vincent (1998) write that Denare Beach and Creighton
 # are like Winnipeg, in violation of Saskatchewan law.
 
-# From W. Jones <jones@skdad.usask.ca> (1992-11-06):
+# From W. Jones (1992-11-06):
 # The. . .below is based on information I got from our law library, the
 # provincial archives, and the provincial Community Services department.
 # A precise history would require digging through newspaper archives, and
@@ -1241,7 +1433,7 @@ Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 
 # From Paul Eggert (1999-10-29):
 # Dawson switched to PST in 1973.  Inuvik switched to MST in 1979.
-# Mathew Englander <mathew@io.org> (1996-10-07) gives the following refs:
+# Mathew Englander (1996-10-07) gives the following refs:
 #	* 1967. Paragraph 28(34)(g) of the Interpretation Act, S.C. 1967-68,
 #	c. 7 defines Yukon standard time as UTC-9.  This is still valid;
 #	see Interpretation Act, R.S.C. 1985, c. I-21, s. 35(1).
@@ -1266,8 +1458,6 @@ Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 # </a> (1999) reports that Pangnirtung operates on eastern time,
 # and that Coral Harbour does not observe DST.  We don't know when
 # Pangnirtung switched to eastern time; we'll guess 1995.
-# We'll ignore the claim about Coral Harbour for now,
-# since we have no further info.
 
 # From Rives McDow (1999-11-08):
 # On October 31, when the rest of Nunavut went to Central time,
@@ -1342,6 +1532,23 @@ Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 # more.
 # [Also see <http://www.nunatsiaq.com/nunavut/nvt10309_06.html> (2001-03-09).]
 
+# From Gwillim Law (2005-05-21):
+# According to maps at
+# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SWE.jpg
+# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SSE.jpg
+# (both dated 2003), and
+# http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp
+# (from a 1998 Canadian Geographic article), the de facto and de jure time
+# for Southampton Island (at the north end of Hudson Bay) is UTC-5 all year
+# round.  Using Google, it's easy to find other websites that confirm this.
+# I wasn't able to find how far back this time regimen goes, but since it
+# predates the creation of Nunavut, it probably goes back many years....
+# The Inuktitut name of Coral Harbour is Sallit, but it's rarely used.
+#
+# From Paul Eggert (2005-07-26):
+# For lack of better information, assume that Southampton Island observed
+# daylight saving only during wartime.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	NT_YK	1918	only	-	Apr	14	2:00	1:00	D
 Rule	NT_YK	1918	only	-	Oct	27	2:00	0	S
@@ -1365,6 +1572,9 @@ Zone America/Iqaluit	-4:33:52 -	LMT	1884 # Frobisher Bay before 1987
 			-5:00	NT_YK	E%sT	1999 Oct 31 2:00
 			-6:00	Canada	C%sT	2000 Oct 29 2:00
 			-5:00	Canada	E%sT
+Zone America/Coral_Harbour -5:32:40 -	LMT	1884
+			-5:00	NT_YK	E%sT	1946
+			-5:00	-	EST
 Zone America/Rankin_Inlet -6:08:40 -	LMT	1884
 			-6:00	NT_YK	C%sT	2000 Oct 29 2:00
 			-5:00	-	EST	2001 Apr  1 3:00
@@ -1404,7 +1614,7 @@ Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
 # Shanks reports that Baja was at -8:00 in 1922/1923.
 # Shanks says the 1930 transition in Baja was 1930-11-16.
 # Shanks reports no DST during summer 1931.
-# Shanks reports a transition at 1032-03-30 23:00, not 1932-04-01.
+# Shanks reports a transition at 1932-03-30 23:00, not 1932-04-01.
 # Shanks does not report transitions for Baja in 1945 or 1948.
 # Shanks reports southern Mexico transitions on 1981-12-01, not 12-23.
 # Shanks says Quintana Roo switched to -6:00 on 1982-12-02, and to -5:00
@@ -1420,7 +1630,7 @@ Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
 # Shanks gives 1942-04-01 instead of 1942-04-24, and omits the 1981
 # and 1988 DST experiments.  Go with spin.com.mx.
 
-# From Alan Perry <alan.perry@eng.sun.com> (1996-02-15):
+# From Alan Perry (1996-02-15):
 # A guy from our Mexico subsidiary finally found the Presidential Decree
 # outlining the timezone changes in Mexico.
 #
@@ -1731,6 +1941,20 @@ Zone America/Costa_Rica	-5:36:20 -	LMT	1890		# San Jose
 # to DST--and one more hour on 1999-04-04--when the announcers will have
 # returned to Baltimore, which switches on that date.)
 
+# From Evert van der Veer via Steffen Thorsen (2004-10-28):
+# Cuba is not going back to standard time this year.
+# From Paul Eggert (2004-10-28):
+# http://www.granma.cu/ingles/2004/septiembre/juev30/41medid-i.html
+# says that it's due to a problem at the Antonio Guiteras
+# thermoelectric plant, and says "This October there will be no return
+# to normal hours (after daylight saving time)".
+# For now, let's assume that it's a one-year temporary measure.
+
+# From Carlos A. Carnero Delgado (2005-11-12):
+# This year (just like in 2004-2005) there's no change in time zone
+# adjustment in Cuba.  We will stay in daylight saving time:
+# http://www.granma.cu/espanol/2005/noviembre/mier9/horario.html
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cuba	1928	only	-	Jun	10	0:00	1:00	D
 Rule	Cuba	1928	only	-	Oct	10	0:00	0	S
@@ -1759,8 +1983,9 @@ Rule	Cuba	1991	1995	-	Oct	Sun>=8	0:00s	0	S
 Rule	Cuba	1996	only	-	Oct	 6	0:00s	0	S
 Rule	Cuba	1997	only	-	Oct	12	0:00s	0	S
 Rule	Cuba	1998	1999	-	Mar	lastSun	0:00s	1:00	D
-Rule	Cuba	1998	max	-	Oct	lastSun	0:00s	0	S
+Rule	Cuba	1998	2003	-	Oct	lastSun	0:00s	0	S
 Rule	Cuba	2000	max	-	Apr	Sun>=1	0:00s	1:00	D
+Rule	Cuba	2006	max	-	Oct	lastSun	0:00s	0	S
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Havana	-5:29:28 -	LMT	1890
@@ -1840,6 +2065,26 @@ Zone America/Guatemala	-6:02:04 -	LMT	1918 Oct 5
 			-6:00	Guat	C%sT
 
 # Haiti
+# From Gwillim Law (2005-04-15):
+# Risto O. Nykanen wrote me that Haiti is now on DST.
+# I searched for confirmation, and I found a
+# <a href="http://www.haitianconsulate.org/time.doc"> press release
+# on the Web page of the Haitian Consulate in Chicago (2005-03-31),
+# </a>.  Translated from French, it says:
+#
+#  "The Prime Minister's Communication Office notifies the public in general
+#   and the press in particular that, following a decision of the Interior
+#   Ministry and the Territorial Collectivities [I suppose that means the
+#   provinces], Haiti will move to Eastern Daylight Time in the night from next
+#   Saturday the 2nd to Sunday the 3rd.
+#
+#  "Consequently, the Prime Minister's Communication Office wishes to inform
+#   the population that the country's clocks will be set forward one hour
+#   starting at midnight.  This provision will hold until the last Saturday in
+#   October 2005.
+#
+#  "Port-au-Prince, March 31, 2005"
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Haiti	1983	only	-	May	8	0:00	1:00	D
 Rule	Haiti	1984	1987	-	Apr	lastSun	0:00	1:00	D
@@ -1847,6 +2092,8 @@ Rule	Haiti	1983	1987	-	Oct	lastSun	0:00	0	S
 # Shanks says AT is 2:00, but IATA SSIM (1991/1997) says 1:00s.  Go with IATA.
 Rule	Haiti	1988	1997	-	Apr	Sun>=1	1:00s	1:00	D
 Rule	Haiti	1988	1997	-	Oct	lastSun	1:00s	0	S
+Rule	Haiti	2005	only	-	Apr	Sun>=1	0:00	1:00	D
+Rule	Haiti	2005	only	-	Oct	lastSun	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Port-au-Prince -4:49:20 -	LMT	1890
 			-4:49	-	PPMT	1917 Jan 24 12:00 # P-a-P MT
@@ -1898,11 +2145,44 @@ Zone America/Montserrat	-4:08:52 -	LMT	1911 Jul 1 0:01   # Olveston
 # Nicaragua seems to be back at -6:00 but I have not been able to find when
 # they changed from -5:00.
 #
+# From Steffen Thorsen (2005-04-12):
+# I've got reports from 8 different people that Nicaragua just started
+# DST on Sunday 2005-04-10, in order to save energy because of
+# expensive petroleum.  The exact end date for DST is not yet
+# announced, only "September" but some sites also say "mid-September".
+# Some background information is available on the President's official site:
+# http://www.presidencia.gob.ni/Presidencia/Files_index/Secretaria/Notas%20de%20Prensa/Presidente/2005/ABRIL/Gobierno-de-nicaragua-adelanta-hora-oficial-06abril.htm
+# The Decree, no 23-2005 is available here:
+# http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2005/Decreto%2023-2005%20Se%20adelanta%20en%20una%20hora%20en%20todo%20el%20territorio%20nacional%20apartir%20de%20las%2024horas%20del%2009%20de%20Abril.pdf
+#
+# From Paul Eggert (2005-05-01):
+# The decree doesn't say anything about daylight saving, but for now let's
+# assume that it is daylight saving and that they'll switch back on the
+# 3rd Sunday in September.
+#
+# From Gwillim Law (2005-04-21):
+# The Associated Press story on the time change, which can be found at
+# http://www.lapalmainteractivo.com/guias/content/gen/ap/America_Latina/AMC_GEN_NICARAGUA_HORA.html
+# and elsewhere, says (fifth paragraph, translated from Spanish):  "The last
+# time that a change of clocks was applied to save energy was in the year 2000
+# during the Arnoldo Aleman administration."...
+# The northamerica file says that Nicaragua has been on UTC-6 continuously
+# since December 1998.  I wasn't able to find any details of Nicaraguan time
+# changes in 2000.  Perhaps a note could be added to the northamerica file, to
+# the effect that we have indirect evidence that DST was observed in 2000.
+#
+# From Jesper Norgaard Welen (2005-11-02):
+# Nicaragua left DST the 2005-10-02 at 00:00 (local time).
+# http://www.presidencia.gob.ni/presidencia/files_index/secretaria/comunicados/2005/septiembre/26septiembre-cambio-hora.htm
+# (2005-09-26)
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Nic	1979	1980	-	Mar	Sun>=16	0:00	1:00	D
 Rule	Nic	1979	1980	-	Jun	Mon>=23	0:00	0	S
-Rule	Nic	1992	only	-	Jan	1	4:00	1:00	D
+Rule	Nic	1992	only	-	Jan	 1	4:00	1:00	D
 Rule	Nic	1992	only	-	Sep	24	0:00	0	S
+Rule	Nic	2005	only	-	Apr	10	0:00	1:00	D
+Rule	Nic	2005	only	-	Oct	 2	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Managua	-5:45:08 -	LMT	1890
 			-5:45:12 -	MMT	1934 Jun 23 # Managua Mean Time?
@@ -1910,7 +2190,7 @@ Zone	America/Managua	-5:45:08 -	LMT	1890
 			-5:00	-	EST	1975 Feb 16
 			-6:00	Nic	C%sT	1993 Jan 1 4:00
 			-5:00	-	EST	1998 Dec
-			-6:00	-	CST
+			-6:00	Nic	C%sT
 
 # Panama
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
diff --git a/timezone/pacificnew b/timezone/pacificnew
index 86dd688341..667940bf53 100644
--- a/timezone/pacificnew
+++ b/timezone/pacificnew
@@ -1,4 +1,4 @@
-# @(#)pacificnew	7.10
+# @(#)pacificnew	8.1
 
 # From Arthur David Olson (1989-04-05):
 # On 1989-04-05, the U. S. House of Representatives passed (238-154) a bill
diff --git a/timezone/private.h b/timezone/private.h
index 57663052f0..2837b70c10 100644
--- a/timezone/private.h
+++ b/timezone/private.h
@@ -4,7 +4,7 @@
 
 /*
 ** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
+** 1996-06-05 by Arthur David Olson.
 */
 
 /*
@@ -21,10 +21,12 @@
 
 #ifndef lint
 #ifndef NOID
-static char	privatehid[] = "@(#)private.h	7.54";
+static char	privatehid[] = "@(#)private.h	8.2";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
+#define GRANDPARENTED	"Local time zone must be set--see zic manual page"
+
 /*
 ** Defaults for preprocessor symbols.
 ** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.
@@ -87,17 +89,17 @@ static char	privatehid[] = "@(#)private.h	7.54";
 #include "stdio.h"
 #include "errno.h"
 #include "string.h"
-#include "limits.h"	/* for CHAR_BIT */
+#include "limits.h"	/* for CHAR_BIT et al. */
 #include "time.h"
 #include "stdlib.h"
 
-#if HAVE_GETTEXT - 0
+#if HAVE_GETTEXT
 #include "libintl.h"
-#endif /* HAVE_GETTEXT - 0 */
+#endif /* HAVE_GETTEXT */
 
-#if HAVE_SYS_WAIT_H - 0
+#if HAVE_SYS_WAIT_H
 #include <sys/wait.h>	/* for WIFEXITED and WEXITSTATUS */
-#endif /* HAVE_SYS_WAIT_H - 0 */
+#endif /* HAVE_SYS_WAIT_H */
 
 #ifndef WIFEXITED
 #define WIFEXITED(status)	(((status) & 0xff) == 0)
@@ -106,37 +108,68 @@ static char	privatehid[] = "@(#)private.h	7.54";
 #define WEXITSTATUS(status)	(((status) >> 8) & 0xff)
 #endif /* !defined WEXITSTATUS */
 
-#if HAVE_UNISTD_H - 0
+#if HAVE_UNISTD_H
 #include "unistd.h"	/* for F_OK and R_OK */
-#endif /* HAVE_UNISTD_H - 0 */
+#endif /* HAVE_UNISTD_H */
 
-#if !(HAVE_UNISTD_H - 0)
+#if !HAVE_UNISTD_H
 #ifndef F_OK
 #define F_OK	0
 #endif /* !defined F_OK */
 #ifndef R_OK
 #define R_OK	4
 #endif /* !defined R_OK */
-#endif /* !(HAVE_UNISTD_H - 0) */
+#endif /* !HAVE_UNISTD_H */
 
-/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX.  */
+/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
 #define is_digit(c) ((unsigned)(c) - '0' <= 9)
 
 /*
+** Define HAVE_STDINT_H's default value here, rather than at the
+** start, since __GLIBC__'s value depends on previously-included
+** files.
+** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
+*/
+#ifndef HAVE_STDINT_H
+#define HAVE_STDINT_H \
+	(199901 <= __STDC_VERSION__ || \
+	2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
+#endif /* !defined HAVE_STDINT_H */
+
+#if HAVE_STDINT_H
+#include "stdint.h"
+#endif /* !HAVE_STDINT_H */
+
+#ifndef INT_FAST64_MAX
+/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX.  */
+#if defined LLONG_MAX || defined __LONG_LONG_MAX__
+typedef long long	int_fast64_t;
+#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
+#if (LONG_MAX >> 31) < 0xffffffff
+Please use a compiler that supports a 64-bit integer type (or wider);
+you may need to compile with "-DHAVE_STDINT_H".
+#endif /* (LONG_MAX >> 31) < 0xffffffff */
+typedef long		int_fast64_t;
+#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
+#endif /* !defined INT_FAST64_MAX */
+
+#ifndef INT32_MAX
+#define INT32_MAX 0x7fffffff
+#endif /* !defined INT32_MAX */
+#ifndef INT32_MIN
+#define INT32_MIN (-1 - INT32_MAX)
+#endif /* !defined INT32_MIN */
+
+/*
 ** Workarounds for compilers/systems.
 */
 
 /*
-** SunOS 4.1.1 cc lacks prototypes.
+** If your compiler lacks prototypes, "#define P(x) ()".
 */
 
 #ifndef P
-#ifdef __STDC__
 #define P(x)	x
-#endif /* defined __STDC__ */
-#ifndef __STDC__
-#define P(x)	()
-#endif /* !defined __STDC__ */
 #endif /* !defined P */
 
 /*
@@ -208,15 +241,15 @@ extern char *	asctime_r();
 /*
 ** Private function declarations.
 */
-char *	icalloc P((int nelem, int elsize));
-char *	icatalloc P((char * old, const char * new));
-char *	icpyalloc P((const char * string));
-char *	imalloc P((int n));
-void *	irealloc P((void * pointer, int size));
-void	icfree P((char * pointer));
-void	ifree P((char * pointer));
-char *	scheck P((const char *string, const char *format));
 
+char *		icalloc P((int nelem, int elsize));
+char *		icatalloc P((char * old, const char * new));
+char *		icpyalloc P((const char * string));
+char *		imalloc P((int n));
+void *		irealloc P((void * pointer, int size));
+void		icfree P((char * pointer));
+void		ifree P((char * pointer));
+const char *	scheck P((const char * string, const char * format));
 
 /*
 ** Finally, some convenience items.
@@ -238,6 +271,15 @@ char *	scheck P((const char *string, const char *format));
 #define TYPE_SIGNED(type) (((type) -1) < 0)
 #endif /* !defined TYPE_SIGNED */
 
+/*
+** Since the definition of TYPE_INTEGRAL contains floating point numbers,
+** it cannot be used in preprocessor directives.
+*/
+
+#ifndef TYPE_INTEGRAL
+#define TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
+#endif /* !defined TYPE_INTEGRAL */
+
 #ifndef INT_STRLEN_MAXIMUM
 /*
 ** 302 / 1000 is log10(2.0) rounded up.
@@ -246,7 +288,8 @@ char *	scheck P((const char *string, const char *format));
 ** add one more for a minus sign if the type is signed.
 */
 #define INT_STRLEN_MAXIMUM(type) \
-    ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type))
+	((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
+	1 + TYPE_SIGNED(type))
 #endif /* !defined INT_STRLEN_MAXIMUM */
 
 /*
@@ -280,11 +323,11 @@ char *	scheck P((const char *string, const char *format));
 */
 
 #ifndef _
-#if HAVE_GETTEXT - 0
+#if HAVE_GETTEXT
 #define _(msgid) gettext(msgid)
-#else /* !(HAVE_GETTEXT - 0) */
+#else /* !HAVE_GETTEXT */
 #define _(msgid) msgid
-#endif /* !(HAVE_GETTEXT - 0) */
+#endif /* !HAVE_GETTEXT */
 #endif /* !defined _ */
 
 #ifndef TZ_DOMAIN
@@ -298,6 +341,26 @@ char *asctime_r P((struct tm const *, char *));
 char *ctime_r P((time_t const *, char *));
 #endif /* HAVE_INCOMPATIBLE_CTIME_R */
 
+#ifndef YEARSPERREPEAT
+#define YEARSPERREPEAT		400	/* years before a Gregorian repeat */
+#endif /* !defined YEARSPERREPEAT */
+
+/*
+** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
+*/
+
+#ifndef AVGSECSPERYEAR
+#define AVGSECSPERYEAR		31556952L
+#endif /* !defined AVGSECSPERYEAR */
+
+#ifndef SECSPERREPEAT
+#define SECSPERREPEAT		((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
+#endif /* !defined SECSPERREPEAT */
+ 
+#ifndef SECSPERREPEAT_BITS
+#define SECSPERREPEAT_BITS	34	/* ceil(log2(SECSPERREPEAT)) */
+#endif /* !defined SECSPERREPEAT_BITS */
+
 /*
 ** UNIX was a registered trademark of The Open Group in 2003.
 */
diff --git a/timezone/scheck.c b/timezone/scheck.c
index 39feeba701..bc156379a0 100644
--- a/timezone/scheck.c
+++ b/timezone/scheck.c
@@ -1,6 +1,6 @@
 #ifndef lint
 #ifndef NOID
-static char	elsieid[] = "@(#)scheck.c	8.15";
+static char	elsieid[] = "@(#)scheck.c	8.17";
 #endif /* !defined lint */
 #endif /* !defined NOID */
 
@@ -8,7 +8,7 @@ static char	elsieid[] = "@(#)scheck.c	8.15";
 
 #include "private.h"
 
-char *
+const char *
 scheck(string, format)
 const char * const	string;
 const char * const	format;
@@ -17,11 +17,10 @@ const char * const	format;
 	register const char *	fp;
 	register char *		tp;
 	register int		c;
-	register char *		result;
+	register const char *	result;
 	char			dummy;
-	static char		nada;
 
-	result = &nada;
+	result = "";
 	if (string == NULL || format == NULL)
 		return result;
 	fbuf = imalloc((int) (2 * strlen(format) + 4));
diff --git a/timezone/solar87 b/timezone/solar87
index 3f32347973..71839320ad 100644
--- a/timezone/solar87
+++ b/timezone/solar87
@@ -1,4 +1,4 @@
-# @(#)solar87	7.3
+# @(#)solar87	8.1
 
 # So much for footnotes about Saudi Arabia.
 # Apparent noon times below are for Riyadh; your mileage will vary.
@@ -381,8 +381,8 @@ Rule	sol87	1987	only	-	Dec	31	12:02:45s -0:02:45 -
 # Before and after 1987, we'll operate on local mean solar time.
 
 # Zone	NAME		GMTOFF	RULES/SAVE	FORMAT	[UNTIL]
-Zone	Asia/Riyadh87	3:07:04	-		??	1987
-			3:07:04	sol87		??	1988
-			3:07:04	-		??
+Zone	Asia/Riyadh87	3:07:04	-		zzz	1987
+			3:07:04	sol87		zzz	1988
+			3:07:04	-		zzz
 # For backward compatibility...
 Link	Asia/Riyadh87	Mideast/Riyadh87
diff --git a/timezone/solar88 b/timezone/solar88
index 41a64e5023..b4cfe8e37a 100644
--- a/timezone/solar88
+++ b/timezone/solar88
@@ -1,4 +1,4 @@
-# @(#)solar88	7.3
+# @(#)solar88	8.1
 
 # Apparent noon times below are for Riyadh; they're a bit off for other places.
 # Times were computed using formulas in the U.S. Naval Observatory's
@@ -381,8 +381,8 @@ Rule	sol88	1988	only	-	Dec	31	12:03:05s -0:03:05 -
 # Before and after 1988, we'll operate on local mean solar time.
 
 # Zone	NAME		GMTOFF	RULES/SAVE	FORMAT	[UNTIL]
-Zone	Asia/Riyadh88	3:07:04	-		??	1988
-			3:07:04	sol88		??	1989
-			3:07:04	-		??
+Zone	Asia/Riyadh88	3:07:04	-		zzz	1988
+			3:07:04	sol88		zzz	1989
+			3:07:04	-		zzz
 # For backward compatibility...
 Link	Asia/Riyadh88	Mideast/Riyadh88
diff --git a/timezone/solar89 b/timezone/solar89
index a6d3d718d3..8c48531461 100644
--- a/timezone/solar89
+++ b/timezone/solar89
@@ -1,4 +1,4 @@
-# @(#)solar89	7.4
+# @(#)solar89	8.1
 
 # Apparent noon times below are for Riyadh; they're a bit off for other places.
 # Times were computed using a formula provided by the U. S. Naval Observatory:
@@ -386,8 +386,8 @@ Rule	sol89	1989	only	-	Dec	31	12:03:00s -0:03:00 -
 # Before and after 1989, we'll operate on local mean solar time.
 
 # Zone	NAME		GMTOFF	RULES/SAVE	FORMAT	[UNTIL]
-Zone	Asia/Riyadh89	3:07:04	-		??	1989
-			3:07:04	sol89		??	1990
-			3:07:04	-		??
+Zone	Asia/Riyadh89	3:07:04	-		zzz	1989
+			3:07:04	sol89		zzz	1990
+			3:07:04	-		zzz
 # For backward compatibility...
 Link	Asia/Riyadh89	Mideast/Riyadh89
diff --git a/timezone/southamerica b/timezone/southamerica
index 912491049b..3a61cd717a 100644
--- a/timezone/southamerica
+++ b/timezone/southamerica
@@ -1,10 +1,11 @@
-# @(#)southamerica	7.54
+# @(#)southamerica	8.1
+# <pre>
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert <eggert@twinsun.com> (1999-07-07):
+# From Paul Eggert (1999-07-07):
 # A good source for time zone historical data outside the U.S. is
 # Thomas G. Shanks, The International Atlas (5th edition),
 # San Diego: ACS Publications, Inc. (1999).
@@ -58,7 +59,7 @@
 # From U. S. Naval Observatory (1988-01-199):
 # ARGENTINA           3 H BEHIND   UTC
 
-# From Hernan G. Otero <hernan@isoft.com.ar> (1995-06-26):
+# From Hernan G. Otero (1995-06-26):
 # I am sending modifications to the Argentine time zone table...
 # AR was chosen because they are the ISO letters that represent Argentina.
 
@@ -86,7 +87,7 @@ Rule	Arg	1974	only	-	Jan	23	0:00	1:00	S
 Rule	Arg	1974	only	-	May	 1	0:00	0	-
 Rule	Arg	1988	only	-	Dec	 1	0:00	1:00	S
 #
-# From Hernan G. Otero <hernan@isoft.com.ar> (1995-06-26):
+# From Hernan G. Otero (1995-06-26):
 # These corrections were contributed by InterSoft Argentina S.A.,
 # obtaining the data from the:
 # Talleres de Hidrografia Naval Argentina
@@ -96,7 +97,7 @@ Rule	Arg	1988	only	-	Dec	 1	0:00	1:00	S
 Rule	Arg	1989	1993	-	Mar	Sun>=1	0:00	0	-
 Rule	Arg	1989	1992	-	Oct	Sun>=15	0:00	1:00	S
 #
-# From Hernan G. Otero <hernan@isoft.com.ar> (1995-06-26):
+# From Hernan G. Otero (1995-06-26):
 # From this moment on, the law that mandated the daylight saving
 # time corrections was derogated and no more modifications
 # to the time zones (for daylight saving) are now made.
@@ -113,7 +114,7 @@ Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
 # Argentina decided not to become one of the countries that go on or off DST.
 # So Buenos Aires should be -3 hours from GMT at all times.
 #
-# From Fabian L. Arce Jofre <farcejofre@bigfoot.com> (2000-04-04):
+# From Fabian L. Arce Jofre (2000-04-04):
 # The law that claimed DST for Argentina was derogated by President Fernando
 # de la Rua on March 2, 2000, because it would make people spend more energy
 # in the winter time, rather than less.  The change took effect on March 3.
@@ -293,7 +294,7 @@ Zone America/Argentina/Jujuy -4:21:12 -	LMT	1894 Oct 31
 			-4:00	Arg	AR%sT	2000 Mar  3
 			-3:00	-	ART
 #
-# Catamarca (CT)
+# Catamarca (CT), Chubut (CH)
 Zone America/Argentina/Catamarca -4:23:08 - LMT	1894 Oct 31
 			-4:16:48 -	CMT	1920 May
 			-4:00	-	ART	1930 Dec
@@ -323,20 +324,6 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT	1894 Oct 31
 			-4:00	-	WART	2004 Sep 26
 			-3:00	-	ART
 #
-# Chubut (CH)
-# The name "Comodoro Rivadavia" exceeds the 14-byte POSIX limit.
-Zone America/Argentina/ComodRivadavia -4:30:00 - LMT	1894 Oct 31
-			-4:16:48 -	CMT	1920 May
-			-4:00	-	ART	1930 Dec
-			-4:00	Arg	AR%sT	1969 Oct  5
-			-3:00	Arg	AR%sT	1991 Mar  3
-			-4:00	-	WART	1991 Oct 20
-			-3:00	Arg	AR%sT	1999 Oct  3
-			-4:00	Arg	AR%sT	2000 Mar  3
-			-3:00	-	ART	2004 Jun  1
-			-4:00	-	WART	2004 Jun 20
-			-3:00	-	ART
-#
 # Santa Cruz (SC)
 Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
 			-4:16:48 -	CMT	1920 May # Cordoba Mean Time
@@ -374,7 +361,7 @@ Zone	America/La_Paz	-4:32:36 -	LMT	1890
 
 # Brazil
 
-# From Paul Eggert <eggert@twinsun.com> (1993-11-18):
+# From Paul Eggert (1993-11-18):
 # The mayor of Rio recently attempted to change the time zone rules
 # just in his city, in order to leave more summer time for the tourist trade.
 # The rule change lasted only part of the day;
@@ -532,19 +519,13 @@ Rule	Brazil	1996	only	-	Feb	11	 0:00	0	-
 # adopted by same states, minus AL, SE.
 Rule	Brazil	1996	only	-	Oct	 6	 0:00	1:00	S
 Rule	Brazil	1997	only	-	Feb	16	 0:00	0	-
-# From Daniel C. Sobral <dcs@gns.com.br> (1998-02-12):
+# From Daniel C. Sobral (1998-02-12):
 # In 1997, the DS began on October 6. The stated reason was that
 # because international television networks ignored Brazil's policy on DS,
 # they bought the wrong times on satellite for coverage of Pope's visit.
 # This year, the ending date of DS was postponed to March 1
 # to help dealing with the shortages of electric power.
 #
-# From Paul Eggert (1998-02-25):
-# <a href="http://churchnet.ucsm.ac.uk/news/files2/news165.htm">
-# Brazil Prepares for Papal Visit
-# </a>,
-# Church Net UK (1997-10-02).
-#
 # Decree 2,317 (1997-09-04), adopted by same states.
 Rule	Brazil	1997	only	-	Oct	 6	 0:00	1:00	S
 # Decree <a href="http://pcdsh01.on.br/figuras/HV2495.JPG">2,495</a>
@@ -579,11 +560,12 @@ Rule	Brazil	2003	only	-	Oct	19	 0:00	1:00	S
 # Decree 5,223 (2004-10-01) reestablishes DST in MT.
 # <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm"></a>
 Rule	Brazil	2004	only	-	Nov	 2	 0:00	1:00	S
+# Decree <a href="http://pcdsh01.on.br/DecHV5539.gif">5,539</a> (2005-09-19),
+# adopted by the same states as before.
+Rule	Brazil	2005	max	-	Oct	Sun>=15	 0:00	1:00	S
 # The latest ruleset listed above says that the following states observe DST:
 # DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP.
-#
-Rule	Brazil	2005	max	-	Oct	Sun>=15	 0:00	1:00	S
-# For dates after mid-2005, the above rules with TO="max" are guesses
+# For dates after mid-2006, the above rules with TO="max" are guesses
 # and are quite possibly wrong, but are more likely than no DST at all.
 
 
@@ -671,7 +653,7 @@ Zone America/Campo_Grande -3:38:28 -	LMT	1914
 # Mato Grosso (MT)
 Zone America/Cuiaba	-3:44:20 -	LMT	1914
 			-4:00	Brazil	AM%sT	2003 Sep 24
-			-4:00	-	AMT	2004 Oct  4
+			-4:00	-	AMT	2004 Oct  1
 			-4:00	Brazil	AM%sT
 #
 # west Para (PA), Rondonia (RO)
@@ -942,9 +924,16 @@ Rule	Para	1998	2001	-	Mar	Sun>=1	0:00	0	-
 # A decree was issued in Paraguay (no. 16350) on 2002-02-26 that changed the
 # dst method to be from the first Sunday in September to the first Sunday in
 # April.
-Rule	Para	2002	max	-	Apr	Sun>=1	0:00	0	-
-Rule	Para	2002	max	-	Sep	Sun>=1	0:00	1:00	S
-
+Rule	Para	2002	2004	-	Apr	Sun>=1	0:00	0	-
+Rule	Para	2002	2003	-	Sep	Sun>=1	0:00	1:00	S
+#
+# From Jesper Norgaard Welen (2005-01-02):
+# There are several sources that claim that Paraguay made
+# a timezone rule change in autumn 2004.
+# From Steffen Thorsen (2005-01-05):
+# Decree 1,867 (2004-03-05) <http://www.labor.com.py/noticias.asp?id=27>
+Rule	Para	2004	max	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Para	2005	max	-	Mar	Sun>=8	0:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Asuncion	-3:50:40 -	LMT	1890
@@ -957,7 +946,7 @@ Zone America/Asuncion	-3:50:40 -	LMT	1890
 #
 # <a href="news:xrGmb.39935$gA1.13896113@news4.srv.hcvlny.cv.net">
 # From Evelyn C. Leeper via Mark Brader (2003-10-26):</a>
-# When we were in Peru in 1985-1986, they apparently switched over 
+# When we were in Peru in 1985-1986, they apparently switched over
 # sometime between December 29 and January 3 while we were on the Amazon.
 #
 # From Paul Eggert (2003-11-02):
@@ -1003,7 +992,7 @@ Zone America/Port_of_Spain -4:06:04 -	LMT	1912 Mar 2
 			-4:00	-	AST
 
 # Uruguay
-# From Paul Eggert <eggert@twinsun.com> (1993-11-18):
+# From Paul Eggert (1993-11-18):
 # Uruguay wins the prize for the strangest peacetime manipulation of the rules.
 # From Shanks:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -1056,8 +1045,18 @@ Rule	Uruguay	1993	only	-	Feb	28	 0:00	0	-
 # From Eduardo Cota (2004-09-20):
 # The uruguayan government has decreed a change in the local time....
 # http://www.presidencia.gub.uy/decretos/2004091502.htm
-Rule	Uruguay	2004	only	-	Sep	Sun>=15	 0:00	1:00	S
-Rule	Uruguay	2005	only	-	Mar	Sun>=8	 0:00	0	-
+Rule	Uruguay	2004	only	-	Sep	19	 0:00	1:00	S
+# From Steffen Thorsen (2005-03-11):
+# Uruguay's DST was scheduled to end on Sunday, 2005-03-13, but in order to
+# save energy ... it was postponed two weeks....
+# http://www.presidencia.gub.uy/_Web/noticias/2005/03/2005031005.htm
+Rule	Uruguay	2005	only	-	Mar	27	 2:00	0	-
+# From Eduardo Cota (2005-09-27):
+# http://www.presidencia.gub.uy/_Web/decretos/2005/09/CM%20119_09%2009%202005_00001.PDF
+# This means that from 2005-10-09 at 02:00 local time, until 2006-03-12 at
+# 02:00 local time, official time in Uruguay will be at GMT -2.
+Rule	Uruguay	2005	only	-	Oct	 9	 2:00	1:00	S
+Rule	Uruguay	2006	only	-	Mar	12	 2:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Montevideo	-3:44:44 -	LMT	1898 Jun 28
 			-3:44:44 -	MMT	1920 May  1	# Montevideo MT
diff --git a/timezone/systemv b/timezone/systemv
index c6a6b6404b..6cf9645de0 100644
--- a/timezone/systemv
+++ b/timezone/systemv
@@ -1,24 +1,24 @@
-# @(#)systemv	7.3
+# @(#)systemv	8.1
 
 # Old rules, should the need arise.
 # No attempt is made to handle Newfoundland, since it cannot be expressed
 # using the System V "TZ" scheme (half-hour offset), or anything outside
 # North America (no support for non-standard DST start/end dates), nor
-# the change in the DST rules in the US in 1987 (which occurred before
+# the changes in the DST rules in the US after 1976 (which occurred after
 # the old rules were written).
 #
-# If you need the old rules, uncomment ## lines and comment-out Link lines.
+# If you need the old rules, uncomment ## lines.
 # Compile this *without* leap second correction for true conformance.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-## Rule	SystemV	min	1973	-	Apr	lastSun	2:00	1:00	D
-## Rule	SystemV	min	1973	-	Oct	lastSun	2:00	0	S
-## Rule	SystemV	1974	only	-	Jan	6	2:00	1:00	D
-## Rule	SystemV	1974	only	-	Nov	lastSun	2:00	0	S
-## Rule	SystemV	1975	only	-	Feb	23	2:00	1:00	D
-## Rule	SystemV	1975	only	-	Oct	lastSun	2:00	0	S
-## Rule	SystemV	1976	max	-	Apr	lastSun	2:00	1:00	D
-## Rule	SystemV	1976	max	-	Oct	lastSun	2:00	0	S
+Rule	SystemV	min	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	SystemV	min	1973	-	Oct	lastSun	2:00	0	S
+Rule	SystemV	1974	only	-	Jan	6	2:00	1:00	D
+Rule	SystemV	1974	only	-	Nov	lastSun	2:00	0	S
+Rule	SystemV	1975	only	-	Feb	23	2:00	1:00	D
+Rule	SystemV	1975	only	-	Oct	lastSun	2:00	0	S
+Rule	SystemV	1976	max	-	Apr	lastSun	2:00	1:00	D
+Rule	SystemV	1976	max	-	Oct	lastSun	2:00	0	S
 
 # Zone	NAME		GMTOFF	RULES/SAVE	FORMAT	[UNTIL]
 ## Zone	SystemV/AST4ADT	-4:00	SystemV		A%sT
@@ -34,17 +34,3 @@
 ## Zone	SystemV/PST8	-8:00	-		PST
 ## Zone	SystemV/YST9	-9:00	-		YST
 ## Zone	SystemV/HST10	-10:00	-		HST
-# For now...
-Link	America/Halifax		SystemV/AST4ADT
-Link	America/New_York	SystemV/EST5EDT
-Link	America/Chicago		SystemV/CST6CDT
-Link	America/Denver		SystemV/MST7MDT
-Link	America/Los_Angeles	SystemV/PST8PDT
-Link	America/Anchorage	SystemV/YST9YDT
-Link	America/Puerto_Rico	SystemV/AST4
-Link	America/Indianapolis	SystemV/EST5
-Link	America/Regina		SystemV/CST6
-Link	America/Phoenix		SystemV/MST7
-Link	Pacific/Pitcairn	SystemV/PST8
-Link	Pacific/Gambier		SystemV/YST9
-Link	Pacific/Honolulu	SystemV/HST10
diff --git a/timezone/tst-timezone.c b/timezone/tst-timezone.c
index 127956de29..4c879163cf 100644
--- a/timezone/tst-timezone.c
+++ b/timezone/tst-timezone.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2005 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Jaeger <aj@suse.de>, 1998.
 
@@ -42,9 +42,9 @@ static const struct test_times tests[] =
   { "Australia/Melbourne", 1, -36000, { "EST", "EST" }},
   { "America/Sao_Paulo", 1, 10800, {"BRT", "BRST" }},
   { "America/Chicago", 1, 21600, {"CST", "CDT" }},
-  { "America/Indianapolis", 1, 18000, {"EST", "EDT" }},
+  { "America/Indiana/Indianapolis", 1, 18000, {"EST", "EDT" }},
   { "America/Los_Angeles", 1, 28800, {"PST", "PDT" }},
-  { "Asia/Tokyo", 0, -32400, {"JST", "JST" }},
+  { "Asia/Tokyo", 1, -32400, {"JST", "JDT" }},
   { "Pacific/Auckland", 1, -43200, { "NZST", "NZDT" }},
   { NULL, 0, 0 }
 };
diff --git a/timezone/tzfile.h b/timezone/tzfile.h
index 0921c3c339..3a9eee305a 100644
--- a/timezone/tzfile.h
+++ b/timezone/tzfile.h
@@ -4,7 +4,7 @@
 
 /*
 ** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
+** 1996-06-05 by Arthur David Olson.
 */
 
 /*
@@ -21,7 +21,7 @@
 
 #ifndef lint
 #ifndef NOID
-static char	tzfilehid[] = "@(#)tzfile.h	7.14";
+static char	tzfilehid[] = "@(#)tzfile.h	8.1";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -48,8 +48,9 @@ static char	tzfilehid[] = "@(#)tzfile.h	7.14";
 #define	TZ_MAGIC	"TZif"
 
 struct tzhead {
- 	char	tzh_magic[4];		/* TZ_MAGIC */
-	char	tzh_reserved[16];	/* reserved for future use */
+	char	tzh_magic[4];		/* TZ_MAGIC */
+	char	tzh_version[1];		/* '\0' or '2' as of 2005 */
+	char	tzh_reserved[15];	/* reserved--must be zero */
 	char	tzh_ttisgmtcnt[4];	/* coded number of trans. time flags */
 	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
 	char	tzh_leapcnt[4];		/* coded number of leap seconds */
@@ -84,18 +85,22 @@ struct tzhead {
 */
 
 /*
+** If tzh_version is '2' or greater, the above is followed by a second instance
+** of tzhead and a second instance of the data in which each coded transition
+** time uses 8 rather than 4 chars,
+** then a POSIX-TZ-environment-variable-style string for use in handling
+** instants after the last transition time stored in the file
+** (with nothing between the newlines if there is no POSIX representation for
+** such instants).
+*/
+
+/*
 ** In the current implementation, "tzset()" refuses to deal with files that
 ** exceed any of the limits below.
 */
 
 #ifndef TZ_MAX_TIMES
-/*
-** The TZ_MAX_TIMES value below is enough to handle a bit more than a
-** year's worth of solar time (corrected daily to the nearest second) or
-** 138 years of Pacific Presidential Election time
-** (where there are three time zone transitions every fourth year).
-*/
-#define TZ_MAX_TIMES	370
+#define TZ_MAX_TIMES	1200
 #endif /* !defined TZ_MAX_TIMES */
 
 #ifndef TZ_MAX_TYPES
@@ -105,7 +110,7 @@ struct tzhead {
 #ifdef NOSOLAR
 /*
 ** Must be at least 14 for Europe/Riga as of Jan 12 1995,
-** as noted by Earl Chew <earl@hpato.aus.hp.com>.
+** as noted by Earl Chew.
 */
 #define TZ_MAX_TYPES	20	/* Maximum number of local time types */
 #endif /* !defined NOSOLAR */
@@ -156,33 +161,20 @@ struct tzhead {
 #define EPOCH_YEAR	1970
 #define EPOCH_WDAY	TM_THURSDAY
 
-/*
-** Accurate only for the past couple of centuries;
-** that will probably do.
-*/
-
 #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
 
-#ifndef USG
-
 /*
-** Use of the underscored variants may cause problems if you move your code to
-** certain System-V-based systems; for maximum portability, use the
-** underscore-free variants.  The underscored variants are provided for
-** backward compatibility only; they may disappear from future versions of
-** this file.
+** Since everything in isleap is modulo 400 (or a factor of 400), we know that
+**	isleap(y) == isleap(y % 400)
+** and so
+**	isleap(a + b) == isleap((a + b) % 400)
+** or
+**	isleap(a + b) == isleap(a % 400 + b % 400)
+** This is true even if % means modulo rather than Fortran remainder
+** (which is allowed by C89 but not C99).
+** We use this to avoid addition overflow problems.
 */
 
-#define SECS_PER_MIN	SECSPERMIN
-#define MINS_PER_HOUR	MINSPERHOUR
-#define HOURS_PER_DAY	HOURSPERDAY
-#define DAYS_PER_WEEK	DAYSPERWEEK
-#define DAYS_PER_NYEAR	DAYSPERNYEAR
-#define DAYS_PER_LYEAR	DAYSPERLYEAR
-#define SECS_PER_HOUR	SECSPERHOUR
-#define SECS_PER_DAY	SECSPERDAY
-#define MONS_PER_YEAR	MONSPERYEAR
-
-#endif /* !defined USG */
+#define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
 
 #endif /* !defined TZFILE_H */
diff --git a/timezone/tzselect.ksh b/timezone/tzselect.ksh
index be589240d1..f6e28bfdab 100644
--- a/timezone/tzselect.ksh
+++ b/timezone/tzselect.ksh
@@ -1,11 +1,11 @@
 #! @KSH@
 
-# '@(#)tzselect.ksh	1.7'
+# '@(#)tzselect.ksh	1.8'
 
 # Ask the user about the time zone, and output the resulting TZ value to stdout.
 # Interact with the user via stderr and stdin.
 
-# Contributed by Paul Eggert <eggert@twinsun.com>.
+# Contributed by Paul Eggert.
 
 # Porting notes:
 #
diff --git a/timezone/yearistype b/timezone/yearistype
index 8d796f1f21..d3a248032e 100755
--- a/timezone/yearistype
+++ b/timezone/yearistype
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-: '@(#)yearistype.sh	7.7'
+: '@(#)yearistype.sh	7.8'
 
 case $#-$1 in
 	2-|2-0*|2-*[!0-9]*)
@@ -9,7 +9,7 @@ case $#-$1 in
 esac
 
 case $#-$2 in
-	2-even)	
+	2-even)
 		case $1 in
 			*[24680])			exit 0 ;;
 			*)				exit 1 ;;
@@ -19,7 +19,7 @@ case $#-$2 in
 			*[02468][048]|*[13579][26])	exit 1 ;;
 			*)				exit 0 ;;
 		esac ;;
-	2-odd)	
+	2-odd)
 		case $1 in
 			*[13579])			exit 0 ;;
 			*)				exit 1 ;;
@@ -29,7 +29,7 @@ case $#-$2 in
 			*[02468][048]|*[13579][26])	exit 0 ;;
 			*)				exit 1 ;;
 		esac ;;
-	2-*)	
+	2-*)
 		echo "$0: wild type - $2" >&2 ;;
 esac
 
diff --git a/timezone/zdump.c b/timezone/zdump.c
index 20bb916822..3c8d179fce 100644
--- a/timezone/zdump.c
+++ b/timezone/zdump.c
@@ -1,4 +1,4 @@
-static char	elsieid[] = "@(#)zdump.c	7.40";
+static char	elsieid[] = "@(#)zdump.c	8.2";
 
 /*
 ** This code has been made independent of the rest of the time
@@ -11,6 +11,19 @@ static char	elsieid[] = "@(#)zdump.c	7.40";
 #include "sys/types.h"	/* for time_t */
 #include "time.h"	/* for struct tm */
 #include "stdlib.h"	/* for exit, malloc, atoi */
+#include "float.h"	/* for FLT_MAX and DBL_MAX */
+#include "ctype.h"	/* for isalpha et al. */
+#ifndef isascii
+#define isascii(x) 1
+#endif /* !defined isascii */
+
+#ifndef ZDUMP_LO_YEAR
+#define ZDUMP_LO_YEAR	(-500)
+#endif /* !defined ZDUMP_LO_YEAR */
+
+#ifndef ZDUMP_HI_YEAR
+#define ZDUMP_HI_YEAR	2500
+#endif /* !defined ZDUMP_HI_YEAR */
 
 #ifndef MAX_STRING_LENGTH
 #define MAX_STRING_LENGTH	1024
@@ -61,9 +74,20 @@ static char	elsieid[] = "@(#)zdump.c	7.40";
 #endif /* !defined DAYSPERNYEAR */
 
 #ifndef isleap
-#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
 #endif /* !defined isleap */
 
+#ifndef isleap_sum
+/*
+** See tzfile.h for details on isleap_sum.
+*/
+#define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
+#endif /* !defined isleap_sum */
+
+#define SECSPERDAY	((long) SECSPERHOUR * HOURSPERDAY)
+#define SECSPERNYEAR	(SECSPERDAY * DAYSPERNYEAR)
+#define SECSPERLYEAR	(SECSPERNYEAR + SECSPERDAY)
+
 #if HAVE_GETTEXT
 #include "locale.h"	/* for setlocale */
 #include "libintl.h"
@@ -106,27 +130,106 @@ static char	elsieid[] = "@(#)zdump.c	7.40";
 #endif /* !defined TZ_DOMAIN */
 
 #ifndef P
-#ifdef __STDC__
 #define P(x)	x
-#else /* !defined __STDC__ */
-#define P(x)	()
-#endif /* !defined __STDC__ */
 #endif /* !defined P */
 
 extern char **	environ;
 extern int	getopt P((int argc, char * const argv[],
-			  const char * options));
+			const char * options));
 extern char *	optarg;
 extern int	optind;
 extern char *	tzname[2];
 
+static time_t	absolute_min_time;
+static time_t	absolute_max_time;
+static size_t	longest;
+static char *	progname;
+static int	warned;
+
 static char *	abbr P((struct tm * tmp));
+static void	abbrok P((const char * abbrp, const char * zone));
 static long	delta P((struct tm * newp, struct tm * oldp));
+static void	dumptime P((const struct tm * tmp));
 static time_t	hunt P((char * name, time_t lot, time_t	hit));
-static size_t	longest;
-static char *	progname;
+static void	setabsolutes P((void));
 static void	show P((char * zone, time_t t, int v));
-static void	dumptime P((const struct tm * tmp));
+static const char *	tformat P((void));
+static time_t	yeartot P((long y));
+
+#ifndef TYPECHECK
+#define my_localtime	localtime
+#else /* !defined TYPECHECK */
+static struct tm *
+my_localtime(tp)
+time_t *	tp;
+{
+	register struct tm *	tmp;
+
+	tmp = localtime(tp);
+	if (tp != NULL && tmp != NULL) {
+		struct tm	tm;
+		register time_t	t;
+
+		tm = *tmp;
+		t = mktime(&tm);
+		if (t - *tp >= 1 || *tp - t >= 1) {
+			(void) fflush(stdout);
+			(void) fprintf(stderr, "\n%s: ", progname);
+			(void) fprintf(stderr, tformat(), *tp);
+			(void) fprintf(stderr, " ->");
+			(void) fprintf(stderr, " year=%d", tmp->tm_year);
+			(void) fprintf(stderr, " mon=%d", tmp->tm_mon);
+			(void) fprintf(stderr, " mday=%d", tmp->tm_mday);
+			(void) fprintf(stderr, " hour=%d", tmp->tm_hour);
+			(void) fprintf(stderr, " min=%d", tmp->tm_min);
+			(void) fprintf(stderr, " sec=%d", tmp->tm_sec);
+			(void) fprintf(stderr, " isdst=%d", tmp->tm_isdst);
+			(void) fprintf(stderr, " -> ");
+			(void) fprintf(stderr, tformat(), t);
+			(void) fprintf(stderr, "\n");
+		}
+	}
+	return tmp;
+}
+#endif /* !defined TYPECHECK */
+
+static void
+abbrok(abbrp, zone)
+const char * const	abbrp;
+const char * const	zone;
+{
+	register const char *	cp;
+	register char *		wp;
+
+	if (warned)
+		return;
+	cp = abbrp;
+	wp = NULL;
+	while (isascii((unsigned char) *cp) && isalpha((unsigned char) *cp))
+		++cp;
+	if (cp - abbrp == 0)
+		wp = _("lacks alphabetic at start");
+	else if (cp - abbrp < 3)
+		wp = _("has fewer than 3 alphabetics");
+	else if (cp - abbrp > 6)
+		wp = _("has more than 6 alphabetics");
+	if (wp == NULL && (*cp == '+' || *cp == '-')) {
+		++cp;
+		if (isascii((unsigned char) *cp) &&
+			isdigit((unsigned char) *cp))
+				if (*cp++ == '1' && *cp >= '0' && *cp <= '4')
+					++cp;
+		if (*cp != '\0')
+			wp = _("differs from POSIX standard");
+	}
+	if (wp == NULL)
+		return;
+	(void) fflush(stdout);
+	(void) fprintf(stderr,
+		_("%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"),
+		progname, zone, abbrp, wp);
+	warned = TRUE;
+}
 
 int
 main(argc, argv)
@@ -136,20 +239,24 @@ char *	argv[];
 	register int		i;
 	register int		c;
 	register int		vflag;
-	register char *		cutoff;
-	register int		cutyear;
-	register long		cuttime;
-	char **			fakeenv;
+	register char *		cutarg;
+	register long		cutloyear = ZDUMP_LO_YEAR;
+	register long		cuthiyear = ZDUMP_HI_YEAR;
+	register time_t		cutlotime;
+	register time_t		cuthitime;
+	register char **	fakeenv;
 	time_t			now;
 	time_t			t;
 	time_t			newt;
-	time_t			hibit;
 	struct tm		tm;
 	struct tm		newtm;
+	register struct tm *	tmp;
+	register struct tm *	newtmp;
 
-	INITIALIZE(cuttime);
+	INITIALIZE(cutlotime);
+	INITIALIZE(cuthitime);
 #if HAVE_GETTEXT
-	(void) setlocale(LC_MESSAGES, "");
+	(void) setlocale(LC_ALL, "");
 #ifdef TZ_DOMAINDIR
 	(void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
 #endif /* defined TEXTDOMAINDIR */
@@ -159,49 +266,60 @@ char *	argv[];
 	for (i = 1; i < argc; ++i)
 		if (strcmp(argv[i], "--version") == 0) {
 			(void) printf("%s\n", elsieid);
-			(void) exit(EXIT_SUCCESS);
+			exit(EXIT_SUCCESS);
 		}
 	vflag = 0;
-	cutoff = NULL;
+	cutarg = NULL;
 	while ((c = getopt(argc, argv, "c:v")) == 'c' || c == 'v')
 		if (c == 'v')
 			vflag = 1;
-		else	cutoff = optarg;
+		else	cutarg = optarg;
 	if ((c != EOF && c != -1) ||
 		(optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
 			(void) fprintf(stderr,
-_("%s: usage is %s [ --version ] [ -v ] [ -c cutoff ] zonename ...\n"),
-				argv[0], argv[0]);
-			(void) exit(EXIT_FAILURE);
+_("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
+				progname, progname);
+			exit(EXIT_FAILURE);
 	}
-	if (cutoff != NULL) {
-		int	y;
-
-		cutyear = atoi(cutoff);
-		cuttime = 0;
-		for (y = EPOCH_YEAR; y < cutyear; ++y)
-			cuttime += DAYSPERNYEAR + isleap(y);
-		cuttime *= SECSPERHOUR * HOURSPERDAY;
+	if (vflag) {
+		if (cutarg != NULL) {
+			long	lo;
+			long	hi;
+			char	dummy;
+
+			if (sscanf(cutarg, "%ld%c", &hi, &dummy) == 1) {
+				cuthiyear = hi;
+			} else if (sscanf(cutarg, "%ld,%ld%c",
+				&lo, &hi, &dummy) == 2) {
+					cutloyear = lo;
+					cuthiyear = hi;
+			} else {
+(void) fprintf(stderr, _("%s: wild -c argument %s\n"),
+					progname, cutarg);
+				exit(EXIT_FAILURE);
+			}
+		}
+		setabsolutes();
+		cutlotime = yeartot(cutloyear);
+		cuthitime = yeartot(cuthiyear);
 	}
 	(void) time(&now);
 	longest = 0;
 	for (i = optind; i < argc; ++i)
 		if (strlen(argv[i]) > longest)
 			longest = strlen(argv[i]);
-	for (hibit = 1; (hibit << 1) != 0; hibit <<= 1)
-		continue;
 	{
 		register int	from;
 		register int	to;
 
-		for (i = 0;  environ[i] != NULL;  ++i)
+		for (i = 0; environ[i] != NULL; ++i)
 			continue;
 		fakeenv = (char **) malloc((size_t) ((i + 2) *
 			sizeof *fakeenv));
 		if (fakeenv == NULL ||
 			(fakeenv[0] = (char *) malloc(longest + 4)) == NULL) {
 					(void) perror(progname);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 		}
 		to = 0;
 		(void) strcpy(fakeenv[to++], "TZ=");
@@ -219,85 +337,175 @@ _("%s: usage is %s [ --version ] [ -v ] [ -c cutoff ] zonename ...\n"),
 			show(argv[i], now, FALSE);
 			continue;
 		}
-		/*
-		** Get lowest value of t.
-		*/
-		t = hibit;
-		if (t > 0)		/* time_t is unsigned */
-			t = 0;
+		warned = FALSE;
+		t = absolute_min_time;
 		show(argv[i], t, TRUE);
 		t += SECSPERHOUR * HOURSPERDAY;
 		show(argv[i], t, TRUE);
-		tm = *localtime(&t);
-		(void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
+		if (t < cutlotime)
+			t = cutlotime;
+		tmp = my_localtime(&t);
+		if (tmp != NULL) {
+			tm = *tmp;
+			(void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
+		}
 		for ( ; ; ) {
-			if (cutoff != NULL && t >= cuttime)
+			if (t >= cuthitime)
 				break;
 			newt = t + SECSPERHOUR * 12;
-			if (cutoff != NULL && newt >= cuttime)
+			if (newt >= cuthitime)
 				break;
 			if (newt <= t)
 				break;
-			newtm = *localtime(&newt);
-			if (delta(&newtm, &tm) != (newt - t) ||
+			newtmp = localtime(&newt);
+			if (newtmp != NULL)
+				newtm = *newtmp;
+			if ((tmp == NULL || newtmp == NULL) ? (tmp != newtmp) :
+				(delta(&newtm, &tm) != (newt - t) ||
 				newtm.tm_isdst != tm.tm_isdst ||
-				strcmp(abbr(&newtm), buf) != 0) {
+				strcmp(abbr(&newtm), buf) != 0)) {
 					newt = hunt(argv[i], t, newt);
-					newtm = *localtime(&newt);
-					(void) strncpy(buf, abbr(&newtm),
-						(sizeof buf) - 1);
+					newtmp = localtime(&newt);
+					if (newtmp != NULL) {
+						newtm = *newtmp;
+						(void) strncpy(buf,
+							abbr(&newtm),
+							(sizeof buf) - 1);
+					}
 			}
 			t = newt;
 			tm = newtm;
+			tmp = newtmp;
 		}
-		/*
-		** Get highest value of t.
-		*/
-		t = ~((time_t) 0);
-		if (t < 0)		/* time_t is signed */
-			t &= ~hibit;
+		t = absolute_max_time;
 		t -= SECSPERHOUR * HOURSPERDAY;
 		show(argv[i], t, TRUE);
 		t += SECSPERHOUR * HOURSPERDAY;
 		show(argv[i], t, TRUE);
 	}
 	if (fflush(stdout) || ferror(stdout)) {
-		(void) fprintf(stderr, "%s: ", argv[0]);
-		(void) perror(_("Error writing standard output"));
-		(void) exit(EXIT_FAILURE);
+		(void) fprintf(stderr, "%s: ", progname);
+		(void) perror(_("Error writing to standard output"));
+		exit(EXIT_FAILURE);
 	}
 	exit(EXIT_SUCCESS);
+	/* If exit fails to exit... */
+	return EXIT_FAILURE;
+}
+
+static void
+setabsolutes()
+{
+	if (0.5 == (time_t) 0.5) {
+		/*
+		** time_t is floating.
+		*/
+		if (sizeof (time_t) == sizeof (float)) {
+			absolute_min_time = (time_t) -FLT_MAX;
+			absolute_max_time = (time_t) FLT_MAX;
+		} else if (sizeof (time_t) == sizeof (double)) {
+			absolute_min_time = (time_t) -DBL_MAX;
+			absolute_max_time = (time_t) DBL_MAX;
+		} else {
+			(void) fprintf(stderr,
+_("%s: use of -v on system with floating time_t other than float or double\n"),
+				progname);
+			exit(EXIT_FAILURE);
+		}
+	} else if (0 > (time_t) -1) {
+		/*
+		** time_t is signed.  Assume overflow wraps around.
+		*/
+		time_t t = 0;
+		time_t t1 = 1;
+
+		while (t < t1) {
+			t = t1;
+			t1 = 2 * t1 + 1;
+		}
+		  
+		absolute_max_time = t;
+		t = -t;
+		absolute_min_time = t - 1;
+		if (t < absolute_min_time)
+			absolute_min_time = t;
+	} else {
+		/*
+		** time_t is unsigned.
+		*/
+		absolute_min_time = 0;
+		absolute_max_time = absolute_min_time - 1;
+	}
+}
 
-	/* gcc -Wall pacifier */
-	for ( ; ; )
-		continue;
+static time_t
+yeartot(y)
+const long	y;
+{
+	register long	myy;
+	register long	seconds;
+	register time_t	t;
+
+	myy = EPOCH_YEAR;
+	t = 0;
+	while (myy != y) {
+		if (myy < y) {
+			seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
+			++myy;
+			if (t > absolute_max_time - seconds) {
+				t = absolute_max_time;
+				break;
+			}
+			t += seconds;
+		} else {
+			--myy;
+			seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
+			if (t < absolute_min_time + seconds) {
+				t = absolute_min_time;
+				break;
+			}
+			t -= seconds;
+		}
+	}
+	return t;
 }
 
 static time_t
-hunt(name, lot, hit)
-char *	name;
-time_t	lot;
-time_t	hit;
+hunt(char *name, time_t lot, time_t hit)
 {
-	time_t		t;
-	struct tm	lotm;
-	struct tm	tm;
-	static char	loab[MAX_STRING_LENGTH];
-
-	lotm = *localtime(&lot);
-	(void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
-	while ((hit - lot) >= 2) {
-		t = lot / 2 + hit / 2;
+	time_t			t;
+	long			diff;
+	struct tm		lotm;
+	register struct tm *	lotmp;
+	struct tm		tm;
+	register struct tm *	tmp;
+	char			loab[MAX_STRING_LENGTH];
+
+	lotmp = my_localtime(&lot);
+	if (lotmp != NULL) {
+		lotm = *lotmp;
+		(void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
+	}
+	for ( ; ; ) {
+		diff = (long) (hit - lot);
+		if (diff < 2)
+			break;
+		t = lot;
+		t += diff / 2;
 		if (t <= lot)
 			++t;
 		else if (t >= hit)
 			--t;
-		tm = *localtime(&t);
-		if (delta(&tm, &lotm) == (t - lot) &&
+		tmp = my_localtime(&t);
+		if (tmp != NULL)
+			tm = *tmp;
+		if ((lotmp == NULL || tmp == NULL) ? (lotmp == tmp) :
+			(delta(&tm, &lotm) == (t - lot) &&
 			tm.tm_isdst == lotm.tm_isdst &&
-			strcmp(abbr(&tm), loab) == 0) {
+			strcmp(abbr(&tm), loab) == 0)) {
 				lot = t;
 				lotm = tm;
+				lotmp = tmp;
 		} else	hit = t;
 	}
 	show(name, lot, TRUE);
@@ -306,7 +514,7 @@ time_t	hit;
 }
 
 /*
-** Thanks to Paul Eggert (eggert@twinsun.com) for logic used in delta.
+** Thanks to Paul Eggert for logic used in delta.
 */
 
 static long
@@ -314,14 +522,14 @@ delta(newp, oldp)
 struct tm *	newp;
 struct tm *	oldp;
 {
-	long	result;
-	int	tmy;
+	register long	result;
+	register int	tmy;
 
 	if (newp->tm_year < oldp->tm_year)
 		return -delta(oldp, newp);
 	result = 0;
 	for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
-		result += DAYSPERNYEAR + isleap(tmy + (long) TM_YEAR_BASE);
+		result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE);
 	result += newp->tm_yday - oldp->tm_yday;
 	result *= HOURSPERDAY;
 	result += newp->tm_hour - oldp->tm_hour;
@@ -333,29 +541,36 @@ struct tm *	oldp;
 }
 
 static void
-show(zone, t, v)
-char *	zone;
-time_t	t;
-int	v;
+show(char *zone, time_t t, int v)
 {
-	struct tm *	tmp;
+	register struct tm *	tmp;
 
 	(void) printf("%-*s  ", (int) longest, zone);
 	if (v) {
-		dumptime(gmtime(&t));
-		(void) printf(" UTC = ");
+		tmp = gmtime(&t);
+		if (tmp == NULL) {
+			(void) printf(tformat(), t);
+		} else {
+			dumptime(tmp);
+			(void) printf(" UTC");
+		}
+		(void) printf(" = ");
 	}
-	tmp = localtime(&t);
+	tmp = my_localtime(&t);
 	dumptime(tmp);
-	if (*abbr(tmp) != '\0')
-		(void) printf(" %s", abbr(tmp));
-	if (v) {
-		(void) printf(" isdst=%d", tmp->tm_isdst);
+	if (tmp != NULL) {
+		if (*abbr(tmp) != '\0')
+			(void) printf(" %s", abbr(tmp));
+		if (v) {
+			(void) printf(" isdst=%d", tmp->tm_isdst);
 #ifdef TM_GMTOFF
-		(void) printf(" gmtoff=%ld", tmp->TM_GMTOFF);
+			(void) printf(" gmtoff=%ld", tmp->TM_GMTOFF);
 #endif /* defined TM_GMTOFF */
+		}
 	}
 	(void) printf("\n");
+	if (tmp != NULL && *abbr(tmp) != '\0')
+		abbrok(abbr(tmp), zone);
 }
 
 static char *
@@ -371,6 +586,33 @@ struct tm *	tmp;
 	return (result == NULL) ? &nada : result;
 }
 
+/*
+** The code below can fail on certain theoretical systems;
+** it works on all known real-world systems as of 2004-12-30.
+*/
+
+static const char *
+tformat()
+{
+	if (0.5 == (time_t) 0.5) {	/* floating */
+		if (sizeof (time_t) > sizeof (double))
+			return "%Lg";
+		return "%g";
+	}
+	if (0 > (time_t) -1) {		/* signed */
+		if (sizeof (time_t) > sizeof (long))
+			return "%lld";
+		if (sizeof (time_t) > sizeof (int))
+			return "%ld";
+		return "%d";
+	}
+	if (sizeof (time_t) > sizeof (unsigned long))
+		return "%llu";
+	if (sizeof (time_t) > sizeof (unsigned int))
+		return "%lu";
+	return "%u";
+}
+
 static void
 dumptime(timeptr)
 register const struct tm *	timeptr;
@@ -384,7 +626,13 @@ register const struct tm *	timeptr;
 	};
 	register const char *	wn;
 	register const char *	mn;
+	register int		lead;
+	register int		trail;
 
+	if (timeptr == NULL) {
+		(void) printf("NULL");
+		return;
+	}
 	/*
 	** The packaged versions of localtime and gmtime never put out-of-range
 	** values in tm_wday or tm_mon, but since this code might be compiled
@@ -398,9 +646,23 @@ register const struct tm *	timeptr;
 		(int) (sizeof mon_name / sizeof mon_name[0]))
 			mn = "???";
 	else		mn = mon_name[timeptr->tm_mon];
-	(void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d %ld",
+	(void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d ",
 		wn, mn,
 		timeptr->tm_mday, timeptr->tm_hour,
-		timeptr->tm_min, timeptr->tm_sec,
-		timeptr->tm_year + (long) TM_YEAR_BASE);
+		timeptr->tm_min, timeptr->tm_sec);
+#define DIVISOR	10
+	trail = timeptr->tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
+	lead = timeptr->tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR +
+		trail / DIVISOR;
+	trail %= DIVISOR;
+	if (trail < 0 && lead > 0) {
+		trail += DIVISOR;
+		--lead;
+	} else if (lead < 0 && trail > 0) {
+		trail -= DIVISOR;
+		++lead;
+	}
+	if (lead == 0)
+		(void) printf("%d", trail);
+	else	(void) printf("%d%d", lead, ((trail < 0) ? -trail : trail));
 }
diff --git a/timezone/zic.c b/timezone/zic.c
index 9bb8662e55..f7393ea7ba 100644
--- a/timezone/zic.c
+++ b/timezone/zic.c
@@ -1,9 +1,22 @@
-static char	elsieid[] = "@(#)zic.c	7.116";
+/*
+** This file is in the public domain, so clarified as of
+** 2006-07-17 by Arthur David Olson.
+*/
+
+static char	elsieid[] = "@(#)zic.c	8.7";
 
 #include "private.h"
 #include "locale.h"
 #include "tzfile.h"
 
+#define	ZIC_VERSION	'2'
+
+typedef int_fast64_t	zic_t;
+
+#ifndef ZIC_MAX_ABBR_LEN_WO_WARN
+#define ZIC_MAX_ABBR_LEN_WO_WARN	6
+#endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
+
 #if HAVE_SYS_STAT_H
 #include "sys/stat.h"
 #endif
@@ -15,7 +28,7 @@ static char	elsieid[] = "@(#)zic.c	7.116";
 
 /*
 ** On some ancient hosts, predicates like `isspace(C)' are defined
-** only if isascii(C) || C == EOF.  Modern hosts obey the C Standard,
+** only if isascii(C) || C == EOF. Modern hosts obey the C Standard,
 ** which says they are defined only if C == ((unsigned char) C) || C == EOF.
 ** Neither the C Standard nor Posix require that `isascii' exist.
 ** For portability, we check both ancient and modern requirements.
@@ -26,6 +39,11 @@ static char	elsieid[] = "@(#)zic.c	7.116";
 #define isascii(x) 1
 #endif
 
+#define OFFSET_STRLEN_MAXIMUM	(7 + INT_STRLEN_MAXIMUM(long))
+#define RULE_STRLEN_MAXIMUM	8	/* "Mdd.dd.d" */
+
+#define end(cp)	(strchr((cp), '\0'))
+
 struct rule {
 	const char *	r_filename;
 	int		r_linenum;
@@ -34,6 +52,8 @@ struct rule {
 	int		r_loyear;	/* for example, 1986 */
 	int		r_hiyear;	/* for example, 1986 */
 	const char *	r_yrtype;
+	int		r_lowasnum;
+	int		r_hiwasnum;
 
 	int		r_month;	/* 0..11 */
 
@@ -50,7 +70,7 @@ struct rule {
 	const char *	r_abbrvar;	/* variable part of abbreviation */
 
 	int		r_todo;		/* a rule to do (used in outzone) */
-	time_t		r_temp;		/* used in outzone */
+	zic_t		r_temp;		/* used in outzone */
 };
 
 /*
@@ -76,7 +96,7 @@ struct zone {
 	int		z_nrules;
 
 	struct rule	z_untilrule;
-	time_t		z_untiltime;
+	zic_t		z_untiltime;
 };
 
 extern int	getopt P((int argc, char * const argv[],
@@ -85,17 +105,18 @@ extern int	link P((const char * fromname, const char * toname));
 extern char *	optarg;
 extern int	optind;
 
-static void	addtt P((time_t starttime, int type));
+static void	addtt P((zic_t starttime, int type));
 static int	addtype P((long gmtoff, const char * abbr, int isdst,
 				int ttisstd, int ttisgmt));
-static void	leapadd P((time_t t, int positive, int rolling, int count));
+static void	leapadd P((zic_t t, int positive, int rolling, int count));
 static void	adjleap P((void));
 static void	associate P((void));
 static int	ciequal P((const char * ap, const char * bp));
 static void	convert P((long val, char * buf));
+static void	convert64 P((zic_t val, char * buf));
 static void	dolink P((const char * fromfile, const char * tofile));
 static void	doabbr P((char * abbr, const char * format,
-			const char * letters, int isdst));
+			const char * letters, int isdst, int doquotes));
 static void	eat P((const char * name, int num));
 static void	eats P((const char * name, int num,
 			const char * rname, int rnum));
@@ -111,6 +132,7 @@ static void	inrule P((char ** fields, int nfields));
 static int	inzcont P((char ** fields, int nfields));
 static int	inzone P((char ** fields, int nfields));
 static int	inzsub P((char ** fields, int nfields, int iscont));
+static int	is32 P((zic_t x));
 static int	itsabbr P((const char * abbr, const char * word));
 static int	itsdir P((const char * name));
 static int	lowerit P((int c));
@@ -120,33 +142,42 @@ static void	newabbr P((const char * abbr));
 static long	oadd P((long t1, long t2));
 static void	outzone P((const struct zone * zp, int ntzones));
 static void	puttzcode P((long code, FILE * fp));
+static void	puttzcode64 P((zic_t code, FILE * fp));
 static int	rcomp P((const void * leftp, const void * rightp));
-static time_t	rpytime P((const struct rule * rp, int wantedy));
+static zic_t	rpytime P((const struct rule * rp, int wantedy));
 static void	rulesub P((struct rule * rp,
 			const char * loyearp, const char * hiyearp,
 			const char * typep, const char * monthp,
 			const char * dayp, const char * timep));
+static int 	stringoffset P((char * result, long offset));
+static int	stringrule P((char * result, const struct rule * rp,
+			long dstoff, long gmtoff));
+static void 	stringzone P((char * result,
+			const struct zone * zp, int ntzones));
 static void	setboundaries P((void));
-static time_t	tadd P((time_t t1, long t2));
+static zic_t	tadd P((zic_t t1, long t2));
 static void	usage P((void));
-static void	writezone P((const char * name));
+static void	writezone P((const char * name, const char * string));
 static int	yearistype P((int year, const char * type));
 
-#if !(HAVE_STRERROR - 0)
+#if !HAVE_STRERROR
 static char *	strerror P((int));
-#endif /* !(HAVE_STRERROR - 0) */
+#endif /* !HAVE_STRERROR */
 
 static int		charcnt;
 static int		errors;
 static const char *	filename;
 static int		leapcnt;
+static int		leapseen;
+static int		leapminyear;
+static int		leapmaxyear;
 static int		linenum;
-static time_t		max_time;
+static int		max_abbrvar_len;
+static int		max_format_len;
+static zic_t		max_time;
 static int		max_year;
-static int		max_year_representable;
-static time_t		min_time;
+static zic_t		min_time;
 static int		min_year;
-static int		min_year_representable;
 static int		noise;
 static const char *	rfilename;
 static int		rlinenum;
@@ -334,7 +365,7 @@ static const int	len_years[2] = {
 };
 
 static struct attype {
-	time_t		at;
+	zic_t		at;
 	unsigned char	type;
 }			attypes[TZ_MAX_TIMES];
 static long		gmtoffs[TZ_MAX_TYPES];
@@ -343,7 +374,7 @@ static unsigned char	abbrinds[TZ_MAX_TYPES];
 static char		ttisstds[TZ_MAX_TYPES];
 static char		ttisgmts[TZ_MAX_TYPES];
 static char		chars[TZ_MAX_CHARS];
-static time_t		trans[TZ_MAX_LEAPS];
+static zic_t		trans[TZ_MAX_LEAPS];
 static long		corr[TZ_MAX_LEAPS];
 static char		roll[TZ_MAX_LEAPS];
 
@@ -360,7 +391,7 @@ char * const	ptr;
 
 		(void) fprintf(stderr, _("%s: Memory exhausted: %s\n"),
 			progname, e);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	return ptr;
 }
@@ -374,7 +405,7 @@ char * const	ptr;
 ** Error handling.
 */
 
-#if !(HAVE_STRERROR - 0)
+#if !HAVE_STRERROR
 static char *
 strerror(errnum)
 int	errnum;
@@ -385,7 +416,7 @@ int	errnum;
 	return (errnum > 0 && errnum <= sys_nerr) ?
 		sys_errlist[errnum] : _("Unknown system error");
 }
-#endif /* !(HAVE_STRERROR - 0) */
+#endif /* !HAVE_STRERROR */
 
 static void
 eats(name, num, rname, rnum)
@@ -442,9 +473,11 @@ const char * const	string;
 static void
 usage P((void))
 {
-	(void) fprintf(stderr, _("%s: usage is %s [ --version ] [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"),
+	(void) fprintf(stderr, _("%s: usage is %s \
+[ --version ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\
+\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"),
 		progname, progname);
-	(void) exit(EXIT_FAILURE);
+	exit(EXIT_FAILURE);
 }
 
 static const char *	psxrules;
@@ -452,7 +485,6 @@ static const char *	lcltime;
 static const char *	directory;
 static const char *	leapsec;
 static const char *	yitcommand;
-static int		sflag = FALSE;
 
 int
 main(argc, argv)
@@ -466,19 +498,23 @@ char *	argv[];
 #ifdef unix
 	(void) umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
 #endif /* defined unix */
-#if HAVE_GETTEXT - 0
-	(void) setlocale(LC_CTYPE, "");
-	(void) setlocale(LC_MESSAGES, "");
+#if HAVE_GETTEXT
+	(void) setlocale(LC_ALL, "");
 #ifdef TZ_DOMAINDIR
 	(void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
 #endif /* defined TEXTDOMAINDIR */
 	(void) textdomain(TZ_DOMAIN);
-#endif /* HAVE_GETTEXT - 0 */
+#endif /* HAVE_GETTEXT */
 	progname = argv[0];
+	if (TYPE_BIT(zic_t) < 64) {
+		(void) fprintf(stderr, "%s: %s\n", progname,
+			_("wild compilation-time specification of zic_t"));
+		exit(EXIT_FAILURE);
+	}
 	for (i = 1; i < argc; ++i)
 		if (strcmp(argv[i], "--version") == 0) {
 			(void) printf("%s\n", elsieid);
-			(void) exit(EXIT_SUCCESS);
+			exit(EXIT_SUCCESS);
 		}
 	while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != EOF && c != -1)
 		switch (c) {
@@ -491,7 +527,7 @@ char *	argv[];
 					(void) fprintf(stderr,
 _("%s: More than one -d option specified\n"),
 						progname);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 				}
 				break;
 			case 'l':
@@ -501,7 +537,7 @@ _("%s: More than one -d option specified\n"),
 					(void) fprintf(stderr,
 _("%s: More than one -l option specified\n"),
 						progname);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 				}
 				break;
 			case 'p':
@@ -511,7 +547,7 @@ _("%s: More than one -l option specified\n"),
 					(void) fprintf(stderr,
 _("%s: More than one -p option specified\n"),
 						progname);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 				}
 				break;
 			case 'y':
@@ -521,7 +557,7 @@ _("%s: More than one -p option specified\n"),
 					(void) fprintf(stderr,
 _("%s: More than one -y option specified\n"),
 						progname);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 				}
 				break;
 			case 'L':
@@ -531,14 +567,14 @@ _("%s: More than one -y option specified\n"),
 					(void) fprintf(stderr,
 _("%s: More than one -L option specified\n"),
 						progname);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 				}
 				break;
 			case 'v':
 				noise = TRUE;
 				break;
 			case 's':
-				sflag = TRUE;
+				(void) printf("%s: -s ignored\n", progname);
 				break;
 		}
 	if (optind == argc - 1 && strcmp(argv[optind], "=") == 0)
@@ -558,7 +594,7 @@ _("%s: More than one -L option specified\n"),
 	for (i = optind; i < argc; ++i)
 		infile(argv[i]);
 	if (errors)
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	associate();
 	for (i = 0; i < nzones; i = j) {
 		/*
@@ -574,6 +610,11 @@ _("%s: More than one -L option specified\n"),
 	for (i = 0; i < nlinks; ++i) {
 		eat(links[i].l_filename, links[i].l_linenum);
 		dolink(links[i].l_from, links[i].l_to);
+		if (noise)
+			for (j = 0; j < nlinks; ++j)
+				if (strcmp(links[i].l_to,
+					links[j].l_from) == 0)
+						warning(_("link to link"));
 	}
 	if (lcltime != NULL) {
 		eat("command line", 1);
@@ -618,85 +659,54 @@ const char * const	tofile;
 		int	result;
 
 		if (mkdirs(toname) != 0)
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 
 		result = link(fromname, toname);
-#if (HAVE_SYMLINK - 0)
+#if HAVE_SYMLINK
 		if (result != 0 &&
-		    access(fromname, F_OK) == 0 &&
-		    !itsdir(fromname)) {
-		        const char *s = tofile;
-		        register char * symlinkcontents = NULL;
-		        while ((s = strchr(s+1, '/')) != NULL)
-			        symlinkcontents = ecatalloc(symlinkcontents, "../");
-			symlinkcontents = ecatalloc(symlinkcontents, fromname);
-
-			result = unlink(toname);
-			if (result != 0 && errno != ENOENT) {
-				const char *e = strerror(errno);
-
-				(void) fprintf(stderr,
-					       _("%s: Can't unlink  %s: %s\n"),
-					       progname, toname, e);
-				(void) exit(EXIT_FAILURE);
-			}
-
-			result = symlink(symlinkcontents, toname);
-			if (result == 0)
+			access(fromname, F_OK) == 0 &&
+			!itsdir(fromname)) {
+				const char *s = tofile;
+				register char * symlinkcontents = NULL;
+
+				while ((s = strchr(s+1, '/')) != NULL)
+					symlinkcontents =
+						ecatalloc(symlinkcontents,
+						"../");
+				symlinkcontents =
+					ecatalloc(symlinkcontents,
+					fromname);
+				result = symlink(symlinkcontents,
+					toname);
+				if (result == 0)
 warning(_("hard link failed, symbolic link used"));
-			ifree(symlinkcontents);
+				ifree(symlinkcontents);
 		}
-#endif
+#endif /* HAVE_SYMLINK */
 		if (result != 0) {
 			const char *e = strerror(errno);
 
 			(void) fprintf(stderr,
 				_("%s: Can't link from %s to %s: %s\n"),
 				progname, fromname, toname, e);
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 		}
 	}
 	ifree(fromname);
 	ifree(toname);
 }
 
-#ifndef INT_MAX
-#define INT_MAX	((int) (((unsigned)~0)>>1))
-#endif /* !defined INT_MAX */
-
-#ifndef INT_MIN
-#define INT_MIN	((int) ~(((unsigned)~0)>>1))
-#endif /* !defined INT_MIN */
-
-/*
-** The tz file format currently allows at most 32-bit quantities.
-** This restriction should be removed before signed 32-bit values
-** wrap around in 2038, but unfortunately this will require a
-** change to the tz file format.
-*/
-
-#define MAX_BITS_IN_FILE	32
-#define TIME_T_BITS_IN_FILE	((TYPE_BIT(time_t) < MAX_BITS_IN_FILE) ? TYPE_BIT(time_t) : MAX_BITS_IN_FILE)
+#define TIME_T_BITS_IN_FILE	64
 
 static void
 setboundaries P((void))
 {
-	if (TYPE_SIGNED(time_t)) {
-		min_time = ~ (time_t) 0;
-		min_time <<= TIME_T_BITS_IN_FILE - 1;
-		max_time = ~ (time_t) 0 - min_time;
-		if (sflag)
-			min_time = 0;
-	} else {
-		min_time = 0;
-		max_time = 2 - sflag;
-		max_time <<= TIME_T_BITS_IN_FILE - 1;
-		--max_time;
-	}
-	min_year = TM_YEAR_BASE + gmtime(&min_time)->tm_year;
-	max_year = TM_YEAR_BASE + gmtime(&max_time)->tm_year;
-	min_year_representable = min_year;
-	max_year_representable = max_year;
+	register int	i;
+
+	min_time = -1;
+	for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
+		min_time *= 2;
+	max_time = -(min_time + 1);
 }
 
 static int
@@ -793,7 +803,7 @@ associate P((void))
 			*/
 			eat(zp->z_filename, zp->z_linenum);
 			zp->z_stdoff = gethms(zp->z_rule, _("unruly zone"),
-					      TRUE);
+				TRUE);
 			/*
 			** Note, though, that if there's no rule,
 			** a '%s' in the format is a bad thing.
@@ -803,7 +813,7 @@ associate P((void))
 		}
 	}
 	if (errors)
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 }
 
 static void
@@ -827,7 +837,7 @@ const char *	name;
 
 		(void) fprintf(stderr, _("%s: Can't open %s: %s\n"),
 			progname, name, e);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	wantcont = FALSE;
 	for (num = 1; ; ++num) {
@@ -837,7 +847,7 @@ const char *	name;
 		cp = strchr(buf, '\n');
 		if (cp == NULL) {
 			error(_("line too long"));
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 		}
 		*cp = '\0';
 		fields = getfields(buf);
@@ -881,7 +891,7 @@ _("%s: Leap line in non leap seconds file %s\n"),
 					(void) fprintf(stderr,
 _("%s: panic: Invalid l_value %d\n"),
 						progname, lp->l_value);
-					(void) exit(EXIT_FAILURE);
+					exit(EXIT_FAILURE);
 			}
 		}
 		ifree((char *) fields);
@@ -889,14 +899,14 @@ _("%s: panic: Invalid l_value %d\n"),
 	if (ferror(fp)) {
 		(void) fprintf(stderr, _("%s: Error reading %s\n"),
 			progname, filename);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	if (fp != stdin && fclose(fp)) {
 		const char *e = strerror(errno);
 
 		(void) fprintf(stderr, _("%s: Error closing %s: %s\n"),
 			progname, filename, e);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	if (wantcont)
 		error(_("expected continuation line not found"));
@@ -971,6 +981,8 @@ const int		nfields;
 		fields[RF_MONTH], fields[RF_DAY], fields[RF_TOD]);
 	r.r_name = ecpyalloc(fields[RF_NAME]);
 	r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
+	if (max_abbrvar_len < strlen(r.r_abbrvar))
+		max_abbrvar_len = strlen(r.r_abbrvar);
 	rules = (struct rule *) (void *) erealloc((char *) rules,
 		(int) ((nrules + 1) * sizeof *rules));
 	rules[nrules++] = r;
@@ -1076,6 +1088,8 @@ const int		iscont;
 	}
 	z.z_rule = ecpyalloc(fields[i_rule]);
 	z.z_format = ecpyalloc(fields[i_format]);
+	if (max_format_len < strlen(z.z_format))
+		max_format_len = strlen(z.z_format);
 	hasuntil = nfields > i_untilyear;
 	if (hasuntil) {
 		z.z_untilrule.r_filename = filename;
@@ -1096,7 +1110,9 @@ const int		iscont;
 			zones[nzones - 1].z_untiltime > min_time &&
 			zones[nzones - 1].z_untiltime < max_time &&
 			zones[nzones - 1].z_untiltime >= z.z_untiltime) {
-				error(_("Zone continuation line end time is not after end time of previous line"));
+				error(_(
+"Zone continuation line end time is not after end time of previous line"
+					));
 				return FALSE;
 		}
 	}
@@ -1120,7 +1136,7 @@ const int		nfields;
 	register int			i, j;
 	int				year, month, day;
 	long				dayoff, tod;
-	time_t				t;
+	zic_t				t;
 
 	if (nfields != LEAP_FIELDS) {
 		error(_("wrong number of fields on Leap line"));
@@ -1129,12 +1145,17 @@ const int		nfields;
 	dayoff = 0;
 	cp = fields[LP_YEAR];
 	if (sscanf(cp, scheck(cp, "%d"), &year) != 1) {
-			/*
-			 * Leapin' Lizards!
-			 */
-			error(_("invalid leaping year"));
-			return;
+		/*
+		** Leapin' Lizards!
+		*/
+		error(_("invalid leaping year"));
+		return;
 	}
+	if (!leapseen || leapmaxyear < year)
+		leapmaxyear = year;
+	if (!leapseen || leapminyear > year)
+		leapminyear = year;
+	leapseen = TRUE;
 	j = EPOCH_YEAR;
 	while (j != year) {
 		if (year > j) {
@@ -1164,7 +1185,7 @@ const int		nfields;
 			return;
 	}
 	dayoff = oadd(dayoff, eitol(day - 1));
-	if (dayoff < 0 && !TYPE_SIGNED(time_t)) {
+	if (dayoff < 0 && !TYPE_SIGNED(zic_t)) {
 		error(_("time before zero"));
 		return;
 	}
@@ -1176,7 +1197,7 @@ const int		nfields;
 		error(_("time too large"));
 		return;
 	}
-	t = (time_t) dayoff * SECSPERDAY;
+	t = (zic_t) dayoff * SECSPERDAY;
 	tod = gethms(fields[LP_TIME], _("invalid time of day"), FALSE);
 	cp = fields[LP_CORR];
 	{
@@ -1200,7 +1221,9 @@ const int		nfields;
 			return;
 		}
 		if ((lp = byword(fields[LP_ROLL], leap_types)) == NULL) {
-			error(_("illegal Rolling/Stationary field on Leap line"));
+			error(_(
+				"illegal Rolling/Stationary field on Leap line"
+				));
 			return;
 		}
 		leapadd(tadd(t, tod), positive, lp->l_value, count);
@@ -1287,7 +1310,8 @@ const char * const		timep;
 	*/
 	cp = loyearp;
 	lp = byword(cp, begin_years);
-	if (lp != NULL) switch ((int) lp->l_value) {
+	rp->r_lowasnum = lp == NULL;
+	if (!rp->r_lowasnum) switch ((int) lp->l_value) {
 		case YR_MINIMUM:
 			rp->r_loyear = INT_MIN;
 			break;
@@ -1298,18 +1322,15 @@ const char * const		timep;
 			(void) fprintf(stderr,
 				_("%s: panic: Invalid l_value %d\n"),
 				progname, lp->l_value);
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 	} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
 		error(_("invalid starting year"));
 		return;
-	} else if (noise) {
-		if (rp->r_loyear < min_year_representable)
-			warning(_("starting year too low to be represented"));
-		else if (rp->r_loyear > max_year_representable)
-			warning(_("starting year too high to be represented"));
 	}
 	cp = hiyearp;
-	if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
+	lp = byword(cp, end_years);
+	rp->r_hiwasnum = lp == NULL;
+	if (!rp->r_hiwasnum) switch ((int) lp->l_value) {
 		case YR_MINIMUM:
 			rp->r_hiyear = INT_MIN;
 			break;
@@ -1323,15 +1344,10 @@ const char * const		timep;
 			(void) fprintf(stderr,
 				_("%s: panic: Invalid l_value %d\n"),
 				progname, lp->l_value);
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 	} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
 		error(_("invalid ending year"));
 		return;
-	} else if (noise) {
-		if (rp->r_loyear < min_year_representable)
-			warning(_("ending year too low to be represented"));
-		else if (rp->r_loyear > max_year_representable)
-			warning(_("ending year too high to be represented"));
 	}
 	if (rp->r_loyear > rp->r_hiyear) {
 		error(_("starting year greater than ending year"));
@@ -1346,8 +1362,6 @@ const char * const		timep;
 		}
 		rp->r_yrtype = ecpyalloc(typep);
 	}
-	if (rp->r_loyear < min_year && rp->r_loyear > 0)
-		min_year = rp->r_loyear;
 	/*
 	** Day work.
 	** Accept things such as:
@@ -1401,13 +1415,25 @@ const long	val;
 char * const	buf;
 {
 	register int	i;
-	register long	shift;
+	register int	shift;
 
 	for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
 		buf[i] = val >> shift;
 }
 
 static void
+convert64(val, buf)
+const zic_t	val;
+char * const	buf;
+{
+	register int	i;
+	register int	shift;
+
+	for (i = 0, shift = 56; i < 8; ++i, shift -= 8)
+		buf[i] = val >> shift;
+}
+
+static void
 puttzcode(val, fp)
 const long	val;
 FILE * const	fp;
@@ -1418,28 +1444,50 @@ FILE * const	fp;
 	(void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
 }
 
+static void
+puttzcode64(val, fp)
+const zic_t	val;
+FILE * const	fp;
+{
+	char	buf[8];
+
+	convert64(val, buf);
+	(void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
+}
+
 static int
 atcomp(avp, bvp)
-void *	avp;
-void *	bvp;
+const void *	avp;
+const void *	bvp;
 {
-	if (((struct attype *) avp)->at < ((struct attype *) bvp)->at)
-		return -1;
-	else if (((struct attype *) avp)->at > ((struct attype *) bvp)->at)
-		return 1;
-	else	return 0;
+	const zic_t	a = ((const struct attype *) avp)->at;
+	const zic_t	b = ((const struct attype *) bvp)->at;
+
+	return (a < b) ? -1 : (a > b);
+}
+
+static int
+is32(x)
+const zic_t	x;
+{
+	return INT32_MIN <= x && x <= INT32_MAX;
 }
 
 static void
-writezone(name)
+writezone(name, string)
 const char * const	name;
+const char * const	string;
 {
-	register FILE *		fp;
-	register int		i, j;
-	static char *		fullname;
-	static struct tzhead	tzh;
-	time_t			ats[TZ_MAX_TIMES];
-	unsigned char		types[TZ_MAX_TIMES];
+	register FILE *			fp;
+	register int			i, j;
+	register int			leapcnt32, leapi32;
+	register int			timecnt32, timei32;
+	register int			pass;
+	static char *			fullname;
+	static const struct tzhead	tzh0;
+	static struct tzhead		tzh;
+	zic_t				ats[TZ_MAX_TIMES];
+	unsigned char			types[TZ_MAX_TIMES];
 
 	/*
 	** Sort.
@@ -1462,14 +1510,13 @@ const char * const	name;
 			while (fromi < timecnt && attypes[fromi].type == 0)
 				++fromi;	/* handled by default rule */
 		for ( ; fromi < timecnt; ++fromi) {
-			if (toi != 0
-			    && ((attypes[fromi].at
-				 + gmtoffs[attypes[toi - 1].type])
-				<= (attypes[toi - 1].at
-				    + gmtoffs[toi == 1 ? 0
-					      : attypes[toi - 2].type]))) {
-				attypes[toi - 1].type = attypes[fromi].type;
-				continue;
+			if (toi != 0 && ((attypes[fromi].at +
+				gmtoffs[attypes[toi - 1].type]) <=
+				(attypes[toi - 1].at + gmtoffs[toi == 1 ? 0
+				: attypes[toi - 2].type]))) {
+					attypes[toi - 1].type =
+						attypes[fromi].type;
+					continue;
 			}
 			if (toi == 0 ||
 				attypes[toi - 1].type != attypes[fromi].type)
@@ -1484,6 +1531,36 @@ const char * const	name;
 		ats[i] = attypes[i].at;
 		types[i] = attypes[i].type;
 	}
+	/*
+	** Correct for leap seconds.
+	*/
+	for (i = 0; i < timecnt; ++i) {
+		j = leapcnt;
+		while (--j >= 0)
+			if (ats[i] > trans[j] - corr[j]) {
+				ats[i] = tadd(ats[i], corr[j]);
+				break;
+			}
+	}
+	/*
+	** Figure out 32-bit-limited starts and counts.
+	*/
+	timecnt32 = timecnt;
+	timei32 = 0;
+	leapcnt32 = leapcnt;
+	leapi32 = 0;
+	while (timecnt32 > 0 && !is32(ats[timecnt32 - 1]))
+		--timecnt32;
+	while (timecnt32 > 0 && !is32(ats[timei32])) {
+		--timecnt32;
+		++timei32;
+	}
+	while (leapcnt32 > 0 && !is32(trans[leapcnt32 - 1]))
+		--leapcnt32;
+	while (leapcnt32 > 0 && !is32(trans[leapi32])) {
+		--leapcnt32;
+		++leapi32;
+	}
 	fullname = erealloc(fullname,
 		(int) (strlen(directory) + 1 + strlen(name) + 1));
 	(void) sprintf(fullname, "%s/%s", directory, name);
@@ -1495,102 +1572,388 @@ const char * const	name;
 
 		(void) fprintf(stderr, _("%s: Can't remove %s: %s\n"),
 			progname, fullname, e);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	if ((fp = fopen(fullname, "wb")) == NULL) {
 		if (mkdirs(fullname) != 0)
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 		if ((fp = fopen(fullname, "wb")) == NULL) {
 			const char *e = strerror(errno);
 
 			(void) fprintf(stderr, _("%s: Can't create %s: %s\n"),
 				progname, fullname, e);
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 		}
 	}
-	convert(eitol(typecnt), tzh.tzh_ttisgmtcnt);
-	convert(eitol(typecnt), tzh.tzh_ttisstdcnt);
-	convert(eitol(leapcnt), tzh.tzh_leapcnt);
-	convert(eitol(timecnt), tzh.tzh_timecnt);
-	convert(eitol(typecnt), tzh.tzh_typecnt);
-	convert(eitol(charcnt), tzh.tzh_charcnt);
-	(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
-#define DO(field)	(void) fwrite((void *) tzh.field, (size_t) sizeof tzh.field, (size_t) 1, fp)
-	DO(tzh_magic);
-	DO(tzh_reserved);
-	DO(tzh_ttisgmtcnt);
-	DO(tzh_ttisstdcnt);
-	DO(tzh_leapcnt);
-	DO(tzh_timecnt);
-	DO(tzh_typecnt);
-	DO(tzh_charcnt);
-#undef DO
-	for (i = 0; i < timecnt; ++i) {
-		j = leapcnt;
-		while (--j >= 0)
-			if (ats[i] >= trans[j]) {
-				ats[i] = tadd(ats[i], corr[j]);
-				break;
+	for (pass = 1; pass <= 2; ++pass) {
+		register int	thistimei, thistimecnt;
+		register int	thisleapi, thisleapcnt;
+		register int	thistimelim, thisleaplim;
+		int		writetype[TZ_MAX_TIMES];
+		int		typemap[TZ_MAX_TYPES];
+		register int	thistypecnt;
+		char		thischars[TZ_MAX_CHARS];
+		char		thischarcnt;
+		int 		indmap[TZ_MAX_CHARS];
+
+		if (pass == 1) {
+			thistimei = timei32;
+			thistimecnt = timecnt32;
+			thisleapi = leapi32;
+			thisleapcnt = leapcnt32;
+		} else {
+			thistimei = 0;
+			thistimecnt = timecnt;
+			thisleapi = 0;
+			thisleapcnt = leapcnt;
+		}
+		thistimelim = thistimei + thistimecnt;
+		thisleaplim = thisleapi + thisleapcnt;
+		for (i = 0; i < typecnt; ++i)
+			writetype[i] = thistimecnt == timecnt;
+		if (thistimecnt == 0) {
+			/*
+			** No transition times fall in the current
+			** (32- or 64-bit) window.
+			*/
+			if (typecnt != 0)
+				writetype[typecnt - 1] = TRUE;
+		} else {
+			for (i = thistimei - 1; i < thistimelim; ++i)
+				if (i >= 0)
+					writetype[types[i]] = TRUE;
+			/*
+			** For America/Godthab and Antarctica/Palmer
+			*/
+			if (thistimei == 0)
+				writetype[0] = TRUE;
+		}
+		thistypecnt = 0;
+		for (i = 0; i < typecnt; ++i)
+			typemap[i] = writetype[i] ?  thistypecnt++ : -1;
+		for (i = 0; i < sizeof indmap / sizeof indmap[0]; ++i)
+			indmap[i] = -1;
+		thischarcnt = 0;
+		for (i = 0; i < typecnt; ++i) {
+			register char *	thisabbr;
+
+			if (!writetype[i])
+				continue;
+			if (indmap[abbrinds[i]] >= 0)
+				continue;
+			thisabbr = &chars[abbrinds[i]];
+			for (j = 0; j < thischarcnt; ++j)
+				if (strcmp(&thischars[j], thisabbr) == 0)
+					break;
+			if (j == thischarcnt) {
+				(void) strcpy(&thischars[(int) thischarcnt],
+					thisabbr);
+				thischarcnt += strlen(thisabbr) + 1;
 			}
-		puttzcode((long) ats[i], fp);
-	}
-	if (timecnt > 0)
-		(void) fwrite((void *) types, (size_t) sizeof types[0],
-			(size_t) timecnt, fp);
-	for (i = 0; i < typecnt; ++i) {
-		puttzcode((long) gmtoffs[i], fp);
-		(void) putc(isdsts[i], fp);
-		(void) putc(abbrinds[i], fp);
-	}
-	if (charcnt != 0)
-		(void) fwrite((void *) chars, (size_t) sizeof chars[0],
-			(size_t) charcnt, fp);
-	for (i = 0; i < leapcnt; ++i) {
-		if (roll[i]) {
-			if (timecnt == 0 || trans[i] < ats[0]) {
-				j = 0;
-				while (isdsts[j])
-					if (++j >= typecnt) {
-						j = 0;
-						break;
-					}
-			} else {
-				j = 1;
-				while (j < timecnt && trans[i] >= ats[j])
-					++j;
-				j = types[j - 1];
+			indmap[abbrinds[i]] = j;
+		}
+#define DO(field)	(void) fwrite((void *) tzh.field, \
+				(size_t) sizeof tzh.field, (size_t) 1, fp)
+		tzh = tzh0;
+		(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
+		tzh.tzh_version[0] = ZIC_VERSION;
+		convert(eitol(thistypecnt), tzh.tzh_ttisgmtcnt);
+		convert(eitol(thistypecnt), tzh.tzh_ttisstdcnt);
+		convert(eitol(thisleapcnt), tzh.tzh_leapcnt);
+		convert(eitol(thistimecnt), tzh.tzh_timecnt);
+		convert(eitol(thistypecnt), tzh.tzh_typecnt);
+		convert(eitol(thischarcnt), tzh.tzh_charcnt);
+		DO(tzh_magic);
+		DO(tzh_version);
+		DO(tzh_reserved);
+		DO(tzh_ttisgmtcnt);
+		DO(tzh_ttisstdcnt);
+		DO(tzh_leapcnt);
+		DO(tzh_timecnt);
+		DO(tzh_typecnt);
+		DO(tzh_charcnt);
+#undef DO
+		for (i = thistimei; i < thistimelim; ++i)
+			if (pass == 1)
+				puttzcode((long) ats[i], fp);
+			else	puttzcode64(ats[i], fp);
+		for (i = thistimei; i < thistimelim; ++i) {
+			unsigned char	uc;
+
+			uc = typemap[types[i]];
+			(void) fwrite((void *) &uc,
+				(size_t) sizeof uc,
+				(size_t) 1,
+				fp);
+		}
+		for (i = 0; i < typecnt; ++i)
+			if (writetype[i]) {
+				puttzcode(gmtoffs[i], fp);
+				(void) putc(isdsts[i], fp);
+				(void) putc((unsigned char) indmap[abbrinds[i]], fp);
 			}
-			puttzcode((long) tadd(trans[i], -gmtoffs[j]), fp);
-		} else	puttzcode((long) trans[i], fp);
-		puttzcode((long) corr[i], fp);
-	}
-	for (i = 0; i < typecnt; ++i)
-		(void) putc(ttisstds[i], fp);
-	for (i = 0; i < typecnt; ++i)
-		(void) putc(ttisgmts[i], fp);
+		if (thischarcnt != 0)
+			(void) fwrite((void *) thischars,
+				(size_t) sizeof thischars[0],
+				(size_t) thischarcnt, fp);
+		for (i = thisleapi; i < thisleaplim; ++i) {
+			register zic_t	todo;
+
+			if (roll[i]) {
+				if (timecnt == 0 || trans[i] < ats[0]) {
+					j = 0;
+					while (isdsts[j])
+						if (++j >= typecnt) {
+							j = 0;
+							break;
+						}
+				} else {
+					j = 1;
+					while (j < timecnt &&
+						trans[i] >= ats[j])
+							++j;
+					j = types[j - 1];
+				}
+				todo = tadd(trans[i], -gmtoffs[j]);
+			} else	todo = trans[i];
+			if (pass == 1)
+				puttzcode((long) todo, fp);
+			else	puttzcode64(todo, fp);
+			puttzcode(corr[i], fp);
+		}
+		for (i = 0; i < typecnt; ++i)
+			if (writetype[i])
+				(void) putc(ttisstds[i], fp);
+		for (i = 0; i < typecnt; ++i)
+			if (writetype[i])
+				(void) putc(ttisgmts[i], fp);
+	}
+	(void) fprintf(fp, "\n%s\n", string);
 	if (ferror(fp) || fclose(fp)) {
 		(void) fprintf(stderr, _("%s: Error writing %s\n"),
 			progname, fullname);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 }
 
 static void
-doabbr(abbr, format, letters, isdst)
+doabbr(abbr, format, letters, isdst, doquotes)
 char * const		abbr;
 const char * const	format;
 const char * const	letters;
 const int		isdst;
+const int		doquotes;
 {
-	if (strchr(format, '/') == NULL) {
+	register char *	cp;
+	register char *	slashp;
+	register int	len;
+
+	slashp = strchr(format, '/');
+	if (slashp == NULL) {
 		if (letters == NULL)
 			(void) strcpy(abbr, format);
 		else	(void) sprintf(abbr, format, letters);
-	} else if (isdst)
-		(void) strcpy(abbr, strchr(format, '/') + 1);
-	else {
-		(void) strcpy(abbr, format);
-		*strchr(abbr, '/') = '\0';
+	} else if (isdst) {
+		(void) strcpy(abbr, slashp + 1);
+	} else {
+		if (slashp > format)
+			(void) strncpy(abbr, format,
+				(unsigned) (slashp - format));
+		abbr[slashp - format] = '\0';
+	}
+	if (!doquotes)
+		return;
+	for (cp = abbr; *cp != '\0'; ++cp)
+		if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", *cp) == NULL &&
+			strchr("abcdefghijklmnopqrstuvwxyz", *cp) == NULL)
+				break;
+	len = strlen(abbr);
+	if (len > 0 && *cp == '\0')
+		return;
+	abbr[len + 2] = '\0';
+	abbr[len + 1] = '>';
+	for ( ; len > 0; --len)
+		abbr[len] = abbr[len - 1];
+	abbr[0] = '<';
+}
+
+static void
+updateminmax(x)
+const int	x;
+{
+	if (min_year > x)
+		min_year = x;
+	if (max_year < x)
+		max_year = x;
+}
+
+static int
+stringoffset(result, offset)
+char *	result;
+long	offset;
+{
+	register int	hours;
+	register int	minutes;
+	register int	seconds;
+
+	result[0] = '\0';
+	if (offset < 0) {
+		(void) strcpy(result, "-");
+		offset = -offset;
+	}
+	seconds = offset % SECSPERMIN;
+	offset /= SECSPERMIN;
+	minutes = offset % MINSPERHOUR;
+	offset /= MINSPERHOUR;
+	hours = offset;
+	if (hours >= HOURSPERDAY) {
+		result[0] = '\0';
+		return -1;
+	}
+	(void) sprintf(end(result), "%d", hours);
+	if (minutes != 0 || seconds != 0) {
+		(void) sprintf(end(result), ":%02d", minutes);
+		if (seconds != 0)
+			(void) sprintf(end(result), ":%02d", seconds);
+	}
+	return 0;
+}
+
+static int
+stringrule(result, rp, dstoff, gmtoff)
+char *				result;
+const struct rule * const	rp;
+const long			dstoff;
+const long			gmtoff;
+{
+	register long	tod;
+
+	result = end(result);
+	if (rp->r_dycode == DC_DOM) {
+		register int	month, total;
+
+		if (rp->r_dayofmonth == 29 && rp->r_month == TM_FEBRUARY)
+			return -1;
+		total = 0;
+		for (month = 0; month < rp->r_month; ++month)
+			total += len_months[0][month];
+		(void) sprintf(result, "J%d", total + rp->r_dayofmonth);
+	} else {
+		register int	week;
+
+		if (rp->r_dycode == DC_DOWGEQ) {
+			week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
+			if ((week - 1) * DAYSPERWEEK + 1 != rp->r_dayofmonth)
+				return -1;
+		} else if (rp->r_dycode == DC_DOWLEQ) {
+			if (rp->r_dayofmonth == len_months[1][rp->r_month])
+				week = 5;
+			else {
+				week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
+				if (week * DAYSPERWEEK - 1 != rp->r_dayofmonth)
+					return -1;
+			}
+		} else	return -1;	/* "cannot happen" */
+		(void) sprintf(result, "M%d.%d.%d",
+			rp->r_month + 1, week, rp->r_wday);
+	}
+	tod = rp->r_tod;
+	if (rp->r_todisgmt)
+		tod += gmtoff;
+	if (rp->r_todisstd && rp->r_stdoff == 0)
+		tod += dstoff;
+	if (tod < 0) {
+		result[0] = '\0';
+		return -1;
+	}
+	if (tod != 2 * SECSPERMIN * MINSPERHOUR) {
+		(void) strcat(result, "/");
+		if (stringoffset(end(result), tod) != 0)
+			return -1;
+	}
+	return 0;
+}
+
+static void
+stringzone(result, zpfirst, zonecount)
+char *				result;
+const struct zone * const	zpfirst;
+const int			zonecount;
+{
+	register const struct zone *	zp;
+	register struct rule *		rp;
+	register struct rule *		stdrp;
+	register struct rule *		dstrp;
+	register int			i;
+	register const char *		abbrvar;
+
+	result[0] = '\0';
+	zp = zpfirst + zonecount - 1;
+	stdrp = dstrp = NULL;
+	for (i = 0; i < zp->z_nrules; ++i) {
+		rp = &zp->z_rules[i];
+		if (rp->r_hiwasnum || rp->r_hiyear != INT_MAX)
+			continue;
+		if (rp->r_yrtype != NULL)
+			continue;
+		if (rp->r_stdoff == 0) {
+			if (stdrp == NULL)
+				stdrp = rp;
+			else	return;
+		} else {
+			if (dstrp == NULL)
+				dstrp = rp;
+			else	return;
+		}
+	}
+	if (stdrp == NULL && dstrp == NULL) {
+		/*
+		** There are no rules running through "max".
+		** Let's find the latest rule.
+		*/
+		for (i = 0; i < zp->z_nrules; ++i) {
+			rp = &zp->z_rules[i];
+			if (stdrp == NULL || rp->r_hiyear > stdrp->r_hiyear ||
+				(rp->r_hiyear == stdrp->r_hiyear &&
+				rp->r_month > stdrp->r_month))
+					stdrp = rp;
+		}
+		if (stdrp != NULL && stdrp->r_stdoff != 0)
+			return;	/* We end up in DST (a POSIX no-no). */
+		/*
+		** Horrid special case: if year is 2037,
+		** presume this is a zone handled on a year-by-year basis;
+		** do not try to apply a rule to the zone.
+		*/
+		if (stdrp != NULL && stdrp->r_hiyear == 2037)
+			return;
+	}
+	if (stdrp == NULL && zp->z_nrules != 0)
+		return;
+	abbrvar = (stdrp == NULL) ? "" : stdrp->r_abbrvar;
+	doabbr(result, zp->z_format, abbrvar, FALSE, TRUE);
+	if (stringoffset(end(result), -zp->z_gmtoff) != 0) {
+		result[0] = '\0';
+		return;
+	}
+	if (dstrp == NULL)
+		return;
+	doabbr(end(result), zp->z_format, dstrp->r_abbrvar, TRUE, TRUE);
+	if (dstrp->r_stdoff != SECSPERMIN * MINSPERHOUR)
+		if (stringoffset(end(result),
+			-(zp->z_gmtoff + dstrp->r_stdoff)) != 0) {
+				result[0] = '\0';
+				return;
+		}
+	(void) strcat(result, ",");
+	if (stringrule(result, dstrp, dstrp->r_stdoff, zp->z_gmtoff) != 0) {
+		result[0] = '\0';
+		return;
+	}
+	(void) strcat(result, ",");
+	if (stringrule(result, stdrp, dstrp->r_stdoff, zp->z_gmtoff) != 0) {
+		result[0] = '\0';
+		return;
 	}
 }
 
@@ -1603,7 +1966,7 @@ const int			zonecount;
 	register struct rule *		rp;
 	register int			i, j;
 	register int			usestart, useuntil;
-	register time_t			starttime, untiltime;
+	register zic_t			starttime, untiltime;
 	register long			gmtoff;
 	register long			stdoff;
 	register int			year;
@@ -1611,8 +1974,17 @@ const int			zonecount;
 	register int			startttisstd;
 	register int			startttisgmt;
 	register int			type;
-	char				startbuf[BUFSIZ];
-
+	register char *			startbuf;
+	register char *			ab;
+	register char *			envvar;
+	register int			max_abbr_len;
+	register int			max_envvar_len;
+
+	max_abbr_len = 2 + max_format_len + max_abbrvar_len;
+	max_envvar_len = 2 * max_abbr_len + 5 * 9;
+	startbuf = emalloc(max_abbr_len + 1);
+	ab = emalloc(max_abbr_len + 1);
+	envvar = emalloc(max_envvar_len + 1);
 	INITIALIZE(untiltime);
 	INITIALIZE(starttime);
 	/*
@@ -1622,11 +1994,53 @@ const int			zonecount;
 	typecnt = 0;
 	charcnt = 0;
 	/*
-	** Thanks to Earl Chew (earl@dnd.icp.nec.com.au)
+	** Thanks to Earl Chew
 	** for noting the need to unconditionally initialize startttisstd.
 	*/
 	startttisstd = FALSE;
 	startttisgmt = FALSE;
+	min_year = max_year = EPOCH_YEAR;
+	if (leapseen) {
+		updateminmax(leapminyear);
+		updateminmax(leapmaxyear);
+	}
+	for (i = 0; i < zonecount; ++i) {
+		zp = &zpfirst[i];
+		updateminmax(zp->z_untilrule.r_loyear);
+		for (j = 0; j < zp->z_nrules; ++j) {
+			rp = &zp->z_rules[j];
+			if (rp->r_lowasnum)
+				updateminmax(rp->r_loyear);
+			if (rp->r_hiwasnum)
+				updateminmax(rp->r_hiyear);
+		}
+	}
+	/*
+	** Generate lots of data if a rule can't cover all future times.
+	*/
+	stringzone(envvar, zpfirst, zonecount);
+	if (noise && envvar[0] == '\0') {
+		register char *	wp;
+
+wp = ecpyalloc(_("no POSIX environment variable for zone"));
+		wp = ecatalloc(wp, " ");
+		wp = ecatalloc(wp, zpfirst->z_name); 
+		warning(wp);
+		ifree(wp);
+	}
+	if (envvar[0] == '\0') {
+		if (min_year >= INT_MIN + YEARSPERREPEAT)
+			min_year -= YEARSPERREPEAT;
+		else	min_year = INT_MIN;
+		if (max_year <= INT_MAX - YEARSPERREPEAT)
+			max_year += YEARSPERREPEAT;
+		else	max_year = INT_MAX;
+	}
+	/*
+	** For the benefit of older systems, generate data through 2037.
+	*/
+	if (max_year < 2037)
+		max_year = 2037;
 	for (i = 0; i < zonecount; ++i) {
 		/*
 		** A guess that may well be corrected later.
@@ -1644,7 +2058,7 @@ const int			zonecount;
 		if (zp->z_nrules == 0) {
 			stdoff = zp->z_stdoff;
 			doabbr(startbuf, zp->z_format,
-				(char *) NULL, stdoff != 0);
+				(char *) NULL, stdoff != 0, FALSE);
 			type = addtype(oadd(zp->z_gmtoff, stdoff),
 				startbuf, stdoff != 0, startttisstd,
 				startttisgmt);
@@ -1672,9 +2086,8 @@ const int			zonecount;
 			}
 			for ( ; ; ) {
 				register int	k;
-				register time_t	jtime, ktime;
+				register zic_t	jtime, ktime;
 				register long	offset;
-				char		buf[BUFSIZ];
 
 				INITIALIZE(ktime);
 				if (useuntil) {
@@ -1730,23 +2143,27 @@ const int			zonecount;
 							stdoff);
 						doabbr(startbuf, zp->z_format,
 							rp->r_abbrvar,
-							rp->r_stdoff != 0);
+							rp->r_stdoff != 0,
+							FALSE);
 						continue;
 					}
 					if (*startbuf == '\0' &&
-					    startoff == oadd(zp->z_gmtoff,
-					    stdoff)) {
-						doabbr(startbuf, zp->z_format,
-							rp->r_abbrvar,
-							rp->r_stdoff != 0);
+						startoff == oadd(zp->z_gmtoff,
+						stdoff)) {
+							doabbr(startbuf,
+								zp->z_format,
+								rp->r_abbrvar,
+								rp->r_stdoff !=
+								0,
+								FALSE);
 					}
 				}
 				eats(zp->z_filename, zp->z_linenum,
 					rp->r_filename, rp->r_linenum);
-				doabbr(buf, zp->z_format, rp->r_abbrvar,
-					rp->r_stdoff != 0);
+				doabbr(ab, zp->z_format, rp->r_abbrvar,
+					rp->r_stdoff != 0, FALSE);
 				offset = oadd(zp->z_gmtoff, rp->r_stdoff);
-				type = addtype(offset, buf, rp->r_stdoff != 0,
+				type = addtype(offset, ab, rp->r_stdoff != 0,
 					rp->r_todisstd, rp->r_todisgmt);
 				addtt(ktime, type);
 			}
@@ -1779,12 +2196,15 @@ error(_("can't determine time zone abbreviation to use just after until time"));
 				starttime = tadd(starttime, -gmtoff);
 		}
 	}
-	writezone(zpfirst->z_name);
+	writezone(zpfirst->z_name, envvar);
+	ifree(startbuf);
+	ifree(ab);
+	ifree(envvar);
 }
 
 static void
 addtt(starttime, type)
-const time_t	starttime;
+const zic_t	starttime;
 int		type;
 {
 	if (starttime <= min_time ||
@@ -1803,7 +2223,7 @@ int		type;
 	}
 	if (timecnt >= TZ_MAX_TIMES) {
 		error(_("too many transitions?!"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	attypes[timecnt].at = starttime;
 	attypes[timecnt].type = type;
@@ -1822,15 +2242,15 @@ const int		ttisgmt;
 
 	if (isdst != TRUE && isdst != FALSE) {
 		error(_("internal error - addtype called with bad isdst"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	if (ttisstd != TRUE && ttisstd != FALSE) {
 		error(_("internal error - addtype called with bad ttisstd"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	if (ttisgmt != TRUE && ttisgmt != FALSE) {
 		error(_("internal error - addtype called with bad ttisgmt"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	/*
 	** See if there's already an entry for this zone type.
@@ -1849,7 +2269,7 @@ const int		ttisgmt;
 	*/
 	if (typecnt >= TZ_MAX_TYPES) {
 		error(_("too many local time types"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	gmtoffs[i] = gmtoff;
 	isdsts[i] = isdst;
@@ -1868,7 +2288,7 @@ const int		ttisgmt;
 
 static void
 leapadd(t, positive, rolling, count)
-const time_t	t;
+const zic_t	t;
 const int	positive;
 const int	rolling;
 int		count;
@@ -1877,13 +2297,13 @@ int		count;
 
 	if (leapcnt + (positive ? count : 1) > TZ_MAX_LEAPS) {
 		error(_("too many leap seconds"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	for (i = 0; i < leapcnt; ++i)
 		if (t <= trans[i]) {
 			if (t == trans[i]) {
 				error(_("repeated leap second moment"));
-				(void) exit(EXIT_FAILURE);
+				exit(EXIT_FAILURE);
 			}
 			break;
 		}
@@ -1938,7 +2358,7 @@ const char * const	type;
 	(void) fprintf(stderr, _("%s: command was '%s', result was %d\n"),
 		progname, buf, result);
 	for ( ; ; )
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 }
 
 static int
@@ -2019,8 +2439,9 @@ register char *	cp;
 		emalloc((int) ((strlen(cp) + 1) * sizeof *array));
 	nsubs = 0;
 	for ( ; ; ) {
-		while (isascii(*cp) && isspace((unsigned char) *cp))
-			++cp;
+		while (isascii((unsigned char) *cp) &&
+			isspace((unsigned char) *cp))
+				++cp;
 		if (*cp == '\0' || *cp == '#')
 			break;
 		array[nsubs++] = dp = cp;
@@ -2030,7 +2451,9 @@ register char *	cp;
 			else while ((*dp = *cp++) != '"')
 				if (*dp != '\0')
 					++dp;
-				else	error(_("Odd number of quotation marks"));
+				else	error(_(
+						"Odd number of quotation marks"
+						));
 		} while (*cp != '\0' && *cp != '#' &&
 			(!isascii(*cp) || !isspace((unsigned char) *cp)));
 		if (isascii(*cp) && isspace((unsigned char) *cp))
@@ -2051,17 +2474,17 @@ const long	t2;
 	t = t1 + t2;
 	if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
 		error(_("time overflow"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	return t;
 }
 
-static time_t
+static zic_t
 tadd(t1, t2)
-const time_t	t1;
+const zic_t	t1;
 const long	t2;
 {
-	register time_t	t;
+	register zic_t	t;
 
 	if (t1 == max_time && t2 > 0)
 		return max_time;
@@ -2070,7 +2493,7 @@ const long	t2;
 	t = t1 + t2;
 	if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
 		error(_("time overflow"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	return t;
 }
@@ -2080,14 +2503,14 @@ const long	t2;
 ** 1970, 00:00 LOCAL time - in that year that the rule refers to.
 */
 
-static time_t
+static zic_t
 rpytime(rp, wantedy)
 register const struct rule * const	rp;
 register const int			wantedy;
 {
 	register int	y, m, i;
 	register long	dayoff;			/* with a nod to Margaret O. */
-	register time_t	t;
+	register zic_t	t;
 
 	if (wantedy == INT_MIN)
 		return min_time;
@@ -2117,7 +2540,7 @@ register const int			wantedy;
 			--i;
 		else {
 			error(_("use of 2/29 in non leap-year"));
-			(void) exit(EXIT_FAILURE);
+			exit(EXIT_FAILURE);
 		}
 	}
 	--i;
@@ -2151,18 +2574,15 @@ register const int			wantedy;
 			}
 		if (i < 0 || i >= len_months[isleap(y)][m]) {
 			if (noise)
-				warning(_("rule goes past start/end of month--will not work with pre-2004 versions of zic"));
+				warning(_("rule goes past start/end of month--\
+will not work with pre-2004 versions of zic"));
 		}
 	}
-	if (dayoff < 0 && !TYPE_SIGNED(time_t))
-		return min_time;
 	if (dayoff < min_time / SECSPERDAY)
 		return min_time;
 	if (dayoff > max_time / SECSPERDAY)
 		return max_time;
-	t = (time_t) dayoff * SECSPERDAY;
-	if (t > 0 && max_time - t < rp->r_tod)
-		return max_time;
+	t = (zic_t) dayoff * SECSPERDAY;
 	return tadd(t, rp->r_tod);
 }
 
@@ -2172,10 +2592,48 @@ const char * const	string;
 {
 	register int	i;
 
+	if (strcmp(string, GRANDPARENTED) != 0) {
+		register const char *	cp;
+		register char *		wp;
+
+		/*
+		** Want one to ZIC_MAX_ABBR_LEN_WO_WARN alphabetics
+		** optionally followed by a + or - and a number from 1 to 14.
+		*/
+		cp = string;
+		wp = NULL;
+		while (isascii((unsigned char) *cp) &&
+			isalpha((unsigned char) *cp))
+				++cp;
+		if (cp - string == 0)
+wp = _("time zone abbreviation lacks alphabetic at start");
+		if (noise && cp - string > 3)
+wp = _("time zone abbreviation has more than 3 alphabetics");
+		if (cp - string > ZIC_MAX_ABBR_LEN_WO_WARN)
+wp = _("time zone abbreviation has too many alphabetics");
+		if (wp == NULL && (*cp == '+' || *cp == '-')) {
+			++cp;
+			if (isascii((unsigned char) *cp) &&
+				isdigit((unsigned char) *cp))
+					if (*cp++ == '1' &&
+						*cp >= '0' && *cp <= '4')
+							++cp;
+		}
+		if (*cp != '\0')
+wp = _("time zone abbreviation differs from POSIX standard");
+		if (wp != NULL) {
+			wp = ecpyalloc(wp);
+			wp = ecatalloc(wp, " (");
+			wp = ecatalloc(wp, string);
+			wp = ecatalloc(wp, ")");
+			warning(wp);
+			ifree(wp);
+		}
+	}
 	i = strlen(string) + 1;
 	if (charcnt + i > TZ_MAX_CHARS) {
 		error(_("too many, or too long, time zone abbreviations"));
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	(void) strcpy(&chars[charcnt], string);
 	charcnt += eitol(i);
@@ -2239,7 +2697,7 @@ const int	i;
 		(void) fprintf(stderr,
 			_("%s: %d did not sign extend correctly\n"),
 			progname, i);
-		(void) exit(EXIT_FAILURE);
+		exit(EXIT_FAILURE);
 	}
 	return l;
 }
diff --git a/timezone/zone.tab b/timezone/zone.tab
index e3c8e39e1e..09cdf6940a 100644
--- a/timezone/zone.tab
+++ b/timezone/zone.tab
@@ -1,8 +1,8 @@
-# @(#)zone.tab	1.30
+# @(#)zone.tab	8.1
 #
 # TZ zone descriptions
 #
-# From Paul Eggert <eggert@twinsun.com> (1996-08-05):
+# From Paul Eggert (1996-08-05):
 #
 # This file contains a table with the following columns:
 # 1.  ISO 3166 2-character country code.  See the file `iso3166.tab'.
@@ -45,17 +45,17 @@ AR	-3436-05827	America/Argentina/Buenos_Aires	Buenos Aires (BA, CF)
 AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
 AR	-2411-06518	America/Argentina/Jujuy	Jujuy (JY)
 AR	-3124-06411	America/Argentina/Tucuman	Tucuman (TM)
-AR	-2828-06547	America/Argentina/Catamarca	Catamarca (CT)
+AR	-2828-06547	America/Argentina/Catamarca	Catamarca (CT), Chubut (CH)
 AR	-2926-06651	America/Argentina/La_Rioja	La Rioja (LR)
 AR	-3132-06831	America/Argentina/San_Juan	San Juan (SJ)
 AR	-3253-06849	America/Argentina/Mendoza	Mendoza (MZ)
-AR	-4552-06730	America/Argentina/ComodRivadavia	Chubut (CH)
 AR	-5138-06913	America/Argentina/Rio_Gallegos	Santa Cruz (SC)
 AR	-5448-06818	America/Argentina/Ushuaia	Tierra del Fuego (TF)
 AS	-1416-17042	Pacific/Pago_Pago
 AT	+4813+01620	Europe/Vienna
 AU	-3133+15905	Australia/Lord_Howe	Lord Howe Island
-AU	-4253+14719	Australia/Hobart	Tasmania
+AU	-4253+14719	Australia/Hobart	Tasmania - most locations
+AU	-3956+14352	Australia/Currie	Tasmania - King Island
 AU	-3749+14458	Australia/Melbourne	Victoria
 AU	-3352+15113	Australia/Sydney	New South Wales - most locations
 AU	-3157+14127	Australia/Broken_Hill	New South Wales - Yancowinna
@@ -100,16 +100,18 @@ BW	-2545+02555	Africa/Gaborone
 BY	+5354+02734	Europe/Minsk
 BZ	+1730-08812	America/Belize
 CA	+4734-05243	America/St_Johns	Newfoundland Island
-CA	+4439-06336	America/Halifax	Atlantic Time - Nova Scotia (most places), NB, W Labrador, E Quebec & PEI
+CA	+4439-06336	America/Halifax	Atlantic Time - Nova Scotia (most places), W Labrador, E Quebec & PEI
 CA	+4612-05957	America/Glace_Bay	Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA	+4606-06447	America/Moncton	Atlantic Time - New Brunswick
 CA	+5320-06025	America/Goose_Bay	Atlantic Time - E Labrador
 CA	+4531-07334	America/Montreal	Eastern Time - Quebec - most locations
 CA	+4339-07923	America/Toronto	Eastern Time - Ontario - most locations
 CA	+4901-08816	America/Nipigon	Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
 CA	+4823-08915	America/Thunder_Bay	Eastern Time - Thunder Bay, Ontario
-CA	+6608-06544	America/Pangnirtung	Eastern Standard Time - Pangnirtung, Nunavut
-CA	+6344-06828	America/Iqaluit	Eastern Standard Time - east Nunavut
-CA	+6245-09210	America/Rankin_Inlet	Eastern Standard Time - central Nunavut
+CA	+6608-06544	America/Pangnirtung	Eastern Time - Pangnirtung, Nunavut
+CA	+6344-06828	America/Iqaluit	Eastern Time - east Nunavut
+CA	+6408-08310	America/Coral_Harbour	Eastern Standard Time - Southampton Island
+CA	+6245-09210	America/Rankin_Inlet	Central Time - central Nunavut
 CA	+4953-09709	America/Winnipeg	Central Time - Manitoba & west Ontario
 CA	+4843-09429	America/Rainy_River	Central Time - Rainy River & Fort Frances, Ontario
 CA	+6903-10505	America/Cambridge_Bay	Central Time - west Nunavut
@@ -165,15 +167,13 @@ ET	+0902+03842	Africa/Addis_Ababa
 FI	+6010+02458	Europe/Helsinki
 FJ	-1808+17825	Pacific/Fiji
 FK	-5142-05751	Atlantic/Stanley
-FM	+0931+13808	Pacific/Yap	Yap
-FM	+0725+15147	Pacific/Truk	Truk (Chuuk)
+FM	+0725+15147	Pacific/Truk	Truk (Chuuk) and Yap
 FM	+0658+15813	Pacific/Ponape	Ponape (Pohnpei)
 FM	+0519+16259	Pacific/Kosrae	Kosrae
 FO	+6201-00646	Atlantic/Faeroe
 FR	+4852+00220	Europe/Paris
 GA	+0023+00927	Africa/Libreville
-GB	+512830-0001845	Europe/London	Great Britain
-GB	+5435-00555	Europe/Belfast	Northern Ireland
+GB	+512830-0001845	Europe/London
 GD	+1203-06145	America/Grenada
 GE	+4143+04449	Asia/Tbilisi
 GF	+0456-05220	America/Cayenne
@@ -248,8 +248,7 @@ MG	-1855+04731	Indian/Antananarivo
 MH	+0709+17112	Pacific/Majuro	most locations
 MH	+0905+16720	Pacific/Kwajalein	Kwajalein
 MK	+4159+02126	Europe/Skopje
-ML	+1239-00800	Africa/Bamako	southwest Mali
-ML	+1446-00301	Africa/Timbuktu	northeast Mali
+ML	+1239-00800	Africa/Bamako
 MM	+1647+09610	Asia/Rangoon
 MN	+4755+10653	Asia/Ulaanbaatar	most locations
 MN	+4801+09139	Asia/Hovd	Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
@@ -370,14 +369,16 @@ UM	+2813-17722	Pacific/Midway	Midway Islands
 UM	+1917+16637	Pacific/Wake	Wake Island
 US	+404251-0740023	America/New_York	Eastern Time
 US	+421953-0830245	America/Detroit	Eastern Time - Michigan - most locations
-US	+381515-0854534	America/Louisville	Eastern Time - Kentucky - Louisville area
+US	+381515-0854534	America/Kentucky/Louisville	Eastern Time - Kentucky - Louisville area
 US	+364947-0845057	America/Kentucky/Monticello	Eastern Time - Kentucky - Wayne County
-US	+394606-0860929	America/Indianapolis	Eastern Standard Time - Indiana - most locations
-US	+382232-0862041	America/Indiana/Marengo	Eastern Standard Time - Indiana - Crawford County
-US	+411745-0863730	America/Indiana/Knox	Eastern Standard Time - Indiana - Starke County
-US	+384452-0850402	America/Indiana/Vevay	Eastern Standard Time - Indiana - Switzerland County
+US	+394606-0860929	America/Indiana/Indianapolis	Eastern Time - Indiana - most locations
+US	+382232-0862041	America/Indiana/Marengo	Eastern Time - Indiana - Crawford County
+US	+411745-0863730	America/Indiana/Knox	Eastern Time - Indiana - Starke County
+US	+384452-0850402	America/Indiana/Vevay	Eastern Time - Indiana - Switzerland County
 US	+415100-0873900	America/Chicago	Central Time
-US	+450628-0873651	America/Menominee	Central Time - Michigan - Wisconsin border
+US	+384038-0873143	America/Indiana/Vincennes	Central Time - Indiana - Daviess, Dubois, Knox, Martin, Perry & Pulaski
+US	+382931-0871643	America/Indiana/Petersburg	Central Time - Indiana - Pike County
+US	+450628-0873651	America/Menominee	Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
 US	+470659-1011757	America/North_Dakota/Center	Central Time - North Dakota - Oliver County
 US	+394421-1045903	America/Denver	Mountain Time
 US	+433649-1161209	America/Boise	Mountain Time - south Idaho & east Oregon