diff --git a/adminlib.php b/adminlib.php
index f4657ff88b3c334763ffca4feff4c02ee6a5be1c..77cf55b5e2a0e62160ee45e4cf4ea9771f2a94c8 100644
--- a/adminlib.php
+++ b/adminlib.php
@@ -639,7 +639,7 @@ class workflow_settings {
             }
             if (!empty($data->id)) {
                 $step = step_manager::get_step_instance($data->id);
-                if ($data->instancename) {
+                if (isset($data->instancename)) {
                     $step->instancename = $data->instancename;
                 }
             } else {
diff --git a/classes/local/manager/settings_manager.php b/classes/local/manager/settings_manager.php
index cda7a688629399723486043a3d341b82dbee64ff..2b6bf91e4c3192d72c3a784a7ea032301eb240f3 100644
--- a/classes/local/manager/settings_manager.php
+++ b/classes/local/manager/settings_manager.php
@@ -23,6 +23,7 @@
  */
 namespace tool_lifecycle\local\manager;
 
+use tool_lifecycle\local\entity\workflow;
 use tool_lifecycle\settings_type;
 
 defined('MOODLE_INTERNAL') || die();
@@ -63,8 +64,6 @@ class settings_manager {
         global $DB;
         self::validate_type($type);
 
-        // TODO before PR merges: Saveguard for changing settings
-
         if (!$data) {
             return;
         }
@@ -76,8 +75,12 @@ class settings_manager {
 
         if ($type == settings_type::TRIGGER) {
             $lib = lib_manager::get_trigger_lib($subpluginname);
+            $trigger = trigger_manager::get_instance($instanceid);
+            $wfeditable = workflow_manager::is_editable($trigger->workflowid);
         } else {
             $lib = lib_manager::get_step_lib($subpluginname);
+            $step = step_manager::get_step_instance($instanceid);
+            $wfeditable = workflow_manager::is_editable($step->workflowid);
         }
 
         $settingsfields = $lib->instance_settings();
@@ -85,6 +88,9 @@ class settings_manager {
             throw new \moodle_exception('id of the step instance has to be set!');
         }
         foreach ($settingsfields as $setting) {
+            if (!$wfeditable && !$setting->editable) {
+                continue;
+            }
             if (array_key_exists($setting->name, $data)) {
                 $value = $data[$setting->name];
                 // Needed for editor support.
@@ -107,8 +113,14 @@ class settings_manager {
                         'name' => $setting->name)
                 );
                 if ($record) {
-                    $record->value = $cleanedvalue;
-                    $DB->update_record('tool_lifecycle_settings', $record);
+                    if ($record->value != $cleanedvalue) {
+                        $oldvalue = $record->value;
+                        $record->value = $cleanedvalue;
+                        $DB->update_record('tool_lifecycle_settings', $record);
+                        if (!$wfeditable) {
+                            $lib->on_setting_changed($setting->name, $cleanedvalue, $oldvalue);
+                        }
+                    }
                 } else {
                     $newrecord = new \stdClass();
                     $newrecord->instanceid = $instanceid;
diff --git a/step/lib.php b/step/lib.php
index 86b20b7def0acb07b80dce00894cadae40a0106e..7209d1d3d5622341bab2ea2acf7e03cae4093282 100644
--- a/step/lib.php
+++ b/step/lib.php
@@ -107,6 +107,16 @@ abstract class libbase {
         return array();
     }
 
+    /**
+     * Is called when a setting is changed after a workflow is activated.
+     * @param string $settingname name of the setting
+     * @param mixed $newvalue the new value
+     * @param mixed $oldvalue the old value
+     */
+    public function on_setting_changed($settingname, $newvalue, $oldvalue) {
+
+    }
+
     /**
      * This method can be overriden, to add form elements to the form_step_instance.
      * It is called in definition().
diff --git a/trigger/lib.php b/trigger/lib.php
index 79e6f9e45337098677638f5c381810fee02a91cb..3c01ffb7bc98d55f078e24af7f95b3f4b213065c 100644
--- a/trigger/lib.php
+++ b/trigger/lib.php
@@ -53,6 +53,16 @@ abstract class base {
         return array();
     }
 
+    /**
+     * Is called when a setting is changed after a workflow is activated.
+     * @param string $settingname name of the setting
+     * @param mixed $newvalue the new value
+     * @param mixed $oldvalue the old value
+     */
+    public function on_setting_changed($settingname, $newvalue, $oldvalue) {
+
+    }
+
     /**
      * This method can be overriden, to add form elements to the form_step_instance.
      * It is called in definition().