diff --git a/public/css/style.less b/public/css/style.less
index 336f84ea94..eb510f70ef 100644
--- a/public/css/style.less
+++ b/public/css/style.less
@@ -164,6 +164,10 @@ footer.footer {
 			margin-bottom: 10px;
 			padding-bottom: 10px;
 
+			&.deleted {
+				-moz-opacity: 0.30;
+				opacity: 0.30;
+			}
 		}
 
 		&:last-child li {
@@ -300,7 +304,7 @@ footer.footer {
 
 		&.deleted {
 			-moz-opacity: 0.30;
-			opacity: 0.30;			
+			opacity: 0.30;
 		}
 	}
 
diff --git a/public/templates/category.tpl b/public/templates/category.tpl
index b226deea06..9cf185e487 100644
--- a/public/templates/category.tpl
+++ b/public/templates/category.tpl
@@ -10,7 +10,7 @@
 	<div class="span9">
 		<ul id="topics-container">
 		<!-- BEGIN topics -->
-		<a href="../../topic/{topics.slug}"><li>
+		<a href="../../topic/{topics.slug}"><li class="{topics.deleted-class}">
 			<div class="row-fluid">
 				<div class="span1 thread-rating hidden-phone hidden-tablet">
 					<span>
diff --git a/src/categories.js b/src/categories.js
index 58cf09c204..6a6adc8c9e 100644
--- a/src/categories.js
+++ b/src/categories.js
@@ -1,7 +1,8 @@
 var	RDB = require('./redis.js'),
 	posts = require('./posts.js'),
 	utils = require('./utils.js'),
-	user = require('./user.js');
+	user = require('./user.js'),
+	async = require('async');
 
 (function(Categories) {
 
@@ -27,6 +28,30 @@ var	RDB = require('./redis.js'),
 		});
 	};
 
+	Categories.privileges = function(cid, uid, callback) {
+		async.parallel([
+			// function(next) {
+			// 	user.getUserField(uid, 'reputation', function(reputation) {
+			// 		next(null, reputation >= config.privilege_thresholds.manage_category);
+			// 	});
+			// },
+			function(next) {
+				user.isModerator(uid, cid, function(isMod) {
+					next(null, isMod);
+				});
+			}, function(next) {
+				user.isAdministrator(uid, function(isAdmin) {
+					next(null, isAdmin);
+				});
+			}
+		], function(err, results) {
+			callback({
+				editable: results.indexOf(true) !== -1 ? true : false,
+				view_deleted: results.indexOf(true) !== -1 ? true : false
+			});
+		});
+	}
+
 	Categories.edit = function(data, callback) {
 		// just a reminder to self that name + slugs are stored into topics data as well.
 	};
