diff --git a/api/dao/containerstorage.py b/api/dao/containerstorage.py
index 7c0e32bf38bdeffa6934652aee8f8d12ce7502ae..527dfeaede2caacdd8cc0d4e432d1f3ca76e8f7b 100644
--- a/api/dao/containerstorage.py
+++ b/api/dao/containerstorage.py
@@ -294,6 +294,16 @@ class SessionStorage(ContainerStorage):
         if session is None:
             raise APINotFoundException('Could not find session {}'.format(_id))
 
+        # If the subject code is changed, change the subject id to either
+        # the Id of the new subject code if there is another session in the same project
+        # that has that subject code or a new Id
+        if payload and payload.get('subject',{}).get('code') and payload.get('subject', {}).get('code') != session.get('subject', {}).get('code'):
+            sibling_session = self.dbc.find_one({'project': session.get('project'), 'subject.code': payload.get('subject', {}).get('code')})
+            if sibling_session:
+                payload['subject']['_id'] = sibling_session.get('subject').get('_id')
+            else:
+                payload['subject']['_id'] = bson.ObjectId()
+
         # Determine if we need to calc session compliance
         payload_has_template = (payload and payload.get('project_has_template'))
         session_has_template = session.get('project_has_template') is not None
diff --git a/test/integration_tests/python/test_containers.py b/test/integration_tests/python/test_containers.py
index e474efdc4055bbf3fd764f2ac59b5b73bcd6e8d3..4fec8cf89da41faa3ed8cfdeb7a621e0855e1647 100644
--- a/test/integration_tests/python/test_containers.py
+++ b/test/integration_tests/python/test_containers.py
@@ -301,6 +301,7 @@ def test_post_container(data_builder, as_admin):
 
 def test_put_container(data_builder, as_admin):
     session = data_builder.create_session()
+    session_2 = data_builder.create_session()
 
     # update session w/ timestamp
     r = as_admin.put('/sessions/' + session, json={
@@ -308,12 +309,70 @@ def test_put_container(data_builder, as_admin):
     })
     assert r.ok
 
+    # test that an update to subject.code
+    # will create a new subject._id
+    r = as_admin.get('/sessions/'+session)
+    assert r.ok
+    old_subject_id = r.json().get('subject',{}).get('_id')
+    r = as_admin.put('/sessions/' + session, json={
+        'subject': {
+            'code': 'newCode'
+        }
+    })
+    assert r.ok
+    r = as_admin.get('/sessions/' + session)
+    new_subject_id = r.json().get('subject',{}).get('_id')
+    assert new_subject_id != old_subject_id
+
+    # check that an update to subject.First Name
+    # will not create a new subject._id
+    r = as_admin.get('/sessions/'+session)
+    assert r.ok
+    old_subject_id = r.json().get('subject',{}).get('_id')
+    r = as_admin.put('/sessions/' + session, json={
+        'subject': {
+            'firstname': 'NewName'
+        }
+    })
+    assert r.ok
+    r = as_admin.get('/sessions/' + session)
+    new_subject_id = r.json().get('subject',{}).get('_id')
+    assert new_subject_id == old_subject_id
+
+    # update session and not the subject
+    r = as_admin.put('/sessions/' + session, json={
+        'label': 'patience_343'
+    })
+    assert r.ok
+
+    # update session.subject.code to that of session_2
+    # first set session_2.subject.code to something
+    r = as_admin.put('/sessions/' + session_2, json={
+        'subject': {
+            'code': 'subject2'
+        }
+    })
+    assert r.ok
+    r = as_admin.get('/sessions/'+session_2)
+    assert r.ok
+    subject2Id = r.json().get('subject').get('_id')
+    r = as_admin.put('/sessions/' + session, json={
+        'subject': {
+            'code': 'subject2'
+        }
+    })
+    assert r.ok
+    r = as_admin.get('/sessions/'+session)
+    assert r.ok
+    assert r.json().get('subject').get('_id') == subject2Id
+
     # update subject w/ oid
     r = as_admin.put('/sessions/' + session, json={
         'subject': {'_id': '000000000000000000000000'}
     })
     assert r.ok
 
+
 def test_subject_age_must_be_int(data_builder, as_admin):
     # Ensure subject age can only be set as int (and None)
     # Found old data that had subject age stored as float