diff --git a/sigil/common/core/src/org/apache/felix/sigil/bnd/BundleBuilder.java b/sigil/common/core/src/org/apache/felix/sigil/bnd/BundleBuilder.java
index 33a3a2d..806a74d 100644
--- a/sigil/common/core/src/org/apache/felix/sigil/bnd/BundleBuilder.java
+++ b/sigil/common/core/src/org/apache/felix/sigil/bnd/BundleBuilder.java
@@ -453,7 +453,9 @@
         // instructions we generate?
         spec.putAll( headers );
 
-        spec.setProperty( Constants.BUNDLE_SYMBOLICNAME, bundle.getSymbolicName() );
+        String sn = bundle.isSingleton() ? bundle.getSymbolicName() + ";singleton:=true" : bundle.getSymbolicName();
+        
+        spec.setProperty( Constants.BUNDLE_SYMBOLICNAME, sn );
         spec.setProperty( Constants.BUNDLE_VERSION, bundle.getVersion() );
 
         String activator = bundle.getActivator();
@@ -733,13 +735,50 @@
             omitUnusedImports = false;
         }
 
-        List<IPackageImport> imports = getImports( bundle );
-
         sb.setLength( 0 );
 
         // allow existing header;Package-Import to specify ignored packages
         sb.append( spec.getProperty( Constants.IMPORT_PACKAGE, "" ) );
 
+        buildImports(sb, getImports( bundle ));
+        
+        if ( sb.length() > 0 )
+        {
+            spec.setProperty( Constants.IMPORT_PACKAGE, sb.toString() );
+        }
+
+        sb.setLength( 0 );
+        
+        buildRequires(sb, bundle.getRequires());
+
+        if ( sb.length() > 0 )
+        {
+            spec.setProperty( Constants.REQUIRE_BUNDLE, sb.toString() );
+        }
+    }
+
+
+    /**
+     * @param sb
+     * @param list 
+     */
+    private void buildRequires( StringBuilder sb, List<IRequiredBundle> requires )
+    {
+        for ( IRequiredBundle rb : requires )
+        {
+            if ( sb.length() > 0 )
+                sb.append( "," );
+            sb.append( rb.getSymbolicName() );
+            addVersions( rb.getVersions(), sb );
+        }
+    }
+
+
+    /**
+     * @param sb
+     */
+    private void buildImports( StringBuilder sb, List<IPackageImport> imports )
+    {
         for ( IPackageImport pi : imports )
         {
             switch ( pi.getOSGiImport() )
@@ -789,22 +828,6 @@
                 sb.append( "," );
             sb.append( "*" );
         }
-
-        spec.setProperty( Constants.IMPORT_PACKAGE, sb.toString() );
-
-        sb.setLength( 0 );
-        for ( IRequiredBundle rb : bundle.getRequires() )
-        {
-            if ( sb.length() > 0 )
-                sb.append( "," );
-            sb.append( rb.getSymbolicName() );
-            addVersions( rb.getVersions(), sb );
-        }
-
-        if ( sb.length() > 0 )
-        {
-            spec.setProperty( Constants.REQUIRE_BUNDLE, sb.toString() );
-        }
     }
 
 
diff --git a/sigil/common/core/src/org/apache/felix/sigil/config/BldConfig.java b/sigil/common/core/src/org/apache/felix/sigil/config/BldConfig.java
index f51bdc4..08d4cca 100644
--- a/sigil/common/core/src/org/apache/felix/sigil/config/BldConfig.java
+++ b/sigil/common/core/src/org/apache/felix/sigil/config/BldConfig.java
@@ -43,11 +43,12 @@
     // string properties
     public static final String S_ACTIVATOR = "-activator";
     public static final String S_DEFAULTS = "-defaults";
+    public static final String S_SINGLETON = "-singleton";
     public static final String S_ID = "id";
     public static final String S_SYM_NAME = "name";
     public static final String S_VERSION = "version";
     public static final String[] STRING_KEYS =
-        { S_ACTIVATOR, S_DEFAULTS, S_ID, S_SYM_NAME, S_VERSION };
+        { S_ACTIVATOR, S_DEFAULTS, S_ID, S_SYM_NAME, S_VERSION, S_SINGLETON };
 
     // list properties
     public static final String L_COMPOSITES = "-composites";
