diff --git a/cgit.c b/cgit.c
index b7807ad..1d50129 100644
--- a/cgit.c
+++ b/cgit.c
@@ -298,6 +298,7 @@ static void querystring_cb(const char *name, const char *value)
 		ctx.qry.period = xstrdup(value);
 	} else if (!strcmp(name, "ss")) {
 		ctx.qry.ssdiff = atoi(value);
+		ctx.qry.has_ssdiff = 1;
 	} else if (!strcmp(name, "all")) {
 		ctx.qry.show_all = atoi(value);
 	} else if (!strcmp(name, "context")) {
diff --git a/cgit.h b/cgit.h
index bad66f0..c7ab5c6 100644
--- a/cgit.h
+++ b/cgit.h
@@ -137,6 +137,7 @@ struct reflist {
 struct cgit_query {
 	int has_symref;
 	int has_sha1;
+	int has_ssdiff;
 	char *raw;
 	char *repo;
 	char *page;
diff --git a/ui-diff.c b/ui-diff.c
index d97a801..af24a6c 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -395,8 +395,7 @@ void cgit_print_diff(const char *new_rev, const char *old_rev,
 		}
 	}
 
-	if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff))
-		use_ssdiff = 1;
+	use_ssdiff = ctx.qry.has_ssdiff ? ctx.qry.ssdiff : ctx.cfg.ssdiff;
 
 	if (show_ctrls)
 		cgit_print_diff_ctrls();
diff --git a/ui-log.c b/ui-log.c
index 4a295bd..6b12ca2 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -76,6 +76,8 @@ void show_commit_decorations(struct commit *commit)
 			cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf);
 		}
 		else if (!prefixcmp(deco->name, "refs/remotes/")) {
+			if (!ctx.repo->enable_remote_branches)
+				goto next;
 			strncpy(buf, deco->name + 13, sizeof(buf) - 1);
 			cgit_log_link(buf, NULL, "remote-deco", NULL,
 				      sha1_to_hex(commit->object.sha1),
@@ -88,6 +90,7 @@ void show_commit_decorations(struct commit *commit)
 					 sha1_to_hex(commit->object.sha1),
 					 ctx.qry.vpath, 0);
 		}
+next:
 		deco = deco->next;
 	}
 }
diff --git a/ui-repolist.c b/ui-repolist.c
index 25c36ce..a09a689 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -118,13 +118,13 @@ void print_header(int columns)
 }
 
 
-void print_pager(int items, int pagelen, char *search)
+void print_pager(int items, int pagelen, char *search, char *sort)
 {
 	int i;
 	html("
");
 }
 
@@ -291,7 +291,7 @@ void cgit_print_repolist()
 	if (!hits)
 		cgit_print_error("No repositories found");
 	else if (hits > ctx.cfg.max_repo_count)
-		print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search);
+		print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search, ctx.qry.sort);
 	cgit_print_docend();
 }
 
diff --git a/ui-shared.c b/ui-shared.c
index 5aa9119..85c2096 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -133,7 +133,7 @@ char *cgit_currurl()
 		return fmt("%s/", ctx.cfg.virtual_root);
 }
 
-static void site_url(const char *page, const char *search, int ofs)
+static void site_url(const char *page, const char *search, const char *sort, int ofs)
 {
 	char *delim = "?";
 
@@ -154,6 +154,12 @@ static void site_url(const char *page, const char *search, int ofs)
 		html_attr(search);
 		delim = "&";
 	}
+	if (sort) {
+		html(delim);
+		html("s=");
+		html_attr(sort);
+		delim = "&";
+	}
 	if (ofs) {
 		html(delim);
 		htmlf("ofs=%d", ofs);
@@ -161,7 +167,7 @@ static void site_url(const char *page, const char *search, int ofs)
 }
 
 static void site_link(const char *page, const char *name, const char *title,
-		      const char *class, const char *search, int ofs)
+		      const char *class, const char *search, const char *sort, int ofs)
 {
 	html("");
 	html_txt(name);
 	html("");
 }
 
 void cgit_index_link(const char *name, const char *title, const char *class,
-		     const char *pattern, int ofs)
+		     const char *pattern, const char *sort, int ofs)
 {
-	site_link(NULL, name, title, class, pattern, ofs);
+	site_link(NULL, name, title, class, pattern, sort, ofs);
 }
 
 static char *repolink(const char *title, const char *class, const char *page,
@@ -428,7 +434,7 @@ void cgit_self_link(char *name, const char *title, const char *class,
 		    struct cgit_context *ctx)
 {
 	if (!strcmp(ctx->qry.page, "repolist"))
-		return cgit_index_link(name, title, class, ctx->qry.search,
+		return cgit_index_link(name, title, class, ctx->qry.search, ctx->qry.sort,
 				       ctx->qry.ofs);
 	else if (!strcmp(ctx->qry.page, "summary"))
 		return cgit_summary_link(name, title, class, ctx->qry.head);
@@ -782,7 +788,7 @@ static void print_header(struct cgit_context *ctx)
 
 	html("");
 	if (ctx->repo) {
-		cgit_index_link("index", NULL, NULL, NULL, 0);
+		cgit_index_link("index", NULL, NULL, NULL, NULL, 0);
 		html(" : ");
 		cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL);
 		html(" | ");
@@ -858,10 +864,10 @@ void cgit_print_pageheader(struct cgit_context *ctx)
 		html("\n");
 		html("\n");
 	} else {
-		site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0);
+		site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0);
 		if (ctx->cfg.root_readme)
 			site_link("about", "about", NULL, hc(ctx, "about"),
-				  NULL, 0);
+				  NULL, NULL, 0);
 		html(" | ");
 		html(" |