diff --git a/package.json b/package.json
index 72aa261a1c..6d0d473261 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "name": "nodebb",
   "license": "GPL-3.0",
   "description": "NodeBB Forum",
-  "version": "0.7.2-dev",
+  "version": "0.7.3-dev",
   "homepage": "http://www.nodebb.org",
   "repository": {
     "type": "git",
@@ -49,8 +49,8 @@
     "nodebb-plugin-spam-be-gone": "^0.4.0",
     "nodebb-rewards-essentials": "^0.0.1",
     "nodebb-theme-lavender": "^1.0.48",
-    "nodebb-theme-persona": "^1.0.16",
-    "nodebb-theme-vanilla": "^2.0.14",
+    "nodebb-theme-persona": "^1.0.20",
+    "nodebb-theme-vanilla": "^2.0.16",
     "nodebb-widget-essentials": "^1.0.2",
     "npm": "^2.1.4",
     "passport": "^0.2.1",
diff --git a/public/language/ar/email.json b/public/language/ar/email.json
index 9126d389fa..31c97c34e9 100644
--- a/public/language/ar/email.json
+++ b/public/language/ar/email.json
@@ -1,15 +1,15 @@
 {
     "password-reset-requested": "تم طلب إعادة تعيين كلمة المرور - %1!",
     "welcome-to": "مرحبًا بك في %1",
-    "invite": "Invitation from %1",
+    "invite": "دعوة من %1",
     "greeting_no_name": "مرحبًا",
     "greeting_with_name": "مرحبًا بك يا %1",
     "welcome.text1": "شكرًا على تسجيلك في %1!",
-    "welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي تسجلت به.",
+    "welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.",
     "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.",
     "welcome.cta": "انقر هنا لتفعيل عنوان بريدك الإلكتروني",
-    "invitation.text1": "%1 has invited you to join %2",
-    "invitation.ctr": "Click here to create your account.",
+    "invitation.text1": "%1 قام بدعوتك للانضمام لـ %2",
+    "invitation.ctr": "إضغط هنا لإنشاء حسابك",
     "reset.text1": "لقد توصلنا بطلب إعادة تعيين كلمة المرور الخاصة بك، ربما لكونك قد نسيتها, إن لم يكن الأمر كذلك، المرجو تجاهل هذه الرسالة.",
     "reset.text2": "لمواصلة طلب إعاة تعيين كلمة المرور، الرجاء تتبع هذا الرابط.",
     "reset.cta": "انقر هنا لإعادة تعيين كلمة السر الخاصة بك.",
diff --git a/public/language/ar/error.json b/public/language/ar/error.json
index 9038d1d735..82f31d3ae7 100644
--- a/public/language/ar/error.json
+++ b/public/language/ar/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "لايمكنك التصويت لردك",
     "already-favourited": "لقد سبق وأضفت هذا الرد إلى المفضلة",
diff --git a/public/language/ar/global.json b/public/language/ar/global.json
index 3f6004b948..d2c9af8495 100644
--- a/public/language/ar/global.json
+++ b/public/language/ar/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 من %2",
     "pagination.enter_index": "أدخل الرقم التسلسلي",
     "header.admin": "مدبر نظام",
+    "header.categories": "Categories",
     "header.recent": "حديث",
     "header.unread": "غير مقروء",
     "header.tags": "وسم",
diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json
index 04e4f9b39f..ae753b2d42 100644
--- a/public/language/ar/groups.json
+++ b/public/language/ar/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها",
     "details.hidden": "مخفي",
     "details.hidden_help": "في حالة تفعيل الخيار، لن تظهر المجموعة للعموم والإنضمام إليها سيتلزم دعوة يدوية.",
+    "details.delete_group": "Delete Group",
     "event.updated": "تم تحديث بيانات المجموعة",
-    "event.deleted": "تم حذف المجموعة %1"
+    "event.deleted": "تم حذف المجموعة %1",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/ar/users.json b/public/language/ar/users.json
index d90805ee6b..fe79f3c509 100644
--- a/public/language/ar/users.json
+++ b/public/language/ar/users.json
@@ -11,11 +11,11 @@
     "picture-only": "صورة فقط",
     "invite": "Invite",
     "invitation-email-sent": "An invitation email has been sent to %1",
-    "user_list": "User List",
-    "recent_topics": "Recent Topics",
+    "user_list": "قائمة اﻷعضاء",
+    "recent_topics": "أحدث المواضيع",
     "popular_topics": "Popular Topics",
-    "unread_topics": "Unread Topics",
-    "categories": "Categories",
-    "tags": "Tags",
+    "unread_topics": "المواضيع الغير مقروءة",
+    "categories": "الفئات",
+    "tags": "الكلمات الدلالية",
     "map": "Map"
 }
\ No newline at end of file
diff --git a/public/language/bg/error.json b/public/language/bg/error.json
index fb4ca7f82d..2b45504325 100644
--- a/public/language/bg/error.json
+++ b/public/language/bg/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Като нов потребител, Вие можете да публикувате веднъж на %1 секунда/и, докато не натрупате %2 репутация – моля, изчакайте малко, преди да опитате да публикувате отново",
     "tag-too-short": "Моля, въведете по-дълъг етикет. Етикетите трябва да съдържат поне %1 символ(а)",
     "tag-too-long": "Моля, въведете по-кратък етикет. Етикетите трябва да съдържат не повече от %1 символ(а)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Максималният разрешен размер на файл е %1 КБ – моля, качете по-малък файл",
     "cant-vote-self-post": "Не можете да гласувате за собствената си публикация",
     "already-favourited": "Вече сте отбелязали тази публикация като любима",
diff --git a/public/language/bg/global.json b/public/language/bg/global.json
index 41f4d35262..7c5c0d7e2d 100644
--- a/public/language/bg/global.json
+++ b/public/language/bg/global.json
@@ -9,8 +9,8 @@
     "404.message": "Изглежда сте се опитали да посетите страница, която не съществува. Върнете се към <a href='%1/'>началната страница</a>.",
     "500.title": "Вътрешна грешка.",
     "500.message": "Опа! Изглежда нещо се обърка!",
-    "register": "Регистриране",
-    "login": "Влизане",
+    "register": "Регистрация",
+    "login": "Вход",
     "please_log_in": "Моля, влезте",
     "logout": "Изход",
     "posting_restriction_info": "Публикуването в момента е позволено само за регистрираните потребители. Натиснете тук, за да влезете.",
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 от %2",
     "pagination.enter_index": "Въведете номер",
     "header.admin": "Администратор",
+    "header.categories": "Categories",
     "header.recent": "Скорошни",
     "header.unread": "Непрочетени",
     "header.tags": "Етикети",
@@ -46,8 +47,8 @@
     "online": "На линия",
     "users": "Потребители",
     "topics": "Теми",
-    "posts": "Публикации",
-    "views": "Преглеждания",
+    "posts": "Публ.",
+    "views": "Прегл.",
     "reputation": "Репутация",
     "read_more": "още",
     "more": "Още",
diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json
index a3f89e69fc..1304f49c36 100644
--- a/public/language/bg/groups.json
+++ b/public/language/bg/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Ако е включено, присъединяването към група изисква одобрението на собственика ѝ",
     "details.hidden": "Скрита",
     "details.hidden_help": "Ако е включено, тази група няма да бъде извеждана в списъка от групи и потребителите ще трябва да бъдат поканени лично",
+    "details.delete_group": "Delete Group",
     "event.updated": "Подробностите за групата бяха обновени",
-    "event.deleted": "Групата „%1“ беше изтрита"
+    "event.deleted": "Групата „%1“ беше изтрита",
+    "membership.accept-invitation": "Приемане на поканата",
+    "membership.invitation-pending": "Чакаща покана",
+    "membership.join-group": "Присъединяване към групата",
+    "membership.leave-group": "Напускане на групата",
+    "membership.reject": "Отхвърляне"
 }
\ No newline at end of file
diff --git a/public/language/bn/error.json b/public/language/bn/error.json
index 48c5ac1f87..6de3031ccb 100644
--- a/public/language/bn/error.json
+++ b/public/language/bn/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "আপনি নিজের পোস্টে ভোট দিতে পারবেন না।",
     "already-favourited": "আপনি ইতিমধ্যে এই পোষ্টটি পছন্দের তালিকায় যোগ করেছেন",
diff --git a/public/language/bn/global.json b/public/language/bn/global.json
index e21604d309..31211f44aa 100644
--- a/public/language/bn/global.json
+++ b/public/language/bn/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%2 এর মাঝে %1",
     "pagination.enter_index": "সূচক লিখুন",
     "header.admin": "অ্যাডমিন",
+    "header.categories": "Categories",
     "header.recent": "সাম্প্রতিক",
     "header.unread": "অপঠিত",
     "header.tags": "ট্যাগ",
diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json
index 71b932f26f..dd582c072a 100644
--- a/public/language/bn/groups.json
+++ b/public/language/bn/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/cs/error.json b/public/language/cs/error.json
index 2d441ce0db..693837095e 100644
--- a/public/language/cs/error.json
+++ b/public/language/cs/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Nemůžete hlasovat pro svůj vlastní příspěvek",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/cs/global.json b/public/language/cs/global.json
index a82e94c56e..2e99c31dd6 100644
--- a/public/language/cs/global.json
+++ b/public/language/cs/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 z %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "Administrace",
+    "header.categories": "Categories",
     "header.recent": "Aktuality",
     "header.unread": "Nepřečtené",
     "header.tags": "Tagy",
diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json
index 6f4a368227..7690fb15a5 100644
--- a/public/language/cs/groups.json
+++ b/public/language/cs/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/cs/user.json b/public/language/cs/user.json
index 3089a0e14f..e61d01b6f3 100644
--- a/public/language/cs/user.json
+++ b/public/language/cs/user.json
@@ -2,15 +2,15 @@
     "banned": "Banned",
     "offline": "Offline",
     "username": "Uživatelské jméno",
-    "joindate": "Join Date",
-    "postcount": "Post Count",
+    "joindate": "Datum ragistrace",
+    "postcount": "Počet příspěvků",
     "email": "Email",
     "confirm_email": "Potvrdit email",
-    "ban_account": "Ban Account",
-    "ban_account_confirm": "Do you really want to ban this user?",
-    "unban_account": "Unban Account",
+    "ban_account": "Zablokovat účet",
+    "ban_account_confirm": "Opravdu chcete zablokovat tohoto uživatele?",
+    "unban_account": "Odblokovat účet",
     "delete_account": "Vymazat účet",
-    "delete_account_confirm": "Are you sure you want to delete your account? <br /><strong>This action is irreversible and you will not be able to recover any of your data</strong><br /><br />Enter your username to confirm that you wish to destroy this account.",
+    "delete_account_confirm": "Opravdu chcete smazat váš účet? <br /><strong>Tato akce je nevratná a nebude možné obnovit žádné vaše data.</strong><br /><br /> Pro potvrzení smazání účtu napište vaše uživatelské jméno.",
     "delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
     "fullname": "Jméno a příjmení",
     "website": "Webové stránky",
@@ -22,40 +22,40 @@
     "profile_views": "Zobrazení profilu",
     "reputation": "Reputace",
     "favourites": "Oblíbené",
-    "watched": "Watched",
+    "watched": "Sledován",
     "followers": "Sledují ho",
     "following": "Sleduje",
-    "aboutme": "About me",
+    "aboutme": "O mně",
     "signature": "Podpis",
     "gravatar": "Gravatar",
     "birthday": "Datum narození",
     "chat": "Chat",
-    "follow": "Follow",
-    "unfollow": "Unfollow",
-    "more": "More",
+    "follow": "Sledovat",
+    "unfollow": "Nesledovat",
+    "more": "Více",
     "profile_update_success": "Profil byl úspěšně aktualizován!",
     "change_picture": "Změnit obrázek",
     "edit": "Upravit",
     "uploaded_picture": "Nahraný obrázek",
     "upload_new_picture": "Nahrát nový obrázek",
-    "upload_new_picture_from_url": "Upload New Picture From URL",
+    "upload_new_picture_from_url": "Nahrát nový obrázek z URL",
     "current_password": "Současné heslo",
     "change_password": "Změnit heslo",
     "change_password_error": "Neplatné heslo",
-    "change_password_error_wrong_current": "Your current password is not correct!",
-    "change_password_error_length": "Password too short!",
-    "change_password_error_match": "Passwords must match!",
-    "change_password_error_privileges": "You do not have the rights to change this password.",
-    "change_password_success": "Your password is updated!",
+    "change_password_error_wrong_current": "Současné heslo není správné!",
+    "change_password_error_length": "Heslo je příliš krátké!",
+    "change_password_error_match": "Hesla se neshodují!",
+    "change_password_error_privileges": "Nemáte práva změnit toto heslo.",
+    "change_password_success": "Heslo je aktualizované!",
     "confirm_password": "Potvrzení hesla",
     "password": "Heslo",
     "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as <strong>%1</strong>",
     "upload_picture": "Nahrát obrázek",
     "upload_a_picture": "Nahrát obrázek",
-    "image_spec": "You may only upload PNG, JPG, or GIF files",
+    "image_spec": "Nahrávat lze pouze soubory PNG, JPG a GIF",
     "settings": "Nastavení",
     "show_email": "Zobrazovat můj email v profilu",
-    "show_fullname": "Show My Full Name",
+    "show_fullname": "Zobrazovat celé jméno",
     "restrict_chats": "Only allow chat messages from users I follow",
     "digest_label": "Subscribe to Digest",
     "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule",
diff --git a/public/language/da/error.json b/public/language/da/error.json
index e976631c35..4dd97c89b1 100644
--- a/public/language/da/error.json
+++ b/public/language/da/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Som ny bruger kan du kun skrive et indlæg engang hvert %1. sekund() indtil du har optjent %2 omdømme point - venligst vent et øjeblik før næste indlæg.",
     "tag-too-short": "Indtast et længere tag. Tags skal indeholde mindst %1 karakter(er).",
     "tag-too-long": "Indtast et længere tag. Tags kan ikke være længere end %1 karakter(er).",
