diff --no-dereference -uNr opennebula-4.12.1.orig/src/vm/VirtualMachine.cc opennebula-4.12.1-addcpumodel/src/vm/VirtualMachine.cc
--- opennebula-4.12.1.orig/src/vm/VirtualMachine.cc	2015-04-06 13:22:34.000000000 -0500
+++ opennebula-4.12.1-addcpumodel/src/vm/VirtualMachine.cc	2015-08-11 02:41:48.078871060 -0500
@@ -308,6 +308,15 @@
     // Check for CPU, VCPU and MEMORY attributes
     // ------------------------------------------------------------------------
 
+    /* CPU Model */
+    user_obj_template->get("CPU_MODEL", value);
+    if ( value.empty() == false )
+    {
+        user_obj_template->erase("CPU_MODEL");
+        obj_template->add("CPU_MODEL", value);
+    }
+
+    /* Memory */
     if ( user_obj_template->get("MEMORY", ivalue) == false || ivalue <= 0 )
     {
         goto error_memory;
Binary files opennebula-4.12.1.orig/src/vmm/.LibVirtDriverKVM.cc.swp and opennebula-4.12.1-addcpumodel/src/vmm/.LibVirtDriverKVM.cc.swp differ
diff --no-dereference -uNr opennebula-4.12.1.orig/src/vmm/LibVirtDriverKVM.cc opennebula-4.12.1-addcpumodel/src/vmm/LibVirtDriverKVM.cc
--- opennebula-4.12.1.orig/src/vmm/LibVirtDriverKVM.cc	2015-04-06 13:22:34.000000000 -0500
+++ opennebula-4.12.1-addcpumodel/src/vmm/LibVirtDriverKVM.cc	2015-08-11 02:27:31.756936514 -0500
@@ -92,6 +92,7 @@
     int                         num;
     vector<const Attribute *>   attrs;
 
+    string  cpuModel;
     string  vcpu;
     float   cpu;
     int     memory;
@@ -219,6 +220,15 @@
     // CPU & Memory
     // ------------------------------------------------------------------------
 
+    vm->get_template_attribute("CPU_MODEL", cpuModel);
+    if (cpuModel.empty()) {
+        get_default("CPU_MODEL", cpuModel);
+    }
+
+    if (!cpuModel.empty()) {
+        file << "\t<qemu:commandline><qemu:arg value='-cpu'/><qemu:arg value=" << wrapper_attribute(cpuModel) << "/></qemu:commandline>" << endl;
+    }
+
     vm->get_template_attribute("VCPU", vcpu);
 
     if(vcpu.empty())
