diff --git a/sigil/eclipse/runtime/sigil.properties b/sigil/eclipse/runtime/sigil.properties
index 4c4738e..45f2b4d 100644
--- a/sigil/eclipse/runtime/sigil.properties
+++ b/sigil/eclipse/runtime/sigil.properties
@@ -13,21 +13,30 @@
 	src, \
 
 -imports: \
-	org.apache.felix.sigil.common.runtime;version=0.9.0, \
-	org.apache.felix.sigil.eclipse;version=0.9.0, \
+	org.apache.felix.sigil.common.runtime, \
+	org.apache.felix.sigil.eclipse, \
 	org.apache.felix.sigil.eclipse.install, \
+	org.apache.felix.sigil.model, \
+	org.apache.felix.sigil.model.eclipse, \
+	org.apache.felix.sigil.model.osgi, \
+	org.apache.felix.sigil.repository, \
+	org.apache.felix.sigil.ui.eclipse.ui, \
+	org.apache.felix.sigil.ui.eclipse.ui.util, \
+	org.apache.felix.sigil.utils, \
 	org.eclipse.core.resources, \
 	org.eclipse.jdt.debug.ui.launchConfigurations, \
+	org.eclipse.jface.fieldassist, \
 	org.eclipse.jface.viewers, \
-	org.eclipse.swt.graphics, \
-	org.eclipse.swt.widgets, \
+	org.osgi.framework, \
 
 -requires: \
+	org.eclipse.core.jobs;version=3.4.1, \
 	org.eclipse.core.runtime;version=3.4.0, \
 	org.eclipse.debug.core;version=3.4.1, \
 	org.eclipse.debug.ui;version=3.4.2, \
 	org.eclipse.equinox.common;version=3.4.0, \
 	org.eclipse.jdt.launching;version=3.4.1, \