+    "not-enough-tags": "Ikke nok tags. Tråde skal have mindst %1 tag(s)",
+    "too-many-tags": "For mange tags. Tråde kan ikke have mere end %1 tag(s)",
     "file-too-big": "Maksimum filstørrelse er %1 kB - venligst overfør en mindre fil",
     "cant-vote-self-post": "Du kan ikke stemme på dit eget indlæg",
     "already-favourited": "Du har allerede føjet dette indlæg til dine favoritter",
diff --git a/public/language/da/global.json b/public/language/da/global.json
index 16164668d1..4317c2776c 100644
--- a/public/language/da/global.json
+++ b/public/language/da/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 ud af %2",
     "pagination.enter_index": "Indtast indeks",
     "header.admin": "Administrator",
+    "header.categories": "Kategorier",
     "header.recent": "Seneste",
     "header.unread": "Ulæst",
     "header.tags": "Etiket",
diff --git a/public/language/da/groups.json b/public/language/da/groups.json
index 41478b7ba0..f7094f1ac1 100644
--- a/public/language/da/groups.json
+++ b/public/language/da/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Hvis aktiveret, så vil det kræve godkendelse af gruppe ejeren for at tilslutte sig en gruppe",
     "details.hidden": "Skjult",
     "details.hidden_help": "Hvis aktiveret, så vil denne gruppe ikke kunne ses i gruppelisten og bruhere skal inviteres manuelt",
+    "details.delete_group": "Delete Group",
     "event.updated": "Gruppe detaljer er blevet opdateret",
-    "event.deleted": "Gruppen \"%1\" er blevet slettet"
+    "event.deleted": "Gruppen \"%1\" er blevet slettet",
+    "membership.accept-invitation": "Acceptér Invitation",
+    "membership.invitation-pending": "Afventende Invitationer",
+    "membership.join-group": "Bliv medlem af gruppe",
+    "membership.leave-group": "Forlad Gruppe",
+    "membership.reject": "Afvis"
 }
\ No newline at end of file
diff --git a/public/language/de/error.json b/public/language/de/error.json
index 210d0067c9..d8150de62e 100644
--- a/public/language/de/error.json
+++ b/public/language/de/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Als neuer Benutzer können Sie nur einen Beitrag innerhalb von %1 Sekunden erstellen - Bitte warten Sie bevor Sie erneut einen Beitrag erstellen.",
     "tag-too-short": "Bitte geben Sie ein längeres Schlagwort ein. Tags sollten mindestens %1 Zeichen enthalten.",
     "tag-too-long": "Bitte geben Sie ein kürzeres Schlagwort ein. Tags können nicht länger als %1 Zeichen sein.",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Die maximale Dateigröße ist %1 kB, bitte laden Sie eine kleinere Datei hoch.",
     "cant-vote-self-post": "Du kannst deinen eigenen Beitrag nicht bewerten",
     "already-favourited": "Dieser Beitrag ist bereits in deinen Favoriten enthalten",
diff --git a/public/language/de/global.json b/public/language/de/global.json
index ace27161a1..690257122e 100644
--- a/public/language/de/global.json
+++ b/public/language/de/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 von %2",
     "pagination.enter_index": "Seitenzahl eingeben",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Aktuell",
     "header.unread": "Ungelesen",
     "header.tags": "Tags",
diff --git a/public/language/de/groups.json b/public/language/de/groups.json
index a99d4ebc36..0f26786358 100644
--- a/public/language/de/groups.json
+++ b/public/language/de/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Wenn aktiviert, setzt ein Gruppenbeitritt die Zustimmung eines Gruppenbesitzers voraus",
     "details.hidden": "Versteckt",
     "details.hidden_help": "Wenn aktiviert, wird diese Gruppe in der Gruppenliste nicht zu finden sein, und Benutzer werden manuell eingeladen werden müssen.",
+    "details.delete_group": "Delete Group",
     "event.updated": "Gruppendetails wurden aktualisiert",
-    "event.deleted": "Die Gruppe \"%1\" wurde gelöscht."
+    "event.deleted": "Die Gruppe \"%1\" wurde gelöscht.",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/el/error.json b/public/language/el/error.json
index bb7745dc46..72a6a3e711 100644
--- a/public/language/el/error.json
+++ b/public/language/el/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Δεν μπορείς να ψηφίσεις την δημοσίευσή σου",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/el/global.json b/public/language/el/global.json
index 4c7e46eb74..6dafd72e02 100644
--- a/public/language/el/global.json
+++ b/public/language/el/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 από %2",
     "pagination.enter_index": "Εισαγωγή Σελίδας",
     "header.admin": "Διαχειριστής",
+    "header.categories": "Categories",
     "header.recent": "Πρόσφατα",
     "header.unread": "Μη αναγνωσμένα",
     "header.tags": "Ετικέτες",
diff --git a/public/language/el/groups.json b/public/language/el/groups.json
index a8496beb01..b81d08c2c4 100644
--- a/public/language/el/groups.json
+++ b/public/language/el/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json
index 56f9f626ff..065234c18d 100644
--- a/public/language/en@pirate/error.json
+++ b/public/language/en@pirate/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "You cannot vote for your own post",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/en@pirate/global.json b/public/language/en@pirate/global.json
index 9c839710b0..e448cf78e0 100644
--- a/public/language/en@pirate/global.json
+++ b/public/language/en@pirate/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 out of %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "Captains only",
+    "header.categories": "Categories",
     "header.recent": "Recent",
     "header.unread": "Undiscovered",
     "header.tags": "Tags",
diff --git a/public/language/en@pirate/groups.json b/public/language/en@pirate/groups.json
index c9ac036475..1e1623c38f 100644
--- a/public/language/en@pirate/groups.json
+++ b/public/language/en@pirate/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/en_GB/groups.json b/public/language/en_GB/groups.json
index dd8b795bcb..fbc841a4d3 100644
--- a/public/language/en_GB/groups.json
+++ b/public/language/en_GB/groups.json
@@ -43,7 +43,14 @@
 	"details.private_help": "If enabled, joining of groups requires approval from a group owner",
 	"details.hidden": "Hidden",
 	"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+	"details.delete_group": "Delete Group",
 
 	"event.updated": "Group details have been updated",
-	"event.deleted": "The group \"%1\" has been deleted"
+	"event.deleted": "The group \"%1\" has been deleted",
+  
+  "membership.accept-invitation": "Accept Invitation",
+  "membership.invitation-pending": "Invitation Pending",
+  "membership.join-group": "Join Group",
+  "membership.leave-group": "Leave Group",
+  "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json
index 56f9f626ff..065234c18d 100644
--- a/public/language/en_US/error.json
+++ b/public/language/en_US/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "You cannot vote for your own post",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/en_US/global.json b/public/language/en_US/global.json
index e47670ae9a..3eb3e1db21 100644
--- a/public/language/en_US/global.json
+++ b/public/language/en_US/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 out of %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Recent",
     "header.unread": "Unread",
     "header.tags": "Tags",
diff --git a/public/language/en_US/groups.json b/public/language/en_US/groups.json
index c9ac036475..1e1623c38f 100644
--- a/public/language/en_US/groups.json
+++ b/public/language/en_US/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/es/category.json b/public/language/es/category.json
index edf0773adc..1eecac4aba 100644
--- a/public/language/es/category.json
+++ b/public/language/es/category.json
@@ -5,7 +5,7 @@
     "browsing": "viendo ahora",
     "no_replies": "Nadie ha respondido aún",
     "share_this_category": "Compartir esta categoría",
-    "watch": "Ver",
+    "watch": "Seguir",
     "ignore": "Ignorar",
     "watch.message": "Ahora estás viendo actualizaciones de esta categoría",
     "ignore.message": "Ahora estás ignorando las actualizaciones de esta categoría"
diff --git a/public/language/es/error.json b/public/language/es/error.json
index f049c9598f..030e014195 100644
--- a/public/language/es/error.json
+++ b/public/language/es/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Como nuevo usuario, solo puedes publicar una vez cada %1 segundo(s) hasta hayas ganado una reputación de %2 - por favor espera antes de volver a publicar",
     "tag-too-short": "Por favor introduce una etiqueta más larga. Las etiquetas deben contener por lo menos %1 caractere(s)",
     "tag-too-long": "Por favor introduce una etiqueta más corta. Las etiquetas no pueden exceder los %1 caractere(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "El tamaño de fichero máximo es de %1 kB - por favor, suba un fichero más pequeño",
     "cant-vote-self-post": "No puedes votar tus propios posts",
     "already-favourited": "Ya ha marcado esta publicación como favorita",
diff --git a/public/language/es/global.json b/public/language/es/global.json
index 6047e4413e..fd67f9c881 100644
--- a/public/language/es/global.json
+++ b/public/language/es/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 de %2",
     "pagination.enter_index": "Introduzca el número",
     "header.admin": "Administración",
+    "header.categories": "Categories",
     "header.recent": "Recientes",
     "header.unread": "No leídos",
     "header.tags": "Etiquetas",
diff --git a/public/language/es/groups.json b/public/language/es/groups.json
index 48bece926e..1da9e025e2 100644
--- a/public/language/es/groups.json
+++ b/public/language/es/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Si está habilitado, entrar en los grupos requiere aprobación de sus propietarios",
     "details.hidden": "Oculto",
     "details.hidden_help": "Si está habilitado, este grupo no aparecerá en los listados de grupos, y los usuarios tendrán que ser invitados manualmente",
+    "details.delete_group": "Delete Group",
     "event.updated": "Los detalles del grupo han sido actualizados",
-    "event.deleted": "El grupo \"%1\" ha sido eliminado"
+    "event.deleted": "El grupo \"%1\" ha sido eliminado",
+    "membership.accept-invitation": "Aceptar Invitación",
+    "membership.invitation-pending": "Invitación Pendiente",
+    "membership.join-group": "Unirse al grupo",
+    "membership.leave-group": "Dejar el grupo",
+    "membership.reject": "Rechazar"
 }
\ No newline at end of file
diff --git a/public/language/es/user.json b/public/language/es/user.json
index a263269463..a78c4eccc9 100644
--- a/public/language/es/user.json
+++ b/public/language/es/user.json
@@ -22,7 +22,7 @@
     "profile_views": "Visitas",
     "reputation": "Reputación",
     "favourites": "Favoritos",
-    "watched": "Visto",
+    "watched": "Suscritos",
     "followers": "Seguidores",
     "following": "Siguiendo",
     "aboutme": "Sobre mí",
