diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Capability.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Capability.java
index dc17629..c2ec5ef 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Capability.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Capability.java
@@ -74,4 +74,12 @@
      * @return a Map<String,Object>
      */
     Map<String, Object> getPropertiesAsMap();
+
+    /**
+     * Return the directives of this capability. The returned map
+     * can not be modified.
+     *
+     * @return a Map of directives or an empty map there are no directives.
+     */
+    Map<String, String> getDirectives();
 }
\ No newline at end of file
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Requirement.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Requirement.java
index bd49d0d..06b2bd7 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Requirement.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Requirement.java
@@ -35,10 +35,12 @@
  */
 
 // This document is an experimental draft to enable interoperability
-// between bundle repositories. There is currently no commitment to 
-// turn this draft into an official specification.  
+// between bundle repositories. There is currently no commitment to
+// turn this draft into an official specification.
 package org.apache.felix.bundlerepository;
 
+import java.util.Map;
+
 /**
  * A named requirement specifies the need for certain capabilities with the same
  * name.
@@ -48,11 +50,26 @@
  *   <li>they have the same nsame</li>
  *   <li>the filter matches the capability properties</li>
  * </ul>
- * 
+ *
  * @version $Revision: 1.4 $
  */
 public interface Requirement
 {
+    /**
+     * Return a map of attributes. Requirements can have attributes, but these are not
+     * used for matching. They are for informational purposes only.
+     *
+     * @return The map of attributes.
+     */
+    Map<String, Object> getAttributes();
+
+    /**
+     * Return the map of directives for this requirement. This requirements map does *not*
+     * contain requirements that are modeled via direct APIs on this interface, such as the
+     * filter, cardinality and resolution.
+     * @return
+     */
+    Map<String, String> getDirectives();
 
     /**
      * Return the name of the requirement.
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/CapabilityImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/CapabilityImpl.java
index 5362a71..50e0f2f 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/CapabilityImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/CapabilityImpl.java
@@ -19,6 +19,7 @@
 package org.apache.felix.bundlerepository.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -29,8 +30,9 @@
 public class CapabilityImpl implements Capability
 {
     private String m_name = null;
-    private final Map<String, Object> m_map = new HashMap<String, Object>();
-    private final List<Property> m_list = new ArrayList<Property>();
+    private final Map<String, Object> m_attributes = new HashMap<String, Object>();
+    private final Map<String, String> m_directives = new HashMap<String, String>();
+    private final List<Property> m_propList = new ArrayList<Property>();
 
     public CapabilityImpl()
     {
@@ -62,12 +64,12 @@
 
     public Map<String, Object> getPropertiesAsMap()
     {
-        return m_map;
+        return m_attributes;
     }
 
     public Property[] getProperties()
     {
-        return m_list.toArray(new Property[m_list.size()]);
+        return m_propList.toArray(new Property[m_propList.size()]);
     }
 
     public void addProperty(Property prop)
@@ -75,8 +77,8 @@
         // m_map.put(prop.getName().toLowerCase(), prop.getConvertedValue()); // TODO is toLowerCase() on the key the right thing to do?
         // However if we definitely need to re-enable the to-lowercasing, the Felix Util FilterImpl supports treating filters
         // case-insensitively
-        m_map.put(prop.getName(), prop.getConvertedValue());
-        m_list.add(prop);
+        m_attributes.put(prop.getName(), prop.getConvertedValue());
+        m_propList.add(prop);
     }
 
     public void addProperty(String name, String value)
@@ -91,6 +93,14 @@
 
     public String toString()
     {
-        return m_name  + ":" + m_map.toString();
+        return m_name  + ":" + m_attributes.toString();
+    }
+
+    public void addDirective(String key, String value) {
+        m_directives.put(key, value);
+    }
+
+    public Map<String, String> getDirectives() {
+        return Collections.unmodifiableMap(m_directives);
     }
 }
\ No newline at end of file
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java
index 957950b..934d546 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java
@@ -13,7 +13,6 @@
  */
 package org.apache.felix.bundlerepository.impl;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -80,7 +79,7 @@
 
     public Map<String, String> getDirectives()
     {
-        return Collections.emptyMap();
+        return capability.getDirectives();
     }
 
     public String getNamespace()
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapter.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapter.java
index d718b6c..6617479 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapter.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapter.java
@@ -36,12 +36,12 @@
             throw new NullPointerException("Missing required parameter: resource");
         this.requirement = requirement;
         this.resource = resource;
-        directives = computeDirectives();
+        this.directives = computeDirectives();
     }
 
     public Map<String, Object> getAttributes()
     {
-        return Collections.emptyMap();
+        return requirement.getAttributes();
     }
 
     public Map<String, String> getDirectives()
