*fixes
diff --git a/core/plugins/org.eclipse.dltk.core/.options b/core/plugins/org.eclipse.dltk.core/.options
index 2a0f243..df58d1c 100644
--- a/core/plugins/org.eclipse.dltk.core/.options
+++ b/core/plugins/org.eclipse.dltk.core/.options
@@ -3,7 +3,6 @@
 org.eclipse.dltk.core/typeInferencing/showStatistics = false
 org.eclipse.dltk.ruby.core/dumpErrorsToConsole = false
 org.eclipse.dltk.core/debug = false
-org.eclipse.dltk.core/debug = false
 org.eclipse.dltk.core/debugIndex = false
 org.eclipse.dltk.core/debugParser = false
 org.eclipse.dltk.core/debugSelection = false
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/AbstractLanguageToolkit.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/AbstractLanguageToolkit.java
index 0e80af7..10a8232 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/AbstractLanguageToolkit.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/AbstractLanguageToolkit.java
@@ -23,10 +23,6 @@
 		return true;
 	}
 
-	public String getDelimeterReplacerString() {
-		return ".";
-	}
-
 	public IType[] getParentTypes(IType type) {
 		return null;
 	}
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/IDLTKLanguageToolkit.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/IDLTKLanguageToolkit.java
index 6c49978..0157184 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/IDLTKLanguageToolkit.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/IDLTKLanguageToolkit.java
@@ -11,9 +11,6 @@
 
 import org.eclipse.core.runtime.IPath;
 