diff --git a/sigil/common/core/src/org/apache/felix/sigil/config/BldConverter.java b/sigil/common/core/src/org/apache/felix/sigil/config/BldConverter.java
index 3c64efe..88a30c0 100644
--- a/sigil/common/core/src/org/apache/felix/sigil/config/BldConverter.java
+++ b/sigil/common/core/src/org/apache/felix/sigil/config/BldConverter.java
@@ -36,7 +36,6 @@
 import org.apache.felix.sigil.core.internal.model.eclipse.SigilBundle;
 import org.apache.felix.sigil.core.internal.model.osgi.BundleModelElement;
 import org.apache.felix.sigil.model.common.VersionRange;
-import org.apache.felix.sigil.model.eclipse.ISCAComposite;
 import org.apache.felix.sigil.model.eclipse.ISigilBundle;
 import org.apache.felix.sigil.model.osgi.IBundleModelElement;
 import org.apache.felix.sigil.model.osgi.IPackageExport;
@@ -272,23 +271,226 @@
     {
         IBundleModelElement info = bundle.getBundleInfo();
         String bundleVersion = config.getString( id, BldConfig.S_VERSION );
-
-        // exports
         Map<String, Map<String, String>> exports = new TreeMap<String, Map<String, String>>();
-        for ( IPackageExport export : info.getExports() )
+        
+        setSimpleHeaders(id, info);
+        setExports(id, bundleVersion, info, exports);
+        setImports(id, bundleVersion, info, exports);
+        setRequires(id, bundleVersion, info);
+        setFragments(id, info);
+        setContents(id, info, bundle);
+        setLibraries(id, info, bundle);
+        setResources(id, info, bundle);
+
+        if ( info.getSourceLocation() != null )
+        {
+            BldCore.error( "SourceLocation conversion not yet implemented." );
+        }
+
+        if ( !info.getLibraryImports().isEmpty() )
+        {
+            BldCore.error( "LibraryImports conversion not yet implemented." );
+        }
+    }
+
+
+    /**
+     * @param id
+     * @param info
+     */
+    private void setSimpleHeaders( String id, IBundleModelElement info )
+    {
+        List<String> ids = config.getList( null, BldConfig.C_BUNDLES );
+        String idBsn = id != null ? id : ids.get( 0 );
+        String oldBsn = config.getString( id, BldConfig.S_SYM_NAME );
+        String bsn = info.getSymbolicName();
+
+        if ( !bsn.equals( idBsn ) || oldBsn != null )
+            config.setString( id, BldConfig.S_SYM_NAME, bsn );
+
+        String version = info.getVersion().toString();
+        if ( version != null )
+            config.setString( id, BldConfig.S_VERSION, version );
+
+        String activator = info.getActivator();
+        if ( activator != null )
+            config.setString( id, BldConfig.S_ACTIVATOR, activator );
+
+        Properties headers = config.getProps( null, BldConfig.P_HEADER );
+
+        setHeader( headers, id, "CATEGORY", info.getCategory() );
+        setHeader( headers, id, Constants.BUNDLE_CONTACTADDRESS, info.getContactAddress() );
+        setHeader( headers, id, Constants.BUNDLE_COPYRIGHT, info.getCopyright() );
+        setHeader( headers, id, Constants.BUNDLE_DESCRIPTION, info.getDescription() );
+        setHeader( headers, id, Constants.BUNDLE_VENDOR, info.getVendor() );
+        setHeader( headers, id, Constants.BUNDLE_NAME, info.getName() );
+
+        if ( info.getDocURI() != null )
+            config.setProp( id, BldConfig.P_HEADER, Constants.BUNDLE_DOCURL, info.getDocURI().toString() );
+
+        if ( info.getLicenseURI() != null )
+            config.setProp( id, BldConfig.P_HEADER, Constants.BUNDLE_LICENSE, info.getLicenseURI().toString() );
+    }
+
+
+    /**
+     * @param id
+     * @param info
+     * @param bundle 
+     */
+    private void setResources( String id, IBundleModelElement info, ISigilBundle bundle )
+    {
+        // resources
+        ArrayList<String> resources = new ArrayList<String>();
+        for ( IPath ipath : bundle.getSourcePaths() )
+        {
+            resources.add( ipath.toString() );
+        }
+
+        if ( !resources.isEmpty() || !config.getList( id, BldConfig.L_RESOURCES ).isEmpty() )
+        {
+            Collections.sort( resources );
+            config.setList( id, BldConfig.L_RESOURCES, resources );
+        }
+    }
+
+
+    /**
+     * @param id 
+     * @param info
+     * @param bundle 
+     */
+    private void setLibraries( String id, IBundleModelElement info, ISigilBundle bundle )
+    {
+        // libs
+        Map<String, Map<String, String>> libs = new TreeMap<String, Map<String, String>>();
+        List<String> sources = new ArrayList<String>();
+
+        // classpathEntries map to -libs or -sources
+        for ( String entry : bundle.getClasspathEntrys() )
+        {
+            // <classpathentry kind="lib" path="lib/dependee.jar"/>
+            // <classpathentry kind="src" path="src"/>
+            final String regex = ".* kind=\"([^\"]+)\" path=\"([^\"]+)\".*";
+            Pattern pattern = Pattern.compile( regex );
+            Matcher matcher = pattern.matcher( entry );
+            if ( matcher.matches() )
+            {
+                String kind = matcher.group( 1 );
+                String path = matcher.group( 2 );
+                if ( kind.equals( "lib" ) )
+                {
+                    Map<String, String> map2 = new TreeMap<String, String>();
+                    map2.put( BldAttr.KIND_ATTRIBUTE, "classpath" );
+                    libs.put( path, map2 );
+                }
+                else if ( kind.equals( "src" ) )
+                {
+                    sources.add( path );
+                }
+                else
+                {
+                    BldCore.error( "unknown classpathentry kind=" + kind );
+                }
+            }
+            else
+            {
+                BldCore.error( "can't match classpathEntry in: " + entry );
+            }
+        }
+
+        if ( !libs.isEmpty() || !config.getMap( id, BldConfig.M_LIBS ).isEmpty() )
+        {
+            config.setMap( id, BldConfig.M_LIBS, libs );
+        }
+
+        if ( !sources.isEmpty() || !config.getList( id, BldConfig.L_SRC_CONTENTS ).isEmpty() )
+        {
+            config.setList( id, BldConfig.L_SRC_CONTENTS, sources );
+        }
+
+    }
+
+
+    /**
+     * @param id 
+     * @param info
+     * @param bundle 
+     */
+    private void setContents( String id, IBundleModelElement info, ISigilBundle bundle )
+    {
+        // contents
+        List<String> contents = new ArrayList<String>();
+        for ( String pkg : bundle.getPackages() )
+        {
+            contents.add( pkg );
+        }
+        if ( !contents.isEmpty() || !config.getList( id, BldConfig.L_CONTENTS ).isEmpty() )
+        {
+            config.setList( id, BldConfig.L_CONTENTS, contents );
+        }
+    }
+
+
+    /**
+     * @param id
+     * @param info
+     */
+    private void setFragments( String id, IBundleModelElement info )
+    {
+        Properties defaultBundles = config.getProps( null, BldConfig.P_BUNDLE_VERSION );
+        Map<String, Map<String, String>> fragments = new TreeMap<String, Map<String, String>>();
+        IRequiredBundle fragment = info.getFragmentHost();
+        if ( fragment != null )
         {
             Map<String, String> map2 = new TreeMap<String, String>();
-            String version = export.getVersion().toString();
-            if ( !version.equals( bundleVersion ) )
-                map2.put( BldAttr.VERSION_ATTRIBUTE, version );
-            exports.put( export.getPackageName(), map2 );
+            String name = fragment.getSymbolicName();
+            VersionRange versions = defaultVersion( fragment.getVersions(), defaultBundles.getProperty( name ) );
+            if ( versions != null )
+                map2.put( BldAttr.VERSION_ATTRIBUTE, versions.toString() );
+            fragments.put( name, map2 );
         }
-
-        if ( !exports.isEmpty() || !config.getMap( id, BldConfig.M_EXPORTS ).isEmpty() )
+        if ( !fragments.isEmpty() || !config.getMap( id, BldConfig.M_FRAGMENT ).isEmpty() )
         {
-            config.setMap( id, BldConfig.M_EXPORTS, exports );
+            config.setMap( id, BldConfig.M_FRAGMENT, fragments );
         }
+    }
 
