diff -u -r opennebula-3.4.0.dist/include/DispatchManager.h opennebula-3.4.0/include/DispatchManager.h
--- opennebula-3.4.0.dist/include/DispatchManager.h	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/include/DispatchManager.h	2012-04-18 13:28:31.671304264 +0000
@@ -202,6 +202,15 @@
         int vid);
 
     /**
+     *  Moves a VM to RESCHED state
+     *    @param vid VirtualMachine identification
+     *    @return 0 on success, -1 if the VM does not exits or -2 if the VM is
+     *    in a wrong a state
+     */
+    int resched(
+        int vid);
+
+    /**
      *  Moves a VM to PENDING state preserving any resource (i.e. leases) and id
      *    @param vid VirtualMachine identification
      *    @return 0 on success, -1 if the VM does not exits or -2 if the VM is
@@ -267,6 +276,8 @@
 
     void  failed_action(int vid);
 
+    void  resched_action(int vid);
+
     void  resubmit_action(int vid);
 };
 
diff -u -r opennebula-3.4.0.dist/include/VirtualMachine.h opennebula-3.4.0/include/VirtualMachine.h
--- opennebula-3.4.0.dist/include/VirtualMachine.h	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/include/VirtualMachine.h	2012-04-18 13:28:31.671304264 +0000
@@ -55,7 +55,8 @@
         STOPPED   = 4,
         SUSPENDED = 5,
         DONE      = 6,
-        FAILED    = 7
+        FAILED    = 7,
+        RESCHED   = 8
     };
 
     /**
diff -u -r opennebula-3.4.0.dist/src/cli/one_helper/onevm_helper.rb opennebula-3.4.0/src/cli/one_helper/onevm_helper.rb
--- opennebula-3.4.0.dist/src/cli/one_helper/onevm_helper.rb	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/cli/one_helper/onevm_helper.rb	2012-04-18 13:29:57.211500431 +0000
@@ -85,7 +85,7 @@
             column :HOSTNAME, "Host where the VM is running", :size=>15 do |d|
                 if d['HISTORY_RECORDS'] && d['HISTORY_RECORDS']['HISTORY']
                     state_str = VirtualMachine::VM_STATE[d['STATE'].to_i]
-                    if %w{ACTIVE SUSPENDED}.include? state_str
+                    if %w{ACTIVE SUSPENDED RESCHED}.include? state_str
                         d['HISTORY_RECORDS']['HISTORY']['HOSTNAME']
                     end
                 end
diff -u -r opennebula-3.4.0.dist/src/cli/onevm opennebula-3.4.0/src/cli/onevm
--- opennebula-3.4.0.dist/src/cli/onevm	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/cli/onevm	2012-04-18 13:28:31.671304264 +0000
@@ -254,6 +254,18 @@
         end
     end
 
+    resched_desc = <<-EOT.unindent
+        Reschedules the VM.
+
+        States: RUNNING
+    EOT
+
+    command :resched, resched_desc, [:range,:vmid_list] do
+        helper.perform_actions(args[0],options,"rescheduling") do |vm|
+            vm.resched
+        end
+    end
+
     resubmit_desc = <<-EOT.unindent
         Resubmits the VM to PENDING state. This is intented for VMs stuck in a
         transient state. To re-deploy a fresh copy of the same VM, create a
diff -u -r opennebula-3.4.0.dist/src/dm/DispatchManagerActions.cc opennebula-3.4.0/src/dm/DispatchManagerActions.cc
--- opennebula-3.4.0.dist/src/dm/DispatchManagerActions.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/dm/DispatchManagerActions.cc	2012-04-18 13:28:31.671304264 +0000
@@ -134,7 +134,7 @@
     oss << "Live-migrating VM " << vid;
     NebulaLog::log("DiM",Log::DEBUG,oss);
 
-    if (vm->get_state()     == VirtualMachine::ACTIVE &&
+    if ((vm->get_state()    == VirtualMachine::ACTIVE || vm->get_state() == VirtualMachine::RESCHED) &&
         vm->get_lcm_state() == VirtualMachine::RUNNING )
     {
         Nebula&             nd  = Nebula::instance();
@@ -628,6 +628,7 @@
             vm->log("DiM", Log::INFO, "New VM state is DONE.");
         break;
 
+        case VirtualMachine::RESCHED:
         case VirtualMachine::ACTIVE:
             lcm->trigger(LifeCycleManager::DELETE,vid);
         break;
@@ -662,6 +663,12 @@
 
     switch (vm->get_state())
     {
+        case VirtualMachine::RESCHED:
+            NebulaLog::log("DiM",Log::ERROR,
+                "Cannot resubmit a rescheduled VM. Let it reschedule first");
+            rc = -2;
+        break;
+
         case VirtualMachine::SUSPENDED:
             NebulaLog::log("DiM",Log::ERROR,
                 "Cannot resubmit a suspended VM. Resume it first");
@@ -697,3 +704,48 @@
 
     return rc;
 }
+
+/* -------------------------------------------------------------------------- */
+/* -------------------------------------------------------------------------- */
+
+int DispatchManager::resched(
+    int vid)
+{
+    VirtualMachine *    vm;
+    ostringstream       oss;
+
+    vm = vmpool->get(vid,true);
+
+    if ( vm == 0 )
+    {
+        return -1;
+    }
+
+    oss << "Rescheduling VM " << vid;
+    NebulaLog::log("DiM",Log::DEBUG,oss);
+
+    if (vm->get_state()     == VirtualMachine::ACTIVE &&
+        vm->get_lcm_state() == VirtualMachine::RUNNING )
+    {
+        vm->set_state(VirtualMachine::RESCHED);
+        vmpool->update(vm);
+
+        vm->log("DiM", Log::INFO, "New VM state is RESCHED.");
+    }
+    else
+    {
+        goto error;
+    }
+
+    vm->unlock();
+
+    return 0;
+
+error:
+    oss.str("");
+    oss << "Could not reschedule VM " << vid << ", wrong state.";
+    NebulaLog::log("DiM",Log::ERROR,oss);
+
+    vm->unlock();
+    return -2;
+}
diff -u -r opennebula-3.4.0.dist/src/dm/DispatchManagerStates.cc opennebula-3.4.0/src/dm/DispatchManagerStates.cc
--- opennebula-3.4.0.dist/src/dm/DispatchManagerStates.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/dm/DispatchManagerStates.cc	2012-04-18 13:28:31.671304264 +0000
@@ -112,7 +112,7 @@
     lcm_state = vm->get_lcm_state();
     dm_state  = vm->get_state();
 
