diff --git a/.gitattributes b/.gitattributes
index 7e05dac0224b28a66d9e5fcea345eb88dd6dde1f..cbad3e19803df0a29ca8a7e578b34041e1b38ab9 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4245,7 +4245,7 @@ SAS/LSMR/src/lsmr/lsmrapp/__init__.py -text
 SAS/LSMR/src/lsmr/lsmrapp/admin.py -text
 SAS/LSMR/src/lsmr/lsmrapp/apps.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/0001_initial.py -text
-SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py -text
+SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/__init__.py -text
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py
similarity index 97%
rename from SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py
rename to SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py
index 50cbdd8d9083a601e08dbd1021a65b8068388d8d..88cd23559a13e2a86f17341ec9c8f0a7d4367077 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.0.6 on 2018-09-05 15:30
+# Generated by Django 2.0.6 on 2018-09-10 09:28
 
 import django.contrib.postgres.fields
 import django.contrib.postgres.fields.jsonb
@@ -35,7 +35,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='CopyReasonChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -59,7 +59,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='DataformatChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -115,7 +115,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='DatatypeChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -238,7 +238,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='RoleChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -314,7 +314,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='StationTypeChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -360,7 +360,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='TaskStateChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -387,7 +387,7 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='TaskTypeChoice',
             fields=[
-                ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)),
+                ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
             ],
             options={
                 'abstract': False,
@@ -586,7 +586,7 @@ class Migration(migrations.Migration):
         migrations.AddField(
             model_name='task',
             name='requested_state',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='task_requested_states', to='lsmrapp.TaskStateChoice'),
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='task_requested_states', to='lsmrapp.TaskStateChoice'),
         ),
         migrations.AddField(
             model_name='task',
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py
index a04814750485b9a2c7a1ca87fe0d81e4dad227f3..9ae51284cc81835cdeb25d396332d8afcbec9da5 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py
@@ -6,7 +6,7 @@ from ..populate import *
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('lsmrapp', '0002_auto_20180905_1530'),
+        ('lsmrapp', '0002_auto_20180910_0928'),
     ]
 
     operations = [ migrations.RunPython(populate_choices) ]
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py b/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py
index 0723083f85029b3aedb5798f3ffa4eae96a90a9b..2639aa1bb2aa2ceff967a30d37b761bbed62b7ca 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py
@@ -97,7 +97,7 @@ class Task(BasicCommon):
     start_time = DateTimeField()
     stop_time = DateTimeField()
     state = ForeignKey('TaskStateChoice', null=False, on_delete=PROTECT, related_name='task_states') # set CANCELLED or ERROR instead?