diff --git a/public/language/et/email.json b/public/language/et/email.json
index 539e2f4eed..5dd3598445 100644
--- a/public/language/et/email.json
+++ b/public/language/et/email.json
@@ -1,15 +1,15 @@
 {
     "password-reset-requested": "Parooli muutmise taotlus - %1",
     "welcome-to": "Tere tulemast %1 foorumisse",
-    "invite": "Invitation from %1",
+    "invite": "Kutse %1-lt",
     "greeting_no_name": "Tere",
     "greeting_with_name": "Tere %1",
     "welcome.text1": "Täname et oled registreerinud %1 foorumisse!",
     "welcome.text2": "Konto täielikuks aktiveerimiseks peame me kinnitama, et registreerimisel kasutatud e-mail kuulub teile.",
-    "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.",
+    "welcome.text3": "Administraator aktsepteeris teie registreerimise. Te saate nüüd sisse logida oma kasutajanime/parooliga.",
     "welcome.cta": "Vajuta siia, et kinnitada oma e-maili aadress",
-    "invitation.text1": "%1 has invited you to join %2",
-    "invitation.ctr": "Click here to create your account.",
+    "invitation.text1": "%1 kutsus teid gruppi %2",
+    "invitation.ctr": "Vajuta siia, et registreeruda.",
     "reset.text1": "Meile laekus päring parooli muutmiseks. Kui päring ei ole teie poolt esitatud või te ei soovi parooli muuta, siis võite antud kirja ignoreerida.",
     "reset.text2": "Selleks, et jätkata parooli muutmisega vajuta järgnevale lingile:",
     "reset.cta": "Vajuta siia, et taotleda uut parooli",
diff --git a/public/language/et/error.json b/public/language/et/error.json
index e41b323cfe..865e8cdc76 100644
--- a/public/language/et/error.json
+++ b/public/language/et/error.json
@@ -2,7 +2,7 @@
     "invalid-data": "Vigased andmed",
     "not-logged-in": "Sa ei ole sisse logitud",
     "account-locked": "Su kasutaja on ajutiselt lukustatud",
-    "search-requires-login": "Searching requires an account - please login or register.",
+    "search-requires-login": "Otsing nõuab kasutajat - palun registreeruge või logige sisse.",
     "invalid-cid": "Vigane kategooria ID",
     "invalid-tid": "Vigane teema ID",
     "invalid-pid": "Vigane postituse ID",
@@ -21,11 +21,11 @@
     "email-not-confirmed-chat": "Sõnumeid ei ole võimalik enne saata kui sinu email on kinnitatud. Kinnitamiseks vajuta siia.",
     "no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email",
     "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.",
-    "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.",
+    "confirm-email-already-sent": "Kinnituskiri on juba saadetud, palun oota %1 minut(it) uue saatmiseks.",
     "username-too-short": "Kasutajanimi on liiga lühike",
     "username-too-long": "Kasutajanimi on liiga pikk",
     "user-banned": "Kasutaja bannitud",
-    "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
+    "user-too-new": "Vabandust, te peate ootama %1 sekund(it) enne esimese postituse loomist.",
     "no-category": "Kategooriat ei eksisteeri",
     "no-topic": "Teemat ei eksisteeri",
     "no-post": "Postitust ei eksisteeri",
@@ -36,22 +36,24 @@
     "no-emailers-configured": "Emaili rakendust ei ole laetud, seega test emaili ei ole võimalik saata",
     "category-disabled": "Kategooria keelatud",
     "topic-locked": "Teema lukustatud",
-    "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting",
+    "post-edit-duration-expired": "Te peate ootama %1 sekund(it), enne kui oma postitust muudate.",
     "still-uploading": "Palun oota, kuni üleslaadimised on laetud.",
-    "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).",
-    "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).",
-    "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).",
-    "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).",
-    "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again",
-    "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
-    "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
-    "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
-    "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
+    "content-too-short": "Palun tehke pikem postitus. Postituse pikkus peab olema vähemalt %1 tähemärk(i).",
+    "content-too-long": "Palun tehke lühem postitus. Postituse pikkus peab olema vähem kui %1 tähemärk(i).",
+    "title-too-short": "Palun sisesta pikem pealkiri. Pealkirjad ei saa olla lühemad kui %1 tähemärk(i).",
+    "title-too-long": "Palun sisesta lühem pealkiri. Pealkirjad ei saa olla pikemad kui %1 tähemärk(i).",
+    "too-many-posts": "Te saate postitada %1 sekundi tagant - palun oodake enne uue postituse tegemist.",
+    "too-many-posts-newbie": "Uue kasutajana saadte postitada vaid iga %1 sekundi tagant, seniks kuni olete teeninud vähemalt %2 reputatsiooni - palun oodake enne uue postituse tegemist.",
+    "tag-too-short": "Palun sisestage pikem märksõna. Märksõna pikkus peab olema vähemalt %1 tähemärk(i).",
+    "tag-too-long": "Palun sisestage lühem märksõna. Märksõna pikkus peab olema vähem kui %1 tähemärk(i).",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
+    "file-too-big": "Maksimaalne üleslaetava faili suurus on %1 kB - valige väiksema mahuga fail.",
     "cant-vote-self-post": "Sa ei saa hääletada enda postituse poolt",
     "already-favourited": "Sa juba märkisid selle postituse lemmikuks",
     "already-unfavourited": "Sa juba eemaldasid selle postituse lemmikute hulgast",
     "cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!",
-    "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin",
+    "cant-remove-last-admin": "Te olete ainus administraator. Lisage keegi teine administraatoriks, enne kui eemaldate endalt administraatori.",
     "invalid-image-type": "Vigane pildi formaat. Lubatud formaadid on: %1",
     "invalid-image-extension": "Vigane pildi formaat",
     "invalid-file-type": "Vigane faili formaat. Lubatud formaadid on: %1",
@@ -60,18 +62,18 @@
     "group-name-change-not-allowed": "Grupi nimevahetus ei ole lubatud",
     "group-already-member": "Sa oled juba selle grupi liige",
     "group-needs-owner": "See grupp nõuab vähemalt ühte omanikku",
-    "group-already-invited": "This user has already been invited",
-    "group-already-requested": "Your membership request has already been submitted",
+    "group-already-invited": "Antud kasutaja on juba kutsutud.",
+    "group-already-requested": "Teie liikmetaotlus on juba saadetud.",
     "post-already-deleted": "Postitus on juba kustutatud",
     "post-already-restored": "Postitus on juba taastatud",
     "topic-already-deleted": "Teema on juba kustutatud",
     "topic-already-restored": "Teema on juba taastatud",
-    "cant-purge-main-post": "You can't purge the main post, please delete the topic instead",
+    "cant-purge-main-post": "Te ei saa eemaldada peamist postitust, pigem kustutage teema ära.",
     "topic-thumbnails-are-disabled": "Teema thumbnailid on keelatud.",
     "invalid-file": "Vigane fail",
     "uploads-are-disabled": "Üleslaadimised on keelatud",
-    "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).",
-    "about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).",
+    "signature-too-long": "Vabandage, teie signatuur ei saa olla pikem kui %1 tähemärk(i).",
+    "about-me-too-long": "Vabandage, teie tutvustus ei saa olaa pikem kui %1 tähemärk(i).",
     "cant-chat-with-yourself": "Sa ei saa endaga vestelda!",
     "chat-restricted": "Kasutaja on piiranud sõnumite saatmist. Privaatsõnumi saatmiseks peab kasutaja sind jälgima",
     "too-many-messages": "Oled saatnud liiga palju sõnumeid, oota natukene.",
@@ -79,7 +81,7 @@
     "downvoting-disabled": "Negatiivsete häälte andmine ei ole võimaldatud",
     "not-enough-reputation-to-downvote": "Sul ei ole piisavalt reputatsiooni, et anda negatiivset hinnangut sellele postitusele.",
     "not-enough-reputation-to-flag": "Sul ei ole piisavalt reputatsiooni, et seda postitust raporteerida",
-    "already-flagged": "You have already flagged this post",
+    "already-flagged": "Te juba teatasite sellest postitusest.",
     "reload-failed": "\"%1\" värskendamisel tekkis süsteemne viga. Foorum ei lakka töötamast, kuid peaksid kindlasti eemaldama enne värskendamist tehtud muudatused.",
     "registration-error": "Viga registreerimisel",
     "parse-error": "Midagi läks valesti...",
diff --git a/public/language/et/global.json b/public/language/et/global.json
index 25c37dbd4c..153c49c35d 100644
--- a/public/language/et/global.json
+++ b/public/language/et/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 kõigist %2-st",
     "pagination.enter_index": "Sisetage indeks",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Hiljutised",
     "header.unread": "Lugemata",
     "header.tags": "Märksõnad",
@@ -50,7 +51,7 @@
     "views": "Vaatamist",
     "reputation": "Reputatsioon",
     "read_more": "loe veel",
-    "more": "More",
+    "more": "Rohkem",
     "posted_ago_by_guest": "postitas %1 külaline",
     "posted_ago_by": "postitas %1 kasutaja %2",
     "posted_ago": "postitatud %1",
diff --git a/public/language/et/groups.json b/public/language/et/groups.json
index a94a4f28af..1ddeb7ce14 100644
--- a/public/language/et/groups.json
+++ b/public/language/et/groups.json
@@ -6,12 +6,12 @@
     "no_groups_found": "Ei ole ühtegi gruppi",
     "pending.accept": "Aktsepteeri",
     "pending.reject": "Lükka tagasi",
-    "pending.accept_all": "Accept All",
-    "pending.reject_all": "Reject All",
-    "pending.none": "There are no pending members at this time",
-    "invited.none": "There are no invited members at this time",
-    "invited.uninvite": "Rescind Invitation",
-    "invited.search": "Search for a user to invite to this group",
+    "pending.accept_all": "Aktsepteeri kõik",
+    "pending.reject_all": "Lükka kõik tagasi",
+    "pending.none": "Hetkel ei ole ootel kasutajaid",
+    "invited.none": "Hetkel ei ole kutsutud kasutajaid",
+    "invited.uninvite": "Tühistage kutse",
+    "invited.search": "Otsige kasutajat, keda kutsuda antud gruppi.",
     "cover-instructions": "Lohista kaanepilt siia ning vajuta <strong>salvesta</strong>",
     "cover-change": "Muuda",
     "cover-save": "Salvesta",
@@ -19,7 +19,7 @@
     "details.title": "Grupi detailid",
     "details.members": "Liikmete nimekiri",
     "details.pending": "Otsust ootavad liikmed",
-    "details.invited": "Invited Members",
+    "details.invited": "Kutsutud liikmed",
     "details.has_no_posts": "Selle grupi liikmed ei ole teinud ühtegi postitust.",
     "details.latest_posts": "Viimased postitused",
     "details.private": "Privaatne",
@@ -38,6 +38,12 @@
     "details.private_help": "Kui sisse lülitatud, siis grupiga liitumine nõuab grupi omaniku nõusolekut",
     "details.hidden": "Peidetud",
     "details.hidden_help": "Kui sisse lülitatud, siis seda gruppi ei kuvata gruppide nimekirjas ning liikmed tuleb lisada manuaalselt",
+    "details.delete_group": "Delete Group",
     "event.updated": "Grupi lisainformatsiooni on uuendatud",
-    "event.deleted": "Grupp \"%1\" on kustutatud"
+    "event.deleted": "Grupp \"%1\" on kustutatud",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json
index fc4f6a9ea9..b20db58c6b 100644
--- a/public/language/et/notifications.json
+++ b/public/language/et/notifications.json
@@ -20,7 +20,7 @@
     "user_posted_topic": "<strong>%1</strong> on postitanud uue teema: <strong>%2</strong>",
     "user_mentioned_you_in": "<strong>%1</strong> mainis sind postituses <strong>%2</strong>",
     "user_started_following_you": "<strong>%1</strong> hakkas sind jälgima.",
-    "new_register": "<strong>%1</strong> sent a registration request.",
+    "new_register": "<strong>%1</strong> saatis registratsioonitaotluse.",
     "email-confirmed": "Emaili aadress kinnitatud",
     "email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja on nüüd täielikult aktiveeritud.",
     "email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.",
diff --git a/public/language/et/register.json b/public/language/et/register.json
index 922c163537..cbd042fb68 100644
--- a/public/language/et/register.json
+++ b/public/language/et/register.json
@@ -15,5 +15,5 @@
     "alternative_registration": "Alternatiivne registreerimismeetod",
     "terms_of_use": "Foorumi reeglid",
     "agree_to_terms_of_use": "Nõustun foorumi reeglitega",
-    "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator."
+    "registration-added-to-queue": "Teie registreerimine vaadatakse üle. Te saate e-kirja kui administraator on aktsepteerinud registreermimise."
 }
\ No newline at end of file
diff --git a/public/language/et/search.json b/public/language/et/search.json
index a9f4e17dce..bc26e81081 100644
--- a/public/language/et/search.json
+++ b/public/language/et/search.json
@@ -1,40 +1,40 @@
 {
     "results_matching": "%1 tulemus(t) mis vastavad otsingule \"%2\", (%3 sekundit)",
     "no-matches": "Vasteid ei leitud",
-    "advanced-search": "Advanced Search",
-    "in": "In",
-    "titles": "Titles",
-    "titles-posts": "Titles and Posts",
-    "posted-by": "Posted by",
-    "in-categories": "In Categories",
-    "search-child-categories": "Search child categories",
-    "reply-count": "Reply Count",
-    "at-least": "At least",
-    "at-most": "At most",
-    "post-time": "Post time",
-    "newer-than": "Newer than",
-    "older-than": "Older than",
-    "any-date": "Any date",
-    "yesterday": "Yesterday",
-    "one-week": "One week",
-    "two-weeks": "Two weeks",
-    "one-month": "One month",
-    "three-months": "Three months",
-    "six-months": "Six months",
-    "one-year": "One year",
-    "sort-by": "Sort by",
-    "last-reply-time": "Last reply time",
-    "topic-title": "Topic title",
-    "number-of-replies": "Number of replies",
-    "number-of-views": "Number of views",
-    "topic-start-date": "Topic start date",
-    "username": "Username",
-    "category": "Category",
-    "descending": "In descending order",
-    "ascending": "In ascending order",
-    "save-preferences": "Save preferences",
-    "clear-preferences": "Clear preferences",
-    "search-preferences-saved": "Search preferences saved",
-    "search-preferences-cleared": "Search preferences cleared",
-    "show-results-as": "Show results as"
+    "advanced-search": "Täpsem otsing",
+    "in": "Kus kohast",
+    "titles": "Tiitlid",
+    "titles-posts": "Tiitlid ja postitused",
+    "posted-by": "Autor",
+    "in-categories": "Kategooriates",
+    "search-child-categories": "Otsi vahekategooriatest",
+    "reply-count": "Vastuste arv",
+    "at-least": "Rohkemalt",
+    "at-most": "Vähemalt",
+    "post-time": "Postitamise aeg",
+    "newer-than": "Uuem kui",
+    "older-than": "Vanem kui",
+    "any-date": "Kõik kuupäevad",
+    "yesterday": "Eile",
+    "one-week": "Üks nädal",
+    "two-weeks": "Kaks nädalat",
+    "one-month": "Üks kuu",
+    "three-months": "Kolm kuud",
+    "six-months": "Kuus kuud",
+    "one-year": "Üks aasta",
+    "sort-by": "Sorteeri",
+    "last-reply-time": "Viimase vastuse aeg",
+    "topic-title": "Teema tiitel",
+    "number-of-replies": "Vastuste arv",
+    "number-of-views": "Vaatamiste arv",
+    "topic-start-date": "Teema alguskuupäev",
+    "username": "Kasutajanimi",
+    "category": "Kategooria",
+    "descending": "Kahanevas järjekorras",
+    "ascending": "Kasvavas järjekorras",
+    "save-preferences": "Salvesta eelistused",
+    "clear-preferences": "Kustuta eelistused",
+    "search-preferences-saved": "Otsingueelistused salvestatud",
+    "search-preferences-cleared": "Otsingueelistused kustutatud",
+    "show-results-as": "Näita tulemusi kui"
 }
\ No newline at end of file
diff --git a/public/language/et/topic.json b/public/language/et/topic.json
index 4359384ac4..c96232b554 100644
--- a/public/language/et/topic.json
+++ b/public/language/et/topic.json
@@ -5,7 +5,7 @@
     "no_topics_found": "Teemasid ei leitud!",
     "no_posts_found": "Postitusi ei leitud!",
     "post_is_deleted": "See postitus on kustutatud!",
-    "topic_is_deleted": "This topic is deleted!",
+    "topic_is_deleted": "Antud teema on kustutatud!",
     "profile": "Profiil",
     "posted_by": "Postitas %1",
     "posted_by_guest": "Postitatud külalise ppolt",
diff --git a/public/language/et/unread.json b/public/language/et/unread.json
index f439b6db35..140ff1dd62 100644
--- a/public/language/et/unread.json
+++ b/public/language/et/unread.json
@@ -5,6 +5,6 @@
     "mark_as_read": "Märgi loetuks",
     "selected": "Valitud",
     "all": "Kõik",
-    "all_categories": "All categories",
+    "all_categories": "Kõik kategooriad",
     "topics_marked_as_read.success": "Teemad märgitud loetuks!"
 }
\ No newline at end of file
diff --git a/public/language/et/user.json b/public/language/et/user.json
index d28d82ad70..a697fd2437 100644
--- a/public/language/et/user.json
+++ b/public/language/et/user.json
@@ -6,12 +6,12 @@
     "postcount": "Postitusi",
     "email": "Email",
     "confirm_email": "Kinnita email",
