diff --git a/install/package.json b/install/package.json
index af744e25b6..c51992816c 100644
--- a/install/package.json
+++ b/install/package.json
@@ -2,7 +2,7 @@
     "name": "nodebb",
     "license": "GPL-3.0",
     "description": "NodeBB Forum",
-    "version": "1.7.2",
+    "version": "1.7.3",
     "homepage": "http://www.nodebb.org",
     "repository": {
       "type": "git",
@@ -17,89 +17,89 @@
       "coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage"
     },
     "dependencies": {
-      "ace-builds": "^1.2.9",
-      "async": "2.6.0",
-      "autoprefixer": "7.1.6",
-      "bcryptjs": "2.4.3",
-      "benchpressjs": "^1.2.0",
-      "body-parser": "^1.18.2",
-      "bootstrap": "^3.3.7",
-      "chart.js": "^2.7.0",
-      "colors": "^1.1.2",
-      "compression": "^1.7.1",
-      "commander": "^2.11.0",
-      "connect-ensure-login": "^0.1.1",
-      "connect-flash": "^0.1.1",
-      "connect-mongo": "2.0.0",
-      "connect-multiparty": "^2.1.0",
-      "connect-redis": "3.3.2",
-      "cookie-parser": "^1.4.3",
-      "cron": "^1.3.0",
-      "cropperjs": "^1.1.3",
-      "csurf": "^1.9.0",
-      "daemon": "^1.1.0",
-      "express": "^4.16.2",
-      "express-session": "^1.15.6",
-      "express-useragent": "1.0.8",
-      "graceful-fs": "^4.1.11",
-      "html-to-text": "3.3.0",
-      "ipaddr.js": "^1.5.4",
-      "jimp": "0.2.28",
-      "jquery": "^3.2.1",
-      "jsesc": "2.5.1",
-      "json-2-csv": "^2.1.2",
-      "less": "^2.7.2",
-      "lodash": "^4.17.4",
-      "logrotate-stream": "^0.2.5",
-      "lru-cache": "4.1.1",
-      "material-design-lite": "^1.3.0",
-      "mime": "^2.0.3",
-      "mkdirp": "^0.5.1",
-      "mongodb": "2.2.33",
-      "morgan": "^1.9.0",
-      "mousetrap": "^1.6.1",
-      "nconf": "^0.9.1",
-      "nodebb-plugin-composer-default": "6.0.7",
-      "nodebb-plugin-dbsearch": "2.0.9",
-      "nodebb-plugin-emoji": "2.0.7",
-      "nodebb-plugin-emoji-android": "2.0.0",
-      "nodebb-plugin-markdown": "8.2.2",
-      "nodebb-plugin-mentions": "2.2.2",
-      "nodebb-plugin-soundpack-default": "1.0.0",
-      "nodebb-plugin-spam-be-gone": "0.5.1",
-      "nodebb-rewards-essentials": "0.0.9",
-      "nodebb-theme-lavender": "5.0.0",
-      "nodebb-theme-persona": "7.2.7",
-      "nodebb-theme-slick": "1.1.2",
-      "nodebb-theme-vanilla": "8.1.4",
-      "nodebb-widget-essentials": "4.0.1",
-      "nodemailer": "4.4.0",
-      "passport": "^0.4.0",
-      "passport-local": "1.0.0",
-      "postcss": "6.0.14",
-      "postcss-clean": "1.1.0",
-      "promise-polyfill": "^6.0.2",
-      "prompt": "^1.0.0",
-      "redis": "2.8.0",
-      "request": "2.83.0",
-      "rimraf": "2.6.2",
-      "rss": "^1.2.2",
-      "sanitize-html": "^1.14.1",
-      "semver": "^5.4.1",
-      "serve-favicon": "^2.4.5",
-      "sitemap": "^1.13.0",
-      "socket.io": "2.0.4",
-      "socket.io-client": "2.0.4",
-      "socket.io-redis": "5.2.0",
-      "socketio-wildcard": "2.0.0",
-      "spdx-license-list": "^3.0.1",
-      "toobusy-js": "^0.5.1",
-      "uglify-js": "^3.1.5",
-      "validator": "9.1.2",
-      "winston": "^2.4.0",
-      "xml": "^1.0.1",
-      "xregexp": "3.2.0",
-      "zxcvbn": "^4.4.2"
+        "ace-builds": "^1.2.9",
+        "async": "2.6.0",
+        "autoprefixer": "7.1.6",
+        "bcryptjs": "2.4.3",
+        "benchpressjs": "^1.2.0",
+        "body-parser": "^1.18.2",
+        "bootstrap": "^3.3.7",
+        "chart.js": "^2.7.0",
+        "colors": "^1.1.2",
+        "compression": "^1.7.1",
+        "commander": "^2.11.0",
+        "connect-ensure-login": "^0.1.1",
+        "connect-flash": "^0.1.1",
+        "connect-mongo": "2.0.0",
+        "connect-multiparty": "^2.1.0",
+        "connect-redis": "3.3.2",
+        "cookie-parser": "^1.4.3",
+        "cron": "^1.3.0",
+        "cropperjs": "^1.1.3",
+        "csurf": "^1.9.0",
+        "daemon": "^1.1.0",
+        "express": "^4.16.2",
+        "express-session": "^1.15.6",
+        "express-useragent": "1.0.8",
+        "graceful-fs": "^4.1.11",
+        "html-to-text": "3.3.0",
+        "ipaddr.js": "^1.5.4",
+        "jimp": "0.2.28",
+        "jquery": "^3.2.1",
+        "jsesc": "2.5.1",
+        "json-2-csv": "^2.1.2",
+        "less": "^2.7.2",
+        "lodash": "^4.17.4",
+        "logrotate-stream": "^0.2.5",
+        "lru-cache": "4.1.1",
+        "material-design-lite": "^1.3.0",
+        "mime": "^2.0.3",
+        "mkdirp": "^0.5.1",
+        "mongodb": "2.2.33",
+        "morgan": "^1.9.0",
+        "mousetrap": "^1.6.1",
+        "nconf": "^0.9.1",
+        "nodebb-plugin-composer-default": "6.0.7",
+        "nodebb-plugin-dbsearch": "2.0.9",
+        "nodebb-plugin-emoji": "2.0.9",
+        "nodebb-plugin-emoji-android": "2.0.0",
+        "nodebb-plugin-markdown": "8.2.2",
+        "nodebb-plugin-mentions": "2.2.2",
+        "nodebb-plugin-soundpack-default": "1.0.0",
+        "nodebb-plugin-spam-be-gone": "0.5.1",
+        "nodebb-rewards-essentials": "0.0.9",
+        "nodebb-theme-lavender": "5.0.0",
+        "nodebb-theme-persona": "7.2.8",
+        "nodebb-theme-slick": "1.1.2",
+        "nodebb-theme-vanilla": "8.1.4",
+        "nodebb-widget-essentials": "4.0.1",
+        "nodemailer": "4.4.0",
+        "passport": "^0.4.0",
+        "passport-local": "1.0.0",
+        "postcss": "6.0.14",
+        "postcss-clean": "1.1.0",
+        "promise-polyfill": "^6.0.2",
+        "prompt": "^1.0.0",
+        "redis": "2.8.0",
+        "request": "2.83.0",
+        "rimraf": "2.6.2",
+        "rss": "^1.2.2",
+        "sanitize-html": "^1.14.1",
+        "semver": "^5.4.1",
+        "serve-favicon": "^2.4.5",
+        "sitemap": "^1.13.0",
+        "socket.io": "2.0.4",
+        "socket.io-client": "2.0.4",
+        "socket.io-redis": "5.2.0",
+        "socketio-wildcard": "2.0.0",
+        "spdx-license-list": "^3.0.1",
+        "toobusy-js": "^0.5.1",
+        "uglify-js": "^3.1.5",
+        "validator": "9.1.2",
+        "winston": "^2.4.0",
+        "xml": "^1.0.1",
+        "xregexp": "3.2.0",
+        "zxcvbn": "^4.4.2"
     },
     "devDependencies": {
       "coveralls": "^3.0.0",
diff --git a/public/language/cs/admin/appearance/customise.json b/public/language/cs/admin/appearance/customise.json
index c22a869f80..0cd4e0f8da 100644
--- a/public/language/cs/admin/appearance/customise.json
+++ b/public/language/cs/admin/appearance/customise.json
@@ -3,12 +3,12 @@
 	"custom-css.description": "Zadejte vlastní deklarace CSS, které budou použity na všechny ostatních styly.",
 	"custom-css.enable": "Povolit uživatelské CSS",
 
-	"custom-js": "Custom Javascript",
-	"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
-	"custom-js.enable": "Enable Custom Javascript",
+	"custom-js": "Uživatelský Javascript",
+	"custom-js.description": "Zadejte zde váš javascriptový kód. Bude spuštěn, jakmile se stránka plně načte.",
+	"custom-js.enable": "Povolit uživatelský Javascript",
 
 	"custom-header": "Uživatelská hlavička",
-	"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code>&lt;head&gt;</code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
+	"custom-header.description": "Zde zadejte uživatelské HTML (mimo Meta Tags, atd.), které bude připojeno k části značek <code>&lt;head&gt;</code> vašeho fóra.. Značky pro „script” jsou povoleny, ale nedoporučujeme je, neboť je dostupný <a href=\"#custom-header\" data-toggle=\"tab\">Uživatelský Javascript</a> .",
 	"custom-header.enable": "Povolit uživatelskou hlavičku",
 
 	"custom-css.livereload": "Povolit aktuální znovu načtení",
diff --git a/public/language/cs/admin/manage/post-queue.json b/public/language/cs/admin/manage/post-queue.json
index 57fe1f8ab7..e46490b1b7 100644
--- a/public/language/cs/admin/manage/post-queue.json
+++ b/public/language/cs/admin/manage/post-queue.json
@@ -7,5 +7,5 @@
 	"content": "Obsah",
 	"posted": "Přidáno",
 	"reply-to": "Odpovědět na \"%1\"",
-	"content-editable": "You can click on individual content to edit before posting."
+	"content-editable": "Kvůli úpravám a před odesláním příspěvku můžete klikat na obsah."
 }
\ No newline at end of file
diff --git a/public/language/cs/admin/menu.json b/public/language/cs/admin/menu.json
index 8b9812e514..7de94b7a5c 100644
--- a/public/language/cs/admin/menu.json
+++ b/public/language/cs/admin/menu.json
@@ -39,7 +39,7 @@
 	"section-appearance": "Vzhled",
 	"appearance/themes": "Motivy",
 	"appearance/skins": "Vzhledy",
-	"appearance/customise": "Custom Content (HTML/JS/CSS)",
+	"appearance/customise": "Uživatelský obsah (HTML/JS/CSS)",
 
 	"section-extend": "Rozšířit",
 	"extend/plugins": "Rozšíření",
@@ -65,7 +65,7 @@
 	"logout": "Odhlásit",
 	"view-forum": "Zobrazit fórum",
 
-	"search.placeholder": "Search for settings",
+	"search.placeholder": "Hledat nastavení",
 	"search.no-results": "Žádné výsledky…",
 	"search.search-forum": "Prohledat fórum pro <strong></strong>",
 	"search.keep-typing": "Pište dále pro zobrazení výsledků…",
diff --git a/public/language/cs/admin/settings/notifications.json b/public/language/cs/admin/settings/notifications.json
index fd95917606..39bc83bdcb 100644
--- a/public/language/cs/admin/settings/notifications.json
+++ b/public/language/cs/admin/settings/notifications.json
@@ -2,5 +2,5 @@
 	"notifications": "Oznámení",
 	"welcome-notification": "Uvítání",
 	"welcome-notification-link": "Odkaz na uvítání",
-	"welcome-notification-uid": "Welcome Notification User (UID)"
+	"welcome-notification-uid": "Uvítání uživatele (UID)"
 }
\ No newline at end of file
diff --git a/public/language/cs/admin/settings/pagination.json b/public/language/cs/admin/settings/pagination.json
index dc1faf68da..34052b2a9c 100644
--- a/public/language/cs/admin/settings/pagination.json
+++ b/public/language/cs/admin/settings/pagination.json
@@ -3,9 +3,9 @@
 	"enable": "Stránkovat témata a příspěvky namísto nekonečného posouvání",
 	"topics": "Stránkování témat",
 	"posts-per-page": "Příspěvků na stránku",
-	"max-posts-per-page": "Maximum posts per page",
+	"max-posts-per-page": "Maximální množství příspěvků na stránku",
 	"categories": "Stránkování kategorii",
 	"topics-per-page": "Témat na stránku",
-	"max-topics-per-page": "Maximum topics per page",
+	"max-topics-per-page": "Maximální množství témat na stránku",
 	"initial-num-load": "Počáteční počet témat pro načtení u nepřečtených, posledních a polulárních"
 }
\ No newline at end of file
diff --git a/public/language/cs/admin/settings/post.json b/public/language/cs/admin/settings/post.json
index 67d297b33b..de8832b501 100644
--- a/public/language/cs/admin/settings/post.json
+++ b/public/language/cs/admin/settings/post.json
@@ -3,8 +3,8 @@
 	"sorting.post-default": "Výchozí třídění příspěvků",
 	"sorting.oldest-to-newest": "Od nejstarších po nejnovější",
 	"sorting.newest-to-oldest": "Od nejnovějších po nejstarší",
-	"sorting.most-votes": "Dle hlasování",
-	"sorting.most-posts": "Most Posts",
+	"sorting.most-votes": "Dle počtu hlasů",
+	"sorting.most-posts": "Dle počtu příspěvků",
 	"sorting.topic-default": "Výchozí třídění tématu",
 	"restrictions": "Omezení příspěvků",
 	"restrictions.post-queue": "Povolit frontu pro příspěvky",
diff --git a/public/language/cs/admin/settings/user.json b/public/language/cs/admin/settings/user.json
index 2ad41f23cf..e683492860 100644
--- a/public/language/cs/admin/settings/user.json
+++ b/public/language/cs/admin/settings/user.json
@@ -19,8 +19,8 @@
 	"themes": "Motivy",
 	"disable-user-skins": "Zabránit uživateli ve výběru vlastního vzhledu",
 	"account-protection": "Ochrana účtu",
-	"admin-relogin-duration": "Admin relogin duration (minutes)",
-	"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
+	"admin-relogin-duration": "Doba pro opětovné přihlášení správce (minuty)",
+	"admin-relogin-duration-help": "Po nastavení počtu přístupu do správcovské části, bude vyžadováno opětovné přihlášení. Pro zakázání, nastavte na 0.",
 	"login-attempts": "Počet pokusů o přihlášení za hodinu",
 	"login-attempts-help": "Překročí-li pokusy o přihlášení uživatele/ů  tuto hranici, účet bude uzamknut na určený čas",
 	"lockout-duration": "Délka blokování účtu (v minutách)",
