Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp	(revision 73129)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp	(revision 73130)
@@ -303,10 +303,10 @@
 #ifdef VBOX_WITH_VIDEOHWACCEL
     /* Check if 2D video acceleration supported by the guest OS type: */
-    const QString strGuestOSTypeFamily = m_comGuestOSType.GetFamilyId();
+    const QString strGuestOSTypeFamily = m_comGuestOSType.isNotNull() ? m_comGuestOSType.GetFamilyId() : QString();
     m_f2DVideoAccelerationSupported = strGuestOSTypeFamily == "Windows";
 #endif
 #ifdef VBOX_WITH_CRHGSMI
     /* Check if WDDM mode supported by the guest OS type: */
-    const QString strGuestOSTypeId = m_comGuestOSType.GetId();
+    const QString strGuestOSTypeId = m_comGuestOSType.isNotNull() ? m_comGuestOSType.GetId() : QString();
     m_fWddmModeSupported = VBoxGlobal::isWddmCompatibleOsType(strGuestOSTypeId);
 #endif
@@ -1259,5 +1259,5 @@
     QStringList excludingOSList = QStringList()
         << "Other" << "DOS" << "Netware" << "L4" << "QNX" << "JRockitVE";
-    if (excludingOSList.contains(m_comGuestOSType.GetId()))
+    if (m_comGuestOSType.isNull() || excludingOSList.contains(m_comGuestOSType.GetId()))
         fResult = false;
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp	(revision 73129)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp	(revision 73130)
@@ -143,5 +143,7 @@
 {
     AssertPtrReturn(m_pNameAndSystemEditor, false);
-    return m_pNameAndSystemEditor->type().GetIs64Bit();
+    return   m_pNameAndSystemEditor->type().isNotNull()
+           ? m_pNameAndSystemEditor->type().GetIs64Bit()
+           : false;
 }
 
@@ -150,5 +152,5 @@
 {
     AssertPtrReturn(m_pNameAndSystemEditor, false);
-    return m_pNameAndSystemEditor->type().GetFamilyId() == "Windows";
+    return m_pNameAndSystemEditor->familyId() == "Windows";
 }
 #endif /* VBOX_WITH_VIDEOHWACCEL */
@@ -248,5 +250,5 @@
     AssertPtrReturnVoid(m_pNameAndSystemEditor);
     m_pNameAndSystemEditor->setName(oldGeneralData.m_strName);
-    m_pNameAndSystemEditor->setType(vboxGlobal().vmGuestOSType(oldGeneralData.m_strGuestOsTypeId));
+    m_pNameAndSystemEditor->setTypeId(oldGeneralData.m_strGuestOsTypeId);
 
     /* Load old 'Advanced' data from the cache: */
@@ -286,5 +288,5 @@
     AssertPtrReturnVoid(m_pNameAndSystemEditor);
     newGeneralData.m_strName = m_pNameAndSystemEditor->name();
