diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json
index bf22e68df6..d266e2c4db 100644
--- a/public/language/en-GB/flags.json
+++ b/public/language/en-GB/flags.json
@@ -4,10 +4,15 @@
 	"reporter": "Reporter",
 	"reported-at": "Reported At",
 	"no-flags": "Hooray! No flags found.",
+	"assignee": "Assignee",
+	"update": "Update",
+	"notes": "Flag Notes",
+	"add-note": "Add Note",
 
 	"state": "State",
 	"state-open": "New/Open",
 	"state-wip": "Work in Progress",
 	"state-resolved": "Resolved",
-	"state-rejected": "Rejected"
+	"state-rejected": "Rejected",
+	"no-assignee": "Not Assigned"
 }
\ No newline at end of file
diff --git a/public/language/en-GB/topic.json b/public/language/en-GB/topic.json
index 885afe5d62..ce7f35f816 100644
--- a/public/language/en-GB/topic.json
+++ b/public/language/en-GB/topic.json
@@ -37,12 +37,8 @@
 
 	"flag_title": "Flag this post for moderation",
 	"flag_success": "This post has been flagged for moderation.",
-	"flag_manage_title": "Flagged post in %1",
 	"flag_manage_history": "Action History",
 	"flag_manage_no_history": "No event history to report",
-	"flag_manage_assignee": "Assignee",
-	"flag_manage_notes": "Shared Notes",
-	"flag_manage_update": "Update Flag Status",
 	"flag_manage_history_assignee": "Assigned to %1",
 	"flag_manage_history_state": "Updated state to %1",
 	"flag_manage_history_notes": "Updated flag notes",
diff --git a/src/controllers/mods.js b/src/controllers/mods.js
index 7ebb70d888..012ffde3c6 100644
--- a/src/controllers/mods.js
+++ b/src/controllers/mods.js
@@ -41,7 +41,8 @@ modsController.flags.detail = function (req, res, next) {
 	async.parallel({
 		isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, req.uid),
 		moderatedCids: async.apply(user.getModeratedCids, req.uid),
-		flagData: async.apply(flags.get, req.params.flagId)
+		flagData: async.apply(flags.get, req.params.flagId),
+		assignees: async.apply(user.getAdminsandGlobalModsandModerators)
 	}, function (err, results) {
 		if (err || !results.flagData) {
 			return next(err || new Error('[[error:invalid-data]]'));
@@ -49,7 +50,9 @@ modsController.flags.detail = function (req, res, next) {
 			return next(new Error('[[error:no-privileges]]'));
 		}
 
-		res.render('flags/detail', results.flagData);
+		res.render('flags/detail', Object.assign(results.flagData, {
+			assignees: results.assignees
+		}));
 	});
 };
 
diff --git a/src/flags.js b/src/flags.js
index 65ab029e2a..b88dac6b2f 100644
--- a/src/flags.js
+++ b/src/flags.js
@@ -10,6 +10,7 @@ var analytics = require('./analytics');
 var topics = require('./topics');
 var posts = require('./posts');
 var utils = require('../public/src/utils');
+var _ = require('underscore');
 
 var Flags = {
 	_defaults: {
@@ -24,7 +25,7 @@ Flags.get = function (flagId, callback) {
 		async.apply(async.parallel, {
 			base: async.apply(db.getObject.bind(db), 'flag:' + flagId),
 			history: async.apply(db.getSortedSetRevRange.bind(db), 'flag:' + flagId + ':history', 0, -1),
-			notes: async.apply(db.getSortedSetRevRange.bind(db), 'flag:' + flagId + ':notes', 0, -1)
+			notes: async.apply(Flags.getNotes, flagId)
 		}),
 		function (data, next) {
 			// Second stage
@@ -130,6 +131,43 @@ Flags.getTarget = function (type, id, uid, callback) {
 	}
 };
 
+Flags.getNotes = function (flagId, callback) {
+	async.waterfall([
+		async.apply(db.getSortedSetRevRangeWithScores.bind(db), 'flag:' + flagId + ':notes', 0, -1),
+		function (notes, next) {
+			var uids = [];
+			var noteObj;
+			notes = notes.map(function (note) {
+				try {
+					noteObj = JSON.parse(note.value);
+					uids.push(noteObj[0]);
+					return {
+						uid: noteObj[0],
+						content: noteObj[1],
+						datetime: note.score,
+						datetimeISO: new Date(note.score).toISOString()
+					};
+				} catch (e) {
+					return next(e);
+				}
+			});
+			next(null, notes, uids);
+		},
+		function (notes, uids, next) {
+			user.getUsersData(uids, function (err, users) {
+				if (err) {
+					return next(err);
+				}
+
+				next(null, notes.map(function (note, idx) {
+					note.user = users[idx];
+					return note;
+				}));
+			});
+		}
+	], callback);
+};
+
 Flags.create = function (type, id, uid, reason, callback) {
 	async.waterfall([
 		function (next) {
diff --git a/src/user/data.js b/src/user/data.js
index cbaf066ded..1e10704c73 100644
--- a/src/user/data.js
+++ b/src/user/data.js
@@ -80,6 +80,15 @@ module.exports = function (User) {
 			return callback(null, []);
 		}
 
+		// Eliminate duplicates and build ref table
+		uids = uids.filter(function (uid, index) {
+			return index === uids.indexOf(uid);
+		});
+		var ref = uids.reduce(function (memo, cur, idx) {
+			memo[cur] = idx;
+			return memo;
+		}, {});
+
 		var keys = uids.map(function (uid) {
 			return 'user:' + uid;
 		});
@@ -89,6 +98,10 @@ module.exports = function (User) {
 				return callback(err);
 			}
 
+			users = uids.map(function (uid) {
+				return users[ref[uid]];
+			});
+
 			modifyUserData(users, [], callback);
 		});
 	};