further work on FELIX-1355, also tidied up repository preferences as part of FELIX-1649


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@990188 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/sigil/eclipse/core/plugin.xml b/sigil/eclipse/core/plugin.xml
index 18487fd..8e61c12 100644
--- a/sigil/eclipse/core/plugin.xml
+++ b/sigil/eclipse/core/plugin.xml
@@ -65,7 +65,7 @@
    <extension
          point="org.eclipse.core.runtime.preferences">
       <initializer
-            class="org.apache.felix.sigil.eclipse.preferences.SigilPreferencesInitializer">
+            class="org.apache.felix.sigil.eclipse.internal.preferences.SigilPreferencesInitializer">
       </initializer>
    </extension>
    <extension
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
index cfefb58..4cfbbc6 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
@@ -44,14 +44,14 @@
 import org.apache.felix.sigil.eclipse.internal.install.OSGiInstallManager;
 import org.apache.felix.sigil.eclipse.internal.model.project.SigilModelRoot;
 import org.apache.felix.sigil.eclipse.internal.model.project.SigilProject;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryPreferences;
 import org.apache.felix.sigil.eclipse.internal.repository.eclipse.GlobalRepositoryManager;
 import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryMap;
 import org.apache.felix.sigil.eclipse.internal.resources.ProjectResourceListener;
 import org.apache.felix.sigil.eclipse.internal.resources.SigilProjectManager;
 import org.apache.felix.sigil.eclipse.model.project.ISigilModelRoot;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
 import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
 import org.eclipse.core.resources.ICommand;
 import org.eclipse.core.resources.IProject;
@@ -145,7 +145,7 @@
     private ServiceTracker descriptorTracker;
     private ServiceTracker registryTracker;
     private ServiceTracker serializerTracker;
-    private static IRepositoryConfiguration repositoryConfig;
+    private static IRepositoryPreferences repositoryPrefs;
     private static SigilProjectManager projectManager;
     private static OSGiInstallManager installs;
     private static ISigilModelRoot modelRoot;
@@ -270,7 +270,7 @@
 
         modelRoot = new SigilModelRoot();
 
-        repositoryConfig = new RepositoryConfiguration();
+        repositoryPrefs = new RepositoryPreferences();
 
         installs = new OSGiInstallManager();
 
@@ -428,23 +428,24 @@
         if ( model == null ) return globalRepositoryManager;
         try
         {
-            return model.getRepositoryManager(repositoryMap);
+            return projectManager.getRepositoryManager(model, repositoryMap);
         }
         catch (CoreException e)
         {
-            warn("Failed to build repository manager for " + model, e);
+            SigilCore.error("Failed to read repository config", e);
             return globalRepositoryManager;
-        }
+        }        
     }
 
