diff --git a/src/libs/utils/filenamevalidatinglineedit.cpp b/src/libs/utils/filenamevalidatinglineedit.cpp
index 57a0ed7a5f91577946807db122112559ffe75a0c..5b308f5ce4728eef5823a2c82be842180438e5e3 100644
--- a/src/libs/utils/filenamevalidatinglineedit.cpp
+++ b/src/libs/utils/filenamevalidatinglineedit.cpp
@@ -33,26 +33,65 @@
 
 #include "filenamevalidatinglineedit.h"
 
+#include <QtCore/QRegExp>
+#include <QtCore/QDebug>
+
 namespace Core {
 namespace Utils {
 
+// Naming a file like a device name will break on Windows, even if it is
+// "com1.txt". Since we are cross-platform, we generally disallow such file
+//  names.
+static const QRegExp &windowsDeviceNoSubDirPattern()
+{
+    static const QRegExp rc(QLatin1String("CON|AUX|PRN|COM1|COM2|LPT1|LPT2|NUL"),
+                      Qt::CaseInsensitive);
+    Q_ASSERT(rc.isValid());
+    return rc;
+}
+
+static const QRegExp &windowsDeviceSubDirPattern()
+{
+    static const QRegExp rc(QLatin1String(".*[/\\\\]CON|.*[/\\\\]AUX|.*[/\\\\]PRN|.*[/\\\\]COM1|.*[/\\\\]COM2|.*[/\\\\]LPT1|.*[/\\\\]LPT2|.*[/\\\\]NUL"),
+                            Qt::CaseInsensitive);
+    Q_ASSERT(rc.isValid());
+    return rc;
+}
+
+// ----------- FileNameValidatingLineEdit
 FileNameValidatingLineEdit::FileNameValidatingLineEdit(QWidget *parent) :
-    BaseValidatingLineEdit(parent)
+    BaseValidatingLineEdit(parent),
+    m_allowDirectories(false),
+    m_unused(0)
+{
+}
+
+bool FileNameValidatingLineEdit::allowDirectories() const
 {
+    return m_allowDirectories;
+}
 
+void FileNameValidatingLineEdit::setAllowDirectories(bool v)
+{
+    m_allowDirectories = v;
 }
 
 /* Validate a file base name, check for forbidden characters/strings. */
 
-static const char *notAllowedChars = "/?:&\\*\"|#%<> ";
-static const char *notAllowedSubStrings[] = {".."};
+#ifdef Q_OS_WIN
+#  define SLASHES "/\\"
+#else
+#  define SLASHES "/"
+#endif
 
-// Naming a file like a device name will break on Windows, even if it is
-// "com1.txt". Since we are cross-platform, we generally disallow such file
-//  names.
-static const char *notAllowedStrings[] = {"CON", "AUX", "PRN", "COM1", "COM2", "LPT1", "LPT2" };
+static const char *notAllowedCharsSubDir   = "?:&*\"|#%<> ";
+static const char *notAllowedCharsNoSubDir = "?:&*\"|#%<> "SLASHES;
 
-bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *errorMessage /* = 0*/)
+static const char *notAllowedSubStrings[] = {".."};
+
+bool FileNameValidatingLineEdit::validateFileName(const QString &name,
+                                                  bool allowDirectories,
+                                                  QString *errorMessage /* = 0*/)
 {
     if (name.isEmpty()) {
         if (errorMessage)
@@ -60,6 +99,7 @@ bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *
         return false;
     }
     // Characters
+    const char *notAllowedChars = allowDirectories ? notAllowedCharsSubDir : notAllowedCharsNoSubDir;
     for (const char *c = notAllowedChars; *c; c++)
         if (name.contains(QLatin1Char(*c))) {
             if (errorMessage)
@@ -76,22 +116,22 @@ bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *
             return false;
         }
     }
-    // Strings
-    const int notAllowedStringCount = sizeof(notAllowedStrings)/sizeof(const char *);
-    for (int s = 0; s < notAllowedStringCount; s++) {
-        const QLatin1String notAllowedString(notAllowedStrings[s]);
-        if (name == notAllowedString) {
-            if (errorMessage)
-                *errorMessage = tr("The name must not be '%1'.").arg(QString(notAllowedString));
-            return false;
-        }
+    // Windows devices
+    bool matchesWinDevice = windowsDeviceNoSubDirPattern().exactMatch(name);
+    if (!matchesWinDevice && allowDirectories)
+        matchesWinDevice = windowsDeviceSubDirPattern().exactMatch(name);
+    if (matchesWinDevice) {
+        if (errorMessage)
+            *errorMessage = tr("The name must not match that of a MS Windows device. (%1).").
+                            arg(windowsDeviceNoSubDirPattern().pattern().replace(QLatin1Char('|'), QLatin1Char(',')));
+        return false;
     }
     return true;
 }
 
 bool  FileNameValidatingLineEdit::validate(const QString &value, QString *errorMessage) const
 {
-    return validateFileName(value, errorMessage);
+    return validateFileName(value, m_allowDirectories, errorMessage);
 }
 
 } // namespace Utils