-    "ban_account": "Ban Account",
-    "ban_account_confirm": "Do you really want to ban this user?",
-    "unban_account": "Unban Account",
+    "ban_account": "Bannige kasutaja",
+    "ban_account_confirm": "Kas te tõesti soovite antud kasutajat bannida?",
+    "unban_account": "Eemaldage kontolt ban",
     "delete_account": "Kustuta kasutaja",
     "delete_account_confirm": "Oled kindel, et soovid oma kasutaja kustutada?<br /><strong>Pärast kustutamist pole võimalik andmeid ja kasutajat taastada.</strong><br /><br />Sisesta oma kasutajanimi, et kinnitada kasutaja kustutamine.",
-    "delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
+    "delete_this_account_confirm": "Olete kindel, et soovide seda kasutajat kustutada? <br /><strong>Pärast seda pole võimalik kasutajat ja andmeid taastada</strong><br /><br />",
     "fullname": "Täisnimi",
     "website": "Koduleht",
     "location": "Asukoht",
@@ -25,7 +25,7 @@
     "watched": "Vaadatud",
     "followers": "Jälgijad",
     "following": "Jälgimised",
-    "aboutme": "About me",
+    "aboutme": "Minust",
     "signature": "Allkiri",
     "gravatar": "Gravatar",
     "birthday": "Sünnipäev",
@@ -68,21 +68,21 @@
     "settings-require-reload": "Muudatused seadetes nõuavad lehe uuesti laadimist. Lehe värskendamiseks vajuta siia.",
     "has_no_follower": "Sellel kasutajal pole ühtegi jälgijat :(",
     "follows_no_one": "See kasutaja ei jälgi kedagi :(",
-    "has_no_posts": "This user hasn't posted anything yet.",
-    "has_no_topics": "This user hasn't posted any topics yet.",
-    "has_no_watched_topics": "This user hasn't watched any topics yet.",
+    "has_no_posts": "Antud kasutaja pole veel midagi postitanud.",
+    "has_no_topics": "Antud kasutaja pole veel ühtegi teemat postitanud.",
+    "has_no_watched_topics": "Antud kasutaja pole veel ühtegi teemat vaadanud.",
     "email_hidden": "Peidetud email",
     "hidden": "peidetud",
-    "paginate_description": "Paginate topics and posts instead of using infinite scroll",
+    "paginate_description": "Nummerda leheküljed ja postitused ning ära kasuta lõputut kerimist",
     "topics_per_page": "Teemasi ühe lehekülje kohta",
     "posts_per_page": "Postitusi ühe lehekülje kohta",
-    "notification_sounds": "Play a sound when you receive a notification",
+    "notification_sounds": "Mängi heli, kui teade saabub.",
     "browsing": "Sirvimis sätted",
-    "open_links_in_new_tab": "Open outgoing links in new tab",
+    "open_links_in_new_tab": "Ava väljaminevad lingid uues aknas",
     "enable_topic_searching": "Võimalda teemasisene otsing",
-    "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen",
-    "follow_topics_you_reply_to": "Follow topics that you reply to",
-    "follow_topics_you_create": "Follow topics you create",
+    "topic_search_help": "Kui see on sisse lükatud, siis teemasisene otsing võtab üle brauseri tavapärase otsingu ning võimaldab otsida ainult ekraanile mahtuva teema asemel terve teema ulatuses.",
+    "follow_topics_you_reply_to": "Järgi teemasid, millele olete vastanud.",
+    "follow_topics_you_create": "Järgi teemasi, mis on teie loodud.",
     "grouptitle": "Vali grupile tiitel mida kuvada soovid",
     "no-group-title": "Grupi tiitel puudub"
 }
\ No newline at end of file
diff --git a/public/language/et/users.json b/public/language/et/users.json
index d8d7342f4e..af22195a76 100644
--- a/public/language/et/users.json
+++ b/public/language/et/users.json
@@ -9,13 +9,13 @@
     "filter-by": "Filtreeri",
     "online-only": "Ainult seesolevad",
     "picture-only": "Ainult pilt",
-    "invite": "Invite",
-    "invitation-email-sent": "An invitation email has been sent to %1",
-    "user_list": "User List",
-    "recent_topics": "Recent Topics",
-    "popular_topics": "Popular Topics",
-    "unread_topics": "Unread Topics",
-    "categories": "Categories",
-    "tags": "Tags",
-    "map": "Map"
+    "invite": "Kutsuge",
+    "invitation-email-sent": "Kutse on saadetud e-mailile %1",
+    "user_list": "Kasutajate list",
+    "recent_topics": "Viimased teemad",
+    "popular_topics": "Populaarsed teemad",
+    "unread_topics": "Lugemata teemad",
+    "categories": "Kategooriad",
+    "tags": "Märksõnad",
+    "map": "Kaart"
 }
\ No newline at end of file
diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json
index 0ad12b9ee7..c646650723 100644
--- a/public/language/fa_IR/error.json
+++ b/public/language/fa_IR/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "شما نمی‌توانید به دیدگاه خود رای بدهید.",
     "already-favourited": "شما قبلا این دیدگاه را محبوب کرده اید",
diff --git a/public/language/fa_IR/global.json b/public/language/fa_IR/global.json
index aff826fca3..773931e3ce 100644
--- a/public/language/fa_IR/global.json
+++ b/public/language/fa_IR/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 از %2",
     "pagination.enter_index": "شماره را وارد کنید",
     "header.admin": "مدیر",
+    "header.categories": "Categories",
     "header.recent": "تازه‌ها",
     "header.unread": "نخوانده‌ها",
     "header.tags": "برچسب‌ها",
diff --git a/public/language/fa_IR/groups.json b/public/language/fa_IR/groups.json
index af5126d08a..4309d8390a 100644
--- a/public/language/fa_IR/groups.json
+++ b/public/language/fa_IR/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "اگر فعال باشد، پیوستن به گروه مستلزم موافقت صاحب گروه است",
     "details.hidden": "پنهان",
     "details.hidden_help": "اگر فعال باشد، این گروه در فهرست گروه‌ها پیدا نمی‌شود و کاربران باید دستی فراخوانده شوند",
+    "details.delete_group": "Delete Group",
     "event.updated": "جزییات گروه با موفقیت به روز گردید",
-    "event.deleted": "گروه \"%1\" حدف شد"
+    "event.deleted": "گروه \"%1\" حدف شد",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/fi/error.json b/public/language/fi/error.json
index 076978796a..6d161c7a3e 100644
--- a/public/language/fi/error.json
+++ b/public/language/fi/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Et voi antaa ääntä omalle viestillesi",
     "already-favourited": "Tämä viesti on jo suosikeissasi",
diff --git a/public/language/fi/global.json b/public/language/fi/global.json
index fec566c64b..ddf038b849 100644
--- a/public/language/fi/global.json
+++ b/public/language/fi/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1/%2",
     "pagination.enter_index": "Syötä indeksi",
     "header.admin": "Ylläpitäjä",
+    "header.categories": "Categories",
     "header.recent": "Viimeisimmät",
     "header.unread": "Lukemattomat",
     "header.tags": "Tagit",
diff --git a/public/language/fi/groups.json b/public/language/fi/groups.json
index 019bc0bf24..a2cf33e9ce 100644
--- a/public/language/fi/groups.json
+++ b/public/language/fi/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/fr/error.json b/public/language/fr/error.json
index ac1ac582aa..4b621eea44 100644
--- a/public/language/fr/error.json
+++ b/public/language/fr/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "En tant que nouvel utilisateur, vous ne pouvez poster que toutes les %1 seconde(s) jusqu'à ce que vous obteniez une réputation de %2 - patientez avant de publier de nouveau.",
     "tag-too-short": "Veuillez entrer un mot-clé plus long. Les mots-clés doivent contenir au moins %1 caractère(s).",
     "tag-too-long": "Veuillez entrer un mot-clé plus court. Les mot-clés ne peuvent faire plus de %1 caractère(s).",
+    "not-enough-tags": "Pas assez de tags. Les sujets doivent avoir au moins %1 tag(s).",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "La taille maximale autorisée pour un fichier est de %1 kb. Veuillez envoyer un fichier plus petit.",
     "cant-vote-self-post": "Vous ne pouvez pas voter pour vos propres messages",
     "already-favourited": "Vous avez déjà mis ce message en favoris",
diff --git a/public/language/fr/global.json b/public/language/fr/global.json
index 713ae56634..75faa6dc2e 100644
--- a/public/language/fr/global.json
+++ b/public/language/fr/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 sur %2",
     "pagination.enter_index": "Entrer un numéro de page",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Récent",
     "header.unread": "Non lu",
     "header.tags": "Mots-clés",
diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json
index 0315245c6b..35488f192e 100644
--- a/public/language/fr/groups.json
+++ b/public/language/fr/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Si cette case est cochée, rejoindre un groupe nécessite l'accord d'un propriétaire du groupe.",
     "details.hidden": "Masqué",
     "details.hidden_help": "Si cette case est cochée, ce groupe n'est pas affiché dans la liste des groupes, et les utilisateurs devront être invités manuellement.",
+    "details.delete_group": "Delete Group",
     "event.updated": "Les détails du groupe ont été mis à jour",
-    "event.deleted": "Le groupe \"%1\" a été supprimé"
+    "event.deleted": "Le groupe \"%1\" a été supprimé",
+    "membership.accept-invitation": "Accepter l'invitation",
+    "membership.invitation-pending": "Invitation en attente",
+    "membership.join-group": "Rejoindre le groupe",
+    "membership.leave-group": "Quitter le groupe",
+    "membership.reject": "Refuser"
 }
\ No newline at end of file
diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json
index 7a3649951c..b6c5491426 100644
--- a/public/language/fr/topic.json
+++ b/public/language/fr/topic.json
@@ -35,7 +35,7 @@
     "login_to_subscribe": "Veuillez vous enregistrer ou vous connecter afin de vous abonner à ce sujet.",
     "markAsUnreadForAll.success": "Sujet marqué comme non lu pour tout le monde.",
     "watch": "Suivre",
-    "unwatch": "Ne pas suivre",
+    "unwatch": "Ne plus suivre",
     "watch.title": "Être notifié des nouvelles réponses dans ce sujet",
     "unwatch.title": "Arrêter de suivre ce sujet",
     "share_this_post": "Partager ce message",
diff --git a/public/language/fr/user.json b/public/language/fr/user.json
index c4f02fb5a3..92c82d7042 100644
--- a/public/language/fr/user.json
+++ b/public/language/fr/user.json
@@ -2,7 +2,7 @@
     "banned": "Banni",
     "offline": "Hors-ligne",
     "username": "Nom d'utilisateur",
-    "joindate": "Date d'adhésion",
+    "joindate": "Date d'inscription",
     "postcount": "Nombre de messages",
     "email": "Email",
     "confirm_email": "Confirmer l'adresse email",
@@ -56,7 +56,7 @@
     "settings": "Paramètres",
     "show_email": "Afficher mon email",
     "show_fullname": "Afficher mon nom complet",
-    "restrict_chats": "Autoriser la réception de message uniquement au personne que je suis",
+    "restrict_chats": "Autoriser la réception de messages provenant uniquement des personnes que je suis",
     "digest_label": "S’inscrire aux comptes-rendus",
     "digest_description": "S'abonner par email aux mises à jours de ce forum (nouvelles notifications et nouveaux sujets) selon le planning sélectionné.",
     "digest_off": "Désactivé",
@@ -64,7 +64,7 @@
     "digest_weekly": "Hebdomadaire",
     "digest_monthly": "Mensuel",
     "send_chat_notifications": "Envoyer un e-mail si un nouveau message de chat arrive lorsque je ne suis pas en ligne",
-    "send_post_notifications": "Envoyer un email lors de réponses envoyées aux sujets auxquels je suis abonné.",
+    "send_post_notifications": "Envoyer un email lors de réponses envoyées aux sujets auxquels je suis abonné",
     "settings-require-reload": "Certains réglages nécessitent un rechargement. Cliquez ici pour recharger la page.",
     "has_no_follower": "Cet utilisateur n'est suivi par personne :(",
     "follows_no_one": "Cet utilisateur ne suit personne :(",
@@ -73,10 +73,10 @@
     "has_no_watched_topics": "Cet utilisateur n'a encore consulté aucun sujet.",
     "email_hidden": "Email masqué",
     "hidden": "masqué",
-    "paginate_description": "Utiliser la pagination des sujets et des messages à la place du défilement infini.",
+    "paginate_description": "Utiliser la pagination des sujets et des messages à la place du défilement infini",
     "topics_per_page": "Sujets par page",
     "posts_per_page": "Messages par page",
-    "notification_sounds": "Émettre un son lors de la réception de notifications.",
+    "notification_sounds": "Émettre un son lors de la réception de notifications",
     "browsing": "Paramètres de navigation",
     "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet",
     "enable_topic_searching": "Activer la recherche dans les sujets",
diff --git a/public/language/he/error.json b/public/language/he/error.json
index 9086b3bd09..d0cd6b0db7 100644
--- a/public/language/he/error.json
+++ b/public/language/he/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "לא ניתן להצביע לפוסט שלך",
     "already-favourited": "כבר הוספת פוסט זה למועדפים",
diff --git a/public/language/he/global.json b/public/language/he/global.json
index 2769a2447a..19c2c2096e 100644
--- a/public/language/he/global.json
+++ b/public/language/he/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 מתוך %2",
     "pagination.enter_index": "יש להכניס אינדקס",
     "header.admin": "ניהול",
+    "header.categories": "Categories",
     "header.recent": "פוסטים אחרונים",
     "header.unread": "לא נקרא",
     "header.tags": "תגיות",
diff --git a/public/language/he/groups.json b/public/language/he/groups.json
index ea3f3712c6..0cb4cafcb8 100644
--- a/public/language/he/groups.json
+++ b/public/language/he/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "פרטי הקבוצה עודכנו",
-    "event.deleted": "קבוצת \"%1\" נמחקה"
+    "event.deleted": "קבוצת \"%1\" נמחקה",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/hu/error.json b/public/language/hu/error.json
index 8ca06e3d51..43409ab53e 100644
--- a/public/language/hu/error.json
+++ b/public/language/hu/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Nem szavazhatsz a saját hozzászólásodra",
     "already-favourited": "Már bejelölted Kedvencnek ezt a hozzászólást",
