diff --git a/app/models/mixins/async_delete_mixin.rb b/app/models/mixins/async_delete_mixin.rb
index 5932aa0d33fa..aaf66315100a 100644
--- a/app/models/mixins/async_delete_mixin.rb
+++ b/app/models/mixins/async_delete_mixin.rb
@@ -1,13 +1,14 @@
 module AsyncDeleteMixin
   extend ActiveSupport::Concern
   included do
-    def self._queue_task(task, ids)
+    def self._queue_task(task, ids, deliver_on = nil)
       ids.each do |id|
         MiqQueue.put(
           :class_name  => name,
           :instance_id => id,
           :msg_timeout => 3600,
-          :method_name => task.to_s
+          :method_name => task.to_s,
+          :deliver_on  => deliver_on,
         )
       end
     end
diff --git a/app/models/provider.rb b/app/models/provider.rb
index 0715e4470181..6a449bd7278d 100644
--- a/app/models/provider.rb
+++ b/app/models/provider.rb
@@ -63,4 +63,22 @@ def refresh_ems(opts = {})
     end
     managers.flat_map { |manager| EmsRefresh.queue_refresh(manager, nil, opts) }
   end
+
+  def self.destroy_queue(ids)
+    find(Array.wrap(ids)).each(&:destroy_queue)
+  end
+
+  def destroy_queue
+    if managers.empty?
+      return destroy
+    end
+
+    if managers.where(:enabled => true).any?
+      _log.info("Queuing destroy of managers of provider: #{self.class.name} with id: #{id}")
+      managers.flat_map(&:destroy_queue)
+    end
+
+    _log.info("Queuing destroy of provider: #{self.class.name} with id: #{id}")
+    self.class._queue_task(:destroy_queue, id.to_miq_a, 15.seconds.from_now)
+  end
 end
diff --git a/spec/models/provider_spec.rb b/spec/models/provider_spec.rb
index c73c708d4416..28d467c95796 100644
--- a/spec/models/provider_spec.rb
+++ b/spec/models/provider_spec.rb
@@ -1,5 +1,5 @@
 describe Provider do
-  let(:provider) { described_class.new }
+  let(:provider) { FactoryGirl.create(:provider) }
 
   describe "#verify_ssl" do
     context "when non set" do
@@ -61,4 +61,32 @@
       expect(tenant.providers).to include(provider)
     end
   end
+
+  context "#destroy_queue" do
+    before do
+      allow(Time).to receive(:now).and_return(Time.zone.now)
+    end
+    it "destroy when has no managers" do
+      expect(provider).to receive(:destroy)
+      provider.destroy_queue
+    end
+
+    it "to destroy_queue its managers first" do
+      manager = FactoryGirl.create(:ext_management_system, :enabled => true)
+      provider.managers = [manager]
+      expect(manager).to receive(:destroy_queue)
+      expect(provider).not_to receive(:destroy)
+      expect(described_class).to receive(:_queue_task).with(:destroy_queue, provider.id.to_miq_a, 15.seconds.from_now)
+      provider.destroy_queue
+    end
+
+    it "doesn't destroy_queue its managers when they are disabled" do
+      manager = FactoryGirl.create(:ext_management_system, :enabled => false)
+      provider.managers = [manager]
+      expect(manager).not_to receive(:destroy_queue)
+      expect(provider).not_to receive(:destroy)
+      expect(described_class).to receive(:_queue_task).with(:destroy_queue, provider.id.to_miq_a, 15.seconds.from_now)
+      provider.destroy_queue
+    end
+  end
 end