-    public static IRepositoryConfiguration getRepositoryConfiguration()
+    public static IRepositoryPreferences getRepositoryPreferences()
     {
-        return repositoryConfig;
+        return repositoryPrefs;
     }
 
     public static void rebuildAllBundleDependencies(IProgressMonitor monitor)
     {
         Collection<ISigilProjectModel> projects = getRoot().getProjects();
+        
         if (!projects.isEmpty())
         {
             SubMonitor progress = SubMonitor.convert(monitor, projects.size() * 20);
@@ -480,7 +481,7 @@
     {
         try
         {
-            dependent.resetClasspath(progress.newChild(10));
+            dependent.resetClasspath(progress.newChild(10), false);
             dependent.getProject().build(IncrementalProjectBuilder.FULL_BUILD,
                 progress.newChild(10));
         }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
index 3c8a5eb..97fe428 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
@@ -93,7 +93,7 @@
                         else if (element instanceof ILibraryImport)
                         {
                             ILibraryImport l = (ILibraryImport) element;
-                            ILibrary lib = SigilCore.getRepositoryManager(sigil).resolveLibrary(
+                            ILibrary lib = sigil.getRepositoryManager().resolveLibrary(
                                 l);
 
                             if (lib != null)
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
index 2bbd0ef..1138a84 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
@@ -51,9 +51,7 @@
 import org.apache.felix.sigil.common.repository.ResolutionException;
 import org.apache.felix.sigil.eclipse.PathUtil;
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.EclipseRepositoryManager;
 import org.apache.felix.sigil.eclipse.job.ThreadProgressMonitor;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
 import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
 import org.apache.felix.sigil.eclipse.progress.ProgressAdapter;
@@ -178,7 +176,7 @@
     {
         SubMonitor progress = SubMonitor.convert(monitor, 100);
 
-        IRepositoryManager manager = SigilCore.getRepositoryManager(this);
+        IRepositoryManager manager = getRepositoryManager();
         ResolutionConfig config = new ResolutionConfig(ResolutionConfig.INCLUDE_OPTIONAL
             | ResolutionConfig.IGNORE_ERRORS);
 
@@ -444,8 +442,12 @@
         return "SigilProject[" + getSymbolicName() + ":" + getVersion() + "]";
     }
 
-    public void resetClasspath(IProgressMonitor monitor) throws CoreException
+    public void resetClasspath(IProgressMonitor monitor, boolean forceResolve) throws CoreException
     {
+        if (forceResolve) {
+            processRequirementsChanges(monitor);
+        }
+        
         Path containerPath = new Path(SigilCore.CLASSPATH_CONTAINER_PATH);
         IJavaProject java = getJavaModel();
         ClasspathContainerInitializer init = JavaCore.getClasspathContainerInitializer(SigilCore.CLASSPATH_CONTAINER_PATH);
@@ -493,7 +495,7 @@
                     IRequiredBundle rb = (IRequiredBundle) element;
                     try
                     {
-                        IRepositoryManager manager = SigilCore.getRepositoryManager(SigilProject.this);
+                        IRepositoryManager manager = SigilProject.this.getRepositoryManager();
                         ResolutionConfig config = new ResolutionConfig(
                             ResolutionConfig.IGNORE_ERRORS);
                         IResolution res = manager.getBundleResolver().resolve(rb, config,
@@ -683,12 +685,6 @@
         }
     }
     
-    public IRepositoryManager getRepositoryManager(IRepositoryMap repositoryMap) throws CoreException {
-        IRepositoryConfig config = getRepositoryConfig();
-        config = new EclipseRepositoryConfig(config);
-        return new EclipseRepositoryManager(config, repositoryMap);
-    }
-    
     public boolean isInBundleClasspath(IPackageFragment root) throws JavaModelException
     {
         if (getBundle().getClasspathEntrys().isEmpty())
@@ -712,4 +708,12 @@
             return getBundle().getClasspathEntrys().contains(enc.trim());
         }
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel#getRepositoryManager()
+     */
+    public IRepositoryManager getRepositoryManager()
+    {
+        return SigilCore.getRepositoryManager(this);
+    }
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryConfiguration.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
similarity index 73%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryConfiguration.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
index 4a8366e..7eb22f3 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryConfiguration.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
@@ -23,6 +23,8 @@
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -30,11 +32,9 @@
 import java.util.UUID;
 
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.apache.felix.sigil.eclipse.model.repository.RepositorySet;
 import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -48,19 +48,21 @@
 import org.eclipse.swt.graphics.Image;
 import org.osgi.framework.Bundle;
 
-public class RepositoryConfiguration implements IRepositoryConfiguration
+public class RepositoryPreferences implements IRepositoryPreferences
 {
 
     private static final String REPOSITORY = "repository.";
-    private static final String REPOSITORY_SET = REPOSITORY + "set.";
-    private static final String REPOSITORY_SETS = REPOSITORY + "sets";
-    private static final String REPOSITORY_TIMESTAMP = REPOSITORY + "timestamp";
+    private static final String REPOSITORY_ORDER = REPOSITORY + "order";
     private static final String INSTANCES = ".instances";
     private static final String NAME = ".name";
     private static final String LOC = ".loc";
     private static final String TIMESTAMP = ".timestamp";
 
-    public static final String REPOSITORY_DEFAULT_SET = REPOSITORY + "default.set";
+    private static final HashMap<String, String> migrationTable = new HashMap<String, String>();
+    
+    static {
+        migrationTable.put("org.apache.felix.sigil.core.file", "filesystem");
+    }
 
     public List<IRepositoryModel> loadRepositories()
     {
@@ -91,6 +93,27 @@
             }
 
         }
+        
+        final List<String> order = PrefsUtils.stringToList(prefs.getString(REPOSITORY_ORDER));
+        
+        Collections.sort(repositories, new Comparator<IRepositoryModel>() {
+            public int compare(IRepositoryModel o1, IRepositoryModel o2)
+            {
+                int i1 = order.indexOf(o1.getId());
+                int i2 = order.indexOf(o2.getId());
+                
+                if ( i1 < i2 ) {
+                    return -1;
+                }
+                else if ( i1 > i2 ) {
+                    return 1;
+                }
+                else {
+                    return 0;
+                }
+            }
+            
+        });
 
         return repositories;
     }
@@ -118,9 +141,23 @@
         saveRepositoryPreferences(repositories, mapped);
         createNewEntries(mapped, prefs);
         deleteOldEntries(repositories, prefs);
-        // time stamp is used as a signal to the manager
-        // to update its view of the stored repositories
-        timeStamp(prefs);
+        // do this last as it is a signal to preferences
+        // listeners to read repo config
+        setRepositoryOrder(repositories, prefs);
+    }
+
+    /**
+     * @param repositories
+     * @param prefs
+     */
+    private void setRepositoryOrder(List<IRepositoryModel> repositories,
+        IPreferenceStore prefs)
+    {        
+        ArrayList<String> ids = new ArrayList<String>();
+        for(IRepositoryModel model : repositories) {
+            ids.add(model.getId());
+        }
+        prefs.setValue(REPOSITORY_ORDER, PrefsUtils.listToString(ids));
     }
 
     public List<RepositoryType> loadRepositoryTypes()
@@ -139,7 +176,7 @@
                 String type = c.getAttribute("type");
                 boolean dynamic = Boolean.valueOf(c.getAttribute("dynamic"));
                 String icon = c.getAttribute("icon");
-                String provider = c.getAttribute("alias");
+                String provider = c.getAttribute("alias");                
                 Image image = (icon == null || icon.trim().length() == 0) ? null
                     : loadImage(e, icon);
                 repositories.add(new RepositoryType(id, provider, type, dynamic, image));
@@ -159,117 +196,6 @@
         return element;
     }
 
-    public IRepositorySet getDefaultRepositorySet()
-    {
-        ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-        for (String s : PrefsUtils.stringToArray(getPreferences().getString(
-            REPOSITORY_DEFAULT_SET)))
-        {
-            IRepositoryModel rep = findRepository(s);
-            if (rep == null)
-            {
-                SigilCore.error("Missing repository for " + s);
-            }
-            else
-            {
-                reps.add(rep);
-            }
-        }
-        return new RepositorySet(reps);
-    }
-
-    public IRepositorySet getRepositorySet(String name)
-    {
-        String key = REPOSITORY_SET + name;
-        if (getPreferences().contains(key))
-        {
-            ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-            for (String s : PrefsUtils.stringToArray(getPreferences().getString(key)))
-            {
-                IRepositoryModel rep = findRepository(s);
-                if (rep == null)
-                {
-                    throw new IllegalStateException("Missing repository for " + s);
-                }
-                reps.add(rep);
-            }
-            return new RepositorySet(reps);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public Map<String, IRepositorySet> loadRepositorySets()
-    {
-        IPreferenceStore store = getPreferences();
-
-        HashMap<String, IRepositorySet> sets = new HashMap<String, IRepositorySet>();
-
-        for (String name : PrefsUtils.stringToArray(store.getString(REPOSITORY_SETS)))
-        {
-            String key = REPOSITORY_SET + name;
-            ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-            for (String s : PrefsUtils.stringToArray(getPreferences().getString(key)))
-            {
-                reps.add(findRepository(s));
-            }
-            sets.put(name, new RepositorySet(reps));
-        }
-
-        return sets;
-    }
-
-    public void saveRepositorySets(Map<String, IRepositorySet> sets)
-    {
-        IPreferenceStore store = getPreferences();
-
-        ArrayList<String> names = new ArrayList<String>();
-
-        for (Map.Entry<String, IRepositorySet> set : sets.entrySet())
-        {
-            String name = set.getKey();
-            String key = REPOSITORY_SET + name;
-            ArrayList<String> ids = new ArrayList<String>();
-            for (IRepositoryModel m : set.getValue().getRepositories())
-            {
-                ids.add(m.getId());
-            }
-            store.setValue(key, PrefsUtils.listToString(ids));
-            names.add(name);
-        }
-
-        for (String name : PrefsUtils.stringToArray(store.getString(REPOSITORY_SETS)))
-        {
-            if (!names.contains(name))
-            {
-                String key = REPOSITORY_SET + name;
-                store.setToDefault(key);
-            }
-        }
-
-        store.setValue(REPOSITORY_SETS, PrefsUtils.listToString(names));
-        timeStamp(store);
-    }
-
-    public void setDefaultRepositorySet(IRepositorySet defaultSet)
-    {
-        ArrayList<String> ids = new ArrayList<String>();
-        for (IRepositoryModel m : defaultSet.getRepositories())
-        {
-            ids.add(m.getId());
-        }
-        IPreferenceStore prefs = getPreferences();
-        prefs.setValue(REPOSITORY_DEFAULT_SET, PrefsUtils.listToString(ids));
-        timeStamp(prefs);
-    }
-
-    private void timeStamp(IPreferenceStore prefs)
-    {
-        prefs.setValue(REPOSITORY_TIMESTAMP, System.currentTimeMillis());
-    }
-
     private IPreferenceStore getPreferences()
     {
         return SigilCore.getDefault().getPreferenceStore();
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/SigilPreferencesInitializer.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
similarity index 80%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/SigilPreferencesInitializer.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
index 7dbfc0d..f0fdaca 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/SigilPreferencesInitializer.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
@@ -17,11 +17,12 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.preferences;
+package org.apache.felix.sigil.eclipse.internal.preferences;
 
 import org.apache.felix.sigil.common.osgi.VersionRangeBoundingRule;
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
+import org.apache.felix.sigil.eclipse.preferences.PromptablePreference;
 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
 import org.eclipse.jface.preference.IPreferenceStore;
 
@@ -35,7 +36,15 @@
     public void initializeDefaultPreferences()
     {
         IPreferenceStore store = SigilCore.getDefault().getPreferenceStore();
+        setUpDefaults(store);
+        migrateOldPreferences(store);
+    }
 
+    /**
+     * @param store
+     */
+    private void setUpDefaults(IPreferenceStore store)
+    {
         store.setDefault(SigilCore.OSGI_INSTALL_CHECK_PREFERENCE, true);
 
         store.setDefault(SigilCore.DEFAULT_VERSION_LOWER_BOUND,
@@ -54,7 +63,14 @@
         store.setDefault(SigilCore.PREFERENCES_REBUILD_PROJECTS,
             PromptablePreference.Prompt.name());
 
-        store.setDefault(RepositoryConfiguration.REPOSITORY_DEFAULT_SET,
+        store.setDefault("repository.order",
             "org.apache.felix.sigil.core.workspaceprovider");
     }
+    
+    /**
+     * @param store
+     */
+    private void migrateOldPreferences(IPreferenceStore store)
+    {
+    }
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java
index a1a8b09..7e4c21c 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java
@@ -19,27 +19,17 @@
 
 package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
 
-import java.util.List;
-
 import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.internal.repository.eclipse.SigilRepositoryManager;
 import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryMap;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
 
 public class GlobalRepositoryManager extends SigilRepositoryManager implements IRepositoryManager
 {
 
     public GlobalRepositoryManager(RepositoryMap map)
     {
-        super(null, map);
+        super(map);
     }
 
-    @Override
-    protected IRepositoryModel[] findRepositories()
-    {
-        List<IRepositoryModel> repos = SigilCore.getRepositoryConfiguration().loadRepositories();
-        return repos.toArray(new IRepositoryModel[repos.size()]);
-    }
 
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java
index cf74d3c..d6fb658 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java
@@ -24,6 +24,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Properties;
 
 import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
@@ -33,9 +34,8 @@
 import org.apache.felix.sigil.common.repository.RepositoryException;
 import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryMap;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap.RepositoryCache;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryMap.RepositoryCache;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -50,13 +50,10 @@
 public class SigilRepositoryManager extends AbstractRepositoryManager implements IRepositoryManager, IPropertyChangeListener
 {
 
-    private final String repositorySet;
-
     private RepositoryMap cachedRepositories;
 
-    public SigilRepositoryManager(String repositorySet, RepositoryMap cachedRepositories)
+    public SigilRepositoryManager(RepositoryMap cachedRepositories)
     {
-        this.repositorySet = repositorySet;
         this.cachedRepositories = cachedRepositories;
     }
 
@@ -84,7 +81,7 @@
         ArrayList<IBundleRepository> repos = new ArrayList<IBundleRepository>();
         HashSet<String> ids = new HashSet<String>();
 
-        IRepositoryModel[] models = findRepositories();
+        List<IRepositoryModel> models = findRepositories();
         for (IRepositoryModel repo : models)
         {
             try
@@ -141,26 +138,9 @@
         return null;
     }
 
-    protected IRepositoryModel[] findRepositories()
+    protected List<IRepositoryModel> findRepositories()
     {
-        if (repositorySet == null)
-        {
-            return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
-        }
-        else
-        {
-            IRepositorySet set = SigilCore.getRepositoryConfiguration().getRepositorySet(
-                repositorySet);
-            if (set == null)
-            {
-                SigilCore.error("Unknown repository set " + repositorySet);
-                return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
-            }
-            else
-            {
-                return set.getRepositories();
-            }
-        }
+        return SigilCore.getRepositoryPreferences().loadRepositories();
     }
 
     private IBundleRepository loadRepository(String id, Properties pref,
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryConfig.java
similarity index 66%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryConfig.java
index 5270fd0..1846846 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryConfig.java
@@ -17,16 +17,14 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.internal.model.project;
+package org.apache.felix.sigil.eclipse.internal.repository.manager;
 
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Properties;
 
 import org.apache.felix.sigil.common.config.IRepositoryConfig;
@@ -52,8 +50,8 @@
      */
     public List<String> getAllRepositories()
     {
-        ArrayList<String> list = new ArrayList<String>(readRepositories().keySet());
-        list.addAll(projectConfig.getAllRepositories());
+        ArrayList<String> list = new ArrayList<String>(projectConfig.getAllRepositories());
+        list.addAll(readRepositoryNames());
         return list;
     }
 
@@ -63,8 +61,8 @@
     public Properties getRepositoryConfig(String name)
     {
         Properties props = projectConfig.getRepositoryConfig(name);
-        if ( props.isEmpty() ) {
-            props = readRepositories().get(name);
+        if ( props == null ) {
+            props = readRepositoryConfig(name);
         }
         return props;
     }
@@ -76,7 +74,7 @@
     {
         URI def = projectConfig.getRepositoryDefinition(name);
         if ( def == null ) {
-            if ( readRepositories().containsKey(name) ) {
+            if ( readRepositoryNames().contains(name) ) {
                 def = URI.create("sigil:eclipse:preferences");
             }
         }
@@ -91,29 +89,48 @@
         return projectConfig.getRepositoryPath();
     }
 
-    private Map<String, Properties> readRepositories() {
-        HashMap<String, Properties> repos = new HashMap<String, Properties>();
+    /**
+     * @return
+     */
+    private static List<String> readRepositoryNames()
+    {
+        List<IRepositoryModel> models = findRepositories();
+        ArrayList<String> repos = new ArrayList<String>(models.size());
+        for (IRepositoryModel repo : models)
+        {
+            String id = repo.getId();
+            repos.add(id);
+        }
+        
+        return repos;
+    }
+
+    private static Properties readRepositoryConfig(String name) {
         IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
 
-        IRepositoryModel[] models = findRepositories();
-        for (IRepositoryModel repo : models)
+        for (IRepositoryModel repo : findRepositories())
         {
             try
             {
                 String id = repo.getId();
-                Properties pref = null;
-                if (repo.getType().isDynamic())
-                {
-                    String instance = "repository." + repo.getType().getId() + "." + id;
-                    String loc = prefs.getString(instance + ".loc");
-                    pref = loadPreferences(loc);
+                if ( name.equals(id) ) {
+                    Properties pref = null;
+                    if (repo.getType().isDynamic())
+                    {
+                        String instance = "repository." + repo.getType().getId() + "." + id;
+                        String loc = prefs.getString(instance + ".loc");
+                        pref = loadPreferences(loc);                     
+                    }
+                    else
+                    {
+                        pref = new Properties();
+                    }
+                    
+                    if (!pref.containsKey(IRepositoryConfig.REPOSITORY_PROVIDER)) {
+                        pref.put(IRepositoryConfig.REPOSITORY_PROVIDER, repo.getType().getProvider());
+                    }
+                    return pref;
                 }
-                else
-                {
-                    pref = new Properties();
-                }
-                
-                repos.put(id, pref);
             }
             catch (IOException e)
             {
@@ -121,15 +138,16 @@
             }
         }
         
-        return repos;
+        // ok not found
+        return null;
     }
     
-    private IRepositoryModel[] findRepositories()
+    private static final List<IRepositoryModel> findRepositories()
     {
-        return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
+        return SigilCore.getRepositoryPreferences().loadRepositories();
     }
     
-    private Properties loadPreferences(String loc) throws FileNotFoundException,
+    private static final Properties loadPreferences(String loc) throws FileNotFoundException,
     IOException
     {
         FileInputStream in = null;
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
index 2e081ec..fb9b46c 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
@@ -31,14 +31,16 @@
 import org.apache.felix.sigil.common.repository.IRepositoryProvider;
 import org.apache.felix.sigil.common.repository.RepositoryException;
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap.RepositoryCache;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryMap.RepositoryCache;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 
 /**
  * @author dave
  *
  */
-public class EclipseRepositoryManager extends AbstractRepositoryManager
+public class EclipseRepositoryManager extends AbstractRepositoryManager implements IPropertyChangeListener
 {
     private final IRepositoryConfig config;
     private final IRepositoryMap repositoryMap;
@@ -49,9 +51,25 @@
      */
     public EclipseRepositoryManager(IRepositoryConfig config, IRepositoryMap repositoryMap)
     {
-        this.config = config;
+        this.config = new EclipseRepositoryConfig(config);
         this.repositoryMap = repositoryMap;
     }
+    
+    @Override
+    public void initialise()
+    {
+        super.initialise();
+        SigilCore.getDefault().getPreferenceStore().addPropertyChangeListener(this);
+    }
+
+    public void destroy()
+    {
+        IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
+        if (prefs != null)
+        {
+            prefs.removePropertyChangeListener(this);
+        }
+    }    
 
     /* (non-Javadoc)
      * @see org.apache.felix.sigil.common.repository.AbstractRepositoryManager#loadRepositories()
@@ -91,12 +109,14 @@
             }
             else {
                 Properties props = config.getRepositoryConfig(name);
-                String uid = config.getRepositoryDefinition(name).toString() + name;
-                IBundleRepository repo = buildRepository(uid, name, props);
-                
-                if ( repo != null ) {
-                    list.add(repo);
-                }                
+                if (props != null) {
+                    String uid = config.getRepositoryDefinition(name).toString() + '#' + name;
+                    IBundleRepository repo = buildRepository(uid, name, props);
+                    
+                    if ( repo != null ) {
+                        list.add(repo);
+                    }
+                }
             }
         }
     }
@@ -122,6 +142,8 @@
                 SigilCore.log(msg);
             else
                 SigilCore.warn(msg);
+            
+            return null;
         }
 
         try
@@ -169,5 +191,16 @@
             throw new RepositoryException("Failed to build repositories", e);
         }
     }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+     */
+    public void propertyChange(PropertyChangeEvent event)
+    {
+        if (event.getProperty().equals("repository.order"))
+        {
+            loadRepositories();
+        }
+    }
     
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryMap.java
similarity index 95%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryMap.java
index f36a501..c2dc1fa 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryMap.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.model.project;
+package org.apache.felix.sigil.eclipse.internal.repository.manager;
 
 import java.util.Properties;
 
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
index c9158c2..f103964 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
@@ -23,7 +23,6 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
 
 public class RepositoryMap implements IRepositoryMap
 {
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
index 340f95e..340d560 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
@@ -35,11 +35,6 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 
-//import org.eclipse.core.runtime.IProgressMonitor;
-//import org.eclipse.core.runtime.IStatus;
-//import org.eclipse.core.runtime.Status;
-//import org.eclipse.core.runtime.jobs.Job;
-
 public class ProjectResourceListener implements IResourceChangeListener
 {
     public static final int EVENT_MASKS = IResourceChangeEvent.PRE_DELETE
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
index 03a8826..ad9e348 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
@@ -20,20 +20,26 @@
 
 import java.util.HashMap;
 
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
+import org.apache.felix.sigil.common.repository.IRepositoryManager;
 import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.internal.model.project.SigilProject;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.EclipseRepositoryManager;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryMap;
+import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 
 public class SigilProjectManager
 {
-    private static HashMap<IProject, SigilProject> projects = new HashMap<IProject, SigilProject>();
+    private static HashMap<IProject, ISigilProjectModel> projects = new HashMap<IProject, ISigilProjectModel>();
+    private static HashMap<ISigilProjectModel, EclipseRepositoryManager> repositoryManagers = new HashMap<ISigilProjectModel, EclipseRepositoryManager>();
 
-    public SigilProject getSigilProject(IProject project) throws CoreException
+    public ISigilProjectModel getSigilProject(IProject project) throws CoreException
     {
         if (project.hasNature(SigilCore.NATURE_ID))
         {
-            SigilProject p = null;
+            ISigilProjectModel p = null;
             synchronized (projects)
             {
                 p = projects.get(project);
@@ -54,9 +60,35 @@
 
     public void flushSigilProject(IProject project)
     {
-        synchronized (project)
+        synchronized (projects)
         {
-            projects.remove(project);
+            ISigilProjectModel model = projects.remove(project);
+            if ( model != null ) {
+                EclipseRepositoryManager manager = repositoryManagers.remove(model);
+                manager.destroy();           
+            }            
+        }
+    }
+
+    /**
+     * @param model
+     * @param repositoryMap 
+     * @throws CoreException 
+     */
+    public IRepositoryManager getRepositoryManager(ISigilProjectModel model, IRepositoryMap repositoryMap) throws CoreException
+    {
+        synchronized( projects ) {
+            EclipseRepositoryManager manager = repositoryManagers.get(model);
+            
+            if ( manager == null ) {
+                IRepositoryConfig config = model.getRepositoryConfig();
+                
+                manager = new EclipseRepositoryManager(config, repositoryMap);
+                
+                repositoryManagers.put(model, manager);
+            }
+            
+            return manager;
         }
     }
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
index 0d53a03..8fc7cba 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
@@ -95,7 +95,7 @@
      */
     IJavaProject getJavaModel();
 
-    void resetClasspath(IProgressMonitor monitor) throws CoreException;
+    void resetClasspath(IProgressMonitor monitor, boolean forceResolve) throws CoreException;
 
     IPath findBundleLocation() throws CoreException;
 
@@ -121,9 +121,8 @@
         throws CoreException;
 
     /**
-     * @param repositoryMap 
      * @return
      * @throws CoreException 
      */
-    IRepositoryManager getRepositoryManager(IRepositoryMap repositoryMap) throws CoreException;
+    IRepositoryManager getRepositoryManager();
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryConfiguration.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
similarity index 79%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryConfiguration.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
index f3683b6..708b74e 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryConfiguration.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
@@ -20,14 +20,12 @@
 package org.apache.felix.sigil.eclipse.model.repository;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryType;
 import org.eclipse.core.runtime.CoreException;
 
-public interface IRepositoryConfiguration
+public interface IRepositoryPreferences
 {
-
     List<IRepositoryModel> loadRepositories();
 
     IRepositoryModel findRepository(String id);
@@ -37,14 +35,4 @@
     List<RepositoryType> loadRepositoryTypes();
 
     IRepositoryModel newRepositoryElement(IRepositoryType type);
-
-    IRepositorySet getDefaultRepositorySet();
-
-    void setDefaultRepositorySet(IRepositorySet defaultSet);
-
-    IRepositorySet getRepositorySet(String name);
-
-    Map<String, IRepositorySet> loadRepositorySets();
-
-    void saveRepositorySets(Map<String, IRepositorySet> sets);
 }
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositorySet.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositorySet.java
deleted file mode 100644
index 8ebb46c..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositorySet.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-public interface IRepositorySet
-{
-    void setRepository(IRepositoryModel id, int position);
-
-    void removeRepository(IRepositoryModel id);
-
-    IRepositoryModel[] getRepositories();
-
-    void setRepositories(IRepositoryModel[] repositories);
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/RepositorySet.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/RepositorySet.java
deleted file mode 100644
index 1d80a8a..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/RepositorySet.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-public class RepositorySet implements IRepositorySet
-{
-
-    private static final IRepositoryModel[] EMPTY = new IRepositoryModel[0];
-
-    private IRepositoryModel[] reps;
-
-    public RepositorySet()
-    {
-        this(EMPTY);
-    }
-
-    public RepositorySet(Collection<IRepositoryModel> reps)
-    {
-        this(reps.toArray(new IRepositoryModel[reps.size()]));
-    }
-
-    public RepositorySet(IRepositoryModel[] repositories)
-    {
-        this.reps = repositories;
-    }
-
-    public void setRepository(IRepositoryModel id, int position)
-    {
-        ArrayList<IRepositoryModel> tmp = new ArrayList<IRepositoryModel>(reps.length + 1);
-        tmp.remove(id);
-        tmp.add(position, id);
-        reps = tmp.toArray(new IRepositoryModel[tmp.size()]);
-    }
-
-    public IRepositoryModel[] getRepositories()
-    {
-        return reps;
-    }
-
-    public void removeRepository(IRepositoryModel id)
-    {
-        ArrayList<IRepositoryModel> tmp = new ArrayList<IRepositoryModel>(reps.length + 1);
-        tmp.remove(id);
-        reps = tmp.toArray(new IRepositoryModel[tmp.size()]);
-    }
-
-    public void setRepositories(IRepositoryModel[] repositories)
-    {
-        reps = repositories == null ? EMPTY : repositories;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
index fe34711..e4ac348 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
@@ -168,7 +168,7 @@
     {
         final LinkedList<IPackageExport> results = new LinkedList<IPackageExport>();
 
-        SigilCore.getRepositoryManager(project).visit(new IModelWalker()
+        project.getRepositoryManager().visit(new IModelWalker()
         {
             public boolean visit(IModelElement element)
             {
@@ -312,7 +312,7 @@
                 else if (element instanceof IRequiredBundle)
                 {
                     IRequiredBundle rb = (IRequiredBundle) element;
-                    IRepositoryManager manager = SigilCore.getRepositoryManager(project);
+                    IRepositoryManager manager = project.getRepositoryManager();
                     ResolutionConfig config = new ResolutionConfig(
                         ResolutionConfig.INCLUDE_OPTIONAL
                             | ResolutionConfig.IGNORE_ERRORS);
@@ -366,7 +366,7 @@
         IResolution resolution;
         try
         {
-            resolution = SigilCore.getRepositoryManager(sigil).getBundleResolver().resolve(
+            resolution = sigil.getRepositoryManager().getBundleResolver().resolve(
                 sigil, config, new ResolutionMonitorAdapter(monitor));
         }
         catch (ResolutionException e)
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
index 459a05d..d95e2e2 100644
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
+++ b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
@@ -89,7 +89,7 @@
         try
         {
             // TODO need to figure out a sensible repository manager for launch configs
-            IRepositoryManager manager = SigilCore.getRepositoryManager(null);
+            IRepositoryManager manager = SigilCore.getGlobalRepositoryManager();
             client.apply(form.resolve(new RuntimeBundleResolver(manager, config)));
         }
         catch (Exception e)
diff --git a/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java b/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java
index 316785c..ba587a1 100644
--- a/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java
+++ b/sigil/eclipse/search/src/org/apache/felix/sigil/search/SigilSearch.java
@@ -125,12 +125,12 @@
             if (index == null)
             {
                 index = new Index();
-                for (IBundleRepository rep : SigilCore.getRepositoryManager(sigil).getRepositories())
+                for (IBundleRepository rep : sigil.getRepositoryManager().getRepositories())
                 {
                     index(index, rep);
                 }
 
-                SigilCore.getRepositoryManager(sigil).addRepositoryChangeListener(
+                sigil.getRepositoryManager().addRepositoryChangeListener(
                     new IRepositoryChangeListener()
                     {
                         public void repositoryChanged(RepositoryChangeEvent event)
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java
index c737c2f..677e019 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/actions/RefreshRepositoryAction.java
@@ -72,7 +72,7 @@
                     SubMonitor sub = SubMonitor.convert(monitor, projects.size() * 10);
                     for (ISigilProjectModel p : projects)
                     {
-                        p.resetClasspath(sub.newChild(10));
+                        p.resetClasspath(sub.newChild(10), false);
                     }
                 }
             }
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java
index 27b49c4..f23ce33 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/handlers/project/RefreshSigilClasspathCommandHandler.java
@@ -53,7 +53,7 @@
                         throws CoreException, InvocationTargetException,
                         InterruptedException
                     {
-                        model.resetClasspath(monitor);
+                        model.resetClasspath(monitor, true);
                     }
                 };
 
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java
index a1c3a0c..0ad5e38 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesPreferencePage.java
@@ -20,9 +20,7 @@
 package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
 
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryConfiguration;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
-import org.apache.felix.sigil.eclipse.model.repository.RepositorySet;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
 import org.apache.felix.sigil.eclipse.ui.internal.preferences.ProjectDependentPreferencesPage;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.preference.IPreferenceStore;
@@ -41,7 +39,6 @@
 
     private boolean changed;
     private RepositoriesView viewPage;
-    private RepositorySetsView setPage;
 
     public RepositoriesPreferencePage()
     {
@@ -70,7 +67,6 @@
     private Control initContents(Composite parent)
     {
         viewPage = new RepositoriesView(this);
-        setPage = new RepositorySetsView(this);
 
         Composite control = new Composite(parent, SWT.NONE);
 
@@ -80,10 +76,6 @@
         view.setText("Repositories");
         view.setControl(viewPage.createContents(folder));
 
-        TabItem sets = new TabItem(folder, SWT.NONE);
-        sets.setText("Sets");
-        sets.setControl(setPage.createContents(folder));
-
         control.setLayout(new GridLayout(1, true));
         folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
@@ -101,12 +93,8 @@
     {
         try
         {
-            IRepositoryConfiguration config = SigilCore.getRepositoryConfiguration();
+            IRepositoryPreferences config = SigilCore.getRepositoryPreferences();
             config.saveRepositories(viewPage.getRepositories());
-            config.saveRepositorySets(setPage.getSets());
-            IRepositorySet defaultSet = new RepositorySet(
-                setPage.getDefaultRepositories());
-            config.setDefaultRepositorySet(defaultSet);
 
             setErrorMessage(null);
             getApplyButton().setEnabled(false);
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java
index fab0a60..19d6783 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoriesView.java
@@ -34,6 +34,7 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardDialog;
@@ -98,11 +99,11 @@
 
         // Layout
         composite.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 6));
+        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 7));
 
         createButtons(composite, repositoryView);
 
-        repositories = SigilCore.getRepositoryConfiguration().loadRepositories();
+        repositories = SigilCore.getRepositoryPreferences().loadRepositories();
         repositoryView.setInput(repositories);
 
         return composite;
@@ -114,10 +115,18 @@
         add.setText("Add...");
         add.setEnabled(true);
 
+        final Button upBtn = new Button(composite, SWT.PUSH);
+        upBtn.setText("Up");
+        upBtn.setEnabled(false);
+
+        final Button downBtn = new Button(composite, SWT.PUSH);
+        downBtn.setText("Down");
+        downBtn.setEnabled(false);
+        
         final Button edit = new Button(composite, SWT.PUSH);
         edit.setText("Edit...");
         edit.setEnabled(false);
-
+        
         final Button remove = new Button(composite, SWT.PUSH);
         remove.setText("Remove");
         remove.setEnabled(false);
@@ -125,7 +134,7 @@
         final Button refresh = new Button(composite, SWT.PUSH);
         refresh.setText("Refresh");
         refresh.setEnabled(false);
-
+                
         // Listeners
         add.addSelectionListener(new SelectionAdapter()
         {
@@ -162,6 +171,24 @@
             }
         });
 
+        upBtn.addSelectionListener(new SelectionAdapter()
+        {
+            @Override
+            public void widgetSelected(SelectionEvent e)
+            {
+                up();
+            }
+        });
+        
+        downBtn.addSelectionListener(new SelectionAdapter()
+        {
+            @Override
+            public void widgetSelected(SelectionEvent e)
+            {
+                down();
+            }
+        });
+        
         repositoryView.addSelectionChangedListener(new ISelectionChangedListener()
         {
             public void selectionChanged(SelectionChangedEvent event)
@@ -175,9 +202,13 @@
 
                     checkEditEnabled(edit, sel);
                     checkRemoveEnabled(remove, sel);
+                    upBtn.setEnabled(sel.size() == 1);
+                    downBtn.setEnabled(sel.size() == 1);
                 }
                 else
                 {
+                    upBtn.setEnabled(false);
+                    downBtn.setEnabled(false);
                     refresh.setEnabled(false);
                     edit.setEnabled(false);
                     remove.setEnabled(false);
@@ -185,10 +216,37 @@
             }
         });
 
+        // layout
         add.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+        upBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+        downBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
         edit.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
         remove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
     }
+    
+    private void up()
+    {
+        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) repositoryView.getSelection()).getFirstElement();
+        int i = repositories.indexOf(model);
+        if (i > 0)
+        {
+            repositories.remove(i);
+            repositories.add(i - 1, model);
+            repositoryView.refresh();
+        }
+    }
+
+    private void down()
+    {
+        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) repositoryView.getSelection()).getFirstElement();
+        int i = repositories.indexOf(model);
+        if (i < repositories.size() - 1)
+        {
+            repositories.remove(i);
+            repositories.add(i + 1, model);
+            repositoryView.refresh();
+        }
+    }    
 
     @SuppressWarnings("unchecked")
     private void checkRemoveEnabled(Button button, IStructuredSelection sel)
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositorySetDialog.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositorySetDialog.java
deleted file mode 100644
index a2e08a4..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositorySetDialog.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultLabelProvider;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class RepositorySetDialog extends TitleAreaDialog
-{
-
-    private CheckboxTableViewer viewer;
-    private Text nameTxt;
-    private Button upBtn;
-    private Button downBtn;
-    private final String setName;
-    private List<IRepositoryModel> repositories;
-    private final boolean nameEditable;
-    private final Set<String> set;
-
-    private String newName;
-
-    public RepositorySetDialog(Shell shell, Set<String> set)
-    {
-        this(shell, null, true, set);
-    }
-
-    public RepositorySetDialog(Shell parent, RepositoryViewData data, boolean nameEditable, Set<String> set)
-    {
-        super(parent);
-        this.set = set;
-        this.setName = data == null ? "" : data.getName();
-        this.repositories = data == null ? new ArrayList<IRepositoryModel>()
-            : new ArrayList<IRepositoryModel>(Arrays.asList(data.getRepositories()));
-        this.nameEditable = nameEditable;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent)
-    {
-        Composite area = (Composite) super.createDialogArea(parent);
-        createControl(area);
-        return area;
-    }
-
-    public void createControl(Composite parent)
-    {
-        // controls
-        Composite body = new Composite(parent, SWT.NONE);
-        body.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        if (nameEditable)
-        {
-            new Label(body, SWT.NONE).setText("Name");
-
-            nameTxt = new Text(body, SWT.BORDER);
-
-            nameTxt.setText(setName);
-
-            nameTxt.addKeyListener(new KeyAdapter()
-            {
-                @Override
-                public void keyReleased(KeyEvent e)
-                {
-                    checkComplete();
-                }
-            });
-        }
-
-        Composite table = new Composite(body, SWT.NONE);
-        table.setLayout(new GridLayout(2, false));
-        createTable(table);
-
-        // layout
-        body.setLayout(new GridLayout(2, false));
-        if (nameEditable)
-        {
-            nameTxt.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        }
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-    }
-
-    public RepositoryViewData getData()
-    {
-        String name = nameEditable ? newName : setName;
-        IRepositoryModel[] reps = repositories.toArray(new IRepositoryModel[repositories.size()]);
-        return new RepositoryViewData(name, reps);
-    }
-
-    private void checkComplete()
-    {
-        if (nameEditable)
-        {
-            String name = nameTxt.getText();
-            if (!name.equals(setName) && set.contains(name))
-            {
-                setErrorMessage("Set " + name + " already exists");
-                Button b = getButton(IDialogConstants.OK_ID);
-                b.setEnabled(false);
-            }
-        }
-        setErrorMessage(null);
-        Button b = getButton(IDialogConstants.OK_ID);
-        b.setEnabled(true);
-    }
-
-    @Override
-    protected void okPressed()
-    {
-        if (nameEditable)
-        {
-            newName = nameTxt.getText();
-        }
-        repositories = getRepositories();
-        super.okPressed();
-    }
-
-    private void createTable(Composite body)
-    {
-        createViewer(body);
-
-        Composite btns = new Composite(body, SWT.NONE);
-        btns.setLayout(new GridLayout(1, true));
-
-        createButtons(btns);
-
-        // layout
-        viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        btns.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
-    }
-
-    private void createButtons(Composite parent)
-    {
-        upBtn = new Button(parent, SWT.PUSH);
-        upBtn.setText("Up");
-        upBtn.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                up();
-            }
-        });
-
-        downBtn = new Button(parent, SWT.PUSH);
-        downBtn.setText("Down");
-        downBtn.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                down();
-            }
-        });
-
-        setUpDownEnabled(false);
-    }
-
-    private void up()
-    {
-        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) viewer.getSelection()).getFirstElement();
-        int i = repositories.indexOf(model);
-        if (i > 0)
-        {
-            repositories.remove(i);
-            repositories.add(i - 1, model);
-            viewer.refresh();
-        }
-    }
-
-    private void down()
-    {
-        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) viewer.getSelection()).getFirstElement();
-        int i = repositories.indexOf(model);
-        if (i < repositories.size() - 1)
-        {
-            repositories.remove(i);
-            repositories.add(i + 1, model);
-            viewer.refresh();
-        }
-    }
-
-    private void createViewer(Composite parent)
-    {
-        viewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
-
-        viewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                setUpDownEnabled(!viewer.getSelection().isEmpty());
-            }
-        });
-
-        viewer.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        viewer.setLabelProvider(new DefaultLabelProvider()
-        {
-            public Image getImage(Object element)
-            {
-                return null;
-            }
-
-            public String getText(Object element)
-            {
-                IRepositoryModel m = (IRepositoryModel) element;
-                return m.getName();
-            }
-        });
-
-        viewer.setInput(repositories);
-
-        for (IRepositoryModel m : repositories)
-        {
-            viewer.setChecked(m, true);
-        }
-
-        List<IRepositoryModel> allRepositories = SigilCore.getRepositoryConfiguration().loadRepositories();
-
-        for (IRepositoryModel m : allRepositories)
-        {
-            if (!repositories.contains(m))
-            {
-                repositories.add(m);
-            }
-        }
-
-        viewer.refresh();
-    }
-
-    private void setUpDownEnabled(boolean enabled)
-    {
-        upBtn.setEnabled(enabled);
-        downBtn.setEnabled(enabled);
-    }
-
-    private List<IRepositoryModel> getRepositories()
-    {
-        ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-
-        for (IRepositoryModel m : repositories)
-        {
-            if (viewer.getChecked(m))
-            {
-                reps.add(m);
-            }
-        }
-
-        return reps;
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositorySetsView.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositorySetsView.java
deleted file mode 100644
index bcb6248..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositorySetsView.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
-import org.apache.felix.sigil.eclipse.model.repository.RepositorySet;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultLabelProvider;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-public class RepositorySetsView
-{
-    private static final String DEFAULT = "default";
-
-    private final RepositoriesPreferencePage page;
-
-    private ArrayList<RepositoryViewData> sets = new ArrayList<RepositoryViewData>();
-
-    private TableViewer setView;
-
-    private RepositoryViewData defaultSet;
-
-    public RepositorySetsView(RepositoriesPreferencePage page)
-    {
-        this.page = page;
-    }
-
-    public Control createContents(Composite parent)
-    {
-        // Create Controls
-        Composite composite = new Composite(parent, SWT.NONE);
-
-        Table table = new Table(composite, SWT.SINGLE | SWT.BORDER);
-
-        // Table Viewer Setup
-        setView = new TableViewer(table);
-
-        setView.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        defaultSet = new RepositoryViewData(
-            DEFAULT,
-            SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories());
-
-        sets.add(defaultSet);
-
-        for (Map.Entry<String, IRepositorySet> e : SigilCore.getRepositoryConfiguration().loadRepositorySets().entrySet())
-        {
-            IRepositorySet s = e.getValue();
-            sets.add(new RepositoryViewData(e.getKey(), s.getRepositories()));
-        }
-
-        setView.setLabelProvider(new DefaultLabelProvider()
-        {
-            public Image getImage(Object element)
-            {
-                return null;
-            }
-
-            public String getText(Object element)
-            {
-                RepositoryViewData data = (RepositoryViewData) element;
-                return data.getName();
-            }
-        });
-
-        setView.setInput(sets);
-
-        // Layout
-        composite.setLayout(new GridLayout(2, false));
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 6));
-
-        createButtons(composite);
-
-        return composite;
-    }
-
-    private void createButtons(final Composite composite)
-    {
-        final Button add = new Button(composite, SWT.PUSH);
-        add.setText("Add...");
-        add.setEnabled(true);
-
-        final Button edit = new Button(composite, SWT.PUSH);
-        edit.setText("Edit...");
-        edit.setEnabled(false);
-
-        final Button remove = new Button(composite, SWT.PUSH);
-        remove.setText("Remove");
-        remove.setEnabled(false);
-        // Listeners
-        add.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                add(composite);
-            }
-        });
-
-        edit.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection sel = (IStructuredSelection) setView.getSelection();
-                edit(composite, sel);
-            }
-        });
-
-        remove.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection sel = (IStructuredSelection) setView.getSelection();
-                remove(sel);
-            }
-        });
-
-        setView.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                boolean enabled = !event.getSelection().isEmpty();
-                if (enabled)
-                {
-                    RepositoryViewData element = (RepositoryViewData) ((IStructuredSelection) event.getSelection()).getFirstElement();
-                    edit.setEnabled(true);
-                    remove.setEnabled(element != defaultSet);
-                }
-                else
-                {
-                    edit.setEnabled(false);
-                    remove.setEnabled(false);
-                }
-            }
-        });
-
-        add.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        edit.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-        remove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-    }
-
-    private void add(Control parent)
-    {
-        RepositorySetDialog wizard = new RepositorySetDialog(getShell(parent), getNames());
-        if (wizard.open() == Window.OK)
-        {
-            sets.add(wizard.getData());
-            updated();
-        }
-    }
-
-    private void edit(Control parent, IStructuredSelection sel)
-    {
-        RepositoryViewData data = (RepositoryViewData) sel.getFirstElement();
-        RepositorySetDialog wizard = new RepositorySetDialog(getShell(parent), data,
-            data != defaultSet, getNames());
-        if (wizard.open() == Window.OK)
-        {
-            if (data != defaultSet)
-            {
-                data.setName(wizard.getData().getName());
-            }
-            data.setRepositories(wizard.getData().getRepositories());
-            updated();
-        }
-    }
-
-    private Set<String> getNames()
-    {
-        HashSet<String> names = new HashSet<String>();
-
-        for (RepositoryViewData view : sets)
-        {
-            if (view != defaultSet)
-            {
-                names.add(view.getName());
-            }
-        }
-
-        return names;
-    }
-
-    private Shell getShell(Control parent)
-    {
-        return parent.getShell();
-    }
-
-    private void remove(IStructuredSelection sel)
-    {
-        if (sets.remove(sel.getFirstElement()))
-        {
-            updated();
-        }
-    }
-
-    private void updated()
-    {
-        setView.refresh();
-        page.changed();
-    }
-
-    public Map<String, IRepositorySet> getSets()
-    {
-        HashMap<String, IRepositorySet> ret = new HashMap<String, IRepositorySet>();
-
-        for (RepositoryViewData data : sets)
-        {
-            if (data != defaultSet)
-            {
-                IRepositorySet set = new RepositorySet(data.getRepositories());
-                ret.put(data.getName(), set);
-            }
-        }
-
-        return ret;
-    }
-
-    public IRepositoryModel[] getDefaultRepositories()
-    {
-        return defaultSet.getRepositories();
-    }
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java
index 309ab09..f36a85e 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/repository/RepositoryTypeSelectionPage.java
@@ -102,7 +102,7 @@
                 {
                     IStructuredSelection sel = (IStructuredSelection) event.getSelection();
                     IRepositoryType type = (IRepositoryType) sel.getFirstElement();
-                    repositoryElement = SigilCore.getRepositoryConfiguration().newRepositoryElement(
+                    repositoryElement = SigilCore.getRepositoryPreferences().newRepositoryElement(
                         type);
                     selectWizardNode(new RepositoryWizardNode(repositoryElement));
                 }
@@ -110,7 +110,7 @@
         });
 
         ArrayList<IRepositoryType> descriptors = new ArrayList<IRepositoryType>(
-            SigilCore.getRepositoryConfiguration().loadRepositoryTypes());
+            SigilCore.getRepositoryPreferences().loadRepositoryTypes());
 
         for (Iterator<IRepositoryType> i = descriptors.iterator(); i.hasNext();)
         {
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java
index 9a831c0..755f146 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/RepositoryViewPart.java
@@ -112,7 +112,7 @@
         public RepositoryAction(IBundleRepository rep)
         {
             this.rep = rep;
-            this.model = SigilCore.getRepositoryConfiguration().findRepository(
+            this.model = SigilCore.getRepositoryPreferences().findRepository(
                 rep.getId());
         }
 
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java
index ad954c5..dfac116 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/views/resolution/BundleResolverView.java
@@ -259,7 +259,7 @@
         };
 
         ISigilProjectModel project = findProject(element);
-        IRepositoryManager repository = SigilCore.getRepositoryManager(project);
+        IRepositoryManager repository = project.getRepositoryManager();
 
         int options = ResolutionConfig.IGNORE_ERRORS;
 
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java
index 65eab4f..6b268b1 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ExportedPackageFinder.java
@@ -25,7 +25,6 @@
 import org.apache.felix.sigil.common.model.IModelElement;
 import org.apache.felix.sigil.common.model.IModelWalker;
 import org.apache.felix.sigil.common.model.osgi.IPackageExport;
-import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -66,7 +65,7 @@
                 return !monitor.isCanceled();
             }
         };
