Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 55673)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 55674)
@@ -189,5 +189,5 @@
                      "                            [--pae on|off]\n"
                      "                            [--longmode on|off]\n"
-                     "                            [--synthcpu on|off]\n"
+                     "                            [--cpuid-portability-level <0..3>\n"
                      "                            [--cpuidset <leaf> <eax> <ebx> <ecx> <edx>]\n"
                      "                            [--cpuidremove <leaf>]\n"
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 55673)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 55674)
@@ -558,5 +558,5 @@
     SHOW_BOOLEAN_METHOD(   machine, GetCPUProperty(CPUPropertyType_PAE, &f), "pae", "PAE");
     SHOW_BOOLEAN_METHOD(   machine, GetCPUProperty(CPUPropertyType_LongMode, &f), "longmode", "Long Mode");
-    SHOW_BOOLEAN_METHOD(   machine, GetCPUProperty(CPUPropertyType_Synthetic, &f), "synthcpu", "Synthetic CPU");
+    SHOW_ULONG_PROP(       machine, CPUIDPortabilityLevel, "cpuid-portability-level",   "CPUID Portability Level", "");
 
     if (details != VMINFO_MACHINEREADABLE)
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 55673)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 55674)
@@ -60,5 +60,5 @@
     MODIFYVM_PAE,
     MODIFYVM_LONGMODE,
-    MODIFYVM_SYNTHCPU,
+    MODIFYVM_CPUID_PORTABILITY,
     MODIFYVM_TFRESET,
     MODIFYVM_PARAVIRTPROVIDER,
@@ -225,5 +225,5 @@
     { "--pae",                      MODIFYVM_PAE,                       RTGETOPT_REQ_BOOL_ONOFF },
     { "--longmode",                 MODIFYVM_LONGMODE,                  RTGETOPT_REQ_BOOL_ONOFF },
-    { "--synthcpu",                 MODIFYVM_SYNTHCPU,                  RTGETOPT_REQ_BOOL_ONOFF },
+    { "--cpuid-portability-level",  MODIFYVM_CPUID_PORTABILITY,         RTGETOPT_REQ_UINT32 },
     { "--triplefaultreset",         MODIFYVM_TFRESET,                   RTGETOPT_REQ_BOOL_ONOFF },
     { "--paravirtprovider",         MODIFYVM_PARAVIRTPROVIDER,          RTGETOPT_REQ_STRING },
@@ -638,7 +638,7 @@
             }
 
-            case MODIFYVM_SYNTHCPU:
-            {
-                CHECK_ERROR(sessionMachine, SetCPUProperty(CPUPropertyType_Synthetic, ValueUnion.f));
+            case MODIFYVM_CPUID_PORTABILITY:
+            {
+                CHECK_ERROR(sessionMachine, COMSETTER(CPUIDPortabilityLevel)(ValueUnion.u32));
                 break;
             }
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 55673)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 55674)
@@ -945,5 +945,5 @@
   <enum
     name="CPUPropertyType"
-    uuid="52bc41f4-a279-45da-88ab-3a1d86fb73eb"
+    uuid="ed4094c1-d00e-483a-93e9-7163549ebd6e"
     >
     <desc>
@@ -961,11 +961,5 @@
       </desc>
     </const>
-    <const name="Synthetic"             value="2">
-      <desc>
-        This setting determines whether VirtualBox will expose a synthetic CPU to the guest to allow
-        teleporting between host systems that differ significantly.
-      </desc>
-    </const>
-    <const name="LongMode"             value="3">
+    <const name="LongMode"              value="2">
       <desc>
         This setting determines whether VirtualBox will advertise long mode
@@ -973,5 +967,5 @@
       </desc>
     </const>
-    <const name="TripleFaultReset"     value="4">
+    <const name="TripleFaultReset"      value="3">
       <desc>
         This setting determines whether a triple fault within a guest will trigger an internal
@@ -4176,5 +4170,5 @@
   <interface
     name="IMachine" extends="$unknown"
-    uuid="bfe5287a-5fbc-4ceb-9f0e-7fb317e78681"
+    uuid="701464d0-7284-42e9-b7b3-894cf31536b7"
     wsmap="managed"
     wrap-hint-server-addinterfaces="IInternalMachineControl"
@@ -4391,4 +4385,16 @@
         is 1 - 100. 100 (the default) implies no limit.
       </desc>
