diff --git a/hyrax/app/controllers/hyrax/admin/workflows_controller.rb b/hyrax/app/controllers/hyrax/admin/workflows_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..65180ff0e07e751b8aa4298b7be57ba1aa7ab7b4
--- /dev/null
+++ b/hyrax/app/controllers/hyrax/admin/workflows_controller.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+module Hyrax
+  # Presents a list of works in workflow
+  class Admin::WorkflowsController < ApplicationController
+    before_action :ensure_authorized!
+    with_themed_layout 'dashboard'
+    class_attribute :deposited_workflow_state_name
+
+    # Works that are in this workflow state (see workflow json template) are excluded from the
+    # status list and display in the "Published" tab
+    self.deposited_workflow_state_name = 'published'
+
+    def index
+      add_breadcrumb t(:'hyrax.controls.home'), root_path
+      add_breadcrumb t(:'hyrax.dashboard.breadcrumbs.admin'), hyrax.dashboard_path
+      add_breadcrumb t(:'hyrax.admin.sidebar.tasks'), '#'
+      add_breadcrumb t(:'hyrax.admin.sidebar.workflow_review'), request.path
+      assign_action_objects_params
+      doc = if params[:state] == 'published'
+              actionable_objects
+            elsif params[:state] == 'archived'
+              Hyrax::SolrQueryService.new(query: ["workflow_state_name_ssim:archived"]).accessible_by(ability: current_ability).solr_documents
+            elsif  params[:state] == 'tombstoned'
+              Hyrax::SolrQueryService.new(query: ["is_tombstoned_ssim:true"]).accessible_by(ability: current_ability).solr_documents
+            else
+              actionable_objects.select{|object| doc_under_review?(object.workflow_state) }
+            end
+
+      @response = WorkflowResponse.new(doc.to_a, doc.count, current_page, per_page, under_review?)
+    end
+
+    private
+
+    def ensure_authorized!
+      authorize! :review, :submissions
+    end
+
+    def actionable_objects
+      @actionable_objects ||=
+        Hyrax::Workflow::ActionableObjects.new(user: current_user)
+    end
+
+    def current_page
+      @page ||= params.fetch('page', 1).to_i
+    end
+
+    def per_page
+      @per_page ||= params.fetch('per_page', 10).to_i
+    end
+
+    def assign_action_objects_params
+      actionable_objects.page = current_page
+      actionable_objects.per_page = per_page
+      actionable_objects.workflow_state_filter = (under_review? ? '!' : '') + deposited_workflow_state_name
+    end
+
+    def under_review?
+      @under_review = params['state'] != 'published'
+    end
+
+    def doc_under_review?(workflow_state)
+      ["pending_review_from_publication_manager","changes_required_from_publication_manager","pending_review_from_crc_manager","changes_required_from_crc_manager","pending_review_from_group_manager","changes_required_from_group_manager"].include?(workflow_state)
+    end
+
+    class WorkflowResponse
+      attr_reader :total_count
+      attr_reader :current_page
+      attr_reader :per_page
+      attr_reader :docs
+      attr_reader :under_review
+
+      def initialize(docs, total_count, page, per_page, under_review)
+        @docs = docs
+        @total_count = total_count
+        @per_page = per_page.to_i
+        @current_page = page.to_i
+        @under_review = under_review
+      end
+
+      def total_pages
+        (total_count.to_f / per_page).ceil
+      end
+
+      def limit_value
+        docs.length
+      end
+
+      def viewing_under_review?
+        under_review
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb b/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb
index 1b676ca58145d413172043470cff7f6846144425..d4672000862333b9745ba2324983253e3391e5a4 100644
--- a/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb
+++ b/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb
@@ -17,7 +17,22 @@ module Hyrax
     # Use this line if you want to use a custom presenter
     self.show_presenter = Hyrax::Crc1280ExperimentPresenter
 
+    before_action :authorize_collection_access, only: :new
     before_action :check_tombstone,  only: [:show, :edit]
+    before_action :redirect_to_default_collection, only:[:new]
+
+    def authorize_collection_access
+      group_id = params[:add_works_to_collection]
+
+      if current_user.admin? || current_user.crc_manager_for?(group_id) || current_user.group_manager_for?(group_id) || current_user.group_member_for?(group_id)
+        return true
+      end
+
+      redirect_to root_path
+
+      flash[:alert] = 'You are not authorized to access this page.'
+    end
+
 
     def new
       @admin_set_options = available_admin_sets
