diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 817d0e9f7695e2c4563ca58f52435e88594c1159..1e677f85c04e3fb2ca08a754cc5371addfcc979f 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -89,11 +89,11 @@ protected:
             }
 
             unsigned startLine, startColumn;
-            _unit->getPosition(symbol->startOffset(), &startLine, &startColumn);
+            _unit->getPosition(scope->startOffset(), &startLine, &startColumn);
 
             if (_line > startLine || (_line == startLine && _column >= startColumn)) {
                 unsigned endLine, endColumn;
-                _unit->getPosition(symbol->endOffset(), &endLine, &endColumn);
+                _unit->getPosition(scope->endOffset(), &endLine, &endColumn);
 
                 if (_line < endLine || (_line == endLine && _column <= endColumn))
                     _scope = scope;
diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp
index cdf8162510f6e409337fcb2389542bab921d92a6..a2681991a3efdefa9602211c012beed7bd36401e 100644
--- a/src/plugins/cppeditor/cppchecksymbols.cpp
+++ b/src/plugins/cppeditor/cppchecksymbols.cpp
@@ -87,12 +87,12 @@ public:
     static Scope *findScope(unsigned tokenOffset, const QList<ScopedSymbol *> &scopes)
     {
         for (int i = scopes.size() - 1; i != -1; --i) {
-            ScopedSymbol *symbol = scopes.at(i);
-            const unsigned start = symbol->startOffset();
-            const unsigned end = symbol->endOffset();
+            Scope *scope = scopes.at(i)->members();
+            const unsigned start = scope->startOffset();
+            const unsigned end = scope->endOffset();
 
             if (tokenOffset >= start && tokenOffset < end)
-                return symbol->members();
+                return scope;
         }
 
         return 0;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 3cf8040e39c8d2a2974a0c9cb5a1c8e7dce54d8a..d0e5600523e04ab5ecab582e8d9e84823f75a276 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -349,8 +349,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
         fun->setDeprecated(true);
     if (ty.isUnavailable())
         fun->setUnavailable(true);
-    fun->setStartOffset(funStartOffset);
-    fun->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    fun->members()->setStartOffset(funStartOffset);
+    fun->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     if (ast->declarator)
         fun->setSourceLocation(ast->declarator->firstToken(), translationUnit());
     fun->setName(name);
@@ -410,13 +410,15 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
         namespaceName = control()->nameId(id);
 
     unsigned sourceLocation = ast->firstToken();
-
     if (ast->identifier_token)
         sourceLocation = ast->identifier_token;
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->linkage_body && ast->linkage_body->firstToken())
+        scopeStart = tokenAt(ast->linkage_body->firstToken()).offset;
 
     Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
-    ns->setStartOffset(tokenAt(ast->firstToken()).offset);
-    ns->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    ns->members()->setStartOffset(scopeStart);
+    ns->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = ns;
     _scope->enterSymbol(ns);
     semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later.
@@ -583,6 +585,18 @@ bool CheckDeclaration::visit(ObjCProtocolForwardDeclarationAST *ast)
     return false;
 }
 