+    </attribute>
+
+    <attribute name="CPUIDPortabilityLevel" type="unsigned long">
+      <desc>Virtual CPUID portability level, the higher number the fewer newer
+        or vendor specific CPU feature is reported to the guest (via the CPUID
+        instruction).  The default level of zero (0) means that all virtualized
+        feautres supported by the host is pass thru to the guest.  While the
+        three (3) is currently the level supressing the most features.
+
+        Exactly which of the CPUID features are left out by the VMM at which
+        level is subject to change with each major version.
+        </desc>
     </attribute>
 
Index: /trunk/src/VBox/Main/include/MachineImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MachineImpl.h	(revision 55673)
+++ /trunk/src/VBox/Main/include/MachineImpl.h	(revision 55674)
@@ -284,9 +284,9 @@
         BOOL                mPAEEnabled;
         settings::Hardware::LongModeType mLongMode;
-        BOOL                mSyntheticCpu;
         BOOL                mTripleFaultReset;
         ULONG               mCPUCount;
         BOOL                mCPUHotPlugEnabled;
         ULONG               mCpuExecutionCap;
+        uint32_t            mCpuIdPortabilityLevel;
         BOOL                mAccelerate3DEnabled;
         BOOL                mHPETEnabled;
@@ -866,4 +866,6 @@
     HRESULT getCPUExecutionCap(ULONG *aCPUExecutionCap);
     HRESULT setCPUExecutionCap(ULONG aCPUExecutionCap);
+    HRESULT getCPUIDPortabilityLevel(ULONG *aCPUIDPortabilityLevel);
+    HRESULT setCPUIDPortabilityLevel(ULONG aCPUIDPortabilityLevel);
     HRESULT getMemorySize(ULONG *aMemorySize);
     HRESULT setMemorySize(ULONG aMemorySize);
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 55673)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 55674)
@@ -1108,8 +1108,8 @@
         }
 
-        /* Synthetic CPU */
-        BOOL fSyntheticCpu = false;
-        hrc = pMachine->GetCPUProperty(CPUPropertyType_Synthetic, &fSyntheticCpu);          H();
-        InsertConfigInteger(pCPUM, "SyntheticCpu", fSyntheticCpu);
+        /* CPU Portability level, */
+        ULONG uCpuIdPortabilityLevel = 0;
+        hrc = pMachine->COMGETTER(CPUIDPortabilityLevel)(&uCpuIdPortabilityLevel);            H();
+        InsertConfigInteger(pCPUM, "PortableCpuIdLevel", uCpuIdPortabilityLevel);
 
         /* Physical Address Extension (PAE) */
@@ -1117,5 +1117,4 @@
         hrc = pMachine->GetCPUProperty(CPUPropertyType_PAE, &fEnablePAE);                   H();
         InsertConfigInteger(pRoot, "EnablePAE", fEnablePAE);
-
 
         /*
Index: /trunk/src/VBox/Main/src-server/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 55673)
+++ /trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 55674)
@@ -193,7 +193,8 @@
 #endif
     mLongMode =  HC_ARCH_BITS == 64 ? settings::Hardware::LongMode_Enabled : settings::Hardware::LongMode_Disabled;
-    mSyntheticCpu = false;
     mTripleFaultReset = false;
     mHPETEnabled = false;
+    mCpuExecutionCap = 100; /* Maximum CPU execution cap by default. */
+    mCpuIdPortabilityLevel = 0;
 
     /* default boot order: floppy - DVD - HDD */
@@ -220,7 +221,4 @@
     mIOCacheEnabled = true;
     mIOCacheSize    = 5; /* 5MB */
-
-    /* Maximum CPU execution cap by default. */
-    mCpuExecutionCap = 100;
 }
 
@@ -1585,4 +1583,27 @@
 }
 