diff --git a/src/posts.js b/src/posts.js
index 753ed3e8c2..a4e2580d4e 100644
--- a/src/posts.js
+++ b/src/posts.js
@@ -13,34 +13,28 @@ marked.setOptions({
 (function(Posts) {
 
 	Posts.get = function(callback, tid, current_user, start, end) {
-
 		if (start == null) start = 0;
 		if (end == null) end = -1;//start + 10;
 
-		var post_data, user_data, thread_data, vote_data, viewer_data;
+		var post_data, user_data, thread_data, vote_data, privileges;
 
 		getTopicPosts();
 
-		getViewerData();
+		getPrivileges();
 		
 
 		//compile thread after all data is asynchronously called
 		function generateThread() {
-			if (!post_data || !user_data || !thread_data || !vote_data || !viewer_data) return;
+			if (!post_data || !user_data || !thread_data || !vote_data || !privileges) return;
 
 			var	posts = [],
-				main_posts = [],
-				manage_content = (
-					viewer_data.reputation >= config.privilege_thresholds.manage_content ||
-					viewer_data.isModerator ||
-					viewer_data.isAdministrator
-				);
+				main_posts = [];
 
 			for (var i=0, ii= post_data.pid.length; i<ii; i++) {
 				var uid = post_data.uid[i],
 					pid = post_data.pid[i];
 					
-				if (post_data.deleted[i] === null || (post_data.deleted[i] === '1' && manage_content) || current_user === uid) {
+				if (post_data.deleted[i] === null || (post_data.deleted[i] === '1' && privileges.view_deleted) || current_user === uid) {
 					var post_obj = {
 						'pid' : pid,
 						'uid' : uid,
@@ -53,7 +47,7 @@ marked.setOptions({
 						'gravatar' : user_data[uid].picture || 'http://www.gravatar.com/avatar/d41d8cd98f00b204e9800998ecf8427e',
 						'signature' : user_data[uid].signature,
 						'fav_star_class' : vote_data[pid] ? 'icon-star' : 'icon-star-empty',
-						'display_moderator_tools': (uid == current_user || manage_content || viewer_data.isModerator) ? 'show' : 'none',
+						'display_moderator_tools': (uid == current_user || privileges.editable) ? 'show' : 'none',
 						'edited-class': post_data.editor[i] !== null ? '' : 'none',
 						'editor': post_data.editor[i] !== null ? user_data[post_data.editor[i]].username : '',
 						'relativeEditTime': post_data.editTime !== null ? utils.relativeTime(post_data.editTime[i]) : '',
@@ -73,7 +67,7 @@ marked.setOptions({
 				'deleted': parseInt(thread_data.deleted) || 0,
 				'pinned': parseInt(thread_data.pinned) || 0,
 				'topic_id': tid,
-				'expose_tools': manage_content ? 1 : 0,
+				'expose_tools': privileges.editable ? 1 : 0,
 				'posts': posts,
 				'main_posts': main_posts
 			});
@@ -159,40 +153,23 @@ marked.setOptions({
 			});
 		}
 
-		function getViewerData() {
-			async.parallel([
-				function(callback) {
-					user.getUserField(current_user, 'reputation', function(reputation){
-						viewer_data = viewer_data || {};
-						viewer_data.reputation = reputation;
-
-						callback(null);
-					});
-				},
-				function(callback) {
-					RDB.get('tid:' + tid + ':cid', function(err, cid) {
-						user.isModerator(current_user, cid, function(isMod) {
-							viewer_data = viewer_data || {};
-							viewer_data.isModerator = isMod;
-							callback(null);
-						});
-					})
-				},
-				function(callback) {
-					user.isAdministrator(current_user, function(isAdmin) {
-						viewer_data = viewer_data || {};
-						viewer_data.isAdministrator = isAdmin;
-						callback(null);
-					});
-				}
-			], function(err) {
-					generateThread();
+		function getPrivileges() {
+			topics.privileges(tid, current_user, function(user_privs) {
+				privileges = user_privs;
+				generateThread();
 			});
 		}
 	}
 
-	Posts.editable = function(uid, pid, callback) {
+	Posts.privileges = function(pid, uid, callback) {
 		async.parallel([
+			function(next) {
+				Posts.get_tid_by_pid(pid, function(tid) {
+					topics.privileges(tid, uid, function(privileges) {
+						next(null, privileges);
+					});
+				});
+			},
 			function(next) {
 				RDB.get('pid:' + pid + ':uid', function(err, author) {
 					if (author && parseInt(author) > 0) next(null, author === uid);
@@ -202,23 +179,12 @@ marked.setOptions({
 				user.getUserField(uid, 'reputation', function(reputation) {
 					next(null, reputation >= config.privilege_thresholds.manage_content);
 				});
-			},
-			function(next) {
-				Posts.get_tid_by_pid(pid, function(tid) {
-					RDB.get('tid:' + tid + ':cid', function(err, cid) {
-						user.isModerator(uid, cid, function(isMod) {
-							next(null, isMod);
-						});
-					});
-				});
-			}, function(next) {
-				user.isAdministrator(uid, function(isAdmin) {
-					next(null, isAdmin);
-				});
 			}
 		], function(err, results) {
-			// If any return true, allow the edit
-			if (results.indexOf(true) !== -1) callback(true);
+			callback({
+				editable: results[0].editable || (results.slice(1).indexOf(true) !== -1 ? true : false),
+				view_deleted: results[0].view_deleted || (results.slice(1).indexOf(true) !== -1 ? true : false)
+			});
 		});
 	}
 
@@ -462,8 +428,8 @@ marked.setOptions({
 				});
 			};
 
-		Posts.editable(uid, pid, function(editable) {
-			if (editable) success();
+		Posts.privileges(pid, uid, function(privileges) {
+			if (privileges.editable) success();
 		});
 	}
 
@@ -476,8 +442,8 @@ marked.setOptions({
 				});
 			};
 
-		Posts.editable(uid, pid, function(editable) {
-			if (editable) success();
+		Posts.privileges(pid, uid, function(privileges) {
+			if (privileges.editable) success();
 		});
 	}
 
@@ -490,8 +456,8 @@ marked.setOptions({
 				});
 			};
 
-		Posts.editable(uid, pid, function(editable) {
-			if (editable) success();
+		Posts.privileges(pid, uid, function(privileges) {
+			if (privileges.editable) success();
 		});
 	}
 }(exports));
\ No newline at end of file
diff --git a/src/topics.js b/src/topics.js
index 37be5dbcb3..b6afa9e93b 100644
--- a/src/topics.js
+++ b/src/topics.js
@@ -87,29 +87,33 @@ marked.setOptions({
 				var usernames,
 					has_read,
 					moderators,
-					teaser_info;
+					teaser_info,
+					privileges;
 
 				function generate_topic() {
-					if (!usernames || !has_read || !moderators || !teaser_info) return;
+					if (!usernames || !has_read || !moderators || !teaser_info || !privileges) return;
 
 					if (tids.length > 0) {
 						for (var i=0, ii=title.length; i<ii; i++) {
-							topics.push({
-								'title' : title[i],
-								'uid' : uid[i],
-								'username': usernames[i],
-								'timestamp' : timestamp[i],
-								'relativeTime': utils.relativeTime(timestamp[i]),
-								'slug' : slug[i],
-								'post_count' : postcount[i],
-								'lock-icon': locked[i] === '1' ? 'icon-lock' : 'none',
-								'deleted': deleted[i],
-								'pinned': parseInt(pinned[i] || 0),	// For sorting purposes
-								'pin-icon': pinned[i] === '1' ? 'icon-pushpin' : 'none',
-								'badgeclass' : (has_read[i] && current_user !=0) ? '' : 'badge-important',
-								'teaser_text': teaser_info[i].text,
-								'teaser_username': teaser_info[i].username
-							});
+							if (!deleted[i] || (deleted[i] && privileges.view_deleted) || uid[i] === current_user) {
+								topics.push({
+									'title' : title[i],
+									'uid' : uid[i],
+									'username': usernames[i],
+									'timestamp' : timestamp[i],
+									'relativeTime': utils.relativeTime(timestamp[i]),
+									'slug' : slug[i],
+									'post_count' : postcount[i],
+									'lock-icon': locked[i] === '1' ? 'icon-lock' : 'none',
+									'deleted': deleted[i],
+									'deleted-class': deleted[i] ? 'deleted' : '',
+									'pinned': parseInt(pinned[i] || 0),	// For sorting purposes
+									'pin-icon': pinned[i] === '1' ? 'icon-pushpin' : 'none',
+									'badgeclass' : (has_read[i] && current_user !=0) ? '' : 'badge-important',
+									'teaser_text': teaser_info[i].text,
+									'teaser_username': teaser_info[i].username
+								});
+							}
 						}
 					}
 
@@ -157,39 +161,33 @@ marked.setOptions({
 					teaser_info = teasers;
 					generate_topic();
 				});
-				// else {
-				// 	callback({
-				// 		'category_name' : category_id ? category_name : 'Recent',
-				// 		'show_topic_button' : category_id ? 'show' : 'hidden',
-				// 		'category_id': category_id || 0,
-				// 		'topics': []
-				// 	});
-				// }
+
+				categories.privileges(category_id, current_user, function(user_privs) {
+					privileges = user_privs;
+				});
 			});
 		});
 	}
 
-	Topics.editable = function(tid, uid, callback) {
+	Topics.privileges = function(tid, uid, callback) {
 		async.parallel([
-			function(next) {
-				user.getUserField(uid, 'reputation', function(reputation) {
-					next(null, reputation >= config.privilege_thresholds.manage_thread);
-				});
-			},
 			function(next) {
 				Topics.get_cid_by_tid(tid, function(cid) {
-					user.isModerator(uid, cid, function(isMod) {
-						next(null, isMod);
+					categories.privileges(cid, uid, function(privileges) {
+						next(null, privileges);
 					});
 				});
-			}, function(next) {
-				user.isAdministrator(uid, function(isAdmin) {
-					next(null, isAdmin);
+			},
+			function(next) {
+				user.getUserField(uid, 'reputation', function(reputation) {
+					next(null, reputation >= config.privilege_thresholds.manage_thread);
 				});
 			}
 		], function(err, results) {
-			// If any return true, allow the edit
-			if (results.indexOf(true) !== -1) callback(true);
+			callback({
+				editable: results[0].editable || (results.slice(1).indexOf(true) !== -1 ? true : false),
+				view_deleted: results[0].view_deleted || (results.slice(1).indexOf(true) !== -1 ? true : false)
+			});
 		});
 	}
 
@@ -383,8 +381,8 @@ marked.setOptions({
 	};
 
 	Topics.lock = function(tid, uid, socket) {
-		Topics.editable(tid, uid, function(editable) {
-			if (editable) {
+		Topics.privileges(tid, uid, function(privileges) {
+			if (privileges.editable) {
 				// Mark thread as locked
 				RDB.set('tid:' + tid + ':locked', 1);
 
@@ -399,8 +397,8 @@ marked.setOptions({
 	}
 
 	Topics.unlock = function(tid, uid, socket) {
-		Topics.editable(tid, uid, function(editable) {
-			if (editable) {
+		Topics.privileges(tid, uid, function(privileges) {
+			if (privileges.editable) {
 				// Mark thread as unlocked
 				RDB.del('tid:' + tid + ':locked');
 
@@ -415,8 +413,8 @@ marked.setOptions({
 	}
 
 	Topics.delete = function(tid, uid, socket) {
-		Topics.editable(tid, uid, function(editable) {
-			if (editable) {
+		Topics.privileges(tid, uid, function(privileges) {
+			if (privileges.editable) {
 				// Mark thread as deleted
 				RDB.set('tid:' + tid + ':deleted', 1);
 				Topics.lock(tid, uid);
@@ -432,8 +430,8 @@ marked.setOptions({
 	}
 
 	Topics.restore = function(tid, uid, socket) {
-		Topics.editable(tid, uid, function(editable) {
-			if (editable) {
+		Topics.privileges(tid, uid, function(privileges) {
+			if (privileges.editable) {
 				// Mark thread as restored
 				RDB.del('tid:' + tid + ':deleted');
 				Topics.unlock(tid, uid);
@@ -449,8 +447,8 @@ marked.setOptions({
 	}
 
 	Topics.pin = function(tid, uid, socket) {
-		Topics.editable(tid, uid, function(editable) {
-			if (editable) {
+		Topics.privileges(tid, uid, function(privileges) {
+			if (privileges.editable) {
 				// Mark thread as pinned
 				RDB.set('tid:' + tid + ':pinned', 1);
 
@@ -465,8 +463,8 @@ marked.setOptions({
 	}
 
 	Topics.unpin = function(tid, uid, socket) {
-		Topics.editable(tid, uid, function(editable) {
-			if (editable) {
+		Topics.privileges(tid, uid, function(privileges) {
+			if (privileges.editable) {
 				// Mark thread as unpinned
 				RDB.del('tid:' + tid + ':pinned');