diff --git a/src/libs/utils/filenamevalidatinglineedit.h b/src/libs/utils/filenamevalidatinglineedit.h
index 5476e3cd5e936ec5c4084fe911526153dc092673..042a48fc5f19f5d1bd5a6df02aed5c29a3b0f2f2 100644
--- a/src/libs/utils/filenamevalidatinglineedit.h
+++ b/src/libs/utils/filenamevalidatinglineedit.h
@@ -43,14 +43,23 @@ class QWORKBENCH_UTILS_EXPORT FileNameValidatingLineEdit : public BaseValidating
 {
     Q_OBJECT
     Q_DISABLE_COPY(FileNameValidatingLineEdit)
-
+    Q_PROPERTY(bool allowDirectories READ allowDirectories WRITE setAllowDirectories)
 public:
     explicit FileNameValidatingLineEdit(QWidget *parent = 0);
 
-    static bool validateFileName(const QString &name, QString *errorMessage /* = 0*/);
+    static bool validateFileName(const QString &name,
+                                 bool allowDirectories = false,
+                                 QString *errorMessage = 0);
+
+    bool allowDirectories() const;
+    void setAllowDirectories(bool v);
 
 protected:
     virtual bool validate(const QString &value, QString *errorMessage) const;
+
+private:
+    bool m_allowDirectories;
+    void *m_unused;
 };
 
 } // namespace Utils
diff --git a/src/libs/utils/filewizardpage.cpp b/src/libs/utils/filewizardpage.cpp
index 8a12e4c0f3c98a016aa1deedd3093243840b61af..3e85b34d44b729142ff233b5f16f2d37cdc06e23 100644
--- a/src/libs/utils/filewizardpage.cpp
+++ b/src/libs/utils/filewizardpage.cpp
@@ -123,7 +123,7 @@ void FileWizardPage::slotActivated()
 
 bool FileWizardPage::validateBaseName(const QString &name, QString *errorMessage /* = 0*/)
 {
-    return FileNameValidatingLineEdit::validateFileName(name, errorMessage);
+    return FileNameValidatingLineEdit::validateFileName(name, false, errorMessage);
 }
 
 } // namespace Utils
diff --git a/src/libs/utils/newclasswidget.cpp b/src/libs/utils/newclasswidget.cpp
index df7d81e7b39c9b854fc53cef019de68935d897f0..b34ee40d4fe9469745edd98531560335b682f5ff 100644
--- a/src/libs/utils/newclasswidget.cpp
+++ b/src/libs/utils/newclasswidget.cpp
@@ -346,6 +346,21 @@ void NewClassWidget::setFormExtension(const QString &e)
     m_d->m_formExtension = fixSuffix(e);
 }
 
