diff --git a/app/controllers/ExperimentController.php b/app/controllers/ExperimentController.php
index cceba6a..330262b 100755
--- a/app/controllers/ExperimentController.php
+++ b/app/controllers/ExperimentController.php
@@ -3,7 +3,6 @@
 use Airavata\API\Error\AuthorizationException;
 use Airavata\API\Error\ExperimentNotFoundException;
 use Airavata\Model\Status\JobState;
-use Airavata\Model\Group\ResourceType;
 
 class ExperimentController extends BaseController
 {
@@ -72,11 +71,11 @@
             );
 
             if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-                $users = SharingUtilities::getProfilesForSharedUsers($_POST['project'], ResourceType::PROJECT);
+                $users = SharingUtilities::getProfilesForSharedUsers($_POST['project']);
                 $owner = array();
 
                 $projectOwner = array();
-                $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($_POST['project'], ResourceType::PROJECT);
+                $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($_POST['project']);
                 if (Session::get("username") !== $sharedProjectOwner) {
                     $projectOwner[$sharedProjectOwner] = $users[$sharedProjectOwner];
                     $users = array_diff_key($users, $projectOwner);
@@ -162,7 +161,7 @@
 
         $project = null;
         if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-            if (SharingUtilities::userCanRead(Session::get("username"), $experiment->projectId, ResourceType::PROJECT)) {
+            if (SharingUtilities::userCanRead(Session::get("username"), $experiment->projectId)) {
                 $project = ProjectUtilities::get_project($experiment->projectId);
             }
         } elseif ($experiment->userName == Session::get("username")){
@@ -198,9 +197,9 @@
             "writeableProjects" => $writeableProjects
         );
         if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-            $users = SharingUtilities::getProfilesForSharedUsers(Input::get("expId"), ResourceType::EXPERIMENT);
-            $sharedExperimentOwner = SharingUtilities::getSharedResourceOwner($experiment->experimentId, ResourceType::EXPERIMENT);
-            $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($experiment->projectId, ResourceType::PROJECT);
+            $users = SharingUtilities::getProfilesForSharedUsers(Input::get("expId"));
+            $sharedExperimentOwner = SharingUtilities::getSharedResourceOwner($experiment->experimentId);
+            $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($experiment->projectId);
 
             $owner = array();
             $projectOwner = array();
@@ -219,7 +218,7 @@
             // and the experiment isn't editable. If the experiment is
             // editable, the sharing can be edited on the edit page.
             $canEditSharing = (Session::get("username") === $sharedExperimentOwner) && !$expVal["editable"];
-            $data['can_write'] = SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId, ResourceType::EXPERIMENT);
+            $data['can_write'] = SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId);
             $data["users"] = json_encode($users);
             $data["owner"] = json_encode($owner);
             $data["projectOwner"] = json_encode($projectOwner);
