diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java
index 44d5371d6b8..81fa07490c1 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationInclusionTests.java
@@ -378,4 +378,43 @@ public class DOMLocationInclusionTests extends FileBasePluginTest {
         suite.addTest(new DOMLocationInclusionTests("cleanupProject")); //$NON-NLS-1$
         return suite;
     }
+    
+    public void testBug97603() throws Exception {
+        IFile imacro_file = importFile( "macro.h", "#define JEDEN 1\n#define DVA 2\n#define TRI 3\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        StringBuffer buffer = new StringBuffer();
+        buffer.append( "#ifndef _INCLUDE_H_\n" ); //$NON-NLS-1$
+        buffer.append( "#define _INCLUDE_H_\n" ); //$NON-NLS-1$
+        buffer.append( "typedef void (*vfp)();\n" ); //$NON-NLS-1$
+        buffer.append( "typedef int (*ifp)();\n" ); //$NON-NLS-1$
+        buffer.append( "struct Include {\n" ); //$NON-NLS-1$
+        buffer.append( "int i;\n" ); //$NON-NLS-1$
+        buffer.append( "};\n" ); //$NON-NLS-1$
+        buffer.append( "#endif /*_INCLUDE_H_*/\n" ); //$NON-NLS-1$
+        final String inc_file_code = buffer.toString();
+        IFile include_file = importFile( "include.h", inc_file_code ); //$NON-NLS-1$ //$NON-NLS-2$
+        String [] macros =  { imacro_file.getLocation().toOSString() };
+        String [] includes = { include_file.getLocation().toOSString() }; 
+        IExtendedScannerInfo scannerInfo = new ExtendedScannerInfo( Collections.EMPTY_MAP, EMPTY_STRING_ARRAY,  macros, includes  );
+        IFile code = importFile( "main.c", "int main() { return BEAST * sizeof( Include ); } "); //$NON-NLS-1$ //$NON-NLS-2$
+        for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
+                : null) {
+            IASTTranslationUnit tu = parse(code, p, scannerInfo ); //$NON-NLS-1$
+            IASTPreprocessorMacroDefinition [] macro_defs = tu.getMacroDefinitions();
+            assertEquals( macro_defs.length, 4 );
+            IASTPreprocessorMacroDefinition BEAST = macro_defs[0];
+            assertEquals( BEAST.getName().toString(), "JEDEN"); //$NON-NLS-1$
+            IASTPreprocessorMacroDefinition INCLUDE_H = macro_defs[3];
+            final IASTNodeLocation[] nodeLocations = INCLUDE_H.getName().getNodeLocations();
+            assertEquals( nodeLocations.length, 1 );
+            final IASTFileLocation flatLoc = INCLUDE_H.getName().getFileLocation();
+            assertNotNull( flatLoc );
+            assertEquals( include_file.getLocation().toOSString(), flatLoc.getFileName() );
+            assertEquals( inc_file_code.indexOf( "#define _INCLUDE_H_") + "#define ".length(), flatLoc.getNodeOffset() ); //$NON-NLS-1$ //$NON-NLS-2$
+            assertEquals( "_INCLUDE_H_".length(), flatLoc.getNodeLength() ); //$NON-NLS-1$
+            for( int j = 0; j < macro_defs.length; ++j )
+                assertNotNull(macro_defs[j].getName().getFileLocation() );
+
+        }        
+    }
+
 }
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java
index 7d7af88d089..65fe29b6c80 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java
@@ -1398,8 +1398,10 @@ abstract class BaseScanner implements IScanner {
         }
         if (r == null)
             return;
-        Object i = createInclusionConstruct(r.filename, r.filename, false, -1,
-                -1, -1, -1, -1, -1, -1, true);
+        int o = getCurrentOffset() + 1; 
+        int l = getLineNumber(o);
+        Object i = createInclusionConstruct(r.filename, r.filename, false, o,
+                l, o, o, l, o, l, true);
         InclusionData d = new InclusionData(r, i);
         pushContext(r.buffer, d);
     }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java
index 16e00ebb37e..5f7aebf008d 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java
@@ -229,11 +229,14 @@ public class DOMScanner extends BaseScanner {
      * @see org.eclipse.cdt.internal.core.parser.scanner2.BaseScanner#popContext()
      */
     protected Object popContext() {
-        // TODO calibrate offsets
         Object result = super.popContext();
         if (result instanceof CodeReader) {
-            locationMap.endTranslationUnit(bufferDelta[0]
-                    + ((CodeReader) result).buffer.length);
+            if( isInitialized )
+                locationMap.endTranslationUnit(bufferDelta[0]
+                        + ((CodeReader) result).buffer.length);
+            else
+                bufferDelta[0] += bufferDelta[bufferStackPos + 1] + ((CodeReader) result).buffer.length;
+
         } else if (result instanceof InclusionData) {
             CodeReader codeReader = ((InclusionData) result).reader;
             if (log.isTracing()) {