+
+    /**
+     * @param id
+     * @param bundleVersion
+     * @param info
+     */
+    private void setRequires( String id, String bundleVersion, IBundleModelElement info )
+    {
+        // requires
+        Properties defaultBundles = config.getProps( null, BldConfig.P_BUNDLE_VERSION );
+        Map<String, Map<String, String>> requires = new TreeMap<String, Map<String, String>>();
+
+        for ( IRequiredBundle require : info.getRequiredBundles() )
+        {
+            Map<String, String> map2 = new TreeMap<String, String>();
+            String name = require.getSymbolicName();
+            VersionRange versions = defaultVersion( require.getVersions(), defaultBundles.getProperty( name ) );
+            if ( versions != null )
+                map2.put( BldAttr.VERSION_ATTRIBUTE, versions.toString() );
+            requires.put( name, map2 );
+        }
+        if ( !requires.isEmpty() || !config.getMap( id, BldConfig.M_REQUIRES ).isEmpty() )
+        {
+            config.setMap( id, BldConfig.M_REQUIRES, requires );
+        }
+    }
+
+
+    /**
+     * @param bundleVersion 
+     * @param info
+     * @param exports 
+     */
+    private void setImports( String id, String bundleVersion, IBundleModelElement info, Map<String, Map<String, String>> exports )
+    {
         // imports
         Map<String, Map<String, String>> imports = new TreeMap<String, Map<String, String>>();
 
@@ -344,182 +546,31 @@
         {
             config.setMap( id, BldConfig.M_IMPORTS, imports );
         }
+    }
 
