diff --git a/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py b/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py
index 6c9c7b2eb71b72ed381db5a442d855118e085f26..c431ef0593401738f17ad8b5a2b05f0ffc372cb7 100644
--- a/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py
+++ b/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py
@@ -553,7 +553,7 @@ class Scheduler:
                 if do_schedule:
                     self.try_schedule_unit(best_B_candidate_for_gap.scheduling_unit, best_B_candidate_for_gap.start_time)
                 else:
-                    update_subtasks_start_times_for_scheduling_unit(best_B_candidate_for_gap.scheduling_unit, best_B_candidate_for_gap.start_time)
+                    update_subtasks_start_times_for_scheduling_unit(best_B_candidate_for_gap.scheduling_unit, best_B_candidate_for_gap.start_time, placed=True)
 
                 placed_units.append(best_B_candidate_for_gap.scheduling_unit)
 
@@ -568,6 +568,11 @@ class Scheduler:
         ''''''
         logger.info("Estimating mid-term schedule with lower_bound_start_time=%s ..." % lower_bound_start_time)
 
+        # mark the schedulable units that they are not 'placed' yet by the scheduler.
+        for scheduling_unit in get_dynamically_schedulable_scheduling_units():
+            scheduling_unit.placed = False
+            scheduling_unit.save()
+
         # use relatively coarser gridders for mid-term schedule. Just to get a rough idea.
         self.search_gridder = Gridder(grid_minutes=3*60)
         self.fine_gridder = Gridder(grid_minutes=15)
@@ -596,7 +601,7 @@ class Scheduler:
                     scheduling_unit = best_scored_scheduling_unit.scheduling_unit
                     start_time = round_to_second_precision(best_scored_scheduling_unit.start_time)
                     logger.info("mid-term schedule: next scheduling unit id=%s '%s' start_time=%s", scheduling_unit.id, scheduling_unit.name, start_time)
-                    update_subtasks_start_times_for_scheduling_unit(scheduling_unit, start_time)
+                    update_subtasks_start_times_for_scheduling_unit(scheduling_unit, start_time, placed=True)
 
                     self.log_schedule(log_level=logging.DEBUG)
 
@@ -800,7 +805,7 @@ class TMSSDynamicSchedulingMessageHandler(TMSSEventMessageHandler):
             scheduling_unit_blueprint = models.SchedulingUnitBlueprint.objects.get(id=id)
             at = get_at_constraint_timestamp(scheduling_unit_blueprint)
             if at is not None:
-                update_subtasks_start_times_for_scheduling_unit(scheduling_unit_blueprint, at)
+                update_subtasks_start_times_for_scheduling_unit(scheduling_unit_blueprint, at, placed=True)
         except:
             pass
         self.onSchedulingUnitBlueprintConstraintsRankOrQueueUpdated(id)
diff --git a/SAS/TMSS/backend/services/websocket/lib/websocket_service.py b/SAS/TMSS/backend/services/websocket/lib/websocket_service.py
index 3f58b2a4d21e7b49af6d9a09b078d8146898df09..1425234cea09a6774cdeb35a775b361de7cf8f68 100644
--- a/SAS/TMSS/backend/services/websocket/lib/websocket_service.py
+++ b/SAS/TMSS/backend/services/websocket/lib/websocket_service.py
@@ -177,6 +177,8 @@ class TMSSEventMessageHandlerForWebsocket(TMSSEventMessageHandler):
                     json_blob['object_details']['status_value'] = model_instance.status.value
                 if hasattr(model_instance, 'state'):
                     json_blob['object_details']['state_value'] = model_instance.state.value