-    newGeneralData.m_strGuestOsTypeId = m_pNameAndSystemEditor->type().GetId();
+    newGeneralData.m_strGuestOsTypeId = m_pNameAndSystemEditor->typeId();
 
     /* Gather new 'Advanced' data: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.cpp	(revision 73129)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.cpp	(revision 73130)
@@ -85,7 +85,95 @@
 }
 
+void UINameAndSystemEditor::setTypeId(const QString &strTypeId, const QString &strFamilyId /* = QString() */)
+{
+    AssertMsgReturnVoid(!strTypeId.isNull(), ("Null guest OS type ID"));
+
+    /* Save values: */
+    m_strTypeId = strTypeId;
+    m_strFamilyId = strFamilyId;
+
+    /* If family ID isn't null: */
+    if (!m_strFamilyId.isNull())
+    {
+        /* Serch for corresponding family ID index: */
+        int iFamilyIndex = m_pComboFamily->findData(m_strFamilyId, TypeID);
+
+        /* If that family ID isn't present, we have to add it: */
+        if (iFamilyIndex == -1)
+        {
+            /* Append family ID to corresponding combo: */
+            m_pComboFamily->addItem(m_strFamilyId);
+            m_pComboFamily->setItemData(m_pComboFamily->count() - 1, m_strFamilyId, TypeID);
+
+            /* Serch for corresponding family ID index again: */
+            iFamilyIndex = m_pComboFamily->findData(m_strFamilyId, TypeID);
+
+            /* Append the type cache: */
+            m_types[m_strFamilyId] = QList<UIGuestOSType>();
+            UIGuestOSType guiType;
+            guiType.typeId = m_strTypeId;
+            guiType.typeDescription = m_strTypeId;
+            guiType.is64bit = false;
+            m_types[m_strFamilyId] << guiType;
+        }
+
+        /* Choose if we have something to: */
+        if (iFamilyIndex != -1)
+        {
+            m_pComboFamily->setCurrentIndex(iFamilyIndex);
+            sltFamilyChanged(m_pComboFamily->currentIndex());
+        }
+    }
+
+    /* Serch for corresponding type ID index: */
+    int iTypeIndex = m_pComboType->findData(m_strTypeId, TypeID);
+
+    /* If that type ID isn't present, we have to add it: */
+    if (iTypeIndex == -1)
+    {
+        /* Serch for "Other" family ID index: */
+        m_strFamilyId = "Other";
+        int iFamilyIndex = m_pComboFamily->findData(m_strFamilyId, TypeID);
+
+        /* If that family ID is present: */
+        if (iFamilyIndex != -1)
+        {
+            /* Append the type cache: */
+            UIGuestOSType guiType;
+            guiType.typeId = m_strTypeId;
+            guiType.typeDescription = m_strTypeId;
+            guiType.is64bit = false;
+            m_types[m_strFamilyId] << guiType;
+
+            /* Choose required element: */
+            m_pComboFamily->setCurrentIndex(iFamilyIndex);
+            sltFamilyChanged(m_pComboFamily->currentIndex());
+        }
+
+        /* Serch for corresponding type ID index again: */
+        iTypeIndex = m_pComboType->findData(m_strTypeId, TypeID);
+    }
+
+    /* Choose if we have something to: */
+    if (iTypeIndex != -1)
+    {
+        m_pComboType->setCurrentIndex(iTypeIndex);
+        sltTypeChanged(m_pComboType->currentIndex());
+    }
+}
+
+QString UINameAndSystemEditor::typeId() const
+{
+    return m_strTypeId;
+}
+
+QString UINameAndSystemEditor::familyId() const
+{
+    return m_strFamilyId;
+}
+
 CGuestOSType UINameAndSystemEditor::type() const
 {
-    return m_enmType;
+    return vboxGlobal().vmGuestOSType(typeId(), familyId());
 }
 
@@ -99,19 +187,6 @@
         return;
 
-    /* Initialize variables: */
-    const QString strFamilyId = enmType.GetFamilyId();
-    const QString strTypeId = enmType.GetId();
-
-    /* Get/check family index: */
-    const int iFamilyIndex = m_pComboFamily->findData(strFamilyId, TypeID);
-    AssertMsg(iFamilyIndex != -1, ("Invalid family ID: '%s'", strFamilyId.toLatin1().constData()));
-    if (iFamilyIndex != -1)
-        m_pComboFamily->setCurrentIndex(iFamilyIndex);
-
-    /* Get/check type index: */
-    const int iTypeIndex = m_pComboType->findData(strTypeId, TypeID);
-    AssertMsg(iTypeIndex != -1, ("Invalid type ID: '%s'", strTypeId.toLatin1().constData()));
-    if (iTypeIndex != -1)
-        m_pComboType->setCurrentIndex(iTypeIndex);
+    /* Pass to function above: */
+    setTypeId(enmType.GetId(), enmType.GetFamilyId());
 }
 
@@ -141,12 +216,12 @@
 
     /* Populate combo-box with OS types related to currently selected family id: */