@@ -43,6 +58,15 @@ module Hyrax
         end
       end
     end
+
+    def redirect_to_default_collection
+      return if params.has_key?(:add_works_to_collection)
+
+      collection = Hyrax::PcdmCollection.where(title: [ENV.fetch('CRC_1280_COLLECTION', "CRC 1280")]).first
+
+      flash[:notice] = "You need to navigate to your group to create an experiment."
+      redirect_to dashboard_collection_path(collection.id)
+    end
  
     def build_breadcrumbs
       return super if ['show', 'edit'].exclude?(action_name)
diff --git a/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb b/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb
index 0f8dd0914c1de7464901e108b3f75a9d8668591a..0611c960782a90ec8f326b3eef47487f1cb627dc 100644
--- a/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb
+++ b/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb
@@ -19,18 +19,25 @@ module Hyrax
         object
       end
 
+      def before_save_callbacks(object)
+        case object.class.name
+        when 'Crc1280Experiment', 'Dataset'
+          object = object.set_format_and_size
+        end
+
+        object = save_object!(object)
+        object
+      end
+
       def after_save_callbacks(object)
         case object.class.name
         when 'Crc1280Experiment'
           object.save_metadata_as_json_in_s3
-          object = object.set_format_and_size
           object.save_meta_json_in_s3
         when 'Dataset'
           object.save_metadata_as_json_in_s3
-          object = object.set_format_and_size
         end
 
-        object = save_object!(object)
         Hyrax.index_adapter.save(resource: object)
         object
       end
diff --git a/hyrax/app/indexers/crc1280_experiment_indexer.rb b/hyrax/app/indexers/crc1280_experiment_indexer.rb
index e1c13165224e43844dea8da705bd427fce4ed2b0..40335caddd3d81a7f347f33cb15cbc46324f9f6a 100644
--- a/hyrax/app/indexers/crc1280_experiment_indexer.rb
+++ b/hyrax/app/indexers/crc1280_experiment_indexer.rb
@@ -5,7 +5,7 @@
 class Crc1280ExperimentIndexer < Hyrax::Indexers::PcdmObjectIndexer(Crc1280Experiment)
   include Hyrax::Indexer(:basic_metadata)
   include Hyrax::Indexer(:crc1280_experiment)
-
+  include Hyrax::IndexesWorkflow
   # Custom indexers for crc dataset model
   include ComplexField::PersonIndexer
   include ComplexField::DateIndexer
diff --git a/hyrax/app/indexers/hyrax/indexes_workflow.rb b/hyrax/app/indexers/hyrax/indexes_workflow.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e63038ec7a8b0abe8d6d434d810d4b89139647a2
--- /dev/null
+++ b/hyrax/app/indexers/hyrax/indexes_workflow.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+module Hyrax
+  module IndexesWorkflow
+    mattr_accessor :suppressed_field, instance_writer: false do
+      "suppressed_bsi"
+    end
+
+    # Adds thumbnail indexing to the solr document
+    def to_solr
+      super.tap do |solr_doc|
+        index_workflow_fields(solr_doc)
+      end
+    end
+
+    # Write the workflow roles and state so one can see where the document moves to next
+    # @param [Hash] solr_document the solr document to add the field to
+    def index_workflow_fields(solr_document)
+      entity = Sipity::Entity(resource)
+      solr_document[workflow_role_field] = workflow_roles(entity).map { |role| "#{entity.workflow.permission_template.source_id}-#{entity.workflow.name}-#{role}" }
+      solr_document[workflow_state_name_field] = entity.workflow_state.name if entity.workflow_state
+    rescue Sipity::ConversionError
+      nil
+    end
+
+    def workflow_state_name_field
+      "workflow_state_name_ssim"
+    end
+
+    def workflow_role_field
+      "actionable_workflow_roles_ssim"
+    end
+
+    def workflow_roles(entity)
+      Hyrax::Workflow::PermissionQuery.scope_roles_associated_with_the_given_entity(entity: entity)
+    end
+  end
+end
\ No newline at end of file
diff --git a/hyrax/app/listeners/hyrax_listener.rb b/hyrax/app/listeners/hyrax_listener.rb
index 8bd42361131c981da4cacef061e350f528fd3dba..57dcb10e925631d937f77c128638144b6ebb3fdf 100644
--- a/hyrax/app/listeners/hyrax_listener.rb
+++ b/hyrax/app/listeners/hyrax_listener.rb
@@ -77,6 +77,8 @@ class HyraxListener
   def on_object_deposited(event)
     object = event[:object]
     object = after_create_callbacks(object)
