diff --git a/doc/src/sgml/ref/pg_resetxlog.sgml b/doc/src/sgml/ref/pg_resetxlog.sgml
index 6a8292c937d68f8a3fbde1500b2597a007d4aa12..6651a0b588cf28a30196be3bb7f5119f8d6ba855 100644
--- a/doc/src/sgml/ref/pg_resetxlog.sgml
+++ b/doc/src/sgml/ref/pg_resetxlog.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/pg_resetxlog.sgml,v 1.8 2003/11/29 19:51:39 pgsql Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/pg_resetxlog.sgml,v 1.9 2004/12/20 01:42:09 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -22,7 +22,7 @@ PostgreSQL documentation
    <arg> -n </arg>
    <arg> -o <replaceable class="parameter">oid</replaceable> </arg>
    <arg> -x <replaceable class="parameter">xid</replaceable> </arg>
-   <arg> -l <replaceable class="parameter">fileid</replaceable>,<replaceable class="parameter">seg</replaceable> </arg>
+   <arg> -l <replaceable class="parameter">timelineid</replaceable>,<replaceable class="parameter">fileid</replaceable>,<replaceable class="parameter">seg</replaceable> </arg>
    <arg choice="plain"><replaceable>datadir</replaceable></arg>
   </cmdsynopsis>
  </refsynopsisdiv>
@@ -79,17 +79,25 @@ PostgreSQL documentation
    <command>pg_resetxlog</command> is unable to determine appropriate values
    by reading <filename>pg_control</>.  A safe value for the
    next transaction ID may be determined by looking for the numerically largest
-   file name in the directory <filename>pg_clog</> under the data directory, adding one,
+   file name in the directory <filename>pg_clog</> under the data directory,
+   adding one,
    and then multiplying by 1048576.  Note that the file names are in
    hexadecimal.  It is usually easiest to specify the switch value in
    hexadecimal too. For example, if <filename>0011</> is the largest entry
    in <filename>pg_clog</>, <literal>-x 0x1200000</> will work (five trailing
    zeroes provide the proper multiplier).
    The WAL starting address should be
-   larger than any file number currently existing in
-   the directory <filename>pg_xlog</> under the data directory.  The addresses are also in hexadecimal and
-   have two parts.   For example, if <filename>000000FF0000003A</> is the
-   largest entry in <filename>pg_xlog</>, <literal>-l 0xFF,0x3B</> will work.
+   larger than any file name currently existing in
+   the directory <filename>pg_xlog</> under the data directory.
+   These names are also in hexadecimal and have three parts.  The first
+   part is the <quote>timeline ID</> and should usually be kept the same.
+   Do not choose a value larger than 255 (<literal>0xFF</>) for the third
+   part; instead increment the second part and reset the third part to 0.
+   For example, if <filename>00000001000000320000004A</> is the
+   largest entry in <filename>pg_xlog</>, <literal>-l 0x1,0x32,0x4B</> will
+   work; but if the largest entry is
+   <filename>000000010000003A000000FF</>, choose <literal>-l 0x1,0x3B,0x0</>
+   or more.
    There is no comparably easy way to determine a next OID that's beyond
    the largest one in the database, but fortunately it is not critical to
    get the next-OID setting right.
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index e3ff074c66491486dbf04abf92729915c3332129..005277ca17230a34f79982a33243af98ec0b8e55 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -23,7 +23,7 @@
  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.26 2004/12/14 01:59:41 neilc Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.27 2004/12/20 01:42:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -77,10 +77,12 @@ main(int argc, char *argv[])
 	bool		noupdate = false;
 	TransactionId set_xid = 0;
 	Oid			set_oid = 0;
-	uint32		minXlogId = 0,
+	uint32		minXlogTli = 0,
+				minXlogId = 0,
 				minXlogSeg = 0;
 	char	   *endptr;
 	char	   *endptr2;
+	char	   *endptr3;
 	char	   *DataDir;
 	int			fd;
 	char		path[MAXPGPATH];
@@ -147,15 +149,22 @@ main(int argc, char *argv[])
 				break;
 
 			case 'l':
-				minXlogId = strtoul(optarg, &endptr, 0);
+				minXlogTli = strtoul(optarg, &endptr, 0);
 				if (endptr == optarg || *endptr != ',')
 				{
 					fprintf(stderr, _("%s: invalid argument for option -l\n"), progname);
 					fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
 					exit(1);
 				}
-				minXlogSeg = strtoul(endptr + 1, &endptr2, 0);
-				if (endptr2 == endptr + 1 || *endptr2 != '\0')
+				minXlogId = strtoul(endptr + 1, &endptr2, 0);
+				if (endptr2 == endptr + 1 || *endptr2 != ',')
+				{
+					fprintf(stderr, _("%s: invalid argument for option -l\n"), progname);
+					fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+					exit(1);
+				}
+				minXlogSeg = strtoul(endptr2 + 1, &endptr3, 0);
+				if (endptr3 == endptr2 + 1 || *endptr3 != '\0')
 				{
 					fprintf(stderr, _("%s: invalid argument for option -l\n"), progname);
 					fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
@@ -238,6 +247,9 @@ main(int argc, char *argv[])
 	if (set_oid != 0)
 		ControlFile.checkPointCopy.nextOid = set_oid;
 
+	if (minXlogTli > ControlFile.checkPointCopy.ThisTimeLineID)
+		ControlFile.checkPointCopy.ThisTimeLineID = minXlogTli;
+
 	if (minXlogId > ControlFile.logId ||
 		(minXlogId == ControlFile.logId &&
 		 minXlogSeg > ControlFile.logSeg))
@@ -597,8 +609,8 @@ KillExistingXLOG(void)
 	errno = 0;
 	while ((xlde = readdir(xldir)) != NULL)
 	{
-		if (strlen(xlde->d_name) == 16 &&
-			strspn(xlde->d_name, "0123456789ABCDEF") == 16)
+		if (strlen(xlde->d_name) == 24 &&
+			strspn(xlde->d_name, "0123456789ABCDEF") == 24)
 		{
 			snprintf(path, MAXPGPATH, "%s/%s", XLogDir, xlde->d_name);
 			if (unlink(path) < 0)
@@ -739,7 +751,7 @@ usage(void)
 	printf(_("Usage:\n  %s [OPTION]... DATADIR\n\n"), progname);
 	printf(_("Options:\n"));
 	printf(_("  -f              force update to be done\n"));
-	printf(_("  -l FILEID,SEG   force minimum WAL starting location for new transaction log\n"));
+	printf(_("  -l TLI,FILE,SEG force minimum WAL starting location for new transaction log\n"));
 	printf(_("  -n              no update, just show extracted control values (for testing)\n"));
 	printf(_("  -o OID          set next OID\n"));
 	printf(_("  -x XID          set next transaction ID\n"));