-    foreach (const CGuestOSType &comType, vboxGlobal().vmGuestOSTypeList(strFamilyId))
+    foreach (const UIGuestOSType &guiType, m_types.value(strFamilyId))
     {
         /* Skip 64bit OS types if hardware virtualization or long mode is not supported: */
-        if (comType.GetIs64Bit() && (!m_fSupportsHWVirtEx || !m_fSupportsLongMode))
+        if (guiType.is64bit && (!m_fSupportsHWVirtEx || !m_fSupportsLongMode))
             continue;
         const int iIndex = m_pComboType->count();
-        m_pComboType->insertItem(iIndex, comType.GetDescription());
-        m_pComboType->setItemData(iIndex, comType.GetId(), TypeID);
+        m_pComboType->insertItem(iIndex, guiType.typeDescription);
+        m_pComboType->setItemData(iIndex, guiType.typeId, TypeID);
     }
 
@@ -195,7 +270,4 @@
     const QString strTypeId = m_pComboType->itemData(iIndex, TypeID).toString();
     const QString strFamilyId = m_pComboFamily->itemData(m_pComboFamily->currentIndex(), TypeID).toString();
-
-    /* Save the new selected OS type: */
-    m_enmType = vboxGlobal().vmGuestOSType(strTypeId, strFamilyId);
 
     /* Update selected type pixmap: */
@@ -364,11 +436,26 @@
 void UINameAndSystemEditor::prepareFamilyCombo()
 {
-    /* Populate VM OS family combo: */
-    const QList<QString> &familyIDs = vboxGlobal().vmGuestOSFamilyIDs();
-    for (int i = 0; i < familyIDs.size(); ++i)
-    {
-        const QString &strFamilyId = familyIDs.at(i);
+    /* Acquire family IDs: */
+    m_familyIDs = vboxGlobal().vmGuestOSFamilyIDs();
+
+    /* For each known family ID: */
+    for (int i = 0; i < m_familyIDs.size(); ++i)
+    {
+        const QString &strFamilyId = m_familyIDs.at(i);
+
+        /* Append VM OS family combo: */
         m_pComboFamily->insertItem(i, vboxGlobal().vmGuestOSFamilyDescription(strFamilyId));
         m_pComboFamily->setItemData(i, strFamilyId, TypeID);
+
+        /* Fill in the type cache: */
+        m_types[strFamilyId] = QList<UIGuestOSType>();
+        foreach (const CGuestOSType &comType, vboxGlobal().vmGuestOSTypeList(strFamilyId))
+        {
+            UIGuestOSType guiType;
+            guiType.typeId = comType.GetId();
+            guiType.typeDescription = comType.GetDescription();
+            guiType.is64bit = comType.GetIs64Bit();
+            m_types[strFamilyId] << guiType;
+        }
     }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h	(revision 73129)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h	(revision 73130)
@@ -44,4 +44,12 @@
     Q_PROPERTY(CGuestOSType type READ type WRITE setType);
 
+    /** Simple struct representing CGuestOSType cache. */
+    struct UIGuestOSType
+    {
+        QString typeId;
+        QString typeDescription;
+        bool is64bit;
+    };
+
 signals:
 
@@ -66,4 +74,11 @@
     /** Defines the VM @a strName. */
     void setName(const QString &strName);
+
+    /** Defines the VM OS @a strTypeId and @a strFamilyId if passed. */
+    void setTypeId(const QString &strTypeId, const QString &strFamilyId = QString());
+    /** Returns the VM OS type ID. */
+    QString typeId() const;
+    /** Returns the VM OS family ID. */
+    QString familyId() const;
 
     /** Returns the VM OS type. */
@@ -104,6 +119,15 @@
     /** @} */
 
-    /** Holds the VM OS type. */
-    CGuestOSType            m_enmType;
+    /** Holds the current family ID list. */
+    QStringList  m_familyIDs;
+
+    /** Holds the current type cache. */
+    QMap<QString, QList<UIGuestOSType> >  m_types;
+
+    /** Holds the VM OS type ID. */
+    QString  m_strTypeId;
+    /** Holds the VM OS family ID. */
+    QString  m_strFamilyId;
+
     /** Holds the currently chosen OS type IDs on per-family basis. */
     QMap<QString, QString>  m_currentIds;
