diff --git a/sigil/eclipse/core/plugin.xml b/sigil/eclipse/core/plugin.xml
index 86e49c9..18487fd 100644
--- a/sigil/eclipse/core/plugin.xml
+++ b/sigil/eclipse/core/plugin.xml
@@ -75,18 +75,21 @@
             defaultLevel="-3"
             dynamic="false"
             id="org.apache.felix.sigil.core.workspaceprovider"
+            alias="project"
             type="Workspace Repository">
       </provider>
       <provider
             class="org.apache.felix.sigil.common.core.repository.FileSystemRepositoryProvider"
             dynamic="true"
             id="org.apache.felix.sigil.core.file"
+            alias="filesystem"
             type="File System Repository">
       </provider>
       <provider
             class="org.apache.felix.sigil.common.core.repository.SystemRepositoryProvider"
             dynamic="false"
             id="org.apache.felix.sigil.core.system"
+            alias="system"
             type="System Repository">
       </provider>
    </extension>
diff --git a/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd b/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
index 90299ac..f760d9d 100644
--- a/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
+++ b/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
@@ -1,22 +1,4 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!--
-  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.
--->
 <!-- Schema file written by PDE -->
 <schema targetNamespace="org.apache.felix.sigil.eclipse.core" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
@@ -74,6 +56,13 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="alias" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
          <attribute name="type" type="string" use="required">
             <annotation>
                <documentation>
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 4f76a03..cfefb58 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
@@ -26,7 +26,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.ResourceBundle;
 import java.util.Set;
@@ -47,8 +46,7 @@
 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.repository.eclipse.GlobalRepositoryManager;
-import org.apache.felix.sigil.eclipse.internal.repository.eclipse.RepositoryMap;
-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.internal.resources.ProjectResourceListener;
 import org.apache.felix.sigil.eclipse.internal.resources.SigilProjectManager;
 import org.apache.felix.sigil.eclipse.model.project.ISigilModelRoot;
@@ -141,8 +139,6 @@
     public static final String PREFERENCES_REMOVE_IMPORT_FOR_EXPORT = BASE
         + ".removeImportForExport";
 
-    private static final Object NULL = new Object();
-
     // The shared instance
     private static SigilCore plugin;
 
@@ -153,7 +149,6 @@
     private static SigilProjectManager projectManager;
     private static OSGiInstallManager installs;
     private static ISigilModelRoot modelRoot;
-    private static HashMap<Object, SigilRepositoryManager> repositoryManagers = new HashMap<Object, SigilRepositoryManager>();
     private static GlobalRepositoryManager globalRepositoryManager;
     private static RepositoryMap repositoryMap;
 
@@ -316,13 +311,6 @@
             serializerTracker = null;
         }
 
-        for (SigilRepositoryManager m : repositoryManagers.values())
-        {
-            m.destroy();
-        }
-
-        repositoryManagers.clear();
-
         globalRepositoryManager.destroy();
         globalRepositoryManager = null;
 
@@ -435,48 +423,18 @@
         return globalRepositoryManager;
     }
 