diff --git a/public/language/hu/global.json b/public/language/hu/global.json
index 1411d5d09f..6f3754eb69 100644
--- a/public/language/hu/global.json
+++ b/public/language/hu/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 - %2",
     "pagination.enter_index": "Írj be egy számot",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Friss",
     "header.unread": "Olvasatlan",
     "header.tags": "Címkék",
diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json
index 1865ef5e5d..a5332f50b4 100644
--- a/public/language/hu/groups.json
+++ b/public/language/hu/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/id/error.json b/public/language/id/error.json
index c324329b12..0df935dd38 100644
--- a/public/language/id/error.json
+++ b/public/language/id/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Kamu tidak dapat vote postingan sendiri",
     "already-favourited": "Post ini sudah kamu favorit",
diff --git a/public/language/id/global.json b/public/language/id/global.json
index 2916e6b6a8..338e358642 100644
--- a/public/language/id/global.json
+++ b/public/language/id/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 dari %2",
     "pagination.enter_index": "Masukkan index",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Terbaru",
     "header.unread": "Belum dibaca",
     "header.tags": "Tag",
diff --git a/public/language/id/groups.json b/public/language/id/groups.json
index afc68e933b..d67ca443d1 100644
--- a/public/language/id/groups.json
+++ b/public/language/id/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/it/error.json b/public/language/it/error.json
index 1426a8531b..308a5afa08 100644
--- a/public/language/it/error.json
+++ b/public/language/it/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Non puoi votare il tuo stesso post",
     "already-favourited": "Hai già inserito tra i preferiti questo post",
diff --git a/public/language/it/global.json b/public/language/it/global.json
index 1f5418e698..47269df850 100644
--- a/public/language/it/global.json
+++ b/public/language/it/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 di %2",
     "pagination.enter_index": "Inserisci numero",
     "header.admin": "Amministratore",
+    "header.categories": "Categories",
     "header.recent": "Recenti",
     "header.unread": "Non letti",
     "header.tags": "Tags",
diff --git a/public/language/it/groups.json b/public/language/it/groups.json
index 2daecdf16b..1718c967ac 100644
--- a/public/language/it/groups.json
+++ b/public/language/it/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Se abilitato, l'ingresso ai gruppi richiede l'approvazione di uno dei proprietari",
     "details.hidden": "Nascosto",
     "details.hidden_help": "Se abilitato, questo gruppo non sarà visibile nella lista dei gruppi e gli utenti dovranno essere invitati manualmente",
+    "details.delete_group": "Delete Group",
     "event.updated": "I dettagli del Gruppo sono stati aggiornati",
-    "event.deleted": "Il gruppo \"%1\" è stato eliminato"
+    "event.deleted": "Il gruppo \"%1\" è stato eliminato",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/ja/error.json b/public/language/ja/error.json
index 483afca720..0fead7d402 100644
--- a/public/language/ja/error.json
+++ b/public/language/ja/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "自分のポストに評価することはできません。",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/ja/global.json b/public/language/ja/global.json
index 682771cc8f..043bbbee5a 100644
--- a/public/language/ja/global.json
+++ b/public/language/ja/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 out of %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "管理",
+    "header.categories": "Categories",
     "header.recent": "最近",
     "header.unread": "未読",
     "header.tags": "Tags",
diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json
index c9ac036475..1e1623c38f 100644
--- a/public/language/ja/groups.json
+++ b/public/language/ja/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/ko/error.json b/public/language/ko/error.json
index 715f932578..344fca5493 100644
--- a/public/language/ko/error.json
+++ b/public/language/ko/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "자신의 게시물에는 투표할 수 없습니다.",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/ko/global.json b/public/language/ko/global.json
index 601c60aa19..8b3c19e634 100644
--- a/public/language/ko/global.json
+++ b/public/language/ko/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1개 중 %2개",
     "pagination.enter_index": "이동할 게시물 번호를 입력하세요.",
     "header.admin": "관리자",
+    "header.categories": "Categories",
     "header.recent": "최근 주제",
     "header.unread": "읽지 않은 주제",
     "header.tags": "태그",
diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json
index f2327c674d..ce5f1c3912 100644
--- a/public/language/ko/groups.json
+++ b/public/language/ko/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/lt/error.json b/public/language/lt/error.json
index 4b42d4b09c..9134db77db 100644
--- a/public/language/lt/error.json
+++ b/public/language/lt/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Jūs negalite balsuoti už savo pranešimą",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/lt/global.json b/public/language/lt/global.json
index 3739fcdce6..541becf696 100644
--- a/public/language/lt/global.json
+++ b/public/language/lt/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 iš %2",
     "pagination.enter_index": "Įrašykite indeksą",
     "header.admin": "Administratorius",
+    "header.categories": "Categories",
     "header.recent": "Naujausi",
     "header.unread": "Neskaityti",
     "header.tags": "Žymos",
diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json
index 00eb1d9582..a6e81d61e8 100644
--- a/public/language/lt/groups.json
+++ b/public/language/lt/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Paslėptas",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Grupės informacija atnaujinta",
-    "event.deleted": "Grupė \"%1\" pašalinta"
+    "event.deleted": "Grupė \"%1\" pašalinta",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/ms/error.json b/public/language/ms/error.json
index cde4c21a5f..49b0f5ff86 100644
--- a/public/language/ms/error.json
+++ b/public/language/ms/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Sebagai pengguna baru, anda hanya boleh mengirim sekali setiap %1 saat() sehinnga anda mendapat %2 reputasi - sila tunggu sebelum kiriman seterusnya",
     "tag-too-short": "Sila masukkan tag yang lebih panjang. Tag mesti mengandungi sekurang-kurangnya %1 aksara()",
     "tag-too-long": "Sila masukkan tag yang lebih pendek. Tag mesti mengandungi tidak lebih %1 aksara()",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maksimum saiz fail yang dibenarkan ialah %1 kB - sila muatnaik fail yang lebih kecil",
     "cant-vote-self-post": "Anda tidak boleh mengundi kiriman sendiri",
     "already-favourited": "Anda telah pun menggemari kiriman ini",
diff --git a/public/language/ms/global.json b/public/language/ms/global.json
index c360234332..f35004ec2a 100644
--- a/public/language/ms/global.json
+++ b/public/language/ms/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 out of %2",
     "pagination.enter_index": "Masukkan indeks",
     "header.admin": "Pentadbir",
+    "header.categories": "Categories",
     "header.recent": "Terkini",
     "header.unread": "Belum dibaca",
     "header.tags": "Tags",
diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json
index bb12dd6325..3bc71433f1 100644
--- a/public/language/ms/groups.json
+++ b/public/language/ms/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Jika dibolehkan, menyertai kumpulan memerlukan kelulusan pemilik kumpulan",
     "details.hidden": "Sembunyi",
     "details.hidden_help": "Jika dibolehkan, kumpulan ini tidak akan dijumpai di senarai kumpulan, dan pengguna hendaklah di jemput secara manual",
+    "details.delete_group": "Delete Group",
     "event.updated": "Perincian kumpulan telah dikemaskini",
-    "event.deleted": "Kumpulan \"%1\" telah dipadam"
+    "event.deleted": "Kumpulan \"%1\" telah dipadam",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/nb/error.json b/public/language/nb/error.json
index e530bc925d..fdb5a62f86 100644
--- a/public/language/nb/error.json
+++ b/public/language/nb/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Som en ny bruker kan du bare poste en gang hvert %1. sekund, før du har opparbeidet %2 rykte – vennligst vent før du poster igjen",
     "tag-too-short": "Vennligst skriv en lengre tag. Tagger må være på minst %1 tegn",
     "tag-too-long": "Vennligst skriv en kortere tag. Tagger kan ikke være lengre enn %1 tegn",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Største tillatte filstørrelse er %1 kB – vennligst last opp en mindre fil",
     "cant-vote-self-post": "Du kan ikke stemme på ditt eget innlegg",
     "already-favourited": "Du har allerede favorittmerket dette innlegget",
diff --git a/public/language/nb/global.json b/public/language/nb/global.json
index 4576a39c21..6c5ea5e019 100644
--- a/public/language/nb/global.json
+++ b/public/language/nb/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 ut av %2",
     "pagination.enter_index": "Skriv indeks",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Seneste",
     "header.unread": "Uleste",
     "header.tags": "Tagger",
diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json
index 99fee661d7..62e2979113 100644
--- a/public/language/nb/groups.json
+++ b/public/language/nb/groups.json
@@ -6,8 +6,8 @@
     "no_groups_found": "Det er ingen grupper å se",
     "pending.accept": "Aksepter",
     "pending.reject": "Avslå",
-    "pending.accept_all": "Accept All",
-    "pending.reject_all": "Reject All",
+    "pending.accept_all": "Aksepter al",
+    "pending.reject_all": "Avslå alle",
     "pending.none": "There are no pending members at this time",
     "invited.none": "There are no invited members at this time",
     "invited.uninvite": "Rescind Invitation",
@@ -38,6 +38,12 @@
     "details.private_help": "Hvis aktivert, vil medlemskap i grupper kreve godkjennelse fra en gruppe-eier",
     "details.hidden": "Skjult",
     "details.hidden_help": "vis aktivert, vil denne gruppen ikke bli funnet i gruppelista, og brukere må inviteres manuellt",
+    "details.delete_group": "Delete Group",
     "event.updated": "Gruppedetaljer har blitt oppgradert",
-    "event.deleted": "Gruppen \"%1\" har blitt slettet"
+    "event.deleted": "Gruppen \"%1\" har blitt slettet",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/nb/users.json b/public/language/nb/users.json
index 1b379cc07f..23898fad37 100644
--- a/public/language/nb/users.json
+++ b/public/language/nb/users.json
@@ -9,13 +9,13 @@
     "filter-by": "Filtrer etter",
     "online-only": "Bare påloggede",
     "picture-only": "Bare bilde",
-    "invite": "Invite",
-    "invitation-email-sent": "An invitation email has been sent to %1",
-    "user_list": "User List",
-    "recent_topics": "Recent Topics",
-    "popular_topics": "Popular Topics",
-    "unread_topics": "Unread Topics",
-    "categories": "Categories",
-    "tags": "Tags",
-    "map": "Map"
+    "invite": "Invitér",
+    "invitation-email-sent": "En invitasjons-epost ble sendt til %1",
+    "user_list": "Brukerliste",
+    "recent_topics": "Seneste emner",
+    "popular_topics": "Populære emnter",
+    "unread_topics": "Uleste emner",
+    "categories": "Kategorier",
+    "tags": "Tagger",
+    "map": "Kart"
 }
\ No newline at end of file
diff --git a/public/language/nl/error.json b/public/language/nl/error.json
index 0c9de298df..ccd33cfb02 100644
--- a/public/language/nl/error.json
+++ b/public/language/nl/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Nieuwe gebruikersaccounts zoals deze zijn begrensd en mogen slechts iedere %1 seconde(n) berichten plaatsen, tot het moment dat %2 reputatie verdiend is - wacht daarom even met opnieuw een bericht te plaatsten",
     "tag-too-short": "Geef een tag op die uit meer tekens bestaat. Tags dienen uit minimaal %1 teken(s) te bestaan.",
     "tag-too-long": "Geef een kortere tag op. Tags mogen niet langer dan %1 teken(s) zijn",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum toegestane bestandsgrootte is %1 kB - probeer een kleiner bestand te verzenden",
     "cant-vote-self-post": "Het is niet mogelijk op eigen berichten te stemmen",
     "already-favourited": "Dit bericht staat al tussen de favorieten",
diff --git a/public/language/nl/global.json b/public/language/nl/global.json
index a12b42d659..5540a722fc 100644
--- a/public/language/nl/global.json
+++ b/public/language/nl/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 van %2",
     "pagination.enter_index": "Vul index in",
     "header.admin": "Beheer",
+    "header.categories": "Categories",
     "header.recent": "Recent",
     "header.unread": "Ongelezen",
     "header.tags": "Tags",
diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json
index ac39b79886..d91ad473b0 100644
--- a/public/language/nl/groups.json
+++ b/public/language/nl/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Wanneer ingeschakeld, zal eerst een groepseigenaar goedkeuring moeten verlenen voordat nieuwe leden kunnen toetreden",
     "details.hidden": "Niet getoond",
     "details.hidden_help": "Indien geactiveerd zal deze groep niet getoond worden in de groepslijst en zullen gebruikers handmatig uitgenodigd moeten worden.",
+    "details.delete_group": "Delete Group",
     "event.updated": "Groepsdetails zijn bijgewerkt",
-    "event.deleted": "De groep \"%1\" is verwijderd"
+    "event.deleted": "De groep \"%1\" is verwijderd",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/pl/error.json b/public/language/pl/error.json
index 8d3eb4ac75..198c58b01a 100644
--- a/public/language/pl/error.json
+++ b/public/language/pl/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Nie możesz głosować na własny post",
     "already-favourited": "Już polubiłeś ten post",
diff --git a/public/language/pl/global.json b/public/language/pl/global.json
index 5b6249229e..7200671fce 100644
--- a/public/language/pl/global.json
+++ b/public/language/pl/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 z %2",
     "pagination.enter_index": "Wpisz indeks.",
     "header.admin": "Administracja",
+    "header.categories": "Categories",
     "header.recent": "Ostatnie",
     "header.unread": "Nieprzeczytane",
     "header.tags": "Tagi",
diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json
index d20f679fd7..90c7195a0b 100644
--- a/public/language/pl/groups.json
+++ b/public/language/pl/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Jeśli aktywowane, przystępowanie do grup wymaga zatwierdzenia przez właściciela grupy",
     "details.hidden": "Ukryty",
     "details.hidden_help": "Jeśli aktywowane, ta grupa nie będzie widoczna w wykazie grup, a użytkownicy będą musieli być zapraszani manualnie.",
+    "details.delete_group": "Delete Group",
     "event.updated": "Dane grupy zostały zaktualizowane",