-        // requires
-        Properties defaultBundles = config.getProps( null, BldConfig.P_BUNDLE_VERSION );
-        Map<String, Map<String, String>> requires = new TreeMap<String, Map<String, String>>();
 
-        for ( IRequiredBundle require : info.getRequiredBundles() )
+    /**
+     * @param id 
+     * @param info 
+     * @param bundleVersion 
+     * @param exports 
+     * 
+     */
+    private void setExports(String id, String bundleVersion, IBundleModelElement info, Map<String, Map<String, String>> exports)
+    {
+        for ( IPackageExport export : info.getExports() )
         {
             Map<String, String> map2 = new TreeMap<String, String>();
-            String name = require.getSymbolicName();
-            VersionRange versions = defaultVersion( require.getVersions(), defaultBundles.getProperty( name ) );
-            if ( versions != null )
-                map2.put( BldAttr.VERSION_ATTRIBUTE, versions.toString() );
-            requires.put( name, map2 );
+            String version = export.getVersion().toString();
+            if ( !version.equals( bundleVersion ) )
+                map2.put( BldAttr.VERSION_ATTRIBUTE, version );
+            exports.put( export.getPackageName(), map2 );
         }
-        if ( !requires.isEmpty() || !config.getMap( id, BldConfig.M_REQUIRES ).isEmpty() )
+
+        if ( !exports.isEmpty() || !config.getMap( id, BldConfig.M_EXPORTS ).isEmpty() )
         {
-            config.setMap( id, BldConfig.M_REQUIRES, requires );
+            config.setMap( id, BldConfig.M_EXPORTS, exports );
         }
-
-        // fragment
-        Map<String, Map<String, String>> fragments = new TreeMap<String, Map<String, String>>();
-        IRequiredBundle fragment = info.getFragmentHost();
-        if ( fragment != null )
-        {
-            Map<String, String> map2 = new TreeMap<String, String>();
-            String name = fragment.getSymbolicName();
-            VersionRange versions = defaultVersion( fragment.getVersions(), defaultBundles.getProperty( name ) );
-            if ( versions != null )
-                map2.put( BldAttr.VERSION_ATTRIBUTE, versions.toString() );
-            fragments.put( name, map2 );
-        }
-        if ( !fragments.isEmpty() || !config.getMap( id, BldConfig.M_FRAGMENT ).isEmpty() )
-        {
-            config.setMap( id, BldConfig.M_FRAGMENT, fragments );
-        }
-
-        // contents
-        List<String> contents = new ArrayList<String>();
-        for ( String pkg : bundle.getPackages() )
-        {
-            contents.add( pkg );
-        }
-        if ( !contents.isEmpty() || !config.getList( id, BldConfig.L_CONTENTS ).isEmpty() )
-        {
-            config.setList( id, BldConfig.L_CONTENTS, contents );
-        }
-
-        // dl contents
-        List<String> dlcontents = new ArrayList<String>();
-        for ( String pkg : bundle.getDownloadPackages() )
-        {
-            dlcontents.add( pkg );
-        }
-        if ( !dlcontents.isEmpty() || !config.getList( id, BldConfig.L_DL_CONTENTS ).isEmpty() )
-        {
-            config.setList( id, BldConfig.L_DL_CONTENTS, dlcontents );
-        }
-
-        // libs
-        Map<String, Map<String, String>> libs = new TreeMap<String, Map<String, String>>();
-        List<String> sources = new ArrayList<String>();
-
-        // classpathEntries map to -libs or -sources
-        for ( String entry : bundle.getClasspathEntrys() )
-        {
-            // <classpathentry kind="lib" path="lib/dependee.jar"/>
-            // <classpathentry kind="src" path="src"/>
-            final String regex = ".* kind=\"([^\"]+)\" path=\"([^\"]+)\".*";
-            Pattern pattern = Pattern.compile( regex );
-            Matcher matcher = pattern.matcher( entry );
-            if ( matcher.matches() )
-            {
-                String kind = matcher.group( 1 );
-                String path = matcher.group( 2 );
-                if ( kind.equals( "lib" ) )
-                {
-                    Map<String, String> map2 = new TreeMap<String, String>();
-                    map2.put( BldAttr.KIND_ATTRIBUTE, "classpath" );
-                    libs.put( path, map2 );
-                }
-                else if ( kind.equals( "src" ) )
-                {
-                    sources.add( path );
-                }
-                else
-                {
-                    BldCore.error( "unknown classpathentry kind=" + kind );
-                }
-            }
-            else
-            {
-                BldCore.error( "can't match classpathEntry in: " + entry );
-            }
-        }
-
-        if ( !libs.isEmpty() || !config.getMap( id, BldConfig.M_LIBS ).isEmpty() )
-        {
-            config.setMap( id, BldConfig.M_LIBS, libs );
-        }
-
-        if ( !sources.isEmpty() || !config.getList( id, BldConfig.L_SRC_CONTENTS ).isEmpty() )
-        {
-            config.setList( id, BldConfig.L_SRC_CONTENTS, sources );
-        }
-
-        // composites
-        ArrayList<String> composites = new ArrayList<String>();
-        for ( ISCAComposite composite : bundle.getComposites() )
-        {
-            String path = composite.getLocation().toString();
-            // TODO relativize
-            composites.add( path );
-        }
-
-        if ( !composites.isEmpty() || !config.getList( id, BldConfig.L_COMPOSITES ).isEmpty() )
-        {
-            Collections.sort( composites );
-            config.setList( id, BldConfig.L_COMPOSITES, composites );
-        }
-
-        // resources
-        ArrayList<String> resources = new ArrayList<String>();
-        for ( IPath ipath : bundle.getSourcePaths() )
-        {
-            resources.add( ipath.toString() );
-        }
-
-        if ( !resources.isEmpty() || !config.getList( id, BldConfig.L_RESOURCES ).isEmpty() )
-        {
-            Collections.sort( resources );
-            config.setList( id, BldConfig.L_RESOURCES, resources );
-        }
-
-        if ( info.getSourceLocation() != null )
-        {
-            BldCore.error( "SourceLocation conversion not yet implemented." );
-        }
-
-        if ( !info.getLibraryImports().isEmpty() )
-        {
-            BldCore.error( "LibraryImports conversion not yet implemented." );
-        }
-
-        ////////////////////
-        // simple headers
-
-        List<String> ids = config.getList( null, BldConfig.C_BUNDLES );
-        String idBsn = id != null ? id : ids.get( 0 );
-        String oldBsn = config.getString( id, BldConfig.S_SYM_NAME );
-        String bsn = info.getSymbolicName();
-
-        if ( !bsn.equals( idBsn ) || oldBsn != null )
-            config.setString( id, BldConfig.S_SYM_NAME, bsn );
-
-        String version = info.getVersion().toString();
-        if ( version != null )
-            config.setString( id, BldConfig.S_VERSION, version );
-
-        String activator = info.getActivator();
-        if ( activator != null )
-            config.setString( id, BldConfig.S_ACTIVATOR, activator );
-
-        Properties headers = config.getProps( null, BldConfig.P_HEADER );
-
-        setHeader( headers, id, "CATEGORY", info.getCategory() );
-        setHeader( headers, id, Constants.BUNDLE_CONTACTADDRESS, info.getContactAddress() );
-        setHeader( headers, id, Constants.BUNDLE_COPYRIGHT, info.getCopyright() );
-        setHeader( headers, id, Constants.BUNDLE_DESCRIPTION, info.getDescription() );
-        setHeader( headers, id, Constants.BUNDLE_VENDOR, info.getVendor() );
-        setHeader( headers, id, Constants.BUNDLE_NAME, info.getName() );
-
-        if ( info.getDocURI() != null )
-            config.setProp( id, BldConfig.P_HEADER, Constants.BUNDLE_DOCURL, info.getDocURI().toString() );
-
-        if ( info.getLicenseURI() != null )
-            config.setProp( id, BldConfig.P_HEADER, Constants.BUNDLE_LICENSE, info.getLicenseURI().toString() );
     }
 
 