-    public static IRepositoryManager getRepositoryManager(String set)
-    {
-        SigilRepositoryManager manager = null;
-
-        if (set == null)
-        {
-            manager = repositoryManagers.get(NULL);
-            if (manager == null)
-            {
-                manager = new SigilRepositoryManager(null, repositoryMap);
-                manager.initialise();
-                repositoryManagers.put(NULL, manager);
-            }
-        }
-        else
-        {
-            manager = repositoryManagers.get(set);
-
-            if (manager == null)
-            {
-                manager = new SigilRepositoryManager(set, repositoryMap);
-                manager.initialise();
-                repositoryManagers.put(set, manager);
-            }
-        }
-
-        return manager;
-    }
-
     public static IRepositoryManager getRepositoryManager(ISigilProjectModel model)
     {
-        return getRepositoryManager(loadProjectRepositorySet(model));
-    }
-
-    private static String loadProjectRepositorySet(ISigilProjectModel model)
-    {
-        if (model == null)
+        if ( model == null ) return globalRepositoryManager;
+        try
         {
-            return null;
+            return model.getRepositoryManager(repositoryMap);
         }
-
-        return model.getPreferences().get(REPOSITORY_SET, null);
+        catch (CoreException e)
+        {
+            warn("Failed to build repository manager for " + model, e);
+            return globalRepositoryManager;
+        }
     }
 
     public static IRepositoryConfiguration getRepositoryConfiguration()
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/model/project/EclipseRepositoryConfig.java
new file mode 100644
index 0000000..5270fd0
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java
@@ -0,0 +1,157 @@
+/*
+ * 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.internal.model.project;
+
+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;
+import org.apache.felix.sigil.eclipse.SigilCore;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * @author dave
+ *
+ */
+public class EclipseRepositoryConfig implements IRepositoryConfig
+{
+
+    private final IRepositoryConfig projectConfig;
+    
+    public EclipseRepositoryConfig(IRepositoryConfig projectConfig) {
+        this.projectConfig = projectConfig;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getAllRepositories()
+     */
+    public List<String> getAllRepositories()
+    {
+        ArrayList<String> list = new ArrayList<String>(readRepositories().keySet());
+        list.addAll(projectConfig.getAllRepositories());
+        return list;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryConfig(java.lang.String)
+     */
+    public Properties getRepositoryConfig(String name)
+    {
+        Properties props = projectConfig.getRepositoryConfig(name);
+        if ( props.isEmpty() ) {
+            props = readRepositories().get(name);
+        }
+        return props;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryDefinition(java.lang.String)
+     */
+    public URI getRepositoryDefinition(String name)
+    {
+        URI def = projectConfig.getRepositoryDefinition(name);
+        if ( def == null ) {
+            if ( readRepositories().containsKey(name) ) {
+                def = URI.create("sigil:eclipse:preferences");
+            }
+        }
+        return def;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryPath()
+     */
+    public List<String> getRepositoryPath()
+    {
+        return projectConfig.getRepositoryPath();
+    }
+
+    private Map<String, Properties> readRepositories() {
+        HashMap<String, Properties> repos = new HashMap<String, Properties>();
+        IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
+
+        IRepositoryModel[] models = findRepositories();
+        for (IRepositoryModel repo : models)
+        {
+            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);
+                }
+                else
+                {
+                    pref = new Properties();
+                }
+                
+                repos.put(id, pref);
+            }
+            catch (IOException e)
+            {
+                SigilCore.error("Failed to load repository for " + repo, e);
+            }
+        }
+        
+        return repos;
+    }
+    
+    private IRepositoryModel[] findRepositories()
+    {
+        return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
+    }
+    
+    private Properties loadPreferences(String loc) throws FileNotFoundException,
+    IOException
+    {
+        FileInputStream in = null;
+        try
+        {
+            Properties pref = new Properties();
+            pref.load(new FileInputStream(loc));
+            return pref;
+        }
+        finally
+        {
+            if (in != null)
+            {
+                try
+                {
+                    in.close();
+                }
+                catch (IOException e)
+                {
+                    SigilCore.error("Failed to close file", e);
+                }
+            }
+        }
+    }    
+}
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 aadb284..2bbd0ef 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
@@ -33,6 +33,7 @@
 
 import org.apache.felix.sigil.common.config.BldFactory;
 import org.apache.felix.sigil.common.config.IBldProject;
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
 import org.apache.felix.sigil.common.model.AbstractCompoundModelElement;
 import org.apache.felix.sigil.common.model.ICapabilityModelElement;
 import org.apache.felix.sigil.common.model.IModelElement;
@@ -50,7 +51,9 @@
 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;
@@ -60,16 +63,12 @@
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ProjectScope;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener;
 import org.eclipse.jdt.core.ClasspathContainerInitializer;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaElement;
@@ -80,7 +79,6 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.osgi.framework.Version;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * @author dave
@@ -97,8 +95,6 @@
 
     private ISigilBundle bundle;
 
-    private IEclipsePreferences preferences;
-
     private List<IRequirementModelElement> lastReqs = new LinkedList<IRequirementModelElement>();
     private List<ICapabilityModelElement> lastCaps = new LinkedList<ICapabilityModelElement>();
 
@@ -329,59 +325,6 @@
         marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
     }
 
