Buggy code:
IContainer outputFolder = project ; String folderName ; if ( ( ( folderName = in . readUTF ( ) ) . length ( ) ) > 0 ) sourceFolder = project . getFolder ( folderName ) ; if ( ( ( folderName = in . readUTF ( ) ) . length ( ) ) > 0 ) outputFolder = project . getFolder ( folderName ) ; ClasspathMultiDirectory md = ( ( ClasspathMultiDirectory ) ( ClasspathLocation . forSourceFolder ( sourceFolder , outputFolder , State . readNames ( in ) , State . readNames ( in ) ) ) ) ; if ( in . readBoolean ( ) ) md . hasIndependentOutputFolder = true ; newState . sourceLocations [ i ] = md ; } length = in . readInt ( ) ; newState . binaryLocations = new ClasspathLocation [ length ] ; IWorkspaceRoot root = project . getWorkspace ( ) . getRoot ( ) ; for ( int i = 0 ; i < length ; i ++ ) { switch ( in . readByte ( ) ) { case State . SOURCE_FOLDER : newState . binaryLocations [ i ] = newState . sourceLocations [ in . readInt ( ) ] ; break ; case State . BINARY_FOLDER : IPath path = new Path ( in . readUTF ( ) ) ; IContainer outputFolder = ( ( path . segmentCount ( ) ) == 1 ) ? ( ( IContainer ) ( root . getProject ( path . toString ( ) ) ) ) : ( ( IContainer ) ( root . getFolder ( path ) ) ) ; newState . binaryLocations [ i ] = ClasspathLocation . forBinaryFolder ( outputFolder , in . readBoolean ( ) , State . readRestriction ( in ) ) ; break ; case State . EXTERNAL_JAR : newState . binaryLocations [ i ] = ClasspathLocation . forLibrary ( in . readUTF ( ) , in . readLong ( ) , State . readRestriction ( in ) ) ; break ; case State . INTERNAL_JAR : newState . binaryLocations [ i ] = ClasspathLocation . forLibrary ( root . getFile ( new Path ( in . readUTF ( ) ) ) , State . readRestriction ( in ) ) ; } } newState . structuralBuildTimes = new SimpleLookupTable ( ( length = in . readInt ( ) ) ) ; for ( int i = 0 ; i < length ; i ++ ) newState . structuralBuildTimes . put ( in . readUTF ( ) , new Long ( in . readLong ( ) ) ) ; String [ ] internedTypeLocators = new String [ length = in . readInt ( ) ] ; for ( int i = 0 ; i < length ; i ++ ) internedTypeLocators [ i ] = in . readUTF ( ) ; newState . typeLocators = new SimpleLookupTable ( ( length = in . readInt ( ) ) ) ; for ( int i = 0 ; i < length ; i ++ ) newState . recordLocatorForType ( in . readUTF ( ) , internedTypeLocators [ in . readInt ( ) ] ) ; char [ ] [ ] internedRootNames = ReferenceCollection . internSimpleNames ( State . readNames ( in ) , false ) ; char [ ] [ ] internedSimpleNames = ReferenceCollection . internSimpleNames ( State . readNames ( in ) , false ) ; char [ ] [ ] [ ] internedQualifiedNames = new char [ length = in . readInt ( ) ] [ ] [ ] ; for ( int i = 0 ; i < length ; i ++ ) { int qLength = in . readInt ( ) ; char [ ] [ ] qName = new char [ qLength ] [ ] ; for ( int j = 0 ; j < qLength ; j ++ ) qName [ j ] = internedSimpleNames [ in . readInt ( ) ] ; internedQualifiedNames [ i ] = qName ; } <START_BUG> internedQualifiedNames = ReferenceCollection . internQualifiedNames ( internedQualifiedNames ) ; <END_BUG> newState . references = new SimpleLookupTable ( ( length = in . readInt ( ) ) ) ; for ( int i = 0 ; i < length ; i ++ ) { String typeLocator = internedTypeLocators [ in . readInt ( ) ] ; ReferenceCollection collection = null ; switch ( in . readByte ( ) ) { case 1 : char [ ] [ ] additionalTypeNames = State . readNames ( in ) ; char [ ] [ ] [ ] qualifiedNames = new char [ in . readInt ( ) ] [ ] [ ] ; for ( int j = 0 , m = qualifiedNames . length ; j < m ; j ++ ) qualifiedNames [ j ] = internedQualifiedNames [ in . readInt ( ) ] ; char [ ] [ ] simpleNames = new char [ in . readInt ( ) ] [ ] ; for ( int j = 0 , m = simpleNames . length ; j < m ; j ++ ) simpleNames [ j ] = internedSimpleNames [ in . readInt ( ) ] ; char [ ] [ ] rootNames = new char [ in . readInt ( ) ] [ ] ; for ( int j = 0 , m = rootNames . length ; j < m ; j ++ ) rootNames [ j ] = internedRootNames [ in . readInt ( ) ] ; collection = new AdditionalTypeCollection ( additionalTypeNames , qualifiedNames , simpleNames , rootNames ) ; break ; case 2 : char [ ] [ ] [ ] qNames = new char [ in . readInt ( ) ] [ ] [ ] ; for ( int j = 0 , m = qNames . length ; j < m ; j ++ ) qNames [ j ] = internedQualifiedNames [ in . readInt ( ) ] ;

Fix:
internedQualifiedNames = ReferenceCollection . internQualifiedNames ( internedQualifiedNames , false ) ;