diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js
index d11eb7c8e6..5fac3e7c22 100644
--- a/public/src/client/groups/list.js
+++ b/public/src/client/groups/list.js
@@ -1,5 +1,5 @@
 "use strict";
-/* globals app, define, ajaxify, socket, bootbox, utils */
+/* globals app, define, ajaxify, socket, bootbox, utils, templates */
 
 define('forum/groups/list', function() {
 	var Groups = {};
@@ -29,6 +29,32 @@ define('forum/groups/list', function() {
 				}
 			});
 		});
+
+		// Group searching
+		$('#search-text').on('keydown', function(e) {
+			if (e.keyCode === 13) { Groups.search($(this).val()); }
+		});
+
+		$('#search-button').on('click', function() {
+			Groups.search($(this).siblings('input').val());
+		});
+	};
+
+	Groups.search = function(query) {
+		var groupsEl = $('.groups.row');
+
+		socket.emit('groups.search', {
+			query: query,
+			options: {
+				expand: true
+			}
+		}, function(err, groups) {
+			templates.parse('partials/group_list', {
+				groups: groups
+			}, function(html) {
+				groupsEl.empty().append(html);
+			});
+		});
 	};
 
 	return Groups;
diff --git a/src/groups.js b/src/groups.js
index 939d8fa5c6..87e6070757 100644
--- a/src/groups.js
+++ b/src/groups.js
@@ -775,7 +775,7 @@ var async = require('async'),
 				return 'group:' + groupName;
 			});
 
-			db.getObjectsFields(groupKeys, ['name', 'slug', 'hidden', 'userTitle', 'icon', 'labelColor'], function(err, groupData) {
+			db.getObjects(groupKeys, function(err, groupData) {
 				if (err) {
 					return callback(err);
 				}
@@ -786,6 +786,12 @@ var async = require('async'),
 
 				var groupSets = groupData.map(function(group) {
 					group.labelColor = group.labelColor || '#000000';
+
+					if (!group['cover:url']) {
+						group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png';
+						group['cover:position'] = '50% 50%';
+					}
+
 					return 'group:' + group.name + ':members';
 				});
 
@@ -892,4 +898,23 @@ var async = require('async'),
 		db.setRemove('group:' + groupName + ':owners', toUid, callback);
 	};
 
+	Groups.search = function(query, options, callback) {
+		if (!query || !query.length) {
+			return callback(null, []);
+		}
+
+		async.waterfall([
+			async.apply(db.getObjectValues, 'groupslug:groupname'),
+			function(groupNames, next) {
+				groupNames = groupNames.filter(function(name) {
+					return name.match(new RegExp(query, 'i'));
+				});
+
+				async.mapLimit(groupNames, 5, function(groupName, next) {
+					Groups.get(groupName, options || {}, next);
+				}, next);
+			}
+		], callback);
+	};
+
 }(module.exports));
diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js
index c4b4535e82..902041d6ec 100644
--- a/src/socket.io/groups.js
+++ b/src/socket.io/groups.js
@@ -126,6 +126,14 @@ SocketGroups.delete = function(socket, data, callback) {
 	});
 };
 
+SocketGroups.search = function(socket, data, callback) {
+	if (!data || !data.query) {
+		return callback(null, []);
+	}
+
+	groups.search(data.query, data.options || {}, callback);
+};
+
 SocketGroups.cover = {};
 
 SocketGroups.cover.get = function(socket, data, callback) {
diff --git a/src/upgrade.js b/src/upgrade.js
index b28158d826..b957adbe7d 100644
--- a/src/upgrade.js
+++ b/src/upgrade.js
@@ -695,6 +695,10 @@ Upgrade.upgrade = function(callback) {
 						tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', Utils.slugify(groupObj.name), groupObj.name));
 					});
 
+					// Administrator group
+					tasks.push(async.apply(db.setObjectField, 'group:administrators', 'slug', 'administrators'));
+					tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', 'administrators', 'administrators'));
+
 					async.parallel(tasks, function(err) {
 						if (err) {
 							winston.error('[2015/01/19] Error encountered while Generating group slugs');