-    /**
-     * Returns the project custom preference pool.
-     * Project preferences may include custom encoding.
-     * @return IEclipsePreferences or <code>null</code> if the project
-     * 	does not have a java nature.
-     */
-    public Preferences getPreferences()
-    {
-        synchronized (this)
-        {
-            if (preferences == null)
-            {
-                preferences = loadPreferences();
-            }
-
-            return preferences;
-        }
-    }
-
-    /**
-     * @return
-     */
-    private synchronized IEclipsePreferences loadPreferences()
-    {
-        IScopeContext context = new ProjectScope(getProject());
-        final IEclipsePreferences eclipsePreferences = context.getNode(SigilCore.PLUGIN_ID);
-
-        // Listen to node removal from parent in order to reset cache
-        INodeChangeListener nodeListener = new IEclipsePreferences.INodeChangeListener()
-        {
-            public void added(IEclipsePreferences.NodeChangeEvent event)
-            {
-                // do nothing
-            }
-
-            public void removed(IEclipsePreferences.NodeChangeEvent event)
-            {
-                if (event.getChild() == eclipsePreferences)
-                {
-                    synchronized (SigilProject.this)
-                    {
-                        preferences = null;
-                    }
-                    ((IEclipsePreferences) eclipsePreferences.parent()).removeNodeChangeListener(this);
-                }
-            }
-        };
-
-        ((IEclipsePreferences) eclipsePreferences.parent()).addNodeChangeListener(nodeListener);
-
-        return eclipsePreferences;
-    }
-
     public Collection<IClasspathEntry> findExternalClasspath(IProgressMonitor monitor)
         throws CoreException
     {
@@ -728,6 +671,24 @@
         }
     }
 
+    public IRepositoryConfig getRepositoryConfig() throws CoreException
+    {
+        try
+        {
+            return BldFactory.getConfig(project.getFile(IBldProject.PROJECT_FILE).getLocationURI());
+        }
+        catch (IOException e)
+        {
+            throw SigilCore.newCoreException("Failed to get project file: ", e);
+        }
+    }
+    
+    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())
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/RepositoryConfiguration.java
index 081dc5a..4a8366e 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/RepositoryConfiguration.java
@@ -139,9 +139,10 @@
                 String type = c.getAttribute("type");
                 boolean dynamic = Boolean.valueOf(c.getAttribute("dynamic"));
                 String icon = c.getAttribute("icon");
+                String provider = c.getAttribute("alias");
                 Image image = (icon == null || icon.trim().length() == 0) ? null
                     : loadImage(e, icon);
-                repositories.add(new RepositoryType(id, type, dynamic, image));
+                repositories.add(new RepositoryType(id, provider, type, dynamic, image));
             }
         }
 