diff --git a/public/language/cs/email.json b/public/language/cs/email.json
index 1d1efa10e9..b330291160 100644
--- a/public/language/cs/email.json
+++ b/public/language/cs/email.json
@@ -30,7 +30,7 @@
     "notif.chat.unsub.info": "Toto upozornění na chat vám bylo odesláno na základě vašeho nastavení odběru.",
     "notif.post.cta": "Klikněte zde pro přečtené celého tématu",
     "notif.post.unsub.info": "Toto upozornění na příspěvek vám bylo odesláno na základě vašeho nastavení odběru.",
-    "notif.cta": "Click here to go to forum",
+    "notif.cta": "Pro přejití na fórum, klikněte zde",
     "test.text1": "Tento testovací e-mail slouží k ověření, že je e-mailer správně nastaven pro práci s NodeBB.",
     "unsub.cta": "Chcete-li změnit tyto nastavení, klikněte zde.",
     "banned.subject": "Byl jste zablokován od %1",
diff --git a/public/language/cs/error.json b/public/language/cs/error.json
index 43ea641999..18576ee9bc 100644
--- a/public/language/cs/error.json
+++ b/public/language/cs/error.json
@@ -11,7 +11,7 @@
     "invalid-uid": "Neplatné ID uživatele",
     "invalid-username": "Neplatné uživatelské jméno",
     "invalid-email": "Neplatný e-mail",
-    "invalid-title": "Invalid title",
+    "invalid-title": "Neplatný název",
     "invalid-user-data": "Neplatná uživatelská data",
     "invalid-password": "Neplatné heslo",
     "invalid-login-credentials": "Neplatné přihlašovací údaje",
@@ -81,7 +81,7 @@
     "cant-ban-other-admins": "Nemůžete zablokovat jiné správce.",
     "cant-remove-last-admin": "Jste jediným správcem. Před vlastním odebráním oprávnění správce nejdříve přidejte jiného uživatele jako správce",
     "cant-delete-admin": "Před odstraněním účtu mu nejprve odeberte oprávnění správce.",
-    "invalid-image": "Invalid image",
+    "invalid-image": "Neplatný obrázek",
     "invalid-image-type": "Neplatný typ obrázku. Povolené typy jsou: %1",
     "invalid-image-extension": "Neplatná přípona obrázku",
     "invalid-file-type": "Neplatný typ souboru. Povolené typy jsou: %1",
@@ -119,13 +119,13 @@
     "not-enough-reputation-to-downvote": "Nemáte dostatečnou reputaci pro vyjádření nesouhlasu u tohoto příspěvku",
     "not-enough-reputation-to-flag": "Pro označení tohoto příspěvku nemáte dostatečnou reputaci",
     "already-flagged": "Tento příspěvek jste již označil",
-    "self-vote": "You cannot vote on your own post",
+    "self-vote": "U svého vlastního příspěvku nemůžete hlasovat",
     "reload-failed": "Vyskytla se chyba v NodeBB při znovu načtení: \"%1\". NodeBB bude pokračovat v běhu na straně klienta,  nicméně byste měl/a přenastavit zpět to, co jste udělal/a před opětovným načtením.",
     "registration-error": "Chyba při registraci",
     "parse-error": "Při analýze odpovědi serveru nastala chyba",
     "wrong-login-type-email": "Pro přihlášení použijte vaši e-mailovou adresu",
     "wrong-login-type-username": "Pro přihlášení použijte vaše uživatelské jméno",
-    "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first",
+    "sso-registration-disabled": "Registrace byla zakázána pro účty - %1. Nejprve si zaregistrujte e-mailovou adresu",
     "invite-maximum-met": "Již jste pozval/a maximálně možný počet lidí (%1 z %2).",
     "no-session-found": "Nebyla nalezena relace s přihlášením.",
     "not-in-room": "Uživatel není přítomen v místnosti",
@@ -135,5 +135,5 @@
     "invalid-home-page-route": "Neplatná cesta k domovské stránkce",
     "invalid-session": "Nesoulad v relacích",
     "invalid-session-text": "Zdá se, že vše relace s přihlášením již není aktivní nebo již neodpovídá s relací na serveru. Obnovte prosím tuto stránku.",
-    "no-topics-selected": "No topics selected!"
+    "no-topics-selected": "Žádná vybraná témata."
 }
\ No newline at end of file
diff --git a/public/language/cs/flags.json b/public/language/cs/flags.json
index e221f6965b..eb37572f8a 100644
--- a/public/language/cs/flags.json
+++ b/public/language/cs/flags.json
@@ -54,11 +54,11 @@
 	"modal-body": "Zadejte váš důvod k označení %1 %2 pro kontrolu. Nebo použijte tlačítko je-li dostupné.",
 	"modal-reason-spam": "Spam",
 	"modal-reason-offensive": "Urážlivé",
-	"modal-reason-other": "Other (specify below)",
+	"modal-reason-other": "Jiné (popište níže)",
 	"modal-reason-custom": "Důvod ohlášení tohoto obsahu…",
 	"modal-submit": "Předat hlášení",
 	"modal-submit-success": "Obsah byl označen pro moderaci.",
-	"modal-submit-confirm": "Confirm Submission",
-	"modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?",
-	"modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined."
+	"modal-submit-confirm": "Potvrdit hlášení",
+	"modal-submit-confirm-text": "Již jste zadal/a nějaký důvod. Jste si jist/a, že chcete nahlásit pomocí rychlé zprávy?",
+	"modal-submit-confirm-text-help": "Zaslání rychlé zprávy přepíše jiné zadané důvody."
 }
\ No newline at end of file
diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json
index 8182ae3f47..284b394c6f 100644
--- a/public/language/cs/notifications.json
+++ b/public/language/cs/notifications.json
@@ -8,8 +8,8 @@
     "outgoing_link_message": "Opouštíte %1",
     "continue_to": "Pokračovat na %1",
     "return_to": "Vrátit se na %1",
-    "new_notification": "Nové upozornění",
-    "new_notification_from": "You have a new Notification from %1",
+    "new_notification": "Nové oznámení",
+    "new_notification_from": "Máte nové upozornění od %1",
     "you_have_unread_notifications": "Máte nepřečtená upozornění.",
     "all": "Vše",
     "topics": "Témata",
@@ -47,18 +47,18 @@
     "email-confirmed-message": "Děkujeme za ověření vaší e-mailové adresy. Váš účet je nyní aktivní.",
     "email-confirm-error-message": "Nastal problém s ověřením vaší e-mailové adresy. Kód je pravděpodobně neplatný nebo jeho platnost vypršela.",
     "email-confirm-sent": "Ověřovací e-mail odeslán.",
-    "none": "None",
-    "notification_only": "Notification Only",
-    "email_only": "Email Only",
-    "notification_and_email": "Notification & Email",
-    "notificationType_upvote": "When someone upvotes your post",
-    "notificationType_new-topic": "When someone you follow posts a topic",
-    "notificationType_new-reply": "When a new reply is posted in a topic you are watching",
-    "notificationType_follow": "When someone starts following you",
-    "notificationType_new-chat": "When you receive a chat message",
-    "notificationType_group-invite": "When you receive a group invite",
-    "notificationType_new-register": "When someone gets added to registration queue",
-    "notificationType_post-queue": "When a new post is queued",
-    "notificationType_new-post-flag": "When a post is flagged",
-    "notificationType_new-user-flag": "When a user is flagged"
+    "none": "Nic",
+    "notification_only": "Jen oznámení",
+    "email_only": "Jen e-mail",
+    "notification_and_email": "Oznámení a e-mail",
+    "notificationType_upvote": "Vyjádří-li někdo souhlas s vaším příspěvkem",
+    "notificationType_new-topic": "Začne-li někdo sledovat příspěvky a téma",
+    "notificationType_new-reply": "Bude-li přidán nový příspěvek v tématu, které sledujete",
+    "notificationType_follow": "Začne-li vás někdo sledovat",
+    "notificationType_new-chat": "Obdržíte-li novou konverzační zprávu",
+    "notificationType_group-invite": "Obdržíte-li pozvání ke skupině",
+    "notificationType_new-register": "Bude-li někdo přidán do registrační fronty",
+    "notificationType_post-queue": "Bude-li přidán nový příspěvek do fronty",
+    "notificationType_new-post-flag": "Bude-li příspěvek označen",
+    "notificationType_new-user-flag": "Bude-li uživatel označen"
 }
\ No newline at end of file
diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json
index 8a0270a9db..befc7ceba3 100644
--- a/public/language/cs/pages.json
+++ b/public/language/cs/pages.json
@@ -44,7 +44,7 @@
     "account/bookmarks": "%1's zazáložkované příspěvky",
     "account/settings": "Uživatelské nastavení",
     "account/watched": "Témata sledovaná uživatelem %1",
-    "account/ignored": "Topics ignored by %1",
+    "account/ignored": "Témata ignorovaná uživatelem %1",
     "account/upvoted": "Souhlasí s příspěvkem %1",
     "account/downvoted": "Nesouhlasí s příspěvkem %1",
     "account/best": "Nejlepší příspěvky od %1",
diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json
index 7cedca5e24..80e7561e26 100644
--- a/public/language/cs/topic.json
+++ b/public/language/cs/topic.json
@@ -68,8 +68,8 @@
     "thread_tools.restore_confirm": "Jste si jist/a, že chcete toto téma obnovit?",
     "thread_tools.purge": "Vyčistit téma",
     "thread_tools.purge_confirm": "Jste si jist/a, že chcete vyčistit toto téma?",
-    "thread_tools.merge_topics": "Merge Topics",
-    "thread_tools.merge": "Merge",
+    "thread_tools.merge_topics": "Sloučit témata",
+    "thread_tools.merge": "Sloučit",
     "topic_move_success": "Toto téma bylo úspěšně přesunuto do %1",
     "post_delete_confirm": "Jste si jist/a, že chcete odstranit tento příspěvek?",
     "post_restore_confirm": "Jste si jist/a, že chcete obnovit tento příspěvek?",
@@ -91,7 +91,7 @@
     "fork_pid_count": "Vybráno %1 příspěvek/ů",
     "fork_success": "Téma úspěšně rozděleno. Pro přejití na rozdělené téma, zde klikněte.",
     "delete_posts_instruction": "Klikněte na příspěvek, který chcete odstranit/vyčistit",
-    "merge_topics_instruction": "Click the topics you want to merge",
+    "merge_topics_instruction": "Pro sloučení témat, klikněte na ně",
     "composer.title_placeholder": "Zadejte název tématu…",
     "composer.handle_placeholder": "Jméno",
     "composer.discard": "Zrušit",
diff --git a/public/language/cs/unread.json b/public/language/cs/unread.json
index 60381d5efd..35035c5cb0 100644
--- a/public/language/cs/unread.json
+++ b/public/language/cs/unread.json
@@ -10,6 +10,6 @@
     "all-topics": "Všechna témata",
     "new-topics": "Nová témata",
     "watched-topics": "Sledovaná témata",
-    "unreplied-topics": "Unreplied Topics",
-    "multiple-categories-selected": "Multiple Selected"
+    "unreplied-topics": "Neodpovězené témata",
+    "multiple-categories-selected": "Vícenásobný výběr"
 }
\ No newline at end of file
diff --git a/public/language/cs/user.json b/public/language/cs/user.json
index 0042eb8ec6..8fce80c61c 100644
--- a/public/language/cs/user.json
+++ b/public/language/cs/user.json
@@ -25,7 +25,7 @@
     "reputation": "Reputace",
     "bookmarks": "Záložky",
     "watched": "Sledován",
-    "ignored": "Ignored",
+    "ignored": "Ignorován",
     "followers": "Sledují ho",
     "following": "Sleduje",
     "aboutme": "O mně",
@@ -85,7 +85,7 @@
     "has_no_posts": "Tento uživatel ještě nic nenapsal.",
     "has_no_topics": "Tento uživatel ještě nezaložil žádné téma.",
     "has_no_watched_topics": "Tento uživatel zatím nesleduje žádná témata.",
-    "has_no_ignored_topics": "This user hasn't ignored any topics yet.",
+    "has_no_ignored_topics": "Tento uživatel ještě neignoruje žádné témata.",
     "has_no_upvoted_posts": "Tento uživatel zatím nevyjádřil souhlas u žádného příspěvku.",
     "has_no_downvoted_posts": "Tento uživatel zatím nevyjádřil nesouhlas  u žádného příspěvku.",
     "has_no_voted_posts": "Tento uživatel nemá žádné hlasovací příspěvky",
@@ -101,11 +101,11 @@
     "outgoing-message-sound": "Zvuk odchozí zprávy",
     "notification-sound": "Zvuk oznámení",
     "no-sound": "Bez zvuku",
-    "upvote-notif-freq": "Upvote Notification Frequency",
-    "upvote-notif-freq.all": "All Upvotes",
-    "upvote-notif-freq.everyTen": "Every Ten Upvotes",
-    "upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
-    "upvote-notif-freq.disabled": "Disabled",
+    "upvote-notif-freq": "Frekvence upozornění na souhlasy",
+    "upvote-notif-freq.all": "Všechny souhlasy",
+    "upvote-notif-freq.everyTen": "Každý desátý souhlas",
+    "upvote-notif-freq.logarithmic": "Dle 10, 100, 1000...",
+    "upvote-notif-freq.disabled": "Zakázáno",
     "browsing": "Nastavení prohlížení",
     "open_links_in_new_tab": "Otevřít odchozí odkaz v nové záložce",
     "enable_topic_searching": "Povolit vyhledávání v tématu",
@@ -126,9 +126,9 @@
     "sso.title": "Služby jednotného přihlášení",
     "sso.associated": "Přiřazeno k",
     "sso.not-associated": "Zde klikněte pro přiřazení k",
-    "sso.dissociate": "Dissociate",
-    "sso.dissociate-confirm-title": "Confirm Dissociation",
-    "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
+    "sso.dissociate": "Odloučit",
+    "sso.dissociate-confirm-title": "Potvrdit odloučení",
+    "sso.dissociate-confirm": "Jste si jist/a, že chcete odloučit váš účet z %1?",
     "info.latest-flags": "Poslední označené",
     "info.no-flags": "Nebyly nalezeny žádné označené příspěvky",
     "info.ban-history": "Poslední historie blokovaných",
