diff --git a/CHANGELOG.md b/CHANGELOG.md
index d88ba029f4413c620a6a53f9eecaa7a5385c235e..302c7531860ae91249e619694371c8eb777d4326 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,7 @@ All notable changes to this project will be documented in this file.
     - sspmod_perun_LdapConnector to SimpleSAML\Module\perun\LdapConnector
     - sspmod_perun_RpcConnector to SimpleSAML\Module\perun\RpcConnector
  - Added disco-tpl template file
+ - Method getUsersGroupsOnFacility in AdapterRpc was optimized
  
  [Fixed]
  - Fixed the bug generating Array to string conversion Exception in PerunAttributes, 
diff --git a/lib/AdapterRpc.php b/lib/AdapterRpc.php
index 805eed8296e3fdcb1234c18b53074d3f7a077f23..67e9eaf62d2b37570889a5faf646a633048367db 100644
--- a/lib/AdapterRpc.php
+++ b/lib/AdapterRpc.php
@@ -289,6 +289,7 @@ class AdapterRpc extends Adapter
         return $perunAttr['value'];
     }
 
+
     public function getUsersGroupsOnFacility($spEntityId, $userId)
     {
         $facilities = $this->connector->get('facilitiesManager', 'getFacilitiesByAttribute', array(
@@ -296,54 +297,37 @@ class AdapterRpc extends Adapter
             'attributeValue' => $spEntityId,
         ));
 
-        $allowedResources = array();
-        foreach ($facilities as $facility) {
-            $resources = $this->connector->get('facilitiesManager', 'getAssignedResources', array(
-                'facility' => $facility['id'],
-            ));
-            $allowedResources = array_merge($allowedResources, $resources);
-        }
+        $groups = array();
 
-        $members = $this->connector->get('membersManager', 'getMembersByUser', array(
-            'user' => $userId,
-        ));
+        foreach ($facilities as $facility) {
+            $usersGroupsOnFacility = $this->connector->get(
+                'usersManager',
+                'getRichGroupsWhereUserIsActive',
+                array(
+                    'facility' => $facility['id'],
+                    'user' => $userId,
+                    'attrNames' => array('urn:perun:group:attribute-def:virt:voShortName')
+                )
+            );
 
-        $validMembers = array();
-        foreach ($members as $member) {
-            if ($member['status'] === 'VALID') {
-                array_push($validMembers, $member);
-            }
-        }
+            foreach ($usersGroupsOnFacility as $usersGroupOnFacility) {
+                if (isset($usersGroupOnFacility['attributes'][0]['friendlyName']) &&
+                    $usersGroupOnFacility['attributes'][0]['friendlyName'] == 'voShortName') {
+                    $uniqueName = $usersGroupOnFacility['attributes'][0]['value'] . ":" . $usersGroupOnFacility['name'];
 
-        $allGroups = array();
-        foreach ($allowedResources as $resource) {
-            foreach ($validMembers as $member) {
-                $groups = $this->connector->get('resourcesManager', 'getAssignedGroups', array(
-                    'resource' => $resource['id'],
-                    'member' => $member['id'],
-                ));
-                foreach ($groups as $group) {
-                    $attr = $this->connector->get('attributesManager', 'getAttribute', array(
-                        'group' => $group['id'],
-                        'attributeName' => 'urn:perun:group:attribute-def:virt:voShortName'
+                    array_push($groups, new Group(
+                        $usersGroupOnFacility['id'],
+                        $usersGroupOnFacility['voId'],
+                        $usersGroupOnFacility['name'],
+                        $uniqueName,
+                        $usersGroupOnFacility['description']
                     ));
-                    $uniqueName = $attr['value'] . ":" . $group['name'];
-                    array_push(
-                        $allGroups,
-                        new Group(
-                            $group['id'],
-                            $group['voId'],
-                            $group['name'],
-                            $uniqueName,
-                            $group['description']
-                        )
-                    );
                 }
             }
         }
+        $groups = $this->removeDuplicateEntities($groups);
 
-        $allGroups = $this->removeDuplicateEntities($allGroups);
-        return $allGroups;
+        return $groups;
     }
 
     public function getFacilitiesByEntityId($spEntityId)