+                if hasattr(model_instance, 'placed'):
+                    json_blob['object_details']['placed'] = model_instance.placed
             except Exception as e:
                 logger.error("Cannot get object details for %s: %s", json_blob, e)
 
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0042_schedulingunitblueprint_placed.py b/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0042_schedulingunitblueprint_placed.py
new file mode 100644
index 0000000000000000000000000000000000000000..fdfeb1733811a7329e1bf06c484571f2d2803763
--- /dev/null
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/migrations/0042_schedulingunitblueprint_placed.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.9 on 2022-12-23 13:45
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('tmssapp', '0041_dataproduct_constraint'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='schedulingunitblueprint',
+            name='placed',
+            field=models.BooleanField(db_index=True, default=False, help_text='Was this unit placed by the scheduler, or are the scheduled_start/stop_time just best guesses?'),
+        ),
+    ]
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
index f459e5a59f597f83b4d84384f2bc916867f2023d..8a85c22c7538558af78c893e5601eb702f5ccd20 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
@@ -1030,6 +1030,7 @@ class SchedulingUnitBlueprint(ProjectPropertyMixin, TemplateSchemaMixin, NamedCo
     results_accepted = BooleanField(default=None, null=True, help_text='boolean (default None) which indicates whether this unit was accepted as successful or not.')
     global_identifier = OneToOneField('SIPidentifier', null=False, editable=False, on_delete=PROTECT, help_text='The global unique identifier for LTA SIP.')
     path_to_project = 'draft__scheduling_set__project'
+    placed = BooleanField(default=False, db_index=True, null=False, help_text='Was this unit placed by the scheduler, or are the scheduled_start/stop_time just best guesses?')
 
     class Meta(NamedCommon.Meta):
         constraints = [CheckConstraint(check=Q(rank__gte=SchedulingUnitRank.HIGHEST.value) & Q(rank__lte=SchedulingUnitRank.LOWEST.value), name='schedulingunitblueprint_rank_range_constraint')]
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py
index 7443de570f6f67a8ce34c583e80549caa7bafff7..cd615925cf656df83c6aa3dbfd70b62fc153e6d6 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/serializers/specification.py
@@ -278,7 +278,7 @@ class SchedulingUnitBlueprintSerializer(DynamicRelationalHyperlinkedModelSeriali
     class Meta:
         model = models.SchedulingUnitBlueprint
         fields = '__all__'
-        read_only_fields = ['interrupts_telescope', 'unschedulable_reason', 'error_reason']
+        read_only_fields = ['interrupts_telescope', 'unschedulable_reason', 'error_reason', 'placed']
         extra_fields = ['task_blueprints', 'output_pinned', 'unschedulable_reason', 'error_reason']
         expandable_fields = {
             'specifications_template': 'lofar.sas.tmss.tmss.tmssapp.serializers.SchedulingUnitTemplateSerializer',
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
index 2a56682e91a32394af3418f3c7dc75de630f62e2..6a4891a87c2e13276033563c897b9bf929247316 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/subtasks.py
@@ -1113,7 +1113,7 @@ def schedule_subtask_and_update_successor_start_times(subtask: Subtask) -> Subta
     return scheduled_subtask
 
 
-def update_subtasks_start_times_for_scheduling_unit(scheduling_unit: SchedulingUnitBlueprint, start_time: datetime):
+def update_subtasks_start_times_for_scheduling_unit(scheduling_unit: SchedulingUnitBlueprint, start_time: datetime, placed: bool=None):
     with transaction.atomic():
         for task_blueprint in scheduling_unit.task_blueprints.all():
             defined_independend_subtasks = task_blueprint.subtasks.filter(state__value='defined').filter(inputs=None).all()
@@ -1123,8 +1123,13 @@ def update_subtasks_start_times_for_scheduling_unit(scheduling_unit: SchedulingU
                 else:
                     update_start_time_and_shift_successors_until_after_stop_time(subtask, start_time + subtask.task_blueprint.relative_start_time)
 
-    # update cached start/stop times
-    scheduling_unit.refresh_from_db()
+        # update cached start/stop times
+        scheduling_unit.refresh_from_db()
+
+        if placed is not None:
+            scheduling_unit.placed = placed
+            scheduling_unit.save()
+
     return scheduling_unit
 
 def update_start_time_and_shift_successors_until_after_stop_time(subtask: Subtask, start_time: datetime):
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py b/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py
index f2f6975264c2ce1139321d2417c588d0c121bb66..3bffbd9b999bc225b75ca086b0a621ec83b8bae5 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/tasks.py
@@ -631,6 +631,11 @@ def schedule_independent_subtasks_in_scheduling_unit_blueprint(scheduling_unit_b
         schedule_independent_subtasks_in_task_blueprint(task_blueprint, start_time=start_time+task_blueprint.relative_start_time)
 
     scheduling_unit_blueprint.refresh_from_db()
+
+    if not scheduling_unit_blueprint.placed:
+        scheduling_unit_blueprint.placed = True
+        scheduling_unit_blueprint.save()
+
     return scheduling_unit_blueprint