Index: trunk/src/VBox/Frontends/VirtualBox4/include/QIWidgetValidator.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox4/include/QIWidgetValidator.h	(revision 14312)
+++ trunk/src/VBox/Frontends/VirtualBox4/include/QIWidgetValidator.h	(revision 14339)
@@ -47,7 +47,10 @@
 
     void setCaption (const QString& aCaption) { mCaption = aCaption; }
-    QString caption() const { return mCaption; } 
+    QString caption() const { return mCaption; }
 
     QString warningText() const;
+
+    QString lastWarning() const { return mLastWarning; }
+    void setLastWarning (const QString &aLastWarning) { mLastWarning = aLastWarning; }
 
     void setOtherValid (bool aValid) { mOtherValid = aValid; }
@@ -65,4 +68,5 @@
 private:
 
+    QString mLastWarning;
     QString mCaption;
     QWidget *mWidget;
Index: trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSettingsDialog.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSettingsDialog.h	(revision 14312)
+++ trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSettingsDialog.h	(revision 14339)
@@ -62,4 +62,5 @@
     QString titleExtension() const;
 
+    void setError (const QString &aError);
     void setWarning (const QString &aWarning);
 
@@ -80,9 +81,15 @@
     /* Flags */
     bool mPolished;
+
+    /* Error & Warning stuff */
     bool mValid;
-
-    /* Warning Stuff */
-    VBoxWarnIconLabel *mWarnIconLabel;
+    bool mSilent;
+    QString mErrorHint;
+    QString mWarnHint;
+    QString mErrorString;
     QString mWarnString;
+    QPixmap mErrorIcon;
+    QPixmap mWarnIcon;
+    VBoxWarnIconLabel *mIconLabel;
 
     /* WhatsThis Stuff */
Index: trunk/src/VBox/Frontends/VirtualBox4/include/VBoxVMSettingsGeneral.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox4/include/VBoxVMSettingsGeneral.h	(revision 14312)
+++ trunk/src/VBox/Frontends/VirtualBox4/include/VBoxVMSettingsGeneral.h	(revision 14339)
@@ -46,4 +46,6 @@
     void putBackTo();
 
+    bool revalidate (QString &aWarning, QString &aTitle);
+
     void setOrderAfter (QWidget *aWidget);
 
Index: trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSettingsDialog.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSettingsDialog.cpp	(revision 14312)
+++ trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSettingsDialog.cpp	(revision 14339)
@@ -48,5 +48,6 @@
     , mPolished (false)
     , mValid (true)
-    , mWarnIconLabel (new VBoxWarnIconLabel (this))
+    , mSilent (true)
+    , mIconLabel (new VBoxWarnIconLabel (this))
     , mWhatsThisTimer (new QTimer (this))
     , mWhatsThisCandidate (0)
@@ -105,9 +106,8 @@
                                   mLbWhatsThis->fontMetrics().lineSpacing() * 4);
 
-    /* Setup warning stuff */
-    QIcon icon = vboxGlobal().standardIcon (QStyle::SP_MessageBoxWarning, this);
-    if (!icon.isNull())
-        mWarnIconLabel->setWarningPixmap (icon.pixmap (16, 16));
-    mButtonBox->addExtraWidget (mWarnIconLabel);
+    /* Setup error & warning stuff */
+    mButtonBox->addExtraWidget (mIconLabel);
+    mErrorIcon = vboxGlobal().standardIcon (QStyle::SP_MessageBoxCritical, this).pixmap (16, 16);
+    mWarnIcon = vboxGlobal().standardIcon (QStyle::SP_MessageBoxWarning, this).pixmap (16, 16);
 
     /* Set the default button */
@@ -130,5 +130,10 @@
     Ui::VBoxSettingsDialog::retranslateUi (this);
 
-    mWarnIconLabel->setWarningText (tr ("Invalid settings detected"));
+    mErrorHint = tr ("Invalid settings detected");
+    mWarnHint = tr ("Important warnings detected");
+    if (!mValid)
+        mIconLabel->setWarningText (mErrorHint);
+    else if (!mSilent)
+        mIconLabel->setWarningText (mWarnHint);
 
     QList<QIWidgetValidator*> vlist = findChildren<QIWidgetValidator*>();
@@ -145,6 +150,9 @@
 }
 
