diff --git a/lib/private/group/manager.php b/lib/private/group/manager.php
index f03f700413294ba4fcb1a59d2f92f65702d1e53f..707009fb3d47aa86aa76be84e51ba95e51885ee9 100644
--- a/lib/private/group/manager.php
+++ b/lib/private/group/manager.php
@@ -40,19 +40,38 @@ class Manager extends PublicEmitter {
 	/**
 	 * @var \OC\Group\Group[]
 	 */
-	private $cachedGroups;
+	private $cachedGroups = array();
+
+	/**
+	 * @var \OC\Group\Group[]
+	 */
+	private $cachedUserGroups = array();
 
 	/**
 	 * @param \OC\User\Manager $userManager
 	 */
 	public function __construct($userManager) {
 		$this->userManager = $userManager;
-		$cache = & $this->cachedGroups;
-		$this->listen('\OC\Group', 'postDelete', function ($group) use (&$cache) {
+		$cachedGroups = & $this->cachedGroups;
+		$cachedUserGroups = & $this->cachedUserGroups;
+		$this->listen('\OC\Group', 'postDelete', function ($group) use (&$cachedGroups, &$cachedUserGroups) {
+			/**
+			 * @var \OC\Group\Group $group
+			 */
+			unset($cachedGroups[$group->getGID()]);
+			$cachedUserGroups = array();
+		});
+		$this->listen('\OC\Group', 'postAddUser', function ($group) use (&$cachedUserGroups) {
 			/**
 			 * @var \OC\Group\Group $group
 			 */
-			unset($cache[$group->getGID()]);
+			$cachedUserGroups = array();
+		});
+		$this->listen('\OC\Group', 'postRemoveUser', function ($group) use (&$cachedUserGroups) {
+			/**
+			 * @var \OC\Group\Group $group
+			 */
+			$cachedUserGroups = array();
 		});
 	}
 
@@ -135,7 +154,7 @@ class Manager extends PublicEmitter {
 		foreach ($this->backends as $backend) {
 			$groupIds = $backend->getGroups($search, $limit, $offset);
 			foreach ($groupIds as $groupId) {
-				$groups[$groupId] = $this->getGroupObject($groupId);
+				$groups[$groupId] = $this->get($groupId);
 			}
 			if (!is_null($limit) and $limit <= 0) {
 				return array_values($groups);
@@ -149,14 +168,19 @@ class Manager extends PublicEmitter {
 	 * @return \OC\Group\Group[]
 	 */
 	public function getUserGroups($user) {
+		$uid = $user->getUID();
+		if (isset($this->cachedUserGroups[$uid])) {
+			return $this->cachedUserGroups[$uid];
+		}
 		$groups = array();
 		foreach ($this->backends as $backend) {
-			$groupIds = $backend->getUserGroups($user->getUID());
+			$groupIds = $backend->getUserGroups($uid);
 			foreach ($groupIds as $groupId) {
-				$groups[$groupId] = $this->getGroupObject($groupId);
+				$groups[$groupId] = $this->get($groupId);
 			}
 		}
-		return array_values($groups);
+		$this->cachedUserGroups[$uid] = array_values($groups);
+		return $this->cachedUserGroups[$uid];
 	}
 
 	/**
diff --git a/lib/private/user/user.php b/lib/private/user/user.php
index 229cbf68ff1399695b4d33f17997252931e7f68d..bc5c541e521e3b2b7d0e5a3f2865026718496d06 100644
--- a/lib/private/user/user.php
+++ b/lib/private/user/user.php
@@ -55,11 +55,6 @@ class User {
 	 */
 	public function __construct($uid, $backend, $emitter = null, $config = null) {
 		$this->uid = $uid;
-		if ($backend and $backend->implementsActions(OC_USER_BACKEND_GET_DISPLAYNAME)) {
-			$this->displayName = $backend->getDisplayName($uid);
-		} else {
-			$this->displayName = $uid;
-		}
 		$this->backend = $backend;
 		$this->emitter = $emitter;
 		$this->config = $config;
@@ -86,6 +81,13 @@ class User {
 	 * @return string
 	 */
 	public function getDisplayName() {
+		if (!isset($this->displayName)) {
+			if ($this->backend and $this->backend->implementsActions(OC_USER_BACKEND_GET_DISPLAYNAME)) {
+				$this->displayName = $this->backend->getDisplayName($this->uid);
+			} else {
+				$this->displayName = $this->uid;
+			}
+		}
 		return $this->displayName;
 	}
 
diff --git a/tests/lib/group/manager.php b/tests/lib/group/manager.php
index 061c9e7ea34d058dc6e5feaef183e13a2257fe0a..6799a598d422c0dfd4940f0cbde49e4b85914c40 100644
--- a/tests/lib/group/manager.php
+++ b/tests/lib/group/manager.php
@@ -398,4 +398,98 @@ class Manager extends \PHPUnit_Framework_TestCase {
 		$this->assertEquals(1, count($users));
 		$this->assertTrue(isset($users['user33']));
 	}
+
+	public function testGetUserGroupsWithAddUser() {
+		/**
+		 * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend
+		 */
+		$backend = $this->getMock('\OC_Group_Database');
+		$expectedGroups = array();
+		$backend->expects($this->any())
+			->method('getUserGroups')
+			->with('user1')
+			->will($this->returnCallback(function () use (&$expectedGroups) {
+				return $expectedGroups;
+			}));
+		$backend->expects($this->any())
+			->method('groupExists')
+			->with('group1')
+			->will($this->returnValue(true));
+		$backend->expects($this->once())
+			->method('implementsActions')
+			->will($this->returnValue(true));
+
+		/**
+		 * @var \OC\User\Manager $userManager
+		 */
+		$userManager = $this->getMock('\OC\User\Manager');
+		$manager = new \OC\Group\Manager($userManager);
+		$manager->addBackend($backend);
+
+		// prime cache
+		$user1 = new User('user1', null);
+		$groups = $manager->getUserGroups($user1);
+		$this->assertEquals(array(), $groups);
+
+		// add user
+		$group = $manager->get('group1');
+		$group->addUser($user1);
+		$expectedGroups = array('group1');
+
+		// check result
+		$groups = $manager->getUserGroups($user1);
+		$this->assertEquals(1, count($groups));
+		$group1 = $groups[0];
+		$this->assertEquals('group1', $group1->getGID());
+	}
+
+	public function testGetUserGroupsWithRemoveUser() {
+		/**
+		 * @var \PHPUnit_Framework_MockObject_MockObject | \OC_Group_Backend $backend
+		 */
+		$backend = $this->getMock('\OC_Group_Database');
+		$expectedGroups = array('group1');
+		$backend->expects($this->any())
+			->method('getUserGroups')
+			->with('user1')
+			->will($this->returnCallback(function () use (&$expectedGroups) {
+				return $expectedGroups;
+			}));
+		$backend->expects($this->any())
+			->method('groupExists')
+			->with('group1')
+			->will($this->returnValue(true));
+		$backend->expects($this->once())
+			->method('implementsActions')
+			->will($this->returnValue(true));
+		$backend->expects($this->once())
+			->method('inGroup')
+			->will($this->returnValue(true));
+		$backend->expects($this->once())
+			->method('removeFromGroup')
+			->will($this->returnValue(true));
+
+		/**
+		 * @var \OC\User\Manager $userManager
+		 */
+		$userManager = $this->getMock('\OC\User\Manager');
+		$manager = new \OC\Group\Manager($userManager);
+		$manager->addBackend($backend);
+
+		// prime cache
+		$user1 = new User('user1', null);
+		$groups = $manager->getUserGroups($user1);
+		$this->assertEquals(1, count($groups));
+		$group1 = $groups[0];
+		$this->assertEquals('group1', $group1->getGID());
+
+		// remove user
+		$group = $manager->get('group1');
+		$group->removeUser($user1);
+		$expectedGroups = array();
+
+		// check result
+		$groups = $manager->getUserGroups($user1);
+		$this->assertEquals(array(), $groups);
+	}
 }