diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp
index dd8d83e10d5ff39475ceedd53fad879adf983a94..577fdc1948ad0b185b522bebb34d639c83b59285 100644
--- a/src/plugins/beautifier/abstractsettings.cpp
+++ b/src/plugins/beautifier/abstractsettings.cpp
@@ -41,11 +41,11 @@ namespace Internal {
 
 AbstractSettings::AbstractSettings(const QString &name, const QString &ending)
     : m_version(0)
-    , m_name(name)
     , m_ending(ending)
     , m_styleDir(Core::ICore::userResourcePath() + QLatin1Char('/')
                  + QLatin1String(Beautifier::Constants::SETTINGS_DIRNAME) + QLatin1Char('/')
-                 + m_name)
+                 + name)
+    , m_name(name)
 {
 }
 
@@ -97,7 +97,7 @@ void AbstractSettings::setStyle(const QString &key, const QString &value)
 void AbstractSettings::removeStyle(const QString &key)
 {
     m_styles.remove(key);
-    m_stylesToRemove << key + m_ending;
+    m_stylesToRemove << key;
 }
 
 void AbstractSettings::replaceStyle(const QString &oldKey, const QString &newKey,
@@ -178,18 +178,13 @@ void AbstractSettings::save()
     if (m_stylesToRemove.isEmpty() && m_styles.isEmpty())
         return;
 
-    if (!m_styleDir.exists()) {
-        const QString path = m_styleDir.absolutePath();
-        if (!(m_styleDir.mkpath(path)
-              && m_styleDir.cd(path))) {
-            BeautifierPlugin::showError(tr("Cannot save styles. %1 does not exist.").arg(path));
-            return;
-        }
+    // remove old files and possible subfolder
+    foreach (const QString &key, m_stylesToRemove) {
+        const QFileInfo fi(styleFileName(key));
+        QFile::remove(fi.absoluteFilePath());
+        if (fi.absoluteDir() != m_styleDir)
+            m_styleDir.rmdir(fi.absolutePath());
     }
-
-    // remove old files
-    foreach (const QString &file, m_stylesToRemove)
-        m_styleDir.remove(file);
     m_stylesToRemove.clear();
 
     QMap<QString, QString>::const_iterator iStyles = m_styles.constBegin();
@@ -200,7 +195,14 @@ void AbstractSettings::save()
             continue;
         }
 
-        Utils::FileSaver saver(styleFileName(iStyles.key()));
+        const QFileInfo fi(styleFileName(iStyles.key()));
+        if (!(m_styleDir.mkpath(fi.absolutePath()))) {
+            BeautifierPlugin::showError(tr("Cannot save styles. %1 does not exist.")
+                                        .arg(fi.absolutePath()));
+            continue;
+        }
+
+        Utils::FileSaver saver(fi.absoluteFilePath());
         if (saver.hasError()) {
             BeautifierPlugin::showError(tr("Cannot open file \"%1\": %2.")
                                         .arg(saver.fileName())
@@ -242,29 +244,10 @@ void AbstractSettings::read()
     s->endGroup();
     s->endGroup();
 
-    // Read styles
-    if (!m_styleDir.exists())
-        return;
-
-    m_stylesToRemove.clear();
     m_styles.clear();
-    const QStringList files
-            = m_styleDir.entryList(QStringList() << QLatin1Char('*') + m_ending,
-                                   QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
-    foreach (const QString &filename, files) {
-        // do not allow empty file names
-        if (filename == m_ending)
-            continue;
-
-        QFile file(m_styleDir.absoluteFilePath(filename));
-        if (file.open(QIODevice::ReadOnly)) {
-            m_styles.insert(filename.left(filename.length() - m_ending.length()),
-                            QString::fromLocal8Bit(file.readAll()));
-        }
-    }
-
     m_changedStyles.clear();
     m_stylesToRemove.clear();
+    readStyles();
 }
 
 void AbstractSettings::readDocumentation()
@@ -324,5 +307,26 @@ void AbstractSettings::readDocumentation()
     }
 }
 
+void AbstractSettings::readStyles()
+{
+    if (!m_styleDir.exists())
+        return;
+
+    const QStringList files
+            = m_styleDir.entryList(QStringList() << QLatin1Char('*') + m_ending,
+                                   QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
+    foreach (const QString &filename, files) {
+        // do not allow empty file names
+        if (filename == m_ending)
+            continue;
+
+        QFile file(m_styleDir.absoluteFilePath(filename));
+        if (file.open(QIODevice::ReadOnly)) {
+            m_styles.insert(filename.left(filename.length() - m_ending.length()),
+                            QString::fromLocal8Bit(file.readAll()));
+        }
+    }
+}
+
 } // namespace Internal
 } // namespace Beautifier
diff --git a/src/plugins/beautifier/abstractsettings.h b/src/plugins/beautifier/abstractsettings.h
index 88c1dce543e34e7683ec3472e98f0249b3b99501..186adf7522ec632473842282cbd947ca810b9332 100644
--- a/src/plugins/beautifier/abstractsettings.h
+++ b/src/plugins/beautifier/abstractsettings.h
@@ -59,7 +59,7 @@ public:
     void setStyle(const QString &key, const QString &value);
     void removeStyle(const QString &key);
     void replaceStyle(const QString &oldKey, const QString &newKey, const QString &value);
-    QString styleFileName(const QString &key) const;
+    virtual QString styleFileName(const QString &key) const;
 
     QString command() const;
     void setCommand(const QString &command);
