diff --git a/app/controllers/v1/learning_objects/attachment_controller.rb b/app/controllers/v1/learning_objects/attachment_controller.rb
index 7309fc82b2790c02651bccaf064ce5b465387ed8..cc71c6d0f1cd146913c9fc0488eb9a5b003875e9 100644
--- a/app/controllers/v1/learning_objects/attachment_controller.rb
+++ b/app/controllers/v1/learning_objects/attachment_controller.rb
@@ -6,7 +6,7 @@ class V1::LearningObjects::AttachmentController < ApplicationController
   def destroy
     return render status: :not_found if @learning_object.nil? || @attachment.nil?
 
-    destroy_attachment_in_dspace(@attachment.id_dspace)
+    DeleteBitstreamWorker.perform_async(@attachment.id)
     @attachment.destroy
 
     render status: :ok
@@ -28,9 +28,4 @@ class V1::LearningObjects::AttachmentController < ApplicationController
 
     authorize(@learning_object, :destroy?)
   end
-
-  def destroy_attachment_in_dspace(id)
-    client = DspaceService.create_client
-    client.bitstreams.delete(id: id)
-  end
 end
diff --git a/app/controllers/v1/learning_objects/chunks_controller.rb b/app/controllers/v1/learning_objects/chunks_controller.rb
index cc89e025261b02a570b285affc9343c47958f038..a65e77f3d613c51e00a26e535ec677e0f9e651ff 100644
--- a/app/controllers/v1/learning_objects/chunks_controller.rb
+++ b/app/controllers/v1/learning_objects/chunks_controller.rb
@@ -13,16 +13,13 @@ class V1::LearningObjects::ChunksController < ApplicationController
 
     if last_chunk?
       combine_file!
-      post_file!
-
-      # TODO render new attachment ID
-      render  status: 200
-      return
+      attachment = post_file!
+      render json: attachment, status: :ok
+    else
+      render status: :ok
     end
-
-    render status: 200
   rescue
-    render status: 500
+    render status: :internal_server_error
   end
 
   private
@@ -34,17 +31,7 @@ class V1::LearningObjects::ChunksController < ApplicationController
 
   # Never trust parameters from the scary internet, only allow the white list through.
   def chunks_params
-    params.permit(
-			:id,
-			:file,
-			:_chunkNumber,
-			:_totalChunks,
-			:_chunkFilename,
-			:_chunkIdentifier,
-			:_chunkSize,
-			:_currentChunkSize,
-			:_totalSize
-		)
+    params.permit(:id, :file, :_chunkNumber, :_totalChunks, :_chunkFilename, :_chunkIdentifier, :_chunkSize, :_currentChunkSize, :_totalSize)
   end
 
   def post_file!
diff --git a/app/controllers/v1/learning_objects_controller.rb b/app/controllers/v1/learning_objects_controller.rb
index 787cffc2ee8a59f77bfc3f6d22a6c19e1c023a25..ad9935aa1361acecc8e1f0e33ee04d6cd9d4ed49 100644
--- a/app/controllers/v1/learning_objects_controller.rb
+++ b/app/controllers/v1/learning_objects_controller.rb
@@ -14,7 +14,7 @@ class V1::LearningObjectsController < ApplicationController
   before_action :set_learning_object, only: [:show, :update, :destroy, :subjecting, :unsubjecting, :add_stages, :remove_stages]
   before_action :set_new_learning_object, only: :index
   before_action :authorize!, except: [:create, :tagging, :untagging, :download]
-  before_action :set_paper_trail_whodunnit
+  before_action :set_paper_trail_whodunnit, except: [:index, :show]
 
   def index
     learning_objects = paginate LearningObject.includes(:tags, :publisher, :language, :license, :subjects, :educational_stages, :reviews)
