diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index bdb684494f6913031c2c5cef672c1a27282d9513..109867e3cd3ee64ce3d2d4baa168017419aebf13 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -660,7 +660,7 @@ void CPPEditor::hideRenameNotification()
     Core::EditorManager::instance()->hideEditorInfoBar(QLatin1String("CppEditor.Rename"));
 }
 
-void CPPEditor::renameUsagesNow()
+void CPPEditor::renameUsagesNow(const QString &replacement)
 {
     const SemanticInfo info = m_lastSemanticInfo;
 
@@ -674,7 +674,7 @@ void CPPEditor::renameUsagesNow()
                                                                    this, SLOT(hideRenameNotification()));
             }
 
-            m_modelManager->renameUsages(canonicalSymbol, cs.context());
+            m_modelManager->renameUsages(canonicalSymbol, cs.context(), replacement);
         }
     }
 }
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index f1d0cdb5c19fde9ce3de0b896c505ee6b7911743..25a9f511eeea44a469374f71049c2282dacba182 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -192,7 +192,7 @@ public Q_SLOTS:
     void renameSymbolUnderCursor();
     void renameUsages();
     void findUsages();
-    void renameUsagesNow();
+    void renameUsagesNow(const QString &replacement = QString());
     void hideRenameNotification();
 
 protected:
diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 1f5286e5d47907b166d7dc567d689d4efa4aa9a7..fdc9d676ebcada2a5db19b501c5fd8da1e25aa19 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -53,6 +53,7 @@
 #include <Names.h>
 #include <Literals.h>
 
+#include <cppeditor/cppeditor.h>
 #include <cppeditor/cpprefactoringchanges.h>
 #include <cpptools/cpptoolsconstants.h>
 #include <cpptools/cppmodelmanagerinterface.h>
@@ -1576,6 +1577,75 @@ private:
     BinaryExpressionAST *binaryAST;
 };
 
+/*
+ * Turns "an_example_symbol" into "anExampleSymbol" and
+ * "AN_EXAMPLE_SYMBOL" into "AnExampleSymbol".
+ */
+class ToCamelCaseConverter : public CppQuickFixOperation
+{
+public:
+    ToCamelCaseConverter(TextEditor::BaseTextEditor *editor)
+        : CppQuickFixOperation(editor)
+    {}
+
+    virtual QString description() const
+    {
+        return QApplication::translate("CppTools::QuickFix", "Convert to Camel Case ...");
+    }
+
+    virtual int match(const QList<AST *> &path)
+    {
+        if (path.isEmpty())
+            return -1;
+
+        AST * const ast = path.last();
+        const Name *name = 0;
+        if (const NameAST * const nameAst = ast->asName()) {
+            if (nameAst->name && nameAst->name->asNameId())
+                name = nameAst->name;
+        } else if (const NamespaceAST * const namespaceAst = ast->asNamespace()) {
+            name = namespaceAst->symbol->name();
+        }
+
+        if (!name)
+            return -1;
+
+        m_name = QString::fromUtf8(name->identifier()->chars());
+        if (m_name.length() < 3)
+            return -1;
+        for (int i = 1; i < m_name.length() - 1; ++i) {
+            if (isConvertibleUnderscore(i))
+                return path.size() - 1;
+        }
+
+        return -1;
+    }
+
+    virtual void createChanges()
+    {
+        for (int i = 1; i < m_name.length(); ++i) {
+            QCharRef c = m_name[i];
+            if (c.isUpper()) {
+                c = c.toLower();
+            } else if (i < m_name.length() - 1
+                && isConvertibleUnderscore(i)) {
+                m_name.remove(i, 1);
+                m_name[i] = m_name.at(i).toUpper();
+            }
+        }
+        static_cast<CppEditor::Internal::CPPEditor*>(editor())->renameUsagesNow(m_name);
+    }
+
+private:
+    bool isConvertibleUnderscore(int pos) const
+    {
+        return m_name.at(pos) == QLatin1Char('_') && m_name.at(pos+1).isLetter()
+            && !(pos == 1 && m_name.at(0) == QLatin1Char('m'));
+    }
+
+    QString m_name;
+};
+
 } // end of anonymous namespace
 
 