diff --git a/public/language/fr/admin/appearance/customise.json b/public/language/fr/admin/appearance/customise.json
index ada04f6546..187f799efb 100644
--- a/public/language/fr/admin/appearance/customise.json
+++ b/public/language/fr/admin/appearance/customise.json
@@ -3,9 +3,9 @@
 	"custom-css.description": "Entrez vos propres déclarations de CSS ici, elles seront appliquées après tous les autres styles.",
 	"custom-css.enable": "Activer les CSS personnalisés",
 
-	"custom-js": "Custom Javascript",
-	"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
-	"custom-js.enable": "Enable Custom Javascript",
+	"custom-js": "Javascript personnalisé",
+	"custom-js.description": "Entrez votre Javascript ici. Celui-ci sera exécute après le chargement complet de la page.",
+	"custom-js.enable": "Activer le Javascript personnalisé",
 
 	"custom-header": "En-tête personnalisé",
 	"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code>&lt;head&gt;</code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
diff --git a/public/language/it/email.json b/public/language/it/email.json
index bcada51df4..f6fdaef532 100644
--- a/public/language/it/email.json
+++ b/public/language/it/email.json
@@ -13,7 +13,7 @@
     "reset.text1": "Abbiamo ricevuto una richiesta di reset della tua password, probabilmente perché l'hai dimenticata. Se non è così si prega di ignorare questa email.",
     "reset.text2": "Per confermare il reset della password per favore clicca il seguente link:",
     "reset.cta": "Clicca qui per resettare la tua password",
-    "reset.notify.subject": "Possword modificata con successo.",
+    "reset.notify.subject": "Password modificata con successo.",
     "reset.notify.text1": "Ti informiamo che in data %1, la password è stata cambiata con successo.",
     "reset.notify.text2": "Se non hai autorizzato questo, per favore notifica immediatamente un amministratore.",
     "digest.notifications": "Hai una notifica non letta da %1:",
@@ -33,9 +33,9 @@
     "notif.cta": "Vai alla discussione",
     "test.text1": "Questa è una email di test per verificare che il servizio di invio email è configurato correttamente sul tuo NodeBB.",
     "unsub.cta": "Clicca qui per modificare queste impostazioni",
-    "banned.subject": "You have been banned from %1",
-    "banned.text1": "The user %1 has been banned from %2.",
-    "banned.text2": "This ban will last until %1.",
-    "banned.text3": "This is the reason why you have been banned:",
+    "banned.subject": "Sei stato bannato da %1",
+    "banned.text1": "%1 è stato bannato da %2",
+    "banned.text2": "Questo ban durerà fino a %1.",
+    "banned.text3": "Il motivo del ban è:",
     "closing": "Grazie!"
 }
\ No newline at end of file
diff --git a/public/language/it/error.json b/public/language/it/error.json
index 9fa55ff42e..0ad1f963ca 100644
--- a/public/language/it/error.json
+++ b/public/language/it/error.json
@@ -11,10 +11,10 @@
     "invalid-uid": "ID Utente non valido",
     "invalid-username": "Nome utente non valido",
     "invalid-email": "Email non valida",
-    "invalid-title": "Invalid title",
+    "invalid-title": "Titolo non Valido",
     "invalid-user-data": "Dati Utente non validi",
     "invalid-password": "Password non valida",
-    "invalid-login-credentials": "Invalid login credentials",
+    "invalid-login-credentials": "Credenziali non Valide",
     "invalid-username-or-password": "Si prega di specificare sia un nome utente che una password",
     "invalid-search-term": "Termine di ricerca non valido",
     "csrf-invalid": "Non siamo riusciti a farti connettere, probabilmente perché la sessione è scaduta. Per favore riprova.",
@@ -66,7 +66,7 @@
     "content-too-long": "Inserisci un post più breve. I post non possono essere più lunghi di %1 caratteri.",
     "title-too-short": "Inserisci un titolo più lungo. I titoli devono contenere almeno %1 caratteri.",
     "title-too-long": "Inserisci un titolo più corto. I titoli non possono essere più lunghi di %1 caratteri.",
-    "category-not-selected": "Category not selected.",
+    "category-not-selected": "Categoria non selezionata.",
     "too-many-posts": "È possibile inserire un Post ogni %1 secondi - si prega di attendere prima di postare di nuovo",
     "too-many-posts-newbie": "Come nuovo utente puoi postare solamente una volta ogni %1 secondi finché non hai raggiunto un livello di reputazione %2 - per favore attendi prima di scrivere ancora",
     "tag-too-short": "Inserisci un tag più lungo. I tag devono contenere almeno %1 caratteri.",
@@ -76,12 +76,12 @@
     "still-uploading": "Per favore attendere il completamento degli uploads.",
     "file-too-big": "La dimensione massima consentita è di %1 kB - si prega di caricare un file più piccolo",
     "guest-upload-disabled": "Il caricamento da ospite è stato disattivato",
-    "already-bookmarked": "You have already bookmarked this post",
-    "already-unbookmarked": "You have already unbookmarked this post",
+    "already-bookmarked": "Hai già aggiunto questa discussione ai preferiti.",
+    "already-unbookmarked": "Hai già rimosso questa discussione dai preferiti",
     "cant-ban-other-admins": "Non puoi bannare altri amministratori!",
     "cant-remove-last-admin": "Sei l'unico Amministratore. Aggiungi un altro amministratore prima di rimuovere il tuo ruolo",
     "cant-delete-admin": "Togli i privilegi amministrativi da questo account prima di provare ad eliminarlo.",
-    "invalid-image": "Invalid image",
+    "invalid-image": "Immagine non Valida",
     "invalid-image-type": "Tipo dell'immagine non valido. I tipi permessi sono: %1",
     "invalid-image-extension": "Estensione immagine non valida",
     "invalid-file-type": "Tipo di file non valido. I formati consentiti sono: %1",
@@ -109,7 +109,7 @@
     "chat-disabled": "Il sistema di chat è stato disabilitato",
     "too-many-messages": "Hai inviato troppi messaggi, aspetta un attimo.",
     "invalid-chat-message": "Messaggio chat non valido",
-    "chat-message-too-long": "Chat messages can not be longer than %1 characters.",
+    "chat-message-too-long": "I messaggi in chat non possono superare i %1 caratteri.",
     "cant-edit-chat-message": "Non ti è permesso di modificare questo messaggio",
     "cant-remove-last-user": "Non puoi rimuovere l'ultimo utente",
     "cant-delete-chat-message": "Non ti è permesso di eliminare questo messaggio",
@@ -119,7 +119,7 @@
     "not-enough-reputation-to-downvote": "Non hai i privilegi per votare negativamente questo post",
     "not-enough-reputation-to-flag": "Tu non hai abbastanza reputazione per segnalare questo Post",
     "already-flagged": "Hai già messo marcato questo post",
-    "self-vote": "You cannot vote on your own post",
+    "self-vote": "Non puoi votare la tua stessa discussione",
     "reload-failed": "NodeBB ha incontrato un problema durante il ricaricamento: \"%1\". NodeBB continuerà a servire gli assets esistenti lato client, così puoi annullare quello che hai fatto prima di ricaricare.",
     "registration-error": "Errore nella registrazione",
     "parse-error": "Qualcosa è andato storto durante l'analisi della risposta proveniente dal server",
@@ -135,5 +135,5 @@
     "invalid-home-page-route": "Percorso della pagina iniziale non valido",
     "invalid-session": "Discrepanza della sessione",
     "invalid-session-text": "Sembra che la tua sessione non sia più attiva, oppure non corrisponde con il server. Per favore ricarica la pagina.",
-    "no-topics-selected": "No topics selected!"
+    "no-topics-selected": "Nessuna discussione selezionata!"
 }
\ No newline at end of file
diff --git a/public/language/it/flags.json b/public/language/it/flags.json
index d05a5b25a8..14aaf7af02 100644
--- a/public/language/it/flags.json
+++ b/public/language/it/flags.json
@@ -27,12 +27,12 @@
 
 	"quick-links": "Quick Links",
 	"flagged-user": "Flagged User",
-	"view-profile": "View Profile",
+	"view-profile": "Vedi Profilo",
 	"start-new-chat": "Start New Chat",
 	"go-to-target": "View Flag Target",
 
-	"user-view": "View Profile",
-	"user-edit": "Edit Profile",
+	"user-view": "Vedi Profilo",
+	"user-edit": "Modifica Profilo",
 
 	"notes": "Flag Notes",
 	"add-note": "Add Note",
@@ -44,21 +44,21 @@
 
 	"state-all": "All states",
 	"state-open": "New/Open",
-	"state-wip": "Work in Progress",
-	"state-resolved": "Resolved",
+	"state-wip": "Lavori in Corso",
+	"state-resolved": "Risolto",
 	"state-rejected": "Rejected",
-	"no-assignee": "Not Assigned",
+	"no-assignee": "Non Assegnato",
 	"note-added": "Note Added",
 
-	"modal-title": "Report Inappropriate Content",
+	"modal-title": "Segnala Contenuto Inappropriato",
 	"modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.",
 	"modal-reason-spam": "Spam",
-	"modal-reason-offensive": "Offensive",
-	"modal-reason-other": "Other (specify below)",
-	"modal-reason-custom": "Reason for reporting this content...",
-	"modal-submit": "Submit Report",
-	"modal-submit-success": "Content has been flagged for moderation.",
-	"modal-submit-confirm": "Confirm Submission",
+	"modal-reason-offensive": "Offensivo",
+	"modal-reason-other": "Altro (Specificare di seguito)",
+	"modal-reason-custom": "Motivazione della segnalazione...",
+	"modal-submit": "Invia la Segnalazione",
+	"modal-submit-success": "Il contenuto è stato segnalato.",
+	"modal-submit-confirm": "Conferma la Segnalazione",
 	"modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?",
 	"modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined."
 }
\ No newline at end of file
diff --git a/public/language/it/global.json b/public/language/it/global.json
index 7325219082..4279338d8d 100644
--- a/public/language/it/global.json
+++ b/public/language/it/global.json
@@ -104,6 +104,6 @@
     "cookies.accept": "Ho capito!",
     "cookies.learn_more": "Scopri di più",
     "edited": "Modificato",
-    "disabled": "Disabled",
-    "select": "Select"
+    "disabled": "Disabilitato",
+    "select": "Seleziona"
 }
\ No newline at end of file
diff --git a/public/language/it/groups.json b/public/language/it/groups.json
index 835ada672f..53f27c12c4 100644
--- a/public/language/it/groups.json
+++ b/public/language/it/groups.json
@@ -27,7 +27,7 @@
     "details.disableJoinRequests": "Disabilita le richieste d'adesione",
     "details.grant": "Concedi / Rimuovi la Proprietà",
     "details.kick": "Espelli",
-    "details.kick_confirm": "Are you sure you want to remove this member from the group?",
+    "details.kick_confirm": "Sei sicuro di voler rimuovere questo membro dal gruppo?",
     "details.owner_options": "Amministratore del Grupo",
     "details.group_name": "Nome Gruppo",
     "details.member_count": "Totale Membri",
@@ -53,6 +53,6 @@
     "new-group.group_name": "Nome Gruppo:",
     "upload-group-cover": "Carica copertina del gruppo",
     "bulk-invite-instructions": "Inserisci una lista di nomi utente da invitare in questo gruppo separati da virgole",
-    "bulk-invite": "Bulk Invite",
+    "bulk-invite": "Invita in Massa",
     "remove_group_cover_confirm": "Sei sicuro di voler rimuovere l'immagine copertina?"
 }
\ No newline at end of file
diff --git a/public/language/it/modules.json b/public/language/it/modules.json
index 5fcef5d582..d379688576 100644
--- a/public/language/it/modules.json
+++ b/public/language/it/modules.json
@@ -20,7 +20,7 @@
     "chat.three_months": "3 Mesi",
     "chat.delete_message_confirm": "Sei sicuro di voler eliminare questo messaggio?",
     "chat.add-users-to-room": "Aggiungi utenti alla stanza",
-    "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?",
+    "chat.confirm-chat-with-dnd-user": "Questo utente ha impostato il suo stato su Non Disturbare. Sei sicuro di voler iniziare una conversazione?",
     "composer.compose": "Componi",
     "composer.show_preview": "Visualizza Anteprima",
     "composer.hide_preview": "Nascondi Anteprima",
diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json
index 5aa5225d1b..7a1b0c4b36 100644
--- a/public/language/it/notifications.json
+++ b/public/language/it/notifications.json
@@ -29,9 +29,9 @@
     "user_flagged_post_in": "<strong>%1</strong> ha segnalato un post in <strong>%2</strong>",
     "user_flagged_post_in_dual": "<strong>%1</strong> e <strong>%2</strong> hanno segnalato un post in <strong>%3</strong>",
     "user_flagged_post_in_multiple": "<strong>%1</strong> ed altri %2 hanno segnalato un post in <strong>%3</strong>",
-    "user_flagged_user": "<strong>%1</strong> flagged a user profile (%2)",
-    "user_flagged_user_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a user profile (%3)",
-    "user_flagged_user_multiple": "<strong>%1</strong> and %2 others flagged a user profile (%3)",
+    "user_flagged_user": "<strong>%1</strong> ha segnalato un utente (%2)",
+    "user_flagged_user_dual": "<strong>%1</strong> e <strong>%2</strong> hanno segnalato un utente (%3)",
+    "user_flagged_user_multiple": "<strong>%1</strong> e altri %2 hanno segnalato un utente (%3)",
     "user_posted_to": "<strong>%1</strong> ha postato una risposta a: <strong>%2</strong>",
     "user_posted_to_dual": "<strong>%1</strong> e <strong>%2</strong> hanno postato una risposta su: <strong>%3</strong>",
     "user_posted_to_multiple": "<strong>%1</strong> ed altri %2 hanno postato una risposta su: <strong>%3</strong>",
@@ -42,23 +42,23 @@
     "new_register": "<strong>%1</strong> ha inviato una richiesta di registrazione.",
     "new_register_multiple": "Ci sono <strong>%1</strong> richieste di registrazione che attendono di essere esaminate.",
     "flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
-    "post_awaiting_review": "Post awaiting review",
+    "post_awaiting_review": "Post in attesa di revisione",
     "email-confirmed": "Email Confermata",
     "email-confirmed-message": "Grazie per aver validato la tua email. Il tuo account è ora completamente attivato.",
     "email-confirm-error-message": "C'è stato un problema nella validazione del tuo indirizzo email. Potrebbe essere il codice non valido o scaduto.",
     "email-confirm-sent": "Email di conferma inviata.",