@@ -73,13 +73,14 @@ protected:
     QMap<QString, QString> m_styles;
     QMap<QString, QVariant> m_settings;
     int m_version;
+    QString m_ending;
+    QDir m_styleDir;
 
     void readDocumentation();
+    virtual void readStyles();
 
 private:
     QString m_name;
-    QString m_ending;
-    QDir m_styleDir;
     QStringList m_stylesToRemove;
     QSet<QString> m_changedStyles;
     QString m_command;
diff --git a/src/plugins/beautifier/beautifierplugin.cpp b/src/plugins/beautifier/beautifierplugin.cpp
index dd1fb2c16f6338e9585d029c4602d0b1e0ebfefd..2483ecc9d621c40cf73b8c2eb748abc45b3495e2 100644
--- a/src/plugins/beautifier/beautifierplugin.cpp
+++ b/src/plugins/beautifier/beautifierplugin.cpp
@@ -119,6 +119,7 @@ FormatTask format(FormatTask task)
     case Command::PipeProcessing: {
         QProcess process;
         QStringList options = task.command.options();
+        options.replaceInStrings(QLatin1String("%filename"), QFileInfo(task.filePath).fileName());
         options.replaceInStrings(QLatin1String("%file"), task.filePath);
         process.start(executable, options);
         if (!process.waitForStarted(3000)) {
diff --git a/src/plugins/beautifier/clangformat/clangformat.cpp b/src/plugins/beautifier/clangformat/clangformat.cpp
index 800b3e4c184475211e8b5e40eae0bdd739935a0e..0e77d2c291884c06c898d138a9918178e6276dd2 100644
--- a/src/plugins/beautifier/clangformat/clangformat.cpp
+++ b/src/plugins/beautifier/clangformat/clangformat.cpp
@@ -132,23 +132,19 @@ Command ClangFormat::command(int offset, int length) const
 
     if (m_settings->usePredefinedStyle()) {
         command.addOption(QLatin1String("-style=") + m_settings->predefinedStyle());
+        command.addOption(QLatin1String("-assume-filename=%filename"));
     } else {
-        // The clang-format option file is YAML
-        const QStringList lines = m_settings->style(m_settings->customStyle())
-                .split(QLatin1Char('\n'), QString::SkipEmptyParts);
-        const QStringList options = Utils::filtered(lines, [](const QString &s) -> bool {
-            const QString option = s.trimmed();
-            return !(option.startsWith(QLatin1Char('#')) || option == QLatin1String("---"));
-        });
-        command.addOption(QLatin1String("-style={") + options.join(QLatin1String(", "))
-                          + QLatin1Char('}'));
+        command.addOption(QLatin1String("-style=file"));
+        const QString path =
+                QFileInfo(m_settings->styleFileName(m_settings->customStyle())).absolutePath();
+        command.addOption(QLatin1String("-assume-filename=") + path + QDir::separator()
+                          + QLatin1String("%filename"));
     }
 
     if (offset != -1) {
         command.addOption(QLatin1String("-offset=") + QString::number(offset));
         command.addOption(QLatin1String("-length=") + QString::number(length));
     }
-    command.addOption(QLatin1String("-assume-filename=%file"));
 
     return command;
 }
diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.cpp b/src/plugins/beautifier/clangformat/clangformatsettings.cpp
index bbc23e89631ad384e3f43c46aa76b49f5908bf38..aad5a4f6a02a0b4bf03280f9b76f3fe654c310b6 100644
--- a/src/plugins/beautifier/clangformat/clangformatsettings.cpp
+++ b/src/plugins/beautifier/clangformat/clangformatsettings.cpp
@@ -48,7 +48,6 @@ const char kFormatEntireFileFallback[] = "formatEntireFileFallback";
 ClangFormatSettings::ClangFormatSettings() :
     AbstractSettings(QLatin1String(Constants::ClangFormat::SETTINGS_NAME),
                      QLatin1String(".clang-format"))
-
 {
     setCommand(QLatin1String("clang-format"));
     m_settings.insert(QLatin1String(kUsePredefinedStyle), QVariant(true));
@@ -225,6 +224,21 @@ QStringList ClangFormatSettings::predefinedStyles() const
                          << QLatin1String("File");
 }
 
+QString ClangFormatSettings::styleFileName(const QString &key) const
+{
+    return m_styleDir.absolutePath() + QLatin1Char('/') + key + QLatin1Char('/') + m_ending;
+}
+
+void ClangFormatSettings::readStyles()
+{
+    const QStringList dirs = m_styleDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
+    for (const QString &dir : dirs) {
+        QFile file(m_styleDir.absoluteFilePath(dir + QLatin1Char('/') + m_ending));
+        if (file.open(QIODevice::ReadOnly))
+            m_styles.insert(dir, QString::fromLocal8Bit(file.readAll()));
+    }
+}
+
 } // namespace ClangFormat
 } // namespace Internal
 } // namespace Beautifier
diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.h b/src/plugins/beautifier/clangformat/clangformatsettings.h
index f73a6cc7fd909a43419e228ee898d19c29debfce..0211f1e5247d28b3d42c7f72073ff8bb9e02a1c0 100644
--- a/src/plugins/beautifier/clangformat/clangformatsettings.h
+++ b/src/plugins/beautifier/clangformat/clangformatsettings.h
@@ -57,6 +57,11 @@ public:
     void setFormatEntireFileFallback(bool formatEntireFileFallback);
 
     QStringList predefinedStyles() const;
+
+    QString styleFileName(const QString &key) const override;
+
+private:
+    void readStyles() override;
 };
 
 } // namespace ClangFormat