@@ -1785,6 +1855,7 @@ QList<TextEditor::QuickFixOperation::Ptr> CppQuickFixFactory::quickFixOperations
     QSharedPointer<CompleteSwitchCaseStatement> completeSwitchCaseStatement(new CompleteSwitchCaseStatement(editor));
     QSharedPointer<FixForwardDeclarationOp> fixForwardDeclarationOp(new FixForwardDeclarationOp(editor));
     QSharedPointer<AddLocalDeclarationOp> addLocalDeclarationOp(new AddLocalDeclarationOp(editor));
+    QSharedPointer<ToCamelCaseConverter> toCamelCase(new ToCamelCaseConverter(editor));
     QSharedPointer<DeclFromDef> declFromDef(new DeclFromDef(editor));
 
     quickFixOperations.append(rewriteLogicalAndOp);
@@ -1803,6 +1874,7 @@ QList<TextEditor::QuickFixOperation::Ptr> CppQuickFixFactory::quickFixOperations
     quickFixOperations.append(completeSwitchCaseStatement);
     quickFixOperations.append(fixForwardDeclarationOp);
     quickFixOperations.append(addLocalDeclarationOp);
+    quickFixOperations.append(toCamelCase);
 
 #if 0
     quickFixOperations.append(declFromDef);
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index d785bf1097b6c495dd9c192939c248aae88d10d1..c3c36dcb2ec50d73f3f3c49bc4d1d83a1bc3d4bd 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -236,10 +236,12 @@ void CppFindReferences::findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::L
     findAll_helper(symbol, context);
 }
 
-void CppFindReferences::renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context)
+void CppFindReferences::renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context,
+                                     const QString &replacement)
 {
     if (const Identifier *id = symbol->identifier()) {
-        const QString textToReplace = QString::fromUtf8(id->chars(), id->size());
+        const QString textToReplace = replacement.isEmpty()
+                ? QString::fromUtf8(id->chars(), id->size()) : replacement;
 
         Find::SearchResult *search = _resultWindow->startNewSearch(Find::SearchResultWindow::SearchAndReplace);
         _resultWindow->setTextToReplace(textToReplace);
diff --git a/src/plugins/cpptools/cppfindreferences.h b/src/plugins/cpptools/cppfindreferences.h
index c3f1bd60f5783bb3cf545def312654b424eec13d..07ad710e4b26c737d078842ef786e7176354575e 100644
--- a/src/plugins/cpptools/cppfindreferences.h
+++ b/src/plugins/cpptools/cppfindreferences.h
@@ -66,7 +66,8 @@ Q_SIGNALS:
 
 public:
     void findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
-    void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
+    void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context,
+                      const QString &replacement = QString());
 
     void findMacroUses(const CPlusPlus::Macro &macro);
 
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 486eabb51f028eb93ef74973a86dc37c14cf0723..fa7eb0d360c84f5f615e2bac5f39940d40560a99 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -794,10 +794,11 @@ void CppModelManager::findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::Loo
         m_findReferences->findUsages(symbol, context);
 }
 
-void CppModelManager::renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context)
+void CppModelManager::renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context,
+                                   const QString &replacement)
 {
     if (symbol->identifier())
-        m_findReferences->renameUsages(symbol, context);
+        m_findReferences->renameUsages(symbol, context, replacement);
 }
 
 void CppModelManager::findMacroUsages(const CPlusPlus::Macro &macro)
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 0d9ec4b1d317c9c3ea76f64028ba6746d9c90367..9812333313a9e2f766ea78be705aea6757a8a74f 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -118,7 +118,8 @@ public:
 
     virtual QList<int> references(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
 
-    virtual void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
+    virtual void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context,
+                              const QString &replacement = QString());
     virtual void findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
 
     virtual void findMacroUsages(const CPlusPlus::Macro &macro);
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index b3a201ec1d437591fd54aabc65afe75023441dad..aab5cf4ad57773e215e7910472292d713207c86a 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -139,7 +139,8 @@ public:
     virtual QList<int> references(CPlusPlus::Symbol *symbol,
                                   const CPlusPlus::LookupContext &context) = 0;
 
-    virtual void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context) = 0;
+    virtual void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context,
+                              const QString &replacement = QString()) = 0;
     virtual void findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context) = 0;
 
     virtual void findMacroUsages(const CPlusPlus::Macro &macro) = 0;