-    "none": "None",
-    "notification_only": "Notification Only",
-    "email_only": "Email Only",
-    "notification_and_email": "Notification & Email",
-    "notificationType_upvote": "When someone upvotes your post",
+    "none": "Nessuna Notifica",
+    "notification_only": "Solo Notifiche",
+    "email_only": "Solo Email",
+    "notification_and_email": "Email e Notifica",
+    "notificationType_upvote": "Quando il tuo post riceve un Mi Piace",
     "notificationType_new-topic": "When someone you follow posts a topic",
     "notificationType_new-reply": "When a new reply is posted in a topic you are watching",
     "notificationType_follow": "When someone starts following you",
     "notificationType_new-chat": "When you receive a chat message",
     "notificationType_group-invite": "When you receive a group invite",
     "notificationType_new-register": "When someone gets added to registration queue",
-    "notificationType_post-queue": "When a new post is queued",
-    "notificationType_new-post-flag": "When a post is flagged",
-    "notificationType_new-user-flag": "When a user is flagged"
+    "notificationType_post-queue": "Quando un nuovo post è in attesa di revisione",
+    "notificationType_new-post-flag": "Quando un post viene segnalato",
+    "notificationType_new-user-flag": "Quando un utente viene segnalato"
 }
\ No newline at end of file
diff --git a/public/language/it/pages.json b/public/language/it/pages.json
index 0b1be5dc1e..0be5a17a98 100644
--- a/public/language/it/pages.json
+++ b/public/language/it/pages.json
@@ -7,7 +7,7 @@
     "popular-alltime": "Discussioni più popolari di sempre",
     "recent": "Discussioni Recenti",
     "moderator-tools": "Moderator Tools",
-    "flagged-content": "Flagged Content",
+    "flagged-content": "Contenuti Segnalati",
     "ip-blacklist": "Lista nera degli IP",
     "post-queue": "Post Queue",
     "users/online": "Utenti Online",
@@ -44,7 +44,7 @@
     "account/bookmarks": "%1 Post tra i favoriti",
     "account/settings": "Impostazioni Utente",
     "account/watched": "Discussioni osservate da %1",
-    "account/ignored": "Topics ignored by %1",
+    "account/ignored": "Discussioni ignorate da %1",
     "account/upvoted": "Post apprezzati da %1",
     "account/downvoted": "Post votati negativamente da %1",
     "account/best": "I migliori post di %1",
diff --git a/public/language/it/register.json b/public/language/it/register.json
index e3afd5aed2..49de769d43 100644
--- a/public/language/it/register.json
+++ b/public/language/it/register.json
@@ -1,5 +1,5 @@
 {
-    "register": "Registrazione",
+    "register": "Registrati",
     "cancel_registration": "Cancella Registrazione",
     "help.email": "Come opzione predefinita, il tuo indirizzo email non verrà reso pubblico.",
     "help.username_restrictions": "Un nome utente unico, di almeno %1 caratteri e al massimo di %2. Gli altri utenti ti possono menzionare usando @<span id='yourUsername'>username</span>.",
diff --git a/public/language/it/search.json b/public/language/it/search.json
index 980e2c28ba..dc33a58737 100644
--- a/public/language/it/search.json
+++ b/public/language/it/search.json
@@ -12,7 +12,7 @@
     "reply-count": "Numero Risposte",
     "at-least": "Almeno",
     "at-most": "Al massimo",
-    "relevance": "Relevance",
+    "relevance": "Rilevanza",
     "post-time": "Ora invio",
     "newer-than": "Più nuovi di",
     "older-than": "Più vecchi di",
diff --git a/public/language/it/success.json b/public/language/it/success.json
index cf8dd4cad5..35f6d5b2a9 100644
--- a/public/language/it/success.json
+++ b/public/language/it/success.json
@@ -1,7 +1,7 @@
 {
     "success": "Riuscito",
     "topic-post": "Hai postato correttamente.",
-    "post-queued": "Your post is queued for approval.",
+    "post-queued": "La tua discussione è in attesa di approvazione.",
     "authentication-successful": "Autenticazione Riuscita",
     "settings-saved": "Impostazioni salvate!"
 }
\ No newline at end of file
diff --git a/public/language/it/topic.json b/public/language/it/topic.json
index 747ba4876b..5b15970770 100644
--- a/public/language/it/topic.json
+++ b/public/language/it/topic.json
@@ -13,9 +13,9 @@
     "notify_me": "Ricevi notifiche di nuove risposte in questa discussione",
     "quote": "Cita",
     "reply": "Rispondi",
-    "replies_to_this_post": "%1 Replies",
-    "one_reply_to_this_post": "1 Reply",
-    "last_reply_time": "Last reply",
+    "replies_to_this_post": "%1 Risposte",
+    "one_reply_to_this_post": "1 Risposta",
+    "last_reply_time": "Ultima Risposta",
     "reply-as-topic": "Topic risposta",
     "guest-login-reply": "Effettua il Log in per rispondere",
     "edit": "Modifica",
@@ -59,7 +59,7 @@
     "thread_tools.unlock": "Sblocca Discussione",
     "thread_tools.move": "Sposta Discussione",
     "thread_tools.move_all": "Sposta Tutto",
-    "thread_tools.select_category": "Select Category",
+    "thread_tools.select_category": "Seleziona Categoria",
     "thread_tools.fork": "Dividi Discussione",
     "thread_tools.delete": "Elimina Discussione",
     "thread_tools.delete-posts": "Cancella post",
@@ -68,8 +68,8 @@
     "thread_tools.restore_confirm": "Sei sicuro di voler ripristinare questa discussione?",
     "thread_tools.purge": "Svuota Discussione",
     "thread_tools.purge_confirm": "Sei sicuro di voler svuotare questa discussione?",
-    "thread_tools.merge_topics": "Merge Topics",
-    "thread_tools.merge": "Merge",
+    "thread_tools.merge_topics": "Unisci le Discussioni",
+    "thread_tools.merge": "Unisci",
     "topic_move_success": "Questa discussione è stata correttamente spostata in %1",
     "post_delete_confirm": "Sei sicuro di voler cancellare questo post?",
     "post_restore_confirm": "Sei sicuro di voler ripristinare questo post?",
@@ -91,7 +91,7 @@
     "fork_pid_count": "%1 post selezionati",
     "fork_success": "Topic Diviso con successo ! Clicca qui per andare al Topic Diviso.",
     "delete_posts_instruction": "Clicca sui post che vuoi cancellare/eliminare",
-    "merge_topics_instruction": "Click the topics you want to merge",
+    "merge_topics_instruction": "Clicca sulle discussioni che vuoi unire",
     "composer.title_placeholder": "Inserisci qui il titolo della discussione...",
     "composer.handle_placeholder": "Nome",
     "composer.discard": "Annulla",
diff --git a/public/language/it/unread.json b/public/language/it/unread.json
index c1244d0fe3..2f2afebd23 100644
--- a/public/language/it/unread.json
+++ b/public/language/it/unread.json
@@ -10,6 +10,6 @@
     "all-topics": "Tutte le Discussioni",
     "new-topics": "Nuova Discussione",
     "watched-topics": "Discussioni seguite",
-    "unreplied-topics": "Nessuna Risposta",
-    "multiple-categories-selected": "Multiple Selected"
+    "unreplied-topics": "Discussioni Senza Risposta",
+    "multiple-categories-selected": "Più Categorie"
 }
\ No newline at end of file
diff --git a/public/language/it/user.json b/public/language/it/user.json
index a24f325d24..d3b66bfa4a 100644
--- a/public/language/it/user.json
+++ b/public/language/it/user.json
@@ -19,13 +19,13 @@
     "location": "Località",
     "age": "Età",
     "joined": "Iscrizione",
-    "lastonline": "Ultima volta in linea",
+    "lastonline": "Ultimo Accesso",
     "profile": "Profilo",
     "profile_views": "Visite al profilo",
     "reputation": "Reputazione",
-    "bookmarks": "Favoriti",
+    "bookmarks": "Preferiti",
     "watched": "Osservati",
-    "ignored": "Ignored",
+    "ignored": "Ignorati",
     "followers": "Da chi è seguito",
     "following": "Chi segue",
     "aboutme": "Su di me",
@@ -61,7 +61,7 @@
     "username_taken_workaround": "Il nome utente che hai richiesto era già stato utilizzato, quindi lo abbiamo modificato leggermente. Ora il tuo è <strong>%1</strong>",
     "password_same_as_username": "La tua password è uguale al tuo username, per piacere scegli un'altra password",
     "password_same_as_email": "La tua password sembra coincidere con la tua email, per favore fornisci un'altra password.",
-    "weak_password": "Weak password.",
+    "weak_password": "Password debole.",
     "upload_picture": "Carica foto",
     "upload_a_picture": "Carica una foto",
     "remove_uploaded_picture": "Elimina foto caricata",
@@ -85,7 +85,7 @@
     "has_no_posts": "Questo utente non ha ancora scritto niente.",
     "has_no_topics": "Questo utente non ha ancora avviato discussioni.",
     "has_no_watched_topics": "Questo utente non sta osservando discussioni.",
-    "has_no_ignored_topics": "This user hasn't ignored any topics yet.",
+    "has_no_ignored_topics": "Questo utente non sta ignorando discussioni.",
     "has_no_upvoted_posts": "Questo utente non ha ancora apprezzato nessun post.",
     "has_no_downvoted_posts": "Questo utente non ha ancora votato negativamente alcun post",
     "has_no_voted_posts": "Questo utente non ha post votati",
@@ -94,18 +94,18 @@
     "paginate_description": "Non utilizzare lo scroll infinito per discussioni e messaggi",
     "topics_per_page": "Discussioni per Pagina",
     "posts_per_page": "Post per Pagina",
-    "max_items_per_page": "Maximum %1",
+    "max_items_per_page": "Massimo %1",
     "notification_sounds": "Riproduci un suono quando si riceve una notifica",
     "notifications_and_sounds": "Notifiche e Suoni",
     "incoming-message-sound": "Suono messaggio in entrata",
     "outgoing-message-sound": "Suono messaggio in uscita",
     "notification-sound": "Suono di notifica",
     "no-sound": "Nessun suono",
-    "upvote-notif-freq": "Upvote Notification Frequency",
-    "upvote-notif-freq.all": "All Upvotes",
-    "upvote-notif-freq.everyTen": "Every Ten Upvotes",
-    "upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
-    "upvote-notif-freq.disabled": "Disabled",
+    "upvote-notif-freq": "Frequenza Notifiche dei Mi Piace ",
+    "upvote-notif-freq.all": "Tutti i Mi Piace",
+    "upvote-notif-freq.everyTen": "Ogni Dieci Mi Piace",
+    "upvote-notif-freq.logarithmic": "Ogni 10, 100, 1000...",
+    "upvote-notif-freq.disabled": "Disabilitate",
     "browsing": "Impostazioni di Navigazione",
     "open_links_in_new_tab": "Apri i link web in una nuova pagina",
     "enable_topic_searching": "Abilita la ricerca negli argomenti",
diff --git a/public/language/nl/email.json b/public/language/nl/email.json
index 48f35a2c6f..bd474f945e 100644
--- a/public/language/nl/email.json
+++ b/public/language/nl/email.json
@@ -18,7 +18,7 @@
     "reset.notify.text2": "Neem onmiddellijk contact met een beheerder op wanneer je hiervoor geen toestemming hebt gegeven.",
     "digest.notifications": "Er zijn ongelezen notificaties van %1:",
     "digest.latest_topics": "De meest recente onderwerpen van %1",
-    "digest.cta": "Klik hier om deze website te bezoeken %1 ",
+    "digest.cta": "Klik hier om %1 te bezoeken ",
     "digest.unsub.info": "Deze samenvatting hebben we naar je verzonden omdat je dat hebt ingesteld.",
     "digest.no_topics": "In de afgelopen %1 zijn er geen actieve onderwerpen geweest.",
     "digest.day": "dag",
@@ -30,7 +30,7 @@
     "notif.chat.unsub.info": "Deze notificatie is verzonden vanwege de gebruikersinstellingen voor abonnementen.",
     "notif.post.cta": "Klik hier om het volledige bericht te lezen",
     "notif.post.unsub.info": "Deze notificatie is door ons verzonden vanwege gebruikersinstellingen voor abonnementen en berichten.",
-    "notif.cta": "Click here to go to forum",
+    "notif.cta": "Klik hier om naar het forum te gaan",
     "test.text1": "Dit is een testbericht om te verifiëren dat NodeBB de e-mailberichtservice correct heeft opgezet.",
     "unsub.cta": "Klik hier om deze instellingen te wijzigen",
     "banned.subject": "U bent verbannen van %1",
diff --git a/public/language/nl/error.json b/public/language/nl/error.json
index 460254c097..48931aa461 100644
--- a/public/language/nl/error.json
+++ b/public/language/nl/error.json
@@ -119,13 +119,13 @@
     "not-enough-reputation-to-downvote": "Je hebt onvoldoende reputatie om een negatieve stem uit te mogen brengen",
     "not-enough-reputation-to-flag": "Je hebt onvoldoende reputatie om dit bericht aan de beheerders te mogen melden",
     "already-flagged": "Je hebt deze post al gerapporteerd",
-    "self-vote": "You cannot vote on your own post",
+    "self-vote": "Het is niet mogelijk om op je eigen bericht te stemmen",
     "reload-failed": "Tijdens het herladen van \"%1\" is NodeBB een fout of probleem tegengekomen. NodeBB blijft operationeel. Echter het is verstandig om de oorzaak te onderzoeken en wellicht de vorige actie, voor het herladen, ongedaan te maken.",
     "registration-error": "Fout tijdens registratie",
     "parse-error": "Tijdens het verwerken van het antwoord van de server is er iets misgegaan.",
     "wrong-login-type-email": "Gebruik je e-mailadres om in te loggen",
     "wrong-login-type-username": "Gebruik je gebruikersnaam om in te loggen",
-    "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first",
+    "sso-registration-disabled": "Registratie is uitgeschakeld voor %1 accounts, registreer eerst met een e-mailadres",
     "invite-maximum-met": "Je heb het maximum aantal mensen uitgenodigd (%1 van de %2).",
     "no-session-found": "Geen login sessie gevonden!",
     "not-in-room": "Gebruiker niet in de chat",
@@ -135,5 +135,5 @@
     "invalid-home-page-route": "Onbekende homepage route",
     "invalid-session": "Verkeerde sessie combinatie",
     "invalid-session-text": "Het lijkt erop dat je login sessie niet meer actief is of niet langer synchroon is met de server. Ververs de pagina.",
-    "no-topics-selected": "No topics selected!"
+    "no-topics-selected": "Geen onderwerpen geselecteerd!"
 }