-    "event.deleted": "Grupa \"%1\" została skasowana"
+    "event.deleted": "Grupa \"%1\" została skasowana",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json
index 7ef6b21504..75959666a7 100644
--- a/public/language/pt_BR/error.json
+++ b/public/language/pt_BR/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Como novo usuário, você pode postar uma vez a cada %1 segundo(s) até que você tenha recebido reputação de %2 - por favor aguarde antes de postar novamente",
     "tag-too-short": "Por favor digite uma tag maior. Tags devem conter pelo menos %1 caractere(s)",
     "tag-too-long": "Por favor digite uma tag menor. Tags não podem conter mais que %1 caractere(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "O tamanho máximo permitido de arquivo é %1 kB - por favor faça upload de um arquivo menor",
     "cant-vote-self-post": "Você não pode votar no seu próprio post",
     "already-favourited": "Você já adicionou este post aos favoritos",
diff --git a/public/language/pt_BR/global.json b/public/language/pt_BR/global.json
index 01554381df..75285bba9a 100644
--- a/public/language/pt_BR/global.json
+++ b/public/language/pt_BR/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 de %2",
     "pagination.enter_index": "Digite o índice",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Recente",
     "header.unread": "Não Lido",
     "header.tags": "Tags",
diff --git a/public/language/pt_BR/groups.json b/public/language/pt_BR/groups.json
index 1dde957248..5391da0e8f 100644
--- a/public/language/pt_BR/groups.json
+++ b/public/language/pt_BR/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Se habilitado, a entrada nos grupos requer aprovação de um dos donos do grupo",
     "details.hidden": "Oculto",
     "details.hidden_help": "Se habilitado, este grupo não se encontrará na listagem de grupos e os usuários terão de ser convivados manualmente",
+    "details.delete_group": "Delete Group",
     "event.updated": "Os detalhes do grupo foram atualizados",
-    "event.deleted": "O grupo \"%1\" foi deletado"
+    "event.deleted": "O grupo \"%1\" foi deletado",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/ro/error.json b/public/language/ro/error.json
index 94e87686d6..ce0c232cf4 100644
--- a/public/language/ro/error.json
+++ b/public/language/ro/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Nu poți vota propriul tău mesaj",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/ro/global.json b/public/language/ro/global.json
index 2085d160ab..a7557ad111 100644
--- a/public/language/ro/global.json
+++ b/public/language/ro/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 din %2",
     "pagination.enter_index": "Introdu index",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Recente",
     "header.unread": "Necitite",
     "header.tags": "Taguri",
diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json
index 61871c5fa0..16d4fbb1d3 100644
--- a/public/language/ro/groups.json
+++ b/public/language/ro/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/ru/error.json b/public/language/ru/error.json
index b8705e9b1f..3fdf7412e8 100644
--- a/public/language/ru/error.json
+++ b/public/language/ru/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Вы новый пользователь, поэтому можете делать пост раз в %1 сек., пока не заработаете %2 п. репутации.",
     "tag-too-short": "Слишком короткий тэг. Минимум символов: %1.",
     "tag-too-long": "Слишком длинный тэг. Максимум символов: %1.",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Слишком большой файл. Максимальный размер: %1 Кбайт.",
     "cant-vote-self-post": "Вы не можете проголосовать за Ваш пост",
     "already-favourited": "Вы уже добавили этот пост в избранное",
diff --git a/public/language/ru/global.json b/public/language/ru/global.json
index ae7a4ea57d..7901c29219 100644
--- a/public/language/ru/global.json
+++ b/public/language/ru/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 из %2",
     "pagination.enter_index": "Перейти на главную",
     "header.admin": "Админка",
+    "header.categories": "Categories",
     "header.recent": "Последние",
     "header.unread": "Непрочитанное",
     "header.tags": "Тэги",
diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json
index 015d6dd9c6..d4c115bd0d 100644
--- a/public/language/ru/groups.json
+++ b/public/language/ru/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Если включено, вступление в группы будет подтверждаться владельцем группы",
     "details.hidden": "Скрыто",
     "details.hidden_help": "Если включено, группа не будет показываться в списках, а пользователи должны приглашаться вручную",
+    "details.delete_group": "Delete Group",
     "event.updated": "Настройки группы обновлены",
-    "event.deleted": "Группа \"%1\" удалена"
+    "event.deleted": "Группа \"%1\" удалена",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/sc/error.json b/public/language/sc/error.json
index 56f9f626ff..065234c18d 100644
--- a/public/language/sc/error.json
+++ b/public/language/sc/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "You cannot vote for your own post",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/sc/global.json b/public/language/sc/global.json
index 39432aa228..8017da2a06 100644
--- a/public/language/sc/global.json
+++ b/public/language/sc/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 out of %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "Amministradore",
+    "header.categories": "Categories",
     "header.recent": "Ùrtimos",
     "header.unread": "De lèghere",
     "header.tags": "Tags",
diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json
index c9ac036475..1e1623c38f 100644
--- a/public/language/sc/groups.json
+++ b/public/language/sc/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/sk/error.json b/public/language/sk/error.json
index 7241fdcd59..3fa0032b60 100644
--- a/public/language/sk/error.json
+++ b/public/language/sk/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Nedá sa hlasovať za vlastný príspevok",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/sk/global.json b/public/language/sk/global.json
index 393e734bf7..b722a9567d 100644
--- a/public/language/sk/global.json
+++ b/public/language/sk/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 z %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "Administrácia",
+    "header.categories": "Categories",
     "header.recent": "Aktuality",
     "header.unread": "Neprečítané",
     "header.tags": "tagy",
diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json
index c9ac036475..1e1623c38f 100644
--- a/public/language/sk/groups.json
+++ b/public/language/sk/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/sr/error.json b/public/language/sr/error.json
index 4600fa0a21..4c68c3cf56 100644
--- a/public/language/sr/error.json
+++ b/public/language/sr/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "You cannot vote for your own post",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/sr/global.json b/public/language/sr/global.json
index 013e502c80..17aa370ea0 100644
--- a/public/language/sr/global.json
+++ b/public/language/sr/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 од %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "Админ",
+    "header.categories": "Categories",
     "header.recent": "Недавно",
     "header.unread": "Непрочитано",
     "header.tags": "Ознаке",
diff --git a/public/language/sr/groups.json b/public/language/sr/groups.json
index d8bf883bd3..a4666c6d8f 100644
--- a/public/language/sr/groups.json
+++ b/public/language/sr/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Уколико је укључено,  приступање групи захтева одобрење власника групе.",
     "details.hidden": "Скривена",
     "details.hidden_help": "Уколико је укључено, група неће бити видљива на списку група, и корисницима се позивнице морају слати ручно.",
+    "details.delete_group": "Delete Group",
     "event.updated": "Детаљи групе су ажурирани",
-    "event.deleted": "Група „%1“ је обрисана"
+    "event.deleted": "Група „%1“ је обрисана",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/sv/error.json b/public/language/sv/error.json
index c2acdc858c..38992271d5 100644
--- a/public/language/sv/error.json
+++ b/public/language/sv/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Du kan inte rösta på ditt eget inlägg.",
     "already-favourited": "Du har redan favoriserat det här inlägget",
diff --git a/public/language/sv/global.json b/public/language/sv/global.json
index bb3909ab6a..647cbec5d0 100644
--- a/public/language/sv/global.json
+++ b/public/language/sv/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 av %2",
     "pagination.enter_index": "Skriv in index ",
     "header.admin": "Admin",
+    "header.categories": "Categories",
     "header.recent": "Senaste",
     "header.unread": "Olästa",
     "header.tags": "Märkningar",
diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json
index c1daef3aec..2cb6de26df 100644
--- a/public/language/sv/groups.json
+++ b/public/language/sv/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Group details have been updated",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/th/error.json b/public/language/th/error.json
index 4d4505ad2e..ad6b9b98a4 100644
--- a/public/language/th/error.json
+++ b/public/language/th/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "You cannot vote for your own post",
     "already-favourited": "You have already favourited this post",
diff --git a/public/language/th/global.json b/public/language/th/global.json
index cec8d6cadc..b9acc67e30 100644
--- a/public/language/th/global.json
+++ b/public/language/th/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 จาก %2",
     "pagination.enter_index": "Enter index",
     "header.admin": "ผู้ดูแลระบบ",
+    "header.categories": "Categories",
     "header.recent": "ล่าสุด",
     "header.unread": "ไม่ได้อ่าน",
     "header.tags": "Tag",
diff --git a/public/language/th/groups.json b/public/language/th/groups.json
index d80f70d18e..027579e466 100644
--- a/public/language/th/groups.json
+++ b/public/language/th/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "ซ่อน",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "ข้อมูล Group ได้รับการบันทึกแล้ว",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/tr/error.json b/public/language/tr/error.json
index c846b60bfd..a530f04e05 100644
--- a/public/language/tr/error.json
+++ b/public/language/tr/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "Yeni bir kullanıcı olarak, %2 saygınlık kazanana kadar %1 saniye içinde bir ileti gönderebilirsiniz - tekrar ileti göndermeden önce lütfen bekleyin.",
     "tag-too-short": "Lütfen daha uzun bir etiket girin. Etiketler en az %1 karakter içermelidir.",
     "tag-too-long": "Lütfen daha kısa bir etiket girin. Etiketler %1 karakterden uzun olamaz.",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "İzin verilen en büyük dosya boyutu %1 kb - lütfen daha küçük bir dosya yükleyin",
     "cant-vote-self-post": "Kendi iletinize oy veremezsiniz",
     "already-favourited": "Bu iletiyi zaten favorilerinize eklediniz",
diff --git a/public/language/tr/global.json b/public/language/tr/global.json
index f2541870fe..7e63e5e3bd 100644
--- a/public/language/tr/global.json
+++ b/public/language/tr/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 - %2",
     "pagination.enter_index": "İndex gir",
     "header.admin": "Yönetim",
+    "header.categories": "Categories",
     "header.recent": "Yeni",
     "header.unread": "Okunmamış",
     "header.tags": "Etiketler",
diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json
index bfec944413..bac723142e 100644
--- a/public/language/tr/groups.json
+++ b/public/language/tr/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "Gruba katılmak için eğer etkinse grup sahibini onayı gerekir, ",
     "details.hidden": "Gizli",
     "details.hidden_help": "Bu grup eğer etkinse grup listelerinde bulunmaz, ve kullanıcılar bizzat davet eder",
+    "details.delete_group": "Delete Group",
     "event.updated": "Grup detayları güncellenmiştir",
-    "event.deleted": "\"%1\" grubu silinmiş"
+    "event.deleted": "\"%1\" grubu silinmiş",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/tr/user.json b/public/language/tr/user.json
index 724c026ad3..2739622bee 100644
--- a/public/language/tr/user.json
+++ b/public/language/tr/user.json
@@ -6,9 +6,9 @@
     "postcount": "Yayın Sayısı",
     "email": "E-posta",
     "confirm_email": "E-posta onayla",
-    "ban_account": "Ban Account",
-    "ban_account_confirm": "Do you really want to ban this user?",
-    "unban_account": "Unban Account",
+    "ban_account": "Hesabı Dondur",
+    "ban_account_confirm": "Hesabı dondurmak istediğinizden emin misiniz!",
+    "unban_account": "Hesabı Kullanıma Aç",
     "delete_account": "Hesabı Sil",
     "delete_account_confirm": "Hesabınızı silmek istediğinize emin misiniz?<br/><strong> Bu işlem geri çevrilemez ve tüm verileriniz sistemden silinecek.</strong><br/><br/> Eğer hesabınızı silmek istiyorsanız lütfen kullanıcı isminizi girerek işlemi onaylayın.",
     "delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
diff --git a/public/language/vi/error.json b/public/language/vi/error.json
index 7d1a530248..0a1b14c46b 100644
--- a/public/language/vi/error.json
+++ b/public/language/vi/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "Bạn không thể vote cho chính bài viết của bạn",
     "already-favourited": "Bạn đã bấm yêu thích cho bài viết này rồi",
diff --git a/public/language/vi/global.json b/public/language/vi/global.json
index f3dc17b93d..58f157d119 100644
--- a/public/language/vi/global.json
+++ b/public/language/vi/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 trong số %2",
     "pagination.enter_index": "Nhập khóa",
     "header.admin": "Quản trị viên",
+    "header.categories": "Categories",
     "header.recent": "Gần đây",
     "header.unread": "Chưa đọc",
     "header.tags": "Tags",
diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json
index c8bdd3bdc9..2deebd443e 100644
--- a/public/language/vi/groups.json
+++ b/public/language/vi/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "Hidden",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "Thông tin nhóm đã được cập nhật",
-    "event.deleted": "The group \"%1\" has been deleted"
+    "event.deleted": "The group \"%1\" has been deleted",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/zh_CN/email.json b/public/language/zh_CN/email.json
index 6237ef225a..f1a477fcd0 100644
--- a/public/language/zh_CN/email.json
+++ b/public/language/zh_CN/email.json
@@ -1,15 +1,15 @@
 {
     "password-reset-requested": "密码重置申请 - %1!",
     "welcome-to": "欢迎来到 %1",
-    "invite": "Invitation from %1",
+    "invite": "来自%1的邀请",
     "greeting_no_name": "您好",
     "greeting_with_name": "%1,您好",
     "welcome.text1": "感谢您注册 %1 帐户!",
     "welcome.text2": "需要在校验您注册时填写的电子邮箱地址后,才能全面激活您的帐户。",
-    "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.",
+    "welcome.text3": "管理员接受了您的注册请求,请用您的用户名和密码登陆。",
     "welcome.cta": "点击这里确认您的电子邮箱地址",
-    "invitation.text1": "%1 has invited you to join %2",
-    "invitation.ctr": "Click here to create your account.",
+    "invitation.text1": "%1 邀请您加入%2",
+    "invitation.ctr": "点击这里新建账户",
     "reset.text1": "可能由于您忘记了密码,我们收到了重置您帐户密码的申请。 如果您没有提交密码重置的请求,请忽略这封邮件。",
     "reset.text2": "如需继续重置密码,请点击下面的链接:",
     "reset.cta": "点击这里重置您的密码",
diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json
index 2b9c49f96a..7ad720cf56 100644
--- a/public/language/zh_CN/error.json
+++ b/public/language/zh_CN/error.json
@@ -46,12 +46,14 @@
     "too-many-posts-newbie": "因为您是新用户,所以限制每隔 %1 秒才能发帖一次,直到您有 %2 点威望为止 —— 请稍候再发帖",
     "tag-too-short": "话题太短,不能少于 %1 个字符",
     "tag-too-long": "话题太长,不能超过 %1 个字符",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "上传文件的大小限制为 %1 KB - 请缩减文件大小",
     "cant-vote-self-post": "您不能给自己的帖子投票。",
     "already-favourited": "您已收藏该帖",
     "already-unfavourited": "您已取消收藏此帖",
     "cant-ban-other-admins": "您不能封禁其他管理员!",
-    "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin",
+    "cant-remove-last-admin": "您是唯一的管理员。在删除您的管理员权限前,请添加另一个管理员。",
     "invalid-image-type": "无效的图像类型。允许的类型有:%1",
     "invalid-image-extension": "无效的图像扩展",
     "invalid-file-type": "无效文件格式,允许的格式有:%1",
@@ -60,8 +62,8 @@
     "group-name-change-not-allowed": "不允许更改小组名称",
     "group-already-member": "您已经是此小组的成员",
     "group-needs-owner": "小组需要指定至少一名组长",
-    "group-already-invited": "This user has already been invited",
-    "group-already-requested": "Your membership request has already been submitted",
+    "group-already-invited": "您已邀请该用户",
+    "group-already-requested": "已提交您的请求",
     "post-already-deleted": "此帖已被删除",
     "post-already-restored": "此帖已经恢复",
     "topic-already-deleted": "此主题已被删除",
@@ -79,7 +81,7 @@
     "downvoting-disabled": "扣分功能已禁用",
     "not-enough-reputation-to-downvote": "您的威望不足以给此帖扣分",
     "not-enough-reputation-to-flag": "您的威望不足以举报此帖",
-    "already-flagged": "You have already flagged this post",
+    "already-flagged": "您已举报此帖",
     "reload-failed": "刷新 NodeBB 时遇到问题: \"%1\"。NodeBB 保持给已连接的客户端服务,您应该撤销刷新前做的更改。",
     "registration-error": "注册错误",
     "parse-error": "服务器响应解析出错",
diff --git a/public/language/zh_CN/global.json b/public/language/zh_CN/global.json
index c4c879633a..82d3030953 100644
--- a/public/language/zh_CN/global.json
+++ b/public/language/zh_CN/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 / %2",
     "pagination.enter_index": "输入索引",
     "header.admin": "管理",
+    "header.categories": "Categories",
     "header.recent": "最新",
     "header.unread": "未读",
     "header.tags": "话题",
@@ -50,7 +51,7 @@
     "views": "浏览",
     "reputation": "威望",
     "read_more": "阅读更多",
-    "more": "More",
+    "more": "更多",
     "posted_ago_by_guest": "游客发布于 %1",
     "posted_ago_by": "%2 发布于 %1",
     "posted_ago": "发布于 %1",
diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json
index ff95775343..0f02408c81 100644
--- a/public/language/zh_CN/groups.json
+++ b/public/language/zh_CN/groups.json
@@ -6,12 +6,12 @@
     "no_groups_found": "尚无小组信息",
     "pending.accept": "接受",
     "pending.reject": "拒绝",
-    "pending.accept_all": "Accept All",
-    "pending.reject_all": "Reject All",
-    "pending.none": "There are no pending members at this time",
-    "invited.none": "There are no invited members at this time",
-    "invited.uninvite": "Rescind Invitation",
-    "invited.search": "Search for a user to invite to this group",
+    "pending.accept_all": "接受全部",
+    "pending.reject_all": "拒绝全部",
+    "pending.none": "暂时没有待加入的成员",
+    "invited.none": "暂时没有接受邀请的成员",
+    "invited.uninvite": "取消邀请",
+    "invited.search": "选择用户加入小组",
     "cover-instructions": "拖放照片到此位置,然后点击 <strong>保存</strong>",
     "cover-change": "更改",
     "cover-save": "保存",
@@ -19,7 +19,7 @@
     "details.title": "小组信息",
     "details.members": "成员列表",
     "details.pending": "待加入成员",
-    "details.invited": "Invited Members",
+    "details.invited": "已邀请成员",
     "details.has_no_posts": "此小组的会员尚未发表任何帖子。",
     "details.latest_posts": "最新帖子",
     "details.private": "私有",
@@ -38,6 +38,12 @@
     "details.private_help": "启用此选项后,加入小组需要组长审批。",
     "details.hidden": "隐藏",
     "details.hidden_help": "启用此选项后,小组将不在小组列表中展现,成员只能通过邀请加入。",
+    "details.delete_group": "Delete Group",
     "event.updated": "小组信息已更新",
-    "event.deleted": "小组 \"%1\" 已被删除"
+    "event.deleted": "小组 \"%1\" 已被删除",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/language/zh_CN/notifications.json b/public/language/zh_CN/notifications.json
index b9e8681302..e25241b363 100644
--- a/public/language/zh_CN/notifications.json
+++ b/public/language/zh_CN/notifications.json
@@ -20,7 +20,7 @@
     "user_posted_topic": "<strong>%1</strong> 发表了新主题:<strong>%2</strong>",
     "user_mentioned_you_in": "<strong>%1</strong> 在 <strong>%2</strong> 中提到了您",
     "user_started_following_you": "<strong>%1</strong>关注了您。",
-    "new_register": "<strong>%1</strong> sent a registration request.",
+    "new_register": "<strong>%1</strong> 发出了注册请求",
     "email-confirmed": "电子邮箱已确认",
     "email-confirmed-message": "感谢您验证您的电子邮箱。您的帐户现已全面激活。",
     "email-confirm-error-message": "验证您电子邮箱地址时出现了问题。可能是因为验证码无效或已过期。",
diff --git a/public/language/zh_CN/register.json b/public/language/zh_CN/register.json
index f258edac2b..f7ed01d784 100644
--- a/public/language/zh_CN/register.json
+++ b/public/language/zh_CN/register.json
@@ -15,5 +15,5 @@
     "alternative_registration": "其他方式注册",
     "terms_of_use": "使用条款",
     "agree_to_terms_of_use": "我同意使用条款",
-    "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator."
+    "registration-added-to-queue": "您的注册正在等待批准。一旦通过,管理员会发送邮件通知您。"
 }
\ No newline at end of file
diff --git a/public/language/zh_CN/unread.json b/public/language/zh_CN/unread.json
index 8add96ac03..58ab5b0389 100644
--- a/public/language/zh_CN/unread.json
+++ b/public/language/zh_CN/unread.json
@@ -5,6 +5,6 @@
     "mark_as_read": "标为已读",
     "selected": "已选",
     "all": "全部",
-    "all_categories": "All categories",
+    "all_categories": "全部分类",
     "topics_marked_as_read.success": "主题被标为已读!"
 }
\ No newline at end of file
diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json
index 81a6ff2710..c7e23fa7a6 100644
--- a/public/language/zh_CN/user.json
+++ b/public/language/zh_CN/user.json
@@ -6,12 +6,12 @@
     "postcount": "发帖数",
     "email": "电子邮件",
     "confirm_email": "确认电子邮箱",
-    "ban_account": "Ban Account",
-    "ban_account_confirm": "Do you really want to ban this user?",
-    "unban_account": "Unban Account",
+    "ban_account": "禁止账户",
+    "ban_account_confirm": "您确定禁止这位用户吗?",
+    "unban_account": "解禁账户",
     "delete_account": "删除帐号",
     "delete_account_confirm": "确认要删除您的帐户吗?<br /><strong>此操作是不可逆转的,您将无法恢复您的任何数据</strong><br /><br />请输入您的用户名,确认您想要删除此帐户。",
-    "delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
+    "delete_this_account_confirm": "您确定要删除账户吗? <br /><strong>这个操作不可逆,而且您可能不能找回任何数据</strong><br /><br />",
     "fullname": "姓名",
     "website": "网站",
     "location": "位置",
@@ -68,9 +68,9 @@
     "settings-require-reload": "某些设置变更需要刷新页面。点击这里刷新页面。",
     "has_no_follower": "此用户还没有粉丝 :(",
     "follows_no_one": "此用户尚未关注任何人 :(",
-    "has_no_posts": "This user hasn't posted anything yet.",
-    "has_no_topics": "This user hasn't posted any topics yet.",
-    "has_no_watched_topics": "This user hasn't watched any topics yet.",
+    "has_no_posts": "此用户从未发言。",
+    "has_no_topics": "此用户还未发布任何主题。",
+    "has_no_watched_topics": "此用户还未关注任何主题。",
     "email_hidden": "电子邮箱已隐藏",
     "hidden": "隐藏",
     "paginate_description": "使用分页式版块浏览",
diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json
index 638b6cdf27..8e243ea7ff 100644
--- a/public/language/zh_TW/error.json
+++ b/public/language/zh_TW/error.json
@@ -46,6 +46,8 @@
     "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
     "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
     "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
+    "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
+    "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
     "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
     "cant-vote-self-post": "你不能對自己的文章說讚!",
     "already-favourited": "你已經收藏了這篇文章",
diff --git a/public/language/zh_TW/global.json b/public/language/zh_TW/global.json
index 2097e3bb26..81c70f3faf 100644
--- a/public/language/zh_TW/global.json
+++ b/public/language/zh_TW/global.json
@@ -22,6 +22,7 @@
     "pagination.out_of": "%1 out of %2",
     "pagination.enter_index": "輸入Index",
     "header.admin": "管理",
+    "header.categories": "Categories",
     "header.recent": "最近",
     "header.unread": "未讀",
     "header.tags": "標籤",
diff --git a/public/language/zh_TW/groups.json b/public/language/zh_TW/groups.json
index 590e2118da..b69c394a33 100644
--- a/public/language/zh_TW/groups.json
+++ b/public/language/zh_TW/groups.json
@@ -38,6 +38,12 @@
     "details.private_help": "If enabled, joining of groups requires approval from a group owner",
     "details.hidden": "隱藏",
     "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
+    "details.delete_group": "Delete Group",
     "event.updated": "群組詳細訊息已被更新",
-    "event.deleted": "此 \"%1\" 群組已被刪除了"
+    "event.deleted": "此 \"%1\" 群組已被刪除了",
+    "membership.accept-invitation": "Accept Invitation",
+    "membership.invitation-pending": "Invitation Pending",
+    "membership.join-group": "Join Group",
+    "membership.leave-group": "Leave Group",
+    "membership.reject": "Reject"
 }
\ No newline at end of file
diff --git a/public/src/app.js b/public/src/app.js
index 3254c7a51f..a14a403da5 100644
--- a/public/src/app.js
+++ b/public/src/app.js
@@ -293,7 +293,10 @@ app.cacheBuster = null;
 			}
 
 			if (!chat.modalExists(touid)) {
-				chat.createModal(username, touid, loadAndCenter);
+				chat.createModal({
+					username: username,
+					touid: touid
+				}, loadAndCenter);
 			} else {
 				loadAndCenter(chat.getModal(touid));
 			}
diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js
index b27b932eec..54b8fbe93f 100644
--- a/public/src/modules/chat.js
+++ b/public/src/modules/chat.js
@@ -11,6 +11,9 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 			chatsListEl = $('#chat-list'),
 			dropdownEl;
 
+		// Sync open chats between all user socket sessions
+		module.sync();
+
 		chatsToggleEl.on('click', function() {
 			if (chatsToggleEl.parent().hasClass('open')) {
 				return;
@@ -79,7 +82,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 					taskbar.updateActive(modal.attr('UUID'));
 					Chats.scrollToBottom(modal.find('#chat-content'));
 				} else {
-					module.toggleNew(modal.attr('UUID'), true);
+					module.toggleNew(modal.attr('UUID'), true, true);
 				}
 
 				if (!isSelf && (!modal.is(":visible") || !app.isFocused)) {
@@ -92,8 +95,12 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 					});
 				}
 			} else {
-				module.createModal(username, data.withUid, function(modal) {
-					module.toggleNew(modal.attr('UUID'), true);
+				module.createModal({
+					username: username,
+					touid: data.withUid,
+					silent: true
+				}, function(modal) {
+					module.toggleNew(modal.attr('UUID'), true, true);
 					if (!isSelf) {
 						app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]');
 						sounds.play('chat-incoming');
@@ -125,6 +132,42 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 			var modal = module.getModal(data.uid);
 			app.updateUserStatus(modal.find('[component="user/status"]'), data.status);
 		});
+
+		socket.on('query:chats.sync', function(data, callback) {
+			var chats = Array.prototype.map.call(taskbar.get('chat'), function(chatObj) {
+					return {
+						username: chatObj.options.title,
+						uid: chatObj.options.touid,
+						new: chatObj.element.hasClass('new')
+					}
+				});
+
+			callback(null, chats);
+		});
+
+		socket.on('event:chats.open', function(data) {
+			data.silent = true;
+			module.createModal(data);
+		});
+
+		socket.on('event:chats.close', function(uid) {
+			module.close(module.getModal(uid), true);
+		});
+
+		socket.on('event:chats.toggleNew', function(data) {
+			var uuid = module.getModal(data.uid).attr('UUID');
+			module.toggleNew(uuid, data.state, true);
+		});
+
+		$(window).on('action:taskbar.toggleNew', function(ev, uuid) {
+			var modal = $('.chat-modal[uuid="' + uuid + '"]'),
+				touid = modal.attr('touid');
+
+			socket.emit('modules.chats.toggleNew', {
+				uid: touid,
+				state: false
+			});
+		});
 	};
 
 	module.bringModalToTop = function(chatModal) {
@@ -163,7 +206,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 		});
 	}
 
