diff --git a/src/libs/cplusplus/CppRewriter.cpp b/src/libs/cplusplus/CppRewriter.cpp
index 8948b9297efb075258fadc367600a434c7f7cb87..432f6bcbe429984883a37ddb6c2249cd8fda4028 100644
--- a/src/libs/cplusplus/CppRewriter.cpp
+++ b/src/libs/cplusplus/CppRewriter.cpp
@@ -387,18 +387,6 @@ UseMinimalNames::~UseMinimalNames()
 
 }
 
-static bool symbolIdentical(Symbol *s1, Symbol *s2)
-{
-    if (!s1 || !s2)
-        return false;
-    if (s1->line() != s2->line())
-        return false;
-    if (s1->column() != s2->column())
-        return false;
-
-    return QByteArray(s1->fileName()) == QByteArray(s2->fileName());
-}
-
 FullySpecifiedType UseMinimalNames::apply(const Name *name, Rewrite *rewrite) const
 {
     SubstitutionEnvironment *env = rewrite->env;
@@ -416,26 +404,7 @@ FullySpecifiedType UseMinimalNames::apply(const Name *name, Rewrite *rewrite) co
     const QList<LookupItem> results = context.lookup(name, scope);
     foreach (const LookupItem &r, results) {
         if (Symbol *d = r.declaration()) {
-            const Name *n = 0;
-            QList<const Name *> names = LookupContext::fullyQualifiedName(d);
-            for (int i = names.size() - 1; i >= 0; --i) {
-                if (! n)
-                    n = names.at(i);
-                else
-                    n = control->qualifiedNameId(names.at(i), n);
-                if (_target) {
-                    // minimize the qualifications
-                    const QList<LookupItem> tresults = _target->lookup(n);
-                    foreach (const LookupItem &tr, tresults) {
-                        if (symbolIdentical(tr.declaration(), d)) {
-                            i = 0; // break outer
-                            break;
-                        }
-                    }
-                }
-            }
-
-            return control->namedType(n);
+            return control->namedType(LookupContext::minimalName(d, _target, control));
         }
 
         return r.type();
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index f4089d1bec23370e0c4a86cc6d557a859f26c10e..88110c5da2698ed328e1a1d2146fd068d573e40c 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -157,50 +157,40 @@ QList<const Name *> LookupContext::path(Symbol *symbol)
     return names;
 }
 
-
-const Name *LookupContext::minimalName(const Name *name,
-                                       Scope *scope,
-                                       ClassOrNamespace *target) const
+static bool symbolIdentical(Symbol *s1, Symbol *s2)
 {
-    Q_UNUSED(name);
-    Q_UNUSED(scope);
-    Q_UNUSED(target);
-
-    qWarning() << "TODO:" << Q_FUNC_INFO;
-    return name;
+    if (!s1 || !s2)
+        return false;
+    if (s1->line() != s2->line())
+        return false;
+    if (s1->column() != s2->column())
+        return false;
 
-#if 0
-    Q_ASSERT(name);
-    Q_ASSERT(source);
-    Q_ASSERT(target);
+    return QByteArray(s1->fileName()) == QByteArray(s2->fileName());
+}
 
-    QList<Symbol *> symbols = lookup(name, source);
-    if (symbols.isEmpty())
-        return 0;
+const Name *LookupContext::minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control)
+{
+    const Name *n = 0;
+    QList<const Name *> names = LookupContext::fullyQualifiedName(symbol);
 
-    Symbol *canonicalSymbol = symbols.first();
-    std::vector<const Name *> fqNames = fullyQualifiedName(canonicalSymbol).toVector().toStdVector();
-    if (const QualifiedNameId *qId = name->asQualifiedNameId())
-        fqNames.push_back(qId->name());
-    else
-        fqNames.push_back(name);
-
-    const QualifiedNameId *lastWorking = 0;
-    for (unsigned i = 0; i < fqNames.size(); ++i) {
-        const QualifiedNameId *newName = control()->qualifiedNameId(&fqNames[i],
-                                                                    fqNames.size() - i);
-        QList<Symbol *> candidates = target->lookup(newName);
-        if (candidates.contains(canonicalSymbol))
-            lastWorking = newName;
+    for (int i = names.size() - 1; i >= 0; --i) {
+        if (! n)
+            n = names.at(i);
         else
-            break;
+            n = control->qualifiedNameId(names.at(i), n);
+
+        // once we're qualified enough to get the same symbol, break
+        if (target) {
+            const QList<LookupItem> tresults = target->lookup(n);
+            foreach (const LookupItem &tr, tresults) {
+                if (symbolIdentical(tr.declaration(), symbol))
+                    return n;
+            }
+        }
     }
 
-    if (lastWorking && lastWorking->nameCount() == 1)
-        return lastWorking->nameAt(0);
-    else
-        return lastWorking;
-#endif
+    return n;
 }
 
 
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 578e19b094d75ba21156ab6da08fa40b0d24b8a9..2fa9655cd5c51c62c00e0d736ecee901b2eeb66c 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -235,8 +235,7 @@ public:
     static QList<const Name *> fullyQualifiedName(Symbol *symbol);
     static QList<const Name *> path(Symbol *symbol);
 
-    const Name *minimalName(const Name *name, Scope *source,
-                            ClassOrNamespace *target) const;
+    static const Name *minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control);
 
 private:
     // The current expression.
diff --git a/src/plugins/cppeditor/cppinsertdecldef.cpp b/src/plugins/cppeditor/cppinsertdecldef.cpp
index 5ea7e3e696a064e573c5aa65aac5e1a638a4fa6d..6847a4d6721894e1500726d1cdabde5ecaa40961 100644
--- a/src/plugins/cppeditor/cppinsertdecldef.cpp
+++ b/src/plugins/cppeditor/cppinsertdecldef.cpp
@@ -261,13 +261,7 @@ public:
         FullySpecifiedType tn = rewriteType(m_decl->type(), &env, control);
 
         // rewrite the function name
-        QString name;
-        const FullySpecifiedType nametype = rewriteType(control->namedType(m_decl->name()), &env, control);
-        if (NamedType *nt = nametype.type()->asNamedType()) {
-            name = oo(nt->name());
-        } else {
-            name = oo(LookupContext::fullyQualifiedName(m_decl));
-        }
+        QString name = oo(LookupContext::minimalName(m_decl, targetCoN, control));
 
         QString defText = oo.prettyType(tn, name) + "\n{\n}";