diff --git a/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Export.java b/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Export.java
deleted file mode 100644
index 59e0924..0000000
--- a/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Export.java
+++ /dev/null
@@ -1,289 +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.framework.util.manifestparser;
-
-import java.util.*;
-
-import org.apache.felix.framework.util.Util;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
-
-public class R4Export extends R4Package
-{
-    private String[] m_uses = null;
-    private String[][] m_includeFilter = null;
-    private String[][] m_excludeFilter = null;
-
-    public R4Export(String name, R4Directive[] directives, R4Attribute[] attrs)
-    {
-        super(name, directives, attrs);
-
-        // Find all export directives: uses, mandatory, include, and exclude.
-        String mandatory = "", uses = "";
-        for (int i = 0; i < m_directives.length; i++)
-        {
-            if (m_directives[i].getName().equals(Constants.USES_DIRECTIVE))
-            {
-                uses = m_directives[i].getValue();
-            }
-            else if (m_directives[i].getName().equals(Constants.MANDATORY_DIRECTIVE))
-            {
-                mandatory = m_directives[i].getValue();
-            }
-            else if (m_directives[i].getName().equals(Constants.INCLUDE_DIRECTIVE))
-            {
-                String[] ss = ManifestParser.parseDelimitedString(m_directives[i].getValue(), ",");
-                m_includeFilter = new String[ss.length][];
-                for (int filterIdx = 0; filterIdx < ss.length; filterIdx++)
-                {
-                    m_includeFilter[filterIdx] = parseSubstring(ss[filterIdx]);
-                }
-            }
-            else if (m_directives[i].getName().equals(Constants.EXCLUDE_DIRECTIVE))
-            {
-                String[] ss = ManifestParser.parseDelimitedString(m_directives[i].getValue(), ",");
-                m_excludeFilter = new String[ss.length][];
-                for (int filterIdx = 0; filterIdx < ss.length; filterIdx++)
-                {
-                    m_excludeFilter[filterIdx] = parseSubstring(ss[filterIdx]);
-                }
-            }
-        }
-
-        // Parse these uses directive.
-        StringTokenizer tok = new StringTokenizer(uses, ",");
-        m_uses = new String[tok.countTokens()];
-        for (int i = 0; i < m_uses.length; i++)
-        {
-            m_uses[i] = tok.nextToken().trim();
-        }
-
-        // Parse mandatory directive and mark specified
-        // attributes as mandatory.
-        tok = new StringTokenizer(mandatory, ",");
-        while (tok.hasMoreTokens())
-        {
-            // Get attribute name.
-            String attrName = tok.nextToken().trim();
-            // Find attribute and mark it as mandatory.
-            boolean found = false;
-            for (int i = 0; (!found) && (i < m_attrs.length); i++)
-            {
-                if (m_attrs[i].getName().equals(attrName))
-                {
-                    m_attrs[i] = new R4Attribute(
-                        m_attrs[i].getName(),
-                        m_attrs[i].getValue(), true);
-                    found = true;
-                }
-            }
-            // If a specified mandatory attribute was not found,
-            // then error.
-            if (!found)
-            {
-                throw new IllegalArgumentException(
-                    "Mandatory attribute '" + attrName + "' does not exist.");
-            }
-        }
-
-        // Cache version, if present.
-        for (int i = 0; i < m_attrs.length; i++)
-        {
-            if (m_attrs[i].getName().equals(Constants.VERSION_ATTRIBUTE))
-            {
-                m_version = (Version) m_attrs[i].getValue();
-                break;
-            }
-        }
-    }
-
-    public String[] getUses()
-    {
-        return m_uses;
-    }
-
-    public boolean isIncluded(String name)
-    {
-        if ((m_includeFilter == null) && (m_excludeFilter == null))
-        {
-            return true;
-        }
-
-        // Get the class name portion of the target class.
-        String className = Util.getClassName(name);
-
-        // If there are no include filters then all classes are included
-        // by default, otherwise try to find one match.
-        boolean included = (m_includeFilter == null);
-        for (int i = 0;
-            (!included) && (m_includeFilter != null) && (i < m_includeFilter.length);
-            i++)
-        {
-            included = checkSubstring(m_includeFilter[i], className);
-        }
-
-        // If there are no exclude filters then no classes are excluded
-        // by default, otherwise try to find one match.
-        boolean excluded = false;
-        for (int i = 0;
-            (!excluded) && (m_excludeFilter != null) && (i < m_excludeFilter.length);
-            i++)
-        {
-            excluded = checkSubstring(m_excludeFilter[i], className);
-        }
-        return included && !excluded;
-    }
-
-    //
-    // The following substring-related code was lifted and modified
-    // from the LDAP parser code.
-    //
-
-    private static String[] parseSubstring(String target)
-    {
-        List pieces = new ArrayList();
-        StringBuffer ss = new StringBuffer();
-        // int kind = SIMPLE; // assume until proven otherwise
-        boolean wasStar = false; // indicates last piece was a star
-        boolean leftstar = false; // track if the initial piece is a star
-        boolean rightstar = false; // track if the final piece is a star
-
-        int idx = 0;
-
-        // We assume (sub)strings can contain leading and trailing blanks
-        for (;;)
-        {
-            if (idx >= target.length())
-            {
-                if (wasStar)
-                {
-                    // insert last piece as "" to handle trailing star
-                    rightstar = true;
-                }
-                else
-                {
-                    pieces.add(ss.toString());
-                    // accumulate the last piece
-                    // note that in the case of
-                    // (cn=); this might be
-                    // the string "" (!=null)
-                }
-                ss.setLength(0);
-                break;
-            }
-
-            char c = target.charAt(idx++);
-            if (c == '*')
-            {
-                if (wasStar)
-                {
-                    // encountered two successive stars;
-                    // I assume this is illegal
-                    throw new IllegalArgumentException("Invalid filter string: " + target);
-                }
-                if (ss.length() > 0)
-                {
-                    pieces.add(ss.toString()); // accumulate the pieces
-                    // between '*' occurrences
-                }
-                ss.setLength(0);
-                // if this is a leading star, then track it
-                if (pieces.size() == 0)
-                {
-                    leftstar = true;
-                }
-                ss.setLength(0);
-                wasStar = true;
-            }
-            else
-            {
-                wasStar = false;
-                ss.append(c);
-            }
-        }
-        if (leftstar || rightstar || pieces.size() > 1)
-        {
-            // insert leading and/or trailing "" to anchor ends
-            if (rightstar)
-            {
-                pieces.add("");
-            }
-            if (leftstar)
-            {
-                pieces.add(0, "");
-            }
-        }
-        return (String[]) pieces.toArray(new String[pieces.size()]);
-    }
-
-    private static boolean checkSubstring(String[] pieces, String s)
-    {
-        // Walk the pieces to match the string
-        // There are implicit stars between each piece,
-        // and the first and last pieces might be "" to anchor the match.
-        // assert (pieces.length > 1)
-        // minimal case is <string>*<string>
-
-        boolean result = false;
-        int len = pieces.length;
-        int index = 0;
-
-        for (int i = 0; i < len; i++)
-        {
-            String piece = (String) pieces[i];
-            if (i == len - 1)
-            {
-                // this is the last piece
-                if (s.endsWith(piece))
-                {
-                    result = true;
-                }
-                else
-                {
-                    result = false;
-                }
-                break;
-            }
-            // initial non-star; assert index == 0
-            else if (i == 0)
-            {
-                if (!s.startsWith(piece))
-                {
-                    result = false;
-                    break;
-                }
-            }
-            // assert i > 0 && i < len-1
-            else
-            {
-                // Sure wish stringbuffer supported e.g. indexOf
-                index = s.indexOf(piece, index);
-                if (index < 0)
-                {
-                    result = false;
-                    break;
-                }
-            }
-            // start beyond the matching piece
-            index += piece.length();
-        }
-
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Import.java b/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Import.java
deleted file mode 100644
index f4490f8..0000000
--- a/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Import.java
+++ /dev/null
@@ -1,179 +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.framework.util.manifestparser;
-
-import org.apache.felix.framework.util.VersionRange;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
-
-public class R4Import extends R4Package
-{
-    private VersionRange m_versionRange = null;
-    private boolean m_isOptional = false;
-
-    public R4Import(String name, R4Directive[] directives, R4Attribute[] attrs)
-    {
-        super(name, directives, attrs);
-
-        // Find all import directives: resolution.
-        for (int i = 0; i < m_directives.length; i++)
-        {
-            if (m_directives[i].getName().equals(Constants.RESOLUTION_DIRECTIVE))
-            {
-                m_isOptional = m_directives[i].getValue().equals(Constants.RESOLUTION_OPTIONAL);
-            }
-        }
-
-        // Cache version and version range, if present.
-        m_versionRange = VersionRange.parse(Version.emptyVersion.toString());
-        m_version = m_versionRange.getLow();
-        for (int i = 0; i < m_attrs.length; i++)
-        {
-            if (m_attrs[i].getName().equals(Constants.VERSION_ATTRIBUTE))
-            {
-                m_versionRange = (VersionRange) m_attrs[i].getValue();
-                m_version = m_versionRange.getLow();
-                break;
-            }
-        }
-    }
-
-    public Version getVersionHigh()
-    {
-        return m_versionRange.getHigh();
-    }
-
-    public boolean isLowInclusive()
-    {
-        return m_versionRange.isLowInclusive();
-    }
-
-    public boolean isHighInclusive()
-    {
-        return m_versionRange.isHighInclusive();
-    }
-
-    public boolean isOptional()
-    {
-        return m_isOptional;
-    }
-
-    public boolean isSatisfied(R4Export export)
-    {
-        // For packages to be compatible, they must have the
-        // same name.
-        if (!getName().equals(export.getName()))
-        {
-            return false;
-        }
-        
-        return m_versionRange.isInRange(export.getVersion())
-            && doAttributesMatch(export);
-    }
-
-    private boolean doAttributesMatch(R4Export export)
-    {
-        // Cycle through all attributes of this import package
-        // and make sure its values match the attribute values
-        // of the specified export package.
-        for (int impAttrIdx = 0; impAttrIdx < getAttributes().length; impAttrIdx++)
-        {
-            // Get current attribute from this import package.
-            R4Attribute impAttr = getAttributes()[impAttrIdx];
-
-            // Ignore version attribute, since it is a special case that
-            // has already been compared using isVersionInRange() before
-            // the call to this method was made.
-            if (impAttr.getName().equals(Constants.VERSION_ATTRIBUTE))
-            {
-                continue;
-            }
-
-            // Check if the export package has the same attribute.
-            boolean found = false;
-            for (int expAttrIdx = 0;
-                (!found) && (expAttrIdx < export.getAttributes().length);
-                expAttrIdx++)
-            {
-                // Get current attribute for the export package.
-                R4Attribute expAttr = export.getAttributes()[expAttrIdx];
-                // Check if the attribute names are equal.
-                if (impAttr.getName().equals(expAttr.getName()))
-                {
-                    // We only recognize version types. If the value of the
-                    // attribute is a version/version range, then we use the
-                    // "in range" comparison, otherwise we simply use equals().
-                    if (expAttr.getValue() instanceof Version)
-                    {
-                        if (!((VersionRange) impAttr.getValue()).isInRange((Version) expAttr.getValue()))
-                        {
-                            return false;
-                        }
-                    }
-                    else if (!impAttr.getValue().equals(expAttr.getValue()))
-                    {
-                        return false;
-                    }
-                    found = true;
-                }
-            }
-            // If the attribute was not found, then return false.
-            if (!found)
-            {
-                return false;
-            }
-        }
-
-        // Now, cycle through all attributes of the export package and verify that
-        // all mandatory attributes are present in this import package.
-        for (int expAttrIdx = 0; expAttrIdx < export.getAttributes().length; expAttrIdx++)
-        {
-            // Get current attribute for this package.
-            R4Attribute expAttr = export.getAttributes()[expAttrIdx];
-            
-            // If the export attribute is mandatory, then make sure
-            // this import package has the attribute.
-            if (expAttr.isMandatory())
-            {
-                boolean found = false;
-                for (int impAttrIdx = 0;
-                    (!found) && (impAttrIdx < getAttributes().length);
-                    impAttrIdx++)
-                {
-                    // Get current attribute from specified package.
-                    R4Attribute impAttr = getAttributes()[impAttrIdx];
-        
-                    // Check if the attribute names are equal
-                    // and set found flag.
-                    if (expAttr.getName().equals(impAttr.getName()))
-                    {
-                        found = true;
-                    }
-                }
-                // If not found, then return false.
-                if (!found)
-                {
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Package.java b/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Package.java
deleted file mode 100755
index e6480cc..0000000
--- a/framework/src/main/java/org/apache/felix/framework/util/manifestparser/R4Package.java
+++ /dev/null
@@ -1,72 +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.framework.util.manifestparser;
-
-import org.osgi.framework.Version;
-
-public class R4Package
-{
-    private String m_name = "";
-    protected R4Directive[] m_directives = null;
-    protected R4Attribute[] m_attrs = null;
-    protected Version m_version = new Version("0.0.0");
-
-    public R4Package(String name, R4Directive[] directives, R4Attribute[] attrs)
-    {
-        m_name = name;
-        m_directives = (directives == null)
-            ? new R4Directive[0] : (R4Directive[]) directives.clone();
-        m_attrs = (attrs == null)
-            ? new R4Attribute[0] : (R4Attribute[]) attrs.clone();
-    }
-
-    public String getName()
-    {
-        return m_name;
-    }
-
-    public R4Directive[] getDirectives()
-    {
-        return m_directives;
-    }
-
-    public R4Attribute[] getAttributes()
-    {
-        return m_attrs;
-    }
-
-    public Version getVersion()
-    {
-        return m_version;
-    }
-
-    public String toString()
-    {
-        String msg = getName();
-        for (int i = 0; (m_directives != null) && (i < m_directives.length); i++)
-        {
-            msg = msg + " [" + m_directives[i].getName() + ":="+ m_directives[i].getValue() + "]";
-        }
-        for (int i = 0; (m_attrs != null) && (i < m_attrs.length); i++)
-        {
-            msg = msg + " [" + m_attrs[i].getName() + "="+ m_attrs[i].getValue() + "]";
-        }
-        return msg;
-    }
-}
\ No newline at end of file
