diff --git a/hyrax/app/controllers/download_all_controller.rb b/hyrax/app/controllers/download_all_controller.rb
index 8abe6dd9c1651ac6323b4aecd4d998944cbe6729..6844e5e717065621b6ee3cbc092ce64d4c6c240a 100644
--- a/hyrax/app/controllers/download_all_controller.rb
+++ b/hyrax/app/controllers/download_all_controller.rb
@@ -33,7 +33,7 @@ class DownloadAllController < Hyrax::DownloadsController
       redirect_to format: :zip
     else
       # async job redirects to show
-      build_shell_file unless has_shell_file?
+      build_shell_file
       flash[:alert] = I18n.t('hyrax.notifications.preparing_download.message')
       redirect_to main_app.polymorphic_path(work)
     end
@@ -79,7 +79,8 @@ class DownloadAllController < Hyrax::DownloadsController
   def build_shell_file
     shell_file = shell_file_path
     cleanup_path(shell_file) if File.exist?(shell_file)
-    Hyrax::DownloadS3BucketJob.perform_later(current_user.id, work.id)
+
+    Hyrax::DownloadS3BucketJob.perform_later(current_user.id, work.id.to_s)
   end
 
   def build_zip_file(list_of_objects: nil)
diff --git a/hyrax/app/forms/dataset_form.rb b/hyrax/app/forms/dataset_form.rb
index 29f201cd60e57f2bb3a6ab4ba65943d49e3af434..8666143ff0163b1119f0c5d6b4cfd65316dbd16a 100644
--- a/hyrax/app/forms/dataset_form.rb
+++ b/hyrax/app/forms/dataset_form.rb
@@ -28,7 +28,11 @@ class DatasetForm < Hyrax::Forms::PcdmObjectForm(Dataset)
   end
 
   def tabs
-    %w[required description references funding dataset_thumbnail files relationships]
+    if self.persisted? && self.member_ids.any?
+      %w[required description references funding dataset_thumbnail files relationships]
+    else
+      %w[required description references funding files relationships]
+    end
   end
 
   def description_tab_terms
diff --git a/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb b/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb
index 795bda0c42c3d5c5d7447917454a090528006589..02d3c30c99d2f7d4bd9ac30293a98ff67e5b718d 100644
--- a/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb
+++ b/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb
@@ -42,6 +42,15 @@ module Hyrax
         object
       end
 
+      def after_file_metadata_updated_callbacks(file_set)
+        parent_work = file_set.parent_work
+        parent_work.set_format_and_size
+        parent_work = save_object!(parent_work)
+        Hyrax.index_adapter.save(resource: parent_work)
+
+        after_save_callbacks(parent_work)
+      end
+
       def after_destroy_callbacks(object)
         case object.class.name
         when 'Crc1280Experiment', 'Dataset'
diff --git a/hyrax/app/jobs/hyrax/download_s3_bucket_job.rb b/hyrax/app/jobs/hyrax/download_s3_bucket_job.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ee0864f039e4628788f4dda515f27da36f86bf57
--- /dev/null
+++ b/hyrax/app/jobs/hyrax/download_s3_bucket_job.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Hyrax
+  class DownloadS3BucketJob < ApplicationJob
+    include Rails.application.routes.url_helpers
+    include DownloadHelper
+    def perform(current_user_id, work_id)
+      @work ||= Hyrax.query_service.find_by(id: work_id)
+      current_user = ::User.find_by(id: current_user_id)
+
+      unless has_shell_file?
+        s3 = S3StorageService.new
+        s3.init_client
+        s3.prepare_shell_file(work_id, shell_file_path)
+      end
+
+      if @work.is_a?(Crc1280Experiment)
+        path = hyrax_crc1280_experiment_path(work_id)
+      else
+        path = hyrax_dataset_path(work_id)
+      end
+
+      subject = I18n.t('hyrax.notifications.download_ready.subject')
+      message = I18n.t('hyrax.notifications.download_ready.message',
+                  link:  (ActionController::Base.helpers.link_to work_id, path),
+                  download_link: (ActionController::Base.helpers.link_to :here, download_all_path(work_id, format: :sh)),
+                  user: current_user.user_key)
+
+      Hyrax::MessengerService.deliver(current_user, current_user, message, subject)
+    end
+    
+    def work
+      @work
+    end
+  end
+end
diff --git a/hyrax/app/listeners/hyrax_listener.rb b/hyrax/app/listeners/hyrax_listener.rb
index d2dc4169396cdf68188728314b5c79a86832a9a5..f2c7a661bbcb0d2c015dd4affb292b91f2e9abd4 100644
--- a/hyrax/app/listeners/hyrax_listener.rb
+++ b/hyrax/app/listeners/hyrax_listener.rb
@@ -41,8 +41,18 @@ class HyraxListener
   # def on_file_downloaded
   # end
 
-  # def on_file_metadata_updated
-  # end
+  def on_file_metadata_updated(event)
+    return unless event[:metadata].original_file?
+
+    file_set = Hyrax.query_service.find_by(id: event[:metadata].file_set_id)
+    after_file_metadata_updated_callbacks(file_set)
+    Hyrax.index_adapter.save(resource: file_set)
+  rescue Valkyrie::Persistence::ObjectNotFoundError => err
+    Hyrax.logger.warn "tried to index file with id #{event[:metadata].id} " \
+                      "in response to an event of type #{event.id} but " \
+                      "encountered an error #{err.message}. should this " \
+                      "object be in a FileSet #{event[:metadata]}"
+  end
 
   # def on_file_metadata_deleted
   # end
diff --git a/hyrax/app/models/concerns/external_services.rb b/hyrax/app/models/concerns/external_services.rb
index f0b6687a1359fb5d4474cc4caeed9f3ba8021779..1152fe93043913f372466e5e2992a39cb91005d5 100644
--- a/hyrax/app/models/concerns/external_services.rb
+++ b/hyrax/app/models/concerns/external_services.rb
@@ -33,7 +33,7 @@ module ExternalServices
       s3 = S3StorageService.new
       s3.init_client
       _list_of_objects, size = s3.list_all_objects
-      size
+
       [_list_of_objects.count, size]
     end