diff --git a/api/dao/hierarchy.py b/api/dao/hierarchy.py
index 2f0ccb30c163811179a7dee25a171bb8269bef16..b8e100feb164cee8b598025178e558ab26d75aef 100644
--- a/api/dao/hierarchy.py
+++ b/api/dao/hierarchy.py
@@ -220,7 +220,7 @@ def _group_id_fuzzy_match(group_id, project_label):
         group_id = 'unknown'
     return group_id, project_label
 
-def _find_or_create_destination_project(group_id, project_label, timestamp, user):
+def _find_or_create_destination_project(group_id, project_label, timestamp, user, site):
     group_id, project_label = _group_id_fuzzy_match(group_id, project_label)
     group = config.db.groups.find_one({'_id': group_id})
 
@@ -228,13 +228,13 @@ def _find_or_create_destination_project(group_id, project_label, timestamp, user
 
     if project:
         # If the project already exists, check the user's access
-        if user and not has_access(user, project, 'rw'):
+        if user and not has_access(user, project, 'rw', site):
             raise APIPermissionException('User {} does not have read-write access to project {}'.format(user, project['label']))
         return project
 
     else:
         # if the project doesn't exit, check the user's access at the group level
-        if user and not has_access(user, group, 'rw'):
+        if user and not has_access(user, group, 'rw', site):
             raise APIPermissionException('User {} does not have read-write access to group {}'.format(user, group_id))
 
         project = {
@@ -329,7 +329,8 @@ def _get_targets(project_obj, session, acquisition, type_, timestamp):
     return target_containers
 
 
-def find_existing_hierarchy(metadata, user=None):
+def find_existing_hierarchy(metadata, user=None, site=None):
+    #pylint: disable=unused-argument
     project = metadata.get('project', {})
     session = metadata.get('session', {})
     acquisition = metadata.get('acquisition', {})
@@ -364,7 +365,7 @@ def find_existing_hierarchy(metadata, user=None):
     return target_containers
 
 
-def upsert_bottom_up_hierarchy(metadata, user=None):
+def upsert_bottom_up_hierarchy(metadata, user=None, site=None):
     group = metadata.get('group', {})
     project = metadata.get('project', {})
     session = metadata.get('session', {})
@@ -383,7 +384,7 @@ def upsert_bottom_up_hierarchy(metadata, user=None):
     session_obj = config.db.sessions.find_one({'uid': session_uid}, ['project'])
     if session_obj: # skip project creation, if session exists
 
-        if user and not has_access(user, session_obj, 'rw'):
+        if user and not has_access(user, session_obj, 'rw', site):
             raise APIPermissionException('User {} does not have read-write access to session {}'.format(user, session_uid))
 
         now = datetime.datetime.utcnow()
@@ -395,10 +396,10 @@ def upsert_bottom_up_hierarchy(metadata, user=None):
         )
         return target_containers
     else:
-        return upsert_top_down_hierarchy(metadata, 'uid', user=user)
+        return upsert_top_down_hierarchy(metadata, 'uid', user=user, site=None)
 
 
-def upsert_top_down_hierarchy(metadata, type_='label', user=None):
+def upsert_top_down_hierarchy(metadata, type_='label', user=None, site=None):
     log.debug('I know my type is {}'.format(type_))
     group = metadata['group']
     project = metadata['project']
@@ -407,7 +408,7 @@ def upsert_top_down_hierarchy(metadata, type_='label', user=None):
 
     now = datetime.datetime.utcnow()
     project_files = dict_fileinfos(project.pop('files', []))
-    project_obj = _find_or_create_destination_project(group['_id'], project['label'], now, user)
+    project_obj = _find_or_create_destination_project(group['_id'], project['label'], now, user, site)
     target_containers = _get_targets(project_obj, session, acquisition, type_, now)
     target_containers.append(
         (TargetContainer(project_obj, 'project'), project_files)
diff --git a/api/placer.py b/api/placer.py
index 2caef4954ef5808cbb548832eb18160fd2aadc73..ccb354d84097f10d9d884ae8fd9b46e588d37d40 100644
--- a/api/placer.py
+++ b/api/placer.py
@@ -150,7 +150,7 @@ class UIDPlacer(Placer):
         metadata_validator(self.metadata, 'POST')
 
         # If not a superuser request, pass uid of user making the upload request
-        targets = self.create_hierarchy(self.metadata, user=self.context.get('uid'))
+        targets = self.create_hierarchy(self.metadata, user=self.context.get('uid'), site=self.context.get('site'))
 
         self.metadata_for_file = {}
 
diff --git a/api/upload.py b/api/upload.py
index 65c748fe58245f40d1ee6cbda82bc5934ae12fb0..61112ae9dc4ff177d028ec66707f5ae26f3ef24e 100644
--- a/api/upload.py
+++ b/api/upload.py
@@ -147,7 +147,7 @@ class Upload(base.RequestHandler):
             if not user:
                 self.abort(403, 'Uploading requires login')
 
-        context = {'uid': self.uid if not self.superuser_request else None}
+        context = {'uid': self.uid if not self.superuser_request else None, 'site': self.user_site or 'local'}
 
         # TODO: what enum
         if strategy == 'label':