@@ -66,20 +66,35 @@
 
     private Map<String, String> computeDirectives()
     {
-        Map<String, String> result = new HashMap<String, String>(3);
+        Map<String, String> result;
+        if (requirement.getDirectives() == null)
+            result = new HashMap<String, String>();
+        else
+            result = new HashMap<String, String>(requirement.getDirectives());
+
         /*
          * (1) The Felix OBR specific "mandatory:<*" syntax must be stripped out
-         * of the filter. (2) The namespace must be translated.
+         * of the filter.
+         * (2) service references removed
+         * (3) objectClass capitalised
+         * (4) The namespaces must be translated.
          */
-        result.put(
-                Namespace.REQUIREMENT_FILTER_DIRECTIVE,
-                requirement.getFilter().replaceAll("\\(mandatory\\:\\<\\*[^\\)]*\\)", "")
-                        .replaceAll("\\(service\\=[^\\)]*\\)", "").replaceAll("objectclass", "objectClass")
-                        .replaceAll(requirement.getName() + '=', getNamespace() + '='));
-        result.put(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE, requirement.isOptional() ? Namespace.RESOLUTION_OPTIONAL
-                : Namespace.RESOLUTION_MANDATORY);
-        result.put(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE, requirement.isMultiple() ? Namespace.CARDINALITY_MULTIPLE
-                : Namespace.CARDINALITY_SINGLE);
+        String filter = requirement.getFilter().replaceAll("\\(mandatory\\:\\<\\*[^\\)]*\\)", "")
+                .replaceAll("\\(service\\=[^\\)]*\\)", "").replaceAll("objectclass", "objectClass");
+
+        for (String ns : NamespaceTranslator.getTranslatedFelixNamespaces())
+        {
+            filter = filter.replaceAll("[(][ ]*" + ns + "[ ]*=",
+                "(" + NamespaceTranslator.getOSGiNamespace(ns) + "=");
+        }
+        result.put(Namespace.REQUIREMENT_FILTER_DIRECTIVE, filter);
+
+        if (requirement.isOptional())
+            result.put(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE, Namespace.RESOLUTION_OPTIONAL);
+
+        if (requirement.isMultiple())
+            result.put(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE, Namespace.CARDINALITY_MULTIPLE);
+
         return Collections.unmodifiableMap(result);
     }
 
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/NamespaceTranslator.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/NamespaceTranslator.java
index d1fa2c9..d554878 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/NamespaceTranslator.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/NamespaceTranslator.java
@@ -13,6 +13,8 @@
  */
 package org.apache.felix.bundlerepository.impl;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -33,7 +35,7 @@
         result.put(ServiceNamespace.SERVICE_NAMESPACE, org.apache.felix.bundlerepository.Capability.SERVICE);
         result.put(BundleNamespace.BUNDLE_NAMESPACE, org.apache.felix.bundlerepository.Capability.BUNDLE);
         result.put(HostNamespace.HOST_NAMESPACE, org.apache.felix.bundlerepository.Capability.FRAGMENT);
-        return result;
+        return Collections.unmodifiableMap(result);
     }
 
     private static Map<String, String> fillFelixToOSGiMap()
@@ -43,7 +45,7 @@
         result.put(org.apache.felix.bundlerepository.Capability.SERVICE, ServiceNamespace.SERVICE_NAMESPACE);
         result.put(org.apache.felix.bundlerepository.Capability.BUNDLE, BundleNamespace.BUNDLE_NAMESPACE);
         result.put(org.apache.felix.bundlerepository.Capability.FRAGMENT, HostNamespace.HOST_NAMESPACE);
-        return result;
+        return Collections.unmodifiableMap(result);
     }
 
     public static String getFelixNamespace(String osgiNamespace)
@@ -55,6 +57,11 @@
             return result;
     }
 
+    public static Collection<String> getTranslatedFelixNamespaces()
+    {
+        return felixToOSGiMap.keySet();
+    }
+
     public static String getOSGiNamespace(String felixNamespace)
     {
         String result = felixToOSGiMap.get(felixNamespace);
@@ -63,4 +70,9 @@
         else
             return result;
     }
+
+    public static Collection<String> getTranslatedOSGiNamespaces()
+    {
+        return osgiToFelixMap.keySet();
+    }
 }
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiCapabilityAdapter.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiCapabilityAdapter.java
index 78bf33e..5546d77 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiCapabilityAdapter.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiCapabilityAdapter.java
@@ -15,6 +15,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -64,6 +65,10 @@
         return result;
     }
 