@@ -353,10 +352,10 @@
         );
 
         if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-            if (SharingUtilities::userCanWrite(Session::get("username"), $_GET['expId'], ResourceType::EXPERIMENT) === true) {
-                $users = SharingUtilities::getProfilesForSharedUsers($_GET['expId'], ResourceType::EXPERIMENT);
-                $sharedExperimentOwner = SharingUtilities::getSharedResourceOwner($experiment->experimentId, ResourceType::EXPERIMENT);
-                $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($experiment->projectId, ResourceType::PROJECT);
+            if (SharingUtilities::userCanWrite(Session::get("username"), $_GET['expId']) === true) {
+                $users = SharingUtilities::getProfilesForSharedUsers($_GET['expId']);
+                $sharedExperimentOwner = SharingUtilities::getSharedResourceOwner($experiment->experimentId);
+                $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($experiment->projectId);
 
                 $owner = array();
                 $projectOwner = array();
@@ -428,7 +427,7 @@
         }
 
         if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-            if (SharingUtilities::userCanWrite(Session::get("username"), Input::get('expId'), ResourceType::EXPERIMENT)) {
+            if (SharingUtilities::userCanWrite(Session::get("username"), Input::get('expId'))) {
                 if (isset($_POST['save']) || isset($_POST['launch'])) {
 
                     ExperimentUtilities::update_experiment($experiment->experimentId, $updatedExperiment);
@@ -542,7 +541,7 @@
         foreach ($expContainer as $experiment) {
             if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
                 $can_write[$experiment['experiment']->experimentId] = SharingUtilities::userCanWrite(Session::get("username"),
-                    $experiment['experiment']->experimentId, ResourceType::EXPERIMENT);
+                    $experiment['experiment']->experimentId);
             } else {
                 $can_write[$experiment['experiment']->experimentId] = true;
             }
@@ -568,7 +567,7 @@
     public function sharedUsers()
     {
         if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
-            return Response::json(SharingUtilities::getProfilesForSharedUsers($_GET['resourceId'], ResourceType::EXPERIMENT));
+            return Response::json(SharingUtilities::getProfilesForSharedUsers($_GET['resourceId']));
         }
         else {
             return Response::json(array("error" => "Error: No project specified"));
@@ -578,7 +577,7 @@
     public function unsharedUsers()
     {
         if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
-            return Response::json(SharingUtilities::getProfilesForUnsharedUsers($_GET['resourceId'], ResourceType::EXPERIMENT));
+            return Response::json(SharingUtilities::getProfilesForUnsharedUsers($_GET['resourceId']));
         }
         else {
             return Response::json(array("error" => "Error: No experiment specified"));
diff --git a/app/controllers/ProjectController.php b/app/controllers/ProjectController.php
index f89f6eb..7d14c7a 100755
--- a/app/controllers/ProjectController.php
+++ b/app/controllers/ProjectController.php
@@ -1,6 +1,5 @@
 <?php
 
-use Airavata\Model\Group\ResourceType;
 
 class ProjectController extends BaseController
 {
@@ -52,7 +51,7 @@
             $experiments = ProjectUtilities::get_experiments_in_project(Input::get("projId"));
 
             if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-                $users = SharingUtilities::getProfilesForSharedUsers(Input::get('projId'), ResourceType::PROJECT);
+                $users = SharingUtilities::getProfilesForSharedUsers(Input::get('projId'));
 
                 $owner = array();
                 if (strcmp(Session::get("username"), $project->owner) !== 0) {
@@ -62,7 +61,7 @@
 
                 $experiment_can_write = array();
                 foreach($experiments as $experiment) {
-                    if (SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId, ResourceType::EXPERIMENT)) {
+                    if (SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId)) {
                         $experiment_can_write[$experiment->experimentId] = true;
                     }
                     else {
@@ -75,7 +74,7 @@
                         "experiments" => $experiments,
                         "users" => json_encode($users),
                         "owner" => json_encode($owner),
-                        "project_can_write" => SharingUtilities::userCanWrite(Session::get("username"), Input::get("projId"), ResourceType::PROJECT),
+                        "project_can_write" => SharingUtilities::userCanWrite(Session::get("username"), Input::get("projId")),
                         "experiment_can_write" => $experiment_can_write
                     ));
             }else{
@@ -108,7 +107,7 @@
         $projectDetails->description = Input::get("project-description");
 
         if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-            if (isset($_POST['save']) && SharingUtilities::userCanWrite(Session::get("username"), Input::get("projectId"), ResourceType::PROJECT)) {
+            if (isset($_POST['save']) && SharingUtilities::userCanWrite(Session::get("username"), Input::get("projectId"))) {
 
                 try {
                     ProjectUtilities::update_project(Input::get("projectId"), $projectDetails);
@@ -137,7 +136,7 @@
     private function createEditView($projectId, $projectDetails, $shareSettings)
     {
         if (Config::get('pga_config.airavata')["data-sharing-enabled"]) {
-            if (SharingUtilities::userCanWrite(Session::get("username"), $projectId, ResourceType::PROJECT)) {
+            if (SharingUtilities::userCanWrite(Session::get("username"), $projectId)) {
                 if ($shareSettings) {
 
                     $profiles = SharingUtilities::getUserProfiles(array_keys($shareSettings));
@@ -148,7 +147,7 @@
                     }
                     $users = $profiles;
                 } else {
-                    $users = SharingUtilities::getProfilesForSharedUsers($projectId, ResourceType::PROJECT);
+                    $users = SharingUtilities::getProfilesForSharedUsers($projectId);
                 }
                 $owner = array();
                 if (strcmp(Session::get("username"), $projectDetails->owner) !== 0) {
@@ -201,7 +200,7 @@
         $user = Session::get("username");
         foreach($projects as $project) {
             if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-                $can_write[$project->projectID] = SharingUtilities::userCanWrite($user, $project->projectID, ResourceType::PROJECT);
+                $can_write[$project->projectID] = SharingUtilities::userCanWrite($user, $project->projectID);
             } else {
                 $can_write[$project->projectID] = true;
             }
@@ -225,7 +224,7 @@
     public function sharedUsers()
     {
         if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
-            return Response::json(SharingUtilities::getProfilesForSharedUsers($_GET['resourceId'], ResourceType::PROJECT));
+            return Response::json(SharingUtilities::getProfilesForSharedUsers($_GET['resourceId']));
         }
         else {
             return Response::json(array("error" => "Error: No project specified"));
@@ -235,7 +234,7 @@
     public function unsharedUsers()
     {
         if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
-            return Response::json(SharingUtilities::getProfilesForUnsharedUsers($_GET['resourceId'], ResourceType::PROJECT));
+            return Response::json(SharingUtilities::getProfilesForUnsharedUsers($_GET['resourceId']));
         }
         else {
             return Response::json(array("error" => "Error: No project specified"));
diff --git a/app/libraries/ExperimentUtilities.php b/app/libraries/ExperimentUtilities.php
index 17738f1..1d7d030 100755
--- a/app/libraries/ExperimentUtilities.php
+++ b/app/libraries/ExperimentUtilities.php
@@ -22,7 +22,6 @@
 use Airavata\Model\Data\Replica\ReplicaLocationCategory;
 use Airavata\Model\Data\Replica\ReplicaPersistentType;
 use Airavata\Model\Application\Io\InputDataObjectType;
-use Airavata\Model\Group\ResourceType;
 use Airavata\Model\Group\ResourcePermissionType;
 
 class ExperimentUtilities
@@ -729,7 +728,7 @@
             }
             Airavata::updateExperiment(Session::get('authz-token'), $cloneId, $experiment);
 
-            $share = SharingUtilities::getAllUserPermissions($expId, ResourceType::EXPERIMENT);
+            $share = SharingUtilities::getAllUserPermissions($expId);
             $share[Session::get('username')] = ["read" => true, "write" => true];
             ExperimentUtilities::share_experiment($cloneId, json_decode(json_encode($share)));
 
@@ -1097,7 +1096,7 @@
         $expVal["taskTypes"] = TaskTypes::$__names;
 
         if(Config::get('pga_config.airavata')["data-sharing-enabled"]) {
-            $can_write = SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId, ResourceType::EXPERIMENT);
+            $can_write = SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId);
         } else {
             $can_write = true;
         }
@@ -1278,7 +1277,7 @@
         $expNum = 0;
         foreach ($experiments as $experiment) {
             if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
-                if (SharingUtilities::userCanRead(Session::get('username'), $experiment->experimentId, ResourceType::EXPERIMENT)) {
+                if (SharingUtilities::userCanRead(Session::get('username'), $experiment->experimentId)) {
                     $expValue = ExperimentUtilities::get_experiment_values($experiment, true);
                     $expContainer[$expNum]['experiment'] = $experiment;
                     if ($expValue["experimentStatusString"] == "FAILED")
@@ -1545,10 +1544,10 @@
             }
         }
 
-        GrouperUtilities::shareResourceWithUsers($expId, ResourceType::EXPERIMENT, $wadd);
-        GrouperUtilities::revokeSharingOfResourceFromUsers($expId, ResourceType::EXPERIMENT, $wrevoke);
+        GrouperUtilities::shareResourceWithUsers($expId, $wadd);
+        GrouperUtilities::revokeSharingOfResourceFromUsers($expId, $wrevoke);
 
-        GrouperUtilities::shareResourceWithUsers($expId, ResourceType::EXPERIMENT, $radd);
-        GrouperUtilities::revokeSharingOfResourceFromUsers($expId, ResourceType::EXPERIMENT, $rrevoke);
+        GrouperUtilities::shareResourceWithUsers($expId, $radd);
+        GrouperUtilities::revokeSharingOfResourceFromUsers($expId, $rrevoke);
     }
 }
diff --git a/app/libraries/GrouperUtilities.php b/app/libraries/GrouperUtilities.php
index 625dba4..a167a3d 100644
--- a/app/libraries/GrouperUtilities.php
+++ b/app/libraries/GrouperUtilities.php
@@ -1,6 +1,5 @@
 <?php
 
-use Airavata\Model\Group\ResourceType;
 use Airavata\Model\Group\ResourcePermissionType;
 
 class GrouperUtilities
@@ -16,10 +15,9 @@
 
     /**
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @param $userPermissionMap    A map of map<username,Airavata\Model\Group\ResourcePermissionType>
      */
-    public static function shareResourceWithUsers($resourceId, $dataResourceType, $userPermissionMap)
+    public static function shareResourceWithUsers($resourceId, $userPermissionMap)
     {
         $newUserPermissionsMap = [];
         foreach($userPermissionMap as $key=> $value){
@@ -31,10 +29,9 @@
 
     /**
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @param $userPermissionMap    A map of map<username,Airavata\Model\Group\ResourcePermissionType>
      */
-    public static function revokeSharingOfResourceFromUsers($resourceId, $dataResourceType, $userPermissionMap)
+    public static function revokeSharingOfResourceFromUsers($resourceId, $userPermissionMap)
     {
         $newUserPermissionsMap = [];
         foreach($userPermissionMap as $key=> $value){
@@ -46,13 +43,12 @@
 
     /**
      * @param $resourceId        Experiment or Project ID
-     * @param $dataResourceType  e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @param $permissionType    e.g Airavata\Model\Group\ResourcePermissionType::READ, Airavata\Model\Group\ResourcePermissionType::WRITE
      * @return array             array of usernames
      */
-    public static function getAllAccessibleUsers($resourceId, $dataResourceType, $permissionType)
+    public static function getAllAccessibleUsers($resourceId, $permissionType)
     {
-        $temp = Airavata::getAllAccessibleUsers(Session::get('authz-token'), $resourceId, $dataResourceType, $permissionType);
+        $temp = Airavata::getAllAccessibleUsers(Session::get('authz-token'), $resourceId, $permissionType);
         $userList = [];
         foreach ($temp as $key => $u) {
             if (strpos($u, '@') !== false) {
diff --git a/app/libraries/ProjectUtilities.php b/app/libraries/ProjectUtilities.php
index b80d24d..3ea8997 100755
--- a/app/libraries/ProjectUtilities.php
+++ b/app/libraries/ProjectUtilities.php
@@ -5,7 +5,6 @@
 use Airavata\API\Error\InvalidRequestException;
 use Airavata\Facades\Airavata;
 use Airavata\Model\Workspace\Project;
-use Airavata\Model\Group\ResourceType;
 use Airavata\Model\Group\ResourcePermissionType;
 
 class ProjectUtilities
@@ -63,7 +62,7 @@
         $userProjects = ProjectUtilities::get_all_user_projects($gatewayId, $username);
         if (Config::get('pga_config.airavata')["data-sharing-enabled"]){
             foreach($userProjects as $project) {
-                if (SharingUtilities::userCanWrite($username, $project->projectID, ResourceType::PROJECT)) {
+                if (SharingUtilities::userCanWrite($username, $project->projectID)) {
                     $writeableProjects[] = $project;
                 }
             }
@@ -223,7 +222,7 @@
         }
 
         for($i = 0; $i < count($experiments); $i++) {
-            if (!SharingUtilities::userCanRead(Session::get("username"), $experiments[$i]->experimentId, ResourceType::EXPERIMENT)) {
+            if (!SharingUtilities::userCanRead(Session::get("username"), $experiments[$i]->experimentId)) {
                 array_splice($experiments, $i, 1);
             }
         }
@@ -347,10 +346,10 @@
             }
         }
 
-        GrouperUtilities::shareResourceWithUsers($projectId, ResourceType::PROJECT, $wadd);
-        GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, ResourceType::PROJECT, $wrevoke);
+        GrouperUtilities::shareResourceWithUsers($projectId, $wadd);
+        GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, $wrevoke);
 
-        GrouperUtilities::shareResourceWithUsers($projectId, ResourceType::PROJECT, $radd);
-        GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, ResourceType::PROJECT, $rrevoke);
+        GrouperUtilities::shareResourceWithUsers($projectId, $radd);
+        GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, $rrevoke);
     }
 }
diff --git a/app/libraries/SharingUtilities.php b/app/libraries/SharingUtilities.php
index 4924eef..a6766d5 100755
--- a/app/libraries/SharingUtilities.php
+++ b/app/libraries/SharingUtilities.php
@@ -1,5 +1,4 @@
 <?php
-use Airavata\Model\Group\ResourceType;
 use Airavata\Model\Group\ResourcePermissionType;
 
 class SharingUtilities {
@@ -8,11 +7,10 @@
      * Determine if the resource has been shared with any users.
      *
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return True if the resource has been shared, false otherwise.
      */
-    public static function resourceIsShared($resourceId, $dataResourceType) {
-        $read = GrouperUtilities::getAllAccessibleUsers($resourceId, $dataResourceType, ResourcePermissionType::READ);
+    public static function resourceIsShared($resourceId) {
+        $read = GrouperUtilities::getAllAccessibleUsers($resourceId, ResourcePermissionType::READ);
         return (count($read) > 0 ? true : false);
     }
 
@@ -21,10 +19,9 @@
      *
      * @param $uid                  The user to check
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return True if the user has read permission, false otherwise.
      */
-    public static function userCanRead($uid, $resourceId, $dataResourceType) {
+    public static function userCanRead($uid, $resourceId) {
 
         return Airavata::userHasAccess(Session::get('authz-token'), $resourceId, ResourcePermissionType::READ);
     }
@@ -34,10 +31,9 @@
      *
      * @param $uid                  The user to check
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return True if the user has write permission, false otherwise.
      */
-    public static function userCanWrite($uid, $resourceId, $dataResourceType) {
+    public static function userCanWrite($uid, $resourceId) {
 
         return Airavata::userHasAccess(Session::get('authz-token'), $resourceId, ResourcePermissionType::WRITE);
     }
@@ -46,15 +42,14 @@
      * Get the permissions settings for the specified resource.
      *
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return An array [$uid => [read => bool, write => bool, owner => bool]]
      */
-    public static function getAllUserPermissions($resourceId, $dataResourceType) {
+    public static function getAllUserPermissions($resourceId) {
         $users = array();
 
-        $read = GrouperUtilities::getAllAccessibleUsers($resourceId, $dataResourceType, ResourcePermissionType::READ);
-        $write = GrouperUtilities::getAllAccessibleUsers($resourceId, $dataResourceType, ResourcePermissionType::WRITE);
-        $owner = GrouperUtilities::getAllAccessibleUsers($resourceId, $dataResourceType, ResourcePermissionType::OWNER);
+        $read = GrouperUtilities::getAllAccessibleUsers($resourceId, ResourcePermissionType::READ);
+        $write = GrouperUtilities::getAllAccessibleUsers($resourceId, ResourcePermissionType::WRITE);
+        $owner = GrouperUtilities::getAllAccessibleUsers($resourceId, ResourcePermissionType::OWNER);
 
         foreach($read as $uid) {
             if ($uid !== Session::get('username') && UserProfileUtilities::does_user_profile_exist($uid)) {
@@ -115,11 +110,10 @@
      * Retrieve profile and permissions information for users with access to the given resource.
      *
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return An array [uid => [firstname => string, lastname => string, email => string, access => [read => bool, write => bool]]]
      */
-    public static function getProfilesForSharedUsers($resourceId, $dataResourceType) {
-        $perms = SharingUtilities::getAllUserPermissions($resourceId, $dataResourceType);
+    public static function getProfilesForSharedUsers($resourceId) {
+        $perms = SharingUtilities::getAllUserPermissions($resourceId);
         $profs = SharingUtilities::getUserProfiles(array_keys($perms));
 
         foreach ($profs as $uid => $prof) {
@@ -134,12 +128,11 @@
      * Retrieve profile and permissions information for users without access to the given resource.
      *
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return An array [uid => [firstname => string, lastname => string, email => string]] of all users without access
      */
-    public static function getProfilesForUnsharedUsers($resourceId, $dataResourceType) {
+    public static function getProfilesForUnsharedUsers($resourceId) {
         $users = GrouperUtilities::getAllGatewayUsers();
-        $read = GrouperUtilities::getAllAccessibleUsers($resourceId, $dataResourceType, ResourcePermissionType::READ);
+        $read = GrouperUtilities::getAllAccessibleUsers($resourceId, ResourcePermissionType::READ);
 
         $unshared = array_diff($users, $read);
 
@@ -151,14 +144,13 @@
      *
      *
      * @param $resourceId           Experiment or Project ID
-     * @param $dataResourceType     e.g Airavata\Model\Group\ResourceType:PROJECT,Airavata\Model\Group\ResourceType:EXPERIMENT
      * @return An array [uid => [firstname => string, lastname => string, email => string, access => [read => bool, write => bool, owner => bool]]]
      *         with access only defined for users with permissions.
      */
-    public static function getAllUserProfiles($resourceId=null, $dataResourceType=null) {
+    public static function getAllUserProfiles($resourceId=null) {
         $profs = SharingUtilities::getUserProfiles(GrouperUtilities::getAllGatewayUsers());
         if ($resourceId) {
-            $perms = SharingUtilities::getAllUserPermissions($resourceId, $dataResourceType);
+            $perms = SharingUtilities::getAllUserPermissions($resourceId);
 
             foreach ($perms as $uid => $access) {
                 $profs[$uid]['access'] = $access;
@@ -168,8 +160,8 @@
     }
 
     public static function mixProjectPermissionsWithExperiment($projectId, $expId) {
-        $proj = SharingUtilities::getProfilesForSharedUsers($projectId, ResourceType::PROJECT);
-        $exp = SharingUtilities::getProfilesForSharedUsers($expId, ResourceType::EXPERIMENT);
+        $proj = SharingUtilities::getProfilesForSharedUsers($projectId);
+        $exp = SharingUtilities::getProfilesForSharedUsers($expId);
 
         foreach ($proj as $uid => $prof) {
             if (!array_key_exists($uid, $exp)) {
@@ -190,11 +182,11 @@
         return $users;
     }
 
-    public static function getSharedResourceOwner($resourceId, $dataResourceType) {
-        $owners = GrouperUtilities::getAllAccessibleUsers($resourceId, $dataResourceType, ResourcePermissionType::OWNER);
+    public static function getSharedResourceOwner($resourceId) {
+        $owners = GrouperUtilities::getAllAccessibleUsers($resourceId, ResourcePermissionType::OWNER);
         if (count($owners) != 1) {
-            Log::error("Got more than one shared resource owner!", array($resourceId, $dataResourceType, $owners));
-            throw new Exception("Expected exactly 1 owner for $resourceId of type $dataResourceType!");
+            Log::error("Got more than one shared resource owner!", array($resourceId, $owners));
+            throw new Exception("Expected exactly 1 owner for $resourceId!");
         } else {
             return $owners[0];
         }
