diff --git a/package.json b/package.json
index d9cdf3781b..6f03e3c465 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,7 @@
     "morgan": "^1.3.2",
     "mousetrap": "^1.5.3",
     "nconf": "~0.8.2",
-    "nodebb-plugin-composer-default": "4.4.12",
+    "nodebb-plugin-composer-default": "4.4.14",
     "nodebb-plugin-dbsearch": "2.0.4",
     "nodebb-plugin-emoji-extended": "1.1.1",
     "nodebb-plugin-emoji-one": "1.2.1",
@@ -65,7 +65,7 @@
     "nodebb-plugin-spam-be-gone": "0.5.0",
     "nodebb-rewards-essentials": "0.0.9",
     "nodebb-theme-lavender": "4.0.1",
-    "nodebb-theme-persona": "5.0.7",
+    "nodebb-theme-persona": "5.0.8",
     "nodebb-theme-slick": "1.1.0",
     "nodebb-theme-vanilla": "6.0.6",
     "nodebb-widget-essentials": "3.0.0",
diff --git a/public/language/ko/admin/admin.json b/public/language/ko/admin/admin.json
index 547d2b6bc7..866b8eee28 100644
--- a/public/language/ko/admin/admin.json
+++ b/public/language/ko/admin/admin.json
@@ -1,7 +1,7 @@
 {
-	"alert.confirm-reload": "NodeBB를 다시 로드 하시겠습니까?",
+	"alert.confirm-reload": "NodeBB를 새로 고침 하시겠습니까?",
 	"alert.confirm-restart": "NodeBB를 다시 시작하시겠습니까?",
 
 	"acp-title": "%1 | NodeBB 관리자 제어판",
-	"settings-header-contents": "내용"
+	"settings-header-contents": "컨텐츠"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/advanced/cache.json b/public/language/ko/admin/advanced/cache.json
index 11e23eab97..5fb24659e6 100644
--- a/public/language/ko/admin/advanced/cache.json
+++ b/public/language/ko/admin/advanced/cache.json
@@ -1,10 +1,10 @@
 {
-	"post-cache": "캐시 게시물",
-	"posts-in-cache": "캐시 게시물",
-	"average-post-size": "평균 게시물 크기",
+	"post-cache": "포스트 캐시",
+	"posts-in-cache": "캐시된 포스트",
+	"average-post-size": "평균 포스트 크기",
 	"length-to-max": "길이 / 최대",
-	"percent-full": "1 %1% 꽉 참",
-	"post-cache-size": "게시물 캐시 크기",
+	"percent-full": "%1%꽉참",
+	"post-cache-size": "포스트 캐시 크기",
 	"items-in-cache": "캐시된 항목들",
 	"control-panel": "제어판",
 	"update-settings": "캐시 설정 변경"
diff --git a/public/language/ko/admin/advanced/database.json b/public/language/ko/admin/advanced/database.json
index ca4fc5d97b..ee38140153 100644
--- a/public/language/ko/admin/advanced/database.json
+++ b/public/language/ko/admin/advanced/database.json
@@ -1,36 +1,36 @@
 {
-	"x-b": "%1 바이트",
-	"x-mb": "%1 메가바이트",
-	"x-gb": "%1 기가바이트",
-	"uptime-seconds": "가동시간 초단위",
-	"uptime-days": "가동시간 일단위",
+	"x-b": "%1 B",
+	"x-mb": "%1 MB",
+	"x-gb": "%1 GB",
+	"uptime-seconds": "Uptime (초)",
+	"uptime-days": "Uptime (일)",
 
 	"mongo": "Mongo",
-	"mongo.version": "MongoDB 버전",
-	"mongo.storage-engine": "스토리지 엔진",
-	"mongo.collections": "컬렉션",
+	"mongo.version": "MongoDB 버젼",
+	"mongo.storage-engine": "Storage Engine",
+	"mongo.collections": "Collections",
 	"mongo.objects": "객체",
 	"mongo.avg-object-size": "평균 객체 크기",
-	"mongo.data-size": "데이타 크기",
+	"mongo.data-size": "데이터 크기",
 	"mongo.storage-size": "저장공간 크기",
 	"mongo.index-size": "인덱스 크기",
 	"mongo.file-size": "파일 크기",
-	"mongo.resident-memory": "상주 메모리",
-	"mongo.virtual-memory": "가상 메모리",
-	"mongo.mapped-memory": "매핑된 메모리",
-	"mongo.raw-info": "MongoDB 미가공 정보",
+	"mongo.resident-memory": "Resident Memory",
+	"mongo.virtual-memory": "Virtual Memory",
+	"mongo.mapped-memory": "Mapped Memory",
+	"mongo.raw-info": "MongoDB Raw Info",
 
 	"redis": "Redis",
-	"redis.version": "Redis 버전",
+	"redis.version": "Redis 버젼",
 	"redis.connected-clients": "연결된 클라이언트",
 	"redis.connected-slaves": "연결된 slaves",
 	"redis.blocked-clients": "차단된 클라이언트",
 	"redis.used-memory": "사용된 메모리",
-	"redis.memory-frag-ratio": "메모리 단편화 비율",
+	"redis.memory-frag-ratio": "Memory Fragmentation Ratio",
 	"redis.total-connections-recieved": "받은 총 커넥션 수",
-	"redis.total-commands-processed": "처리된 총 명령 수",
-	"redis.iops": "초당 순시동작 수",
+	"redis.total-commands-processed": "처리된 총 커맨드 수",
+	"redis.iops": "초당 Instantaneous Ops",
 	"redis.keyspace-hits": "Keyspace 히트",
 	"redis.keyspace-misses": "Keyspace 미스",
-	"redis.raw-info": "Redis 미가공 정보"
+	"redis.raw-info": "Redis Raw Info"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/advanced/errors.json b/public/language/ko/admin/advanced/errors.json
index 78db3b697b..af520c8d00 100644
--- a/public/language/ko/admin/advanced/errors.json
+++ b/public/language/ko/admin/advanced/errors.json
@@ -3,12 +3,12 @@
 	"error-events-per-day": "하루당 %1개의 이벤트 ",
 	"error.404": "404 찾을 수 없음",
 	"error.503": "503 서비스를 사용할 수 없음",
-	"manage-error-log": "오류 기록 관리",
-	"export-error-log": "오류 기록 내보내기 (CSV)",
-	"clear-error-log": "오류 기록 삭제",
-	"route": "Route",
+	"manage-error-log": "오류 로그 관리",
+	"export-error-log": "오류 기록 Export (CSV)",
+	"clear-error-log": "오류 기록 지우기",
+	"route": "라우트",
 	"count": "카운트",
-	"no-routes-not-found": "만세! 404 오류 없음",
+	"no-routes-not-found": "만세! 404 오류 없음!",
 	"clear404-confirm": "404 오류 기록을 지우시겠습니까?",
 	"clear404-success": "\"404 찾을 수 없음\" 오류 삭제 완료"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/advanced/logs.json b/public/language/ko/admin/advanced/logs.json
index f67d566669..9d327241ad 100644
--- a/public/language/ko/admin/advanced/logs.json
+++ b/public/language/ko/admin/advanced/logs.json
@@ -1,7 +1,7 @@
 {
-	"logs": "기록",
-	"control-panel": "기록 제어판",
-	"reload": "기록 다시로드",
-	"clear": "기록 삭제",
-	"clear-success": "기록 삭제완료!"
+	"logs": "로그",
+	"control-panel": "로그 제어판",
+	"reload": "로그 리로드",
+	"clear": "로그 지우기",
+	"clear-success": "로그가 지워졌습니다!"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/appearance/customise.json b/public/language/ko/admin/appearance/customise.json
index 6d75168426..37a5dc71a4 100644
--- a/public/language/ko/admin/appearance/customise.json
+++ b/public/language/ko/admin/appearance/customise.json
@@ -1,12 +1,12 @@
 {
 	"custom-css": "사용자 정의 CSS",
-	"custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 다른 스타일이 적용된 후 적용됩니다.",
+	"custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 이 스타일들은 맨 마지막에 적용됩니다.",
 	"custom-css.enable": "사용자 정의 CSS 허용",
 
 	"custom-header": "사용자 정의 헤더",
-	"custom-header.description": "이곳에 사용자 정의된 HTML을 입력하십시오 (예시. 자바스크립트, 메타 태그, 등등). 당신의 포럼 마크업<head>1 섹션에 추가됩니다.",
+	"custom-header.description": "이곳에 사용자 정의 HTML을 입력하십시오 (예. JavaScript, Meta Tags, 등등). 당신의 포럼의 <head>1 섹션에 추가됩니다.",
 	"custom-header.enable": "사용자 정의 헤더 허용",
 
-	"custom-css.livereload": "실시간 새로고침 허용",
-	"custom-css.livereload.description": "이곳을 클릭하면 당신의 계정에 속한 장치들의 모든 세션들이 세이브할 때마다 새로고침 됩니다."
+	"custom-css.livereload": "실시간 새로 고침 허용",
+	"custom-css.livereload.description": "세이브를 누를 때마다 당신의 계정에 속한 디바이스의 모든 세션들이 새로고침 되게 하시려면 이것을 활성화하세요."
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/appearance/skins.json b/public/language/ko/admin/appearance/skins.json
index 69c0fd3d63..46ff0c9730 100644
--- a/public/language/ko/admin/appearance/skins.json
+++ b/public/language/ko/admin/appearance/skins.json
@@ -5,5 +5,5 @@
 	"current-skin": "현재 스킨",
 	"skin-updated": "스킨 업데이트 됨",
 	"applied-success": "%1 스킨 적용 완료",
-	"revert-success": "기본 색깔로 스킨 복구됨"
+	"revert-success": "기본 색으로 스킨 복구됨"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/appearance/themes.json b/public/language/ko/admin/appearance/themes.json
index 56e7be53f6..0cfebc6430 100644
--- a/public/language/ko/admin/appearance/themes.json
+++ b/public/language/ko/admin/appearance/themes.json
@@ -1,11 +1,11 @@
 {
-    "checking-for-installed": "설치된 테마들 확인 중...",
+    "checking-for-installed": "설치된 테마 확인 중...",
     "homepage": "홈페이지",
     "select-theme": "테마 선택",
     "current-theme": "현재 테마",
     "no-themes": "설치된 테마가 없습니다",
-    "revert-confirm": "기본 NodeBB 테마로 복원하시겠습니까?",
+    "revert-confirm": "정말 기본 NodeBB 테마로 복원하시겠습니까?",
     "theme-changed": "테마 변경 완료",
-    "revert-success": "기본 NodeBB 테마로 성공적으로 복원 완료되었습니다",
+    "revert-success": "성공적으로 기본 NodeBB 테마로 복원됐습니다.",
     "restart-to-activate": "변경된 테마를 완전히 활성화시키기 위해 NodeBB를 다시 시작해주십시오"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/development/info.json b/public/language/ko/admin/development/info.json
index 8bea471bef..cc6edaa69d 100644
--- a/public/language/ko/admin/development/info.json
+++ b/public/language/ko/admin/development/info.json
@@ -1,18 +1,18 @@
 {
-	"you-are-on": "정보 - 여기에 위치합니다 %1:%2",
-	"nodes-responded": "%1 노드가 %2ms 안으로 응답하였습니다",
+	"you-are-on": "정보 - %1:%2에 있습니다.",
+	"nodes-responded": "%1 노드가 %2ms 내로 응답했습니다.",
 	"host": "호스트",
-	"pid": "프로세스 아이디",
+	"pid": "pid",
 	"nodejs": "nodejs",
 	"online": "온라인",
-	"git": "깃",
+	"git": "git",
 	"memory": "메모리",
 	"load": "로드",
-	"uptime": "가동 시간",
+	"uptime": "Uptime",
 
 	"registered": "등록됨",
-	"sockets": "소켓",
-	"guests": "게스트",
+	"sockets": "Sockets",
+	"guests": "미가입 사용자",
 
 	"info": "정보"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/development/logger.json b/public/language/ko/admin/development/logger.json
index 4b40cddab8..9a2a443810 100644
--- a/public/language/ko/admin/development/logger.json
+++ b/public/language/ko/admin/development/logger.json
@@ -1,12 +1,12 @@
 {
-	"logger-settings": "기록 설정",
-	"description": "체크박스를 클릭함으로써 터미널로 기록을 받게됩니다. 만약 파일 경로를 지정하면 기록들이 지정한 파일로 저장됩니다. HTTP 기록은 누가, 언제, 무엇을 포럼에서 했는지에 대한 통계를 내는 데 유용합니다. HTTP 리퀘스트들을 기록함과 더불어 socket.io 이벤트들도 기록할 수 있습니다. Socket.io 기록은 redis-cli 모니터링과 함께 사용하면 NodeBB의 내부를 배우는데 아주 유용할 수 있습니다.",
-	"explanation": "원하실때 기록 환경을 활성화/비활성화 하십시오. 재시작을 할 필요는 없습니다.",
-	"enable-http": "HTTP 기록하기 허용",
-	"enable-socket": "socket.io 이벤트 기록하기 허용",
+	"logger-settings": "로거 설정",
+	"description": "체크 박스를 활성화하면, 터미널에서 로그를 볼 수 있게 됩니다. 만약 파일 경로를 지정하면, 로그가 지정한 파일에 대신 저장됩니다. HTTP 기록은 누가, 언제, 무엇을 포럼에서 했는지에 대한 통계를 내는 데 유용합니다. HTTP 리퀘스트들을 기록할 뿐 아니라, socket.io 이벤트들도 기록할 수 있습니다. Socket.io 기록은 redis-cli 모니터와 함께 사용하면 NodeBB의 내부 사항을 모니터하는 데 아주 유용할 수 있습니다.",
+	"explanation": "원하실 때 로깅 환경을 활성화/비활성화 하십시오. 재시작 할 필요는 없습니다.",
+	"enable-http": "HTTP 로깅 허용",
+	"enable-socket": "socket.io 이벤트 로깅 허용",
 	"file-path": "로그 파일 경로",
-	"file-path-placeholder": "/기록을/저장할/파일까지의경로/file.log ::: 터미널로 기록을 보시려면 빈칸으로 두십시오",
+	"file-path-placeholder": "/path/to/log/file.log ::: 터미널에서 로그를 보시려면 빈칸으로 두세요",
 
-	"control-panel": "기록 제어판",
-	"update-settings": "기록 설정 업데이트"
+	"control-panel": "로거 제어판",
+	"update-settings": "로거 설정 업데이트"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/extend/plugins.json b/public/language/ko/admin/extend/plugins.json
index b77ecafc2c..a669c7e2eb 100644
--- a/public/language/ko/admin/extend/plugins.json
+++ b/public/language/ko/admin/extend/plugins.json
@@ -1,47 +1,47 @@
 {
 	"installed": "설치됨",
-	"active": "활동 중",
-	"inactive": "비활성",
-	"out-of-date": "오래된",
+	"active": "사용 중",
+	"inactive": "사용하지 않는 중",
+	"out-of-date": "업데이트가 안된",
 	"none-found": "플러그인을 찾을 수 없습니다.",
-	"none-active": "활성화된 플러그인이 없습니다.",
+	"none-active": "사용 중인 플러그인이 없습니다.",
 	"find-plugins": "플러그인 찾기",
 
 	"plugin-search": "플러그인 검색",
-	"plugin-search-placeholder": "플러그인 검색...",
-	"reorder-plugins": "플러그인들 재정리",
-	"order-active": "활성화된 플러그인 배열",
-	"dev-interested": "NodeBB 플러그인들을 만드는데 관심이 있으십니까?",
-	"docs-info": "플러그인을 만드는 과정 관련문서는 NodeBB Docs Portal에서 찾아보실 수 있습니다.",
+	"plugin-search-placeholder": "플러그인을 검색하세요...",
+	"reorder-plugins": "플러그인 작동 순서 재배열",
+	"order-active": "사용 중인 플러그인 작동 순서 배열",
+	"dev-interested": "NodeBB 플러그인을 만드는 데 관심이 있으십니까?",
+	"docs-info": "플러그인 제작 관련 문서는 NodeBB Docs Portal에서 찾아보실 수 있습니다.",
 
-	"order.description": "어떤 플러그인들은 다른 플러그인들의 활성화 전/후에 이상적으로 작동합니다.",
-	"order.explanation": "플러그인들은 여기에 나열되어있는 순서로 로드 됩니다.",
+	"order.description": "특정 플러그인은 다른 플러그인의 초기화 전/후에 가장 이상적으로 작동합니다.",
+	"order.explanation": "플러그인들은 여기에 나열된 순서로 로드됩니다.",
 	
-	"plugin-item.themes": "주제들/테마들",
+	"plugin-item.themes": "테마",
 	"plugin-item.deactivate": "비활성화",
 	"plugin-item.activate": "활성화",
 	"plugin-item.install": "설치",
-	"plugin-item.uninstall": "삭제",
-	"plugin-item.settings": "환경",
+	"plugin-item.uninstall": "제거",
+	"plugin-item.settings": "설정",
 	"plugin-item.installed": "설치됨",
 	"plugin-item.latest": "최신",
 	"plugin-item.upgrade": "업그레이드",
-	"plugin-item.more-info": "추가적인 정보를 원할시:",
-	"plugin-item.unknown": "알려지지 않은 것",
-	"plugin-item.unknown-explanation": "이 플러그인의 상태를 분별할 수 없습니다. 잘못된 구성의 탓일 수 있습니다.",
+	"plugin-item.more-info": "추가적인 정보를 원하시면:",
+	"plugin-item.unknown": "알려지지 않은",
+	"plugin-item.unknown-explanation": "이 플러그인의 상태를 알 수 없습니다. 환경 설정에서 발생한 오류 때문일 수 있습니다.",
 
-	"alert.enabled": "플러그인이 활성화되었습니다",
-	"alert.disabled": "플러그인이 비활성화되었습니다.",
-	"alert.upgraded": "플러그인이 업그레이드되었습니다.",
-	"alert.installed": "플러그인이 설치되었습니다.",
-	"alert.uninstalled": "플러그인이 삭제되었습니다.",
-	"alert.activate-success": "이 플러그인을 완전히 활성화하려면 NodeBB를 재시작해주십시오.",
-	"alert.deactivate-success": "플러그인이 성공적으로 비활성화되었습니다.",
+	"alert.enabled": "플러그인이 활성화됐습니다",
+	"alert.disabled": "플러그인이 비활성화됐습니다.",
+	"alert.upgraded": "플러그인이 업그레이드됐습니다.",
+	"alert.installed": "플러그인이 설치됐습니다.",
+	"alert.uninstalled": "플러그인이 제거됐습니다.",
+	"alert.activate-success": "이 플러그인을 완전히 활성화하려면 NodeBB를 다시 시작해주십시오.",
+	"alert.deactivate-success": "플러그인이 성공적으로 비활성화됐습니다.",
 	"alert.upgrade-success": "이 플러그인을 완전히 업그레이드 시키려면 NodeBB를 다시 로드해주십시오.",
-	"alert.install-success": "플러그인 설치가 성공적이었습니다. 플러그인을 활성화 해주십시오.",
-	"alert.uninstall-success": "플러그인이 성공적으로 비활성화되고 삭제되었습니다.",
+	"alert.install-success": "플러그인이 성공적으로 설치됐습니다. 플러그인을 활성화 해주십시오.",
+	"alert.uninstall-success": "플러그인이 성공적으로 비활성화되고 삭제됐습니다.",
 	"alert.suggest-error": "
NodeBB가 페키지 매니저 접근에 실패하였습니다. 최신 버젼을 설치하시겠습니까?
서버의 응답 (%1):%2
",
-	"alert.package-manager-unreachable": "NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는것을 추천하지 않습니다.
",
-	"alert.incompatible": "지금 사용하시는 NodeBB버젼 (v%1)는 이 플러그인을 v%2 버젼까지 업그레이드 할 수 있습니다. 새로운 버젼을 설치하고 싶으시다면 NodeBB를 업그레이드 해주십시오.
",
-	"alert.possibly-incompatible": "호환성관련 정보를 찾지 못했습니다.
이 플러그인은 현재 사용중이신 NodeBB 버젼에 적합한 버젼을 말하지 않았습니다. 완전한 호환성은 보장 못 하고 지금 사용중이신 NodeBB가 고장나실 수 있습니다.
만약 NodeBB가 제대로 켜지지 않을시:
$ ./nodebb reset plugin=\"%1\"
이 플러그인의 최신버젼을 계속해서 다운로드 하시겠습니까?
"
+	"alert.package-manager-unreachable": "NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는 것을 추천하지 않습니다.
",
+	"alert.incompatible": "지금 사용하시는 NodeBB 버젼(v%1)에서는 이 플러그인을 v%2 버젼까지만 업그레이드 할 수 있습니다. 이 플러그인의 최신 버젼을 설치하고 싶으시다면 먼저 NodeBB를 업그레이드 해주십시오.
",
+	"alert.possibly-incompatible": "호환성 관련 정보를 찾지 못했습니다.
이 플러그인은 현재 사용 중이신 NodeBB 버젼에 적합한 버젼을 명시하지 않았습니다. 따라서 완전한 호환성을 보장할 수 없고, 결과적으로 지금 사용중이신 NodeBB에 오류를 일으킬 수도 있습니다.
만약 NodeBB가 제대로 시작되지 않는다면:
$ ./nodebb reset plugin=\"%1\"
이 플러그인의 최신 버젼을 설치를 계속 하시겠습니까?
"
 }
diff --git a/public/language/ko/admin/extend/rewards.json b/public/language/ko/admin/extend/rewards.json
index 297a46f7aa..8262d98597 100644
--- a/public/language/ko/admin/extend/rewards.json
+++ b/public/language/ko/admin/extend/rewards.json
@@ -1,17 +1,17 @@
 {
 	"rewards": "보상",
 	"condition-if-users": "만약 사용자의",
-	"condition-is": "이:",
-	"condition-then": "하다면:",
-	"max-claims": "보상이 유효한 기간",
+	"condition-is": "다음의 조건을 충족한다면:",
+	"condition-then": "다음과 같은 행동을 취합니다:",
+	"max-claims": "보상을 받을 수 있는 횟수",
 	"zero-infinite": "무제한으로 설정하려면 0 으로 설정하세요",
 	"delete": "삭제",
 	"enable": "활성화",
 	"disable": "비활성화",
-	"control-panel": "보상 시스템 제어판",
-	"new-reward": "새로운 보상 시스템",
+	"control-panel": "보상 제어판",
+	"new-reward": "새로운 보상",
 
-	"alert.delete-success": "성공적으로 보상 시스템을 삭제하였습니다.",
-	"alert.no-inputs-found": "잘못된 보상 시스템 - 인풋이 없습니다.",
-	"alert.save-success": "성공적으로 보상 시스템을 저장하였습니다."
+	"alert.delete-success": "성공적으로 보상을 삭제했습니다.",
+	"alert.no-inputs-found": "잘못된 보상 - 인풋이 없습니다!",
+	"alert.save-success": "성공적으로 보상을 저장했습니다."
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/extend/widgets.json b/public/language/ko/admin/extend/widgets.json
index 6b5a893377..135d0bc43b 100644
--- a/public/language/ko/admin/extend/widgets.json
+++ b/public/language/ko/admin/extend/widgets.json
@@ -1,18 +1,18 @@
 {
 	"available": "사용 가능 위젯",
 	"explanation": "드롭다운 메뉴에서 위젯을 고르고 왼쪽에 있는 템플렛의 위젯 위치로 드래그하여 옮기십시오.",
-	"none-installed": "위젯을 찾지 못함! 필수적인 위젯 플러그인들을 플러그인 제어판에서 활성화시켜주십시오.",
-	"containers.available": "사용 가능한 컨테이너들",
+	"none-installed": "위젯을 찾을 수 없습니다! 필수 위젯 플러그인들을 플러그인 제어판에서 활성화하세요.",
+	"containers.available": "사용 가능한 컨테이너",
 	"containers.explanation": "아무 활성화된 위젯 위로 드래그해서 옮겨주십시오.",
 	"containers.none": "없음",
-	"container.well": "좋음",
-	"container.jumbotron": "점보트론",
+	"container.well": "Well",
+	"container.jumbotron": "Jumbotron",
 	"container.panel": "제어판",
 	"container.panel-header": "제어판 헤더",
 	"container.panel-body": "제어판 몸통",
 	"container.alert": "경고",
 
-	"alert.confirm-delete": "위젯을 삭제하시겠습니까?",
+	"alert.confirm-delete": "정말 이 위젯을 삭제하시겠습니까?",
 	"alert.updated": "위젯 업데이트 됨",
 	"alert.update-success": "성공적으로 업데이트 된 위젯"
 
diff --git a/public/language/ko/admin/general/dashboard.json b/public/language/ko/admin/general/dashboard.json
index 026ace2474..b608a99113 100644
--- a/public/language/ko/admin/general/dashboard.json
+++ b/public/language/ko/admin/general/dashboard.json
@@ -3,16 +3,16 @@
 	"page-views": "페이지 뷰",
 	"unique-visitors": "순 방문자수",
 	"users": "사용자",
-	"posts": "게시물",
-	"topics": "주제",
+	"posts": "포스트",
+	"topics": "게시물",
 	"page-views-seven": "지난 7일간",
 	"page-views-thirty": "지난 30일간",
 	"page-views-last-day": "지난 24시간 동안",
 	"page-views-custom": "사용자 설정 날짜 기간",
 	"page-views-custom-start": "기간 시작",
 	"page-views-custom-end": "기간 끝",
-	"page-views-custom-help": "보고자 하시는 날짜 기간 동안의 페이지 본 횟수를 ",
-	"page-views-custom-error": "유효한 기간을 다음 형식으로 써주십시오 YYYY-MM-DD",
+	"page-views-custom-help": "페이지 뷰를 확인하고 싶은 기간을 입력하세요. 만약 데이트 피커를 사용할 수 없다면, YYYY-MM-DD 포맷으로 입력해주세요.",
+	"page-views-custom-error": "유효한 기간을 다음과 같은 포맷으로 입력하세요 YYYY-MM-DD",
 
 	"stats.day": "날",
 	"stats.week": "주",
@@ -20,13 +20,13 @@
 	"stats.all": "항상",
 	
 	"updates": "업데이트",
-	"running-version": "NodeBB v%1 가 돌아가고 있습니다.",
-	"keep-updated": "사용하시는 NodeBB의 보안 및 에러 업데이트가 항상 최신 버전이도록 유의하여 주십시오",
+	"running-version": "NodeBB v%1 를 사용 중입니다.",
+	"keep-updated": "사용하시는 NodeBB의 보안 및 오류 업데이트를 항상 최신 버젼으로 유지하십시오.",
 	"up-to-date": "최신 버전입니다
",
-	"upgrade-available": "새로운 버전 (v%1) 이 출시 되었습니다. 사용하시는 NodeBB를 업데이트 하는 것을 고려하십시오.
",
+	"upgrade-available": "새로운 버전 (v%1) 이 출시 되었습니다. 사용하시는 NodeBB의 업데이트를 고려해보세요.
",
 	"prerelease-upgrade-available": "옛 버전의 NodeBB를 사용하고 계십니다. 새로운 버전의(v%1) NodeBB가 출시되었으니 업데이트 하시는 것을 추천드립니다.
",
-	"prerelease-warning": "이것은 구 버전의 NodeBB 입니다.  예상치 못한 버그가 생길 수 있습니다.
",
-	"running-in-development": "포럼이 개발자 모드로 실행되고 있습니다. 갖가지 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.",
+	"prerelease-warning": "이것은 정식 발표 전 버젼의 NodeBB 입니다.  예상치 못한 버그가 발생할 수 있습니다.
",
+	"running-in-development": "포럼이 개발자 모드로 실행되고 있습니다. 잠재적 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.",
 
 	"notices": "알림",
 	"restart-not-required": "재시작 필요 없음",
diff --git a/public/language/ko/admin/general/homepage.json b/public/language/ko/admin/general/homepage.json
index 1c172dd662..13d43e4de7 100644
--- a/public/language/ko/admin/general/homepage.json
+++ b/public/language/ko/admin/general/homepage.json
@@ -3,5 +3,5 @@
 	"description": "사용자가 루트 URL에 들어갔을 때 어떤 페이지가 보일지 선택하세요.",
 	"home-page-route": "홈페이지 경로",
 	"custom-route": "사용자 지정 경로",
-	"allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허락"
+	"allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허용"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/general/social.json b/public/language/ko/admin/general/social.json
index 05b9f3f92f..35c38ef758 100644
--- a/public/language/ko/admin/general/social.json
+++ b/public/language/ko/admin/general/social.json
@@ -1,5 +1,5 @@
 {
-	"post-sharing": "게시물 공유",
-	"info-plugins-additional": "플러그인에 새로운 네트워크를 추가하여 게시물을 공유할 수 있습니다.",
-	"save-success": "게시물 공유 네트워크 추가 완료!"
+	"post-sharing": "포스트 공유",
+	"info-plugins-additional": "플러그인을 이용해서 포스트를 공유할 수 있는 네트워크를 추가할 수 있습니다.",
+	"save-success": "포스트 공유 네트워크 추가 완료!"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/general/sounds.json b/public/language/ko/admin/general/sounds.json
index 701e9d68cc..70cbb40922 100644
--- a/public/language/ko/admin/general/sounds.json
+++ b/public/language/ko/admin/general/sounds.json
@@ -1,9 +1,9 @@
 {
 	"notifications": "알림",
-	"chat-messages": "대화 메세지",
+	"chat-messages": "채팅 메세지",
 	"play-sound": "재생",
-	"incoming-message": "들어오는 메세지",
-	"outgoing-message": "나가는 메세지",
+	"incoming-message": "수신 메시지",
+	"outgoing-message": "발신 메시지",
 	"upload-new-sound": "새로운 사운드 업로드",
 	"saved": "설정 저장됨"
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json
index 5008312d51..ede245b57b 100644
--- a/public/language/ko/admin/manage/categories.json
+++ b/public/language/ko/admin/manage/categories.json
@@ -1,9 +1,9 @@
 {
-	"settings": "카테고리 설정",
+	"settings": "게시판 설정",
 	"privileges": "권한",
 
-	"name": "카테고리 이름",
-	"description": "카테고리 설명",
+	"name": "게시판 이름",
+	"description": "게시판 설명",
 	"bg-color": "배경 색",
 	"text-color": "글자 색",
 	"bg-image-size": "배경 이미지 크기",
@@ -12,57 +12,57 @@
 	"ext-link": "외부 링크",
 	"upload-image": "이미지 업로드",
 	"delete-image": "삭제",
-	"category-image": "카테고리 이미지",
+	"category-image": "게시판 이미지",
 	"parent-category": "상위 카테고리",
-	"optional-parent-category": "(선택) 상위 카테고리",
+	"optional-parent-category": "(선택) 상위 게시판",
 	"parent-category-none": "(없음)",
 	"copy-settings": "에서 설정 복사",
-	"optional-clone-settings": "(선택) 카테고리에서 설정 복사",
-	"purge": "카테고리 삭제",
+	"optional-clone-settings": "(선택) 게시판에서 설정 복사",
+	"purge": "게시판 삭제",
 
 	"enable": "활성화",
 	"disable": "비활성화",
 	"edit": "편집",
 
-	"select-category": "카테고리 설정",
-	"set-parent-category": "상위 카테고리 설정",
+	"select-category": "게시판 선택",
+	"set-parent-category": "상위 게시판 설정",
 
-	"privileges.description": "이 섹션에서는 카테고리에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 표에 추가할 수 있습니다.",
-	"privileges.warning": "참고: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 카테고리를 따로 저장할 필요가 없습니다.",
+	"privileges.description": "이 섹션에서 게시판에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 테이블에 추가할 수 있습니다.",
+	"privileges.warning": "참고: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 게시판을 따로 저장할 필요가 없습니다.",
 	"privileges.section-viewing": "권한 보기",
 	"privileges.section-posting": "게시물 작성 권한",
-	"privileges.section-moderation": "관리 권한",
+	"privileges.section-moderation": "(준)관리자 권한",
 	"privileges.section-user": "사용자",
 	"privileges.search-user": "사용자 추가",
-	"privileges.no-users": "이 카테고리에는 사용자 별 권한이 없습니다.",
+	"privileges.no-users": "이 게시판에는 사용자 별 권한이 없습니다.",
 	"privileges.section-group": "그룹",
 	"privileges.group-private": "이 그룹은 비공개입니다",
 	"privileges.search-group": "그룹 추가",
 	"privileges.copy-to-children": "하위로 복사",
-	"privileges.copy-from-category": "카테고리에서 복사",
-	"privileges.inherit": "만약 registered-users그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 권한을 얻게 됩니다. 모든 유저가 registered-users 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.",
+	"privileges.copy-from-category": "게시판에서 복사",
+	"privileges.inherit": "만약 registered-users그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 암시적 권한을 얻게 됩니다. 모든 유저가 registered-users 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.",
 
-	"analytics.back": "카테고리 리스트로 돌아가기",
-	"analytics.title": "\"%1\" 카테고리 분석",
-	"analytics.pageviews-hourly": "Figure 1 – 이 카테고리에 대한 시간 당 페이지 뷰 수",
-	"analytics.pageviews-daily": "Figure 2 – 이 카테고리에 대한 일일 페이지 뷰 수",
-	"analytics.topics-daily": "Figure 3 – 이 카테고리의 오늘의 주제들",
-	"analytics.posts-daily": "Figure 4 – 이 카테고리의 오늘의 게시물",
+	"analytics.back": "게시판 목록으로 돌아가기",
+	"analytics.title": "\"%1\" 게시판 분석 결과",
+	"analytics.pageviews-hourly": "Figure 1 – 이 게시판에 대한 시간 당 페이지 뷰 수",
+	"analytics.pageviews-daily": "Figure 2 – 이 게시판에 대한 일일 페이지 뷰 수",
+	"analytics.topics-daily": "Figure 3 – 오늘 이 게시판에 생성된 게시물들",
+	"analytics.posts-daily": "Figure 4 – 오늘 이 게시판에 생성된 포스트들",
 
-	"alert.created": "생성되었습니다",
-	"alert.create-success": "카테고리 성공적으로 생성됨!",
-	"alert.none-active": "활동 중인 카테고리가 없습니다.",
-	"alert.create": "카테고리 생성",
-	"alert.confirm-moderate": "이 사용자 그룹에 관리 권한을 부여하시겠습니까? 이 그룹은 공개 그룹이므로 모든 사용자가 자유롭게 가입 할 수 있습니다.",
-	"alert.confirm-purge": "이 카테고리를 \"%1\" 정말로 제거하시겠습니까?
경고!이 카테고리에 속한 모든 토픽과 게시물들이 삭제됩니다!
카테고리를 제거하시는 것은 모든 토픽과 게시물들을 삭제하고 데이타베이스에서 이 카테고리를 삭제시킵니다. 만약 일시적으로 카테고리를 삭제하고 싶으시다면 삭제 대신 \"비활성화\"를 해주십시오.
",
-	"alert.purge-success": "카테고리 제거됨!",
+	"alert.created": "생성됨",
+	"alert.create-success": "게시판 성공적으로 생성됨!",
+	"alert.none-active": "활성화된 게시판이 없습니다.",
+	"alert.create": "게시판 생성",
+	"alert.confirm-moderate": "이 사용자 그룹에 (준)관리지 권한을 부여하시겠습니까? 이 그룹은 공개 그룹이므로 모든 사용자가 자유롭게 가입 할 수 있습니다.",
+	"alert.confirm-purge": "정말로 이 게시판을 \"%1\" 제거하시겠습니까?
경고!이 게시판에 속한 모든 게시물과 포스트가 삭제됩니다!
게시판을 제거하게 되면 모든 게시물과 포스트가 삭제되고 데이터베이스에서도 이 게시판이 삭제됩니다. 만약 일시적으로 게시판을 없애고 싶으시다면 삭제 대신 \"비활성화\"를 해주십시오.
",
+	"alert.purge-success": "게시판 제거됨!",
 	"alert.copy-success": "설정 복사됨!",
-	"alert.set-parent-category": "상위 카테고리 설정",
-	"alert.updated": "업데이트 된 카테고리들",
-	"alert.updated-success": "카테고리 ID %1 성공적으로 업데이트 됨.",
-	"alert.upload-image": "카테고리 이미지 업로드",
+	"alert.set-parent-category": "상위 게시판 설정",
+	"alert.updated": "업데이트 된 게시판",
+	"alert.updated-success": "게시판 ID %1 성공적으로 업데이트 됨.",
+	"alert.upload-image": "게시판 이미지 업로드",
 	"alert.find-user": "사용자 검색",
-	"alert.user-search": "여기에 사용자를 검색하십시오...",
+	"alert.user-search": "여기서 사용자를 검색하십시오...",
 	"alert.find-group": "그룹 검색",
-	"alert.group-search": "여기에 그룹을 검색하십시오..."
+	"alert.group-search": "여기서 그룹을 검색하십시오..."
 }
\ No newline at end of file
diff --git a/public/language/ko/admin/manage/registration.json b/public/language/ko/admin/manage/registration.json
index 84e61d5829..b96c52c1ac 100644
--- a/public/language/ko/admin/manage/registration.json
+++ b/public/language/ko/admin/manage/registration.json
@@ -6,9 +6,9 @@
 	"list.email": "이메일",
 	"list.ip": "IP 주소",
 	"list.time": "시간",
-	"list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3",
-	"list.email-spam": "Frequency: %1 Appears: %2",
-	"list.ip-spam": "Frequency: %1 Appears: %2",
+	"list.username-spam": "빈도: %1 출연 유무: %2 신뢰도: %3",
+	"list.email-spam": "빈도: %1 출연 유무: %2",
+	"list.ip-spam": "빈도: %1 출연 유무: %2",
 
 	"invitations": "초대",
 	"invitations.description": "발송된 초대의 목록을 아래에서 보실 수 있습니다. ctrl-f을 이용해서 이메일이나 사용자명으로 목록을 검색하세요. 
초대에 응답한 사용자들은 이메일 옆에 사용자명이 표시됩니다.",
diff --git a/public/language/ko/search.json b/public/language/ko/search.json
index addd305d1e..41d207e08c 100644
--- a/public/language/ko/search.json
+++ b/public/language/ko/search.json
@@ -1,14 +1,14 @@
 {
-    "results_matching": "\"%2\"와 일치하는 %1개의 결과를 찾았습니다 (검색시간: %3초)",
+    "results_matching": "\"%2\"와 일치하는 %1 개의 결과를 찾았습니다 (검색시간: %3초)",
     "no-matches": "일치하는 결과가 없습니다.",
     "advanced-search": "고급 검색",
-    "in": "안에서 검색",
+    "in": "검색 기준",
     "titles": "제목",
-    "titles-posts": "제목과 게시물",
-    "posted-by": "다음 사용자에 의해 작성됨",
-    "in-categories": "카테고리 내",
-    "search-child-categories": "하위 카테고리를 검색",
-    "has-tags": "태그 달린 게시물",
+    "titles-posts": "제목과 내용",
+    "posted-by": "작성자",
+    "in-categories": "게시판 지정",
+    "search-child-categories": "하위 게시판도 검색",
+    "has-tags": "태그로 검색",
     "reply-count": "답변 수",
     "at-least": "적어도",
     "at-most": "최대",
@@ -24,19 +24,19 @@
     "three-months": "세 달",
     "six-months": "여섯 달",
     "one-year": "일 년",
-    "sort-by": "정렬",
+    "sort-by": "정렬 기준",
     "last-reply-time": "마지막으로 답글이 달린 시간",
-    "topic-title": "주제 제목",
+    "topic-title": "게시물 제목",
     "number-of-replies": "답글 수",
     "number-of-views": "조회 수",
-    "topic-start-date": "주제가 게시된 날짜",
+    "topic-start-date": "게시물이 작성된 날짜",
     "username": "사용자명",
-    "category": "카테고리",
+    "category": "게시판",
     "descending": "내림차순",
     "ascending": "오름차순",
     "save-preferences": "설정 저장",
     "clear-preferences": "설정 초기화",
     "search-preferences-saved": "검색 설정이 저장되었습니다.",
     "search-preferences-cleared": "검색 설정이 초기화되었습니다.",
-    "show-results-as": "검색결과 정렬 - "
+    "show-results-as": "검색결과 표시방법"
 }
\ No newline at end of file
diff --git a/public/language/ko/success.json b/public/language/ko/success.json
index e7b911bb2d..051a6c2299 100644
--- a/public/language/ko/success.json
+++ b/public/language/ko/success.json
@@ -2,5 +2,5 @@
     "success": "성공",
     "topic-post": "성공적으로 게시물을 작성했습니다.",
     "authentication-successful": "인증에 성공했습니다.",
-    "settings-saved": "성공적으로 설정을 저장했습니다."
+    "settings-saved": "설정이 저장되었습니다!"
 }
\ No newline at end of file
diff --git a/public/language/ko/tags.json b/public/language/ko/tags.json
index d088ef7041..aa0f44e62c 100644
--- a/public/language/ko/tags.json
+++ b/public/language/ko/tags.json
@@ -1,7 +1,7 @@
 {
-    "no_tag_topics": "이 태그에 해당하는 주제가 없습니다.",
-    "tags": "태그",
-    "enter_tags_here": "%1 와 %2 글자 안에서 태그를 입력하세요.",
+    "no_tag_topics": "이 태그가 달린 게시물이 없습니다.",
+    "tags": "태그 목록",
+    "enter_tags_here": "%1 에서 %2 자 안에서 태그를 입력하세요.",
     "enter_tags_here_short": "태그 입력...",
-    "no_tags": "아직 아무런 태그도 없습니다."
+    "no_tags": "아직 태그가 달리지 않았습니다."
 }
\ No newline at end of file
diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json
index 9043fc42bb..11884b0118 100644
--- a/public/language/ko/topic.json
+++ b/public/language/ko/topic.json
@@ -1,58 +1,58 @@
 {
-    "topic": "주제",
-    "topic_id": "주제 ID",
-    "topic_id_placeholder": "여기에 주제 ID를 입력하세요.",
-    "no_topics_found": "주제를 찾을 수 없습니다.",
-    "no_posts_found": "게시물을 찾을 수 없습니다.",
-    "post_is_deleted": "이 게시물은 삭제됐습니다!",
-    "topic_is_deleted": "이 주제는 삭제됐습니다!",
+    "topic": "게시물",
+    "topic_id": "게시물 ID",
+    "topic_id_placeholder": "여기에 게시물 ID를 입력하세요.",
+    "no_topics_found": "게시물을 찾을 수 없습니다!",
+    "no_posts_found": "포스트를 찾을 수 없습니다!",
+    "post_is_deleted": "이 포스트는 삭제됐습니다!",
+    "topic_is_deleted": "이 포스트는 삭제됐습니다!",
     "profile": "프로필",
-    "posted_by": "%1님에 의해 작성됨",
-    "posted_by_guest": "게스트에 의해 작성됨",
+    "posted_by": "%1 님에 의해 작성됨",
+    "posted_by_guest": "미가입 사용자에 의해 작성됨",
     "chat": "채팅",
-    "notify_me": "이 주제의 새 답글에 대한 알림 받기",
+    "notify_me": "이 게시물의 새 답글에 대한 알림 받기",
     "quote": "인용",
     "reply": "답글",
-    "replies_to_this_post": "%1개의 답글",
-    "one_reply_to_this_post": "1개의 답글",
+    "replies_to_this_post": "%1 개의 답글",
+    "one_reply_to_this_post": "1 개의 답글",
     "last_reply_time": "마지막 답글",
-    "reply-as-topic": "주제로 답글",
-    "guest-login-reply": "답변을 위해 로그인하세요",
+    "reply-as-topic": "게시물로 답글하기",
+    "guest-login-reply": "답글을 작성하기 위해 로그인",
     "edit": "수정",
     "delete": "삭제",
     "purge": "폐기",
     "restore": "복원",
     "move": "이동",
     "fork": "분리",
-    "link": "링크",
+    "link": "바로가기",
     "share": "공유",
     "tools": "도구",
-    "locked": "잠김",
-    "pinned": "고정됨",
-    "moved": "이동됨",
-    "bookmark_instructions": "이 스레드에서 읽은 마지막 게시글로 이동하시려면 여기를 클릭하세요.",
-    "flag_title": "이 게시물을 신고",
-    "deleted_message": "이 주제는 삭제됐습니다. 주제 관리 권한이 있는 사용자만 볼 수 있습니다.",
-    "following_topic.message": "이제 이 주제에 새 답글이 달리면 알림을 받습니다.",
-    "not_following_topic.message": "이 주제를 아직 읽지 않은 주제 목록에서 볼 수 있지만, 누군가 이 주제에 포스트하기 전까지는 알림을 받지 않습니다.",
-    "ignoring_topic.message": "더 이상 이 주제는 읽지 않은 주제 목록에서 보이지 않습니다. 누군가 나를 언급하거나 내 포스트가 upvote되면 알림을 받습니다.",
-    "login_to_subscribe": "이 주제를 구독하기 위해서는 로그인해야 합니다.",
+    "locked": "잠긴 게시물",
+    "pinned": "고정된 게시물",
+    "moved": "이동된 게시물",
+    "bookmark_instructions": "이 스레드에서 읽은 마지막 포스트로 이동하시려면 여기를 클릭 하세요.",
+    "flag_title": "이 포스트를 신고",
+    "deleted_message": "이 게시물은 삭제됐습니다. 게시물 관리 권한이 있는 사용자만 볼 수 있습니다.",
+    "following_topic.message": "이제 이 게시물에 새 답글이 달리면 알림을 받습니다.",
+    "not_following_topic.message": "이 게시물을 아직 읽지 않은 게시물 목록에서 볼 수 있지만, 이 주제에 달린 포스트에 대해서는 알림을 받지 않습니다.",
+    "ignoring_topic.message": "더 이상 이 게시물은 읽지 않은 게시물 목록에서 보이지 않습니다. 누군가 나를 언급하거나 내 포스트가 추천 받으면 알림을 받습니다.",
+    "login_to_subscribe": "이 게시물을 관심 목록에 추가하기 위해서는 로그인해야 합니다.",
     "markAsUnreadForAll.success": "모든 사용자에 대해 읽지 않음으로 표시했습니다.",
     "mark_unread": "읽지 않음으로 표시",
-    "mark_unread.success": "성공적으로 읽지 않음으로 표시했습니다.",
-    "watch": "관심 주제 설정",
-    "unwatch": "관심 주제 해제",
-    "watch.title": "이 주제의 새 답글 알리기",
-    "unwatch.title": "이 주제에 대한 관심을 해제합니다.",
-    "share_this_post": "이 게시물 공유",
+    "mark_unread.success": "게시물을 읽지 않음으로 표시했습니다",
+    "watch": "관심 목록에 추가",
+    "unwatch": "관심 목록에서 제거",
+    "watch.title": "이 게시물의 새 답글에 대해 알림 받기",
+    "unwatch.title": "이 게시물을 관심 목록에서 제거합니다.",
+    "share_this_post": "이 포스트를 공유",
     "watching": "관심 있음",
     "not-watching": "관심 없음",
-    "ignoring": "무시하기",
-    "watching.description": "새로운 답글에 대한 알림 받기. 
 읽지 않음에서 주제 보여주기.",
-    "not-watching.description": "새로운 답글에 대해 알림 받지 않기. 해당 카테고리를 팔로우 중이라면 \"읽지않은 토픽\" 에서 보여주기.",
-    "ignoring.description": "새로운 답글에 대한 알림 받지 않기. \"읽지않은 토픽\"에서 보여주지 않기.",
-    "thread_tools.title": "주제 관리",
-    "thread_tools.markAsUnreadForAll": "모두 읽지 않음으로 표시",
+    "ignoring": "무시하는 중",
+    "watching.description": "새로운 답글에 대한 알림 받기. 
 읽지 않은 게시물에 보여주기.",
+    "not-watching.description": "새로운 답글에 대해 알림 받지 않기. 해당 게시판을 팔로우 중이라면 \"읽지않은 게시물\" 에서 보여주기.",
+    "ignoring.description": "새로운 답글에 대한 알림 받지 않기. \"읽지않은 게시물\"에서 보여주지 않기.",
+    "thread_tools.title": "게시물 관리",
+    "thread_tools.markAsUnreadForAll": "모든 사용자에게 읽지 않음으로 표시",
     "thread_tools.pin": "상단 고정",
     "thread_tools.unpin": "상단 고정 해제",
     "thread_tools.lock": "잠금",
@@ -61,60 +61,60 @@
     "thread_tools.move_all": "모두 이동",
     "thread_tools.fork": "주제 분리",
     "thread_tools.delete": "삭제",
-    "thread_tools.delete-posts": "게시물 삭제",
-    "thread_tools.delete_confirm": "이 주제를 삭제하시겠습니까?",
-    "thread_tools.restore": "복원",
-    "thread_tools.restore_confirm": "이 주제를 복원하시겠습니까?",
-    "thread_tools.purge": "주제 폐기",
-    "thread_tools.purge_confirm": "이 주제를 폐기하시겠습니까?",
-    "topic_move_success": "성공적으로 이 주제를 %1로 이동했습니다.",
-    "post_delete_confirm": "이 게시물을 삭제하시겠습니까?",
-    "post_restore_confirm": "이 게시물을 복원하시겠습니까?",
-    "post_purge_confirm": "이 게시물을 폐기하시겠습니까?",
-    "load_categories": "카테고리 로딩 중",
-    "disabled_categories_note": "비활성화된 카테고리는 회색으로 표시됩니다.",
+    "thread_tools.delete-posts": "포스트 삭제",
+    "thread_tools.delete_confirm": "이 게시물을 삭제 하시겠습니까?",
+    "thread_tools.restore": "게시물 복원",
+    "thread_tools.restore_confirm": "이 게시물을 복원 하시겠습니까?",
+    "thread_tools.purge": "게시물 폐기",
+    "thread_tools.purge_confirm": "이 게시물을 폐기 하시겠습니까?",
+    "topic_move_success": "성공적으로 이 게시물을 %1로 이동했습니다.",
+    "post_delete_confirm": "이 포스트를 삭제 하시겠습니까?",
+    "post_restore_confirm": "이 포스트를 복원 하시겠습니까?",
+    "post_purge_confirm": "이 포스트를 폐기 하시겠습니까?",
+    "load_categories": "게시판들을 읽어오는 중입니다.",
+    "disabled_categories_note": "비활성화된 게시판은 회색으로 표시됩니다.",
     "confirm_move": "이동",
     "confirm_fork": "분리",
     "bookmark": "즐겨찾기",
     "bookmarks": "즐겨찾기 목록",
-    "bookmarks.has_no_bookmarks": "즐겨찾기에 추가한 게시글이 없습니다.",
-    "loading_more_posts": "게시물을 로딩 중",
-    "move_topic": "주제 이동",
-    "move_topics": "주제 이동",
-    "move_post": "게시물 이동",
-    "post_moved": "게시물이 이동되었습니다.",
-    "fork_topic": "주제 분리",
-    "topic_will_be_moved_to": "이 주제를 지정한 카테고리로 이동합니다.",
-    "fork_topic_instruction": "분리할 게시물을 선택하세요.",
-    "fork_no_pids": "게시물이 선택되지 않았습니다.",
-    "fork_pid_count": "%1 개의 게시물(들)이 선택되었습니다",
-    "fork_success": "주제가 분리되었습니다! 분리된 주제를 보려면 여기를 클릭하세요.",
-    "delete_posts_instruction": "삭제할 게시물을 선택하세요.",
-    "composer.title_placeholder": "여기에 제목을 입력하세요.",
+    "bookmarks.has_no_bookmarks": "즐겨찾기에 추가한 포스트가 없습니다.",
+    "loading_more_posts": "포스트를 읽어오는 중입니다.",
+    "move_topic": "게시물 이동",
+    "move_topics": "게시물 이동",
+    "move_post": "포스트 이동",
+    "post_moved": "포스트가 이동되었습니다.",
+    "fork_topic": "게시물 분리",
+    "topic_will_be_moved_to": "이 게시물이 지정한 게시판으로 이동합니다.",
+    "fork_topic_instruction": "분리할 포스트를 선택하세요.",
+    "fork_no_pids": "선택된 포스트가 없습니다.",
+    "fork_pid_count": "%1 개의 포스트(들)이 선택되었습니다",
+    "fork_success": "게시물이 분리되었습니다! 분리된 게시물을 보려면 여기를 클릭 하세요.",
+    "delete_posts_instruction": "삭제할 포스트를 선택하세요.",
+    "composer.title_placeholder": "게시물 제목을 입력하세요.",
     "composer.handle_placeholder": "이름",
     "composer.discard": "취소",
     "composer.submit": "등록",
     "composer.replying_to": "'%1'에 대한 답글",
     "composer.new_topic": "새 주제 생성",
     "composer.uploading": "업로드 중",
-    "composer.thumb_url_label": "섬네일 URL",
-    "composer.thumb_title": "이 주제에 섬네일 추가",
+    "composer.thumb_url_label": "섬네일 URL을 붙여넣으세요",
+    "composer.thumb_title": "이 게시물에 섬네일 추가",
     "composer.thumb_url_placeholder": "http://example.com/thumb.png",
-    "composer.thumb_file_label": "혹은 파일 업로드",
+    "composer.thumb_file_label": "혹은 파일을 업로드 해주세요",
     "composer.thumb_remove": "섬네일 삭제",
     "composer.drag_and_drop_images": "이미지를 여기에 드래그&드롭하세요.",
     "more_users_and_guests": "%1명 이상의 회원과 %2명의 익명 사용자",
     "more_users": "%1명 이상의 회원",
     "more_guests": "%1명 이상의 익명 사용자",
     "users_and_others": "%1님 외 %2명",
-    "sort_by": "정렬",
+    "sort_by": "정렬 기준",
     "oldest_to_newest": "오래된 순으로 정렬",
     "newest_to_oldest": "최신 순으로 정렬",
     "most_votes": "추천수 순으로 정렬",
     "most_posts": "포스트 많은 순으로 정렬",
-    "stale.title": "새로 주제를 생성하시겠습니까?",
-    "stale.warning": "현재 답글을 작성중인 주제가 꽤 오래되었습니다. 새로 주제를 생성하시고 이글을 인용하시겠습니까?",
-    "stale.create": "새로운 주제를 작성",
-    "stale.reply_anyway": "아무튼 이 주제에 답변해주세요.",
+    "stale.title": "새로운 게시물을 생성 하시겠습니까?",
+    "stale.warning": "현재 답글을 작성중인 게시물은 오래전에 작성 되었습니다. 새로 게시물을 생성하시고 이 게시물을 인용 하시겠습니까?",
+    "stale.create": "새로운 게시물 작성",
+    "stale.reply_anyway": "이 게시물에 답글 작성",
     "link_back": "답글: [%1](%2)"
 }
\ No newline at end of file
diff --git a/public/language/ko/unread.json b/public/language/ko/unread.json
index 2c710aa499..362d75cbe9 100644
--- a/public/language/ko/unread.json
+++ b/public/language/ko/unread.json
@@ -1,13 +1,13 @@
 {
     "title": "읽지 않음",
-    "no_unread_topics": "읽지 않은 주제가 없습니다.",
+    "no_unread_topics": "읽지 않은 게시물이 없습니다.",
     "load_more": "더 보기",
     "mark_as_read": "읽음으로 표시",
-    "selected": "선택됨",
+    "selected": "선택된 게시물",
     "all": "전체",
-    "all_categories": "모든 카테고리",
-    "topics_marked_as_read.success": "토픽들을 읽음으로 표시했습니다.",
-    "all-topics": "모든 주제",
-    "new-topics": "새 주제",
-    "watched-topics": "관심 주제"
+    "all_categories": "모든 게시판",
+    "topics_marked_as_read.success": "게시물들을 읽음으로 표시했습니다.",
+    "all-topics": "모든 게시물",
+    "new-topics": "새 게시물",
+    "watched-topics": "관심있는 게시물"
 }
\ No newline at end of file
diff --git a/public/language/ko/user.json b/public/language/ko/user.json
index 981aa5c1ec..7ae2e74f74 100644
--- a/public/language/ko/user.json
+++ b/public/language/ko/user.json
@@ -1,9 +1,9 @@
 {
-    "banned": "차단됨",
+    "banned": "차단된 계정",
     "offline": "오프라인",
     "username": "사용자 이름",
     "joindate": "가입일",
-    "postcount": "게시물 수",
+    "postcount": "포스트 수",
     "email": "이메일",
     "confirm_email": "이메일 확인",
     "account_info": "계정 정보",
@@ -11,33 +11,33 @@
     "ban_account_confirm": "이 사용자를 차단하시겠습니까?",
     "unban_account": "차단 해제",
     "delete_account": "계정 삭제",
-    "delete_account_confirm": "정말 계정을 삭제하시겠습니까? 
이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.
계정 삭제를 원하면 사용자 이름을 입력하세요.",
-    "delete_this_account_confirm": "정말 계정을 삭제하시겠습니까? 
이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.
",
-    "account-deleted": "삭제된 계정",
+    "delete_account_confirm": "정말 계정을 삭제 하시겠습니까? 
이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.
계정 삭제를 원하면 사용자 이름을 입력하세요.",
+    "delete_this_account_confirm": "정말 계정을 삭제 하시겠습니까? 
이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.
",
+    "account-deleted": "계정이 삭제 되었습니다",
     "fullname": "이름",
     "website": "웹 사이트",
     "location": "위치",
     "age": "나이",
     "joined": "가입됨",
-    "lastonline": "마지막 로그인",
+    "lastonline": "최근 온라인 시점",
     "profile": "프로필",
     "profile_views": "프로필 조회 수",
-    "reputation": "평판",
+    "reputation": "등급",
     "bookmarks": "즐겨찾기",
-    "watched": "읽음",
+    "watched": "관심있는 게시물",
     "followers": "팔로워",
-    "following": "팔로우하는 중",
-    "aboutme": "자기 소개",
+    "following": "팔로잉",
+    "aboutme": "자기소개",
     "signature": "서명",
     "birthday": "생일",
     "chat": "채팅",
     "chat_with": "%1과/와 채팅 계속",
     "new_chat_with": "%1과/와 새로운 채팅",
-    "flag-profile": "프로필 플래그",
+    "flag-profile": "프로필 신고",
     "follow": "팔로우",
     "unfollow": "팔로우 취소",
     "more": "더 보기",
-    "profile_update_success": "성공적으로 프로필을 저장했습니다!",
+    "profile_update_success": "프로필을 성공적으로 저장했습니다.",
     "change_picture": "사진 변경",
     "change_username": "사용자명 변경",
     "change_email": "이메일 변경",
@@ -49,13 +49,13 @@
     "upload_new_picture_from_url": "URL을 통해 새 사진 업로드",
     "current_password": "현재 비밀번호",
     "change_password": "비밀번호 변경",
-    "change_password_error": "올바르지 않은 비밀번호",
+    "change_password_error": "올바르지 않은 비밀번호입니다!",
     "change_password_error_wrong_current": "현재 비밀번호가 일치하지 않습니다!",
-    "change_password_error_length": "비밀번호가 너무 짧습니다.",
+    "change_password_error_length": "비밀번호가 너무 짧습니다!",
     "change_password_error_match": "재입력한 비밀번호가 새 비밀번호와 일치하지 않습니다!",
     "change_password_error_privileges": "비밀번호를 바꿀 권한이 없습니다.",
     "change_password_success": "비밀번호를 변경했습니다.",
-    "confirm_password": "비밀번호 재입력",
+    "confirm_password": "비밀번호 확인",
     "password": "비밀번호",
     "username_taken_workaround": "새 사용자 이름이 이미 존재하여 %1로 저장되었습니다.",
     "password_same_as_username": "비밀번호가 사용자명과 동일합니다. 다른 비밀번호를 입력하세요.",
@@ -63,7 +63,7 @@
     "weak_password": "보안이 취약한 비밀번호입니다.",
     "upload_picture": "사진 업로드",
     "upload_a_picture": "사진 업로드",
-    "remove_uploaded_picture": "등록된 사진을 삭제",
+    "remove_uploaded_picture": "업로드한 사진을 삭제",
     "upload_cover_picture": "커버 사진 업로드",
     "remove_cover_picture_confirm": "커버 사진을 제거하시겠습니까?",
     "crop_picture": "사진 잘라내기",
@@ -72,63 +72,63 @@
     "show_email": "내 이메일 보기",
     "show_fullname": "내 이름 보기",
     "restrict_chats": "내가 팔로우하는 이용자들로부터만 대화를 허용",
-    "digest_label": "포럼 이메일 수신",
-    "digest_description": "지정된 주기로 이 포럼의 이메일(새 알림과 토픽)을 수신",
+    "digest_label": "포럼 이메일 구독",
+    "digest_description": "주기적으로 포럼 이메일(새 알림과 게시물)을 구독",
     "digest_off": "해제",
     "digest_daily": "매일",
     "digest_weekly": "매주",
     "digest_monthly": "매월",
     "send_chat_notifications": "오프라인일 때 채팅 메시지가 도착하면 알림 메일을 보냅니다.",
-    "send_post_notifications": "내가 구독한 주제에 답글이 달리면 메일 보내기.",
-    "settings-require-reload": "일부 설정 변경은 리로딩이 필요합니다. 여기를 눌러서 페이지를 리로딩 해주세요.",
+    "send_post_notifications": "내가 관심있는 게시물에 답글이 달리면 메일을 보냅니다.",
+    "settings-require-reload": "일부 설정 변경은 새로고침이 필요합니다. 여기를 눌러서 페이지를 새로고침 해주세요.",
     "has_no_follower": "이 사용자는 팔로워가 없습니다 :(",
-    "follows_no_one": "이 사용자는 아무도 팔로우하지 않습니다 :(",
-    "has_no_posts": "이 사용자가 포스트한 게시물이 없습니다.",
-    "has_no_topics": "이 사용자가 포스트한 주제가 없습니다.",
-    "has_no_watched_topics": "이 사용자가 관심 목록에 추가한 주제가 없습니다.",
-    "has_no_upvoted_posts": "이 사용자가 upvote한 게시물이 없습니다.",
-    "has_no_downvoted_posts": "이 사용자가 downvote한 게시물이 없습니다.",
-    "has_no_voted_posts": "이 사용자가 vote한 게시물이 없습니다.",
+    "follows_no_one": "이 사용자는 아무도 팔로우하고 있지 않습니다 :(",
+    "has_no_posts": "이 사용자가 작성한 포스트가 없습니다.",
+    "has_no_topics": "이 사용자가 작성한 게시물이 없습니다.",
+    "has_no_watched_topics": "이 사용자가 관심 목록에 추가한 게시물이 없습니다.",
+    "has_no_upvoted_posts": "이 사용자가 추천한 포스트가 없습니다.",
+    "has_no_downvoted_posts": "이 사용자가 비추천한 포스트가 없습니다.",
+    "has_no_voted_posts": "평가받은 게시물이 없습니다.",
     "email_hidden": "이메일 비공개",
     "hidden": "비공개",
-    "paginate_description": "주제와 게시물을 무한 스크롤 대신 페이지뷰로 보기",
-    "topics_per_page": "페이지 당 주제 수",
-    "posts_per_page": "페이지 당 게시물 수",
+    "paginate_description": "주제와 게시물을 페이지로 정리",
+    "topics_per_page": "페이지 당 게시물 수",
+    "posts_per_page": "페이지 당 포스트 수",
     "notification_sounds": "알림 수신시 소리로 알려주기",
-    "notifications_and_sounds": "알림과 알림음",
+    "notifications_and_sounds": "알림 / 알림음 설정",
     "incoming-message-sound": "수신 메시지 알림음",
     "outgoing-message-sound": "발신 메시지 알림음",
     "notification-sound": "알림음",
-    "no-sound": "묵음",
-    "browsing": "브라우징 세팅",
+    "no-sound": "음소거",
+    "browsing": "브라우징 설정",
     "open_links_in_new_tab": "외부 링크를 새로운 탭에서 열람",
-    "enable_topic_searching": "주제 내 검색 허용",
-    "topic_search_help": "만약 활성화된다면, 브라우저의 기본 검색 기능은 무효화되고 주제 내 검색을 통해 화면에 보여지는 것 뿐만 아니라 주제 전체의 내용을 검색할 수 있습니다.",
+    "enable_topic_searching": "게시물 내 검색 허용",
+    "topic_search_help": "만약 활성화된다면, 브라우저의 기본 검색 기능은 무효화되고 게시물 내 검색을 통해 화면에 보여지는 것 뿐만 아니라 게시물 전체의 내용을 검색할 수 있습니다.",
     "delay_image_loading": "이미지 로딩 지연",
     "image_load_delay_help": "만약 활성화된다면, 이미지 위치로 스크롤을 움직이기 전까지 이미지가 로드 되지 않습니다.",
     "scroll_to_my_post": "답글 게시 후 새 포스트 보여주기",
-    "follow_topics_you_reply_to": "내가 답글을 단 토픽을 관심 주제로 설정",
-    "follow_topics_you_create": "내가 게시한 토픽을 관심 토픽으로 설정",
+    "follow_topics_you_reply_to": "내가 답글을 단 게시물을 관심 목록에 추가",
+    "follow_topics_you_create": "내가 작성한 게시물을 관심 목록에 추가",
     "grouptitle": "그룹 이름",
     "no-group-title": "그룹 이름이 없습니다.",
     "select-skin": "스킨 선택",
     "select-homepage": "홈페이지 선택",
     "homepage": "홈페이지",
     "homepage_description": "포럼 홈페이지로 사용할 페이지를 선택하거나 'None'으로 설정하여 기본 홈페이지를 사용합니다.",
-    "custom_route": "홈페이지 수동 경로",
-    "custom_route_help": "라우팅 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"최근 목록\", \"인기 게시물\")",
+    "custom_route": "사용자 지정 홈페이지 라우트",
+    "custom_route_help": "라우트 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"/recent\" => \"recent\", \"/popular\" => \"popular\")",
     "sso.title": "통합 인증 서비스",
-    "sso.associated": "와/과 연관된",
-    "sso.not-associated": "이 곳을 클릭하여 연관지으세요.",
-    "info.latest-flags": "최신 플래그",
-    "info.no-flags": "플래그된 포스트가 없습니다.",
+    "sso.associated": "와/과 연동된",
+    "sso.not-associated": "이 곳을 클릭하여 연동시키세요.",
+    "info.latest-flags": "최근에 들어온 신고",
+    "info.no-flags": "신고된 포스트가 없습니다.",
     "info.ban-history": "최근 차단 히스토리",
     "info.no-ban-history": "이 사용자는 차단된 적이 없습니다.",
     "info.banned-until": "%1까지 차단됨",
     "info.banned-permanently": "영구 차단",
-    "info.banned-reason-label": "이유",
-    "info.banned-no-reason": "제공된 이유가 없습니다.",
-    "info.username-history": "사용자 이름 히스토리",
+    "info.banned-reason-label": "사유",
+    "info.banned-no-reason": "제공된 사유가 없습니다.",
+    "info.username-history": "사용자명 변경 히스토리",
     "info.email-history": "이메일 히스토리",
     "info.moderation-note": "관리자 노트",
     "info.moderation-note.success": "관리자 노트 저장완료",
diff --git a/public/language/ko/users.json b/public/language/ko/users.json
index b71d5c35fa..317fd7e208 100644
--- a/public/language/ko/users.json
+++ b/public/language/ko/users.json
@@ -1,21 +1,21 @@
 {
-    "latest_users": "최근 사용자",
-    "top_posters": "가장 많은 게시물을 올린 사용자",
-    "most_reputation": "가장 높은 평판",
-    "most_flags": "가장 많은 플래그",
+    "latest_users": "최근 가입 순",
+    "top_posters": "작성 게시물 순",
+    "most_reputation": "사용자 등급 순",
+    "most_flags": "신고 순",
     "search": "검색",
-    "enter_username": "검색할 사용자 이름을 입력하세요.",
+    "enter_username": "검색할 사용자명을 입력하세요.",
     "load_more": "더 보기",
-    "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2 초",
-    "filter-by": "에 의해 분류",
-    "online-only": "온라인 전용",
+    "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2초",
+    "filter-by": "필터 기준",
+    "online-only": "접속한 사용자",
     "invite": "초대",
     "invitation-email-sent": "%1님에게 초대 메일을 보냈습니다.",
     "user_list": "사용자 목록",
-    "recent_topics": "최근 주제",
-    "popular_topics": "인기 주제",
-    "unread_topics": "읽지 않은 주제",
-    "categories": "카테고리",
+    "recent_topics": "최근 게시물",
+    "popular_topics": "인기 게시물",
+    "unread_topics": "읽지 않은 게시물",
+    "categories": "게시판 목록",
     "tags": "태그",
     "no-users-found": "사용자를 찾을 수 없습니다!"
 }
\ No newline at end of file
diff --git a/public/language/vi/admin/advanced/database.json b/public/language/vi/admin/advanced/database.json
index 7dd15423dc..27aaa79b67 100644
--- a/public/language/vi/admin/advanced/database.json
+++ b/public/language/vi/admin/advanced/database.json
@@ -17,7 +17,7 @@
 	"mongo.file-size": "Kích thước tập tin",
 	"mongo.resident-memory": "Resident Memory",
 	"mongo.virtual-memory": "Bộ nhớ ảo",
-	"mongo.mapped-memory": "Mapped Memory",
+	"mongo.mapped-memory": "Nhìn vào bộ nhớ ảo",
 	"mongo.raw-info": "Thông tin MongoDB",
 
 	"redis": "Redis",
diff --git a/public/src/client/account/edit/username.js b/public/src/client/account/edit/username.js
index 33d8ea99cd..f00e4d16fe 100644
--- a/public/src/client/account/edit/username.js
+++ b/public/src/client/account/edit/username.js
@@ -33,6 +33,8 @@ define('forum/account/edit/username', ['forum/account/header'], function (header
 				var userslug = utils.slugify(userData.username);
 				if (userData.username && userslug && parseInt(userData.uid, 10) === parseInt(app.user.uid, 10)) {
 					$('[component="header/profilelink"]').attr('href', config.relative_path + '/user/' + userslug);
+					$('[component="header/profilelink/edit"]').attr('href', config.relative_path + '/user/' + userslug + '/edit');
+					$('[component="header/profilelink/settings"]').attr('href', config.relative_path + '/user/' + userslug + '/settings');
 					$('[component="header/username"]').text(userData.username);
 					$('[component="header/usericon"]').css('background-color', data['icon:bgColor']).text(data['icon:text']);
 				}
diff --git a/src/categories/create.js b/src/categories/create.js
index 326545d76c..e489bfa815 100644
--- a/src/categories/create.js
+++ b/src/categories/create.js
@@ -52,7 +52,18 @@ module.exports = function (Categories) {
 			function (data, next) {
 				category = data.category;
 
-				var defaultPrivileges = ['find', 'read', 'topics:read', 'topics:create', 'topics:reply', 'posts:edit', 'posts:delete', 'topics:delete', 'upload:post:image'];
+				var defaultPrivileges = [
+					'find',
+					'read',
+					'topics:read',
+					'topics:create',
+					'topics:reply',
+					'topics:tag',
+					'posts:edit',
+					'posts:delete',
+					'topics:delete',
+					'upload:post:image',
+				];
 
 				async.series([
 					async.apply(db.setObject, 'category:' + category.cid, category),
diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js
index cae09a5043..ab651d1325 100644
--- a/src/controllers/uploads.js
+++ b/src/controllers/uploads.js
@@ -217,13 +217,10 @@ uploadsController.uploadFile = function (uid, uploadedFile, callback) {
 };
 
 function saveFileToLocal(uploadedFile, callback) {
-	var extension = path.extname(uploadedFile.name);
-	if (!extension || extension === '.') {
-		return callback(new Error('[[error:invalid-extension]]'));
-	}
 	var filename = uploadedFile.name || 'upload';
+	var extension = path.extname(filename) || '';
 
-	filename = Date.now() + '-' + validator.escape(filename.replace(path.extname(uploadedFile.name) || '', '')).substr(0, 255) + extension;
+	filename = Date.now() + '-' + validator.escape(filename.substr(0, filename.length - extension.length)).substr(0, 255) + extension;
 
 	async.waterfall([
 		function (next) {
diff --git a/src/flags.js b/src/flags.js
index 1f6d932de1..ebc3e37ba6 100644
--- a/src/flags.js
+++ b/src/flags.js
@@ -46,6 +46,13 @@ Flags.get = function (flagId, callback) {
 				}));
 			});
 		},
+		function (flagObj, next) {
+			plugins.fireHook('filter:flags.get', {
+				flag: flagObj,
+			}, function (err, data) {
+				next(err, data.flag);
+			});
+		},
 	], callback);
 };
 
@@ -181,6 +188,13 @@ Flags.list = function (filters, uid, callback) {
 				});
 			}, next);
 		},
+		function (flags, next) {
+			plugins.fireHook('filter:flags.list', {
+				flags: flags,
+			}, function (err, data) {
+				next(err, data.flags);
+			});
+		},
 	], callback);
 };
 
@@ -505,7 +519,8 @@ Flags.update = function (flagId, uid, changeset, callback) {
 			tasks.push(async.apply(Flags.appendHistory, flagId, uid, changeset));
 
 			// Fire plugin hook
-			tasks.push(async.apply(plugins.fireHook, 'action:flag.update', { flagId: flagId, changeset: changeset, uid: uid }));
+			tasks.push(async.apply(plugins.fireHook, 'action:flag.update', { flagId: flagId, changeset: changeset, uid: uid }));	// delete @ NodeBB v1.6.0
+			tasks.push(async.apply(plugins.fireHook, 'action:flags.update', { flagId: flagId, changeset: changeset, uid: uid }));
 
 			async.parallel(tasks, function (err) {
 				return next(err);
@@ -644,6 +659,9 @@ Flags.notify = function (flagObj, uid, callback) {
 
 				plugins.fireHook('action:flag.create', {
 					flag: flagObj,
+				});	// delete @ NodeBB v1.6.0
+				plugins.fireHook('action:flags.create', {
+					flag: flagObj,
 				});
 				notifications.push(notification, results.admins.concat(results.moderators).concat(results.globalMods), callback);
 			});
@@ -673,6 +691,9 @@ Flags.notify = function (flagObj, uid, callback) {
 
 				plugins.fireHook('action:flag.create', {
 					flag: flagObj,
+				});	// delete @ NodeBB v1.6.0
+				plugins.fireHook('action:flags.create', {
+					flag: flagObj,
 				});
 				notifications.push(notification, results.admins.concat(results.globalMods), callback);
 			});
diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js
index 16ceb32878..40684e31ab 100644
--- a/src/plugins/hooks.js
+++ b/src/plugins/hooks.js
@@ -9,6 +9,8 @@ module.exports = function (Plugins) {
 		'filter:post.save': 'filter:post.create',
 		'filter:user.profileLinks': 'filter:user.profileMenu',
 		'action:post.flag': 'action:flag.create',
+		'action:flag.create': 'action:flags.create',
+		'action:flag.update': 'action:flags.update',
 	};
 	/*
 		`data` is an object consisting of (* is required):
diff --git a/src/posts/edit.js b/src/posts/edit.js
index 65ca05fc2f..0a9867feeb 100644
--- a/src/posts/edit.js
+++ b/src/posts/edit.js
@@ -48,9 +48,7 @@ module.exports = function (Posts) {
 			},
 			function (result, next) {
 				postData = result.post;
-				Posts.setPostFields(data.pid, postData, next);
-			},
-			function (next) {
+
 				async.parallel({
 					editor: function (next) {
 						user.getUserFields(data.uid, ['username', 'userslug'], next);
@@ -62,7 +60,9 @@ module.exports = function (Posts) {
 			},
 			function (_results, next) {
 				results = _results;
-
+				Posts.setPostFields(data.pid, postData, next);
+			},
+			function (next) {
 				postData.cid = results.topic.cid;
 				postData.topic = results.topic;
 				plugins.fireHook('action:post.edit', { post: _.clone(postData), uid: data.uid });
@@ -123,6 +123,17 @@ module.exports = function (Posts) {
 
 				data.tags = data.tags || [];
 
+				if (!data.tags.length) {
+					return next(null, true);
+				}
+
+				privileges.categories.can('topics:tag', topicData.cid, data.uid, next);
+			},
+			function (canTag, next) {
+				if (!canTag) {
+					return next(new Error('[[error:no-privileges]]'));
+				}
+
 				plugins.fireHook('filter:topic.edit', { req: data.req, topic: topicData, data: data }, next);
 			},
 			function (results, next) {
diff --git a/src/privileges.js b/src/privileges.js
index 63bae570e1..c1ac018ec7 100644
--- a/src/privileges.js
+++ b/src/privileges.js
@@ -2,12 +2,29 @@
 
 var privileges = module.exports;
 
+privileges.privilegeLabels = [
+	{ name: 'Find Category' },
+	{ name: 'Access Category' },
+	{ name: 'Access Topics' },
+	{ name: 'Create Topics' },
+	{ name: 'Reply to Topics' },
+	{ name: 'Tag Topics' },
+	{ name: 'Edit Posts' },
+	{ name: 'Delete Posts' },
+	{ name: 'Delete Topics' },
+	{ name: 'Upload Images' },
+	{ name: 'Upload Files' },
+	{ name: 'Purge' },
+	{ name: 'Moderate' },
+];
+
 privileges.userPrivilegeList = [
 	'find',
 	'read',
 	'topics:read',
 	'topics:create',
 	'topics:reply',
+	'topics:tag',
 	'posts:edit',
 	'posts:delete',
 	'topics:delete',
diff --git a/src/privileges/categories.js b/src/privileges/categories.js
index 4ec3eacaf3..604c2c5ac7 100644
--- a/src/privileges/categories.js
+++ b/src/privileges/categories.js
@@ -16,28 +16,13 @@ module.exports = function (privileges) {
 	privileges.categories.list = function (cid, callback) {
 		// Method used in admin/category controller to show all users/groups with privs in that given cid
 
-		var privilegeLabels = [
-			{ name: 'Find Category' },
-			{ name: 'Access Category' },
-			{ name: 'Access Topics' },
-			{ name: 'Create Topics' },
-			{ name: 'Reply to Topics' },
-			{ name: 'Edit Posts' },
-			{ name: 'Delete Posts' },
-			{ name: 'Delete Topics' },
-			{ name: 'Upload Images' },
-			{ name: 'Upload Files' },
-			{ name: 'Purge' },
-			{ name: 'Moderate' },
-		];
-
 		async.waterfall([
 			function (next) {
 				async.parallel({
 					labels: function (next) {
 						async.parallel({
-							users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privilegeLabels),
-							groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privilegeLabels),
+							users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privileges.privilegeLabels),
+							groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privileges.privilegeLabels),
 						}, next);
 					},
 					users: function (next) {
@@ -155,7 +140,7 @@ module.exports = function (privileges) {
 	};
 
 	privileges.categories.get = function (cid, uid, callback) {
-		var privs = ['topics:create', 'topics:read', 'read'];
+		var privs = ['topics:create', 'topics:read', 'topics:tag', 'read'];
 		async.waterfall([
 			function (next) {
 				async.parallel({
@@ -177,6 +162,7 @@ module.exports = function (privileges) {
 				plugins.fireHook('filter:privileges.categories.get', {
 					'topics:create': privData['topics:create'] || isAdminOrMod,
 					'topics:read': privData['topics:read'] || isAdminOrMod,
+					'topics:tag': privData['topics:tag'] || isAdminOrMod,
 					read: privData.read || isAdminOrMod,
 					cid: cid,
 					uid: uid,
diff --git a/src/privileges/topics.js b/src/privileges/topics.js
index 88273800fe..ac602cc25a 100644
--- a/src/privileges/topics.js
+++ b/src/privileges/topics.js
@@ -16,7 +16,7 @@ module.exports = function (privileges) {
 
 	privileges.topics.get = function (tid, uid, callback) {
 		var topic;
-		var privs = ['topics:reply', 'topics:read', 'topics:delete', 'posts:edit', 'posts:delete', 'read'];
+		var privs = ['topics:reply', 'topics:read', 'topics:tag', 'topics:delete', 'posts:edit', 'posts:delete', 'read'];
 		async.waterfall([
 			async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']),
 			function (_topic, next) {
@@ -41,6 +41,7 @@ module.exports = function (privileges) {
 				plugins.fireHook('filter:privileges.topics.get', {
 					'topics:reply': (privData['topics:reply'] && !locked && !deleted) || isAdminOrMod,
 					'topics:read': privData['topics:read'] || isAdminOrMod,
+					'topics:tag': privData['topics:tag'] || isAdminOrMod,
 					'topics:delete': (isOwner && privData['topics:delete']) || isAdminOrMod,
 					'posts:edit': (privData['posts:edit'] && !locked) || isAdminOrMod,
 					'posts:delete': (privData['posts:delete'] && !locked) || isAdminOrMod,
diff --git a/src/topics/create.js b/src/topics/create.js
index 071093e967..e758f5f513 100644
--- a/src/topics/create.js
+++ b/src/topics/create.js
@@ -107,18 +107,30 @@ module.exports = function (Topics) {
 				check(data.content, meta.config.minimumPostLength, meta.config.maximumPostLength, 'content-too-short', 'content-too-long', next);
 			},
 			function (next) {
-				categories.exists(data.cid, next);
+				async.parallel({
+					categoryExists: function (next) {
+						categories.exists(data.cid, next);
+					},
+					canCreate: function (next) {
+						privileges.categories.can('topics:create', data.cid, data.uid, next);
+					},
+					canTag: function (next) {
+						if (!data.tags.length) {
+							return next(null, true);
+						}
+						privileges.categories.can('topics:tag', data.cid, data.uid, next);
+					},
+				}, next);
 			},
-			function (categoryExists, next) {
-				if (!categoryExists) {
+			function (results, next) {
+				if (!results.categoryExists) {
 					return next(new Error('[[error:no-category]]'));
 				}
-				privileges.categories.can('topics:create', data.cid, data.uid, next);
-			},
-			function (canCreate, next) {
-				if (!canCreate) {
+
+				if (!results.canCreate || !results.canTag) {
 					return next(new Error('[[error:no-privileges]]'));
 				}
+
 				guestHandleValid(data, next);
 			},
 			function (next) {
diff --git a/src/upgrades/1.5.2/tags_privilege.js b/src/upgrades/1.5.2/tags_privilege.js
new file mode 100644
index 0000000000..d5d703407c
--- /dev/null
+++ b/src/upgrades/1.5.2/tags_privilege.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var async = require('async');
+
+var batch = require('../../batch');
+
+module.exports = {
+	name: 'Give tag privilege to registered-users on all categories',
+	timestamp: Date.UTC(2017, 5, 16),
+	method: function (callback) {
+		var progress = this.progress;
+		var privileges = require('../../privileges');
+		batch.processSortedSet('categories:cid', function (cids, next) {
+			async.eachSeries(cids, function (cid, next) {
+				progress.incr();
+				privileges.categories.give(['topics:tag'], cid, 'registered-users', next);
+			}, next);
+		}, {
+			progress: progress,
+		}, callback);
+	},
+};
diff --git a/test/categories.js b/test/categories.js
index efa196c208..4bb66b49af 100644
--- a/test/categories.js
+++ b/test/categories.js
@@ -648,6 +648,7 @@ describe('Categories', function () {
 					'topics:reply': false,
 					'topics:read': false,
 					'topics:create': false,
+					'topics:tag': false,
 					'topics:delete': false,
 					'posts:edit': false,
 					'upload:post:file': false,
@@ -669,6 +670,7 @@ describe('Categories', function () {
 					'groups:topics:delete': false,
 					'groups:topics:create': true,
 					'groups:topics:reply': true,
+					'groups:topics:tag': true,
 					'groups:posts:delete': true,
 					'groups:read': true,
 					'groups:topics:read': true,
diff --git a/test/topics.js b/test/topics.js
index da3d148e70..541000dd52 100644
--- a/test/topics.js
+++ b/test/topics.js
@@ -7,7 +7,9 @@ var nconf = require('nconf');
 
 var db = require('./mocks/databasemock');
 var topics = require('../src/topics');
+var posts = require('../src/posts');
 var categories = require('../src/categories');
+var privileges = require('../src/privileges');
 var meta = require('../src/meta');
 var User = require('../src/user');
 var groups = require('../src/groups');
@@ -825,7 +827,7 @@ describe('Topic\'s', function () {
 		});
 
 		it('should 404 if tid is not a number', function (done) {
-			request(nconf.get('url') + '/api/topic/teaser/nan', { json: true }, function (err, response, body) {
+			request(nconf.get('url') + '/api/topic/teaser/nan', { json: true }, function (err, response) {
 				assert.ifError(err);
 				assert.equal(response.statusCode, 404);
 				done();
@@ -858,7 +860,7 @@ describe('Topic\'s', function () {
 
 
 		it('should 404 if tid is not a number', function (done) {
-			request(nconf.get('url') + '/api/topic/pagination/nan', { json: true }, function (err, response, body) {
+			request(nconf.get('url') + '/api/topic/pagination/nan', { json: true }, function (err, response) {
 				assert.ifError(err);
 				assert.equal(response.statusCode, 404);
 				done();
@@ -866,7 +868,7 @@ describe('Topic\'s', function () {
 		});
 
 		it('should 404 if tid does not exist', function (done) {
-			request(nconf.get('url') + '/api/topic/pagination/1231231', { json: true }, function (err, response, body) {
+			request(nconf.get('url') + '/api/topic/pagination/1231231', { json: true }, function (err, response) {
 				assert.ifError(err);
 				assert.equal(response.statusCode, 404);
 				done();
@@ -1643,4 +1645,63 @@ describe('Topic\'s', function () {
 			});
 		});
 	});
+
+	describe('tag privilege', function () {
+		var uid;
+		var cid;
+		before(function (done) {
+			async.waterfall([
+				function (next) {
+					User.create({ username: 'tag_poster' }, next);
+				},
+				function (_uid, next) {
+					uid = _uid;
+					categories.create({ name: 'tag category' }, next);
+				},
+				function (categoryObj, next) {
+					cid = categoryObj.cid;
+					next();
+				},
+			], done);
+		});
+
+		it('should fail to post if user does not have tag privilege', function (done) {
+			privileges.categories.rescind(['topics:tag'], cid, 'registered-users', function (err) {
+				assert.ifError(err);
+				topics.post({ uid: uid, cid: cid, tags: ['tag1'], title: 'topic with tags', content: 'some content here' }, function (err) {
+					assert.equal(err.message, '[[error:no-privileges]]');
+					done();
+				});
+			});
+		});
+
+		it('should fail to edit if user does not have tag privilege', function (done) {
+			topics.post({ uid: uid, cid: cid, title: 'topic with tags', content: 'some content here' }, function (err, result) {
+				assert.ifError(err);
+				var pid = result.postData.pid;
+				posts.edit({ pid: pid, uid: uid, content: 'edited content', tags: ['tag2'] }, function (err) {
+					assert.equal(err.message, '[[error:no-privileges]]');
+					done();
+				});
+			});
+		});
+
+		it('should be able to edit topic and add tags if allowed', function (done) {
+			privileges.categories.give(['topics:tag'], cid, 'registered-users', function (err) {
+				assert.ifError(err);
+				topics.post({ uid: uid, cid: cid, tags: ['tag1'], title: 'topic with tags', content: 'some content here' }, function (err, result) {
+					assert.ifError(err);
+					posts.edit({ pid: result.postData.pid, uid: uid, content: 'edited content', tags: ['tag1', 'tag2'] }, function (err, result) {
+						assert.ifError(err);
+						var tags = result.topic.tags.map(function (tag) {
+							return tag.value;
+						});
+						assert(tags.indexOf('tag1') !== -1);
+						assert(tags.indexOf('tag2') !== -1);
+						done();
+					});
+				});
+			});
+		});
+	});
 });