diff --git a/src/libs/utils/qstringbuilder.h b/src/libs/utils/qstringbuilder.h
index 88d82b3260dccb7c4cef9e54079219a31d69083c..b160ad4345b1b2876767ab638ed7e896605ddad7 100644
--- a/src/libs/utils/qstringbuilder.h
+++ b/src/libs/utils/qstringbuilder.h
@@ -66,13 +66,6 @@ public:
     inline int size() const { return m_size; }
     inline const char *data() const { return m_data; }
 
-    void appendTo(QChar *&out) const
-    {
-        const char *s = m_data;
-        for (int i = m_size; --i >= 0;)    
-            *out++ = QLatin1Char(*s++);
-    }
-
     operator QString() const
     {
 #ifdef USE_CHANGED_QSTRING
@@ -82,7 +75,8 @@ public:
         s.resize(m_size);
 #endif
         QChar *d = s.data();
-        appendTo(d);
+        for (const char *s = m_data; *s; )
+            *d++ = QLatin1Char(*s++);
         return s;
     }
 
@@ -92,6 +86,60 @@ private:
     const char *m_data;
 };
 
+
+template <typename A, typename B>
+class QStringBuilderPair;
+
+template <typename A, typename B>
+inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p);
+
+inline int qStringBuilderSize(const char) { return 1; }
+
+inline int qStringBuilderSize(const QLatin1Char) { return 1; }
+
+inline int qStringBuilderSize(const QLatin1String &a) { return qstrlen(a.latin1()); }
+
+inline int qStringBuilderSize(const QLatin1Literal &a) { return a.size(); }
+
+inline int qStringBuilderSize(const QString &a) { return a.size(); }
+
+inline int qStringBuilderSize(const QStringRef &a) { return a.size(); }
+
+
+template <typename A, typename B>
+inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out);
+
+inline void qStringBuilderAppend(const char c, QChar *&out) { *out++ = QLatin1Char(c); }
+
+inline void qStringBuilderAppend(const QLatin1Char c, QChar *&out) { *out++ = c; }
+
+inline void qStringBuilderAppend(const QLatin1String &a, QChar *&out)
+{
+    for (const char *s = a.latin1(); *s; )
+        *out++ = QLatin1Char(*s++);
+}
+
+inline void qStringBuilderAppend(QStringRef a, QChar *&out)
+{
+    const int n = a.size();
+    memcpy(out, (char*)a.constData(), sizeof(QChar) * n);
+    out += n; 
+}
+
+inline void qStringBuilderAppend(const QString &a, QChar *&out)
+{
+    const int n = a.size();
+    memcpy(out, (char*)a.constData(), sizeof(QChar) * n);
+    out += n; 
+}
+
+inline void qStringBuilderAppend(const QLatin1Literal &a, QChar *&out)
+{
+    for (const char *s = a.data(); *s; )
+        *out++ = QLatin1Char(*s++);
+}
+
+
 template <typename A>
 class QStringBuilder : public A
 {
@@ -107,7 +155,7 @@ public:
         s.resize(this->size());
 #endif
         QChar *d = s.data();
-        this->appendTo(d);
+        qStringBuilderAppend(*this, d);
         return s;
     }
 
@@ -119,15 +167,6 @@ class QStringBuilder<QString>
 public:
     QStringBuilder(const QString &a_) : a(&a_) {}
 
-    inline int size() const { return a->size(); }
-
-    inline void appendTo(QChar *&out) const
-    {
-        const int n = a->size();
-        memcpy(out, (char*)a->constData(), sizeof(QChar) * n);
-        out += n; 
-    }
-
     inline operator QString() const { return *a; }
 
 private:
@@ -135,37 +174,6 @@ private:
 };
 
 
-template <typename A>
-int qStringBuilderSize(const A a) { return a.size(); }
-
-inline int qStringBuilderSize(const char) { return 1; }
-
-inline int qStringBuilderSize(const QLatin1Char) { return 1; }
-
-inline int qStringBuilderSize(const QLatin1String a) { return qstrlen(a.latin1()); }
-
-
-template <typename A>
-inline void qStringBuilderAppend(const A a, QChar *&out) { a.appendTo(out); }
-
-inline void qStringBuilderAppend(char c, QChar *&out) { *out++ = QLatin1Char(c); }
-
-inline void qStringBuilderAppend(QLatin1Char c, QChar *&out) { *out++ = c; }
-
-inline void qStringBuilderAppend(QLatin1String a, QChar *&out)
-{
-    for (const char *s = a.latin1(); *s; )
-        *out++ = QLatin1Char(*s++);
-}
-
-inline void qStringBuilderAppend(QStringRef a, QChar *&out)
-{
-    const int n = a.size();
-    memcpy(out, (char*)a.constData(), sizeof(QChar) * n);
-    out += n; 
-}
-
-
 
 template <typename A, typename B>
 class QStringBuilderPair
@@ -177,19 +185,11 @@ public:
     {
         return qStringBuilderSize(a) + qStringBuilderSize(b);
     }
-
-    inline void appendTo(QChar *&out) const
-    {
-        qStringBuilderAppend(a, out);
-        qStringBuilderAppend(b, out);
-    }
-
-private:
-    const A a;
-    const B b;
+//private:
+    const A &a;
+    const B &b;
 };
 
-
 template <typename A, typename B>
 QStringBuilder< QStringBuilderPair<A, B> >
 operator%(const A &a, const B &b)
@@ -197,30 +197,17 @@ operator%(const A &a, const B &b)
     return QStringBuilderPair<A, B> (a, b);
 }
 
-
-// QString related specializations
-
-template <typename A>
-inline QStringBuilder< QStringBuilderPair<A, QStringBuilder<QString> > >
-operator%(const A &a, const QString &b)
-{
-    return QStringBuilderPair<A, QStringBuilder<QString> > (a, b);
-}
-
-template <typename B>
-inline QStringBuilder< QStringBuilderPair<QStringBuilder<QString>, B> >
-operator%(const QString &a, const B &b)
+template <typename A, typename B>
+inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out)
 {
-    return QStringBuilderPair<QStringBuilder<QString>, B> (a, b);
+    qStringBuilderAppend(p.a, out);
+    qStringBuilderAppend(p.b, out);
 }
 
-inline QStringBuilder<
-    QStringBuilderPair<QStringBuilder<QString>, QStringBuilder<QString> >
->
-operator%(const QString &a, const QString &b)
+template <typename A, typename B>
+inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p)
 {
-    return QStringBuilderPair< QStringBuilder<QString>,
-        QStringBuilder<QString> > (a, b);
+    return qStringBuilderSize(p.a) + qStringBuilderSize(p.b);
 }
 
 QT_END_NAMESPACE