diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index e104c8d1764925cde9d016d4d024ecbeb02ded9d..e95bd24fbdd7e84a3e524cd48a23ecfdc7bd37d7 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -104,24 +104,38 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
 	 * Get a list of all users.
 	 */
 	public function getUsers($search = '', $limit = 10, $offset = 0) {
-		$ldap_users = $this->connection->getFromCache('getUsers');
-		if(is_null($ldap_users)) {
-			$ldap_users = $this->fetchListOfUsers($this->connection->ldapUserFilter, array($this->connection->ldapUserDisplayName, 'dn'));
-			$ldap_users = $this->ownCloudUserNames($ldap_users);
-			$this->connection->writeToCache('getUsers', $ldap_users);
-		}
-		$this->userSearch = $search;
-		if(!empty($this->userSearch)) {
-			$ldap_users = array_filter($ldap_users, array($this, 'userMatchesFilter'));
+		$cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
+
+		//check if users are cached, if so return
+		$ldap_users = $this->connection->getFromCache($cachekey);
+		if(!is_null($ldap_users)) {
+			return $ldap_users;
 		}
-		if($limit == -1) {
-			$limit = null;
+
+		//prepare search filter
+		$search = empty($search) ? '*' : '*'.$search.'*';
+		$filter = $this->combineFilterWithAnd(array(
+			$this->connection->ldapUserFilter,
+			$this->connection->ldapGroupDisplayName.'='.$search
+		));
+
+		\OCP\Util::writeLog('user_ldap', 'getUsers: Get users filter '.$filter, \OCP\Util::DEBUG);
+		//do the search and translate results to owncloud names
+		$ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'), $limit, $offset);
+		$ldap_users = $this->ownCloudUserNames($ldap_users);
+
+		if(!$this->getPagedSearchResultState()) {
+			\OCP\Util::writeLog('user_ldap', 'getUsers: We got old-style results', \OCP\Util::DEBUG);
+			//if not supported, a 'normal' search has run automatically, we just need to get our slice of the cake. And we cache the general search, too
+			$this->connection->writeToCache('getUsers-'.$search, $ldap_users);
+			$ldap_users = array_slice($ldap_users, $offset, $limit);
+		} else {
+			//debug message only
+			\OCP\Util::writeLog('user_ldap', 'getUsers: We got paged results', \OCP\Util::DEBUG);
 		}
-		return array_slice($ldap_users, $offset, $limit);
-	}
 
-	public function userMatchesFilter($user) {
-		return (strripos($user, $this->userSearch) !== false);
+		$this->connection->writeToCache($cachekey, $ldap_users);
+		return $ldap_users;
 	}
 
 	/**