diff --git a/sigil/common/core/src/org/apache/felix/sigil/config/BldProject.java b/sigil/common/core/src/org/apache/felix/sigil/config/BldProject.java
index f52c700..4501d7a 100644
--- a/sigil/common/core/src/org/apache/felix/sigil/config/BldProject.java
+++ b/sigil/common/core/src/org/apache/felix/sigil/config/BldProject.java
@@ -42,7 +42,6 @@
 import java.util.Properties;
 import java.util.TreeSet;
 
-import org.apache.felix.sigil.bnd.BundleBuilder;
 import org.apache.felix.sigil.core.internal.model.osgi.BundleModelElement;
 import org.apache.felix.sigil.core.internal.model.osgi.PackageExport;
 import org.apache.felix.sigil.core.internal.model.osgi.PackageImport;
@@ -53,8 +52,8 @@
 import org.apache.felix.sigil.model.osgi.IBundleModelElement;
 import org.apache.felix.sigil.model.osgi.IPackageExport;
 import org.apache.felix.sigil.model.osgi.IPackageImport;
-import org.apache.felix.sigil.model.osgi.IRequiredBundle;
 import org.apache.felix.sigil.model.osgi.IPackageImport.OSGiImport;
+import org.apache.felix.sigil.model.osgi.IRequiredBundle;
 import org.osgi.framework.Version;
 
 