+bool NewClassWidget::allowDirectories() const
+{
+    return m_d->m_ui.headerFileLineEdit->allowDirectories();
+}
+
+void NewClassWidget::setAllowDirectories(bool v)
+{
+    // We keep all in sync
+    if (allowDirectories() != v) {
+        m_d->m_ui.sourceFileLineEdit->setAllowDirectories(v);
+        m_d->m_ui.headerFileLineEdit->setAllowDirectories(v);
+        m_d->m_ui.formFileLineEdit->setAllowDirectories(v);
+    }
+}
+
 void NewClassWidget::slotValidChanged()
 {
     const bool newValid = isValid();
diff --git a/src/libs/utils/newclasswidget.h b/src/libs/utils/newclasswidget.h
index 04c2aaf58a4f4143ba521955e85e474f87fc943e..40c850d28e94b55809cc91a3d74961a0b8d24bed 100644
--- a/src/libs/utils/newclasswidget.h
+++ b/src/libs/utils/newclasswidget.h
@@ -73,6 +73,7 @@ class QWORKBENCH_UTILS_EXPORT NewClassWidget : public QWidget
     Q_PROPERTY(QString formExtension READ formExtension WRITE setFormExtension DESIGNABLE true)
     Q_PROPERTY(bool formInputCheckable READ formInputCheckable WRITE setFormInputCheckable DESIGNABLE true)
     Q_PROPERTY(bool formInputChecked READ formInputChecked WRITE setFormInputChecked DESIGNABLE true)
+    Q_PROPERTY(bool allowDirectories READ allowDirectories WRITE setAllowDirectories)
     // Utility "USER" property for wizards containing file names.
     Q_PROPERTY(QStringList files READ files DESIGNABLE false USER true)
 public:
@@ -97,7 +98,7 @@ public:
     QString sourceExtension() const;
     QString headerExtension() const;
     QString formExtension() const;
-
+    bool allowDirectories() const;
 
     bool isValid(QString *error = 0) const;
 
@@ -125,6 +126,7 @@ public slots:
     void setSourceExtension(const QString &e);
     void setHeaderExtension(const QString &e);
     void setFormExtension(const QString &e);
+    void setAllowDirectories(bool v);
 
     /* Suggest a class name from the base class by stripping the leading 'Q'
      * character. This will happen automagically if the base class combo
diff --git a/src/libs/utils/projectnamevalidatinglineedit.cpp b/src/libs/utils/projectnamevalidatinglineedit.cpp
index df77af8e832a21e41746e99c6199bcaa5a9ca1fb..4160bc18792f8a24714fc35fe431415117f0e90c 100644
--- a/src/libs/utils/projectnamevalidatinglineedit.cpp
+++ b/src/libs/utils/projectnamevalidatinglineedit.cpp
@@ -45,7 +45,7 @@ ProjectNameValidatingLineEdit::ProjectNameValidatingLineEdit(QWidget *parent)
 bool ProjectNameValidatingLineEdit::validateProjectName(const QString &name, QString *errorMessage /* = 0*/)
 {
     // Validation is file name + checking for dots
-    if (!FileNameValidatingLineEdit::validateFileName(name, errorMessage))
+    if (!FileNameValidatingLineEdit::validateFileName(name, false, errorMessage))
         return false;
 
     // We don't want dots in the directory name for some legacy Windows
diff --git a/src/plugins/cppeditor/cppclasswizard.cpp b/src/plugins/cppeditor/cppclasswizard.cpp
index 6730f5b9ed9c388184b1d6040bb55cfe433b0bda..652eec535f18aa4221e7bb1055e780a14a569979 100644
--- a/src/plugins/cppeditor/cppclasswizard.cpp
+++ b/src/plugins/cppeditor/cppclasswizard.cpp
@@ -73,6 +73,7 @@ ClassNamePage::ClassNamePage(const QString &sourceSuffix,
     m_newClassWidget->setBaseClassEditable(true);
     m_newClassWidget->setFormInputVisible(false);
     m_newClassWidget->setNamespacesEnabled(true);
+    m_newClassWidget->setAllowDirectories(true);
 
     connect(m_newClassWidget, SIGNAL(validChanged()),
             this, SLOT(slotValidChanged()));
diff --git a/src/plugins/designer/cpp/formclasswizardpage.cpp b/src/plugins/designer/cpp/formclasswizardpage.cpp
index d076753374b666ef632c4a97a1f2394857993bae..eac7271b404dd48488d17e9ac56bc4d6b2541703 100644
--- a/src/plugins/designer/cpp/formclasswizardpage.cpp
+++ b/src/plugins/designer/cpp/formclasswizardpage.cpp
@@ -63,6 +63,7 @@ FormClassWizardPage::FormClassWizardPage(QWidget * parent) :
 
     m_ui->newClassWidget->setBaseClassInputVisible(false);
     m_ui->newClassWidget->setNamespacesEnabled(true);
+    m_ui->newClassWidget->setAllowDirectories(true);
 
     connect(m_ui->newClassWidget, SIGNAL(validChanged()), this, SLOT(slotValidChanged()));