diff -ru /usr/src/usr.bin/undo/undo.1 undo/undo.1
--- /usr/src/usr.bin/undo/undo.1	2009-03-29 11:25:27 +0000
+++ undo/undo.1	2009-03-29 14:05:56 +0000
@@ -107,7 +107,7 @@
 Transaction ids always start with "0x".
 A simple index may be
 specified instead of a transaction id where 0 indicates the latest version
-and increasing values indicate older versions.
+and increasing values indicate older versions, or where -0 indicates the oldest version and decreasing values indicate newer versions.
 .El
 .Sh EXAMPLES
 .Li "undo -d mytextfile"
diff -ru /usr/src/usr.bin/undo/undo.c undo/undo.c
--- /usr/src/usr.bin/undo/undo.c	2009-03-29 11:25:27 +0000
+++ undo/undo.c	2009-03-29 14:21:53 +0000
@@ -281,10 +281,20 @@
 		 * Find entry if tid set to placeholder index
 		 */
 		if (flags & UNDO_FLAG_SETTID1){
-			tse1 = RB_MAX(undo_hist_entry_rb_tree, &tse_tree);
-			while (tse1 && ts1.tid--) {
-				tse1 = RB_PREV(undo_hist_entry_rb_tree,
-					       &tse_tree, tse1);
+			if ((int64_t)ts1.tid >= 0) {
+				tse1 = RB_MAX(undo_hist_entry_rb_tree,
+				              &tse_tree);
+				while (tse1 && ts1.tid--) {
+					tse1 = RB_PREV(undo_hist_entry_rb_tree,
+						       &tse_tree, tse1);
+				}
+			} else {
+				tse1 = RB_MIN(undo_hist_entry_rb_tree,
+				              &tse_tree);
+				while (tse1 && ++ts1.tid) {
+					tse1 = RB_NEXT(undo_hist_entry_rb_tree,
+						       &tse_tree, tse1);
+				}
 			}
 			if (tse1)
 				ts1 = tse1->tse;
@@ -292,10 +302,20 @@
 				ts1.tid = 0;
 		}
 		if (flags & UNDO_FLAG_SETTID2){
-			tse2 = RB_MAX(undo_hist_entry_rb_tree, &tse_tree);
-			while (tse2 && ts2.tid--) {
-				tse2 = RB_PREV(undo_hist_entry_rb_tree,
-					       &tse_tree, tse2);
+			if ((int64_t)ts2.tid >= 0) {
+				tse2 = RB_MAX(undo_hist_entry_rb_tree,
+				              &tse_tree);
+				while (tse2 && ts2.tid--) {
+					tse2 = RB_PREV(undo_hist_entry_rb_tree,
+						       &tse_tree, tse2);
+				}
+			} else {
+				tse2 = RB_MIN(undo_hist_entry_rb_tree,
+				              &tse_tree);
+				while (tse2 && ++ts2.tid) {
+					tse2 = RB_NEXT(undo_hist_entry_rb_tree,
+						       &tse_tree, tse2);
+				}
 			}
 			if (tse2)
 				ts2 = tse2->tse;
@@ -626,12 +646,21 @@
 parse_delta_time(const char *timeStr, int *flags, int ind_flag)
 {
 	hammer_tid_t tid;
+	int adj;
 
 	tid = strtoull(timeStr, NULL, 0);
-	if (timeStr[0] == '+')
+	adj = 0;
+	if (timeStr[0] == '+') {
+		++timeStr;
+	} else if (timeStr[0] == '-') {
 		++timeStr;
-	if (timeStr[0] >= '0' && timeStr[0] <= '9' && timeStr[1] != 'x')
+		adj = 1;
+	}
+	if (timeStr[0] >= '0' && timeStr[0] <= '9' && timeStr[1] != 'x') {
 		*flags |= ind_flag;
+		if (adj)
+			--tid;
+	}
 	return(tid);
 }
 
@@ -715,8 +744,10 @@
 			"    -t TID   Retrieve as of transaction-id, TID\n"
 			"             (a second `-t TID' to diff two)\n"
 			"    transaction ids must be prefixed with 0x, and\n"
-			"    otherwise may specify an index starting at 0\n"
-			"    and iterating backwards through the history.\n"
+			"    otherwise may specify a positive index starting\n"
+			"    at 0 and iterating backwards through the\n"
+			"    history, or a negative index starting at -0 and\n"
+			"    iterating forwards through the history.\n"
 	);
 	exit(1);
 }
