diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js
index 0c6ee5ea06..68a864198e 100644
--- a/public/src/client/topic/events.js
+++ b/public/src/client/topic/events.js
@@ -188,7 +188,7 @@ define('forum/topic/events', [
 		var isDeleted = postEl.hasClass('deleted');
 		postTools.toggle(data.pid, isDeleted);
 
-		if (!app.user.isAdmin && !app.user.isGlobalMod && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) {
+		if (!ajaxify.data.privileges.isAdminOrMod && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) {
 			postEl.find('[component="post/tools"]').toggleClass('hidden', isDeleted);
 			if (isDeleted) {
 				postEl.find('[component="post/content"]').translateHtml('[[topic:post_is_deleted]]');
diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js
index b31b5fc0ed..656364b3a1 100644
--- a/public/src/client/topic/posts.js
+++ b/public/src/client/topic/posts.js
@@ -31,7 +31,7 @@ define('forum/topic/posts', [
 			post.display_delete_tools = (ajaxify.data.privileges['posts:delete'] && post.selfPost) || ajaxify.data.privileges.isAdminOrMod;
 			post.display_moderator_tools = post.display_edit_tools || post.display_delete_tools;
 			post.display_move_tools = ajaxify.data.privileges.isAdminOrMod;
-			post.display_post_menu = ajaxify.data.privileges.isAdminOrMod || post.selfPost || ((app.user.uid || ajaxify.data.postSharing.length) && !post.deleted);
+			post.display_post_menu = ajaxify.data.privileges.isAdminOrMod || (post.selfPost && !ajaxify.data.locked) || ((app.user.uid || ajaxify.data.postSharing.length) && !post.deleted);
 		});
 
 		updatePostCounts(data.posts);
diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js
index 3110b92a4d..a18c069cd5 100644
--- a/public/src/client/topic/threadTools.js
+++ b/public/src/client/topic/threadTools.js
@@ -173,15 +173,24 @@ define('forum/topic/threadTools', [
 			return;
 		}
 
-		var isLocked = data.isLocked && !app.user.isAdmin;
+		var isLocked = data.isLocked && !ajaxify.data.privileges.isAdminOrMod;
 
 		components.get('topic/lock').toggleClass('hidden', data.isLocked);
 		components.get('topic/unlock').toggleClass('hidden', !data.isLocked);
-		components.get('topic/reply/container').toggleClass('hidden', isLocked);
-		components.get('topic/reply/locked').toggleClass('hidden', !isLocked);
 
-		threadEl.find('[component="post/reply"], [component="post/quote"], [component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked);
+		var hideReply = (data.isLocked || ajaxify.data.deleted) && !ajaxify.data.privileges.isAdminOrMod;
+
+		components.get('topic/reply/container').toggleClass('hidden', hideReply);
+		components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !data.isLocked || ajaxify.data.deleted);
+
+		threadEl.find('[component="post"]:not(.deleted) [component="post/reply"], [component="post"]:not(.deleted) [component="post/quote"]').toggleClass('hidden', hideReply);
+		threadEl.find('[component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked);
+
+		threadEl.find('[component="post"][data-uid="'+app.user.uid+'"].deleted [component="post/tools"]').toggleClass('hidden', isLocked);
+
 		$('[component="post/header"] i.fa-lock').toggleClass('hidden', !data.isLocked);
+		$('[component="post/tools"] .dropdown-menu').html('');
+		ajaxify.data.locked = data.isLocked;
 	};
 
 	ThreadTools.setDeleteState = function(data) {
@@ -195,9 +204,17 @@ define('forum/topic/threadTools', [
 		components.get('topic/purge').toggleClass('hidden', !data.isDelete);
 		components.get('topic/deleted/message').toggleClass('hidden', !data.isDelete);
 
+		var hideReply = data.isDelete && !ajaxify.data.privileges.isAdminOrMod;
+
+		components.get('topic/reply/container').toggleClass('hidden', hideReply);
+		components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !ajaxify.data.locked || data.isDelete);
+		threadEl.find('[component="post"]:not(.deleted) [component="post/reply"], [component="post"]:not(.deleted) [component="post/quote"]').toggleClass('hidden', hideReply);
+
 		threadEl.toggleClass('deleted', data.isDelete);
+		ajaxify.data.deleted = data.isDelete;
 	};
 
+
 	ThreadTools.setPinnedState = function(data) {
 		var threadEl = components.get('topic');
 		if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) {
@@ -207,6 +224,7 @@ define('forum/topic/threadTools', [
 		components.get('topic/pin').toggleClass('hidden', data.isPinned);
 		components.get('topic/unpin').toggleClass('hidden', !data.isPinned);
 		$('[component="post/header"] i.fa-thumb-tack').toggleClass('hidden', !data.isPinned);
+		ajaxify.data.pinned = data.isPinned;
 	};
 
 	function setFollowState(state) {
diff --git a/src/privileges/topics.js b/src/privileges/topics.js
index c9f0ec717a..b6fffb8a6a 100644
--- a/src/privileges/topics.js
+++ b/src/privileges/topics.js
@@ -17,7 +17,7 @@ module.exports = function(privileges) {
 	privileges.topics.get = function(tid, uid, callback) {
 		var topic;
 		async.waterfall([
-			async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked']),
+			async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']),
 			function(_topic, next) {
 				topic = _topic;
 				async.parallel({
@@ -42,14 +42,19 @@ module.exports = function(privileges) {
 
 			var disabled = parseInt(results.disabled, 10) === 1;
 			var locked = parseInt(topic.locked, 10) === 1;
+			var deleted = parseInt(topic.deleted, 10) === 1;
+
 			var isAdminOrMod = results.isAdministrator || results.isModerator;
 			var editable = isAdminOrMod;
 			var deletable = isAdminOrMod || (results.isOwner && results['topics:delete'][0]);
 
 			plugins.fireHook('filter:privileges.topics.get', {
-				'topics:reply': (results['topics:reply'][0] && !locked) || isAdminOrMod,
-				read: results.read[0] || isAdminOrMod,
+				'topics:reply': (results['topics:reply'][0] && !locked && !deleted) || isAdminOrMod,
 				'topics:read': results['topics:read'][0] || isAdminOrMod,
+				'topics:delete': (results.isOwner && results['topics:delete'][0]) || isAdminOrMod,
+				'posts:edit': (results['posts:edit'][0] && !locked) || isAdminOrMod,
+				'posts:delete': (results['posts:delete'][0] && !locked) || isAdminOrMod,
+				read: results.read[0] || isAdminOrMod,
 				view_thread_tools: editable || deletable,
 				editable: editable,
 				deletable: deletable,
@@ -57,9 +62,7 @@ module.exports = function(privileges) {
 				isAdminOrMod: isAdminOrMod,
 				disabled: disabled,
 				tid: tid,
-				uid: uid,
-				'posts:edit': (results['posts:edit'][0] && !locked) || isAdminOrMod,
-				'posts:delete': (results['posts:delete'][0] && !locked) || isAdminOrMod
+				uid: uid
 			}, callback);
 		});
 	};
diff --git a/src/topics/create.js b/src/topics/create.js
index c79e0758f4..cd1bf23a62 100644
--- a/src/topics/create.js
+++ b/src/topics/create.js
@@ -205,6 +205,10 @@ module.exports = function(Topics) {
 					return next(new Error('[[error:topic-locked]]'));
 				}
 
+				if (parseInt(results.topicData.deleted, 10) === 1 && !results.isAdminOrMod) {
+					return next(new Error('[[error:topic-deleted]]'));
+				}
+
 				if (!results.canReply) {
 					return next(new Error('[[error:no-privileges]]'));
 				}
diff --git a/src/topics/posts.js b/src/topics/posts.js
index 45e46cd3c8..80bde62334 100644
--- a/src/topics/posts.js
+++ b/src/topics/posts.js
@@ -145,7 +145,7 @@ module.exports = function(Topics) {
 				post.display_delete_tools = topicPrivileges.isAdminOrMod || (post.selfPost && topicPrivileges['posts:delete']);
 				post.display_moderator_tools = post.display_edit_tools || post.display_delete_tools;
 				post.display_move_tools = topicPrivileges.isAdminOrMod && post.index !== 0;
-				post.display_post_menu = topicPrivileges.isAdminOrMod || post.selfPost || ((loggedIn || topicData.postSharing.length) && !post.deleted);
+				post.display_post_menu = topicPrivileges.isAdminOrMod || (post.selfPost && !topicData.locked) || ((loggedIn || topicData.postSharing.length) && !post.deleted);
 				post.ip = topicPrivileges.isAdminOrMod ? post.ip : undefined;
 
 				if (post.deleted && !(topicPrivileges.isAdminOrMod || post.selfPost)) {