diff --git a/libvirt/src/libvirt.c b/libvirt-pmc/src/libvirt.c
index 028115c..cce2060 100644
--- a/libvirt/src/libvirt.c
+++ b/libvirt-pmc/src/libvirt.c
@@ -42,6 +42,8 @@
 #include "util.h"
 #include "memory.h"
 
+#include "pmc.h"
+
 #ifndef WITH_DRIVER_MODULES
 # ifdef WITH_TEST
 #  include "test/test_driver.h"
@@ -12779,3 +12781,112 @@ virDomainSnapshotFree(virDomainSnapshotPtr snapshot)
     }
     return 0;
 }
+
+/**
+ * virDomainMigratePMC:
+ * 
+ * @domain: a domain object
+ * @dconn: destination host (a connection object)
+ * @flags: flags
+ * @dname: (optional) rename domain to this at destination
+ * @uri: (optional) dest hostname/URI as seen from the source host
+ * @bandwidth: (optional) specify migration bandwidth limit in Mbps
+ * 
+ * Function load an object wich contains a pre migration checks list.
+ * Every pre migration check present in the list is executed, and return
+ * value is checked:
+ * 
+ *    ~ if check return CHECK_SUCCESS, check list scanning continue
+ *    ~ if check return CHECK_WARNING, function shows to user a menu'
+ *      where it can select the action (TERMINATE, CONTINUE)
+ *    ~ if check return CHECK_FAIL, function return value -1 and
+ *      migration process is terminated
+ * 
+ */
+
+int
+virDomainMigratePMC(virDomainPtr domain,
+                    virConnectPtr dconn,
+                    unsigned long flags,
+                    const char *dname,
+                    const char *uri,
+                    unsigned long bandwidth)
+{
+    virConnectPtr conn            = NULL;
+    virPMCCheckPtr check          = NULL;
+    virPMCCheckListPtr chklist    = NULL;
+    int i                         = -1;
+    int chkret                    = -1;
+    char sel                      = 0;
+    
+    DEBUG("domain=%p, dconn=%p, flags=%lu, dname=%s, uri=%s, bandwidth=%lu\n",
+          domain, dconn, flags, NULLSTR(dname), NULLSTR(uri), bandwidth);
+
+    virResetLastError();
+    
+    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+
+    conn = domain->conn;
+    
+    if (conn->flags & VIR_CONNECT_RO) {
+        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+    
+    if ( VIR_ALLOC(chklist) < 0 )
+    {
+        virReportOOMError();
+        return -1;
+    }
+    
+    /* load internal pre migration check list */
+    
+    chklist = virPMCGetList();
+    if ( !chklist )
+    {
+        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+    
+    /* execute all checks defined into the list */
+    
+    for ( i = 0 ; i < chklist->count ; i++ )
+    {
+        check = chklist->check[i];
+        if( check != NULL )
+        {
+            printf("Running check - %s\n",check->name);
+            
+            chkret = check->run(domain,dconn);
+            
+            switch(chkret)
+            {
+                case CHECK_SUCCESS:
+                    printf("\nCheck - %s: SUCCESS!\n",check->name);
+                    break;
+                case CHECK_FAIL:
+                    printf("\nCheck - %s: FAIL!\n",check->name);
+                    goto check_fail;
+                    break;
+                case CHECK_WARNING:
+                    printf("\nCheck - %s: WARNING!\n",check->name);
+                    if( (sel = warningMenu()) == TERMINATE )
+                        goto check_fail;
+                    break;
+            }
+        }
+    }
+    
+    return 0;
+
+check_fail:
+    return -1;
+
+error:
+    virDispatchError(conn);
+    return -1;
+}