-    requested_state = ForeignKey('TaskStateChoice', null=False, on_delete=CASCADE, related_name='task_requested_states') # set CANCELLED or ERROR instead?
+    requested_state = ForeignKey('TaskStateChoice', null=False, on_delete=PROTECT, related_name='task_requested_states') # set CANCELLED or ERROR instead?
     specification = JSONField()
     work_request_blueprint = ForeignKey('WorkRequestBlueprint', null=True, on_delete=SET_NULL)
     template = ForeignKey('TaskTemplate', null=False, on_delete=CASCADE)
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py
index 9d07fa22aa01df8a9d74ddaaddfba69c7b77a19f..bf634a919787aa944029f9fbd4f69abf9843f451 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py
@@ -70,7 +70,7 @@ class AbstractChoice(Model):
     You can find the derived AbstractChoice classes being used as ForeignKey in other models, thus enforcing data
     consistency at database level.
     """
-    value = CharField(max_length=30, editable=False, null=False, blank=False, unique=True, primary_key=True)
+    value = CharField(max_length=30, editable=True, null=False, blank=False, unique=True, primary_key=True)
 
     class Meta:
         abstract = True
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py
index 6469dc5888e5c3e16257af1e0d951d5cb2002624..f8c8581bb531c7ac089335779e8c54616eff51d4 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py
@@ -12,19 +12,19 @@ class TaskIORoleSerializer(serializers.HyperlinkedModelSerializer):
         fields = '__all__'
 
 
-class TaskStateChoiceSerializer(serializers.HyperlinkedModelSerializer):
+class TaskStateChoiceSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.TaskStateChoice
         fields = '__all__'
 
 
-class TaskTypeChoiceSerializer(serializers.HyperlinkedModelSerializer):
+class TaskTypeChoiceSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.TaskTypeChoice
         fields = '__all__'
 
 
-class StationTypeChoiceSerializer(serializers.HyperlinkedModelSerializer):
+class StationTypeChoiceSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.StationTypeChoice
         fields = '__all__'
diff --git a/SAS/LSMR/src/lsmr/urls.py b/SAS/LSMR/src/lsmr/urls.py
index 6a2bd93b01e26e6931ebc788c5073261bf1e62ae..5ce8b92ec29ea7afc85a5afedb9e48d2e9cbbae3 100644
--- a/SAS/LSMR/src/lsmr/urls.py
+++ b/SAS/LSMR/src/lsmr/urls.py
@@ -80,6 +80,8 @@ router.register(r'station_type_choice', viewsets.StationTypeChoiceViewSet)
 router.register(r'task_io_role', viewsets.TaskIORoleViewSet)
 router.register(r'task_template', viewsets.TaskTemplateViewSet)
 router.register(r'dataproduct_specification_template', viewsets.DataproductSpecificationTemplateViewSet)
+router.register(r'default_task_template', viewsets.DefaultTaskTemplateViewSet)
+router.register(r'default_dataproduct_specification_template', viewsets.DefaultDataproductSpecificationTemplateViewSet)
 
 # instances
 router.register(r'task', viewsets.TaskViewSet)
diff --git a/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py b/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py
index c1b9f857a5c255498ab7f95cda9902ba5666ea42..abb275dee58f38dd1d1dc3056d8663b32156ae69 100755
--- a/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py
+++ b/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py
@@ -184,6 +184,73 @@ class DataproductSpecificationTemplateTestCase(unittest.TestCase):
         DELETE_and_assert_gone(self, url)
 
 
+class DefaultTemplates(unittest.TestCase):
+
+    test_data_1 = {"name": "unique_name_post",
+                   "template": None,
+                   "tags": []}
+
+    test_data_2 = {"name": "unique_name_protect",
+                   "template": None,
+                   "tags": []}
+
+    def test_default_task_template_POST(self):
+        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_template/',
+                                                   TaskTemplateTestCase.test_data_1, 201,
+                                                   TaskTemplateTestCase.test_data_1)
+        url = r_dict['url']
+
+        test_data_1 = dict(self.test_data_1)
+        test_data_1['template'] = url
+        POST_and_assert_expected_response(self, BASE_URL + '/default_task_template/', test_data_1, 201, test_data_1)
+
+    def test_default_dataproduct_specification_template_POST(self):
+        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_specification_template/',
+                                                   DataproductSpecificationTemplateTestCase.test_data_1, 201,
+                                                   DataproductSpecificationTemplateTestCase.test_data_1)
+        url = r_dict['url']
+
+        test_data_1 = dict(self.test_data_1)
+        test_data_1['template'] = url
+        POST_and_assert_expected_response(self, BASE_URL + '/default_dataproduct_specification_template/', test_data_1, 201, test_data_1)
+
+    def test_default_task_template_PROTECT_behavior_on_template_deleted(self):
+
+        # POST with dependency
+        template_url = POST_and_assert_expected_response(self, BASE_URL + '/task_template/',
+                                                TaskTemplateTestCase.test_data_1, 201,
+                                                TaskTemplateTestCase.test_data_1)['url']
+        test_data = dict(self.test_data_2)
+        test_data['template'] = template_url
+        POST_and_assert_expected_response(self, BASE_URL + '/default_task_template/', test_data, 201, test_data)
+
+        # Try to DELETE dependency, verify that was not successful
+        # Unfortunately we don't get a nice error in json, but a Django debug page on error 500...
+        response = requests.delete(template_url)
+        self.assertEqual(500, response.status_code)
+        self.assertTrue("ProtectedError" in str(response.content))
+        GET_and_assert_expected_response(self, template_url, 200, TaskTemplateTestCase.test_data_1)
+
+    def test_default_dataproduct_specification_template_PROTECT_behavior_on_template_deleted(self):
+
+        # POST with dependency
+        template_url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_specification_template/',
+                                                DataproductSpecificationTemplateTestCase.test_data_1, 201,
+                                                DataproductSpecificationTemplateTestCase.test_data_1)['url']
+        test_data = dict(self.test_data_2)
+        test_data['template'] = template_url
+        POST_and_assert_expected_response(self, BASE_URL + '/default_dataproduct_specification_template/', test_data, 201, test_data)
+
+        # Try to DELETE dependency, verify that was not successful
+        # Unfortunately we don't get a nice error in json, but a Django debug page on error 500...
+        response = requests.delete(template_url)
+        self.assertEqual(500, response.status_code)
+        self.assertTrue("ProtectedError" in str(response.content))
+        GET_and_assert_expected_response(self, template_url, 200, DataproductSpecificationTemplateTestCase.test_data_1)
+
+
+
+
 class TaskTestCase(unittest.TestCase):
 
     def setUp(self):
@@ -283,6 +350,91 @@ class TaskTestCase(unittest.TestCase):
         # DELETE and check it's gone
         DELETE_and_assert_gone(self, url)
 
+    def test_task_CASCADE_behavior_on_type_deleted(self):
+
+        # create dependency that is safe to delete (enums are not populated / re-established between tests)
+        type_data = {'value': 'kickme'}
+        POST_and_assert_expected_response(self, BASE_URL + '/task_type_choice/', type_data, 201, type_data)
+        role_url =  BASE_URL + '/task_type_choice/kickme/'
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['type'] = role_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, role_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
+    def test_task_PROTECT_behavior_on_state_deleted(self):
+
+        # create dependency that is safe to delete (enums are not populated / re-established between tests)
+        state_data = {'value': 'kickme'}
+        POST_and_assert_expected_response(self, BASE_URL + '/task_state_choice/', state_data, 201, state_data)
+        state_url =  BASE_URL + '/task_state_choice/kickme/'
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['state'] = state_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # Try to DELETE dependency, verify that was not successful
+        # Unfortunately we don't get a nice error in json, but a Django debug page on error 500...
+        response = requests.delete(state_url)
+        self.assertEqual(500, response.status_code)
+        self.assertTrue("ProtectedError" in str(response.content))
+        GET_and_assert_expected_response(self, state_url, 200, state_data)
+
+    def test_task_PROTECT_behavior_on_requested_state_deleted(self):
+
+        # create dependency that is safe to delete (enums are not populated / re-established between tests)
+        state_data = {'value': 'kickmemore'}
+        POST_and_assert_expected_response(self, BASE_URL + '/task_state_choice/', state_data, 201, state_data)
+        state_url =  BASE_URL + '/task_state_choice/kickmemore/'
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['requested_state'] = state_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # Try to DELETE dependency, verify that was not successful
+        # Unfortunately we don't get a nice error in json, but a Django debug page on error 500...
+        response = requests.delete(state_url)
+        self.assertEqual(500, response.status_code)
+        self.assertTrue("ProtectedError" in str(response.content))
+        GET_and_assert_expected_response(self, state_url, 200, state_data)
+
+    def test_task_SET_NULL_behavior_on_work_request_blueprint_deleted(self):
+
+        # POST new item and verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task/', self.test_data_2, 201, self.test_data_2)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_2)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.work_request_blueprint_url)
+
+        # assert item reference is set null
+        expected_data = dict(self.test_data_2)
+        expected_data['work_request_blueprint'] = None
+        GET_and_assert_expected_response(self, url, 200, expected_data)
+
+    def test_task_CASCADE_behavior_on_template_deleted(self):
+
+        # POST new item and verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task/', self.test_data_2, 201, self.test_data_2)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_2)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.task_template_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
 
 class DataproductTestCase(unittest.TestCase):
 
@@ -373,6 +525,36 @@ class DataproductTestCase(unittest.TestCase):
         # DELETE and check it's gone
         DELETE_and_assert_gone(self, url)
 
+    def test_dataproduct_CASCADE_behavior_on_dataformat_deleted(self):
+
+        # create dependency that is safe to delete (enums are not populated / re-established between tests)
+        dataformat_data = {'value': 'kickme'}
+        POST_and_assert_expected_response(self, BASE_URL + '/dataformat_choice/', dataformat_data, 201, dataformat_data)
+        dataformat_url =  BASE_URL + '/dataformat_choice/kickme/'
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['dataformat'] = dataformat_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, dataformat_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
+    def test_dataproduct_CASCADE_behavior_on_specification_template_deleted(self):
+
+        # POST new item, verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct/', self.test_data_1, 201, self.test_data_1)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_1)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.specification_template_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
 
 
 class TaskIORoleTestCase(unittest.TestCase):
@@ -450,6 +632,46 @@ class TaskIORoleTestCase(unittest.TestCase):
         # DELETE and check it's gone
         DELETE_and_assert_gone(self, url)
 
+    def test_task_io_role_CASCADE_behavior_on_role_deleted(self):
+
+        # create dependency that is safe to delete (enums are not populated / re-established between tests)
+        role_data = {'value': 'kickme'}
+        POST_and_assert_expected_response(self, BASE_URL + '/role_choice/', role_data, 201, role_data)
+        role_url =  BASE_URL + '/role_choice/kickme/'
+
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['role'] = role_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task_io_role/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, role_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
+
+    def test_task_io_role_CASCADE_behavior_on_datatype_deleted(self):
+
+        # create new dependency that is safe to delete (enums are not populated / re-established between tests)
+        datatype_data = {'value': 'kickme'}
+        POST_and_assert_expected_response(self, BASE_URL + '/datatype_choice/', datatype_data, 201, datatype_data)
+        datatype_url = BASE_URL + '/datatype_choice/kickme/'
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['datatype'] = datatype_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/task_io_role/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, datatype_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
 
 class DataproductRelationTestCase(unittest.TestCase):
 
@@ -566,6 +788,74 @@ class DataproductRelationTestCase(unittest.TestCase):
         # DELETE and check it's gone
         DELETE_and_assert_gone(self, url)
 
+    def test_dataproduct_relation_CASCADE_behavior_on_task_deleted(self):
+
+        # POST new item, verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_1, 201, self.test_data_1)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_1)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.task_url_1)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
+    def test_dataproduct_relation_SET_NULL_behavior_on_input_deleted(self):
+
+        # POST new item, verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_2)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.test_data_2['input'])
+
+        # assert item reference is set null
+        expected_data = dict(self.test_data_2)
+        expected_data['input'] = None
+        GET_and_assert_expected_response(self, url, 200, expected_data)
+
+    def test_dataproduct_relation_SET_NULL_behavior_on_output_deleted(self):
+
+        # POST new item, verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_2)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.test_data_2['output'])
+
+        # assert item reference is set null
+        expected_data = dict(self.test_data_2)
+        expected_data['output'] = None
+        GET_and_assert_expected_response(self, url, 200, expected_data)
+
+    def test_dataproduct_relation_SET_NULL_behavior_on_input_role_deleted(self):
+
+        # POST new item, verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_2)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.test_data_2['input_role'])
+
+        # assert item reference is set null
+        expected_data = dict(self.test_data_2)
+        expected_data['input_role'] = None
+        GET_and_assert_expected_response(self, url, 200, expected_data)
+
+    def test_dataproduct_relation_SET_NULL_behavior_on_output_role_deleted(self):
+
+        # POST new item, verify
+        url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url']
+        GET_and_assert_expected_response(self, url, 200, self.test_data_2)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, self.test_data_2['output_role'])
+
+        # assert item reference is set null
+        expected_data = dict(self.test_data_2)
+        expected_data['output_role'] = None
+        GET_and_assert_expected_response(self, url, 200, expected_data)
+
 
 class AntennaSetTestCase(unittest.TestCase):
 
@@ -642,6 +932,26 @@ class AntennaSetTestCase(unittest.TestCase):
         # DELETE and check it's gone
         DELETE_and_assert_gone(self, url)
 
+    def test_antenna_set_CASCADE_behavior_on_station_type_choice_deleted(self):
+
+        # create dependency that is safe to delete (enums are not populated / re-established between tests)
+        dataformat_data = {'value': 'kickme'}
+        POST_and_assert_expected_response(self, BASE_URL + '/station_type_choice/', dataformat_data, 201, dataformat_data)
+        dataformat_url =  BASE_URL + '/station_type_choice/kickme/'
+
+        # POST new item and verify
+        test_data = dict(self.test_data_1)
+        test_data['station_type'] = dataformat_url
+        url = POST_and_assert_expected_response(self, BASE_URL + '/antenna_set/', test_data, 201, test_data)['url']
+        GET_and_assert_expected_response(self, url, 200, test_data)
+
+        # DELETE dependency and check it's gone
+        DELETE_and_assert_gone(self, dataformat_url)
+
+        # assert item gone
+        GET_and_assert_expected_response(self, url, 404, {})
+
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/SAS/LSMR/test/t_lsmrapp_specification_functional.py b/SAS/LSMR/test/t_lsmrapp_specification_functional.py
index 0af460e73fd636d493602a680c89d20986704847..fd1c32934768440b92d142fcaf22bc3082b2f5b8 100755
--- a/SAS/LSMR/test/t_lsmrapp_specification_functional.py
+++ b/SAS/LSMR/test/t_lsmrapp_specification_functional.py
@@ -55,7 +55,7 @@ def _call_API_and_assert_expected_response(self, url, call, data, expected_code,
         raise ValueError("The provided call '%s' is not a valid API method choice" % call)
 
     if response.status_code != expected_code:
-        print("!!! Unexpected: [%s] - %s %s: %s" % (self.id(), call, url, response.content))
+        print("!!! Unexpected: [%s] - %s %s: %s" % (self.id(), call, url, response.content.decode('utf-8').strip()))
     self.assertEqual(response.status_code, expected_code)
     r_dict = json.loads(response.content.decode('utf-8'))
     for item in expected_content.items():