@@ -160,7 +161,6 @@
 
     public IRepositorySet getDefaultRepositorySet()
     {
-        //int level = findLevel( key + LEVEL, type, prefs );
         ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
         for (String s : PrefsUtils.stringToArray(getPreferences().getString(
             REPOSITORY_DEFAULT_SET)))
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
index d65c174..53889b7 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
@@ -24,16 +24,18 @@
 
 public class RepositoryType implements IRepositoryType
 {
-    private String type;
-    private String id;
-    private Image icon;
-    private boolean dynamic;
+    private final String type;
+    private final String id;
+    private final String provider;
+    private final Image icon;
+    private final boolean dynamic;
 
-    public RepositoryType(String id, String type, boolean dynamic, Image icon)
+    public RepositoryType(String id, String provider, String type, boolean dynamic, Image icon)
     {
         this.id = id;
         this.type = type;
         this.dynamic = dynamic;
+        this.provider = provider;
         this.icon = icon;
     }
 
@@ -41,6 +43,10 @@
     {
         return type;
     }
+    
+    public String getProvider() {
+        return provider;
+    }
 
     public String getId()
     {
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 688c041..a1a8b09 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
@@ -24,6 +24,7 @@
 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
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 1edf9ef..cf74d3c 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
@@ -32,7 +32,8 @@
 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.internal.repository.eclipse.RepositoryMap.RepositoryCache;
+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.model.repository.IRepositoryModel;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java
new file mode 100644
index 0000000..24f6c2b
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java
@@ -0,0 +1,62 @@
+/*
+ * 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.internal.repository.manager;
+
+import org.apache.felix.sigil.common.repository.IRepositoryProvider;
+import org.apache.felix.sigil.eclipse.SigilCore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author dave
+ *
+ */
+public class EclipseRepositoryFactory
+{
+
+    /**
+     * @param alias
+     * @return
+     */
+    public static IRepositoryProvider getProvider(String alias)
+    throws CoreException
+    {
+        IExtensionRegistry registry = Platform.getExtensionRegistry();
+        IExtensionPoint p = registry.getExtensionPoint(SigilCore.REPOSITORY_PROVIDER_EXTENSION_POINT_ID);
+
+        for (IExtension e : p.getExtensions())
+        {
+            for (IConfigurationElement c : e.getConfigurationElements())
+            {
+                if (alias.equals(c.getAttribute("alias")))
+                {
+                    IRepositoryProvider provider = (IRepositoryProvider) c.createExecutableExtension("class");
+                    return provider;
+                }
+            }
+        }
+
+        return 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
new file mode 100644
index 0000000..2e081ec
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
@@ -0,0 +1,173 @@
+/*
+ * 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.internal.repository.manager;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
+import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
+import org.apache.felix.sigil.common.repository.IBundleRepository;
+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;
+
+/**
+ * @author dave
+ *
+ */
+public class EclipseRepositoryManager extends AbstractRepositoryManager
+{
+    private final IRepositoryConfig config;
+    private final IRepositoryMap repositoryMap;
+    
+    /**
+     * @param config
+     * @param repositoryMap2 
+     */
+    public EclipseRepositoryManager(IRepositoryConfig config, IRepositoryMap repositoryMap)
+    {
+        this.config = config;
+        this.repositoryMap = repositoryMap;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.repository.AbstractRepositoryManager#loadRepositories()
+     */
+    @Override
+    protected void loadRepositories()
+    {
+        List<IBundleRepository> list = new ArrayList<IBundleRepository>();
+        scanRepositories(config.getRepositoryPath(), list);
+        setRepositories(list.toArray(new IBundleRepository[list.size()]));
+    }
+    
+    /**
+     * @param list 
+     * @param config2
+     * @param i
+     */
+    private void scanRepositories(List<String> path, List<IBundleRepository> list)
+    {
+        for (String name : path)
+        {
+            if ( IRepositoryConfig.WILD_CARD.equals(name) ) {
+                HashSet<String> defined = new HashSet<String>();
+                for (String n : path) {
+                    if (!IRepositoryConfig.WILD_CARD.equals(n)) {
+                        defined.add(n);
+                    }
+                }
+                List<String> subpath = new LinkedList<String>();
+                for (String key : config.getAllRepositories()) {
+                    if (!defined.contains(key))
+                    {
+                        subpath.add(key);
+                    }
+                }
+                scanRepositories(subpath, list);
+            }
+            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);
+                }                
+            }
+        }
+    }
+
+    /**
+     * @param repo
+     * @return 
+     */
+    private IBundleRepository buildRepository(String uid, String name, Properties repo)
+    {
+        String disabled = repo.getProperty("disabled");
+        if ("true".equalsIgnoreCase(disabled == null ? null : disabled.trim())) return null;
+        
+        String optStr = repo.getProperty("optional", "false");
+        boolean optional = Boolean.parseBoolean(optStr.trim());
+
+        String alias = repo.getProperty(IRepositoryConfig.REPOSITORY_PROVIDER);
+        if (alias == null)
+        {
+            String msg = "provider not specified for repository: " + name;
+            
+            if (optional)            
+                SigilCore.log(msg);
+            else
+                SigilCore.warn(msg);
+        }
+
+        try
+        {
+            IRepositoryProvider instance = EclipseRepositoryFactory.getProvider(alias);
+            IBundleRepository repository = loadRepository(uid, name, repo, instance);
+            return repository;
+        }
+        catch (Exception e)
+        {
+            String msg = "failed to create repository: ";
+            
+            if (optional)            
+                SigilCore.log(msg + e);
+            else
+                SigilCore.warn(msg, e);
+        }
+        
+        return null;
+    }
+    
+    private IBundleRepository loadRepository(String uid, String id, Properties pref,
+        IRepositoryProvider provider) throws RepositoryException
+    {
+        try
+        {
+            if (pref == null)
+            {
+                pref = new Properties();
+            }
+
+            RepositoryCache cache = repositoryMap.get(uid);
+
+            if (cache == null || !cache.pref.equals(pref))
+            {
+                IBundleRepository repo = provider.createRepository(id, pref);
+                cache = new RepositoryCache(pref, repo);
+                repositoryMap.put(uid, cache);
+            }
+
+            return cache.repo;
+        }
+        catch (RuntimeException e)
+        {
+            throw new RepositoryException("Failed to build repositories", e);
+        }
+    }
+    
+}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
similarity index 68%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
index a8157e3..c9158c2 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
@@ -17,32 +17,19 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
+package org.apache.felix.sigil.eclipse.internal.repository.manager;
 
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Properties;
 
-import org.apache.felix.sigil.common.repository.IBundleRepository;
+import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
 
-public class RepositoryMap
+public class RepositoryMap implements IRepositoryMap
 {
-    static class RepositoryCache
-    {
-        final Properties pref;
-        final IBundleRepository repo;
-
-        RepositoryCache(Properties pref, IBundleRepository repo)
-        {
-            this.pref = pref;
-            this.repo = repo;
-        }
-    }
-
     private HashMap<String, RepositoryCache> cachedRepositories = new HashMap<String, RepositoryCache>();
 
-    synchronized void retainAll(Collection<String> ids)
+    public synchronized void retainAll(Collection<String> ids)
     {
         for (Iterator<String> i = cachedRepositories.keySet().iterator(); i.hasNext();)
         {
@@ -53,12 +40,12 @@
         }
     }
 
-    synchronized RepositoryCache get(String id)
+    public synchronized RepositoryCache get(String id)
     {
         return cachedRepositories.get(id);
     }
 
-    synchronized void put(String id, RepositoryCache cache)
+    public synchronized void put(String id, RepositoryCache cache)
     {
         cachedRepositories.put(id, cache);
     }
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/model/project/IRepositoryMap.java
new file mode 100644
index 0000000..f36a501
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java
@@ -0,0 +1,57 @@
+/*
+ * 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.project;
+
+import java.util.Properties;
+
+import org.apache.felix.sigil.common.repository.IBundleRepository;
+
+/**
+ * @author dave
+ *
+ */
+public interface IRepositoryMap
+{
+
+    public static class RepositoryCache
+    {
+        public final Properties pref;
+        public final IBundleRepository repo;
+
+        public RepositoryCache(Properties pref, IBundleRepository repo)
+        {
+            this.pref = pref;
+            this.repo = repo;
+        }
+    }
+
+    /**
+     * @param uid
+     * @return
+     */
+    RepositoryCache get(String uid);
+
+    /**
+     * @param uid
+     * @param cache
+     */
+    void put(String uid, RepositoryCache cache);
+
+}
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 0b80c5b..0d53a03 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
@@ -22,10 +22,12 @@
 import java.util.Collection;
 
 import org.apache.felix.sigil.common.config.IBldProject;
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
 import org.apache.felix.sigil.common.core.BldCore;
 import org.apache.felix.sigil.common.model.ICompoundModelElement;
 import org.apache.felix.sigil.common.model.IModelElement;
 import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
+import org.apache.felix.sigil.common.repository.IRepositoryManager;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -35,7 +37,6 @@
 import org.eclipse.jdt.core.IPackageFragment;
 import org.eclipse.jdt.core.JavaModelException;
 import org.osgi.framework.Version;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * Represents a sigil project. To get a reference to a ISigilProjectModel you can use the 
@@ -55,8 +56,6 @@
     // shortcut to getProject().getName()
     String getName();
 
-    Preferences getPreferences();
-
     /**
      * 
      * @param monitor
@@ -113,6 +112,18 @@
 
     IBldProject getBldProject() throws CoreException;
 
+    /**
+     * @return
+     */
+    IRepositoryConfig getRepositoryConfig() throws CoreException;
+    
     Collection<IClasspathEntry> findExternalClasspath(IProgressMonitor monitor)
         throws CoreException;
+
+    /**
+     * @param repositoryMap 
+     * @return
+     * @throws CoreException 
+     */
+    IRepositoryManager getRepositoryManager(IRepositoryMap repositoryMap) throws CoreException;
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
index d56ba7c..7c706d1 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
@@ -32,4 +32,5 @@
 
     boolean isDynamic();
 
+    String getProvider();
 }
\ No newline at end of file
diff --git a/sigil/eclipse/obr/plugin.xml b/sigil/eclipse/obr/plugin.xml
index 39b1af2..df40b46 100644
--- a/sigil/eclipse/obr/plugin.xml
+++ b/sigil/eclipse/obr/plugin.xml
@@ -25,6 +25,7 @@
             class="org.apache.felix.sigil.common.obr.OBRRepositoryProvider"
             dynamic="true"
             id="org.apache.felix.sigil.obr.provider"
+            alias="obr"
             type="OSGi Bundle Repository (OBR)">
       </provider>
    </extension>
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 c376444..459a05d 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
@@ -88,8 +88,8 @@
 
         try
         {
-            String name = LaunchHelper.getRepositoryManagerName(config);
-            IRepositoryManager manager = SigilCore.getRepositoryManager(name);
+            // TODO need to figure out a sensible repository manager for launch configs
+            IRepositoryManager manager = SigilCore.getRepositoryManager(null);
             client.apply(form.resolve(new RuntimeBundleResolver(manager, config)));
         }
         catch (Exception e)
diff --git a/sigil/eclipse/ui/plugin.xml b/sigil/eclipse/ui/plugin.xml
index 238460c..8ca3bb2 100644
--- a/sigil/eclipse/ui/plugin.xml
+++ b/sigil/eclipse/ui/plugin.xml
@@ -146,22 +146,6 @@
       </wizard>
    </extension>
    <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.project.ProjectPropertyPage"
-            id="org.apache.felix.sigil.ui.projectpage"
-            name="Repositories">
-         <filter
-               name="projectNature"
-               value="org.apache.felix.sigil.sigilnature"/>
-         <enabledWhen>
-            <adapt
-                  type="org.eclipse.core.resources.IProject">
-            </adapt>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
          point="org.eclipse.ui.menus">
       <menuContribution
             locationURI="popup:org.eclipse.ui.popup.any">
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/project/ProjectPropertyPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/project/ProjectPropertyPage.java
deleted file mode 100644
index ce23d9b..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/project/ProjectPropertyPage.java
+++ /dev/null
@@ -1,218 +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.project;
-
-import java.util.concurrent.Callable;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.ProjectUtils;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbenchPropertyPage;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.osgi.service.prefs.BackingStoreException;
-
-public class ProjectPropertyPage extends PropertyPage implements IWorkbenchPropertyPage
-{
-
-    private boolean projectSpecific;
-    private ComboViewer setView;
-    private Composite settings;
-    private Button projectSpecificBtn;
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        final Composite control = new Composite(parent, SWT.NONE);
-
-        projectSpecificBtn = new Button(control, SWT.CHECK);
-        projectSpecificBtn.setText("Enable project specific settings");
-        projectSpecificBtn.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                setProjectSpecific(!projectSpecific);
-            }
-        });
-
-        Label link = new Label(control, SWT.UNDERLINE_SINGLE);
-        link.addMouseListener(new MouseAdapter()
-        {
-            @Override
-            public void mouseDown(MouseEvent e)
-            {
-                PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null,
-                    SigilCore.REPOSITORIES_PREFERENCES_ID, null, null);
-                dialog.open();
-            }
-        });
-
-        link.setText("Configure workspace settings");
-
-        settings = new Composite(control, SWT.BORDER);
-        settings.setLayout(new GridLayout(1, false));
-        createSettings(settings);
-
-        setFonts(control);
-
-        // layout
-        control.setLayout(new GridLayout(2, false));
-        projectSpecificBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        settings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-        // load settings
-        String currentSet = getCurrentSet();
-
-        if (currentSet == null)
-        {
-            setProjectSpecific(false);
-        }
-        else
-        {
-            setView.setSelection(new StructuredSelection(currentSet));
-            setProjectSpecific(true);
-        }
-
-        return control;
-    }
-
-    private void setFonts(Composite control)
-    {
-        Composite p = control.getParent();
-        for (Control c : control.getChildren())
-        {
-            c.setFont(p.getFont());
-            if (c instanceof Composite)
-            {
-                setFonts((Composite) c);
-            }
-        }
-    }
-
-    private void setProjectSpecific(boolean projectSpecific)
-    {
-        if (this.projectSpecific != projectSpecific)
-        {
-            this.projectSpecific = projectSpecific;
-            settings.setEnabled(projectSpecific);
-            for (Control c : settings.getChildren())
-            {
-                c.setEnabled(projectSpecific);
-            }
-            projectSpecificBtn.setSelection(projectSpecific);
-        }
-    }
-
-    private void createSettings(Composite parent)
-    {
-        Composite control = new Composite(parent, SWT.NONE);
-
-        new Label(control, SWT.NONE).setText("Repository Set:");
-        Combo combo = new Combo(control, SWT.SINGLE);
-
-        setView = new ComboViewer(combo);
-        setView.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        setView.setInput(SigilCore.getRepositoryConfiguration().loadRepositorySets().keySet());
-
-        // layout
-        control.setLayout(new GridLayout(2, false));
-    }
-
-    private String getCurrentSet()
-    {
-        try
-        {
-            IProject p = (IProject) getElement().getAdapter(IProject.class);
-            ISigilProjectModel model = SigilCore.create(p);
-            return model.getPreferences().get(SigilCore.REPOSITORY_SET, null);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to read repository set", e);
-            return null;
-        }
-    }
-
-    @Override
-    public boolean okToLeave()
-    {
-        if (projectSpecific)
-        {
-            if (setView.getSelection().isEmpty())
-            {
-                setErrorMessage("Must select a repository set");
-                return false;
-            }
-        }
-        setErrorMessage(null);
-        return true;
-    }
-
-    @Override
-    public boolean performOk()
-    {
-        return ProjectUtils.runTaskWithRebuildCheck(new Callable<Boolean>()
-        {
-            public Boolean call() throws CoreException, BackingStoreException
-            {
-                String set = null;
-                if (projectSpecific)
-                {
-                    set = (String) ((IStructuredSelection) setView.getSelection()).getFirstElement();
-                }
-
-                IProject p = (IProject) getElement().getAdapter(IProject.class);
-                ISigilProjectModel model = SigilCore.create(p);
-                model.getPreferences().put(SigilCore.REPOSITORY_SET, set);
-                model.getPreferences().flush();
-                return true;
-            }
-
-        }, getShell());
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
index 0a89a61..ca922d2 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
@@ -121,6 +121,8 @@
         {
             e.store();
         }
+        getModel().getPreferences().setValue("provider", getModel().getType().getProvider());
+
     }
 
 }
