* indexing fixes
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/DeltaProcessor.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/DeltaProcessor.java
index 93e9b07..40d1dff 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/DeltaProcessor.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/DeltaProcessor.java
@@ -2191,7 +2191,7 @@
 										fragment.getPath(),
 										new Long(newTimeStamp));
 								// index new library
-								ProjectIndexerManager.indexLibrary(
+								ProjectIndexerManager.indexProjectFragment(
 										scriptProject, fragment.getPath());
 								if (fragment instanceof Openable) {
 									this.elementAdded((Openable) fragment,
@@ -2203,7 +2203,7 @@
 							if (newTimeStamp == 0) {
 								this.state.getCustomTimeStamps().remove(
 										fragment.getPath());
-								ProjectIndexerManager.removeLibrary(
+								ProjectIndexerManager.removeProjectFragment(
 										scriptProject, fragment.getPath());
 								if (fragment instanceof Openable) {
 									this.elementRemoved((Openable) fragment,
@@ -2215,7 +2215,7 @@
 										fragment.getPath(),
 										new Long(newTimeStamp));
 								// index new library
-								ProjectIndexerManager.indexLibrary(
+								ProjectIndexerManager.indexProjectFragment(
 										scriptProject, fragment.getPath());
 								if (fragment instanceof Openable) {
 									this.contentChanged((Openable) fragment);
diff --git a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/IndexManager.java b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/IndexManager.java
index 3394f5e..1d018eb 100644
--- a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/IndexManager.java
+++ b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/IndexManager.java
@@ -35,6 +35,7 @@
 import org.eclipse.dltk.core.IProjectFragment;
 import org.eclipse.dltk.core.IScriptProject;
 import org.eclipse.dltk.core.ISourceElementParser;
+import org.eclipse.dltk.core.ModelException;
 import org.eclipse.dltk.core.environment.IFileHandle;
 import org.eclipse.dltk.core.search.BasicSearchEngine;
 import org.eclipse.dltk.core.search.IDLTKSearchScope;
@@ -42,6 +43,7 @@
 import org.eclipse.dltk.core.search.index.Index;
 import org.eclipse.dltk.core.search.index.MixinIndex;
 import org.eclipse.dltk.internal.core.Model;
+import org.eclipse.dltk.internal.core.ModelManager;
 import org.eclipse.dltk.internal.core.ScriptProject;
 import org.eclipse.dltk.internal.core.search.PatternSearchJob;
 import org.eclipse.dltk.internal.core.search.ProjectIndexerManager;
@@ -317,7 +319,7 @@
 				// should only be reachable for query jobs
 				// IF you put an index in the cache, then AddArchiveFileToIndex
 				// fails because it thinks there is nothing to do
-				if (!createIfMissing && !mixin) {
+				if (!createIfMissing) {
 					this.rebuildIndex(indexLocation, containerPath);
 					return null;
 				}
@@ -524,30 +526,35 @@
 			return;
 		}
 
-		Object target = Model.getTarget(workspace.getRoot(), containerPath,
-				true);
+		String cp = containerPath.toString();
+		if (cp.startsWith(SPECIAL_MIXIN)) {
+			cp = cp.substring(SPECIAL_MIXIN.length());
+		}
+		Path pathCP = new Path(cp);
+
+		Object target = Model.getTarget(workspace.getRoot(), pathCP, true);
 		// Try to search for specified container path using model
-		// if (target == null || target instanceof IFileHandle) {
-		// try {
-		// IScriptProject[] scriptProjects = ModelManager
-		// .getModelManager().getModel().getScriptProjects();
-		// for (IScriptProject project : scriptProjects) {
-		// IProjectFragment[] fragments = project
-		// .getProjectFragments();
-		// for (IProjectFragment fragment : fragments) {
-		// if (fragment.getPath().equals(containerPath)) {
-		// target = fragment;
-		// break;
-		// }
-		// }
-		// if (target != null) {
-		// break;
-		// }
-		// }
-		// } catch (ModelException e) {
-		// DLTKCore.error("Failed to obtain list of DLTK projects", e);
-		// }
-		// }
+		if (target == null || target instanceof IFileHandle) {
+			try {
+				IScriptProject[] scriptProjects = ModelManager
+						.getModelManager().getModel().getScriptProjects();
+				for (IScriptProject project : scriptProjects) {
+					IProjectFragment[] fragments = project
+							.getProjectFragments();
+					for (IProjectFragment fragment : fragments) {
+						if (fragment.getPath().equals(pathCP)) {
+							target = fragment;
+							break;
+						}
+					}
+					if (target != null) {
+						break;
+					}
+				}
+			} catch (ModelException e) {
+				DLTKCore.error("Failed to obtain list of DLTK projects", e);
+			}
+		}
 		if (target == null) {
 			return;
 		}
@@ -567,8 +574,7 @@
 			}
 		} else if (target instanceof IProjectFragment) {
 			ProjectIndexerManager.indexProjectFragment(
-					((IProjectFragment) target).getScriptProject(),
-					containerPath);
+					((IProjectFragment) target).getScriptProject(), pathCP);
 			return;
 		} else if (target instanceof IFile) {
 			// request = new AddArchiveFileToIndex((IFile) target, this);
diff --git a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/core/AbstractProjectIndexer.java b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/core/AbstractProjectIndexer.java
index d0abbf2..dcc5123 100644
--- a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/core/AbstractProjectIndexer.java
+++ b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/core/search/indexing/core/AbstractProjectIndexer.java
@@ -21,6 +21,7 @@
 import org.eclipse.dltk.core.IProjectFragment;
 import org.eclipse.dltk.core.IScriptProject;
 import org.eclipse.dltk.core.ISourceModule;
+import org.eclipse.dltk.core.ModelException;
 import org.eclipse.dltk.core.search.SearchEngine;
 import org.eclipse.dltk.core.search.SearchParticipant;
 import org.eclipse.dltk.core.search.index.Index;
@@ -79,8 +80,26 @@
 	}
 
 	public void indexProjectFragment(IScriptProject project, IPath path) {
-		// TODO optimize
-		requestIfNotWaiting(new ProjectRequest(this, project, true));
+		IProjectFragment fragmentToIndex = null;
+		try {
+			IProjectFragment[] fragments = project.getProjectFragments();
+			for (IProjectFragment fragment : fragments) {
+				if (fragment.getPath().equals(path)) {
+					fragmentToIndex = fragment;
+					break;
+				}
+			}
+		} catch (ModelException e) {
+			DLTKCore.error("Failed to index fragment:" + path.toString(), e);
+		}
+		if (fragmentToIndex == null || !fragmentToIndex.isExternal()
+				|| fragmentToIndex.isBuiltin()) {
+			requestIfNotWaiting(new ProjectRequest(this, project, true));
+			return;
+		}
+		requestIfNotWaiting(new ExternalProjectFragmentRequest(this,
+				fragmentToIndex, DLTKLanguageManager
+						.getLanguageToolkit(project)));
 	}
 
 	public void indexSourceModule(ISourceModule module,