+unsigned CheckDeclaration::calculateScopeStart(ObjCProtocolDeclarationAST *ast) const
+{
+    if (ast->protocol_refs)
+        if (unsigned pos = ast->protocol_refs->lastToken())
+            return tokenAt(pos - 1).end();
+    if (ast->name)
+        if (unsigned pos = ast->name->lastToken())
+            return tokenAt(pos - 1).end();
+
+    return tokenAt(ast->firstToken()).offset;
+}
+
 bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
 {
     unsigned sourceLocation;
@@ -593,8 +607,8 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
 
     const Name *protocolName = semantic()->check(ast->name, _scope);
     ObjCProtocol *protocol = control()->newObjCProtocol(sourceLocation, protocolName);
-    protocol->setStartOffset(tokenAt(ast->firstToken()).offset);
-    protocol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    protocol->members()->setStartOffset(calculateScopeStart(ast));
+    protocol->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
 
     if (ast->protocol_refs && ast->protocol_refs->identifier_list) {
         for (NameListAST *iter = ast->protocol_refs->identifier_list; iter; iter = iter->next) {
@@ -642,6 +656,40 @@ bool CheckDeclaration::visit(ObjCClassForwardDeclarationAST *ast)
     return false;
 }
 
+unsigned CheckDeclaration::calculateScopeStart(ObjCClassDeclarationAST *ast) const
+{
+    if (ast->inst_vars_decl)
+        if (unsigned pos = ast->inst_vars_decl->lbrace_token)
+            return tokenAt(pos).end();
+
+    if (ast->protocol_refs)
+        if (unsigned pos = ast->protocol_refs->lastToken())
+            return tokenAt(pos - 1).end();
+
+    if (ast->superclass)
+        if (unsigned pos = ast->superclass->lastToken())
+            return tokenAt(pos - 1).end();
+
+    if (ast->colon_token)
+        return tokenAt(ast->colon_token).end();
+
+    if (ast->rparen_token)
+        return tokenAt(ast->rparen_token).end();
+
+    if (ast->category_name)
+        if (unsigned pos = ast->category_name->lastToken())
+            return tokenAt(pos - 1).end();
+
+    if (ast->lparen_token)
+        return tokenAt(ast->lparen_token).end();
+
+    if (ast->class_name)
+        if (unsigned pos = ast->class_name->lastToken())
+            return tokenAt(pos - 1).end();
+
+    return tokenAt(ast->firstToken()).offset;
+}
+
 bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
 {
     unsigned sourceLocation;
@@ -652,8 +700,8 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
 
     const Name *className = semantic()->check(ast->class_name, _scope);
     ObjCClass *klass = control()->newObjCClass(sourceLocation, className);
-    klass->setStartOffset(tokenAt(ast->firstToken()).offset);
-    klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    klass->members()->setStartOffset(calculateScopeStart(ast));
+    klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).offset);
     ast->symbol = klass;
 
     klass->setInterface(ast->interface_token != 0);
@@ -716,8 +764,8 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
     Symbol *symbol;
     if (ast->function_body) {
         symbol = methodTy;
-        methodTy->setStartOffset(tokenAt(ast->firstToken()).offset);
-        methodTy->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+        methodTy->members()->setStartOffset(tokenAt(ast->function_body->firstToken()).offset);
+        methodTy->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     } else {
         Declaration *decl = control()->newDeclaration(selector->firstToken(), methodTy->name());
         decl->setType(methodTy);
diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h
index d9d8cb0170f8f747260a94b37d0ca5e9043ca78a..acd71c557bdc9f33fe55e36042e4fb1b8d9bdb23 100644
--- a/src/shared/cplusplus/CheckDeclaration.h
+++ b/src/shared/cplusplus/CheckDeclaration.h
@@ -111,6 +111,9 @@ private:
     void checkQEnumsQFlagsNames(NameListAST *nameListAst,
                                 const char *declName);
 
+    unsigned calculateScopeStart(ObjCClassDeclarationAST *ast) const;
+    unsigned calculateScopeStart(ObjCProtocolDeclarationAST *ast) const;
+
 private:
     DeclarationAST *_declaration;
     Scope *_scope;
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index ce5b6a38e2d5b13c46d1f92c99a0735df32803ef..87ff373eb30a065691418828a11c9e5a45ccdeaf 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -316,8 +316,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
 
     const Name *className = semantic()->check(ast->name, _scope);
     Class *klass = control()->newClass(sourceLocation, className);
-    klass->setStartOffset(classScopeStart);
-    klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    klass->members()->setStartOffset(classScopeStart);
+    klass->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = klass;
     unsigned classKey = tokenKind(ast->classkey_token);
     if (classKey == T_CLASS)
@@ -407,8 +407,8 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
 
     const Name *name = semantic()->check(ast->name, _scope);
     Enum *e = control()->newEnum(sourceLocation, name);
-    e->setStartOffset(scopeStart);
-    e->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    e->members()->setStartOffset(scopeStart);
+    e->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     e->setVisibility(semantic()->currentVisibility());
     _scope->enterSymbol(e);
     _fullySpecifiedType.setType(e);
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index dd778f7f5eb96e76d06940009ddf3d46a6f38b4f..aa145e804c4ae2250a72632de065403d236b4647 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -111,8 +111,8 @@ bool CheckStatement::visit(CaseStatementAST *ast)
 bool CheckStatement::visit(CompoundStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->lbrace_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->members()->setStartOffset(tokenAt(ast->firstToken()).end());
+    block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -167,6 +167,7 @@ bool CheckStatement::visit(ExpressionStatementAST *ast)
 }
 
 bool CheckStatement::forEachFastEnum(unsigned firstToken,
+                                     unsigned lparen,
                                      unsigned lastToken,
                                      SpecifierListAST *type_specifier_list,
                                      DeclaratorAST *declarator,
@@ -175,9 +176,13 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
                                      StatementAST *statement,
                                      Block *&symbol)
 {
+    unsigned scopeStart = tokenAt(firstToken).offset;
+    if (lparen)
+        scopeStart = tokenAt(lparen).end();
+
     Block *block = control()->newBlock(firstToken);
-    block->setStartOffset(tokenAt(firstToken).offset);
-    block->setEndOffset(tokenAt(lastToken - 1).end());
+    block->members()->setStartOffset(scopeStart);
+    block->members()->setEndOffset(tokenAt(lastToken - 1).end());
     symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -205,6 +210,7 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
 bool CheckStatement::visit(ForeachStatementAST *ast)
 {
     return forEachFastEnum(ast->firstToken(),
+                           ast->lparen_token,
                            ast->lastToken(),
                            ast->type_specifier_list,
                            ast->declarator,
@@ -217,6 +223,7 @@ bool CheckStatement::visit(ForeachStatementAST *ast)
 bool CheckStatement::visit(ObjCFastEnumerationAST *ast)
 {
     return forEachFastEnum(ast->firstToken(),
+                           ast->lparen_token,
                            ast->lastToken(),
                            ast->type_specifier_list,
                            ast->declarator,
@@ -228,9 +235,13 @@ bool CheckStatement::visit(ObjCFastEnumerationAST *ast)
 
 bool CheckStatement::visit(ForStatementAST *ast)
 {
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lparen_token)
+        scopeStart = tokenAt(ast->lparen_token).end();
+
     Block *block = control()->newBlock(ast->for_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->members()->setStartOffset(scopeStart);
+    block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -245,9 +256,13 @@ bool CheckStatement::visit(ForStatementAST *ast)
 
 bool CheckStatement::visit(IfStatementAST *ast)
 {
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lparen_token)
+        scopeStart = tokenAt(ast->lparen_token).end();
+
     Block *block = control()->newBlock(ast->if_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->members()->setStartOffset(scopeStart);
+    block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -292,9 +307,13 @@ bool CheckStatement::visit(ReturnStatementAST *ast)
 
 bool CheckStatement::visit(SwitchStatementAST *ast)
 {
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lparen_token)
+        scopeStart = tokenAt(ast->lparen_token).offset;
+
     Block *block = control()->newBlock(ast->switch_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->members()->setStartOffset(scopeStart);
+    block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -317,9 +336,13 @@ bool CheckStatement::visit(TryBlockStatementAST *ast)
 
 bool CheckStatement::visit(CatchClauseAST *ast)
 {
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lparen_token)
+        scopeStart = tokenAt(ast->lparen_token).end();
+
     Block *block = control()->newBlock(ast->catch_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->members()->setStartOffset(scopeStart);
+    block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -332,9 +355,13 @@ bool CheckStatement::visit(CatchClauseAST *ast)
 
 bool CheckStatement::visit(WhileStatementAST *ast)
 {
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lparen_token)
+        scopeStart = tokenAt(ast->lparen_token).end();
+
     Block *block = control()->newBlock(ast->while_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->members()->setStartOffset(scopeStart);
+    block->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
diff --git a/src/shared/cplusplus/CheckStatement.h b/src/shared/cplusplus/CheckStatement.h
index b13204fba90e9ea227bbb43ddb1a35a5a8ea2136..3f96a14fdf8d9973115247194a4e63348913a642 100644
--- a/src/shared/cplusplus/CheckStatement.h
+++ b/src/shared/cplusplus/CheckStatement.h
@@ -92,6 +92,7 @@ protected:
     virtual bool visit(QtMemberDeclarationAST *ast);
 
     bool forEachFastEnum(unsigned firstToken,
+                         unsigned lparen,
                          unsigned lastToken,
                          SpecifierListAST *type_specifier_list,
                          DeclaratorAST *declarator,
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index 5d64149360ef44f1e96f2be8d556eabe9b7d31cc..e82a60ae199e92cd9bd25bf0d388412b67f61d6c 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -427,18 +427,6 @@ Scope *ScopedSymbol::members() const
 void ScopedSymbol::addMember(Symbol *member)
 { _members->enterSymbol(member); }
 
-unsigned ScopedSymbol::startOffset() const
-{ return _members->startOffset(); }
-
-void ScopedSymbol::setStartOffset(unsigned offset)
-{ _members->setStartOffset(offset); }
-
-unsigned ScopedSymbol::endOffset() const
-{ return _members->endOffset(); }
-
-void ScopedSymbol::setEndOffset(unsigned offset)
-{ _members->setEndOffset(offset); }
-
 Block::Block(TranslationUnit *translationUnit, unsigned sourceLocation)
     : ScopedSymbol(translationUnit, sourceLocation, /*name = */ 0)
 { }
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index 05a1241ec405d33df726bd9f54880ca21e17425c..2a90fd0cc0306b5712e4f9385fea450129a1d67b 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -234,14 +234,6 @@ public:
     virtual ScopedSymbol *asScopedSymbol()
     { return this; }
 
-    /// Set the start offset of the scope for this symbol
-    unsigned startOffset() const;
-    void setStartOffset(unsigned offset);
-
-    /// Set the end offset of the scope for this symbol
-    unsigned endOffset() const;
-    void setEndOffset(unsigned offset);
-
 private:
     Scope *_members;
 };