-void VBoxSettingsDialog::setWarning (const QString &aWarning)
-{
+void VBoxSettingsDialog::setError (const QString &aError)
+{
+    mErrorString = aError.isEmpty() ? QString::null :
+                   QString ("<font color=red>%1</font>").arg (aError);
+
     /* Not touching QILabel until dialog is polished otherwise
      * it can change its size to undefined */
@@ -152,7 +160,19 @@
         return;
 
-    mWarnString = aWarning;
-    if (!aWarning.isEmpty())
-        mWarnString = QString ("<font color=red>%1</font>").arg (aWarning);
+    if (!mErrorString.isEmpty())
+        mLbWhatsThis->setText (mErrorString);
+    else
+        updateWhatsThis (true);
+}
+
+void VBoxSettingsDialog::setWarning (const QString &aWarning)
+{
+    mWarnString = aWarning.isEmpty() ? QString::null :
+                  QString ("<font color=green>%1</font>").arg (aWarning);
+
+    /* Not touching QILabel until dialog is polished otherwise
+     * it can change its size to undefined */
+    if (!mPolished)
+        return;
 
     if (!mWarnString.isEmpty())
@@ -164,11 +184,11 @@
 void VBoxSettingsDialog::enableOk (const QIWidgetValidator*)
 {
-    setWarning (QString::null);
-    QString wvalWarning;
-
-    /* Detect the overall validity */
-    bool newValid = true;
-    {
-        QList<QIWidgetValidator*> vlist = findChildren<QIWidgetValidator*>();
+    QList <QIWidgetValidator*> vlist (findChildren <QIWidgetValidator*>());
+
+    /* Detect ERROR presence */
+    {
+        setError (QString::null);
+        QString wvalError;
+        bool newValid = true;
         foreach (QIWidgetValidator *wval, vlist)
         {
@@ -176,22 +196,52 @@
             if (!newValid)
             {
-                wvalWarning = wval->warningText();
+                wvalError = wval->warningText();
+                if (wvalError.isNull())
+                    wvalError = wval->lastWarning();
                 break;
             }
         }
-    }
-
-    if (mWarnString.isNull() && !wvalWarning.isNull())
-    {
-        /* Try to set the generic error message when invalid but
-         * no specific message is provided */
-        setWarning (wvalWarning);
-    }
-
-    if (mValid != newValid)
-    {
+
+        /* Try to set the generic error message when invalid
+         * but no specific message is provided */
+        if (mErrorString.isNull() && !wvalError.isNull())
+            setError (wvalError);
+
         mValid = newValid;
+        mIconLabel->setWarningPixmap (mErrorIcon);
+        mIconLabel->setWarningText (mErrorHint);
+        mIconLabel->setVisible (!mValid);
         mButtonBox->button (QDialogButtonBox::Ok)->setEnabled (mValid);
-        mWarnIconLabel->setVisible (!mValid);
+
+        if (!mValid) return;
+    }
+
+    /* Detect WARNING presence */
+    {
+        setWarning (QString::null);
+        QString wvalWarning;
+        bool newSilent = true;
+        foreach (QIWidgetValidator *wval, vlist)
+        {
+            if (!wval->warningText().isNull() ||
+                !wval->lastWarning().isNull())
+            {
+                newSilent = false;
+                wvalWarning = wval->warningText();
+                if (wvalWarning.isNull())
+                    wvalWarning = wval->lastWarning();
+                break;
+            }
+        }
+
+        /* Try to set the generic error message when invalid
+         * but no specific message is provided */
+        if (mWarnString.isNull() && !wvalWarning.isNull())
+            setWarning (wvalWarning);
+
+        mSilent = newSilent;
+        mIconLabel->setWarningPixmap (mWarnIcon);
+        mIconLabel->setWarningText (mWarnHint);
+        mIconLabel->setVisible (!mSilent);
     }
 }
@@ -266,5 +316,7 @@
     }
 
-    if (text.isEmpty() && !mWarnString.isEmpty())
+    if (text.isEmpty() && !mErrorString.isEmpty())
+        text = mErrorString;
+    else if (text.isEmpty() && !mWarnString.isEmpty())
         text = mWarnString;
     if (text.isEmpty())
Index: trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSettingsDialogSpecific.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSettingsDialogSpecific.cpp	(revision 14312)
+++ trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSettingsDialogSpecific.cpp	(revision 14339)
@@ -361,14 +361,13 @@
     bool valid = aWval->isOtherValid();
 
-    QString warningText;
-
-    VBoxSettingsPage *page = static_cast<VBoxSettingsPage*> (pg);
+    VBoxSettingsPage *page = static_cast <VBoxSettingsPage*> (pg);
     QString pageTitle = mSelector->itemTextByPage (page);
 
-    valid = page->revalidate (warningText, pageTitle);
-
-    if (!valid)
-        setWarning (tr ("%1 on the <b>%2</b> page.")
-                    .arg (warningText, pageTitle));
+    QString text;
+    valid = page->revalidate (text, pageTitle);
+    text = text.isEmpty() ? QString::null :
+           tr ("%1 on the <b>%2</b> page.").arg (text, pageTitle);
+    aWval->setLastWarning (text);
+    valid ? setWarning (text) : setError (text);
 
     aWval->setOtherValid (valid);
Index: trunk/src/VBox/Frontends/VirtualBox4/src/VBoxVMSettingsGeneral.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox4/src/VBoxVMSettingsGeneral.cpp	(revision 14312)
+++ trunk/src/VBox/Frontends/VirtualBox4/src/VBoxVMSettingsGeneral.cpp	(revision 14339)
@@ -370,4 +370,25 @@
 }
 
+bool VBoxVMSettingsGeneral::revalidate (QString &aWarning, QString & /* aTitle */)
+{
+    ulong fullSize = vboxGlobal().virtualBox().GetHost().GetMemorySize();
+
+    if (mSlRam->value() + mSlVideo->value() > 0.75 * fullSize)
+    {
+        aWarning = tr ("More than 75% of total system RAM allocated for "
+                       "virtual machine, this will provoke host system "
+                       "to work unstable. Error found");
+        return false;
+    } else
+    if (mSlRam->value() + mSlVideo->value() > 0.5 * fullSize)
+    {
+        aWarning = tr ("More than 50% of total system RAM allocated for "
+                       "virtual machine, this could provoke host system "
+                       "to work unstable. Use at your own risk. Problem found");
+        return true;
+    }
+    return true;
+}
+
 void VBoxVMSettingsGeneral::setOrderAfter (QWidget *aWidget)
 {