+HRESULT Machine::getCPUIDPortabilityLevel(ULONG *aCPUIDPortabilityLevel)
+{
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    *aCPUIDPortabilityLevel = mHWData->mCpuIdPortabilityLevel;
+
+    return S_OK;
+}
+
+HRESULT Machine::setCPUIDPortabilityLevel(ULONG aCPUIDPortabilityLevel)
+{
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    HRESULT hrc = i_checkStateDependency(MutableStateDep);
+    if (SUCCEEDED(hrc))
+    {
+        i_setModified(IsModified_MachineData);
+        mHWData.backup();
+        mHWData->mCpuIdPortabilityLevel = aCPUIDPortabilityLevel;
+    }
+    return hrc;
+}
+
 HRESULT Machine::getEmulatedUSBCardReaderEnabled(BOOL *aEmulatedUSBCardReaderEnabled)
 {
@@ -2139,8 +2160,4 @@
         case CPUPropertyType_PAE:
             *aValue = mHWData->mPAEEnabled;
-            break;
-
-        case CPUPropertyType_Synthetic:
-            *aValue = mHWData->mSyntheticCpu;
             break;
 
@@ -2201,10 +2218,4 @@
             mHWData.backup();
             mHWData->mPAEEnabled = !!aValue;
-            break;
-
-        case CPUPropertyType_Synthetic:
-            i_setModified(IsModified_MachineData);
-            mHWData.backup();
-            mHWData->mSyntheticCpu = !!aValue;
             break;
 
@@ -8799,5 +8810,4 @@
         mHWData->mHWVirtExForceEnabled        = data.fHardwareVirtForce;
         mHWData->mPAEEnabled                  = data.fPAE;
-        mHWData->mSyntheticCpu                = data.fSyntheticCpu;
         mHWData->mLongMode                    = data.enmLongMode;
         mHWData->mTripleFaultReset            = data.fTripleFaultReset;
@@ -8805,4 +8815,5 @@
         mHWData->mCPUHotPlugEnabled           = data.fCpuHotPlug;
         mHWData->mCpuExecutionCap             = data.ulCpuExecutionCap;
+        mHWData->mCpuIdPortabilityLevel       = data.uCpuIdPortabilityLevel;
 
         // cpu
@@ -10125,23 +10136,9 @@
         data.fPAE                   = !!mHWData->mPAEEnabled;
         data.enmLongMode            = mHWData->mLongMode;
-        data.fSyntheticCpu          = !!mHWData->mSyntheticCpu;
         data.fTripleFaultReset      = !!mHWData->mTripleFaultReset;
-
-        /* Standard and Extended CPUID leafs. */
-        data.llCpuIdLeafs.clear();
-        for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdStdLeafs); ++idx)
-        {
-            if (mHWData->mCpuIdStdLeafs[idx].ulId != UINT32_MAX)
-                data.llCpuIdLeafs.push_back(mHWData->mCpuIdStdLeafs[idx]);
-        }
-        for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdExtLeafs); ++idx)
-        {
-            if (mHWData->mCpuIdExtLeafs[idx].ulId != UINT32_MAX)
-                data.llCpuIdLeafs.push_back(mHWData->mCpuIdExtLeafs[idx]);
-        }
-
-        data.cCPUs             = mHWData->mCPUCount;
-        data.fCpuHotPlug       = !!mHWData->mCPUHotPlugEnabled;
-        data.ulCpuExecutionCap = mHWData->mCpuExecutionCap;
+        data.cCPUs                  = mHWData->mCPUCount;
+        data.fCpuHotPlug            = !!mHWData->mCPUHotPlugEnabled;
+        data.ulCpuExecutionCap      = mHWData->mCpuExecutionCap;
+        data.uCpuIdPortabilityLevel = mHWData->mCpuIdPortabilityLevel;
 
         data.llCpus.clear();
@@ -10158,4 +10155,13 @@
             }
         }
+
+        /* Standard and Extended CPUID leafs. */
+        data.llCpuIdLeafs.clear();
+        for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdStdLeafs); ++idx)
+            if (mHWData->mCpuIdStdLeafs[idx].ulId != UINT32_MAX)
+                data.llCpuIdLeafs.push_back(mHWData->mCpuIdStdLeafs[idx]);
+        for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdExtLeafs); ++idx)
+            if (mHWData->mCpuIdExtLeafs[idx].ulId != UINT32_MAX)
+                data.llCpuIdLeafs.push_back(mHWData->mCpuIdExtLeafs[idx]);
 
         // memory
Index: /trunk/src/VBox/Main/xml/Settings.cpp
===================================================================
--- /trunk/src/VBox/Main/xml/Settings.cpp	(revision 55673)
+++ /trunk/src/VBox/Main/xml/Settings.cpp	(revision 55674)
@@ -1963,5 +1963,4 @@
           fUnrestrictedExecution(true),
           fHardwareVirtForce(false),
-          fSyntheticCpu(false),
           fTripleFaultReset(false),
           fPAE(false),
@@ -1971,4 +1970,5 @@
           fHPETEnabled(false),
           ulCpuExecutionCap(100),
