diff --git a/app/controllers/v1/learning_objects_controller.rb b/app/controllers/v1/learning_objects_controller.rb
index b8e8acfb1c2ebb101b19b30ef4527698ec2fb2e0..bfed4f10705d4dac7e5f2ec4342f434a8a0a086a 100644
--- a/app/controllers/v1/learning_objects_controller.rb
+++ b/app/controllers/v1/learning_objects_controller.rb
@@ -78,7 +78,7 @@ class V1::LearningObjectsController < ApplicationController
       change_object_type_id = true
     end
     if @learning_object.update(learning_object_params)
-      learning_object_associations(@learning_object, change_object_type_id)
+      update_learning_object_associations(@learning_object, change_object_type_id)
       publisher = LearningObjectPublisher.new(DspaceService.create_client)
       publisher.update_dspace(@learning_object)
 
@@ -160,6 +160,16 @@ class V1::LearningObjectsController < ApplicationController
     end
   end
 
+  def update_learning_object_associations(learning_object, change_object_type_id=false)
+    current_user.update_tags(learning_object, with: extra_params[:tags].map { |t| t['name'] }) unless extra_params[:tags].nil?
+    learning_object.update_subjects(ids: extra_params[:subjects]) unless extra_params[:subjects].nil?
+    learning_object.update_educational_stages(ids: extra_params[:educational_stages]) unless extra_params[:educational_stages].nil?
+
+    if change_object_type_id
+      learning_object.link = nil
+    end
+  end
+
   def authorize!
     authorize @learning_object
   end
diff --git a/app/models/concerns/stageable.rb b/app/models/concerns/stageable.rb
index f6acd144a06106afa8583c0ae4d5d6853db26ab9..11c76968e9485d1bafd64e37eb5c5ac0a37aa9b6 100644
--- a/app/models/concerns/stageable.rb
+++ b/app/models/concerns/stageable.rb
@@ -45,4 +45,11 @@ module Stageable
       StageRelation.where(educational_stage: educational_stage, stageable: self).destroy_all
     end
   end
+
+  def update_educational_stages(ids: [])
+    stageable = self
+    old_ids = stageable.educational_stages.map {|es| es.id }
+    add_educational_stages(ids: ids - old_ids)
+    remove_educational_stages(ids: old_ids - ids)
+  end
 end
diff --git a/app/models/concerns/subjectable.rb b/app/models/concerns/subjectable.rb
index c18c23290924d0d33d32192fcd3e3072b8412e62..58b37ca250fbb340f1ae25e9711496bcc6d601a9 100644
--- a/app/models/concerns/subjectable.rb
+++ b/app/models/concerns/subjectable.rb
@@ -45,4 +45,11 @@ module Subjectable
       SubjectRelation.where(subject: subject, subjectable: self).destroy_all
     end
   end
+
+  def update_subjects(ids: [])
+    subjectable = self
+    old_ids = subjectable.subjects.map { |su| su.id }
+    add_subjects(ids: ids - old_ids)
+    remove_subjects(ids: old_ids - ids)
+  end
 end
diff --git a/app/models/concerns/tagger.rb b/app/models/concerns/tagger.rb
index 3127a067369d7ecd4bb9836c659e515e1790b6ae..6d9d3735a23ce7e10f35e9512217f08d684806f5 100644
--- a/app/models/concerns/tagger.rb
+++ b/app/models/concerns/tagger.rb
@@ -45,4 +45,10 @@ module Tagger
       Tagging.where(tagger: self, tag: tag, taggable: taggable).destroy_all
     end
   end
+
+  def update_tags(taggable, with: [])
+    old_tags = taggable.tags.map { |t| t.name }
+    tag(taggable, with: with - old_tags)
+    untag(taggable, with: old_tags - with)
+  end
 end