diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java
index 511787a..b5ed7c0 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java
@@ -133,27 +133,20 @@ public class StringSearchModelInterpolator
             }
             else if ( isQualifiedForInterpolation( cls ) )
             {
-                Field[] fields = fieldsByClass.get( cls );
-                if ( fields == null )
+                Field[] fields = getFields(cls);
+                for (Field currentField : fields)
                 {
-                    fields = cls.getDeclaredFields();
-                    fieldsByClass.put( cls, fields );
-                }
-
-                for ( int i = 0; i < fields.length; i++ )
-                {
-                    Class<?> type = fields[i].getType();
-                    if ( isQualifiedForInterpolation( fields[i], type ) )
+                    Class<?> type = currentField.getType();
+                    if ( isQualifiedForInterpolation( currentField, type ) )
                     {
-                        boolean isAccessible = fields[i].isAccessible();
-                        fields[i].setAccessible( true );
-                        try
-                        {
+                        synchronized ( currentField){
+                            boolean isAccessible = currentField.isAccessible();
+                            currentField.setAccessible( true );
                             try
                             {
                                 if ( String.class == type )
                                 {
-                                    String value = (String) fields[i].get( target );
+                                    String value = (String) currentField.get( target );
                                     if ( value != null )
                                     {
                                         String interpolated =
@@ -162,13 +155,13 @@ public class StringSearchModelInterpolator
 
                                         if ( !interpolated.equals( value ) )
                                         {
-                                            fields[i].set( target, interpolated );
+                                            currentField.set( target, interpolated );
                                         }
                                     }
                                 }
                                 else if ( Collection.class.isAssignableFrom( type ) )
                                 {
-                                    Collection<Object> c = (Collection<Object>) fields[i].get( target );
+                                    Collection<Object> c = (Collection<Object>) currentField.get( target );
                                     if ( c != null && !c.isEmpty() )
                                     {
                                         List<Object> originalValues = new ArrayList<Object>( c );
@@ -224,7 +217,7 @@ public class StringSearchModelInterpolator
                                 }
                                 else if ( Map.class.isAssignableFrom( type ) )
                                 {
-                                    Map<Object, Object> m = (Map<Object, Object>) fields[i].get( target );
+                                    Map<Object, Object> m = (Map<Object, Object>) currentField.get( target );
                                     if ( m != null && !m.isEmpty() )
                                     {
                                         for ( Map.Entry<Object, Object> entry : m.entrySet() )
@@ -269,10 +262,10 @@ public class StringSearchModelInterpolator
                                 }
                                 else
                                 {
-                                    Object value = fields[i].get( target );
+                                    Object value = currentField.get( target );
                                     if ( value != null )
                                     {
-                                        if ( fields[i].getType().isArray() )
+                                        if ( currentField.getType().isArray() )
                                         {
                                             evaluateArray( value );
                                         }
@@ -285,18 +278,21 @@ public class StringSearchModelInterpolator
                             }
                             catch ( IllegalArgumentException e )
                             {
-                                problems.addError( "Failed to interpolate field: " + fields[i] + " on class: "
+                                e.printStackTrace(System.err);
+
+                                problems.addError( "Failed to interpolate field3: " + currentField + " on class: "
                                     + cls.getName(), e );
                             }
                             catch ( IllegalAccessException e )
                             {
-                                problems.addError( "Failed to interpolate field: " + fields[i] + " on class: "
+                                e.printStackTrace(System.err);
+                                problems.addError( "Failed to interpolate field4: " + currentField + " on class: "
                                     + cls.getName(), e );
                             }
-                        }
-                        finally
-                        {
-                            fields[i].setAccessible( isAccessible );
+                            finally
+                            {
+                                currentField.setAccessible( isAccessible );
+                            }
                         }
                     }
                 }
@@ -305,6 +301,20 @@ public class StringSearchModelInterpolator
             }
         }
 
+        private Field[] getFields(Class<?> cls) {
+            Field[] fields;
+            synchronized(fieldsByClass)
+            {
+                fields = fieldsByClass.get( cls );
+                if ( fields == null )
+                {
+                    fields = cls.getDeclaredFields();
+                    fieldsByClass.put( cls, fields );
+                }
+            }
+            return fields;
+        }
+
         private boolean isQualifiedForInterpolation( Class<?> cls )
         {
             return !cls.getPackage().getName().startsWith( "java" );
@@ -312,14 +322,17 @@ public class StringSearchModelInterpolator
 
         private boolean isQualifiedForInterpolation( Field field, Class<?> fieldType )
         {
-            if ( !fieldIsPrimitiveByClass.containsKey( fieldType ) )
+            synchronized ( fieldIsPrimitiveByClass)
             {
-                fieldIsPrimitiveByClass.put( fieldType, Boolean.valueOf( fieldType.isPrimitive() ) );
-            }
+                if ( !fieldIsPrimitiveByClass.containsKey( fieldType ) )
+                {
+                    fieldIsPrimitiveByClass.put( fieldType, Boolean.valueOf( fieldType.isPrimitive() ) );
+                }
 
-            if ( fieldIsPrimitiveByClass.get( fieldType ).booleanValue() )
-            {
-                return false;
+                if ( fieldIsPrimitiveByClass.get( fieldType ).booleanValue() )
+                {
+                    return false;
+                }
             }
 
 //            if ( fieldType.isPrimitive() )