+    object = before_save_callbacks(object)
+    object = after_save_callbacks(object)
     ContentDepositEventJob.perform_later(object, event[:user])
   end
 
@@ -88,6 +90,7 @@ class HyraxListener
   # end
 
   def on_object_metadata_updated(event)
+    object = before_save_callbacks(event[:object])
     object = after_save_callbacks(event[:object])
     ContentUpdateEventJob.perform_later(object, event[:user])
   end
diff --git a/hyrax/app/models/complex_modality.rb b/hyrax/app/models/complex_modality.rb
index c62215bbaf61a4198ae1a7047a6c01b954a56fef..404e0300621f13f52f178c0b23529079a992779b 100644
--- a/hyrax/app/models/complex_modality.rb
+++ b/hyrax/app/models/complex_modality.rb
@@ -18,7 +18,7 @@ class ComplexModality < ActiveRecord::Base
   validates :s3_folder_name, uniqueness: { scope: :parent_source_identifier, message: ->(object, data) { I18n.t('rdms.errors.complex_modality.title.uniqueness', value: object.s3_folder_name) } }, unless: -> { self.is_imported }
 
   before_validation :set_s3_folder_name
-  after_save :save_metadata_as_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work
+  after_save :save_metadata_as_json_in_s3, :save_meta_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work
   after_commit :fix_duplication_of_title, on: :create
   before_destroy :clear_s3_and_all_associated_objects
 
diff --git a/hyrax/app/models/complex_session.rb b/hyrax/app/models/complex_session.rb
index d6dc4e6eb2d395a662fee2797748332158f2a5f3..9ec385a883de875810466b62517da0701c670252 100644
--- a/hyrax/app/models/complex_session.rb
+++ b/hyrax/app/models/complex_session.rb
@@ -20,7 +20,7 @@ class ComplexSession < ActiveRecord::Base
   validates :s3_folder_name, uniqueness: { scope: :parent_source_identifier,  message: ->(object, data) { I18n.t('rdms.errors.complex_session.title.uniqueness', value: object.s3_folder_name) } }, unless: -> { self.is_imported }
 
   before_validation :set_s3_folder_name
-  after_save :save_metadata_as_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work
+  after_save :save_metadata_as_json_in_s3,:save_meta_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work
   after_commit :fix_duplication_of_title, on: :create
   before_destroy :clear_s3_and_all_associated_objects
 
diff --git a/hyrax/app/models/complex_subject.rb b/hyrax/app/models/complex_subject.rb
index d739b7a53d7d59d87dafc0a6b9647381ec54c222..a0256c48aa45836af4f05fe823aad81c16a1d1e3 100644
--- a/hyrax/app/models/complex_subject.rb
+++ b/hyrax/app/models/complex_subject.rb
@@ -20,7 +20,7 @@ class ComplexSubject < ActiveRecord::Base
 
   before_validation :set_s3_folder_name
 
-  after_save :save_metadata_as_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work
+  after_save :save_metadata_as_json_in_s3,:save_meta_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work
   after_commit :fix_duplication_of_title, on: :create
   before_destroy :clear_s3_and_all_associated_objects
 
diff --git a/hyrax/app/models/hyrax/pcdm_collection.rb b/hyrax/app/models/hyrax/pcdm_collection.rb
index eaca794e7a113406418bdc8de13871aebeda6cbf..41fe97e6d7ba10a2eb082684e2eb2f2690e093ce 100644
--- a/hyrax/app/models/hyrax/pcdm_collection.rb
+++ b/hyrax/app/models/hyrax/pcdm_collection.rb
@@ -95,10 +95,21 @@ module Hyrax
     end
 
     def parent_collections
-        Hyrax.custom_queries.find_parent_collections(resource: self)
+      Hyrax.custom_queries.find_parent_collections(resource: self)
      
     end
 
+    def self.where(**args)
+      query = <<-SQL
+        SELECT * FROM orm_resources
+        WHERE metadata @> ?
+        AND internal_resource = 'Hyrax::PcdmCollection';
+      SQL
+  
+      jsonb_query = args.to_json
+      Hyrax.query_service.run_query(query, jsonb_query)
+    end
+
     protected
 
     def visibility_writer