@@ -182,6 +181,7 @@
                 }
 
                 Properties p = new Properties();
+                // FIXME stream not closed
                 p.load( url.openStream() );
                 dflt.merge( p );
 
@@ -430,6 +430,22 @@
         List<String> sourceContents = getSourcePkgs();
         HashSet<String> exports = new HashSet<String>();
 
+        parseExports(reqs, exports);
+        
+        parseImports(reqs, sourceContents, exports);
+        
+        parseRequires(reqs);
+        
+        return reqs;
+    }
+
+
+    /**
+     * @param reqs
+     * @param exports
+     */
+    private void parseExports( BundleModelElement reqs, HashSet<String> exports )
+    {
         for ( IBldBundle bundle : getBundles() )
         {
             for ( IPackageExport export : bundle.getExports() )
@@ -437,7 +453,62 @@
                 exports.add( export.getPackageName() );
             }
         }
+    }
 
+
+    /**
+     * @param reqs
+     * @throws IOException 
+     */
+    private void parseRequires( BundleModelElement reqs ) throws IOException
+    {
+        Map<String, Map<String, String>> requires = config.getMap( null, BldConfig.M_REQUIRES );
+        Properties bundleDefaults = config.getProps( null, BldConfig.P_BUNDLE_VERSION );
+
+        if ( requires != null )
+        {
+            for ( String name : requires.keySet() )
+            {
+                Map<String, String> attr = requires.get( name );
+                String versions = attr.containsKey( BldAttr.VERSION_ATTRIBUTE ) ? attr.get( BldAttr.VERSION_ATTRIBUTE )
+                    : bundleDefaults.getProperty( name );
+                String resolution = attr.get( BldAttr.RESOLUTION_ATTRIBUTE );
+
+                RequiredBundle rb = new RequiredBundle();
+                rb.setSymbolicName( name );
+                rb.setVersions( VersionRange.parseVersionRange( versions ) );
+
+                if ( BldAttr.RESOLUTION_OPTIONAL.equals( resolution ) )
+                {
+                    rb.setOptional( true );
+                }
+                else if ( resolution != null )
+                {
+                    throw new IOException( "Bad attribute value: " + BldAttr.RESOLUTION_ATTRIBUTE + "=" + resolution );
+                }
+
+                reqs.addRequiredBundle( rb );
+            }
+        }
+
+        for ( IBldBundle bundle : getBundles() )
+        {
+            IRequiredBundle fh = bundle.getFragmentHost();
+            if ( fh != null )
+                reqs.addRequiredBundle( fh );
+        }
+    }
+
+
+    /**
+     * @param reqs 
+     * @param exports 
+     * @param sourceContents 
+     * @throws IOException 
+     * 
+     */
+    private void parseImports(BundleModelElement reqs, List<String> sourceContents, HashSet<String> exports) throws IOException
+    {
         Map<String, Map<String, String>> imports = config.getMap( null, BldConfig.M_IMPORTS );
 
         for ( String name : imports.keySet() )
@@ -482,34 +553,6 @@
 
             reqs.addImport( pi );
         }