\ No newline at end of file
diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json
index c19dbaef83..78ec3289b5 100644
--- a/public/language/nl/notifications.json
+++ b/public/language/nl/notifications.json
@@ -9,7 +9,7 @@
     "continue_to": "Door naar %1",
     "return_to": "Terug naar %1",
     "new_notification": "Nieuwe notificatie",
-    "new_notification_from": "You have a new Notification from %1",
+    "new_notification_from": "Je hebt een nieuwe notificatie van %1",
     "you_have_unread_notifications": "Je hebt nieuwe notificaties.",
     "all": "Alles",
     "topics": "Onderwerpen",
@@ -47,18 +47,18 @@
     "email-confirmed-message": "Bedankt voor het bevestigen van je e-mailadres. Je account is nu volledig geactiveerd.",
     "email-confirm-error-message": "Er was een probleem met het bevestigen van dit e-mailadres. Misschien is de code niet goed ingevoerd of was de beschikbare tijd inmiddels verstreken.",
     "email-confirm-sent": "Bevestigingsmail verstuurd.",
-    "none": "None",
-    "notification_only": "Notification Only",
-    "email_only": "Email Only",
-    "notification_and_email": "Notification & Email",
-    "notificationType_upvote": "When someone upvotes your post",
-    "notificationType_new-topic": "When someone you follow posts a topic",
-    "notificationType_new-reply": "When a new reply is posted in a topic you are watching",
-    "notificationType_follow": "When someone starts following you",
-    "notificationType_new-chat": "When you receive a chat message",
-    "notificationType_group-invite": "When you receive a group invite",
-    "notificationType_new-register": "When someone gets added to registration queue",
-    "notificationType_post-queue": "When a new post is queued",
-    "notificationType_new-post-flag": "When a post is flagged",
-    "notificationType_new-user-flag": "When a user is flagged"
+    "none": "Geen",
+    "notification_only": "Alleen notificatie",
+    "email_only": "Alleen e-mail",
+    "notification_and_email": "Notificatie & e-mail",
+    "notificationType_upvote": "Als iemand positief stemt voor je bericht",
+    "notificationType_new-topic": "Wanneer iemand die jij volgt een onderwerp post",
+    "notificationType_new-reply": "Als een nieuwe reactie komt op een onderwerp dat je volgt",
+    "notificationType_follow": "Als iemand begint met jou te volgen",
+    "notificationType_new-chat": "Als je een chat-bericht ontvangt",
+    "notificationType_group-invite": "Als je een uitnodiging voor een groep ontvangt",
+    "notificationType_new-register": "Als iemand wordt toegevoegd aan een registratiewachtrij",
+    "notificationType_post-queue": "Als een bericht aan de wachtrij wordt toegevoegd",
+    "notificationType_new-post-flag": "Als een bericht wordt gevlagd",
+    "notificationType_new-user-flag": "Als een gebruiker wordt gevlagd"
 }
\ No newline at end of file
diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json
index b1d33fd9da..29b4eb9e75 100644
--- a/public/language/nl/topic.json
+++ b/public/language/nl/topic.json
@@ -68,8 +68,8 @@
     "thread_tools.restore_confirm": "Zeker weten dit onderwerp te herstellen?",
     "thread_tools.purge": "Wis onderwerp ",
     "thread_tools.purge_confirm": "Weet je zeker dat je dit onderwerp wil verwijderen?",
-    "thread_tools.merge_topics": "Merge Topics",
-    "thread_tools.merge": "Merge",
+    "thread_tools.merge_topics": "Onderwerpen samenvoegen",
+    "thread_tools.merge": "Samenvoegen",
     "topic_move_success": "Verplaatsen van onderwerp naar %1 succesvol",
     "post_delete_confirm": "Is het absoluut de bedoeling dit bericht te verwijderen?",
     "post_restore_confirm": "Is het de bedoeling dit bericht te herstellen?",
@@ -91,7 +91,7 @@
     "fork_pid_count": "%1 bericht(en) geselecteerd",
     "fork_success": "Onderwerp is succesvol afgesplitst. Klik hier om het nieuwe onderwerp te zien.",
     "delete_posts_instruction": "Klik op de berichten die verwijderd moeten worden",
-    "merge_topics_instruction": "Click the topics you want to merge",
+    "merge_topics_instruction": "Klik op de onderwerpen die samengevoegd moeten worden",
     "composer.title_placeholder": "Voer hier de titel van het onderwerp in...",
     "composer.handle_placeholder": "Naam",
     "composer.discard": "Annuleren",
diff --git a/public/language/nl/user.json b/public/language/nl/user.json
index 6351ae8827..9c2af5d6f5 100644
--- a/public/language/nl/user.json
+++ b/public/language/nl/user.json
@@ -101,11 +101,11 @@
     "outgoing-message-sound": "Uitgaand bericht geluid",
     "notification-sound": "Notificatie geluid",
     "no-sound": "Geen geluid",
-    "upvote-notif-freq": "Upvote Notification Frequency",
-    "upvote-notif-freq.all": "All Upvotes",
-    "upvote-notif-freq.everyTen": "Every Ten Upvotes",
-    "upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
-    "upvote-notif-freq.disabled": "Disabled",
+    "upvote-notif-freq": "Notificatie frequentie voor Upvotes",
+    "upvote-notif-freq.all": "Alle Upvotes",
+    "upvote-notif-freq.everyTen": "Elke tien Upvotes",
+    "upvote-notif-freq.logarithmic": "Bij 10, 100, 1000...",
+    "upvote-notif-freq.disabled": "Uitgeschakeld",
     "browsing": "Instellingen voor bladeren",
     "open_links_in_new_tab": "Open uitgaande links naar een externe site in een nieuw tabblad",
     "enable_topic_searching": "Inschakelen mogelijkheid op onderwerp te kunnen zoeken",
diff --git a/public/language/vi/admin/admin.json b/public/language/vi/admin/admin.json
index 726cef0e8b..8fdf8c210a 100644
--- a/public/language/vi/admin/admin.json
+++ b/public/language/vi/admin/admin.json
@@ -1,5 +1,5 @@
 {
-	"alert.confirm-reload": "Bạn có thật sự muốn tải lại NodeBB",
+	"alert.confirm-reload": "Bạn có thật sự muốn xác lập lại NodeBB",
 	"alert.confirm-restart": "Bạn có thật sự muốn khởi động lại NodeBB",
 
 	"acp-title": "%1 | Bảng điểu khiển",
diff --git a/public/language/vi/admin/advanced/cache.json b/public/language/vi/admin/advanced/cache.json
index 505b1a4510..d8b94de7a9 100644
--- a/public/language/vi/admin/advanced/cache.json
+++ b/public/language/vi/admin/advanced/cache.json
@@ -1,5 +1,5 @@
 {
-	"post-cache": "Cache bài viết",
+	"post-cache": "Bộ nhớ đệm bài viết",
 	"posts-in-cache": "Cache cho bài viết",
 	"average-post-size": "Kích thước bài viết",
 	"length-to-max": "Độ dài / Tối Đa",
diff --git a/public/language/vi/admin/settings/email.json b/public/language/vi/admin/settings/email.json
index 50ad2e06ea..96fb624791 100644
--- a/public/language/vi/admin/settings/email.json
+++ b/public/language/vi/admin/settings/email.json
@@ -1,5 +1,5 @@
 {
-	"email-settings": "Email Settings",
+	"email-settings": "Thiết lập Email",
 	"address": "Email Address",
 	"address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.",
 	"from": "From Name",
diff --git a/public/language/vi/category.json b/public/language/vi/category.json
index 494fa8b153..f9cf6a500a 100644
--- a/public/language/vi/category.json
+++ b/public/language/vi/category.json
@@ -8,13 +8,13 @@
     "no_replies": "Chưa có bình luận nào",
     "no_new_posts": "Không có bài mới.",
     "share_this_category": "Chia sẻ chuyên mục này",
-    "watch": "Theo dõi",
+    "watch": "Quan tâm",
     "ignore": "Bỏ qua",
-    "watching": "Đang theo dõi",
+    "watching": "Đang quan tâm",
     "ignoring": "Bỏ qua",
     "watching.description": "Hiện các chủ đề chưa đọc",
     "ignoring.description": "Không hiện những chủ đề chưa đọc",
     "watch.message": "Bạn đang theo dõi các cập nhật ở chuyên mục này và các chuyên mục con",
     "ignore.message": "Bạn đang bỏ qua các cập nhật ở chuyên mục này và các chuyên mục con",
-    "watched-categories": "Các chuyên mục đã xem"
+    "watched-categories": "Các chuyên mục đã quan tâm"
 }
\ No newline at end of file
diff --git a/public/language/vi/email.json b/public/language/vi/email.json
index 5199f136a5..0dc0cc8be6 100644
--- a/public/language/vi/email.json
+++ b/public/language/vi/email.json
@@ -30,12 +30,12 @@
     "notif.chat.unsub.info": "Thông báo tin nhắn này được gửi tới dựa theo cài đặt theo dõi của bạn.",
     "notif.post.cta": "Nhấn vào đây để đọc toàn bộ chủ đề",
     "notif.post.unsub.info": "Thông báo bài viết này được gửi cho bạn dựa tên thiết lập nhận thông báo của bạn",
-    "notif.cta": "Click here to go to forum",
+    "notif.cta": "Click vào đây để đi đến diễn đàn",
     "test.text1": "Đây là email kiểm tra xem chức năng gửi mail trên hệ thống NodeBB của bạn có hoạt động tốt hay không.",
     "unsub.cta": "Nhấn vào đây để thay đổi cài đặt.",
-    "banned.subject": "You have been banned from %1",
-    "banned.text1": "The user %1 has been banned from %2.",
-    "banned.text2": "This ban will last until %1.",
-    "banned.text3": "This is the reason why you have been banned:",
+    "banned.subject": "Bạn đã bị cấm khỏi %1",
+    "banned.text1": "Người dùng %1 đã bị cấm khỏi %2",
+    "banned.text2": "Lệnh cấm sẽ kéo dài đến %1.",
+    "banned.text3": "Đây là lý do tại sao bạn bị cấm:",
     "closing": "Xin cảm ơn!"
 }
\ No newline at end of file
diff --git a/public/language/vi/error.json b/public/language/vi/error.json
index 894ab8a3c6..490b661dd3 100644
--- a/public/language/vi/error.json
+++ b/public/language/vi/error.json
@@ -1,20 +1,20 @@
 {
     "invalid-data": "Dữ liệu không hợp lệ",
-    "invalid-json": "Invalid JSON",
+    "invalid-json": "JSON không hợp lệ",
     "not-logged-in": "Có vẻ bạn chưa đăng nhập.",
     "account-locked": "Tài khoản của bạn đang tạm thời bị khóa",
     "search-requires-login": "Bạn cần phải có tài khoản để tìm kiếm - vui lòng đăng nhập hoặc đăng ký.",
-    "goback": "Press back to return to the previous page",
+    "goback": "Nhấn back để quay về trang trước",
     "invalid-cid": "ID chuyên mục không hợp lệ",
     "invalid-tid": "ID chủ đề không hợp lệ",
     "invalid-pid": "ID bài viết không hợp lệ",
     "invalid-uid": "ID tài khoản không hợp lệ",
     "invalid-username": "Tên đăng nhập không hợp lệ",
     "invalid-email": "Email không hợp lệ",
-    "invalid-title": "Invalid title",
+    "invalid-title": "Tiêu đề không hợp lệ",
     "invalid-user-data": "Dữ liệu tài khoản không hợp lệ",
     "invalid-password": "Mật khẩu không hợp lệ",
-    "invalid-login-credentials": "Invalid login credentials",
+    "invalid-login-credentials": "Thông tin đăng nhập không hợp lệ",
     "invalid-username-or-password": "Xin hãy nhập cả tên đăng nhập và mật khẩu",
     "invalid-search-term": "Từ khóa không hợp lệ",
     "csrf-invalid": "Hệ thống không cho phép bạn đăng nhập, có vẻ như phiên đăng nhập cũ đã hết hạn. Hãy thử đăng nhập lại",
@@ -33,7 +33,7 @@
     "password-too-long": "Mật khẩu quá dài",
     "user-banned": "Tài khoản bị ban",
     "user-banned-reason": "Xin lỗi, tài khoản này đã bị khóa (Lí do: %1)",
-    "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)",
+    "user-banned-reason-until": "Rất tiếc, tài khoản này đã bị cấm cho đến %1 (Lý do: %2)",
     "user-too-new": "Rất tiếc, bạn phải chờ %1 giây để đăng bài viết đầu tiên.",
     "blacklisted-ip": "Rất tiếc, địa chỉ IP của bạn đã bị cấm khỏi cộng đồng. Nếu bạn cảm thấy có gì không đúng, hãy liên lạc với người quản trị.",
     "ban-expiry-missing": "Vui lòng cung cấp ngày hết hạn của lệnh cấm",
@@ -81,7 +81,7 @@
     "cant-ban-other-admins": "Bạn không thể cấm được các quản trị viên khác",
     "cant-remove-last-admin": "Bạn là quản trị viên duy nhất. Hãy cho thành viên khác làm quản trị viên trước khi huỷ bỏ quyền quản trị của bạn.",
     "cant-delete-admin": "Hủy quyền quản trị của tài khoản này trước khi xóa",
-    "invalid-image": "Invalid image",
+    "invalid-image": "Hình ảnh không hợp lệ",
     "invalid-image-type": "Định dạng ảnh không hợp lệ. Những định dạng được cho phép là: %1",
     "invalid-image-extension": "Định dạng ảnh không hợp lệ",
     "invalid-file-type": "Định dạng file không hợp lệ. Những định dạng được cho phép là: %1",
@@ -109,7 +109,7 @@
     "chat-disabled": "Hệ thống chat đã bị vô hiệu hoá",
     "too-many-messages": "Bạn đã gửi quá nhiều tin nhắn, vui lòng đợi trong giây lát.",
     "invalid-chat-message": "Tin nhắn không hợp lệ",
-    "chat-message-too-long": "Chat messages can not be longer than %1 characters.",
+    "chat-message-too-long": "Thông điệp không thể dài hơn %1 chữ.",
     "cant-edit-chat-message": "Bạn không được phép chỉnh sửa tin nhắn này",
     "cant-remove-last-user": "Bạn không thể xoá thành viên cuối cùng",
     "cant-delete-chat-message": "Bạn không được phép xoá tin nhắn này",
@@ -119,13 +119,13 @@
     "not-enough-reputation-to-downvote": "Bạn không có đủ phiếu tín nhiệm để downvote bài này",
     "not-enough-reputation-to-flag": "Bạn không đủ tín nhiệm để đánh dấu bài viết này",
     "already-flagged": "Bạn đã gắn cờ cho bài viết này",
-    "self-vote": "You cannot vote on your own post",
+    "self-vote": "Bạn không thể tự bầu cho bài đăng của mình",
     "reload-failed": "NodeBB gặp lỗi trong khi tải lại: \"%1\". NodeBB sẽ tiếp tục hoạt động với dữ liệu trước đó, tuy nhiên bạn nên tháo gỡ những gì bạn vừa thực hiện trước khi tải lại.",
     "registration-error": "Lỗi đăng kí",
     "parse-error": "Có gì không ổn khi nhận kết quả từ máy chủ",
     "wrong-login-type-email": "Xin vui lòng sửa dụng email của bạn để đăng nhập",
     "wrong-login-type-username": "Vui lòng sử dụng tên đăng nhập của bạn để đăng nhập",
-    "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first",
+    "sso-registration-disabled": "Không thể đăng ký với tài khoản %1, vui lòng đăng ký với địa chỉ email của bạn",
     "invite-maximum-met": "Bạn đã sử dụng hết số lượng lời mời bạn có thể gửi (%1 đã gửi trên tổng số %2 được cho phép)",
     "no-session-found": "Không tìm thấy phiên đăng nhập!",
     "not-in-room": "Thành viên không có trong phòng",
@@ -135,5 +135,5 @@
     "invalid-home-page-route": "Đường dẫn trang chủ không hợp lệ",
     "invalid-session": "Không đúng session",
     "invalid-session-text": "Có vẻ như phiên đăng nhập của bạn đã không còn hoạt động nữa, hoặc không còn đúng với thông tin trên máy chủ. Vui lòng tải lại trang này",
-    "no-topics-selected": "No topics selected!"
+    "no-topics-selected": "Không có chủ đề nào đang được chọn!"
 }
\ No newline at end of file
diff --git a/public/language/vi/global.json b/public/language/vi/global.json
index bca009cd8c..5049b7bed2 100644
--- a/public/language/vi/global.json
+++ b/public/language/vi/global.json
@@ -104,6 +104,6 @@
     "cookies.accept": "Đã rõ!",
     "cookies.learn_more": "Xem thêm",
     "edited": "Đã cập nhật",
-    "disabled": "Disabled",
-    "select": "Select"
+    "disabled": "Bị khóa",
+    "select": "Chọn"
 }