-        SigilCore.getRepositoryManager(sigil).visit(walker);
+        sigil.getRepositoryManager().visit(walker);
         if (exports.size() > 0)
         {
             accumulator.addElements(exports);
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java
index 74fbcf5..71d32cb 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ModelLabelProvider.java
@@ -93,7 +93,7 @@
         if (element instanceof IBundleRepository)
         {
             IBundleRepository rep = (IBundleRepository) element;
-            IRepositoryModel config = SigilCore.getRepositoryConfiguration().findRepository(
+            IRepositoryModel config = SigilCore.getRepositoryPreferences().findRepository(
                 rep.getId());
             return config.getType().getIcon();
         }
@@ -168,7 +168,7 @@
         if (element instanceof IBundleRepository)
         {
             IBundleRepository rep = (IBundleRepository) element;
-            IRepositoryModel config = SigilCore.getRepositoryConfiguration().findRepository(
+            IRepositoryModel config = SigilCore.getRepositoryPreferences().findRepository(
                 rep.getId());
             return config.getName();
         }
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java
index a9b1b3c..143803e 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/util/ResourcesDialogHelper.java
@@ -347,7 +347,7 @@
                         return !monitor.isCanceled();
                     }
                 };
-                SigilCore.getRepositoryManager(sigil).visit(walker);
+                sigil.getRepositoryManager().visit(walker);
                 if (!bundles.isEmpty())
                 {
                     dialog.addElements(bundles);