-
-        Map<String, Map<String, String>> requires = config.getMap( null, BldConfig.M_REQUIRES );
-        Properties bundleDefaults = config.getProps( null, BldConfig.P_BUNDLE_VERSION );
-
-        if ( requires != null )
-        {
-            for ( String name : requires.keySet() )
-            {
-                Map<String, String> attr = requires.get( name );
-                String versions = attr.containsKey( BldAttr.VERSION_ATTRIBUTE ) ? attr.get( BldAttr.VERSION_ATTRIBUTE )
-                    : bundleDefaults.getProperty( name );
-
-                RequiredBundle rb = new RequiredBundle();
-                rb.setSymbolicName( name );
-                rb.setVersions( VersionRange.parseVersionRange( versions ) );
-
-                reqs.addRequiredBundle( rb );
-            }
-        }
-
-        for ( IBldBundle bundle : getBundles() )
-        {
-            IRequiredBundle fh = bundle.getFragmentHost();
-            if ( fh != null )
-                reqs.addRequiredBundle( fh );
-        }
-
-        return reqs;
     }
 
 
@@ -809,6 +852,12 @@
         }
 
 
+        private boolean getBoolean( String key )
+        {
+            return Boolean.parseBoolean( getString( key ) );
+        }
+
+
         private List<String> getList( String key )
         {
             List<String> list = config.getList( id, key );
@@ -854,6 +903,12 @@
         }
 
 
+        public boolean isSingleton()
+        {
+            return getBoolean( BldConfig.S_SINGLETON );
+        }
+
+
         public List<IPackageExport> getExports()
         {
             ArrayList<IPackageExport> list = new ArrayList<IPackageExport>();
diff --git a/sigil/common/core/src/org/apache/felix/sigil/config/IBldProject.java b/sigil/common/core/src/org/apache/felix/sigil/config/IBldProject.java
index bc01b5a..e6cd340 100644
--- a/sigil/common/core/src/org/apache/felix/sigil/config/IBldProject.java
+++ b/sigil/common/core/src/org/apache/felix/sigil/config/IBldProject.java
@@ -233,5 +233,11 @@
          * resolves a relative path against the project file location.
          */
         File resolve( String path );
+
+
+        /**
+         * @return
+         */
+        boolean isSingleton();
     }
 }