+          uCpuIdPortabilityLevel(0),
           ulMemorySizeMB((uint32_t)-1),
           graphicsControllerType(GraphicsControllerType_VBoxVGA),
@@ -2037,5 +2037,4 @@
                   && (fUnrestrictedExecution    == h.fUnrestrictedExecution)
                   && (fHardwareVirtForce        == h.fHardwareVirtForce)
-                  && (fSyntheticCpu             == h.fSyntheticCpu)
                   && (fPAE                      == h.fPAE)
                   && (enmLongMode               == h.enmLongMode)
@@ -2044,4 +2043,5 @@
                   && (fCpuHotPlug               == h.fCpuHotPlug)
                   && (ulCpuExecutionCap         == h.ulCpuExecutionCap)
+                  && (uCpuIdPortabilityLevel    == h.uCpuIdPortabilityLevel)
                   && (fHPETEnabled              == h.fHPETEnabled)
                   && (llCpus                    == h.llCpus)
@@ -2802,5 +2802,10 @@
 
             if ((pelmCPUChild = pelmHwChild->findChildElement("SyntheticCpu")))
-                pelmCPUChild->getAttributeValue("enabled", hw.fSyntheticCpu);
+            {
+                bool fSyntheticCpu = false;
+                pelmCPUChild->getAttributeValue("enabled", fSyntheticCpu);
+                hw.uCpuIdPortabilityLevel = fSyntheticCpu ? 1 : 0;
+            }
+            pelmCPUChild->getAttributeValue("CpuIdPortabilityLevel", hw.uCpuIdPortabilityLevel);
 
             if ((pelmCPUChild = pelmHwChild->findChildElement("TripleFaultReset")))
@@ -4095,6 +4100,4 @@
         pelmCPU->createChild("LongMode")->setAttribute("enabled", hw.enmLongMode == Hardware::LongMode_Enabled);
 
-    if (hw.fSyntheticCpu)
-        pelmCPU->createChild("SyntheticCpu")->setAttribute("enabled", hw.fSyntheticCpu);
     if (hw.fTripleFaultReset)
         pelmCPU->createChild("TripleFaultReset")->setAttribute("enabled", hw.fTripleFaultReset);
@@ -4102,4 +4105,6 @@
     if (hw.ulCpuExecutionCap != 100)
         pelmCPU->setAttribute("executionCap", hw.ulCpuExecutionCap);
+    if (hw.uCpuIdPortabilityLevel != 0)
+        pelmCPU->setAttribute("CpuIdPortabilityLevel", hw.uCpuIdPortabilityLevel);
 
     /* Always save this setting as we have changed the default in 4.0 (on for large memory 64-bit systems). */
@@ -5501,73 +5506,75 @@
 
         /*
-         * Check whether a paravirtualization provider other than "Legacy" is used, if so bump the version.
+         * Check simple configuration bits first, loopy stuff afterwards.
          */