diff --git a/hyrax/app/services/hyrax/work_uploads_handler.rb b/hyrax/app/services/hyrax/work_uploads_handler.rb
index b7cad9711d3daff958ff749466194cbc344b550c..59b402630511687a9f1eb5f53dd5b90411a75398 100644
--- a/hyrax/app/services/hyrax/work_uploads_handler.rb
+++ b/hyrax/app/services/hyrax/work_uploads_handler.rb
@@ -158,7 +158,9 @@ module Hyrax
     end
 
     def work_attributes_for(file)
-      work_attributes = @file_set_params ? @file_set_params.find{ |hash| hash[:uploaded_file_id].to_s == file.id.to_s } : {}
+      return {} unless @file_set_params.present?
+
+      @file_set_params.find { |hash| hash[:uploaded_file_id].to_s == file.id.to_s } || {}
     end
 
     ##
diff --git a/hyrax/app/views/hyrax/admin/workflows/_tabs.html.erb b/hyrax/app/views/hyrax/admin/workflows/_tabs.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..a577115f11b29eae654446ca2a8bf983e4cdd186
--- /dev/null
+++ b/hyrax/app/views/hyrax/admin/workflows/_tabs.html.erb
@@ -0,0 +1,15 @@
+<ul class="nav nav-tabs" id="my_nav" role="list">
+  <li<%= ' class="nav-item"'.html_safe if @response.viewing_under_review? %>>
+      <%= link_to t('hyrax.admin.workflows.index.tabs.under_review'),
+        hyrax.admin_workflows_path(state: 'under-review'), class: "nav-link#{' active' if params[:state] == nil || params[:state] == 'under-review'}" %>
+  </li>
+  <li<%= ' class="nav-item"'.html_safe if !@response.viewing_under_review? %>>
+    <%= link_to t('hyrax.admin.workflows.index.tabs.published'), hyrax.admin_workflows_path(state: 'published'), class: "nav-link#{' active' if params[:state] == 'published'}" %>
+  </li>
+  <li<%= ' class="nav-item"'.html_safe if !@response.viewing_under_review? %>>
+    <%= link_to t('hyrax.admin.workflows.index.tabs.archived'), hyrax.admin_workflows_path(state: 'archived'), class: "nav-link#{' active' if params[:state] == 'archived'}" %>
+  </li>
+  <li<%= ' class="nav-item"'.html_safe if !@response.viewing_under_review? %>>
+    <%= link_to t('hyrax.admin.workflows.index.tabs.Tombstoned'), hyrax.admin_workflows_path(state: 'tombstoned'), class: "nav-link#{' active' if params[:state] == 'tombstoned'}" %>
+  </li>
+</ul>
\ No newline at end of file
diff --git a/hyrax/app/views/hyrax/datasets/show.html.erb b/hyrax/app/views/hyrax/datasets/show.html.erb
index aa7bfa2579ee30f0bd55c32af8370ba90641c64c..cf47cbd9788033482230db6775031c9113e06708 100644
--- a/hyrax/app/views/hyrax/datasets/show.html.erb
+++ b/hyrax/app/views/hyrax/datasets/show.html.erb
@@ -19,6 +19,7 @@
             </div>
           <% end %>
           <div class="col-sm-3 text-center">
+          <%= render 'download_all', presenter: @presenter %>
           <% if is_published?(@presenter) %>
             <%= render 'citations', presenter: @presenter %>
             <%= render 'social_media' %>
diff --git a/hyrax/config/locales/hyrax.en.yml b/hyrax/config/locales/hyrax.en.yml
index f161600ad7de05d342b0c10ffb127f57b94fb0cc..1f745545c7bdda774b657344e0968f32bf3e6cfd 100644
--- a/hyrax/config/locales/hyrax.en.yml
+++ b/hyrax/config/locales/hyrax.en.yml
@@ -272,6 +272,11 @@ en:
         headers:
           main: Work (dataset) Statistics
           total: "Total Works (datasets):"
+      workflows:
+        index:
+          tabs:
+            archived: Archived
+            tombstoned: Tombstoned
     base:
       form:
         batch_upload_hint: To create a separate work (dataset) for each of the files, go to