diff --git a/app/services/learning_object_publisher.rb b/app/services/learning_object_publisher.rb
index a2ba1089ea51d7e405dafa32e0330e21e0727aa9..096eff5bb2173550bddfab410e9d9b183b01eabf 100644
--- a/app/services/learning_object_publisher.rb
+++ b/app/services/learning_object_publisher.rb
@@ -20,7 +20,9 @@ class LearningObjectPublisher
 
   # post *media_path* to *learning_object* on dspace
   def upload(learning_object, media_path)
-    DspaceUploadWorker.perform_async learning_object.id, media_path, learning_object.description
+    attachment = learning_object.attachments.create(name: File.basename(media_path))
+    DspaceUploadWorker.perform_async(learning_object.id, media_path, attachment.id, learning_object.description)
+    attachment
   end
 
   ## publish *learning_object*
@@ -29,7 +31,7 @@ class LearningObjectPublisher
     return true if learning_object.published?
 
     learning_object.state = LearningObject.states[:published]
-    learning_object.published_at = Time.now
+    learning_object.published_at = Time.current
     ThumbnailGenerateWorker.perform_async learning_object.id, learning_object.link if learning_object.link?
     learning_object.save
   end
diff --git a/app/workers/delete_bitstream_worker.rb b/app/workers/delete_bitstream_worker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b19d59654894af46f56166bd95dfab936862808f
--- /dev/null
+++ b/app/workers/delete_bitstream_worker.rb
@@ -0,0 +1,28 @@
+require_dependency 'dspace'
+
+class DeleteBitstreamWorker
+  include Sidekiq::Worker
+
+  def perform(attachment_id = nil)
+    attachment = LearningObject::Attachment.find(attachment_id)
+    return false if attachment.blank? || !wait_bitstream(attachment)
+
+    # Require dspace gem
+    Bundler.require(*Rails.groups)
+
+    DspaceService.create_client.bitstreams.delete(id: attachment.id_dspace)
+  end
+
+  private
+
+  def wait_bitstream(attachment)
+    if attachment.id_dspace.blank?
+      Timeout.timeout(60) do
+        sleep(1.0) while attachment.id_dspace.blank?
+      end
+    end
+    true
+  rescue Timeout::Error
+    false
+  end
+end
diff --git a/app/workers/dspace_upload_worker.rb b/app/workers/dspace_upload_worker.rb
index 5e27970055bfc9ff00e605bcc5b343ea5f47b53a..e7f64b155402897ef6ac04cdf5a293cbc03cefdf 100644
--- a/app/workers/dspace_upload_worker.rb
+++ b/app/workers/dspace_upload_worker.rb
@@ -1,24 +1,40 @@
+require_dependency 'dspace'
+
 class DspaceUploadWorker
   include Sidekiq::Worker
 
   @@dspace = nil
 
-  def perform(learning_object_id, media_path, description = nil)
+  def perform(learning_object_id, media_path, attachment_id = nil, description = nil)
     # find learning object
     learning_object = LearningObject.find learning_object_id
 
     return false if learning_object.blank?
 
+    # Require dspace gem
+    Bundler.require(*Rails.groups)
+
     # create attachment
     file = File.new(media_path, 'r')
     bitstream = dspace.items.add_bitstream(file, id: learning_object.id_dspace, name: File.basename(media_path), description: description)
-    attachment = learning_object.attachments.create map_bitstream2attachment(bitstream)
+    attachment = create_attachment(learning_object, bitstream, attachment_id)
 
     ThumbnailGenerateWorker.perform_async attachment.id, media_path
   end
 
   private
 
+  def create_attachment(learning_object, bitstream, attachment_id = nil)
+    unless attachment_id.nil?
+      attachment = learning_object.attachments.find(attachment_id)
+      unless attachment.nil?
+        attachment.update(map_bitstream2attachment(bitstream))
+        return attachment
+      end
+    end
+    learning_object.attachments.create map_bitstream2attachment(bitstream)
+  end
+
   def publisher
     @publisher ||= LearningObjectPublisher.new(dspace)
   end