+    public Map<String, String> getDirectives() {
+        return Collections.unmodifiableMap(capability.getDirectives());
+    }
+
     @Override
     public int hashCode()
     {
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapter.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapter.java
index 19670f5..dde9b27 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapter.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapter.java
@@ -13,6 +13,9 @@
  */
 package org.apache.felix.bundlerepository.impl;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.felix.bundlerepository.Capability;
 import org.apache.felix.bundlerepository.Requirement;
 import org.osgi.framework.Constants;
@@ -21,10 +24,40 @@
 class OSGiRequirementAdapter implements Requirement
 {
     private final org.osgi.resource.Requirement requirement;
+    private final HashMap<String, String> cleanedDirectives;
+    private final String filter;
 
     public OSGiRequirementAdapter(org.osgi.resource.Requirement requirement)
     {
         this.requirement = requirement;
+
+        String f = requirement.getDirectives().get(Constants.FILTER_DIRECTIVE);
+        if (f != null)
+        {
+            for (String ns : NamespaceTranslator.getTranslatedOSGiNamespaces())
+            {
+                f = f.replaceAll("[(][ ]*" + ns + "[ ]*=",
+                    "(" + NamespaceTranslator.getFelixNamespace(ns) + "=");
+            }
+        }
+        filter = f;
+
+        cleanedDirectives = new HashMap<String, String>(requirement.getDirectives());
+        // Remove directives that are represented as APIs on this class.
+        cleanedDirectives.remove(Constants.FILTER_DIRECTIVE);
+        cleanedDirectives.remove(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE);
+        cleanedDirectives.remove(Constants.RESOLUTION_DIRECTIVE);
+    }
+
+    public Map<String, Object> getAttributes()
+    {
+        return requirement.getAttributes();
+    }
+
+    public Map<String, String> getDirectives()
+    {
+
+        return cleanedDirectives;
     }
 
     public String getComment()
@@ -34,7 +67,7 @@
 
     public String getFilter()
     {
-        return requirement.getDirectives().get(Constants.FILTER_DIRECTIVE);
+        return filter;
     }
 
     public String getName()
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java
index 6988a14..593d284 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RequirementImpl.java
@@ -18,6 +18,8 @@
  */
 package org.apache.felix.bundlerepository.impl;
 
+import java.util.Collections;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.felix.bundlerepository.Capability;
@@ -37,16 +39,37 @@
     private boolean m_optional = false;
     private FilterImpl m_filter = null;
     private String m_comment = null;
+    private Map<String, Object> m_attributes;
+    private Map<String, String> m_directives;
 
     public RequirementImpl()
     {
     }
 
-    public RequirementImpl(String name) 
+    public RequirementImpl(String name)
     {
         setName(name);
     }
 
+    public Map<String, Object> getAttributes()
+    {
+        return m_attributes;
+    }
+
+    public void setAttributes(Map<String, Object> attributes) {
+        m_attributes = Collections.unmodifiableMap(attributes);
+    }
+
+    public Map<String, String> getDirectives()
+    {
+        return m_directives;
+    }
+
+    public void setDirectives(Map<String, String> directives)
+    {
+        m_directives = Collections.unmodifiableMap(directives);
+    }
+
     public String getName()
     {
         return m_name;
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java
index 2205186..8b26997 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java
@@ -139,12 +139,17 @@
 
         capability.setName(NamespaceTranslator.getFelixNamespace(namespace));
         Map<String, Object> attributes = new HashMap<String, Object>();
-        parseAttributesDirectives(reader, attributes, CAPABILITY);
+        Map<String, String> directives = new HashMap<String, String>();
+        parseAttributesDirectives(reader, attributes, directives, CAPABILITY);
 
         for (Map.Entry<String, Object> entry : attributes.entrySet())
         {
             capability.addProperty(new FelixPropertyAdapter(entry.getKey(), entry.getValue()));
         }
+        for (Map.Entry<String, String> entry : directives.entrySet())
+        {
+            capability.addDirective(entry.getKey(), entry.getValue());
+        }
 
         return capability;
     }
@@ -152,7 +157,8 @@
     private static void parseIdentityNamespace(XmlPullParser reader, ResourceImpl resource) throws Exception
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
-        parseAttributesDirectives(reader, attributes, CAPABILITY);
+        parseAttributesDirectives(reader, attributes, new HashMap<String, String>(), CAPABILITY);
+        // TODO need to cater for the singleton directive...
 
         for (Map.Entry<String, Object> entry : attributes.entrySet())
         {
@@ -166,7 +172,7 @@
     private static void parseContentNamespace(XmlPullParser reader, ResourceImpl resource) throws Exception
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
-        parseAttributesDirectives(reader, attributes, CAPABILITY);
+        parseAttributesDirectives(reader, attributes, new HashMap<String, String>(), CAPABILITY);
 
         for (Map.Entry<String, Object> entry : attributes.entrySet())
         {
@@ -180,7 +186,7 @@
         }
     }
 
-    private static void parseAttributesDirectives(XmlPullParser reader, Map<String, Object> attributes, String parentTag) throws XmlPullParserException, IOException
+    private static void parseAttributesDirectives(XmlPullParser reader, Map<String, Object> attributes, Map<String, String> directives, String parentTag) throws XmlPullParserException, IOException
     {
         int event;
         while ((event = reader.nextTag()) == XmlPullParser.START_TAG)
@@ -194,6 +200,13 @@
                 attributes.put(name, getTypedValue(type, value));
                 PullParser.sanityCheckEndElement(reader, reader.nextTag(), ATTRIBUTE);
             }
+            else if (DIRECTIVE.equals(element))
+            {
+                String name = reader.getAttributeValue(null, "name");
+                String value = reader.getAttributeValue(null, "value");
+                directives.put(name, value);
+                PullParser.sanityCheckEndElement(reader, reader.nextTag(), DIRECTIVE);
+            }
             else
             {
                 PullParser.ignoreTag(reader);
@@ -304,33 +317,26 @@
 
         requirement.setName(NamespaceTranslator.getFelixNamespace(namespace));
 
+        Map<String, Object> attributes = new HashMap<String, Object>();
         Map<String, String> directives = new HashMap<String, String>();
-        int event;
-        while ((event = reader.nextTag()) == XmlPullParser.START_TAG)
+        parseAttributesDirectives(reader, attributes, directives, REQUIREMENT);
+        requirement.setAttributes(attributes);
+
+        String filter = directives.remove(Namespace.REQUIREMENT_FILTER_DIRECTIVE);
+        for (String ns : NamespaceTranslator.getTranslatedOSGiNamespaces())
         {
-            String element = reader.getName();
-            if (DIRECTIVE.equals(element))
-            {
-                String name = reader.getAttributeValue(null, "name");
-                String value = reader.getAttributeValue(null, "value");
-                directives.put(name, value);
-                PullParser.sanityCheckEndElement(reader, reader.nextTag(), DIRECTIVE);
-            }
-            else
-            {
-                PullParser.ignoreTag(reader);
-            }
+            filter = filter.replaceAll("[(][ ]*" + ns + "[ ]*=",
+                    "(" + NamespaceTranslator.getFelixNamespace(ns) + "=");
         }
+        requirement.setFilter(filter);
+        requirement.setMultiple(Namespace.CARDINALITY_MULTIPLE.equals(
+            directives.remove(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE)));
+        requirement.setOptional(Namespace.RESOLUTION_OPTIONAL.equals(
+            directives.remove(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE)));
+        requirement.setDirectives(directives);
 
         requirement.setExtend(false);
-        // TODO transform the namespaces in the filter!
-        requirement.setFilter(directives.get(Namespace.REQUIREMENT_FILTER_DIRECTIVE));
-        requirement.setMultiple(Namespace.CARDINALITY_MULTIPLE.equals(
-            directives.get(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE)));
-        requirement.setOptional(Namespace.RESOLUTION_OPTIONAL.equals(
-            directives.get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE)));
 
-        PullParser.sanityCheckEndElement(reader, event, REQUIREMENT);
         return requirement;
     }
 }
diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/CapabilityImplTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/CapabilityImplTest.java
new file mode 100644
index 0000000..36435ec
--- /dev/null
+++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/CapabilityImplTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.bundlerepository.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class CapabilityImplTest extends TestCase
+{
+    public void testDirectives()
+    {
+        CapabilityImpl c = new CapabilityImpl();
+
+        assertEquals(0, c.getDirectives().size());
+        c.addDirective("x", "y");
+        assertEquals(1, c.getDirectives().size());
+        assertEquals("y", c.getDirectives().get("x"));
+
+        c.addDirective("x", "z");
+        assertEquals(1, c.getDirectives().size());
+        assertEquals("z", c.getDirectives().get("x"));
+
+        c.addDirective("Y", "A b C");
+
+        Map<String, String> expected = new HashMap<String, String>();
+        expected.put("x", "z");
+        expected.put("Y", "A b C");
+        assertEquals(expected, c.getDirectives());
+    }
+}
diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapterTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapterTest.java
new file mode 100644
index 0000000..c37855d
--- /dev/null
+++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/FelixRequirementAdapterTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.bundlerepository.impl;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+
+public class FelixRequirementAdapterTest extends TestCase
+{
+    public void testDirectiveTranslation()
+    {
+        assertFilter("(foo=bar)", "(foo=bar)");
+        assertFilter("(package=x.y.z)", "(osgi.wiring.package=x.y.z)");
+        // TODO should this be symbolicname?
+        assertFilter("( bundle = abc  )", "(osgi.wiring.bundle= abc  )");
+        assertFilter("(|(bundle=x)(&(bundle=y)(fragment=z)))",
+                "(|(osgi.wiring.bundle=x)(&(osgi.wiring.bundle=y)(osgi.wiring.host=z)))");
+    }
+
+    private void assertFilter(String obr, String osgi)
+    {
+        Resource resource = new OSGiResourceImpl(
+            Collections.<Capability>emptyList(),
+            Collections.<Requirement>emptyList());
+
+        RequirementImpl requirement = new RequirementImpl();
+        requirement.setFilter(obr);
+        assertEquals(osgi, new FelixRequirementAdapter(requirement, resource).getDirectives().get("filter"));
+    }
+
+    public void testOtherDirectives()
+    {
+        Resource resource = new OSGiResourceImpl(
+            Collections.<Capability>emptyList(),
+            Collections.<Requirement>emptyList());
+
+        RequirementImpl requirement = new RequirementImpl();
+        requirement.setFilter("(a=b)");
+        Map<String, String> other = new HashMap<String, String>();
+        other.put("xyz", "abc");
+        requirement.setDirectives(other);
+
+        FelixRequirementAdapter adapter = new FelixRequirementAdapter(requirement, resource);
+
+        Map<String, String> expected = new HashMap<String, String>();
+        expected.put("filter", "(a=b)");
+        expected.put("xyz", "abc");
+        assertEquals(expected, adapter.getDirectives());
+    }
+}
diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/NamespaceTranslatorTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/NamespaceTranslatorTest.java
new file mode 100644
index 0000000..94f50f4
--- /dev/null
+++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/NamespaceTranslatorTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.bundlerepository.impl;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class NamespaceTranslatorTest extends TestCase
+{
+    public void testNamespaceTranslator()
+    {
+        Map<String, String> expected = new HashMap<String, String>();
+        expected.put("osgi.wiring.bundle", "bundle");
+        expected.put("osgi.wiring.package", "package");
+        expected.put("osgi.wiring.host", "fragment");
+        expected.put("osgi.service", "service");
+
+        assertEquals(new HashSet<String>(expected.keySet()),
+            new HashSet<String>(NamespaceTranslator.getTranslatedOSGiNamespaces()));
+        assertEquals(new HashSet<String>(expected.values()),
+            new HashSet<String>(NamespaceTranslator.getTranslatedFelixNamespaces()));
+
+        for (Map.Entry<String, String> entry : expected.entrySet())
+        {
+            assertEquals(entry.getValue(),
+                NamespaceTranslator.getFelixNamespace(entry.getKey()));
+            assertEquals(entry.getKey(),
+                NamespaceTranslator.getOSGiNamespace(entry.getValue()));
+        }
+
+        assertEquals("bheuaark", NamespaceTranslator.getFelixNamespace("bheuaark"));
+        assertEquals("bheuaark", NamespaceTranslator.getOSGiNamespace("bheuaark"));
+    }
+}
diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapterTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapterTest.java
new file mode 100644
index 0000000..f6e90c5
--- /dev/null
+++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRequirementAdapterTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.bundlerepository.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.osgi.resource.Requirement;
+
+public class OSGiRequirementAdapterTest extends TestCase
+{
+    public void testDirectives()
+    {
+        Map<String, Object> attrs = new HashMap<String, Object>();
+        Map<String, String> dirs = new HashMap<String, String>();
+        dirs.put("cardinality", "multiple");
+        dirs.put("filter", "(osgi.wiring.package=y)");
+        dirs.put("foo", "bar");
+        dirs.put("resolution", "optional");
+        dirs.put("test", "test");
+
+        Requirement req = new OSGiRequirementImpl("osgi.wiring.package", attrs, dirs);
+        OSGiRequirementAdapter adapter = new OSGiRequirementAdapter(req);
+
+        assertEquals("(package=y)", adapter.getFilter());
+        assertTrue(adapter.isMultiple());
+        assertTrue(adapter.isOptional());
+        assertEquals("package", adapter.getName());
+
+        Map<String, String> expected = new HashMap<String, String>();
+        expected.put("foo", "bar");
+        expected.put("test", "test");
+        assertEquals(expected, adapter.getDirectives());
+    }
+}