\ No newline at end of file
diff --git a/public/language/vi/language.json b/public/language/vi/language.json
index f0787f748a..e6b933b8af 100644
--- a/public/language/vi/language.json
+++ b/public/language/vi/language.json
@@ -1,5 +1,5 @@
 {
-    "name": "Tiếng Việt",
+    "name": "Tiếng Anh (Anh Quốc/Ca-na-da)",
     "code": "vi",
-    "dir": "ltr"
+    "dir": "Trái qua phải"
 }
\ No newline at end of file
diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json
index 1f3e674954..3605d52d4a 100644
--- a/public/language/vi/notifications.json
+++ b/public/language/vi/notifications.json
@@ -9,17 +9,17 @@
     "continue_to": "Tiếp tục tới %1",
     "return_to": "Quay lại %1",
     "new_notification": "Thông báo mới",
-    "new_notification_from": "You have a new Notification from %1",
+    "new_notification_from": "Bạn nhận được 1 thông báo từ %1",
     "you_have_unread_notifications": "Bạn có thông báo chưa đọc",
-    "all": "All",
-    "topics": "Topics",
-    "replies": "Replies",
-    "chat": "Chats",
-    "follows": "Follows",
-    "upvote": "Upvotes",
-    "new-flags": "New Flags",
-    "my-flags": "Flags assigned to me",
-    "bans": "Bans",
+    "all": "Toàn bộ",
+    "topics": "Chủ đề",
+    "replies": "Phản hồi",
+    "chat": "Thông điệp",
+    "follows": "Lượt theo dõi",
+    "upvote": "Lượt thích",
+    "new-flags": "Cảnh báo mới",
+    "my-flags": "Cảnh báo dành cho tôi",
+    "bans": "Cấm",
     "new_message_from": "Tin nhắn mới từ <strong>%1</strong>",
     "upvoted_your_post_in": "<strong>%1</strong> đã bình chọn bài của bạn trong <strong>%2</strong>.",
     "upvoted_your_post_in_dual": "<strong>%1</strong> và <strong>%2</strong> đã tán thành với bài viết của bạn trong <strong>%3</strong>.",
@@ -29,9 +29,9 @@
     "user_flagged_post_in": "<strong>%1</strong> gắn cờ 1 bài trong <strong>%2</strong>",
     "user_flagged_post_in_dual": "<strong>%1</strong> và <strong>%2</strong> đã gắn cờ một bài viết trong <strong>%3</strong>",
     "user_flagged_post_in_multiple": "<strong>%1</strong> và %2 người khác đã gắn cờ bài viết của bạn trong <strong>%3</strong>",
-    "user_flagged_user": "<strong>%1</strong> flagged a user profile (%2)",
-    "user_flagged_user_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a user profile (%3)",
-    "user_flagged_user_multiple": "<strong>%1</strong> and %2 others flagged a user profile (%3)",
+    "user_flagged_user": "<strong>%1</strong> đã cảnh báo một người dùng (%2)",
+    "user_flagged_user_dual": "<strong>%1</strong> và <strong>%2</strong> đã cảnh báo một người dùng (%3)",
+    "user_flagged_user_multiple": "<strong>%1</strong> và %2 người khác đã cảnh báo người dùng (%3)",
     "user_posted_to": "<strong>%1</strong> đã trả lời <strong>%2</strong>",
     "user_posted_to_dual": "<strong>%1</strong> và <strong>%2</strong> đã trả lời: <strong>%3</strong>",
     "user_posted_to_multiple": "<strong>%1</strong> và %2 người khác đã trả lời: <strong>%3</strong>",
@@ -41,24 +41,24 @@
     "user_started_following_you_multiple": "<strong>%1</strong> và %2 người khác đã bắt đầu theo dõi bạn.",
     "new_register": "<strong>%1</strong> đã gửi một yêu cầu tham gia.",
     "new_register_multiple": "Có <strong>%1</strong> đơn đăng ký đang chờ xem xét.",
-    "flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
-    "post_awaiting_review": "Post awaiting review",
+    "flag_assigned_to_you": "<strong>Cảnh báo %1</strong> đã được ghi nhận đối với bạn",
+    "post_awaiting_review": "Bài đăng đang chờ xét duyệt",
     "email-confirmed": "Đã xác nhận email",
     "email-confirmed-message": "Cảm ơn bạn đã xác nhận địa chỉ email của bạn. Tài khoản của bạn đã được kích hoạt đầy đủ.",
     "email-confirm-error-message": "Đã có lỗi khi xác nhận địa chỉ email. Có thể đoạn mã không đúng hoặc đã hết hạn.",
     "email-confirm-sent": "Email xác nhận đã gửi.",
-    "none": "None",
-    "notification_only": "Notification Only",
-    "email_only": "Email Only",
-    "notification_and_email": "Notification & Email",
-    "notificationType_upvote": "When someone upvotes your post",
-    "notificationType_new-topic": "When someone you follow posts a topic",
-    "notificationType_new-reply": "When a new reply is posted in a topic you are watching",
-    "notificationType_follow": "When someone starts following you",
-    "notificationType_new-chat": "When you receive a chat message",
-    "notificationType_group-invite": "When you receive a group invite",
-    "notificationType_new-register": "When someone gets added to registration queue",
-    "notificationType_post-queue": "When a new post is queued",
-    "notificationType_new-post-flag": "When a post is flagged",
-    "notificationType_new-user-flag": "When a user is flagged"
+    "none": "Hoàn toàn không",
+    "notification_only": "Chỉ thông báo",
+    "email_only": "Chỉ email",
+    "notification_and_email": "Cả thông báo & email",
+    "notificationType_upvote": "Khi ai đó thích bài đăng của bạn",
+    "notificationType_new-topic": "Khi người bạn theo dõi đăng một chủ đề",
+    "notificationType_new-reply": "Khi phản hồi được đăng trong chủ đề bạn đang quan tâm",
+    "notificationType_follow": "Khi ai đó theo dõi bạn",
+    "notificationType_new-chat": "Khi bạn nhận được thông điệp chat",
+    "notificationType_group-invite": "Khi bạn nhận được lời mời gia nhập nhóm",
+    "notificationType_new-register": "Khi ai đó được thêm vào lượt chờ đăng ký",
+    "notificationType_post-queue": "Khi bài đăng được thêm vào lượt chờ",
+    "notificationType_new-post-flag": "Khi bài đăng được cảnh báo",
+    "notificationType_new-user-flag": "Khi người dùng bị cảnh báo"
 }
\ No newline at end of file
diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json
index febfef2060..c70ca5e399 100644
--- a/public/language/vi/pages.json
+++ b/public/language/vi/pages.json
@@ -43,8 +43,8 @@
     "account/groups": "Nhóm của %1",
     "account/bookmarks": "Đã bookmark %1's chủ đề",
     "account/settings": "Thiết lập",
-    "account/watched": "Chủ đề %1 đang theo dõi",
-    "account/ignored": "Topics ignored by %1",
+    "account/watched": "Chủ đề được quan tâm bởi %1",
+    "account/ignored": "Các chủ đề đã bị phớt lờ bởi %1",
     "account/upvoted": "Bài viết %1 tán thành",
     "account/downvoted": "Bài viết %1 phản đối",
     "account/best": "Bài viết hay nhất của %1",
diff --git a/public/language/vi/search.json b/public/language/vi/search.json
index 7e4211c2c8..fc4e78954b 100644
--- a/public/language/vi/search.json
+++ b/public/language/vi/search.json
@@ -8,11 +8,11 @@
     "posted-by": "Đăng bởi",
     "in-categories": "Nằm trong chuyên mục",
     "search-child-categories": "Tìm kiếm chuyên mục con",
-    "has-tags": "Has tags",
+    "has-tags": "Có thẻ bên trong",
     "reply-count": "Số lượt trả lời",
     "at-least": "Tối thiểu",
     "at-most": "Tối đa",
-    "relevance": "Relevance",
+    "relevance": "Mức độ liên quan",
     "post-time": "Thời điểm đăng bài",
     "newer-than": "Mới hơn",
     "older-than": "Cũ hơn",
diff --git a/public/language/vi/success.json b/public/language/vi/success.json
index aff07d84ad..5b5e438697 100644
--- a/public/language/vi/success.json
+++ b/public/language/vi/success.json
@@ -1,7 +1,7 @@
 {
     "success": "Thành công",
     "topic-post": "Bạn đã gửi bài thành công",
-    "post-queued": "Your post is queued for approval.",
+    "post-queued": "Bài đăng của bạn đang được chờ xét duyệt.",
     "authentication-successful": "Xác thực thành công",
     "settings-saved": "Đã lưu thiết lập"
 }
\ No newline at end of file
diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json
index 6f8290fa75..c59553269d 100644
--- a/public/language/vi/topic.json
+++ b/public/language/vi/topic.json
@@ -14,7 +14,7 @@
     "quote": "Trích dẫn",
     "reply": "Trả lời",
     "replies_to_this_post": "%1 trả lời",
-    "one_reply_to_this_post": "1 Reply",
+    "one_reply_to_this_post": "1 Phản hồi",
     "last_reply_time": "Trả lời cuối cùng",
     "reply-as-topic": "Trả lời dưới dạng chủ đề",
     "guest-login-reply": "Hãy đăng nhập để trả lời",
@@ -40,13 +40,13 @@
     "markAsUnreadForAll.success": "Chủ đề đã được đánh dấu là chưa đọc toàn bộ",
     "mark_unread": "Đánh dấu chưa đọc",
     "mark_unread.success": "Chủ đề đã được đánh dấu chưa đọc.",
-    "watch": "Theo dõi",
-    "unwatch": "Ngừng theo dõi",
+    "watch": "Quan tâm",
+    "unwatch": "Ngừng quan tâm",
     "watch.title": "Được thông báo khi có trả lời mới trong chủ đề này",
-    "unwatch.title": "Ngừng theo dõi chủ đề này",
+    "unwatch.title": "Ngừng quan tâm chủ đề này",
     "share_this_post": "Chia sẻ bài viết này",
-    "watching": "Đang xem",
-    "not-watching": "Không xem",
+    "watching": "Đang quan tâm",
+    "not-watching": "Không để ý",
     "ignoring": "Bỏ qua",
     "watching.description": "Thông báo cho tôi các trả lời mới. <br/>Hiển thị các mục chưa đọc",
     "not-watching.description": "Không thông báo tôi các trả lời mới. <br/>Hiển thị mục chưa đọc nếu danh mục bị bỏ qua.",
@@ -59,7 +59,7 @@
     "thread_tools.unlock": "Mở khóa chủ đề",
     "thread_tools.move": "Chuyển chủ đề",
     "thread_tools.move_all": "Chuyển tất cả",
-    "thread_tools.select_category": "Select Category",
+    "thread_tools.select_category": "Chọn chuyện mục",
     "thread_tools.fork": "Tạo bản sao chủ đề",
     "thread_tools.delete": "Xóa chủ đề",
     "thread_tools.delete-posts": "Xoá bài viết",
@@ -68,8 +68,8 @@
     "thread_tools.restore_confirm": "Bạn có muốn phục hồi chủ đề này?",
     "thread_tools.purge": "Xóa hẳn chủ đề",
     "thread_tools.purge_confirm": "Bạn có muốn xóa hẳn chủ đề này?",
-    "thread_tools.merge_topics": "Merge Topics",
-    "thread_tools.merge": "Merge",
+    "thread_tools.merge_topics": "Xác nhập chủ đề",
+    "thread_tools.merge": "Xác nhập",
     "topic_move_success": "Đã chuyển thành công chủ đề này sang %1",
     "post_delete_confirm": "Bạn có chắc là muốn xóa bài gửi này không?",
     "post_restore_confirm": "Bạn có chắc là muốn phục hồi bài gửi này không?",
@@ -91,7 +91,7 @@
     "fork_pid_count": "%1 bài viết(s) đã được gửi",
     "fork_success": "Tạo bản sao thành công! Nhấn vào đây để chuyển tới chủ đề vừa tạo.",
     "delete_posts_instruction": "Chọn những bài viết bạn muốn xoá",
-    "merge_topics_instruction": "Click the topics you want to merge",
+    "merge_topics_instruction": "Click vào các chủ đề bạn muốn xác nhập",
     "composer.title_placeholder": "Nhập tiêu đề cho chủ đề của bạn tại đây...",
     "composer.handle_placeholder": "Tên",
     "composer.discard": "Huỷ bỏ",