+	org.eclipse.swt;version=3.4.2, \
 	org.eclipse.ui.workbench;version=3.4.2, \
 
 # end
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java
index 5a86712..a02902c 100644
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java
+++ b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/LaunchHelper.java
@@ -28,12 +28,6 @@
 public class LaunchHelper {
 
 	public static IOSGiInstall getInstall(ILaunchConfiguration config) {
-//	    OSGiInstall install = new OSGiInstall( "felix" );
-//	    OSGiInstallType type = new OSGiInstallType();
-//	    type.setMainClass( "org.apache.felix.main.Main" );
-//	    type.setClassPath( new String[] { "/Users/dave/development/felix-trunk/main/target/org.apache.felix.main-1.9.0-SNAPSHOT.jar" } );
-//	    install.setType( type );
-//		return install;
 	    return null;
 	}
 
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FilteredModelView.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FilteredModelView.java
new file mode 100644
index 0000000..de377b1
--- /dev/null
+++ b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/FilteredModelView.java
@@ -0,0 +1,254 @@
+package org.apache.felix.sigil.eclipse.runtime.config;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.felix.sigil.ui.eclipse.ui.SigilUI;
+import org.apache.felix.sigil.ui.eclipse.ui.util.DefaultLabelProvider;
+import org.apache.felix.sigil.ui.eclipse.ui.util.IElementDescriptor;
+import org.apache.felix.sigil.ui.eclipse.ui.util.IFilter;
+import org.apache.felix.sigil.ui.eclipse.ui.util.UIHelper;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+
+public class FilteredModelView<T> extends Composite
+{
+    private ArrayList<T> selected = new ArrayList<T>();
+    private ArrayList<T> elements = new ArrayList<T>();
+    private IElementDescriptor<T> elementDescriptor = UIHelper.getDefaultElementDescriptor();
+    private IFilter<T> filter = UIHelper.getDefaultFilter();
+    private StructuredViewer viewer;
+    private String txt = "";
+
+
+    public FilteredModelView( Composite parent, int style )
+    {
+        super( parent, style );
+        initLayout();
+    }
+
+    public List<T> getSelectedElements()
+    {
+        return selected;
+    }
+
+
+    public List<T> getElements()
+    {
+        return elements;
+    }
+
+    public void addElement( T element )
+    {
+        elements.add( element );
+        refresh();
+    }
+
+
+    public void addElements( Collection<T> elements )
+    {
+        this.elements.addAll( elements );
+        refresh();
+    }
+
+
+    public void removeElement( T element )
+    {
+        elements.remove( element );
+        refresh();
+    }
+
+
+    public void removeElements( Collection<T> elements )
+    {
+        this.elements.removeAll( elements );
+        refresh();
+    }
+
+    public void refresh()
+    {
+        SigilUI.runInUI( new Runnable() {
+
+            public void run()
+            {
+                viewer.refresh();
+            }
+        });
+    }
+
+    public void addChangeListener( IChangeListener listener ) {
+        
+    }
+    
+    private void initLayout()
+    {
+        Text bundleTxt = createSelectionBox( this );
+
+        Control view = createViewBox( this );
+
+        // layout
+        bundleTxt.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, false ) );
+        view.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
+
+        setLayout( new GridLayout( 1, false ) );
+    }
+
+
+    private Control createViewBox( Composite parent )
+    {
+        Table table = new Table( this, SWT.MULTI );
+
+        viewer = createViewer( table );
+
+        viewer.setContentProvider( new ArrayContentProvider() );
+
+        viewer.addSelectionChangedListener( new ISelectionChangedListener()
+        {
+            @SuppressWarnings("unchecked")
+            public void selectionChanged( SelectionChangedEvent event )
+            {
+                if ( event.getSelection().isEmpty() )
+                {
+                    selected.clear();
+                }
+                else
+                {
+                    IStructuredSelection sel = ( IStructuredSelection ) event.getSelection();
+                    System.out.println( "Selected " + sel.toList() );
+                    selected.addAll( sel.toList() );
+                }
+            }
+        } );
+        
+        viewer.setInput( elements );
+
+        viewer.setFilters( new ViewerFilter[]
+            { new ViewerFilter()
+            {
+                @SuppressWarnings("unchecked")
+                @Override
+                public boolean select( Viewer viewer, Object parentElement, Object element )
+                {
+                    if ( filter.select( ( T ) element ) )
+                    {
+                        String name = elementDescriptor.getName( ( T ) element );
+                        return name.startsWith( txt );
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+            } } );
+
+        return table;
+    }
+
+
+    protected StructuredViewer createViewer( Table table )
+    {
+        TableViewer tableViewer = new TableViewer( table );
+        
+        tableViewer.setLabelProvider( new DefaultLabelProvider() {
+
+            public Image getImage( Object arg0 )
+            {
+                return null;
+            }
+
+            @SuppressWarnings("unchecked")
+            public String getText( Object element )
+            {
+                return elementDescriptor.getLabel( ( T ) element );
+            }
+            
+        });
+
+        return tableViewer;
+    }
+
+
+    private Text createSelectionBox( Composite parent )
+    {
+        final Text txtSelection = new Text( parent, SWT.SEARCH );
+
+        txtSelection.addKeyListener( new KeyAdapter()
+        {
+            @Override
+            public void keyReleased( KeyEvent e )
+            {
+                txt = txtSelection.getText();
+                refresh();
+            }
+        } );
+        return txtSelection;
+    }
+
+
+    /*
+     *         ControlDecoration selectionDecor = new ControlDecoration( txtSelection, SWT.LEFT | SWT.TOP );
+        FieldDecoration proposalDecor = FieldDecorationRegistry.getDefault().getFieldDecoration(
+            FieldDecorationRegistry.DEC_CONTENT_PROPOSAL );
+        selectionDecor.setImage( proposalDecor.getImage() );
+        selectionDecor.setDescriptionText( proposalDecor.getDescription() );
+
+        ExclusionContentProposalProvider<T> proposalProvider = new ExclusionContentProposalProvider<T>(
+            elements, filter, elementDescriptor );
+
+        ContentProposalAdapter proposalAdapter = new ContentProposalAdapter( txtSelection, new TextContentAdapter(),
+            proposalProvider, null, null );
+        
+        proposalAdapter.addContentProposalListener( new IContentProposalListener() {
+            public void proposalAccepted( IContentProposal proposal )
+            {
+                WrappedContentProposal<T> valueProposal = (org.apache.felix.sigil.ui.eclipse.ui.util.WrappedContentProposal<T> ) proposal;
+                T selected = valueProposal.getElement();
+                selection = new ArrayList<E>( 1 );
+                selection.add( selected );
+            }            
+        });
+        
+        proposalAdapter.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE );
+
+     */
+
+    public void setElementDescriptor( IElementDescriptor<T> elementDescriptor )
+    {
+        if ( elementDescriptor == null )
+        {
+            elementDescriptor = UIHelper.getDefaultElementDescriptor();
+        }
+        this.elementDescriptor = elementDescriptor;
+    }
+
+
+    public void setFilter( IFilter<T> filter )
+    {
+        if ( filter == null )
+        {
+            filter = UIHelper.getDefaultFilter();
+        }
+        this.filter = filter;
+    }
+
+
+}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/IChangeListener.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/IChangeListener.java
new file mode 100644
index 0000000..7d23203
--- /dev/null
+++ b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/IChangeListener.java
@@ -0,0 +1,6 @@
+package org.apache.felix.sigil.eclipse.runtime.config;
+
+public interface IChangeListener
+{
+
+}
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiConfigurationView.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiConfigurationView.java
index 0af9ba6..19edfbc 100644
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiConfigurationView.java
+++ b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/config/OSGiConfigurationView.java
@@ -19,15 +19,36 @@
 
 package org.apache.felix.sigil.eclipse.runtime.config;
 
+
+import org.apache.felix.sigil.eclipse.SigilCore;
+import org.apache.felix.sigil.model.IModelElement;
+import org.apache.felix.sigil.model.IModelWalker;
+import org.apache.felix.sigil.model.eclipse.ISigilBundle;
+import org.apache.felix.sigil.ui.eclipse.ui.util.IElementDescriptor;
+import org.apache.felix.sigil.ui.eclipse.ui.util.IFilter;
+
+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;
 import org.eclipse.swt.SWT;
+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.Composite;
 
+
 /**
  * @author dave
  *
  */
 public class OSGiConfigurationView extends Composite
 {
+    private Job job;
+    private FilteredModelView<ISigilBundle> available;
+    private FilteredModelView<ISigilBundle> selected;
 
     /**
      * @param parent
@@ -35,17 +56,143 @@
      */
     public OSGiConfigurationView( Composite parent, OSGiLaunchConfigurationTab osGiLaunchConfigurationTab )
     {
-        super(parent, SWT.NONE);
+        super( parent, SWT.NONE );
         initLayout();
     }
 
+
+    @Override
+    public void dispose()
+    {
+        if ( job != null ) {
+            job.cancel();
+        }
+        
+        super.dispose();
+    }
+
+
     /**
      * 
      */
     private void initLayout()
     {
-        // TODO Auto-generated method stub
+        // components
+        Composite left = new Composite( this, SWT.NONE );
+        Composite middle = new Composite(this, SWT.NONE);
+        Composite right = new Composite(this, SWT.NONE);
+
+        available = new FilteredModelView<ISigilBundle>(left, SWT.NONE);
+        selected = new FilteredModelView<ISigilBundle>(right, SWT.NONE);
         
+        Button addBtn = new Button( middle, SWT.PUSH );
+        addBtn.setText( "->" );
+        Button removeBtn = new Button( middle, SWT.PUSH );
+        removeBtn.setText( "<-" );
+        
+        // customisations
+        addBtn.addSelectionListener( new SelectionAdapter()
+        {
+            @Override
+            public void widgetSelected( SelectionEvent e )
+            {
+                handleAdd();
+            }
+        } );
+        
+        removeBtn.addSelectionListener( new SelectionAdapter()
+        {
+            @Override
+            public void widgetSelected( SelectionEvent e )
+            {
+                handleRemove();
+            }
+        } );
+        
+        IElementDescriptor<ISigilBundle> descriptor = new IElementDescriptor<ISigilBundle>()
+        {
+            public String getLabel( ISigilBundle element )
+            {
+                return element.getSymbolicName() + " version " + element.getVersion();
+            }
+
+
+            public String getName( ISigilBundle element )
+            {
+                return element.getSymbolicName();
+            }
+        };
+        
+        available.setElementDescriptor( descriptor );
+        selected.setElementDescriptor( descriptor );
+        
+        available.setFilter( new IFilter<ISigilBundle>() {
+            public boolean select( ISigilBundle element )
+            {
+                return !selected.getElements().contains( element );
+            }
+        } );
+        
+        // layout
+        available.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
+        selected.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
+        
+        left.setLayout( new GridLayout( 1, false ) );
+        middle.setLayout( new GridLayout( 1, false ) );
+        right.setLayout( new GridLayout( 1, false ) );
+
+        left.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
+        middle.setLayoutData( new GridData( SWT.FILL, SWT.FILL, false, true ) );
+        right.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
+        
+        setLayout( new GridLayout( 3, false ) );
+        
+        startSearch(available);
     }
 
+    private void startSearch(final FilteredModelView<ISigilBundle> view) {
+        job = new Job( "Finding bundles" )
+        {
+            @Override
+            protected IStatus run( final IProgressMonitor monitor )
+            {
+                SigilCore.getGlobalRepositoryManager().visit( new IModelWalker()
+                {
+                    public boolean visit( IModelElement element )
+                    {
+                        if ( element instanceof ISigilBundle )
+                        {
+                            ISigilBundle sb = ( ISigilBundle ) element;
+                            
+                            view.addElement( sb );
+                            
+                            return false;
+                        }
+                        else
+                        {
+                            return !monitor.isCanceled();
+                        }
+                    }
+                } );
+
+                return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
+            }
+        };
+        job.schedule();
+    }
+
+
+    private void handleAdd()
+    {
+        selected.addElements( available.getSelectedElements() );
+        available.refresh();
+    }
+
+    private void handleRemove()
+    {
+        selected.removeElements( selected.getSelectedElements() );
+        available.refresh();
+    }
+
+
 }