-/**
- * 
- */
 public interface IDLTKLanguageToolkit {
 
 	/**
@@ -32,9 +29,5 @@
 
 	String getNatureId();
 
-	String getDelimeterReplacerString();
-
-	String[] getLanguageFileExtensions();
-
 	String getLanguageName();
 }
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/PreferencesLookupDelegate.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/PreferencesLookupDelegate.java
index 73e4a76..b3b1c57 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/PreferencesLookupDelegate.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/PreferencesLookupDelegate.java
@@ -50,6 +50,10 @@
 		this.contexts = getLookupScopes(project);
 	}
 
+	public PreferencesLookupDelegate(IScriptProject scriptProject) {
+		this((scriptProject == null) ? null : scriptProject.getProject());
+	}
+	
 	/**
 	 * Returns a string preference value
 	 * 
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ScriptModelUtil.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ScriptModelUtil.java
index 72dfe19..7276f9e 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ScriptModelUtil.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/ScriptModelUtil.java
@@ -11,6 +11,9 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
 import org.eclipse.dltk.compiler.CharOperation;
 import org.eclipse.dltk.core.search.IDLTKSearchConstants;
 import org.eclipse.dltk.core.search.IDLTKSearchScope;
@@ -177,11 +180,21 @@
 			// Check for already specified extension in newMainName.
 			IDLTKLanguageToolkit languageToolkit = DLTKLanguageManager
 					.getLanguageToolkit(cu);
-			String[] languageFileExtensions = languageToolkit.getLanguageFileExtensions();
-			for (int i = 0; i < languageFileExtensions.length; i++) {
-				if( newMainName.endsWith(languageFileExtensions[i] ) ) {
-					// Return extension is OK.
-					return newMainName;
+
+			String contentType = languageToolkit.getLanguageContentType();
+			IContentTypeManager manager = Platform.getContentTypeManager();
+			IContentType type = manager.getContentType(contentType);
+			String[] languageFileExtensions = null;
+			if (type != null) {
+				languageFileExtensions = type
+						.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+			}
+			if (languageFileExtensions != null) {
+				for (int i = 0; i < languageFileExtensions.length; i++) {
+					if (newMainName.endsWith(languageFileExtensions[i])) {
+						// Return extension is OK.
+						return newMainName;
+					}
 				}
 			}
 		} catch (CoreException e) {
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/NewInstanceClassBasedDLTKExtensionManager.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/NewInstanceClassBasedDLTKExtensionManager.java
index d028a8e..92ac7c0 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/NewInstanceClassBasedDLTKExtensionManager.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/NewInstanceClassBasedDLTKExtensionManager.java
@@ -11,6 +11,7 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.dltk.core.DLTKCore;
 import org.eclipse.dltk.core.PriorityClassDLTKExtensionManager;
 
 public class NewInstanceClassBasedDLTKExtensionManager extends
@@ -28,8 +29,9 @@
 				return object;
 			}
 		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			if (DLTKCore.DEBUG) {
+				e.printStackTrace();
+			}
 		}
 		return null;
 	}
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/ProjectFragment.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/ProjectFragment.java
index 7c4a1cd..594b55e 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/ProjectFragment.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/ProjectFragment.java
@@ -21,8 +21,6 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.dltk.core.DLTKCore;
-import org.eclipse.dltk.core.IBuildpathContainer;
 import org.eclipse.dltk.core.IBuildpathEntry;
 import org.eclipse.dltk.core.IModelElement;
 import org.eclipse.dltk.core.IModelStatusConstants;
@@ -360,22 +358,14 @@
 	 */
 	public IBuildpathEntry getRawBuildpathEntry() throws ModelException {
 		IBuildpathEntry rawEntry = null;
-		ScriptProject project = (ScriptProject) this.getScriptProject();
-		project.getResolvedBuildpath(true/*ignoreUnresolvedEntry*/, false/*don't generateMarkerOnError*/, false/*don't returnResolutionInProgress*/); // force the reverse rawEntry cache to be populated
-										// be populated
-		Map resolvedPathToRawEntries = project.getPerProjectInfo().resolvedPathToRawEntries;
-		if (resolvedPathToRawEntries != null) {
-			rawEntry = (IBuildpathEntry) resolvedPathToRawEntries.get(this.getPath());
-			//try to guest map from internal element.
-			if( rawEntry != null && rawEntry.getEntryKind() == IBuildpathEntry.BPE_CONTAINER ) {
-				IBuildpathContainer container = DLTKCore.getBuildpathContainer(rawEntry.getPath(), project);
-				IBuildpathEntry entrys[] = container.getBuildpathEntries();
-				for( int i = 0; i < entrys.length; ++i ) {
-					if( entrys[i].getPath().equals(this.getPath())) {
-						return entrys[i];
-					}
-				}
-			}
+		ScriptProject project = (ScriptProject)this.getScriptProject();
+		project.getResolvedBuildpath(); // force the reverse rawEntry cache to be populated
+		Map rootPathToRawEntries = project.getPerProjectInfo().resolvedPathToRawEntries;
+		if (rootPathToRawEntries != null) {
+			rawEntry = (IBuildpathEntry) rootPathToRawEntries.get(this.getPath());
+		}
+		if (rawEntry == null) {
+			throw new ModelException(new ModelStatus(IModelStatusConstants.ELEMENT_NOT_ON_BUILDPATH, this));
 		}
 		return rawEntry;
 	}
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceModuleInfoCache.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceModuleInfoCache.java
index 2bf793a..787adc6 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceModuleInfoCache.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/SourceModuleInfoCache.java
@@ -34,11 +34,11 @@
 	static long allAccess = 0;
 	static long miss = 0;
 	static long closes = 0;
-	
+
 	public SourceModuleInfoCache() {
 		// set the size of the caches in function of the maximum amount of
 		// memory available
-//		long maxMemory = Runtime.getRuntime().freeMemory();
+		// long maxMemory = Runtime.getRuntime().freeMemory();
 		// if max memory is infinite, set the ratio to 4d which corresponds to
 		// the 256MB that Eclipse defaults to
 		// (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=111299)
@@ -46,8 +46,8 @@
 
 		this.cache = new ElementCache(
 				(int) (ModelCache.DEFAULT_ROOT_SIZE * ratio));
-		this.cache.setLoadFactor( 0.90 );
-		this.cache.addListener(new IElementCacheListener(){
+		this.cache.setLoadFactor(0.90);
+		this.cache.addListener(new IElementCacheListener() {
 			public void close(Object element) {
 				closes++;
 			}
@@ -58,10 +58,10 @@
 	public void stop() {
 		DLTKCore.removeElementChangedListener(changedListener);
 	}
-	
+
 	public ISourceModuleInfo get(ISourceModule module) {
 		Object object = this.cache.get(module);
-		if (DLTKCore.VERBOSE ) {
+		if (DLTKCore.VERBOSE) {
 			System.out.println("Filling ratio:" + this.cache.fillingRatio());
 		}
 		allAccess++;
@@ -71,13 +71,15 @@
 		}
 		SoftReference ref = (SoftReference) object;
 		ISourceModuleInfo info = (ISourceModuleInfo) ref.get();
-		if( info == null ) {
+		if (info == null) {
 			miss++;
 			return returnAdd(module);
 		}
-//		this.cache.printStats();
-		if(DLTKCore.PERFOMANCE) {
-			System.out.println("SourceModuleInfoCache: access:" + allAccess + " ok:" + ( 100.0f * (allAccess - miss ) / allAccess) + "% closes:" + closes );
+		// this.cache.printStats();
+		if (DLTKCore.PERFOMANCE) {
+			System.out.println("SourceModuleInfoCache: access:" + allAccess
+					+ " ok:" + (100.0f * (allAccess - miss) / allAccess)
+					+ "% closes:" + closes);
 			System.out.println("Filling ratio:" + this.cache.fillingRatio());
 		}
 		return (ISourceModuleInfo) info;
@@ -100,10 +102,11 @@
 		private void processDelta(IModelElementDelta delta) {
 			IModelElement element = delta.getElement();
 			if (delta.getKind() == IModelElementDelta.REMOVED
-					|| (delta.getFlags() & IModelElementDelta.F_REMOVED_FROM_BUILDPATH) != 0 
-					|| ( delta.getFlags() & IModelElementDelta.CHANGED) != 0 ) {
+					|| delta.getKind() == IModelElementDelta.CHANGED
+					|| (delta.getFlags() & IModelElementDelta.F_REMOVED_FROM_BUILDPATH) != 0
+					|| (delta.getFlags() & IModelElementDelta.CHANGED) != 0) {
 				if (element.getElementType() == IModelElement.SOURCE_MODULE) {
-					SourceModuleInfoCache.this.remove((ISourceModule)element);
+					SourceModuleInfoCache.this.remove((ISourceModule) element);
 				}
 			}
 			if ((delta.getFlags() & IModelElementDelta.F_CHILDREN) != 0) {
@@ -141,7 +144,7 @@
 		}
 
 		public boolean isEmpty() {
-			if( this.map == null ) {
+			if (this.map == null) {
 				return true;
 			}
 			return this.map.isEmpty();
diff --git a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/mixin/MixinModel.java b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/mixin/MixinModel.java
index adf67e3..f22ebed 100644
--- a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/mixin/MixinModel.java
+++ b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/mixin/MixinModel.java
@@ -10,6 +10,7 @@
 package org.eclipse.dltk.core.mixin;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -114,28 +115,32 @@
 
 		ISourceModule[] containedModules = SearchEngine.searchMixinSources(
 				pattern, toolkit, set);
-
-		if (containedModules.length == 0) {
+		Set modules = new HashSet();
+		modules.addAll(Arrays.asList(containedModules));
+		
+		if (modules.size() == 0) {
 			return new IMixinElement[0];
 		}
 
-		long start = System.currentTimeMillis();
-		for (int i = 0; i < containedModules.length; ++i) {
-			reportModule(containedModules[i]);
-			if (delta != -1) {
-				if (System.currentTimeMillis() - start > delta) {
-//					System.out.println("Mixin timeout break:"
-//							+ Long.toString(System.currentTimeMillis() - start)
-//							+ ":"
-//							+ Integer.toString(containedModules.length - i));
-					break;
-				}
-			}
+		// long start = System.currentTimeMillis();
+		// for (int i = 0; i < containedModules.length; ++i) {
+		for (Iterator iterator = modules.iterator(); iterator.hasNext();) {
+			ISourceModule module = (ISourceModule) iterator.next();
+			reportModule(module);
+			// if (delta != -1) {
+			// // if (System.currentTimeMillis() - start > delta) {
+			// // System.out.println("Mixin timeout break:"
+			// // + Long.toString(System.currentTimeMillis() - start)
+			// // + ":"
+			// // + Integer.toString(containedModules.length - i));
+			// // break;
+			// // }
+			// }
 		}
 
 		List result = new ArrayList();
 
-//		int i = 0;
+		// int i = 0;
 		for (Iterator iterator = set.keySet().iterator(); iterator.hasNext();) {
 			ISourceModule module = (ISourceModule) iterator.next();
 			if (this.elementToMixinCache.containsKey(module)) {
@@ -144,13 +149,14 @@
 					String key = (String) iterator2.next();
 					MixinElement element = getCreateEmpty(key);
 					markElementAsFinal(element);
-					result.add( element);
+					result.add(element);
 					existKeysCache.add(key);
 				}
 			}
 		}
 
-		return (IMixinElement[]) result.toArray(new IMixinElement[result.size()]);
+		return (IMixinElement[]) result
+				.toArray(new IMixinElement[result.size()]);
 	}
 
 	public IMixinElement[] find(String pattern) {
@@ -569,8 +575,7 @@
 				}
 				return objs;
 			}
-			if (o != null)
-			{
+			if (o != null) {
 				notifyInitializeListener(this, module, o);
 				return new Object[] { o };
 			}