diff --git a/server/static/css/app.css b/server/static/css/app.css
index c1aa89d5..79a35264 100644
--- a/server/static/css/app.css
+++ b/server/static/css/app.css
@@ -278,8 +278,9 @@ li {
 
 #detail #detailMain {
     max-width: 900px;
-    margin: 0 auto 50px auto;
+    margin: 0 auto;
     position: relative; /* required for close button's "position: absolute" */
+    padding-bottom: 50px; /* Chrome and Firefox behave differently regarding bottom margin */
 }
 
 #detail #detailCloseButton {
diff --git a/server/static/js/app.js b/server/static/js/app.js
index ea9e335e..928c1493 100644
--- a/server/static/js/app.js
+++ b/server/static/js/app.js
@@ -73,7 +73,7 @@ const subscribeInternal = (topic, persist, delaySec) => {
         eventSource.onmessage = (e) => {
             const event = JSON.parse(e.data);
             topics[topic]['messages'].push(event);
-            topics[topic]['messages'].sort((a, b) => { return a.time < b.time; }) // Newest first
+            topics[topic]['messages'].sort((a, b) => { return a.time < b.time ? 1 : -1; }); // Newest first
             if (currentTopic === topic) {
                 rerenderDetailView();
             }
@@ -123,7 +123,7 @@ const fetchCachedMessages = async (topic) => {
         const message = JSON.parse(line);
         topics[topic]['messages'].push(message);
     }
-    topics[topic]['messages'].sort((a, b) => { return a.time < b.time; }) // Newest first
+    topics[topic]['messages'].sort((a, b) => { return a.time < b.time ? 1 : -1; }); // Newest first
 };
 
 const showDetail = (topic) => {
@@ -258,27 +258,23 @@ if (!window["Notification"] || !window["EventSource"]) {
 // Reset UI
 topicField.value = "";
 
+// Restore topics
+const storedTopics = JSON.parse(localStorage.getItem('topics') || "[]");
+if (storedTopics) {
+    storedTopics.forEach((topic) => { subscribeInternal(topic, true, 0); });
+    if (storedTopics.length === 0) {
+        topicsHeader.style.display = 'none';
+    }
+} else {
+    topicsHeader.style.display = 'none';
+}
+
 // (Temporarily) subscribe topic if we navigated to /sometopic URL
 const match = location.pathname.match(/^\/([-_a-zA-Z0-9]{1,64})$/) // Regex must match Go & Android app!
 if (match) {
     currentTopic = match[1];
-    subscribeInternal(currentTopic, false,0);
-}
-
-// Restore topics
-const storedTopics = localStorage.getItem('topics');
-if (storedTopics) {
-    const storedTopicsArray = JSON.parse(storedTopics);
-    storedTopicsArray.forEach((topic) => { subscribeInternal(topic, true, 0); });
-    if (storedTopicsArray.length === 0) {
-        topicsHeader.style.display = 'none';
-    }
-    if (currentTopic) {
-        currentTopicUnsubscribeOnClose = !storedTopicsArray.includes(currentTopic);
-    }
-} else {
-    topicsHeader.style.display = 'none';
-    if (currentTopic) {
+    if (!storedTopics.includes(currentTopic)) {
+        subscribeInternal(currentTopic, false,0);
         currentTopicUnsubscribeOnClose = true;
     }
 }