-    if ((dm_state == VirtualMachine::ACTIVE) &&
+    if ((dm_state == VirtualMachine::ACTIVE || dm_state == VirtualMachine::RESCHED) &&
           (lcm_state == VirtualMachine::EPILOG ||
            lcm_state == VirtualMachine::CANCEL ||
            lcm_state == VirtualMachine::CLEANUP ))
diff -u -r opennebula-3.4.0.dist/src/lcm/LifeCycleActions.cc opennebula-3.4.0/src/lcm/LifeCycleActions.cc
--- opennebula-3.4.0.dist/src/lcm/LifeCycleActions.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/lcm/LifeCycleActions.cc	2012-04-18 13:28:31.671304264 +0000
@@ -241,7 +241,7 @@
         return;
     }
 
-    if (vm->get_state() == VirtualMachine::ACTIVE &&
+    if ((vm->get_state() == VirtualMachine::ACTIVE || vm->get_state() == VirtualMachine::RESCHED) &&
         vm->get_lcm_state() == VirtualMachine::RUNNING)
     {
         Nebula&                 nd = Nebula::instance();
@@ -252,6 +252,8 @@
         //                   MIGRATE STATE
         //----------------------------------------------------
 
+        vm->set_state(VirtualMachine::ACTIVE);
+
         vm->set_state(VirtualMachine::MIGRATE);
 
         vmpool->update(vm);
diff -u -r opennebula-3.4.0.dist/src/oca/ruby/OpenNebula/VirtualMachine.rb opennebula-3.4.0/src/oca/ruby/OpenNebula/VirtualMachine.rb
--- opennebula-3.4.0.dist/src/oca/ruby/OpenNebula/VirtualMachine.rb	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/oca/ruby/OpenNebula/VirtualMachine.rb	2012-04-18 13:28:31.671304264 +0000
@@ -35,7 +35,7 @@
             :chmod    => "vm.chmod",
         }
 
-        VM_STATE=%w{INIT PENDING HOLD ACTIVE STOPPED SUSPENDED DONE FAILED}
+        VM_STATE=%w{INIT PENDING HOLD ACTIVE STOPPED SUSPENDED DONE FAILED RESCHED}
 
         LCM_STATE=%w{LCM_INIT PROLOG BOOT RUNNING MIGRATE SAVE_STOP SAVE_SUSPEND
             SAVE_MIGRATE PROLOG_MIGRATE PROLOG_RESUME EPILOG_STOP EPILOG
@@ -49,7 +49,8 @@
             "STOPPED"   => "stop",
             "SUSPENDED" => "susp",
             "DONE"      => "done",
-            "FAILED"    => "fail"
+            "FAILED"    => "fail",
+            "RESCHED"   => "resc"
         }
 
         SHORT_LCM_STATES={
@@ -189,6 +190,11 @@
             action('restart')
         end
 
+        # Reschedules a VM
+        def resched
+            action('resched')
+        end
+
         # Resubmits a VM to PENDING state
         def resubmit
             action('resubmit')
diff -u -r opennebula-3.4.0.dist/src/rm/RequestManagerPoolInfoFilter.cc opennebula-3.4.0/src/rm/RequestManagerPoolInfoFilter.cc
--- opennebula-3.4.0.dist/src/rm/RequestManagerPoolInfoFilter.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/rm/RequestManagerPoolInfoFilter.cc	2012-04-18 13:28:31.671304264 +0000
@@ -62,7 +62,7 @@
     ostringstream state_filter;
 
     if (( state < VirtualMachinePoolInfo::ALL_VM ) ||
-        ( state > VirtualMachine::FAILED ))
+        ( state > VirtualMachine::RESCHED ))
     {
         failure_response(XML_RPC_API,
                          request_error("Incorrect filter_flag, state",""),
diff -u -r opennebula-3.4.0.dist/src/rm/RequestManagerVirtualMachine.cc opennebula-3.4.0/src/rm/RequestManagerVirtualMachine.cc
--- opennebula-3.4.0.dist/src/rm/RequestManagerVirtualMachine.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/rm/RequestManagerVirtualMachine.cc	2012-04-18 13:28:31.671304264 +0000
@@ -225,6 +225,10 @@
     {
         rc = dm->finalize(id);
     }
+    else if (action == "resched")
+    {
+        rc = dm->resched(id);
+    }
     else if (action == "resubmit")
     {
         rc = dm->resubmit(id);
@@ -363,7 +367,7 @@
         return;
     }
 
-    if((vm->get_state()     != VirtualMachine::ACTIVE)  ||
+    if((vm->get_state()     != VirtualMachine::ACTIVE && vm->get_state() != VirtualMachine::RESCHED)  ||
        (vm->get_lcm_state() != VirtualMachine::RUNNING) ||
        (vm->hasPreviousHistory() && vm->get_previous_reason() == History::NONE))
     {
diff -u -r opennebula-3.4.0.dist/src/scheduler/include/Scheduler.h opennebula-3.4.0/src/scheduler/include/Scheduler.h
--- opennebula-3.4.0.dist/src/scheduler/include/Scheduler.h	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/include/Scheduler.h	2012-04-18 13:28:31.671304264 +0000
@@ -116,7 +116,7 @@
 
     virtual int schedule();
 
-    virtual int set_up_pools();
+    virtual int set_up_pools(int vmstate);
 
 private:
     Scheduler(Scheduler const&){};
diff -u -r opennebula-3.4.0.dist/src/scheduler/include/VirtualMachinePoolXML.h opennebula-3.4.0/src/scheduler/include/VirtualMachinePoolXML.h
--- opennebula-3.4.0.dist/src/scheduler/include/VirtualMachinePoolXML.h	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/include/VirtualMachinePoolXML.h	2012-04-18 13:28:31.671304264 +0000
@@ -34,7 +34,7 @@
 
     ~VirtualMachinePoolXML(){};
 
-    int set_up();
+    int set_up(int vmstate);
 
     /**
      *  Gets an object from the pool
@@ -59,6 +59,8 @@
     virtual void add_object(xmlNodePtr node);
 
     virtual int load_info(xmlrpc_c::value &result);
+
+    int state;
 };
 
 #endif /* VM_POOL_XML_H_ */
diff -u -r opennebula-3.4.0.dist/src/scheduler/include/VirtualMachineXML.h opennebula-3.4.0/src/scheduler/include/VirtualMachineXML.h
--- opennebula-3.4.0.dist/src/scheduler/include/VirtualMachineXML.h	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/include/VirtualMachineXML.h	2012-04-18 14:09:18.422958733 +0000
@@ -56,6 +56,11 @@
         return gid;
     };
 
+    int get_hid() const
+    {
+        return hid;
+    };
+
     /**
      *  Adds a new share to the map of suitable shares to start this VM
      *    @param  hid of the selected host
@@ -151,6 +156,8 @@
     int     uid;
     int     gid;
 
+    int     hid;
+
     int     memory;
     float   cpu;
 
diff -u -r opennebula-3.4.0.dist/src/scheduler/SConstruct opennebula-3.4.0/src/scheduler/SConstruct
--- opennebula-3.4.0.dist/src/scheduler/SConstruct	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/SConstruct	2012-04-18 13:28:31.671304264 +0000
@@ -23,6 +23,7 @@
 # Include dirs
 env.Append(CPPPATH=[
     cwd + '/include/',
+    cwd + '../../include/'
 ])
 
 # Library dirs
diff -u -r opennebula-3.4.0.dist/src/scheduler/src/pool/VirtualMachinePoolXML.cc opennebula-3.4.0/src/scheduler/src/pool/VirtualMachinePoolXML.cc
--- opennebula-3.4.0.dist/src/scheduler/src/pool/VirtualMachinePoolXML.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/src/pool/VirtualMachinePoolXML.cc	2012-04-18 13:28:31.671304264 +0000
@@ -15,17 +15,19 @@
 /* -------------------------------------------------------------------------- */
 
 #include "VirtualMachinePoolXML.h"
+#include "VirtualMachine.h"
 #include <stdexcept>
 
-int VirtualMachinePoolXML::set_up()
+int VirtualMachinePoolXML::set_up(int vmstate)
 {
     ostringstream   oss;
     int             rc;
+    state = vmstate;
     rc = PoolXML::set_up();
     if ( rc == 0 )
     {
         oss.str("");
-        oss << "Pending virtual machines :";
+        oss << "Pending virtual machines for state=" << state << ":";
 
         map<int,ObjectXML*>::iterator it;
 
@@ -72,7 +74,7 @@
                      -2,                            // VM from all users
                      -1,                            // start_id (none)
                      -1,                            // end_id (none)
-                     1);                            // in pending state
+                     state);                        // state
         return 0;
     }
     catch (exception const& e)
@@ -95,6 +97,7 @@
     ostringstream               oss;
     xmlrpc_c::value             deploy_result;
 
+
     oss.str("");
     oss << "Dispatching virtual machine " << vid
         << " to HID: " << hid;
@@ -103,14 +106,36 @@
 
     try
     {
-        client->call( client->get_endpoint(),           // serverUrl
-                      "one.vm.deploy",                  // methodName
-                      "sii",                            // arguments format
-                      &deploy_result,                   // resultP
-                      client->get_oneauth().c_str(),    // argument 0
-                      vid,                              // argument 1
-                      hid                               // argument 2
-                    );
+        switch (state)
+        {
+            case VirtualMachine::PENDING:
+                client->call( client->get_endpoint(),           // serverUrl
+                              "one.vm.deploy",                  // methodName
+                              "sii",                            // arguments format
+                              &deploy_result,                   // resultP
+                              client->get_oneauth().c_str(),    // argument 0
+                              vid,                              // argument 1
+                              hid);                             // argument 2
+            break;
+
+            case VirtualMachine::RESCHED: 
+                client->call( client->get_endpoint(),           // serverUrl
+                              "one.vm.migrate",                 // methodName
+                              "siib",                           // arguments format
+                              &deploy_result,                   // resultP
+                              client->get_oneauth().c_str(),    // argument 0
+                              vid,                              // argument 1
+                              hid,                              // argument 2
+                              true);                            // argument 3
+            break;
+
+            default:
+                oss.str("");
+                oss << "Error dispatching virtual machine: invalid state";
+                NebulaLog::log("VM",Log::ERROR,oss);
+                return -1;
+        }
+
     }
     catch (exception const& e)
     {
diff -u -r opennebula-3.4.0.dist/src/scheduler/src/pool/VirtualMachineXML.cc opennebula-3.4.0/src/scheduler/src/pool/VirtualMachineXML.cc
--- opennebula-3.4.0.dist/src/scheduler/src/pool/VirtualMachineXML.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/src/pool/VirtualMachineXML.cc	2012-04-18 14:05:00.502202090 +0000
@@ -26,6 +26,16 @@
     uid = atoi(((*this)["/VM/UID"])[0].c_str());
     gid = atoi(((*this)["/VM/GID"])[0].c_str());
 
+    result = ((*this)["/VM/HISTORY_RECORDS/HISTORY/HID"]);
+    if (result.size() > 0)
+    {
+        hid = atoi(result[0].c_str());
+    }
+    else
+    {
+        hid = -1;
+    }
+
     result = ((*this)["/VM/TEMPLATE/MEMORY"]);
     if (result.size() > 0)
     {
diff -u -r opennebula-3.4.0.dist/src/scheduler/src/sched/Scheduler.cc opennebula-3.4.0/src/scheduler/src/sched/Scheduler.cc
--- opennebula-3.4.0.dist/src/scheduler/src/sched/Scheduler.cc	2012-04-09 14:45:01.000000000 +0000
+++ opennebula-3.4.0/src/scheduler/src/sched/Scheduler.cc	2012-04-18 14:11:29.982143676 +0000
@@ -34,6 +34,7 @@
 #include "RankPolicy.h"
 #include "NebulaLog.h"
 #include "PoolObjectAuth.h"
+#include "VirtualMachine.h"
 
 using namespace std;
 
@@ -250,7 +251,7 @@
 /* -------------------------------------------------------------------------- */
 /* -------------------------------------------------------------------------- */
 
-int Scheduler::set_up_pools()
+int Scheduler::set_up_pools(int vmstate)
 {
     int                             rc;
     ostringstream                   oss;
@@ -272,7 +273,7 @@
     //Cleans the cache and get the pending VMs
     //--------------------------------------------------------------------------
 
-    rc = vmpool->set_up();
+    rc = vmpool->set_up(vmstate);
 
     if ( rc != 0 )
     {
@@ -329,7 +330,6 @@
     const map<int, ObjectXML*> pending_vms = vmpool->get_objects();
     const map<int, ObjectXML*> hosts = hpool->get_objects();
 
-
     for (vm_it=pending_vms.begin(); vm_it != pending_vms.end(); vm_it++)
     {
         vm = static_cast<VirtualMachineXML*>(vm_it->second);
@@ -415,6 +415,22 @@
                 NebulaLog::log("SCHED",Log::DEBUG,oss);
                 continue;
             }
+
+            // -----------------------------------------------------------------
+            // Check host placement (rescheduling)
+            // -----------------------------------------------------------------
+
+            if (vm->get_hid() == host->get_hid())
+            {
+                ostringstream oss;
+
+                oss << "Host " << host->get_hid() << 
+                    " filtered out. VM running on host.";
+
+                NebulaLog::log("SCHED",Log::DEBUG,oss);
+                continue;
+             }
+
             // -----------------------------------------------------------------
             // Check host capacity
             // -----------------------------------------------------------------
@@ -560,7 +576,23 @@
 
     if (name == ACTION_TIMER)
     {
-        rc = set_up_pools();
+        rc = set_up_pools(VirtualMachine::PENDING);
+
+        if ( rc != 0 )
+        {
+            return;
+        }
+
+        rc = schedule();
+
+        if ( rc != 0 )
+        {
+            return;
+        }
+
+        dispatch();
+
+        rc = set_up_pools(VirtualMachine::RESCHED);
 
         if ( rc != 0 )
         {