diff --git a/public/language/vi/unread.json b/public/language/vi/unread.json
index e0609d5e04..3c9d149bac 100644
--- a/public/language/vi/unread.json
+++ b/public/language/vi/unread.json
@@ -9,7 +9,7 @@
     "topics_marked_as_read.success": "Chủ đề được đánh dấu đã đọc",
     "all-topics": "Toàn bộ chủ đề",
     "new-topics": "Các chủ đề mới",
-    "watched-topics": "Các chủ đề đã xem",
-    "unreplied-topics": "Unreplied Topics",
-    "multiple-categories-selected": "Multiple Selected"
+    "watched-topics": "Các chủ đề đuợc quan tâm",
+    "unreplied-topics": "Chủ đề chưa có phản hồi nào",
+    "multiple-categories-selected": "Chọn nhiều cùng lúc"
 }
\ No newline at end of file
diff --git a/public/language/vi/user.json b/public/language/vi/user.json
index fb7413330f..03fb99398e 100644
--- a/public/language/vi/user.json
+++ b/public/language/vi/user.json
@@ -24,17 +24,17 @@
     "profile_views": "Số lượt người ghé thăm",
     "reputation": "Mức uy tín",
     "bookmarks": "Bookmarks",
-    "watched": "Đã theo dõi",
-    "ignored": "Ignored",
+    "watched": "Đã quan tâm",
+    "ignored": "Phớt lờ",
     "followers": "Số người theo dõi",
     "following": "Đang theo dõi",
     "aboutme": "Giới thiệu bản thân",
     "signature": "Chữ ký",
     "birthday": "Ngày sinh ",
     "chat": "Chat",
-    "chat_with": "Continue chat with %1",
-    "new_chat_with": "Start new chat with %1",
-    "flag-profile": "Flag Profile",
+    "chat_with": "Tiếp tục chat với %1",
+    "new_chat_with": "Bắt đầu chat với %1",
+    "flag-profile": "Cảnh báo người dùng",
     "follow": "Theo dõi",
     "unfollow": "Hủy theo dõi",
     "more": "Xem thêm",
@@ -61,14 +61,14 @@
     "username_taken_workaround": "Tên truy cập này đã tồn tại, vì vậy chúng tôi đã sửa đổi nó một chút. Tên truy cập của bạn giờ là <strong>%1</strong>",
     "password_same_as_username": "Mật khẩu của bạn trùng với tên đăng nhập, vui lòng chọn một mật khẩu khác.",
     "password_same_as_email": "Mật khẩu của bạn trùng với email của bạn, hãy chọn mật khẩu khác.",
-    "weak_password": "Weak password.",
+    "weak_password": "Mật khẩu yếu",
     "upload_picture": "Tải lên hình ảnh",
     "upload_a_picture": "Tải lên một hình ảnh",
     "remove_uploaded_picture": "Xoá ảnh đã tải lên",
     "upload_cover_picture": "Tải ảnh bìa lên",
-    "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
-    "crop_picture": "Crop picture",
-    "upload_cropped_picture": "Crop and upload",
+    "remove_cover_picture_confirm": "Bạn có thật sự muốn xóa hình ảnh này?",
+    "crop_picture": "Cắt nhỏ hình ảnh",
+    "upload_cropped_picture": "Cắt nhỏ và đăng tải",
     "settings": "Thiết lập",
     "show_email": "Hiện Email của tôi",
     "show_fullname": "Hiện tên đầy đủ",
@@ -84,8 +84,8 @@
     "follows_no_one": "Người dùng này hiện chưa theo dõi ai :(",
     "has_no_posts": "Thành viên này chưa đăng bài viết nào cả.",
     "has_no_topics": "Thành viên này chưa đăng chủ đề nào cả.",
-    "has_no_watched_topics": "Thành viên này chưa theo dõi chủ đề nào cả.",
-    "has_no_ignored_topics": "This user hasn't ignored any topics yet.",
+    "has_no_watched_topics": "Thành viên này chưa quan tâm chủ đề nào cả.",
+    "has_no_ignored_topics": "Người dùng này chưa bỏ qua bất cứ chủ đề nào.",
     "has_no_upvoted_posts": "Thành viên này chưa tán thành bài viết nào cả.",
     "has_no_downvoted_posts": "Thành viên này chưa phản đối bài viết nào cả.",
     "has_no_voted_posts": "Thành viên này không có bài viết nào được tán thành.",
@@ -94,18 +94,18 @@
     "paginate_description": "Phân trang chủ đề và bài viết thay vì sử dụng cuộn vô hạn",
     "topics_per_page": "Số chủ đề trong một trang",
     "posts_per_page": "Số bài viết trong một trang",
-    "max_items_per_page": "Maximum %1",
+    "max_items_per_page": "Tối đa %1",
     "notification_sounds": "Phát âm thanh khi bạn nhận được thông báo mới",
     "notifications_and_sounds": "Thông báo & Âm thanh",
     "incoming-message-sound": "Âm báo tin nhắn tới",
     "outgoing-message-sound": "Âm báo tin nhắn đi",
     "notification-sound": "Âm thanh thông báo",
     "no-sound": "Không có âm thanh",
-    "upvote-notif-freq": "Upvote Notification Frequency",
-    "upvote-notif-freq.all": "All Upvotes",
-    "upvote-notif-freq.everyTen": "Every Ten Upvotes",
-    "upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
-    "upvote-notif-freq.disabled": "Disabled",
+    "upvote-notif-freq": "Tần suất thông báo lượt thích",
+    "upvote-notif-freq.all": "Toàn bộ lượt thích",
+    "upvote-notif-freq.everyTen": "Mỗi 10 lượt thích",
+    "upvote-notif-freq.logarithmic": "Cứ mỗi 10, 100, 1000...",
+    "upvote-notif-freq.disabled": "Bị khóa",
     "browsing": "Đang xem cài đặt",
     "open_links_in_new_tab": "Mở link trong tab mới.",
     "enable_topic_searching": "Bật In-topic Searching",
@@ -113,8 +113,8 @@
     "delay_image_loading": "Việc tải ảnh đang bị chậm",
     "image_load_delay_help": "Nếu được bật, toàn bộ ảnh trong chủ đề sẽ chỉ được tải khi người dùng kéo chuột tới",
     "scroll_to_my_post": "Sau khi đăng một trả lời thì hiển thị bài viết mới",
-    "follow_topics_you_reply_to": "Theo dõi những chủ đề mà bạn đã bình luận",
-    "follow_topics_you_create": "Theo dõi những chủ đề do bạn t",
+    "follow_topics_you_reply_to": "Những chủ đề bạn quan tâm và từng bình luận",
+    "follow_topics_you_create": "Theo dõi chủ đề bạn tạo",
     "grouptitle": "Tên nhóm",
     "no-group-title": "Không có tên nhóm",
     "select-skin": "Chọn một giao diện",
@@ -126,9 +126,9 @@
     "sso.title": "Đăng nhập một lần",
     "sso.associated": "Đã liên kết với",
     "sso.not-associated": "Nhấn vào đây để liên kết với",
-    "sso.dissociate": "Dissociate",
-    "sso.dissociate-confirm-title": "Confirm Dissociation",
-    "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
+    "sso.dissociate": "Tách khỏi",
+    "sso.dissociate-confirm-title": "Xác nhận việc tách khỏi",
+    "sso.dissociate-confirm": "Bạn có chắc chắn muốn tách tài khoản của mình khỏi %1?",
     "info.latest-flags": "Cờ mới nhất",
     "info.no-flags": "Không có bài viết nào bị gắn c",
     "info.ban-history": "Lịch sử khóa tài khoản gần đây",
@@ -141,5 +141,5 @@
     "info.email-history": "Lịch sử email",
     "info.moderation-note": "Ghi chú quản lí",
     "info.moderation-note.success": "Đã lưu ghi chú quản l",
-    "info.moderation-note.add": "Add note"
+    "info.moderation-note.add": "Thêm ghi chú"
 }
\ No newline at end of file
diff --git a/public/src/client/footer.js b/public/src/client/footer.js
index 7dcdade78b..7bc187921e 100644
--- a/public/src/client/footer.js
+++ b/public/src/client/footer.js
@@ -75,6 +75,7 @@ define('forum/footer', ['notifications', 'chat', 'components', 'translator'], fu
 		socket.on('event:new_post', onNewPost);
 	}
 