-        if (hardwareMachine.paravirtProvider != ParavirtProvider_Legacy)
+        if (   hardwareMachine.paravirtProvider != ParavirtProvider_Legacy
+            || hardwareMachine.uCpuIdPortabilityLevel != 0)
+        {
             m->sv = SettingsVersion_v1_15;
-        else
-        {
-            /*
-             * Check whether the hotpluggable flag of all storage devices differs
-             * from the default for old settings.
-             * AHCI ports are hotpluggable by default every other device is not.
-             * Also check if there are USB storage controllers.
-             */
-            for (StorageControllersList::const_iterator it = storageMachine.llStorageControllers.begin();
-                 it != storageMachine.llStorageControllers.end();
-                 ++it)
-            {
-                const StorageController &sctl = *it;
-
-                if (sctl.controllerType == StorageControllerType_USB)
+            return;
+        }
+
+        /*
+         * Check whether the hotpluggable flag of all storage devices differs
+         * from the default for old settings.
+         * AHCI ports are hotpluggable by default every other device is not.
+         * Also check if there are USB storage controllers.
+         */
+        for (StorageControllersList::const_iterator it = storageMachine.llStorageControllers.begin();
+             it != storageMachine.llStorageControllers.end();
+             ++it)
+        {
+            const StorageController &sctl = *it;
+
+            if (sctl.controllerType == StorageControllerType_USB)
+            {
+                m->sv = SettingsVersion_v1_15;
+                return;
+            }
+
+            for (AttachedDevicesList::const_iterator it2 = sctl.llAttachedDevices.begin();
+                 it2 != sctl.llAttachedDevices.end();
+                 ++it2)
+            {
+                const AttachedDevice &att = *it2;
+
+                if (   (   att.fHotPluggable
+                        && sctl.controllerType != StorageControllerType_IntelAhci)
+                    || (   !att.fHotPluggable
+                        && sctl.controllerType == StorageControllerType_IntelAhci))
                 {
                     m->sv = SettingsVersion_v1_15;
                     return;
                 }
-
-                for (AttachedDevicesList::const_iterator it2 = sctl.llAttachedDevices.begin();
-                     it2 != sctl.llAttachedDevices.end();
-                     ++it2)
-                {
-                    const AttachedDevice &att = *it2;
-
-                    if (   (   att.fHotPluggable
-                            && sctl.controllerType != StorageControllerType_IntelAhci)
-                        || (   !att.fHotPluggable
-                            && sctl.controllerType == StorageControllerType_IntelAhci))
-                    {
-                        m->sv = SettingsVersion_v1_15;
-                        return;
-                    }
-                }
-            }
-
-            /*
-             * Check if there is an xHCI (USB3) USB controller.
-             */
-            for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin();
-                 it != hardwareMachine.usbSettings.llUSBControllers.end();
-                 ++it)
-            {
-                const USBController &ctrl = *it;
-                if (ctrl.enmType == USBControllerType_XHCI)
-                {
-                    m->sv = SettingsVersion_v1_15;
-                    return;
-                }
-            }
-
-            /*
-             * Check if any serial port uses the TCP backend.
-             */
-            for (SerialPortsList::const_iterator it = hardwareMachine.llSerialPorts.begin();
-                 it != hardwareMachine.llSerialPorts.end();
-                 ++it)
-            {
-                const SerialPort &port = *it;
-                if (port.portMode == PortMode_TCP)
-                {
-                    m->sv = SettingsVersion_v1_15;
-                    return;
-                }
+            }
+        }
+
+        /*
+         * Check if there is an xHCI (USB3) USB controller.
+         */
+        for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin();
+             it != hardwareMachine.usbSettings.llUSBControllers.end();
+             ++it)
+        {
+            const USBController &ctrl = *it;
+            if (ctrl.enmType == USBControllerType_XHCI)
+            {
+                m->sv = SettingsVersion_v1_15;
+                return;
+            }
+        }
+
+        /*
+         * Check if any serial port uses the TCP backend.
+         */
+        for (SerialPortsList::const_iterator it = hardwareMachine.llSerialPorts.begin();
+             it != hardwareMachine.llSerialPorts.end();
+             ++it)
+        {
+            const SerialPort &port = *it;
+            if (port.portMode == PortMode_TCP)
+            {
+                m->sv = SettingsVersion_v1_15;
+                return;
             }
         }
Index: /trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp	(revision 55673)
+++ /trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp	(revision 55674)
@@ -2103,5 +2103,4 @@
 typedef struct CPUMCPUIDCONFIG
 {
-    bool            fSyntheticCpu;
     bool            fNt4LeafLimit;
     bool            fInvariantTsc;
@@ -3511,13 +3510,4 @@
     int rc;
 
-    /** @cfgm{/CPUM/SyntheticCpu, boolean, false}
-     * Enables the Synthetic CPU.  The Vendor ID and Processor Name are
-     * completely overridden by VirtualBox custom strings.  Some
-     * CPUID information is withheld, like the cache info.
-     *
-     * This is obsoleted by PortableCpuIdLevel. */
-    rc = CFGMR3QueryBoolDef(pCpumCfg, "SyntheticCpu", &pConfig->fSyntheticCpu, false);
-    AssertRCReturn(rc, rc);
-
     /** @cfgm{/CPUM/PortableCpuIdLevel, 8-bit, 0, 3, 0}
      * When non-zero CPUID features that could cause portability issues will be
@@ -3525,5 +3515,5 @@
      * values should only be used when older CPUs are involved since it may
      * harm performance and maybe also cause problems with specific guests. */
-    rc = CFGMR3QueryU8Def(pCpumCfg, "PortableCpuIdLevel", &pVM->cpum.s.u8PortableCpuIdLevel, pConfig->fSyntheticCpu ? 1 : 0);
+    rc = CFGMR3QueryU8Def(pCpumCfg, "PortableCpuIdLevel", &pVM->cpum.s.u8PortableCpuIdLevel, 0);
     AssertLogRelRCReturn(rc, rc);
 
