diff --git a/src/dm/DispatchManagerActions.cc b/src/dm/DispatchManagerActions.cc
index 26b36619bf..9e65a30835 100644
--- a/src/dm/DispatchManagerActions.cc
+++ b/src/dm/DispatchManagerActions.cc
@@ -768,11 +768,18 @@ int DispatchManager::finalize(
     string& error_str)
 {
     VirtualMachine * vm;
+    Host * host;
     ostringstream oss;
 
     VirtualMachine::VmState state;
+    bool is_public_host;
 
-    vm = vmpool->get(vid,true);
+    vm   = vmpool->get(vid,true);
+
+    host           = hpool->get(vm->get_hid(),true);
+    is_public_host = host->is_public_cloud();
+    host->unlock();
+    
 
     if ( vm == 0 )
     {
@@ -793,13 +800,29 @@ int DispatchManager::finalize(
             vm->get_requirements(cpu,mem,disk);
             hpool->del_capacity(vm->get_hid(), vm->get_oid(), cpu, mem, disk);
 
-            tm->trigger(TransferManager::EPILOG_DELETE,vid);
+            if (is_public_host)
+            {
+                vmm->trigger(VirtualMachineManager::CLEANUP,vid);
+            }
+            else
+            {
+                tm->trigger(TransferManager::EPILOG_DELETE,vid);
+            }
+
             finalize_cleanup(vm);
         break;
 
         case VirtualMachine::STOPPED:
         case VirtualMachine::UNDEPLOYED:
-            tm->trigger(TransferManager::EPILOG_DELETE_STOP,vid);
+            if (is_public_host)
+            {
+                vmm->trigger(VirtualMachineManager::CLEANUP,vid);
+            }
+            else
+            {
+                tm->trigger(TransferManager::EPILOG_DELETE,vid);
+            }
+
             finalize_cleanup(vm);
         break;
 
diff --git a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb
index 0c8547ec39..2b41cd0ca5 100644
--- a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb
+++ b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb
@@ -232,14 +232,23 @@ class VIClient
     # @return [Hash] in the form
     #   {dc_name [String] => ClusterComputeResources Names [Array - String]}
     ########################################################################
-    def hierarchy
+    def hierarchy(one_client=nil)
         vc_hosts = {}
 
         datacenters = get_entities(@root, 'Datacenter')
 
+        hpool = OpenNebula::HostPool.new((one_client||@one))
+        rc    = hpool.info
+
         datacenters.each { |dc|
             ccrs = get_entities(dc.hostFolder, 'ClusterComputeResource')
-            vc_hosts[dc.name] = ccrs.collect { |c| c.name }
+            vc_hosts[dc.name] = []
+            ccrs.each { |c|
+                puts c.name
+                if !hpool["HOST[NAME=\"c.name\"]"]
+                    vc_hosts[dc.name] << c.name
+                end
+              }
         }
 
         return vc_hosts