+	// DEPRECATED: remove in 1.8.0
 	if (app.user.uid) {
 		socket.emit('user.getUnreadCounts', function (err, data) {
 			if (err) {
diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js
index 62f6da940e..0094c88f96 100644
--- a/public/src/modules/alerts.js
+++ b/public/src/modules/alerts.js
@@ -117,7 +117,6 @@ define('alerts', ['translator', 'components', 'benchpress'], function (translato
 		alert
 			.on('mouseenter', function () {
 				$(this).css('transition-duration', 0);
-				console.log(this);
 			});
 	}
 
diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js
index a215c19475..8ce876eebe 100644
--- a/public/src/modules/notifications.js
+++ b/public/src/modules/notifications.js
@@ -137,14 +137,14 @@ define('notifications', ['sounds', 'translator', 'components', 'navigator', 'ben
 				return parseInt(a.datetime, 10) > parseInt(b.datetime, 10) ? -1 : 1;
 			});
 
-			translator.toggleTimeagoShorthand();
-			for (var i = 0; i < notifs.length; i += 1) {
-				notifs[i].timeago = $.timeago(new Date(parseInt(notifs[i].datetime, 10)));
-			}
-			translator.toggleTimeagoShorthand();
-
-			Benchpress.parse('partials/notifications_list', { notifications: notifs }, function (html) {
-				notifList.translateHtml(html);
+			translator.toggleTimeagoShorthand(function () {
+				for (var i = 0; i < notifs.length; i += 1) {
+					notifs[i].timeago = $.timeago(new Date(parseInt(notifs[i].datetime, 10)));
+				}
+				translator.toggleTimeagoShorthand();
+				Benchpress.parse('partials/notifications_list', { notifications: notifs }, function (html) {
+					notifList.translateHtml(html);
+				});
 			});
 		});
 	};
diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js
index 817f6095b6..6376d9e4d0 100644
--- a/public/src/modules/translator.js
+++ b/public/src/modules/translator.js
@@ -576,23 +576,29 @@
 			adaptor.getTranslations(language, namespace, callback);
 		},
 
-		toggleTimeagoShorthand: function toggleTimeagoShorthand() {
-			var tmp = assign({}, jQuery.timeago.settings.strings);
-			jQuery.timeago.settings.strings = assign({}, adaptor.timeagoShort);
-			adaptor.timeagoShort = assign({}, tmp);
+		toggleTimeagoShorthand: function toggleTimeagoShorthand(callback) {
+			function toggle() {
+				var tmp = assign({}, jQuery.timeago.settings.strings);
+				jQuery.timeago.settings.strings = assign({}, adaptor.timeagoShort);
+				adaptor.timeagoShort = assign({}, tmp);
+				if (typeof callback === 'function') {
+					callback();
+				}
+			}
+
+			if (!adaptor.timeagoShort) {
+				var languageCode = utils.userLangToTimeagoCode(config.userLang);
+				var originalSettings = assign({}, jQuery.timeago.settings.strings);
+				jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () {
+					adaptor.timeagoShort = assign({}, jQuery.timeago.settings.strings);
+					jQuery.timeago.settings.strings = assign({}, originalSettings);
+					toggle();
+				});
+			} else {
+				toggle();
+			}
 		},
 		prepareDOM: function prepareDOM() {
-			// Load the appropriate timeago locale file,
-			// and correct NodeBB language codes to timeago codes, if necessary
-			var languageCode = utils.userLangToTimeagoCode(config.userLang);
-
-			adaptor.timeagoShort = assign({}, jQuery.timeago.settings.strings);
-
-			jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () {
-				// Switch back to long-form
-				adaptor.toggleTimeagoShorthand();
-			});
-
 			// Add directional code if necessary
 			adaptor.translate('[[language:dir]]', function (value) {
 				if (value && !$('html').attr('data-dir')) {
diff --git a/src/cli/index.js b/src/cli/index.js
index 0bc95a7c6d..aa7ef2c257 100644
--- a/src/cli/index.js
+++ b/src/cli/index.js
@@ -3,7 +3,7 @@
 var fs = require('fs');
 var path = require('path');
 
-var packageInstall = require('../meta/package-install');
+var packageInstall = require('./package-install');
 var dirname = require('./paths').baseDir;
 
 // check to make sure dependencies are installed
@@ -12,12 +12,17 @@ try {
 } catch (e) {
 	if (e.code === 'ENOENT') {
 		console.warn('package.json not found.');
-		console.log('Populating package.json...\n');
+		console.log('Populating package.json...');
 
 		packageInstall.updatePackageFile();
 		packageInstall.preserveExtraneousPlugins();
 
-		console.log('OK'.green + '\n'.reset);
+		try {
+			require('colors');
+			console.log('OK'.green);
+		} catch (e) {
+			console.log('OK');
+		}
 	} else {
 		throw e;
 	}
@@ -33,7 +38,7 @@ try {
 		console.warn('Dependencies not yet installed.');
 		console.log('Installing them now...\n');
 
-		packageInstall.npmInstallProduction();
+		packageInstall.installAll();
 
 		require('colors');
 		console.log('OK'.green + '\n'.reset);
diff --git a/src/meta/package-install.js b/src/cli/package-install.js
similarity index 85%
rename from src/meta/package-install.js
rename to src/cli/package-install.js
index 4dba482b70..e923094b05 100644
--- a/src/meta/package-install.js
+++ b/src/cli/package-install.js
@@ -29,15 +29,27 @@ function updatePackageFile() {
 
 exports.updatePackageFile = updatePackageFile;
 
-function npmInstallProduction() {
-	process.stdout.write('\n');
-	cproc.execSync('npm i --production', {
+function installAll() {
+	process.stdout.write('  started\n'.green);
+
+	var prod = global.env !== 'development';
+	var command = 'npm install';
+	try {
+		var packageManager = require('nconf').get('package_manager');
+		if (packageManager === 'yarn') {
+			command = 'yarn';
+		}
+	} catch (e) {
+		// ignore
+	}
+
+	cproc.execSync(command + (prod ? ' --production' : ''), {
 		cwd: path.join(__dirname, '../../'),
 		stdio: [0, 1, 2],
 	});
 }
 
-exports.npmInstallProduction = npmInstallProduction;
+exports.installAll = installAll;
 
 function preserveExtraneousPlugins() {
 	// Skip if `node_modules/` is not found or inaccessible
diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js
index e67f634f31..a61a711bf7 100644
--- a/src/cli/upgrade-plugins.js
+++ b/src/cli/upgrade-plugins.js
@@ -7,9 +7,18 @@ var cproc = require('child_process');
 var semver = require('semver');
 var fs = require('fs');
 var path = require('path');
+var nconf = require('nconf');
 
 var paths = require('./paths');
 
+var packageManager = nconf.get('package_manager');
+var packageManagerExecutable = packageManager === 'yarn' ? 'yarn' : 'npm';
+var packageManagerInstallArgs = packageManager === 'yarn' ? ['add'] : ['install', '--save'];
+
+if (process.platform === 'win32') {
+	packageManagerExecutable += '.cmd';
+}
+
 var dirname = paths.baseDir;
 
 function getModuleVersions(modules, callback) {
@@ -85,7 +94,7 @@ function getInstalledPlugins(callback) {
 }
 
 function getCurrentVersion(callback) {
-	fs.readFile(path.join(dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) {
+	fs.readFile(path.join(dirname, 'install/package.json'), { encoding: 'utf-8' }, function (err, pkg) {
 		if (err) {
 			return callback(err);
 		}
@@ -106,8 +115,8 @@ function checkPlugins(standalone, callback) {
 
 	async.waterfall([
 		async.apply(async.parallel, {
-			plugins: async.apply(getInstalledPlugins),
-			version: async.apply(getCurrentVersion),
+			plugins: getInstalledPlugins,
+			version: getCurrentVersion,
 		}),
 		function (payload, next) {
 			var toCheck = Object.keys(payload.plugins);
@@ -194,17 +203,16 @@ function upgradePlugins(callback) {
 
 			if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) {
 				console.log('\nUpgrading packages...');
-				var args = ['i'];
-				found.forEach(function (suggestObj) {
-					args.push(suggestObj.name + '@' + suggestObj.suggested);
-				});
+				var args = packageManagerInstallArgs.concat(found.map(function (suggestObj) {
+					return suggestObj.name + '@' + suggestObj.suggested;
+				}));
 
-				cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, function (err) {
-					callback(err, true);
+				cproc.execFile(packageManagerExecutable, args, { stdio: 'ignore' }, function (err) {
+					callback(err, false);
 				});
 			} else {
 				console.log('Package upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade -p'.green + '".'.reset);
-				callback(null, true);
+				callback();
 			}
 		});
 	});
diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js
index 783681bb10..2462f1f168 100644
--- a/src/cli/upgrade.js
+++ b/src/cli/upgrade.js
@@ -3,7 +3,7 @@
 var async = require('async');
 var nconf = require('nconf');
 
-var packageInstall = require('../meta/package-install');
+var packageInstall = require('./package-install');
 var upgrade = require('../upgrade');
 var build = require('../meta/build');
 var db = require('../database');
@@ -16,13 +16,14 @@ var steps = {
 		handler: function (next) {
 			packageInstall.updatePackageFile();
 			packageInstall.preserveExtraneousPlugins();
+			process.stdout.write('  OK\n'.green);
 			next();
 		},
 	},
 	install: {
 		message: 'Bringing base dependencies up to date...',
 		handler: function (next) {
-			packageInstall.npmInstallProduction();
+			packageInstall.installAll();
 			next();
 		},
 	},
@@ -54,11 +55,8 @@ function runSteps(tasks) {
 	tasks = tasks.map(function (key, i) {
 		return function (next) {
 			process.stdout.write('\n' + ((i + 1) + '. ').bold + steps[key].message.yellow);
-			return steps[key].handler(function (err, inhibitOk) {
+			return steps[key].handler(function (err) {
 				if (err) { return next(err); }
-				if (!inhibitOk) {
-					process.stdout.write('  OK'.green + '\n'.reset);
-				}
 				next();
 			});
 		};
diff --git a/src/database/mongo/main.js b/src/database/mongo/main.js
index 278ae6c413..509f19006b 100644
--- a/src/database/mongo/main.js
+++ b/src/database/mongo/main.js
@@ -108,6 +108,7 @@ module.exports = function (db, module) {
 			if (!data) {
 				return callback(null, null);
 			}
+			delete data.expireAt;
 			var keys = Object.keys(data);
 			if (keys.length === 4 && data.hasOwnProperty('_key') && data.hasOwnProperty('score') && data.hasOwnProperty('value')) {
 				return callback(null, 'zset');
diff --git a/src/meta/build.js b/src/meta/build.js
index 2beb5f8af9..552c9aa55c 100644
--- a/src/meta/build.js
+++ b/src/meta/build.js
@@ -212,7 +212,7 @@ function build(targets, callback) {
 		}
 
 		winston.info('[build] Asset compilation successful. Completed in ' + totalTime + 'sec.');
-		callback(null, true);
+		callback();
 	});
 }
 
diff --git a/src/middleware/header.js b/src/middleware/header.js
index ddfe5af7bd..ae245ce78f 100644
--- a/src/middleware/header.js
+++ b/src/middleware/header.js
@@ -6,6 +6,8 @@ var jsesc = require('jsesc');
 
 var db = require('../database');
 var user = require('../user');
+var topics = require('../topics');
+var messaging = require('../messaging');
 var meta = require('../meta');
 var plugins = require('../plugins');
 var navigation = require('../navigation');
@@ -113,10 +115,16 @@ module.exports = function (middleware) {
 							next(null, translated);
 						});
 					},
-					navigation: async.apply(navigation.get),
+					navigation: navigation.get,
 					tags: async.apply(meta.tags.parse, req, data, res.locals.metaTags, res.locals.linkTags),
 					banned: async.apply(user.isBanned, req.uid),
 					banReason: async.apply(user.getBannedReason, req.uid),
+
+					unreadTopicCount: async.apply(topics.getTotalUnread, req.uid),
+					unreadNewTopicCount: async.apply(topics.getTotalUnread, req.uid, 'new'),
+					unreadWatchedTopicCount: async.apply(topics.getTotalUnread, req.uid, 'watched'),
+					unreadChatCount: async.apply(messaging.getUnreadCount, req.uid),
+					unreadNotificationCount: async.apply(user.notifications.getUnreadCount, req.uid),
 				}, next);
 			},
 			function (results, next) {
@@ -136,8 +144,45 @@ module.exports = function (middleware) {
 
 				setBootswatchCSS(templateValues, res.locals.config);
 
+				var unreadCount = {
+					topic: results.unreadTopicCount || 0,
+					newTopic: results.unreadNewTopicCount || 0,
+					watchedTopic: results.unreadWatchedTopicCount || 0,
+					chat: results.unreadChatCount || 0,
+					notification: results.unreadNotificationCount || 0,
+				};
+				Object.keys(unreadCount).forEach(function (key) {
+					if (unreadCount[key] > 99) {
+						unreadCount[key] = '99+';
+					}
+				});
+
+				results.navigation = results.navigation.map(function (item) {
+					if (item.originalRoute === '/unread' && results.unreadTopicCount > 0) {
+						return Object.assign({}, item, {
+							content: unreadCount.topic,
+							iconClass: item.iconClass + ' unread-count',
+						});
+					}
+					if (item.originalRoute === '/unread/new' && results.unreadNewTopicCount > 0) {
+						return Object.assign({}, item, {
+							content: unreadCount.newTopic,
+							iconClass: item.iconClass + ' unread-count',
+						});
+					}
+					if (item.originalRoute === '/unread/watched' && results.unreadWatchedTopicCount > 0) {
+						return Object.assign({}, item, {
+							content: unreadCount.watchedTopic,
+							iconClass: item.iconClass + ' unread-count',
+						});
+					}
+
+					return item;
+				});
+
 				templateValues.browserTitle = results.browserTitle;
 				templateValues.navigation = results.navigation;
+				templateValues.unreadCount = unreadCount;
 				templateValues.metaTags = results.tags.meta;
 				templateValues.linkTags = results.tags.link;
 				templateValues.isAdmin = results.user.isAdmin;
diff --git a/src/navigation/index.js b/src/navigation/index.js
index 9aec34dd25..0712ce79f5 100644
--- a/src/navigation/index.js
+++ b/src/navigation/index.js
@@ -19,15 +19,16 @@ navigation.get = function (callback) {
 			data = data.filter(function (item) {
 				return item && item.enabled;
 			}).map(function (item) {
+				item.originalRoute = item.route;
+
 				if (!item.route.startsWith('http')) {
 					item.route = nconf.get('relative_path') + item.route;
 				}
 
-				for (var i in item) {
-					if (item.hasOwnProperty(i)) {
-						item[i] = translator.unescape(item[i]);
-					}
-				}
+				Object.keys(item).forEach(function (key) {
+					item[key] = translator.unescape(item[key]);
+				});
+
 				return item;
 			});
 
diff --git a/src/notifications.js b/src/notifications.js
index 6a7940d50d..4bf9782e61 100644
--- a/src/notifications.js
+++ b/src/notifications.js
@@ -220,7 +220,7 @@ function pushToUids(uids, notification, callback) {
 		async.eachLimit(uids, 3, function (uid, next) {
 			emailer.send('notification', uid, {
 				path: notification.path,
-				subject: '[[notifications:new_notification_from, ' + meta.config.title + ']]',
+				subject: notification.subject || '[[notifications:new_notification_from, ' + meta.config.title + ']]',
 				intro: utils.stripHTMLTags(notification.bodyShort),
 				body: utils.stripHTMLTags(notification.bodyLong || ''),
 				showUnsubscribe: true,
diff --git a/src/plugins/install.js b/src/plugins/install.js
index 7bd407ca08..da03fd8d71 100644
--- a/src/plugins/install.js
+++ b/src/plugins/install.js
@@ -13,6 +13,23 @@ var meta = require('../meta');
 var pubsub = require('../pubsub');
 var events = require('../events');
 
+var packageManager = nconf.get('package_manager') === 'yarn' ? 'yarn' : 'npm';
+var packageManagerExecutable = packageManager;
+var packageManagerCommands = {
+	yarn: {
+		install: 'add',
+		uninstall: 'remove',
+	},
+	npm: {
+		install: 'install',
+		uninstall: 'uninstall',
+	},
+};
+
+if (process.platform === 'win32') {
+	packageManagerExecutable += '.cmd';
+}
+
 module.exports = function (Plugins) {
 	if (nconf.get('isPrimary') === 'true') {
 		pubsub.on('plugins:toggleInstall', function (data) {
@@ -95,7 +112,7 @@ module.exports = function (Plugins) {
 				setImmediate(next);
 			},
 			function (next) {
-				runNpmCommand(type, id, version || 'latest', next);
+				runPackageManagerCommand(type, id, version || 'latest', next);
 			},
 			function (next) {
 				Plugins.get(id, next);
@@ -107,8 +124,12 @@ module.exports = function (Plugins) {
 		], callback);
 	}
 
-	function runNpmCommand(command, pkgName, version, callback) {
-		cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', [command, pkgName + (command === 'install' ? '@' + version : ''), '--save'], function (err, stdout) {
+	function runPackageManagerCommand(command, pkgName, version, callback) {
+		cproc.execFile(packageManagerExecutable, [
+			packageManagerCommands[packageManager][command],
+			pkgName + (command === 'install' ? '@' + version : ''),
+			'--save',
+		], function (err, stdout) {
 			if (err) {
 				return callback(err);
 			}
@@ -125,7 +146,7 @@ module.exports = function (Plugins) {
 
 	function upgrade(id, version, callback) {
 		async.waterfall([
-			async.apply(runNpmCommand, 'install', id, version || 'latest'),
+			async.apply(runPackageManagerCommand, 'install', id, version || 'latest'),
 			function (next) {
 				Plugins.isActive(id, next);
 			},
diff --git a/src/socket.io/user/ban.js b/src/socket.io/user/ban.js
index a61a9b83ee..66f98eb061 100644
--- a/src/socket.io/user/ban.js
+++ b/src/socket.io/user/ban.js
@@ -1,6 +1,7 @@
 'use strict';
 
 var async = require('async');
+var winston = require('winston');
 
 var user = require('../../user');
 var meta = require('../../meta');
@@ -112,7 +113,12 @@ module.exports = function (SocketUser) {
 					reason: reason,
 				};
 
-				emailer.send('banned', uid, data, next);
+				emailer.send('banned', uid, data, function (err) {
+					if (err) {
+						winston.error('[emailer.send] ' + err.message);
+					}
+					next();
+				});
 			},
 			function (next) {
 				user.ban(uid, until, reason, next);
diff --git a/src/topics/follow.js b/src/topics/follow.js
index cf8754bcc5..aad9c0f079 100644
--- a/src/topics/follow.js
+++ b/src/topics/follow.js
@@ -9,6 +9,7 @@ var notifications = require('../notifications');
 var privileges = require('../privileges');
 var plugins = require('../plugins');
 var utils = require('../utils');
+var meta = require('../meta');
 
 module.exports = function (Topics) {
 	Topics.toggleFollow = function (tid, uid, callback) {
@@ -219,6 +220,7 @@ module.exports = function (Topics) {
 
 				notifications.create({
 					type: 'new-reply',
+					subject: '[' + (meta.config.title || 'NodeBB') + '] ' + title,
 					bodyShort: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + titleEscaped + ']]',
 					bodyLong: postData.content,
 					pid: postData.pid,
diff --git a/src/upgrade.js b/src/upgrade.js
index ae0d70a4c0..f30a5f43d4 100644
--- a/src/upgrade.js
+++ b/src/upgrade.js
@@ -205,7 +205,7 @@ Upgrade.incrementProgress = function (value) {
 	if (this.total) {
 		percentage = Math.floor((this.current / this.total) * 100) + '%';
 		filled = Math.floor((this.current / this.total) * 15);
-		unfilled = Math.min(0, 15 - filled);
+		unfilled = Math.max(0, 15 - filled);
 	}
 
 	readline.cursorTo(process.stdout, 0);
diff --git a/src/widgets/index.js b/src/widgets/index.js
index 968a5e7a9e..1d60664247 100644
--- a/src/widgets/index.js
+++ b/src/widgets/index.js
@@ -31,7 +31,7 @@ widgets.render = function (uid, options, callback) {
 			var returnData = {};
 
 			async.each(locations, function (location, done) {
-				widgetsByLocation[location] = (data.global[location] || []).concat(data[options.template][location] || []);
+				widgetsByLocation[location] = (data[options.template][location] || []).concat(data.global[location] || []);
 
 				if (!widgetsByLocation[location].length) {
 					return done(null, { location: location, widgets: [] });