-	module.createModal = function(username, touid, callback) {
+	module.createModal = function(data, callback) {
 		templates.parse('chat', {}, function(chatTpl) {
 			translator.translate(chatTpl, function (chatTpl) {
 
@@ -171,8 +214,8 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 					uuid = utils.generateUUID(),
 					dragged = false;
 
-				chatModal.attr('id', 'chat-modal-' + touid);
-				chatModal.attr('touid', touid);
+				chatModal.attr('id', 'chat-modal-' + data.touid);
+				chatModal.attr('touid', data.touid);
 				chatModal.attr('intervalId', 0);
 				chatModal.attr('UUID', uuid);
 				chatModal.css('position', 'fixed');
@@ -206,7 +249,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 					});
 				});
 
-				chatModal.find('#chat-with-name').html(username);
+				chatModal.find('#chat-with-name').html(data.username);
 
 				chatModal.find('#chat-close-btn').on('click', function() {
 					module.close(chatModal);
@@ -218,7 +261,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 						components.get('chat/input').val(text);
 					});
 					
-					ajaxify.go('chats/' + utils.slugify(username));
+					ajaxify.go('chats/' + utils.slugify(data.username));
 					module.close(chatModal);
 				}
 
@@ -243,7 +286,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 
 				chatModal.on('mousemove keypress click', function() {
 					if (newMessage) {
-						socket.emit('modules.chats.markRead', touid);
+						socket.emit('modules.chats.markRead', data.touid);
 						newMessage = false;
 					}
 				});
@@ -262,25 +305,31 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 					checkStatus(chatModal);
 				});
 
-				module.canMessage(touid, function(err) {
+				module.canMessage(data.touid, function(err) {
 					if (err) {
 						// Disable the text input
 						chatModal.find('input[type="text"]').attr('disabled', true);
 					}
 				});
 
-				chatModal.find('.user-typing .text').translateText('[[modules:chat.user_typing, ' + username + ']]');
+				chatModal.find('.user-typing .text').translateText('[[modules:chat.user_typing, ' + data.username + ']]');
 
 				taskbar.push('chat', chatModal.attr('UUID'), {
-					title: username,
-					touid: touid,
+					title: data.username,
+					touid: data.touid,
 					icon: 'fa-comment',
 					state: ''
 				});
 
+				if (!data.silent) {
+					socket.emit('modules.chats.open', data);
+				}
+
 				$(window).trigger('action:chat.loaded', chatModal);
 
-				callback(chatModal);
+				if (typeof callback === 'function') {
+					callback(chatModal);
+				}
 			});
 		});
 	};
@@ -289,7 +338,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 		chatModal.find('#chat-message-input').focus();
 	};
 
-	module.close = function(chatModal) {
+	module.close = function(chatModal, silent) {
 		clearInterval(chatModal.attr('intervalId'));
 		chatModal.attr('intervalId', 0);
 		chatModal.remove();
@@ -297,6 +346,10 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 		taskbar.discard('chat', chatModal.attr('UUID'));
 		Chats.notifyTyping(chatModal.attr('touid'), false);
 
+		if (!silent) {
+			socket.emit('modules.chats.close', chatModal.attr('touid'));
+		}
+
 		if (chatModal.attr('data-mobile')) {
 			module.disableMobileBehaviour(chatModal);
 		}
@@ -422,13 +475,30 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
 		});
 	};
 
-	module.toggleNew = function(uuid, state) {
-		taskbar.toggleNew(uuid, state);
-	};
+	module.toggleNew = taskbar.toggleNew;
 
 	module.canMessage = function(toUid, callback) {
 		socket.emit('modules.chats.canMessage', toUid, callback);
 	};
 
+	module.sync = function() {
+		socket.emit('modules.chats.sync', function(err, users) {
+			for(var x=0,numUsers=users.length,user;x<numUsers;x++) {
+				user = users[x];
+				if (!module.modalExists(user.uid)) {
+					module.createModal({
+						username: user.username,
+						touid: user.uid,
+						silent: true
+					}, function(modal) {
+						if (user.new) {
+							module.toggleNew(modal.attr('UUID'), true, true);
+						}
+					});
+				}
+			}
+		});
+	};
+
 	return module;
 });
diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js
index e8532a83ee..b6ad55ba40 100644
--- a/public/src/modules/helpers.js
+++ b/public/src/modules/helpers.js
@@ -115,15 +115,19 @@
 
 	// Groups helpers
 	helpers.membershipBtn = function(groupObj) {
+		if (groupObj.name === 'administrators') {
+			return '';
+		}
+
 		if (groupObj.isMember) {
-			return '<button class="btn btn-danger" data-action="leave" data-group="' + groupObj.displayName + '"><i class="fa fa-times"></i> Leave Group</button>';
+			return '<button class="btn btn-danger" data-action="leave" data-group="' + groupObj.displayName + '"><i class="fa fa-times"></i> [[groups:membership.leave-group]]</button>';
 		} else {
 			if (groupObj.isPending) {
-				return '<button class="btn btn-warning disabled"><i class="fa fa-clock-o"></i> Invitation Pending</button>';
+				return '<button class="btn btn-warning disabled"><i class="fa fa-clock-o"></i> [[groups:membership.invitation-pending]]</button>';
 			} else if (groupObj.isInvited) {
-				return '<button class="btn btn-link" data-action="rejectInvite" data-group="' + groupObj.displayName + '">Reject</button><button class="btn btn-success" data-action="acceptInvite" data-group="' + groupObj.name + '"><i class="fa fa-plus"></i> Accept Invitation</button>';
+				return '<button class="btn btn-link" data-action="rejectInvite" data-group="' + groupObj.displayName + '">[[groups:membership.reject]]</button><button class="btn btn-success" data-action="acceptInvite" data-group="' + groupObj.name + '"><i class="fa fa-plus"></i> [[groups:membership.accept-invitation]]</button>';
 			} else {
-				return '<button class="btn btn-success" data-action="join" data-group="' + groupObj.displayName + '"><i class="fa fa-plus"></i> Join Group</button>';
+				return '<button class="btn btn-success" data-action="join" data-group="' + groupObj.displayName + '"><i class="fa fa-plus"></i> [[groups:membership.join-group]]</button>';
 			}
 		}
 	};
diff --git a/public/src/modules/taskbar.js b/public/src/modules/taskbar.js
index f1757fe553..e664037c0d 100644
--- a/public/src/modules/taskbar.js
+++ b/public/src/modules/taskbar.js
@@ -60,14 +60,26 @@ define('taskbar', function() {
 		}
 	};
 
+	taskbar.get = function(module) {
+		var items = $('[data-module="' + module + '"]').map(function(idx, el) {
+			return $(el).data();
+		});
+
+		return items;
+	};
+
 	taskbar.minimize = function(module, uuid) {
 		var btnEl = taskbar.tasklist.find('[data-module="' + module + '"][data-uuid="' + uuid + '"]');
 		btnEl.removeClass('active');
 	};
 
-	taskbar.toggleNew = function(uuid, state) {
+	taskbar.toggleNew = function(uuid, state, silent) {
 		var btnEl = taskbar.tasklist.find('[data-uuid="' + uuid + '"]');
 		btnEl.toggleClass('new', state);
+
+		if (!silent) {
+			$(window).trigger('action:taskbar.toggleNew', uuid);
+		}
 	};
 
 	taskbar.updateActive = function(uuid) {
@@ -119,6 +131,8 @@ define('taskbar', function() {
 		update();
 
 		data.element = taskbarEl;
+
+		taskbarEl.data(data);
 		$(window).trigger('action:taskbar.pushed', data);
 	}
 
diff --git a/src/categories.js b/src/categories.js
index e033102264..d30cd0c47a 100644
--- a/src/categories.js
+++ b/src/categories.js
@@ -166,15 +166,22 @@ var async = require('async'),
 			category.topic_count = category.totalTopicCount = category.topic_count || 0;
 		}
 
-		if (category.description) {
-			category.description = validator.escape(category.description);
-		}
-
 		if (category.image) {
 			category.backgroundImage = category.image;
 		}
 
-		callback(null, category);
+		if (category.description) {
+			plugins.fireHook('filter:parse.raw', category.description, function(err, parsedDescription) {
+				if (err) {
+					return callback(err);
+				}
+				category.descriptionParsed = parsedDescription;
+				category.description = validator.escape(category.description);
+				callback(null, category);
+			});
+		} else {
+			callback(null, category);
+		}
 	}
 
 	Categories.getCategoryField = function(cid, field, callback) {
diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js
index 77951daf74..093362c433 100644
--- a/src/middleware/middleware.js
+++ b/src/middleware/middleware.js
@@ -66,6 +66,15 @@ middleware.pageView = function(req, res, next) {
 	}
 };
 
+middleware.pluginHooks = function(req, res, next) {
+	async.each(plugins.loadedHooks['filter:router.page'] || [], function(hookObj, next) {
+		hookObj.method(req, res, next)
+	}, function(req, res) {
+		// If it got here, then none of the subscribed hooks did anything, or there were no hooks
+		next();
+	});
+};
+
 middleware.redirectToAccountIfLoggedIn = function(req, res, next) {
 	if (!req.user) {
 		return next();
@@ -485,6 +494,14 @@ middleware.exposeUid = function(req, res, next) {
 	}
 };
 
+middleware.requireUser = function(req, res, next) {
+	if (req.user) {
+		return next();
+	}
+
+	res.render('403', {});
+};
+
 function redirectToLogin(req, res) {
 	req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, '');
 	return controllers.helpers.redirect(res, '/login');
diff --git a/src/routes/helpers.js b/src/routes/helpers.js
index 31f3ece5b2..3cd1524fc5 100644
--- a/src/routes/helpers.js
+++ b/src/routes/helpers.js
@@ -3,7 +3,7 @@
 var helpers = {};
 
 helpers.setupPageRoute = function(router, name, middleware, middlewares, controller) {
-	middlewares = middlewares.concat([middleware.pageView]);
+	middlewares = middlewares.concat([middleware.pageView, middleware.pluginHooks]);
 
 	router.get(name, middleware.buildHeader, middlewares, controller);
 	router.get('/api' + name, middlewares, controller);
diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js
index fbdf2b0100..95380a4b49 100644
--- a/src/socket.io/modules.js
+++ b/src/socket.io/modules.js
@@ -4,7 +4,10 @@ var	meta = require('../meta'),
 	Messaging = require('../messaging'),
 	utils = require('../../public/src/utils'),
 
+	async = require('async'),
+
 	server = require('./'),
+	rooms = require('./rooms'),
 
 	SocketModules = {
 		chats: {},
@@ -94,6 +97,37 @@ SocketModules.chats.getRecentChats = function(socket, data, callback) {
 	Messaging.getRecentChats(socket.uid, start, stop, callback);
 };
 
+SocketModules.chats.sync = function(socket, data, callback) {
+	var chats = [],
+		uids = [],
+		socketIds = rooms.clients('uid_' + socket.uid);
+
+	rooms.broadcast(socket, 'uid_' + socket.uid, 'query:chats.sync', {}, function(err, sessionData) {
+		sessionData.forEach(function(data) {
+			data.forEach(function(chat) {
+				if (uids.indexOf(chat.uid) === -1) {
+					chats.push(chat);
+					uids.push(chat.uid);
+				}
+			});
+		});
+
+		callback(err, chats);
+	});
+};
+
+SocketModules.chats.open = function(socket, data, callback) {
+	rooms.broadcast(socket, 'uid_' + socket.uid, 'event:chats.open', data);
+};
+
+SocketModules.chats.close = function(socket, data, callback) {
+	rooms.broadcast(socket, 'uid_' + socket.uid, 'event:chats.close', data);
+};
+
+SocketModules.chats.toggleNew = function(socket, data, callback) {
+	rooms.broadcast(socket, 'uid_' + socket.uid, 'event:chats.toggleNew', data);
+};
+
 
 /* Sounds */
 SocketModules.sounds.getSounds = function(socket, data, callback) {
diff --git a/src/socket.io/plugins.js b/src/socket.io/plugins.js
index a4ee9bbe89..aad0bb2841 100644
--- a/src/socket.io/plugins.js
+++ b/src/socket.io/plugins.js
@@ -7,7 +7,7 @@ var	SocketPlugins = {};
 
 	How? From your plugin:
 
-		var SocketPlugins = require.main.require('./src/socket.io/modules');
+		var SocketPlugins = require.main.require('./src/socket.io/plugins');
 		SocketPlugins.myPlugin = {};
 		SocketPlugins.myPlugin.myMethod = function() { ... };
 
diff --git a/src/socket.io/rooms.js b/src/socket.io/rooms.js
index e392abf3f9..615d650cd6 100644
--- a/src/socket.io/rooms.js
+++ b/src/socket.io/rooms.js
@@ -9,7 +9,8 @@
 // Once they are closed switch to .clients() and async calls
 
 
-var pubsub = require('../pubsub');
+var pubsub = require('../pubsub'),
+	async = require('async');
 
 var rooms = {};
 
@@ -32,6 +33,39 @@ rooms.leaveAll = function(socket, roomsToLeave) {
 	});
 };
 
+rooms.broadcast = function(socket, room, msg, data, callback) {
+	var io = require('./'),
+		socketIds = rooms.clients(room);
+
+	callback = callback || function() {};
+
+	// Filter out socketIds that aren't actually connected
+	socketIds = socketIds.filter(function(id) {
+		return io.server.sockets.connected.hasOwnProperty(id);
+	});
+
+	async.map(socketIds, function(id, next) {
+		var timeout,
+			timeoutPassed = false;
+
+		if (socket.id === id) {
+			return setImmediate(next, null, []);
+		}
+
+		timeout = setTimeout(function() {
+			timeoutPassed = true;
+			next(null, []);
+		}, 500);
+
+		io.server.sockets.connected[id].emit(msg, data || {}, function(err, returnData) {
+			clearTimeout(timeout);
+			if (!timeoutPassed) {
+				next(null, returnData);
+			}
+		});
+	}, callback);
+};
+
 pubsub.on('socket:join', onSocketJoin);
 pubsub.on('socket:leave', onSocketLeave);
 
diff --git a/src/views/admin/partials/categories/category-rows.tpl b/src/views/admin/partials/categories/category-rows.tpl
index 2124797cb1..bdce593887 100644
--- a/src/views/admin/partials/categories/category-rows.tpl
+++ b/src/views/admin/partials/categories/category-rows.tpl
@@ -9,7 +9,7 @@
                     </div>
                     <div class="information">
                         <h5 class="header">{categories.name}</h5>
-                        <p class="description">{categories.description}</p>
+                        <p class="description">{categories.descriptionParsed}</p>
                     </div>
                 </div>
             </div>