diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 05d5c94f619eb8ce7e91fcb4fabbce0bd201b8ea..2f3e10f9ea0f73279589e5f19705e7af2710b042 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -154,7 +154,7 @@ public:
     QString m_pendingComment;
     ushort *m_proitemPtr;
 
-    enum StrState { NotStarted, Started, PutSpace };
+    enum StrState { NeverStarted, NotStarted, Started, PutSpace };
 
     /////////////// Evaluating pro file contents
 
@@ -289,33 +289,36 @@ bool ProFileEvaluator::Private::read(ProFile *pro, QTextStream *ts)
 
     int parens = 0;
     bool inQuote = false;
-    bool escaped = false;
     while (!ts->atEnd()) {
         QString line = ts->readLine();
         const ushort *cur = (const ushort *)line.unicode(),
-                     *end = cur + line.length();
+                     *end = cur + line.length(),
+                     *cmtptr = 0;
         m_proitem.reserve(line.length());
         m_proitemPtr = (ushort *)m_proitem.unicode();
+        enum { NotEscaped, Escaped, PostEscaped } escaped = NotEscaped;
+        StrState sts = NeverStarted;
+        goto startItem;
       nextItem:
+        escaped = NotEscaped;
+      nextItem1:
+        sts = NotStarted;
+      startItem:
         ushort *ptr = m_proitemPtr;
-        StrState sts = NotStarted;
         while (cur < end) {
             ushort c = *cur++;
             if (c == '#') { // Yep - no escaping possible
-                m_proitemPtr = ptr;
-                insertComment(line.right(end - cur).simplified());
-                goto done;
+                cmtptr = cur;
+                break;
             }
-            if (!escaped) {
+            if (escaped != Escaped) {
                 if (c == '\\') {
-                    escaped = true;
+                    escaped = Escaped;
                     goto putch;
                 } else if (c == '"') {
                     inQuote = !inQuote;
-                    goto putch;
+                    goto putch1;
                 }
-            } else {
-                escaped = false;
             }
             if (!inQuote) {
                 if (c == '(') {
@@ -327,7 +330,9 @@ bool ProFileEvaluator::Private::read(ProFile *pro, QTextStream *ts)
                         if (c == ' ' || c == '\t') {
                             m_proitemPtr = ptr;
                             updateItem();
-                            goto nextItem;
+                            if (escaped == Escaped)
+                                escaped = PostEscaped;
+                            goto nextItem1;
                         }
                     } else {
                         if (c == ':') {
@@ -360,9 +365,14 @@ bool ProFileEvaluator::Private::read(ProFile *pro, QTextStream *ts)
             }
 
             if (c == ' ' || c == '\t') {
-                if (sts == Started)
+                if (sts == Started) {
                     sts = PutSpace;
+                    if (escaped == Escaped)
+                        escaped = PostEscaped;
+                }
             } else {
+              putch1:
+                escaped = NotEscaped;
               putch:
                 if (sts == PutSpace)
                     *ptr++ = ' ';
@@ -370,15 +380,17 @@ bool ProFileEvaluator::Private::read(ProFile *pro, QTextStream *ts)
                 sts = Started;
             }
         }
+        if (escaped != NotEscaped) {
+            --ptr;
+            if (ptr != (ushort *)m_proitem.unicode() && *(ptr - 1) == ' ')
+                --ptr;
+        }
         m_proitemPtr = ptr;
-      done:
-        if (escaped) {
-            --m_proitemPtr;
-            updateItem();
-        } else {
-            updateItem();
+        updateItem();
+        if (cmtptr)
+            insertComment(line.right(end - cmtptr).simplified());
+        if (sts != NeverStarted && escaped == NotEscaped)
             finalizeBlock();
-        }
         ++m_lineNo;
     }
     return true;
@@ -494,8 +506,6 @@ void ProFileEvaluator::Private::insertOperator(const char op)
 
 void ProFileEvaluator::Private::insertComment(const QString &comment)
 {
-    updateItem();
-
     QString strComment;
     if (!m_commentItem)
         strComment = m_pendingComment;