diff --git a/commit.c b/commit.c
index 67e11d7a4f2..c550a00d824 100644
--- a/commit.c
+++ b/commit.c
@@ -571,7 +571,7 @@ int count_parents(struct commit * commit)
 /*
  * Performs an in-place topological sort on the list supplied.
  */
-void sort_in_topological_order(struct commit_list ** list)
+void sort_in_topological_order(struct commit_list ** list, int lifo)
 {
 	struct commit_list * next = *list;
 	struct commit_list * work = NULL, **insert;
@@ -630,7 +630,10 @@ void sort_in_topological_order(struct commit_list ** list)
 		}
 		next=next->next;
 	}
+
 	/* process the list in topological order */
+	if (!lifo)
+		sort_by_date(&work);
 	while (work) {
 		struct commit * work_item = pop_commit(&work);
 		struct sort_node * work_node = (struct sort_node *)work_item->object.util;
@@ -647,8 +650,12 @@ void sort_in_topological_order(struct commit_list ** list)
                                  * guaranteeing topological order.
                                  */
 				pn->indegree--;
-				if (!pn->indegree) 
-					commit_list_insert(parent, &work);
+				if (!pn->indegree) {
+					if (!lifo)
+						insert_by_date(parent, &work);
+					else
+						commit_list_insert(parent, &work);
+				}
 			}
 			parents=parents->next;
 		}
diff --git a/commit.h b/commit.h
index 986b22de8ab..70a7c75e659 100644
--- a/commit.h
+++ b/commit.h
@@ -72,6 +72,8 @@ int count_parents(struct commit * commit);
  * Post-conditions: 
  *   invariant of resulting list is:
  *      a reachable from b => ord(b) < ord(a)
+ *   in addition, when lifo == 0, commits on parallel tracks are
+ *   sorted in the dates order.
  */
-void sort_in_topological_order(struct commit_list ** list);
+void sort_in_topological_order(struct commit_list ** list, int lifo);
 #endif /* COMMIT_H */
diff --git a/rev-list.c b/rev-list.c
index 63391fc1136..f2d1105cae1 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -27,6 +27,7 @@ static const char rev_list_usage[] =
 "  ordering output:\n"
 "    --merge-order [ --show-breaks ]\n"
 "    --topo-order\n"
+"    --date-order\n"
 "  formatting output:\n"
 "    --parents\n"
 "    --objects\n"
@@ -56,6 +57,7 @@ static int merge_order = 0;
 static int show_breaks = 0;
 static int stop_traversal = 0;
 static int topo_order = 0;
+static int lifo = 1;
 static int no_merges = 0;
 static const char **paths = NULL;
 static int remove_empty_trees = 0;
@@ -856,6 +858,13 @@ int main(int argc, const char **argv)
 		}
 		if (!strcmp(arg, "--topo-order")) {
 		        topo_order = 1;
+			lifo = 1;
+		        limited = 1;
+			continue;
+		}
+		if (!strcmp(arg, "--date-order")) {
+		        topo_order = 1;
+			lifo = 0;
 		        limited = 1;
 			continue;
 		}
@@ -940,7 +949,7 @@ int main(int argc, const char **argv)
 	        if (limited)
 			list = limit_list(list);
 		if (topo_order)
-			sort_in_topological_order(&list);
+			sort_in_topological_order(&list, lifo);
 		show_commit_list(list);
 	} else {
 #ifndef NO_OPENSSL
diff --git a/rev-parse.c b/rev-parse.c
index b82f294a789..9161faed1e9 100644
--- a/rev-parse.c
+++ b/rev-parse.c
@@ -48,6 +48,7 @@ static int is_rev_argument(const char *arg)
 		"--show-breaks",
 		"--sparse",
 		"--topo-order",
+		"--date-order",
 		"--unpacked",
 		NULL
 	};
diff --git a/show-branch.c b/show-branch.c
index 511fd3b656e..5a86ae2f9ed 100644
--- a/show-branch.c
+++ b/show-branch.c
@@ -535,6 +535,7 @@ int main(int ac, char **av)
 	int num_rev, i, extra = 0;
 	int all_heads = 0, all_tags = 0;
 	int all_mask, all_revs;
+	int lifo = 1;
 	char head_path[128];
 	const char *head_path_p;
 	int head_path_len;
@@ -544,7 +545,6 @@ int main(int ac, char **av)
 	int no_name = 0;
 	int sha1_name = 0;
 	int shown_merge_point = 0;
-	int topo_order = 0;
 	int with_current_branch = 0;
 	int head_at = -1;
 
@@ -586,7 +586,9 @@ int main(int ac, char **av)
 		else if (!strcmp(arg, "--independent"))
 			independent = 1;
 		else if (!strcmp(arg, "--topo-order"))
-			topo_order = 1;
+			lifo = 1;
+		else if (!strcmp(arg, "--date-order"))
+			lifo = 0;
 		else
 			usage(show_branch_usage);
 		ac--; av++;
@@ -710,8 +712,7 @@ int main(int ac, char **av)
 		exit(0);
 
 	/* Sort topologically */
-	if (topo_order)
-		sort_in_topological_order(&seen);
+	sort_in_topological_order(&seen, lifo);
 
 	/* Give names to commits */
 	if (!sha1_name && !no_name)