import branch for 1.x from svn
diff --git a/pom.xml b/pom.xml
index 2fa57e7..7dfef63 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,12 +23,12 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling</artifactId>
-        <version>30</version>
+        <version>26</version>
         <relativePath />
     </parent>
 
     <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
-    <version>2.3.5-SNAPSHOT</version>
+    <version>1.9.9-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Apache Sling Testing OSGi Mock</name>
@@ -44,12 +44,26 @@
   
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>osgi.core</artifactId>
+            <artifactId>org.osgi.core</artifactId>
             <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>osgi.cmpn</artifactId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.osgi</artifactId>
+            <version>2.2.0</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.framework</artifactId>
+            <version>5.0.0</version>
             <scope>compile</scope>
         </dependency>
 
@@ -78,7 +92,7 @@
             <artifactId>slf4j-api</artifactId>
             <scope>compile</scope>
         </dependency>
-
+    
         <dependency>
             <groupId>org.reflections</groupId>
             <artifactId>reflections</artifactId>
@@ -110,28 +124,6 @@
             </exclusions>
         </dependency>
 
-        <!-- Artifact is shaded and inlined, only some classes included (see below) -->
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.4.0</version>
-            <scope>compile</scope>
-        </dependency>
-        <!-- Artifact is shaded and inlined, only some classes included (see below) -->
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.framework</artifactId>
-            <version>5.0.0</version>
-            <scope>compile</scope>
-        </dependency>
-        <!-- Artifact is shaded and inlined, only some classes included (see below) -->
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr</artifactId>
-            <version>2.0.4</version>
-            <scope>compile</scope>
-        </dependency>
-    
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
@@ -146,7 +138,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.testing.logging-mock</artifactId>
-            <version>2.0.0</version>
+            <version>1.0.0</version>
             <scope>test</scope>
         </dependency>
 
@@ -161,6 +153,11 @@
                 <extensions>true</extensions>
             </plugin>
       
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+            </plugin>
+
            <plugin>
                 <groupId>org.apache.rat</groupId>
                 <artifactId>apache-rat-plugin</artifactId>
@@ -169,73 +166,31 @@
                         <exclude>src/test/resources/META-INF/test.txt</exclude>
                         <exclude>src/test/resources/bundleData/nested/first.txt</exclude>
                         <exclude>src/test/resources/bundleData/nested/second.txt</exclude>
-                        <exclude>dependency-reduced-pom.xml</exclude>
                     </excludes>
                 </configuration>
             </plugin>
-
-           <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>2.4.3</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <createSourcesJar>true</createSourcesJar>
-                            <shadeSourcesContent>true</shadeSourcesContent>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.sling:org.apache.sling.commons.osgi</include>
-                                    <include>org.apache.felix:org.apache.felix.framework</include>
-                                    <include>org.apache.felix:org.apache.felix.scr</include>
-                                </includes>
-                            </artifactSet>
-                            <relocations>
-                                <relocation>
-                                    <pattern>org.apache.sling.commons.osgi</pattern>
-                                    <shadedPattern>osgimock.org.apache.sling.commons.osgi</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.felix.framework</pattern>
-                                    <shadedPattern>osgimock.org.apache.felix.framework</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.felix.scr.impl</pattern>
-                                    <shadedPattern>osgimock.org.apache.felix.scr.impl</shadedPattern>
-                                </relocation>
-                            </relocations>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.sling:org.apache.sling.commons.osgi</artifact>
-                                    <includes>
-                                        <include>org/apache/sling/commons/osgi/ServiceUtil*</include>
-                                        <include>org/apache/sling/commons/osgi/Order*</include>
-                                    </includes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.felix:org.apache.felix.framework</artifact>
-                                    <includes>
-                                        <include>org/apache/felix/framework/**</include>
-                                    </includes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.felix:org.apache.felix.scr</artifact>
-                                    <includes>
-                                        <include>org/apache/felix/scr/impl/inject/Annotations*</include>
-                                        <include>org/apache/felix/scr/impl/helper/Coercions*</include>
-                                    </includes>
-                                </filter>
-                            </filters>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
+    
         </plugins>
     </build>
     
+    <profiles>
+      <profile>
+        <id>osgi-6</id>
+        <dependencies>
+          <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>6.0.0</version>
+            <scope>provided</scope>
+          </dependency>
+          <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <version>5.0.0</version>
+            <scope>provided</scope>
+          </dependency>
+        </dependencies>
+      </profile>
+    </profiles>
+  
 </project>
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
index d690752..4ac0341 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
@@ -31,25 +31,15 @@
 import org.osgi.service.cm.ConfigurationAdmin;
 
 /**
- * Map util merge methods.
+ * Map merge util methods.
  */
 final class MapMergeUtil {
-
+    
     private MapMergeUtil() {
         // static methods only
     }
-    
-    /**
-     * Merge service properties from three sources (with this precedence):
-     * 1. Properties defined in calling unit test code
-     * 2. Properties from ConfigurationAdmin
-     * 3. Properties from OSGi SCR metadata
-     * @param target Target service
-     * @param configAdmin Configuration admin or null if none is registered
-     * @param properties Properties from unit test code or null if none where passed
-     * @return Merged properties
-     */
-    static Dictionary<String, Object> propertiesMergeWithOsgiMetadata(Object target, 
+
+    public static Dictionary<String, Object> propertiesMergeWithOsgiMetadata(Object target, 
             ConfigurationAdmin configAdmin, 
             Dictionary<String, Object> properties) {
         return toDictionary(propertiesMergeWithOsgiMetadata(target, configAdmin, toMap(properties)));
@@ -65,7 +55,8 @@
      * @param properties Properties from unit test code or null if none where passed
      * @return Merged properties
      */
-    static Map<String, Object> propertiesMergeWithOsgiMetadata(Object target,
+    @SuppressWarnings("unchecked")
+    public static Map<String, Object> propertiesMergeWithOsgiMetadata(Object target,
             ConfigurationAdmin configAdmin,
             Map<String, Object> properties) {
         Map<String, Object> mergedProperties = new HashMap<String, Object>();
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MapUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/MapUtil.java
index 44aef63..1889087 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MapUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MapUtil.java
@@ -46,7 +46,7 @@
         if (map == null) {
             return null;
         }
-        Hashtable<T, U> hashtable = new Hashtable<>();
+        Hashtable<T, U> hashtable = new Hashtable<T, U>();
         for (Map.Entry<T, U> entry : map.entrySet()) {
             if (entry.getKey() != null && entry.getValue() != null) {
                 hashtable.put(entry.getKey(), entry.getValue());
@@ -105,7 +105,7 @@
         if (args.length % 2 != 0) {
             throw new IllegalArgumentException("args must be an even number of name/values:" + Arrays.asList(args));
         }
-        final Map<String, Object> result = new HashMap<>();
+        final Map<String, Object> result = new HashMap<String, Object>();
         for (int i=0 ; i < args.length; i+=2) {
             Object key = args[i];
             Object value = args[i+1];
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MatchAllFilter.java b/src/main/java/org/apache/sling/testing/mock/osgi/MatchAllFilter.java
index 3ef02df..0a7aaf3 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MatchAllFilter.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MatchAllFilter.java
@@ -19,7 +19,6 @@
 package org.apache.sling.testing.mock.osgi;
 
 import java.util.Dictionary;
-import java.util.Map;
 
 import org.osgi.framework.Filter;
 import org.osgi.framework.ServiceReference;
@@ -44,9 +43,4 @@
         return true;
     }
 
-    @Override
-    public boolean matches(Map<String, ?> map) {
-        return true;
-    }
-
 }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockBundle.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockBundle.java
index 89ad673..1a7a7c1 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockBundle.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockBundle.java
@@ -31,7 +31,6 @@
 
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
 
@@ -47,26 +46,16 @@
     private final long bundleId;
     private final BundleContext bundleContext;
     private Map<String, String> headers = ImmutableMap.<String, String>of();
-    private String symbolicName;
+    private String symbolicName = "mock-bundle";
     private long lastModified;
 
     /**
      * Constructor
      * @param bundleContext Bundle context
-     * @param bundleId Bundle ID
-     */
-    MockBundle(BundleContext bundleContext, long bundleId) {
-        this.bundleId = bundleId;
-        this.bundleContext = bundleContext;
-        this.symbolicName = (bundleId == Constants.SYSTEM_BUNDLE_ID ? Constants.SYSTEM_BUNDLE_SYMBOLICNAME : "mock-bundle");
-    }
-
-    /**
-     * Constructor
-     * @param bundleContext Bundle context
      */
     public MockBundle(BundleContext bundleContext) {
-        this(bundleContext, ++bundleCounter);
+        this.bundleId = ++bundleCounter;
+        this.bundleContext = bundleContext;
     }
 
     @Override
@@ -185,16 +174,6 @@
         return queryPath;
     }
     
-    @Override
-    public String getLocation() {
-        if (bundleId == Constants.SYSTEM_BUNDLE_ID) {
-            return Constants.SYSTEM_BUNDLE_LOCATION;
-        }
-        else {
-            return null;
-        }
-    }
-
     // --- unsupported operations ---
     @Override
     public Enumeration<URL> findEntries(final String path, final String filePattern, final boolean recurse) {
@@ -202,7 +181,12 @@
     }
 
     @Override
-    public ServiceReference<?>[] getRegisteredServices() {
+    public String getLocation() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ServiceReference[] getRegisteredServices() {
         throw new UnsupportedOperationException();
     }
 
@@ -217,7 +201,7 @@
     }
 
     @Override
-    public ServiceReference<?>[] getServicesInUse() {
+    public ServiceReference[] getServicesInUse() {
         throw new UnsupportedOperationException();
     }
 
@@ -266,27 +250,27 @@
         throw new UnsupportedOperationException();
     }
 
-    @Override
+    // this is part of org.osgi 4.2.0
     public Map<X509Certificate, List<X509Certificate>> getSignerCertificates(final int signersType) {
         throw new UnsupportedOperationException();
     }
 
-    @Override
+    // this is part of org.osgi 4.2.0
     public Version getVersion() {
         throw new UnsupportedOperationException();
     }
 
-    @Override
+    // this is part of org.osgi.core 6.0.0
     public int compareTo(Bundle o) {
         throw new UnsupportedOperationException();
     }
 
-    @Override
+    // this is part of org.osgi.core 6.0.0
     public <A> A adapt(Class<A> type) {
         throw new UnsupportedOperationException();
     }
 
-    @Override
+    // this is part of org.osgi.core 6.0.0
     public File getDataFile(String filename) {
         throw new UnsupportedOperationException();
     }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockBundleContext.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockBundleContext.java
index 0340a55..1a6b768 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockBundleContext.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockBundleContext.java
@@ -44,14 +44,12 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleListener;
-import org.osgi.framework.Constants;
 import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkListener;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ConfigurationAdmin;
@@ -70,11 +68,8 @@
     private final Queue<BundleListener> bundleListeners = new ConcurrentLinkedQueue<BundleListener>();
     private final ConfigurationAdmin configAdmin = new MockConfigurationAdmin();
     private File dataFileBaseDir;
-    
-    private final Bundle systemBundle;
 
     public MockBundleContext() {
-        this.systemBundle = new MockBundle(this, Constants.SYSTEM_BUNDLE_ID);
         this.bundle = new MockBundle(this);
         
         // register configuration admin by default
@@ -96,7 +91,6 @@
         }
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public ServiceRegistration registerService(final String clazz, final Object service, final Dictionary properties) {
         String[] clazzes;
@@ -108,9 +102,8 @@
         return registerService(clazzes, service, properties);
     }
 
-    @SuppressWarnings("unchecked")
-    @Override
-    public <S> ServiceRegistration<S> registerService(Class<S> clazz, S service, Dictionary<String, ?> properties) {
+    // this is part of org.osgi.core 6.0.0
+    public <S> ServiceRegistration registerService(Class<S> clazz, S service, Dictionary<String, ?> properties) {
         return registerService(clazz.getName(), service, properties);
     }
 
@@ -125,12 +118,6 @@
         return registration;
     }
     
-    @SuppressWarnings("unchecked")
-    @Override
-    public <S> ServiceRegistration<S> registerService(Class<S> clazz, ServiceFactory<S> factory, Dictionary<String, ?> properties) {
-        return registerService(clazz.getName(), factory, properties);
-    }
-    
     /**
      * Check for already registered services that may be affected by the service registration - either
      * adding by additional optional references, or creating a conflict in the dependencies.
@@ -142,20 +129,18 @@
         List<ReferenceInfo> affectedDynamicReferences = OsgiServiceUtil.getMatchingDynamicReferences(registeredServices, registration);
         for (ReferenceInfo referenceInfo : affectedDynamicReferences) {
             Reference reference = referenceInfo.getReference();
-            if (reference.matchesTargetFilter(registration.getReference())) {
-                switch (reference.getCardinality()) {
-                case MANDATORY_UNARY:
-                    throw new ReferenceViolationException("Mandatory unary reference of type " + reference.getInterfaceType() + " already fulfilled "
-                            + "for service " + reference.getServiceClass().getName() + ", registration of new service with this interface failed.");
-                case MANDATORY_MULTIPLE:
-                case OPTIONAL_MULTIPLE:
-                case OPTIONAL_UNARY:
-                    OsgiServiceUtil.invokeBindMethod(reference, referenceInfo.getServiceRegistration().getService(),
-                            new ServiceInfo(registration));
-                    break;
-                default:
-                    throw new RuntimeException("Unepxected cardinality: " + reference.getCardinality());
-                }
+            switch (reference.getCardinality()) {
+            case MANDATORY_UNARY:
+                throw new ReferenceViolationException("Mandatory unary reference of type " + reference.getInterfaceType() + " already fulfilled "
+                        + "for service " + reference.getServiceClass().getName() + ", registration of new service with this interface failed.");
+            case MANDATORY_MULTIPLE:
+            case OPTIONAL_MULTIPLE:
+            case OPTIONAL_UNARY:
+                OsgiServiceUtil.invokeBindMethod(reference, referenceInfo.getServiceRegistration().getService(),
+                        new ServiceInfo(registration));
+                break;
+            default:
+                throw new RuntimeException("Unepxected cardinality: " + reference.getCardinality());
             }
         }
 
@@ -184,7 +169,6 @@
         notifyServiceListeners(ServiceEvent.UNREGISTERING, registration.getReference());
     }
     
-    @SuppressWarnings("unchecked")
     void restartService(MockServiceRegistration registration) {
         // get current service properties
         Class<?> serviceClass = registration.getService().getClass();
@@ -221,22 +205,20 @@
         List<ReferenceInfo> affectedDynamicReferences = OsgiServiceUtil.getMatchingDynamicReferences(registeredServices, registration);
         for (ReferenceInfo referenceInfo : affectedDynamicReferences) {
             Reference reference = referenceInfo.getReference();
-            if (reference.matchesTargetFilter(registration.getReference())) {
-                switch (reference.getCardinality()) {
-                case MANDATORY_UNARY:
-                    throw new ReferenceViolationException("Reference of type " + reference.getInterfaceType() + " "
-                            + "for service " + reference.getServiceClass().getName() + " is mandatory unary, "
-                            + "unregistration of service with this interface failed.");
-                case MANDATORY_MULTIPLE:
-                case OPTIONAL_MULTIPLE:
-                case OPTIONAL_UNARY:
-                    // it is currently not checked if for a MANDATORY_MULTIPLE reference the last reference is removed
-                    OsgiServiceUtil.invokeUnbindMethod(reference, referenceInfo.getServiceRegistration().getService(),
-                            new ServiceInfo(registration));
-                    break;
-                default:
-                    throw new RuntimeException("Unepxected cardinality: " + reference.getCardinality());
-                }
+            switch (reference.getCardinality()) {
+            case MANDATORY_UNARY:
+                throw new ReferenceViolationException("Reference of type " + reference.getInterfaceType() + " "
+                        + "for service " + reference.getServiceClass().getName() + " is mandatory unary, "
+                        + "unregistration of service with this interface failed.");
+            case MANDATORY_MULTIPLE:
+            case OPTIONAL_MULTIPLE:
+            case OPTIONAL_UNARY:
+                // it is currently not checked if for a MANDATORY_MULTIPLE reference the last reference is removed
+                OsgiServiceUtil.invokeUnbindMethod(reference, referenceInfo.getServiceRegistration().getService(),
+                        new ServiceInfo(registration));
+                break;
+            default:
+                throw new RuntimeException("Unepxected cardinality: " + reference.getCardinality());
             }
         }
 
@@ -260,7 +242,6 @@
         }
     }
     
-    @SuppressWarnings("unchecked")
     @Override
     public ServiceReference getServiceReference(final String clazz) {
         try {
@@ -275,13 +256,11 @@
         return null;
     }
 
-    @SuppressWarnings("unchecked")
-    @Override
-    public <S> ServiceReference<S> getServiceReference(Class<S> clazz) {
+    // this is part of org.osgi.core 6.0.0
+    public ServiceReference getServiceReference(Class clazz) {
         return getServiceReference(clazz.getName());
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public ServiceReference[] getServiceReferences(final String clazz, final String filter) throws InvalidSyntaxException {
         Set<ServiceReference> result = new TreeSet<ServiceReference>(new Comparator<ServiceReference>() {
@@ -303,19 +282,11 @@
         }
     }
 
-    @SuppressWarnings("unchecked")
-    @Override
-    public <S> Collection<ServiceReference<S>> getServiceReferences(Class<S> clazz, String filter) throws InvalidSyntaxException {
-        ServiceReference<S>[] result = getServiceReferences(clazz.getName(), filter);
-        if (result == null) {
-            return ImmutableList.<ServiceReference<S>>of();
-        }
-        else {
-            return ImmutableList.<ServiceReference<S>>copyOf(result);
-        }
+    // this is part of org.osgi.core 6.0.0
+    public Collection<ServiceReference> getServiceReferences(Class clazz, String filter) throws InvalidSyntaxException {
+        return ImmutableList.<ServiceReference>copyOf(getServiceReferences(clazz.getName(), filter));
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public ServiceReference[] getAllServiceReferences(final String clazz, final String filter) throws InvalidSyntaxException {
         // for now just do the same as getServiceReferences
@@ -323,8 +294,8 @@
     }
 
     @Override
-    public <S> S getService(final ServiceReference<S> serviceReference) {
-        return ((MockServiceReference<S>)serviceReference).getService();
+    public Object getService(final ServiceReference serviceReference) {
+        return ((MockServiceReference)serviceReference).getService();
     }
 
     @Override
@@ -390,11 +361,10 @@
         // accept method, but ignore it
     }
 
-    @SuppressWarnings("unchecked")
-    <S> S locateService(final String name, final ServiceReference<S> reference) {
-        for (MockServiceRegistration<?> serviceRegistration : this.registeredServices) {
+    Object locateService(final String name, final ServiceReference reference) {
+        for (MockServiceRegistration serviceRegistration : this.registeredServices) {
             if (serviceRegistration.getReference() == reference) {
-                return (S)serviceRegistration.getService();
+                return serviceRegistration.getService();
             }
         }
         return null;
@@ -433,7 +403,7 @@
      * Deactivates all bundles registered in this mocked bundle context.
      */
     public void shutdown() {
-        for (MockServiceRegistration<?> serviceRegistration : ImmutableList.copyOf(registeredServices).reverse()) {
+        for (MockServiceRegistration serviceRegistration : ImmutableList.copyOf(registeredServices).reverse()) {
             try {
                 MockOsgi.deactivate(serviceRegistration.getService(), this, serviceRegistration.getProperties());
             }
@@ -450,24 +420,6 @@
         }
     }
 
-    @Override
-    public Bundle getBundle(final long bundleId) {
-        if (bundleId == Constants.SYSTEM_BUNDLE_ID) {
-            return systemBundle;
-        }
-        // otherwise return null - no bundle found
-        return null;
-    }
-
-    @Override
-    public Bundle getBundle(String location) {
-        if (StringUtils.equals(location, Constants.SYSTEM_BUNDLE_LOCATION)) {
-            return systemBundle;
-        }
-        // otherwise return null - no bundle found
-        return null;
-    }
-
     // --- unsupported operations ---
     @Override
     public Bundle installBundle(final String s) {
@@ -480,8 +432,25 @@
     }
 
     @Override
-    public <S> ServiceObjects<S> getServiceObjects(ServiceReference<S> reference) {
+    public Bundle getBundle(final long l) {
         throw new UnsupportedOperationException();
     }
 
+    // this is part of org.osgi.core 6.0.0
+    public Bundle getBundle(String location) {
+        throw new UnsupportedOperationException();
+    }
+
+    // this is part of org.osgi.core 6.0.0
+    public <S> ServiceRegistration registerService(Class<S> clazz, ServiceFactory factory, Dictionary<String, ?> properties) {
+        throw new UnsupportedOperationException();
+    }
+
+    // this is part of org.osgi.core 6.0.0
+    /* class org.osgi.framework.ServiceObjects does not exist in older OSGi versions
+    public ServiceObjects getServiceObjects(ServiceReference reference) {
+        throw new UnsupportedOperationException();
+    }
+    */
+
 }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockComponentContext.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockComponentContext.java
index a00ec72..78154a5 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockComponentContext.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockComponentContext.java
@@ -48,7 +48,7 @@
     }
 
     @Override
-    public <S> S locateService(final String name, final ServiceReference<S> reference) {
+    public Object locateService(final String name, final ServiceReference reference) {
         return this.bundleContext.locateService(name, reference);
     }
 
@@ -79,7 +79,7 @@
     }
 
     @Override
-    public ServiceReference<?> getServiceReference() {
+    public ServiceReference getServiceReference() {
         throw new UnsupportedOperationException();
     }
 
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java
index 7bcac56..4959cb6 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java
@@ -46,7 +46,7 @@
     }
 
     @Override
-    public Dictionary<String, Object> getProperties() {
+    public Dictionary getProperties() {
         // return copy of dictionary
         return new Hashtable<String,Object>(MapUtil.toMap(props));
     }
@@ -100,9 +100,4 @@
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    public long getChangeCount() {
-        throw new UnsupportedOperationException();
-    }
-
 }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockEventAdmin.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockEventAdmin.java
index fa16f44..d182d1f 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockEventAdmin.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockEventAdmin.java
@@ -26,15 +26,15 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.sling.commons.osgi.Order;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.commons.osgi.ServiceUtil;
 import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.osgi.service.component.annotations.ReferencePolicy;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
 import org.osgi.service.event.EventConstants;
@@ -46,12 +46,12 @@
  * Mock implementation of {@link EventAdmin}.
  * From {@link EventConstants} currently only {@link EventConstants#EVENT_TOPIC} is supported. 
  */
-@Component(immediate = true, service = EventAdmin.class)
+@Component(immediate = true)
+@Service(value = EventAdmin.class)
 public final class MockEventAdmin implements EventAdmin {
     
-    @Reference(name="eventHandler", service=EventHandler.class,
-            cardinality=ReferenceCardinality.MULTIPLE, policy=ReferencePolicy.DYNAMIC,
-            bind="bindEventHandler", unbind="unbindEventHandler")
+    @Reference(name="eventHandler", referenceInterface=EventHandler.class,
+            cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
     private final Map<Object, EventHandlerItem> eventHandlers = new TreeMap<Object, EventHandlerItem>();
 
     private ExecutorService asyncHandler;
@@ -106,13 +106,13 @@
     
     protected void bindEventHandler(EventHandler eventHandler, Map<String, Object> props) {
         synchronized (eventHandlers) {
-            eventHandlers.put(ServiceUtil.getComparableForServiceRanking(props, Order.DESCENDING), new EventHandlerItem(eventHandler, props));
+            eventHandlers.put(ServiceUtil.getComparableForServiceRanking(props), new EventHandlerItem(eventHandler, props));
         }
     }
 
     protected void unbindEventHandler(EventHandler eventHandler, Map<String, Object> props) {
         synchronized (eventHandlers) {
-            eventHandlers.remove(ServiceUtil.getComparableForServiceRanking(props, Order.DESCENDING));
+            eventHandlers.remove(ServiceUtil.getComparableForServiceRanking(props));
         }
     }
     
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
index 7c07578..ccf2ed8 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
@@ -151,6 +151,18 @@
     /**
      * Simulate activation of service instance. Invokes the @Activate annotated method.
      * @param target Service instance.
+     * @return true if activation method was called. False if no activate method is defined.
+     * @deprecated Please use {@link #activate(Object, BundleContext)}
+     *   and shutdown the bundle context after usage.
+     */
+    @Deprecated
+    public static boolean activate(Object target) {
+        return MockOsgi.activate(target, (Dictionary<String, Object>)null);
+    }
+
+    /**
+     * Simulate activation of service instance. Invokes the @Activate annotated method.
+     * @param target Service instance.
      * @param bundleContext Bundle context
      * @return true if activation method was called. False if no activate method is defined.
      */
@@ -161,6 +173,34 @@
     /**
      * Simulate activation of service instance. Invokes the @Activate annotated method.
      * @param target Service instance.
+     * @param properties Properties
+     * @return true if activation method was called. False if no activate method is defined.
+     * @deprecated Please use {@link #activate(Object, BundleContext, Dictionary)}
+     *   and shutdown the bundle context after usage.
+     */
+    @Deprecated
+    public static boolean activate(Object target, Dictionary<String, Object> properties) {
+        Dictionary<String, Object> mergedProperties = propertiesMergeWithOsgiMetadata(target, null, properties);
+        ComponentContext componentContext = newComponentContext(mergedProperties);
+        return OsgiServiceUtil.activateDeactivate(target, componentContext, true);
+    }
+
+    /**
+     * Simulate activation of service instance. Invokes the @Activate annotated method.
+     * @param target Service instance.
+     * @param properties Properties
+     * @return true if activation method was called. False if no activate method is defined.
+     * @deprecated Please use {@link #activate(Object, BundleContext, Map)}
+     *   and shutdown the bundle context after usage.
+     */
+    @Deprecated
+    public static boolean activate(Object target, Map<String, Object> properties) {
+        return activate(target, toDictionary(properties));
+    }
+
+    /**
+     * Simulate activation of service instance. Invokes the @Activate annotated method.
+     * @param target Service instance.
      * @param bundleContext Bundle context
      * @param properties Properties
      * @return true if activation method was called. False if no activate method is defined.
@@ -196,6 +236,18 @@
     /**
      * Simulate deactivation of service instance. Invokes the @Deactivate annotated method.
      * @param target Service instance.
+     * @return true if deactivation method was called. False if no deactivate method is defined.
+     * @deprecated Please use {@link #deactivate(Object, BundleContext)}
+     *   and shutdown the bundle context after usage.
+     */
+    @Deprecated
+    public static boolean deactivate(Object target) {
+        return MockOsgi.deactivate(target, (Dictionary<String, Object>)null);
+    }
+
+    /**
+     * Simulate deactivation of service instance. Invokes the @Deactivate annotated method.
+     * @param target Service instance.
      * @param bundleContext Bundle context.
      * @return true if deactivation method was called. False if no deactivate method is defined.
      */
@@ -206,6 +258,34 @@
     /**
      * Simulate deactivation of service instance. Invokes the @Deactivate annotated method.
      * @param target Service instance.
+     * @param properties Properties
+     * @return true if deactivation method was called. False if no deactivate method is defined.
+     * @deprecated Please use {@link #deactivate(Object, BundleContext, Dictionary)}
+     *   and shutdown the bundle context after usage.
+     */
+    @Deprecated
+    public static boolean deactivate(Object target, Dictionary<String, Object> properties) {
+        Dictionary<String, Object> mergedProperties = propertiesMergeWithOsgiMetadata(target, null, properties);
+        ComponentContext componentContext = newComponentContext(mergedProperties);
+        return OsgiServiceUtil.activateDeactivate(target, componentContext, false);
+    }
+
+    /**
+     * Simulate deactivation of service instance. Invokes the @Deactivate annotated method.
+     * @param target Service instance.
+     * @param properties Properties
+     * @return true if deactivation method was called. False if no deactivate method is defined.
+     * @deprecated Please use {@link #deactivate(Object, BundleContext, Map)}
+     *   and shutdown the bundle context after usage.
+     */
+    @Deprecated
+    public static boolean deactivate(Object target, Map<String, Object> properties) {
+        return deactivate(target, toDictionary(properties));
+    }
+
+    /**
+     * Simulate deactivation of service instance. Invokes the @Deactivate annotated method.
+     * @param target Service instance.
      * @param bundleContext Bundle context
      * @param properties Properties
      * @return true if deactivation method was called. False if no deactivate method is defined.
@@ -258,8 +338,7 @@
      */
     public static boolean modified(Object target, BundleContext bundleContext, Map<String, Object> properties) {
         Map<String, Object> mergedProperties = propertiesMergeWithOsgiMetadata(target, getConfigAdmin(bundleContext), properties);
-        ComponentContext componentContext = newComponentContext(bundleContext, mergedProperties);
-        return OsgiServiceUtil.modified(target, componentContext, mergedProperties);
+        return OsgiServiceUtil.modified(target, bundleContext, mergedProperties);
     }
     
     /**
@@ -270,7 +349,7 @@
      * @return true if modified method was called. False if no modified method is defined.
      */
     public static boolean modified(Object target, BundleContext bundleContext, Object... properties) {
-        return modified(target, bundleContext, toDictionary(properties));
+        return modified(target, bundleContext, toMap(properties));
     }
     
     /**
@@ -321,7 +400,7 @@
      * @return Configuration admin or null if not registered.
      */
     private static ConfigurationAdmin getConfigAdmin(BundleContext bundleContext) {
-        ServiceReference<?> ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
+        ServiceReference ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
         if (ref != null) {
             return (ConfigurationAdmin)bundleContext.getService(ref);
         }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceReference.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceReference.java
index ed01402..f210095 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceReference.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceReference.java
@@ -22,7 +22,6 @@
 import java.util.Dictionary;
 import java.util.Map;
 
-import org.apache.sling.commons.osgi.Order;
 import org.apache.sling.commons.osgi.ServiceUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
@@ -31,24 +30,23 @@
 /**
  * Mock {@link ServiceReference} implementation.
  */
-class MockServiceReference<T> implements ServiceReference<T> {
+class MockServiceReference implements ServiceReference {
 
     private final Bundle bundle;
-    private final MockServiceRegistration<T> serviceRegistration;
+    private final MockServiceRegistration serviceRegistration;
     private volatile Comparable<Object> comparable;
 
-    public MockServiceReference(final Bundle bundle, final MockServiceRegistration<T> serviceRegistration) {
+    public MockServiceReference(final Bundle bundle, final MockServiceRegistration serviceRegistration) {
         this.bundle = bundle;
         this.serviceRegistration = serviceRegistration;
         this.comparable = buildComparable();
     }
-    
+
     private Comparable<Object> buildComparable() {
         Map<String,Object> props = MapUtil.toMap(serviceRegistration.getProperties());
-         // use ascending order as defined in ServiceReference#compareTo()
-        return ServiceUtil.getComparableForServiceRanking(props, Order.ASCENDING);
+        return ServiceUtil.getComparableForServiceRanking(props);
     }
-    
+
     @Override
     public Bundle getBundle() {
         return this.bundle;
@@ -114,7 +112,7 @@
         }
     }
 
-    T getService() {
+    Object getService() {
         return this.serviceRegistration.getService();
     }
 
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceRegistration.java b/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceRegistration.java
index 7a2e87d..8ef25a4 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceRegistration.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockServiceRegistration.java
@@ -38,25 +38,24 @@
 /**
  * Mock {@link ServiceRegistration} implementation.
  */
-class MockServiceRegistration<T> implements ServiceRegistration<T>, Comparable<MockServiceRegistration<T>> {
+class MockServiceRegistration implements ServiceRegistration, Comparable<MockServiceRegistration> {
 
     private static volatile long serviceCounter;
 
     private final Long serviceId;
     private final Set<String> clazzes;
-    private final T service;
+    private final Object service;
     private Dictionary<String, Object> properties;
-    private final ServiceReference<T> serviceReference;
+    private final ServiceReference serviceReference;
     private final MockBundleContext bundleContext;
 
-    @SuppressWarnings("unchecked")
-    public MockServiceRegistration(final Bundle bundle, final String[] clazzes, final T service,
+    public MockServiceRegistration(final Bundle bundle, final String[] clazzes, final Object service,
             final Dictionary<String, Object> properties, MockBundleContext bundleContext) {
         this.serviceId = ++serviceCounter;
         this.clazzes = new HashSet<String>(ImmutableList.copyOf(clazzes));
         
         if (service instanceof ServiceFactory) {
-            this.service = ((ServiceFactory<T>)service).getService(bundleContext.getBundle(), this);
+            this.service = ((ServiceFactory)service).getService(bundleContext.getBundle(), this);
         }
         else {
             this.service = service;
@@ -65,14 +64,14 @@
         this.properties = properties != null ? properties : new Hashtable<String,Object>();
         this.properties.put(Constants.SERVICE_ID, this.serviceId);
         this.properties.put(Constants.OBJECTCLASS, clazzes);
-        this.serviceReference = new MockServiceReference<T>(bundle, this);
+        this.serviceReference = new MockServiceReference(bundle, this);
         this.bundleContext = bundleContext;
         
         readOsgiMetadata();
     }
 
     @Override
-    public ServiceReference<T> getReference() {
+    public ServiceReference getReference() {
         return this.serviceReference;
     }
 
@@ -101,15 +100,8 @@
         return clazzes;
     }
 
-    @SuppressWarnings("unchecked")
-    T getService() {
-        if (this.service instanceof ServiceFactory) {
-            ServiceFactory<T> factory = (ServiceFactory<T>)this.service;
-            return factory.getService(this.bundleContext.getBundle(), this);
-        }
-        else {
-            return this.service;
-        }
+    Object getService() {
+        return this.service;
     }
     
     @Override
@@ -126,7 +118,7 @@
     }
 
     @Override
-    public int compareTo(MockServiceRegistration<T> obj) {
+    public int compareTo(MockServiceRegistration obj) {
         return serviceId.compareTo(obj.serviceId);
     }
 
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
index a4c5a4b..8306218 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
@@ -153,7 +153,7 @@
      * @return Cache map
      */
     private static Map<String,Document> initMetadataDocumentCache() {
-        Map<String,Document> cacheMap = new HashMap<>();
+        Map<String,Document> cacheMap = new HashMap<String,Document>();
         
         XPath xpath = XPATH_FACTORY.newXPath();
         xpath.setNamespaceContext(NAMESPACE_CONTEXT);
@@ -179,9 +179,21 @@
             Enumeration<URL> resourceUrls = OsgiMetadataUtil.class.getClassLoader().getResources(resourcePath);
             while (resourceUrls.hasMoreElements()) {
                 URL resourceUrl = resourceUrls.nextElement();
-                try (InputStream fileStream = resourceUrl.openStream()) {
+                InputStream fileStream = null;
+                try {
+                    fileStream = resourceUrl.openStream();
                     parseMetadataDocument(cacheMap, resourcePath, fileStream, xpathExpression);
                 }
+                finally {
+                    if (fileStream != null) {
+                        try {
+                            fileStream.close();
+                        }
+                        catch (IOException e) {
+                            // ignore
+                        }
+                    }
+                }
             }
         }
         catch (Exception ex) {
@@ -545,7 +557,7 @@
             return this.target;
         }
         
-        public boolean matchesTargetFilter(ServiceReference<?> serviceReference) {
+        public boolean matchesTargetFilter(ServiceReference serviceReference) {
             if (targetFilter == null) {
                 return true;
             }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java
index f95e72b..15340d4 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java
@@ -18,22 +18,20 @@
  */
 package org.apache.sling.testing.mock.osgi;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedSet;
 
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.felix.scr.impl.inject.Annotations;
-import org.apache.sling.testing.mock.osgi.OsgiMetadataUtil.FieldCollectionType;
 import org.apache.sling.testing.mock.osgi.OsgiMetadataUtil.OsgiMetadata;
 import org.apache.sling.testing.mock.osgi.OsgiMetadataUtil.Reference;
+import org.apache.sling.testing.mock.osgi.OsgiMetadataUtil.ReferenceCardinality;
 import org.apache.sling.testing.mock.osgi.OsgiMetadataUtil.ReferencePolicy;
 import org.apache.sling.testing.mock.osgi.OsgiMetadataUtil.ReferencePolicyOption;
 import org.osgi.framework.BundleContext;
@@ -56,6 +54,7 @@
      * @param componentContext Component context
      * @return true if activation/deactivation method was called. False if it failed.
      */
+    @SuppressWarnings("unchecked")
     public static boolean activateDeactivate(Object target, ComponentContext componentContext, boolean activate) {
         Class<?> targetClass = target.getClass();
 
@@ -81,61 +80,7 @@
         }
 
         // try to find matching activate/deactivate method and execute it
-        if (invokeLifecycleMethod(target, targetClass, methodName, !activate, 
-                componentContext, MapUtil.toMap(componentContext.getProperties()))) {
-            return true;
-        }
         
-        if (fallbackDefaultName) {
-            return false;
-        }
-        
-        throw new RuntimeException("No matching " + (activate ? "activation" : "deactivation") + " method with name '" + methodName + "' "
-                + " found in class " + targetClass.getName());
-    }
-
-    /**
-     * Simulate modification of configuration of OSGi service instance.
-     * @param target Service instance.
-     * @param properties Updated configuration
-     * @return true if modified method was called. False if it failed.
-     */
-    public static boolean modified(Object target, ComponentContext componentContext, Map<String,Object> properties) {
-        Class<?> targetClass = target.getClass();
-
-        // get method name for activation/deactivation from osgi metadata
-        OsgiMetadata metadata = OsgiMetadataUtil.getMetadata(targetClass);
-        if (metadata == null) {
-            throw new NoScrMetadataException(targetClass);
-        }
-        String methodName = metadata.getModifiedMethodName();
-        if (StringUtils.isEmpty(methodName)) {
-            return false;
-        }
-        
-        // try to find matching modified method and execute it
-        if (invokeLifecycleMethod(target, targetClass, methodName, false, componentContext, properties)) {
-            return true;
-        }
-
-        throw new RuntimeException("No matching modified method with name '" + methodName + "' "
-                + " found in class " + targetClass.getName());
-    }
-    
-    /**
-     * Invokes a lifecycle method (activation, deactivation or modified) with variable method arguments.
-     * @param target Target object
-     * @param targetClass Target object class
-     * @param methodName Method name
-     * @param allowIntegerArgument Allow int or Integer as arguments (only decactivate)
-     * @param componentContext Component context
-     * @param properties Component properties
-     * @return true if a method was found and invoked
-     */
-    private static boolean invokeLifecycleMethod(Object target, Class<?> targetClass, 
-            String methodName, boolean allowIntegerArgument,
-            ComponentContext componentContext, Map<String,Object> properties) {
-
         // 1. componentContext
         Method method = getMethod(targetClass, methodName, new Class<?>[] { ComponentContext.class });
         if (method != null) {
@@ -157,17 +102,8 @@
             return true;
         }
         
-        // 4. Component property type (annotation lass)
-        method = getMethod(targetClass, methodName, new Class<?>[] { Annotation.class });
-        if (method != null) {
-            invokeMethod(target, method, new Object[] { Annotations.toObject(method.getParameterTypes()[0],
-                    MapUtil.toMap(componentContext.getProperties()), 
-                    componentContext.getBundleContext().getBundle(), false) });
-            return true;
-        }
-        
-        // 5. int (deactivation only)
-        if (allowIntegerArgument) {
+        // 4. int (deactivation only)
+        if (!activate) {
             method = getMethod(targetClass, methodName, new Class<?>[] { int.class });
             if (method != null) {
                 invokeMethod(target, method, new Object[] { 0 });
@@ -175,8 +111,8 @@
             }
         }
         
-        // 6. Integer (deactivation only)
-        if (allowIntegerArgument) {
+        // 5. Integer (deactivation only)
+        if (!activate) {
             method = getMethod(targetClass, methodName, new Class<?>[] { Integer.class });
             if (method != null) {
                 invokeMethod(target, method, new Object[] { 0 });
@@ -184,10 +120,9 @@
             }
         }
         
-        // 7. mixed arguments
-        Class<?>[] mixedArgsAllowed = allowIntegerArgument ?
-                new Class<?>[] { ComponentContext.class, BundleContext.class, Map.class, Annotation.class, int.class, Integer.class }
-                : new Class<?>[] { ComponentContext.class, BundleContext.class, Map.class, Annotation.class };
+        // 6. mixed arguments of componentContext, bundleContext and map
+        Class<?>[] mixedArgsAllowed = activate ? new Class<?>[] { ComponentContext.class, BundleContext.class, Map.class }
+                : new Class<?>[] { ComponentContext.class, BundleContext.class, Map.class, int.class, Integer.class };
         method = getMethodWithAnyCombinationArgs(targetClass, methodName, mixedArgsAllowed);
         if (method != null) {
             Object[] args = new Object[method.getParameterTypes().length];
@@ -201,11 +136,6 @@
                 else if (method.getParameterTypes()[i] == Map.class) {
                     args[i] = MapUtil.toMap(componentContext.getProperties());
                 }
-                else if (method.getParameterTypes()[i].isAnnotation()) {
-                    args[i] = Annotations.toObject(method.getParameterTypes()[i],
-                            MapUtil.toMap(componentContext.getProperties()), 
-                            componentContext.getBundleContext().getBundle(), false);
-                }
                 else if (method.getParameterTypes()[i] == int.class || method.getParameterTypes()[i] == Integer.class) {
                     args[i] = 0;
                 }
@@ -214,31 +144,56 @@
             return true;
         }
 
-        // 8. noargs
+        // 7. noargs
         method = getMethod(targetClass, methodName, new Class<?>[0]);
         if (method != null) {
             invokeMethod(target, method, new Object[0]);
             return true;
-        }        
+        }
         
-        return false;
+        if (fallbackDefaultName) {
+            return false;
+        }
+        throw new RuntimeException("No matching " + (activate ? "activation" : "deactivation") + " method with name '" + methodName + "' "
+                + " found in class " + targetClass.getName());
+    }
+
+    /**
+     * Simulate modification of configuration of OSGi service instance.
+     * @param target Service instance.
+     * @param properties Updated configuration
+     * @return true if modified method was called. False if it failed.
+     */
+    public static boolean modified(Object target, BundleContext bundleContext, Map<String,Object> properties) {
+        Class<?> targetClass = target.getClass();
+
+        // get method name for activation/deactivation from osgi metadata
+        OsgiMetadata metadata = OsgiMetadataUtil.getMetadata(targetClass);
+        if (metadata == null) {
+            throw new NoScrMetadataException(targetClass);
+        }
+        String methodName = metadata.getModifiedMethodName();
+        if (StringUtils.isEmpty(methodName)) {
+            return false;
+        }
+        
+        // try to find matching modified method and execute it
+        Method method = getMethod(targetClass, methodName, new Class<?>[] { Map.class });
+        if (method != null) {
+            invokeMethod(target, method, new Object[] { properties });
+            return true;
+        }
+        
+        throw new RuntimeException("No matching modified method with name '" + methodName + "' "
+                + " found in class " + targetClass.getName());
     }
 
     private static Method getMethod(Class clazz, String methodName, Class<?>[] types) {
         Method[] methods = clazz.getDeclaredMethods();
         for (Method method : methods) {
-            if (StringUtils.equals(method.getName(), methodName) && method.getParameterTypes().length==types.length) {
-                boolean foundMismatch = false;
-                for (int i=0; i<types.length; i++) {
-                    if (!((method.getParameterTypes()[i]==types[i]) 
-                            || (types[i]==Annotation.class && method.getParameterTypes()[i].isAnnotation()))) {
-                        foundMismatch = true;
-                        break;
-                    }
-                }
-                if (!foundMismatch) {
-                    return method;
-                }
+            if (StringUtils.equals(method.getName(), methodName)
+                    && Arrays.equals(method.getParameterTypes(), types)) {
+                return method;
             }
         }
         // not found? check super classes
@@ -256,7 +211,7 @@
                 boolean foundMismatch = false;
                 for (int i=0; i<types.length; i++) {
                     if (!method.getParameterTypes()[i].isAssignableFrom(types[i])) {
-                        foundMismatch = true;
+                        foundMismatch = false;
                         break;
                     }
                 }
@@ -277,24 +232,12 @@
         Method[] methods = clazz.getDeclaredMethods();
         for (Method method : methods) {
             if (StringUtils.equals(method.getName(), methodName) && method.getParameterTypes().length > 1) {
-                boolean foundMismatch = false;
                 for (Class<?> parameterType : method.getParameterTypes()) {
-                    boolean foundAnyMatch = false;
-                    for (int i=0; i<types.length; i++) {
-                        if ((parameterType==types[i]) 
-                                || (types[i]==Annotation.class && parameterType.isAnnotation())) {
-                            foundAnyMatch = true;
-                            break;
-                        }
-                    }
-                    if (!foundAnyMatch) {
-                        foundMismatch = true;
-                        break;
+                    if (!ArrayUtils.contains(types,  parameterType)) {
+                        return null;
                     }
                 }
-                if (!foundMismatch) {
-                    return method;
-                }
+                return method;
             }
         }
         // not found? check super classes
@@ -321,49 +264,6 @@
         }
     }
 
-    private static Field getField(Class clazz, String fieldName, Class<?> type) {
-        Field[] fields = clazz.getDeclaredFields();
-        for (Field field : fields) {
-            if (StringUtils.equals(field.getName(), fieldName) && field.getType().equals(type)) {
-                return field;
-            }
-        }
-        // not found? check super classes
-        Class<?> superClass = clazz.getSuperclass();
-        if (superClass != null && superClass != Object.class) {
-            return getField(superClass, fieldName, type);
-        }
-        return null;
-    }
-    
-    private static Field getFieldWithAssignableType(Class clazz, String fieldName, Class<?> type) {
-        Field[] fields = clazz.getDeclaredFields();
-        for (Field field : fields) {
-            if (StringUtils.equals(field.getName(), fieldName) && field.getType().isAssignableFrom(type)) {
-                return field;
-            }
-        }
-        // not found? check super classes
-        Class<?> superClass = clazz.getSuperclass();
-        if (superClass != null && superClass != Object.class) {
-            return getFieldWithAssignableType(superClass, fieldName, type);
-        }
-        return null;
-    }
-    
-    private static void setField(Object target, Field field, Object value) {
-        try {
-            field.setAccessible(true);
-            field.set(target, value);
-        } catch (IllegalAccessException ex) {
-            throw new RuntimeException("Unable to set field '" + field.getName() + "' for class "
-                    + target.getClass().getName(), ex);
-        } catch (IllegalArgumentException ex) {
-            throw new RuntimeException("Unable to set field '" + field.getName() + "' for class "
-                    + target.getClass().getName(), ex);
-        }
-    }
-    
     /**
      * Simulate OSGi service dependency injection. Injects direct references and
      * multiple references.
@@ -396,24 +296,28 @@
         Class<?> targetClass = target.getClass();
 
         // get reference type
-        Class<?> type = reference.getInterfaceTypeAsClass();
+        Class<?> type;
+        try {
+            type = Class.forName(reference.getInterfaceType());
+        } catch (ClassNotFoundException ex) {
+            throw new RuntimeException("Unable to instantiate reference type: " + reference.getInterfaceType(), ex);
+        }
 
         // get matching service references
-        List<ServiceInfo> matchingServices = getMatchingServices(type, bundleContext, reference.getTarget());
+        List<ServiceInfo> matchingServices = getMatchingServices(type, bundleContext);
 
         // no references found? check if reference was optional
         if (matchingServices.isEmpty()) {
-            if (!reference.isCardinalityOptional()) {
+            boolean isOptional = (reference.getCardinality() == ReferenceCardinality.OPTIONAL_UNARY || reference
+                    .getCardinality() == ReferenceCardinality.OPTIONAL_MULTIPLE);
+            if (!isOptional) {
                 throw new ReferenceViolationException("Unable to inject mandatory reference '" + reference.getName() + "' for class " + targetClass.getName() + " : no matching services were found.");
             }
-            if (reference.isCardinalityMultiple()) {
-                // make sure at least empty array is set  
-                invokeBindUnbindMethod(reference, target, null, true);
-            }
         }
 
         // multiple references found? check if reference is not multiple
-        if (matchingServices.size() > 1 && !reference.isCardinalityMultiple()) {
+        if (matchingServices.size() > 1
+                && (reference.getCardinality() == ReferenceCardinality.MANDATORY_UNARY || reference.getCardinality() == ReferenceCardinality.OPTIONAL_UNARY)) {
             throw new ReferenceViolationException("Multiple matches found for unary reference '" + reference.getName() + "' for class "+ targetClass.getName());
         }
 
@@ -428,14 +332,7 @@
 
         // try to invoke bind method
         String methodName = bind ? reference.getBind() : reference.getUnbind();
-        String fieldName = reference.getField();
-        
-        if (StringUtils.isEmpty(methodName) && StringUtils.isEmpty(fieldName)) {
-            throw new RuntimeException("No bind/unbind method name or file name defined "
-                    + "for reference '" + reference.getName() + "' for class " +  targetClass.getName());
-        }
-
-        if (StringUtils.isNotEmpty(methodName) && serviceInfo != null) {
+        if (StringUtils.isNotEmpty(methodName)) {
             
             // 1. ServiceReference
             Method method = getMethod(targetClass, methodName, new Class<?>[] { ServiceReference.class });
@@ -445,7 +342,12 @@
             }
             
             // 2. assignable from service instance
-            Class<?> interfaceType = reference.getInterfaceTypeAsClass();
+            Class<?> interfaceType;
+            try {
+                interfaceType = Class.forName(reference.getInterfaceType());
+            } catch (ClassNotFoundException e) {
+                throw new RuntimeException("Service reference type not found: " + reference.getInterfaceType());
+            }
             method = getMethodWithAssignableTypes(targetClass, methodName, new Class<?>[] { interfaceType });
             if (method != null) {
                 invokeMethod(target, method, new Object[] { serviceInfo.getServiceInstance() });
@@ -458,119 +360,10 @@
                 invokeMethod(target, method, new Object[] { serviceInfo.getServiceInstance(), serviceInfo.getServiceConfig() });
                 return;
             }
-        
-            throw new RuntimeException((bind ? "Bind" : "Unbind") + " method with name " + methodName + " not found "
-                    + "for reference '" + reference.getName() + "' for class " +  targetClass.getName());
-        }
-        
-        // in OSGi declarative services 1.3 there are no bind/unbind methods - modify the field directly
-        else if (StringUtils.isNotEmpty(fieldName)) {
-            
-            // check for field with list/collection reference
-            if (reference.isCardinalityMultiple()) {
-                switch (reference.getFieldCollectionType()) {
-                    case SERVICE:
-                    case REFERENCE:
-                        Object item = null;
-                        if (serviceInfo != null) {
-                            item = serviceInfo.getServiceInstance();
-                            if (reference.getFieldCollectionType() == FieldCollectionType.REFERENCE) {
-                                item = serviceInfo.getServiceReference();
-                            }
-                        }
-                        // 1. collection
-                        Field field = getFieldWithAssignableType(targetClass, fieldName, Collection.class);
-                        if (field != null) {
-                            if (bind) {
-                                addToCollection(target, field, item);
-                            }
-                            else {
-                                removeFromCollection(target, field, item);
-                            }
-                            return;
-                        }
-                        
-                        // 2. list
-                        field = getField(targetClass, fieldName, List.class);
-                        if (field != null) {
-                            if (bind) {
-                                addToCollection(target, field, item);
-                            }
-                            else {
-                                removeFromCollection(target, field, item);
-                            }
-                            return;
-                        }
-                        break;
-                    default:
-                        throw new RuntimeException("Field collection type '" + reference.getFieldCollectionType() + "' not supported "
-                                + "for reference '" + reference.getName() + "' for class " +  targetClass.getName());
-                }
-            }
-            
-            // check for single field reference
-            else {
-                // 1. assignable from service instance
-                Class<?> interfaceType = reference.getInterfaceTypeAsClass();
-                Field field = getFieldWithAssignableType(targetClass, fieldName, interfaceType);
-                if (field != null) {
-                    setField(target, field, bind && serviceInfo != null ? serviceInfo.getServiceInstance() : null);
-                    return;
-                }
-                
-                // 2. ServiceReference
-                field = getField(targetClass, fieldName, ServiceReference.class);
-                if (field != null) {
-                    setField(target, field, bind && serviceInfo != null ? serviceInfo.getServiceReference() : null);
-                    return;
-                }
-            }
         }
 
-    }
-    
-    @SuppressWarnings("unchecked")
-    private static void addToCollection(Object target, Field field, Object item) {
-        try {
-            field.setAccessible(true);
-            Collection<Object> collection = (Collection<Object>)field.get(target);
-            if (collection == null) {
-                collection = new ArrayList<Object>();
-            }
-            if (item != null) {
-                collection.add(item);
-            }
-            field.set(target, collection);
-            
-        } catch (IllegalAccessException ex) {
-            throw new RuntimeException("Unable to set field '" + field.getName() + "' for class "
-                    + target.getClass().getName(), ex);
-        } catch (IllegalArgumentException ex) {
-            throw new RuntimeException("Unable to set field '" + field.getName() + "' for class "
-                    + target.getClass().getName(), ex);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private static void removeFromCollection(Object target, Field field, Object item) {
-        try {
-            field.setAccessible(true);
-            Collection<Object> collection = (Collection<Object>)field.get(target);
-            if (collection == null) {
-                collection = new ArrayList<Object>();
-            }
-            if (item != null) {
-                collection.remove(item);
-            }
-            field.set(target, collection);
-            
-        } catch (IllegalAccessException ex) {
-            throw new RuntimeException("Unable to set field '" + field.getName() + "' for class "
-                    + target.getClass().getName(), ex);
-        } catch (IllegalArgumentException ex) {
-            throw new RuntimeException("Unable to set field '" + field.getName() + "' for class "
-                    + target.getClass().getName(), ex);
-        }
+        throw new RuntimeException((bind ? "Bind" : "Unbind") + " method with name " + methodName + " not found "
+                + "for reference '" + reference.getName() + "' for class " +  targetClass.getName());
     }
 
     /**
@@ -593,12 +386,12 @@
         invokeBindUnbindMethod(reference,  target, serviceInfo, false);
     }
     
-    private static List<ServiceInfo> getMatchingServices(Class<?> type, BundleContext bundleContext, String filter) {
+    private static List<ServiceInfo> getMatchingServices(Class<?> type, BundleContext bundleContext) {
         List<ServiceInfo> matchingServices = new ArrayList<ServiceInfo>();
         try {
-            ServiceReference[] references = bundleContext.getServiceReferences(type.getName(), filter);
+            ServiceReference[] references = bundleContext.getServiceReferences(type.getName(), null);
             if (references != null) {
-                for (ServiceReference<?> serviceReference : references) {
+                for (ServiceReference serviceReference : references) {
                     Object serviceInstance = bundleContext.getService(serviceReference);
                     Map<String, Object> serviceConfig = new HashMap<String, Object>();
                     String[] keys = serviceReference.getPropertyKeys();
@@ -622,7 +415,7 @@
      * @return List of references
      */
     public static List<ReferenceInfo> getMatchingDynamicReferences(SortedSet<MockServiceRegistration> registeredServices,
-            MockServiceRegistration<?> registration) {
+            MockServiceRegistration registration) {
         List<ReferenceInfo> references = new ArrayList<ReferenceInfo>();
         for (MockServiceRegistration existingRegistration : registeredServices) {
             OsgiMetadata metadata = OsgiMetadataUtil.getMetadata(existingRegistration.getService().getClass());
@@ -649,7 +442,7 @@
      * @return List of references
      */
     public static List<ReferenceInfo> getMatchingStaticGreedyReferences(SortedSet<MockServiceRegistration> registeredServices,
-            MockServiceRegistration<?> registration) {
+            MockServiceRegistration registration) {
         List<ReferenceInfo> references = new ArrayList<ReferenceInfo>();
         for (MockServiceRegistration existingRegistration : registeredServices) {
             OsgiMetadata metadata = OsgiMetadataUtil.getMetadata(existingRegistration.getService().getClass());
@@ -680,7 +473,6 @@
             this.serviceReference = serviceReference;
         }
 
-        @SuppressWarnings("unchecked")
         public ServiceInfo(MockServiceRegistration registration) {
             this.serviceInstance = registration.getService();
             this.serviceConfig = MapUtil.toMap(registration.getProperties());
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/AbstractContextPlugin.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/AbstractContextPlugin.java
index 5d71c9c..594f05d 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/AbstractContextPlugin.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/AbstractContextPlugin.java
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.testing.mock.osgi.context;
 
-import org.osgi.annotation.versioning.ConsumerType;
+import aQute.bnd.annotation.ConsumerType;
 
 /**
  * Default implementation of {@link ContextPlugin}.
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextCallback.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextCallback.java
index aa2ed12..e50514d 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextCallback.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextCallback.java
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.testing.mock.osgi.context;
 
-import org.osgi.annotation.versioning.ConsumerType;
+import aQute.bnd.annotation.ConsumerType;
 
 /**
  * Callback interface for application-specific setup and teardown operations to
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugin.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugin.java
index 4fe3616..df7e458 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugin.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugin.java
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.testing.mock.osgi.context;
 
-import org.osgi.annotation.versioning.ConsumerType;
+import aQute.bnd.annotation.ConsumerType;
 
 /**
  * Callback plugin for application-specific setup and teardown operations to
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java
index 503bf92..26a2b2a 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/ContextPlugins.java
@@ -22,7 +22,7 @@
 import java.util.Collection;
 import java.util.List;
 
-import org.osgi.annotation.versioning.ProviderType;
+import aQute.bnd.annotation.ProviderType;
 
 /**
  * Collects list of context plugins.
@@ -30,7 +30,7 @@
 @ProviderType
 public final class ContextPlugins {
     
-    private List<ContextPlugin<? extends OsgiContextImpl>> plugins = new ArrayList<>();
+    private List<ContextPlugin<? extends OsgiContextImpl>> plugins = new ArrayList<ContextPlugin<? extends OsgiContextImpl>>();
 
     /**
      * Start with empty list.
@@ -44,6 +44,7 @@
      * @param <T> context type
      * @param afterSetUpCallback Allows the application to register an own callback function that is called after the built-in setup rules are executed.
      */
+    @SuppressWarnings("unchecked")
     public <T extends OsgiContextImpl> ContextPlugins(final ContextCallback<T> afterSetUpCallback) {
         addAfterSetUpCallback(afterSetUpCallback);
     }
@@ -55,6 +56,7 @@
      * @param afterSetUpCallback Allows the application to register an own callback function that is called after the built-in setup rules are executed.
      * @param beforeTearDownCallback Allows the application to register an own callback function that is called before the built-in teardown rules are executed.
      */
+    @SuppressWarnings("unchecked")
     public <U extends OsgiContextImpl, V extends OsgiContextImpl> ContextPlugins(final ContextCallback<U> afterSetUpCallback, final ContextCallback<V> beforeTearDownCallback) {
         addAfterSetUpCallback(afterSetUpCallback);
         addBeforeTearDownCallback(beforeTearDownCallback);
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java
index acb96e7..cfe02a2 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java
@@ -25,12 +25,13 @@
 import org.apache.sling.testing.mock.osgi.MapUtil;
 import org.apache.sling.testing.mock.osgi.MockEventAdmin;
 import org.apache.sling.testing.mock.osgi.MockOsgi;
-import org.osgi.annotation.versioning.ConsumerType;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 
+import aQute.bnd.annotation.ConsumerType;
+
 /**
  * Defines OSGi context objects and helper methods. Should not be used directly
  * but via the {@link org.apache.sling.testing.mock.osgi.junit.OsgiContext} JUnit rule.
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java b/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java
index 6e57ffd..fbd1a7b 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java
@@ -19,5 +19,5 @@
 /**
  * OSGi context implementation for unit tests.
  */
-@org.osgi.annotation.versioning.Version("1.2")
+@aQute.bnd.annotation.Version("1.2")
 package org.apache.sling.testing.mock.osgi.context;
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java b/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java
index 77e8ad5..f9718e3 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java
@@ -25,7 +25,8 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
-import org.osgi.annotation.versioning.ProviderType;
+
+import aQute.bnd.annotation.ProviderType;
 
 /**
  * JUnit rule for setting up and tearing down OSGi context for unit tests.
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextBuilder.java b/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextBuilder.java
index 9207e40..05d2220 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextBuilder.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextBuilder.java
@@ -18,11 +18,12 @@
  */
 package org.apache.sling.testing.mock.osgi.junit;
 
-import org.apache.sling.testing.mock.osgi.context.ContextPlugins;
-import org.apache.sling.testing.mock.osgi.context.OsgiContextImpl;
 import org.apache.sling.testing.mock.osgi.context.ContextCallback;
 import org.apache.sling.testing.mock.osgi.context.ContextPlugin;
-import org.osgi.annotation.versioning.ProviderType;
+import org.apache.sling.testing.mock.osgi.context.ContextPlugins;
+import org.apache.sling.testing.mock.osgi.context.OsgiContextImpl;
+
+import aQute.bnd.annotation.ProviderType;
 
 /**
  * Builder class for creating {@link OsgiContext} instances with different sets of parameters.
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java b/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java
index 710b65d..946a9e0 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java
@@ -19,7 +19,8 @@
 package org.apache.sling.testing.mock.osgi.junit;
 
 import org.apache.sling.testing.mock.osgi.context.ContextCallback;
-import org.osgi.annotation.versioning.ConsumerType;
+
+import aQute.bnd.annotation.ConsumerType;
 
 /**
  * Callback interface for application-specific setup and teardown operations to
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java b/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java
index 2295cbc..ca88e22 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java
@@ -19,5 +19,5 @@
 /**
  * Rule for providing easy access to OSGi context in JUnit tests.
  */
-@org.osgi.annotation.versioning.Version("2.0")
+@aQute.bnd.annotation.Version("2.0")
 package org.apache.sling.testing.mock.osgi.junit;
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java b/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java
index d1f57fc..315ee5c 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java
@@ -19,5 +19,5 @@
 /**
  * Mock implementation of selected OSGi APIs.
  */
-@org.osgi.annotation.versioning.Version("3.3")
+@aQute.bnd.annotation.Version("2.7")
 package org.apache.sling.testing.mock.osgi;
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextDynamicReferencesOsgiR6Test.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextDynamicReferencesOsgiR6Test.java
deleted file mode 100644
index b7d022c..0000000
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextDynamicReferencesOsgiR6Test.java
+++ /dev/null
@@ -1,188 +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.sling.testing.mock.osgi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-import org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.Service3OsgiR6;
-import org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.ServiceInterface1;
-import org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.ServiceInterface1Optional;
-import org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.ServiceInterface2;
-import org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.ServiceInterface3;
-import org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.ServiceSuperInterface3;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
-@RunWith(MockitoJUnitRunner.class)
-public class MockBundleContextDynamicReferencesOsgiR6Test {
-
-    private BundleContext bundleContext;
-    private Service3OsgiR6 service;
-    private ServiceRegistration reg1a;
-    private ServiceRegistration reg2a;
-    
-    @Mock
-    private ServiceInterface1 dependency1a;
-    @Mock
-    private ServiceInterface1 dependency1b;
-    @Mock
-    private ServiceInterface1Optional dependency1aOptional;
-    @Mock
-    private ServiceInterface1Optional dependency1bOptional;
-    @Mock
-    private ServiceInterface2 dependency2a;
-    @Mock
-    private ServiceInterface2 dependency2b;
-    @Mock
-    private ServiceSuperInterface3 dependency3a;
-    @Mock
-    private ServiceSuperInterface3 dependency3b;
-
-    @Before
-    public void setUp() {
-        bundleContext = MockOsgi.newBundleContext();
-        
-        // setup service instance with only minimum mandatory references
-        reg1a = bundleContext.registerService(ServiceInterface1.class.getName(), dependency1a, null);
-        reg2a = bundleContext.registerService(ServiceInterface2.class.getName(), dependency2a, null);
-        
-        service = new Service3OsgiR6();
-        MockOsgi.injectServices(service, bundleContext);
-        MockOsgi.activate(service, bundleContext);
-        bundleContext.registerService(Service3OsgiR6.class.getName(), service, null);
-        
-        assertDependency1(dependency1a);
-        assertDependency1Optional(null);
-        assertDependencies2(dependency2a);
-        assertDependencies3();
-    }
-
-    @Test
-    public void testAddRemoveOptionalUnaryService() {
-        ServiceRegistration reg1aOptional = bundleContext.registerService(ServiceInterface1Optional.class.getName(), dependency1aOptional, null);
-        assertDependency1Optional(dependency1aOptional);
-        
-        reg1aOptional.unregister();
-        assertDependency1Optional(null);
-    }
-    
-    public void testAddOptionalUnaryService_TooMany() {
-        bundleContext.registerService(ServiceInterface1Optional.class.getName(), dependency1aOptional, null);
-        assertDependency1Optional(dependency1aOptional);
-        
-        // in real OSGi this should fail - but this is not covered by the current implementation. so test the real implementation here.
-        bundleContext.registerService(ServiceInterface1Optional.class.getName(), dependency1bOptional, null);
-        assertDependency1Optional(dependency1bOptional);
-    }
-    
-    @Test(expected = ReferenceViolationException.class)
-    public void testAddMandatoryUnaryService_TooMany() {
-        bundleContext.registerService(ServiceInterface1.class.getName(), dependency1b, null);
-    }
-    
-    @Test(expected = ReferenceViolationException.class)
-    public void testRemoveMandatoryUnaryService_TooMany() {
-        reg1a.unregister();
-    }
-    
-    @Test
-    public void testAddRemoveOptionalMultipleService() {
-        ServiceRegistration reg3a = bundleContext.registerService(ServiceInterface3.class.getName(), dependency3a, null);
-        assertDependencies3(dependency3a);
-
-        ServiceRegistration reg3b = bundleContext.registerService(ServiceInterface3.class.getName(), dependency3b, null);
-        assertDependencies3(dependency3a, dependency3b);
-
-        reg3a.unregister();
-        assertDependencies3(dependency3b);
-        
-        reg3b.unregister();
-        assertDependencies3();
-    }
-    
-    @Test
-    public void testAddRemoveMandatoryMultipleService() {
-        ServiceRegistration reg2b = bundleContext.registerService(ServiceInterface2.class.getName(), dependency2b, null);
-        assertDependencies2(dependency2a, dependency2b);
-
-        reg2b.unregister();
-        assertDependencies2(dependency2a);
-        
-        // in real OSGi this should fail - but this is not covered by the current implementation. so test the real implementation here.
-        reg2a.unregister();
-        assertDependencies2();
-    }
-    
-    @Test
-    public void testReferenceWithTargetFilter() {
-        assertDependencies3Filtered();
-        
-        bundleContext.registerService(ServiceInterface3.class.getName(), dependency3a, 
-                MapUtil.toDictionary(ImmutableMap.<String, Object>of("prop1", "abc")));
-
-        bundleContext.registerService(ServiceInterface3.class.getName(), dependency3b, 
-                MapUtil.toDictionary(ImmutableMap.<String, Object>of("prop1", "def")));
-        
-        assertDependencies3Filtered(dependency3a);
-    }
-    
-    private void assertDependency1(ServiceInterface1 instance) {
-        if (instance == null) {
-            assertNull(service.getReference1());
-        }
-        else {
-            assertSame(instance, service.getReference1());
-        }
-    }
-    
-    private void assertDependency1Optional(ServiceInterface1Optional instance) {
-        if (instance == null) {
-            assertNull(service.getReference1Optional());
-        }
-        else {
-            assertSame(instance, service.getReference1Optional());
-        }
-    }
-    
-    private void assertDependencies2(ServiceInterface2... instances) {
-        assertEquals(ImmutableSet.<ServiceInterface2>copyOf(instances), 
-                ImmutableSet.<ServiceInterface2>copyOf(service.getReferences2()));
-    }
-    
-    private void assertDependencies3(ServiceSuperInterface3... instances) {
-        assertEquals(ImmutableSet.<ServiceSuperInterface3>copyOf(instances), 
-                ImmutableSet.<ServiceSuperInterface3>copyOf(service.getReferences3()));
-    }
-    
-    private void assertDependencies3Filtered(ServiceSuperInterface3... instances) {
-        assertEquals(ImmutableSet.<ServiceSuperInterface3>copyOf(instances), 
-                ImmutableSet.<ServiceSuperInterface3>copyOf(service.getReferences3Filtered()));
-    }
-    
-}
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextStaticGreedyReferencesTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextStaticGreedyReferencesTest.java
index f707222..98d31c3 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextStaticGreedyReferencesTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextStaticGreedyReferencesTest.java
@@ -179,7 +179,7 @@
     }
     
     private Service3StaticGreedy getService() {
-        ServiceReference<?> serviceRef = bundleContext.getServiceReference(Service3StaticGreedy.class.getName());
+        ServiceReference serviceRef = bundleContext.getServiceReference(Service3StaticGreedy.class.getName());
         return (Service3StaticGreedy)bundleContext.getService(serviceRef);
     }
     
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextTest.java
index 1760ced..e68f447 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/MockBundleContextTest.java
@@ -30,7 +30,6 @@
 import static org.mockito.Mockito.verify;
 
 import java.io.File;
-import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
@@ -39,7 +38,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.runners.MockitoJUnitRunner;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleListener;
@@ -47,7 +45,6 @@
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
@@ -91,27 +88,27 @@
         ServiceRegistration reg3 = bundleContext.registerService(clazz3, service3, properties3);
 
         // test get service references
-        ServiceReference<?> refString = bundleContext.getServiceReference(String.class.getName());
+        ServiceReference refString = bundleContext.getServiceReference(String.class.getName());
         assertSame(reg1.getReference(), refString);
 
-        ServiceReference<?> refInteger = bundleContext.getServiceReference(Integer.class.getName());
+        ServiceReference refInteger = bundleContext.getServiceReference(Integer.class.getName());
         assertSame(reg1.getReference(), refInteger);
 
-        ServiceReference<?>[] refsString = bundleContext.getServiceReferences(String.class.getName(), null);
+        ServiceReference[] refsString = bundleContext.getServiceReferences(String.class.getName(), null);
         assertEquals(2, refsString.length);
         assertSame(reg1.getReference(), refsString[0]);
         assertSame(reg2.getReference(), refsString[1]);
 
-        Collection<ServiceReference<String>> refColString = bundleContext.getServiceReferences(String.class, null);
-        assertEquals(2, refColString.size());
-        assertSame(reg1.getReference(), refColString.iterator().next());
+        ServiceReference[] refColString = bundleContext.getServiceReferences(String.class.getName(), null);
+        assertEquals(2, refColString.length);
+        assertSame(reg1.getReference(), refColString[0]);
 
-        ServiceReference<?>[] refsInteger = bundleContext.getServiceReferences(Integer.class.getName(), null);
+        ServiceReference[] refsInteger = bundleContext.getServiceReferences(Integer.class.getName(), null);
         assertEquals(2, refsInteger.length);
         assertSame(reg1.getReference(), refsInteger[0]);
         assertSame(reg3.getReference(), refsInteger[1]);
 
-        ServiceReference<?>[] allRefsString = bundleContext.getAllServiceReferences(String.class.getName(), null);
+        ServiceReference[] allRefsString = bundleContext.getAllServiceReferences(String.class.getName(), null);
         assertArrayEquals(refsString, allRefsString);
 
         // test get services
@@ -126,45 +123,11 @@
     }
     
     @Test
-    public void testServiceFactoryRegistration() throws InvalidSyntaxException {
-        // prepare test services
-        Class<String> clazz = String.class;
-        final String service = "abc";
-        Dictionary<String, Object> properties1 = ranking(null);
-        ServiceRegistration reg = bundleContext.registerService(clazz, new ServiceFactory<String>() {
-            @Override
-            public String getService(Bundle bundle, ServiceRegistration<String> registration) {
-                return service;
-            }
-            @Override
-            public void ungetService(Bundle bundle, ServiceRegistration<String> registration, String service) {
-                // do nothing
-            }
-        }, properties1);
-
-        ServiceReference<String> ref = bundleContext.getServiceReference(clazz);
-        assertNotNull(ref);
-        assertSame(reg.getReference(), ref);
-        assertSame(service, bundleContext.getService(ref));
-        bundleContext.ungetService(ref);
-    }
-    
-    @Test
-    public void testNoServiceReferences() throws InvalidSyntaxException {
-        ServiceReference<?>[] refs = bundleContext.getServiceReferences(String.class.getName(), null);
-        assertNull(refs);
-
-        Collection<ServiceReference<String>> refCol = bundleContext.getServiceReferences(String.class, null);
-        assertNotNull(refCol);
-        assertTrue(refCol.isEmpty());
-    }
-    
-    @Test
     public void testServiceUnregistration() {
         // prepare test services
         String clazz1 = String.class.getName();
         Object service1 = new Object();
-        Dictionary<String, Object> properties1 = ranking(null);
+        Dictionary properties1 = ranking(null);
         ServiceRegistration reg1 = bundleContext.registerService(clazz1, service1, properties1);
         
         assertNotNull(bundleContext.getServiceReference(clazz1));
@@ -174,7 +137,6 @@
         assertNull(bundleContext.getServiceReference(clazz1));
     }
     
-
     @Test
     public void testGetBundles() throws Exception {
         assertEquals(0, bundleContext.getBundles().length);
@@ -253,32 +215,14 @@
     }
 
     @Test
-    public void testSystemBundleById() {
-        Bundle systemBundle = bundleContext.getBundle(Constants.SYSTEM_BUNDLE_ID);
-        assertNotNull(systemBundle);
-        assertEquals(Constants.SYSTEM_BUNDLE_ID, systemBundle.getBundleId());
-        assertEquals(Constants.SYSTEM_BUNDLE_SYMBOLICNAME, systemBundle.getSymbolicName());
-        assertEquals(Constants.SYSTEM_BUNDLE_LOCATION, systemBundle.getLocation());
-    }
-
-    @Test
-    public void testSystemBundleByLocation() {
-        Bundle systemBundle = bundleContext.getBundle(Constants.SYSTEM_BUNDLE_LOCATION);
-        assertNotNull(systemBundle);
-        assertEquals(Constants.SYSTEM_BUNDLE_ID, systemBundle.getBundleId());
-        assertEquals(Constants.SYSTEM_BUNDLE_SYMBOLICNAME, systemBundle.getSymbolicName());
-        assertEquals(Constants.SYSTEM_BUNDLE_LOCATION, systemBundle.getLocation());
-    }
-
-    @Test
     public void testGetServiceOrderWithRanking() {
-        bundleContext.registerService(String.class, "service1", ranking(10));
-        bundleContext.registerService(String.class, "service2", ranking(20));
-        bundleContext.registerService(String.class, "service3", ranking(5));
+        bundleContext.registerService(String.class.getName(), "service1", ranking(10));
+        bundleContext.registerService(String.class.getName(), "service2", ranking(20));
+        bundleContext.registerService(String.class.getName(), "service3", ranking(5));
         
         // should return service with highest ranking
-        ServiceReference<String> ref = bundleContext.getServiceReference(String.class);
-        String service = bundleContext.getService(ref);
+        ServiceReference ref = bundleContext.getServiceReference(String.class.getName());
+        String service = (String)bundleContext.getService(ref);
         assertEquals("service2", service);
         
         bundleContext.ungetService(ref);
@@ -286,13 +230,13 @@
 
     @Test
     public void testGetServiceOrderWithoutRanking() {
-        bundleContext.registerService(String.class, "service1", ranking(null));
-        bundleContext.registerService(String.class, "service2", ranking(null));
-        bundleContext.registerService(String.class, "service3", ranking(null));
+        bundleContext.registerService(String.class.getName(), "service1", ranking(null));
+        bundleContext.registerService(String.class.getName(), "service2", ranking(null));
+        bundleContext.registerService(String.class.getName(), "service3", ranking(null));
         
         // should return service with lowest service id = which was registered first
-        ServiceReference<String> ref = bundleContext.getServiceReference(String.class);
-        String service = bundleContext.getService(ref);
+        ServiceReference ref = bundleContext.getServiceReference(String.class.getName());
+        String service = (String)bundleContext.getService(ref);
         assertEquals("service1", service);
         
         bundleContext.ungetService(ref);
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockComponentContextTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockComponentContextTest.java
index aab327e..b4497eb 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockComponentContextTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/MockComponentContextTest.java
@@ -71,7 +71,7 @@
         String clazz = String.class.getName();
         Object service = new Object();
         underTest.getBundleContext().registerService(clazz, service, null);
-        ServiceReference<?> ref = underTest.getBundleContext().getServiceReference(clazz);
+        ServiceReference ref = underTest.getBundleContext().getServiceReference(clazz);
 
         // test locate service
         Object locatedService = underTest.locateService(null, ref);
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java
index 2c83bcf..daf1268 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java
@@ -22,8 +22,10 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Hashtable;
+import java.util.List;
 
 import org.junit.After;
 import org.junit.Before;
@@ -34,9 +36,7 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
-/** 
- * Test the service-ranking based sorting of mock service references
- */
+/** Test the service-ranking based sorting of mock service references */
 public class MockServiceReferencesSortTest {
     
     private BundleContext bundleContext;
@@ -52,73 +52,49 @@
     }
 
     @Test
-    public void testAllWithRanking() {
-        registerStringServiceWithRanking("A", 3);
-        registerStringServiceWithRanking("B", 5);
-        registerStringServiceWithRanking("C", 4);
-        registerStringServiceWithRanking("D", 1);
-        registerStringServiceWithRanking("E", 2);
-        
-        assertEquals("DEACB", getSortedServicesString());
-        assertEquals("B", bundleContext.getService(bundleContext.getServiceReference(String.class)));
+    public void testServicesOrder() {
+        assertEquals("12345", getSortedServicesString(bundleContext));
     }
 
-    @Test
-    public void testAllWithoutRanking() {
-        registerStringServiceWithoutRanking("A");
-        registerStringServiceWithoutRanking("B");
-        registerStringServiceWithoutRanking("C");
-        registerStringServiceWithoutRanking("D");
-        registerStringServiceWithoutRanking("E");
-        
-        assertEquals("EDCBA", getSortedServicesString());
-        assertEquals("A", bundleContext.getService(bundleContext.getServiceReference(String.class)));
-    }
-
-    @Test
-    public void testMixed() {
-        registerStringServiceWithoutRanking("A");
-        registerStringServiceWithRanking("B", 5);
-        registerStringServiceWithoutRanking("C");
-        registerStringServiceWithRanking("D", 10);
-        registerStringServiceWithoutRanking("E");
-        
-        assertEquals("ECABD", getSortedServicesString());
-        assertEquals("D", bundleContext.getService(bundleContext.getServiceReference(String.class)));
-    }
-
-    private ServiceRegistration<?> registerStringServiceWithoutRanking(String serviceValue) {
-        return bundleContext.registerService(String.class, serviceValue, new Hashtable<String, Object>());
-    }
-
-    private ServiceRegistration<?> registerStringServiceWithRanking(String serviceValue, int index) {
+    private static ServiceRegistration registerStringService(BundleContext ctx, int index) {
         final Hashtable<String, Object> props = new Hashtable<String, Object>();
         props.put(Constants.SERVICE_RANKING, new Integer(index));
-        return bundleContext.registerService(String.class, serviceValue, props);
+        return ctx.registerService(String.class.getName(), String.valueOf(index), props);
     }
     
     /** Register services with a specific ranking, sort their references and 
      *  return their concatenated toString() values.
      *  Use to test service references sorting.
      */
-    private String getSortedServicesString() {
-        ServiceReference<?>[] refs = null;
+    private static String getSortedServicesString(BundleContext ctx) {
+        final List<ServiceRegistration> toCleanup = new ArrayList<ServiceRegistration>();
+        
+        toCleanup.add(registerStringService(ctx, 3));
+        toCleanup.add(registerStringService(ctx, 5));
+        toCleanup.add(registerStringService(ctx, 4));
+        toCleanup.add(registerStringService(ctx, 1));
+        toCleanup.add(registerStringService(ctx, 2));
+        
+        ServiceReference [] refs = null;
         try {
-            refs = bundleContext.getServiceReferences(String.class.getName(), null);
-        }
-        catch (InvalidSyntaxException ise) {
+            refs = ctx.getServiceReferences(String.class.getName(), null);
+        } catch(InvalidSyntaxException ise) {
             fail("Unexpected InvalidSyntaxException");
         }
         assertNotNull("Expecting our service references", refs);
         Arrays.sort(refs);
         
         final StringBuilder sb = new StringBuilder();
-        for(ServiceReference<?> ref : refs) {
-            sb.append(bundleContext.getService(ref).toString());
-            bundleContext.ungetService(ref);
+        for(ServiceReference ref : refs) {
+            sb.append(ctx.getService(ref).toString());
+            ctx.ungetService(ref);
+        }
+        
+        for(ServiceRegistration reg : toCleanup) {
+            reg.unregister();
         }
         
         return sb.toString();
     }
 
-}
+}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilActivateDeactivateTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilActivateDeactivateTest.java
index 60358a4..8c91aac 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilActivateDeactivateTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilActivateDeactivateTest.java
@@ -25,12 +25,12 @@
 
 import java.util.Map;
 
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
 import org.junit.Test;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -84,7 +84,6 @@
         
         assertTrue(MockOsgi.activate(service, bundleContext, map));
         assertTrue(service.isActivated());
-        assertEquals(map, ImmutableMap.copyOf(service.getMap()));
         
         assertTrue(MockOsgi.deactivate(service, bundleContext, map));
         assertFalse(service.isActivated());
@@ -114,25 +113,6 @@
         assertTrue(MockOsgi.deactivate(service, bundleContext, map));
         assertFalse(service.isActivated());
     }
-    
-    @Test
-    public void testService7() {
-        Service7 service = new Service7();
-        
-        assertTrue(MockOsgi.activate(service, bundleContext, map));
-        assertTrue(service.isActivated());
-        assertSame(bundleContext, service.getComponentContext().getBundleContext());
-        assertSame(bundleContext, service.getBundleContext());
-        assertEquals(map, ImmutableMap.copyOf(service.getMap()));
-        
-        assertTrue(MockOsgi.deactivate(service, bundleContext, map));
-        assertFalse(service.isActivated());
-    }
-    
-    
-    public @interface ServiceConfig {
-        String prop1();
-    }
 
     @Component
     public static class Service1 {
@@ -222,12 +202,10 @@
     public static class Service4 {
         
         private boolean activated;
-        private Map<String, Object> map;
 
         @Activate
-        private void activate(ServiceConfig config) {
+        private void activate() {
             this.activated = true;
-            map = ImmutableMap.<String, Object>of("prop1", config.prop1());
         }
 
         @Deactivate
@@ -239,10 +217,6 @@
             return activated;
         }
 
-        public Map<String, Object> getMap() {
-            return map;
-        }
-        
     }
 
     @Component
@@ -308,46 +282,4 @@
 
     }
 
-    @Component
-    public static class Service7 {
-        
-        private boolean activated;
-        private ComponentContext componentContext;
-        private BundleContext bundleContext;
-        private Map<String,Object> map;
-
-        @Activate
-        private void activate(ComponentContext componentContext, ServiceConfig config, BundleContext bundleContext) {
-            this.activated = true;
-            this.componentContext = componentContext;
-            this.bundleContext = bundleContext;
-            this.map = ImmutableMap.<String, Object>of("prop1", config.prop1());;
-        }
-
-        @Deactivate
-        private void deactivate() {
-            this.activated = false;
-            this.componentContext = null;
-            this.bundleContext = null;
-            this.map = null;
-        }
-        
-        public boolean isActivated() {
-            return activated;
-        }
-
-        public ComponentContext getComponentContext() {
-            return componentContext;
-        }
-
-        public BundleContext getBundleContext() {
-            return bundleContext;
-        }
-
-        public Map<String, Object> getMap() {
-            return map;
-        }
-
-    }
-
 }
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
index 1f92fa7..988cf26 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
@@ -31,6 +31,14 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.References;
+import org.apache.felix.scr.annotations.Service;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -42,12 +50,7 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Modified;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -219,37 +222,39 @@
         // no methods
     }
 
-    @Component(service = ServiceInterface1.class,
-            property = Constants.SERVICE_RANKING + ":Integer=100")
+    @Component
+    @Service(ServiceInterface1.class)
+    @Property(name = Constants.SERVICE_RANKING, intValue = 100)
     public static class Service1 implements ServiceInterface1 {
         // dummy interface
     }
 
-    @Component(service = { ServiceInterface2.class, ServiceInterface3.class },
-            property = Constants.SERVICE_RANKING + ":Integer=200")
+    @Component
+    @Service({ ServiceInterface2.class, ServiceInterface3.class })
+    @Property(name = Constants.SERVICE_RANKING, intValue = 200)
     public static class Service2 implements ServiceInterface2, ServiceInterface3 {
         // dummy interface
     }
 
-    @Component(reference = { @Reference(name = "reference2", service = ServiceInterface2.class, cardinality = ReferenceCardinality.AT_LEAST_ONE,
-            bind="bindReference2", unbind="unbindReference2") })
+    @Component
+    @References({ @Reference(name = "reference2", referenceInterface = ServiceInterface2.class, cardinality = ReferenceCardinality.MANDATORY_MULTIPLE) })
     public static class Service3 {
 
-        @Reference(bind="bindReference1", unbind="unbindReference1")
+        @Reference
         private ServiceInterface1 reference1;
-        @Reference(cardinality = ReferenceCardinality.OPTIONAL, bind="bindReference1Optional", unbind="unbindReference1Optional")
+        @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
         private ServiceInterface1Optional reference1Optional;
 
         private List<ServiceReference> references2 = new ArrayList<ServiceReference>();
 
-        @Reference(name = "reference3", service = ServiceInterface3.class, cardinality = ReferenceCardinality.MULTIPLE,
-                bind="bindReference3", unbind="unbindReference3")
+        @Reference(name = "reference3", referenceInterface = ServiceInterface3.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE)
         private List<ServiceSuperInterface3> references3 = new ArrayList<ServiceSuperInterface3>();
         private List<Map<String, Object>> reference3Configs = new ArrayList<Map<String, Object>>();
 
         private ComponentContext componentContext;
         private Map<String, Object> config;
 
+        @SuppressWarnings("unchecked")
         @Activate
         private void activate(ComponentContext ctx) {
             this.componentContext = ctx;
@@ -276,7 +281,7 @@
 
         public List<ServiceInterface2> getReferences2() {
             List<ServiceInterface2> services = new ArrayList<ServiceInterface2>();
-            for (ServiceReference<?> serviceReference : references2) {
+            for (ServiceReference serviceReference : references2) {
                 services.add((ServiceInterface2)componentContext.getBundleContext().getService(serviceReference));
             }
             return services;
@@ -334,86 +339,25 @@
 
     }
 
-    public static class Service3OsgiR6 {
-
-        private ServiceInterface1 reference1;
-        private ServiceInterface1Optional reference1Optional;
-        private List<ServiceReference> references2;
-        private List<ServiceSuperInterface3> references3;
-        private List<ServiceSuperInterface3> references3Filtered;
-
-        private ComponentContext componentContext;
-        private Map<String, Object> config;
-
-        @Activate
-        private void activate(ComponentContext ctx) {
-            this.componentContext = ctx;
-            this.config = MapUtil.toMap(ctx.getProperties());
-        }
-
-        @Deactivate
-        private void deactivate(ComponentContext ctx) {
-            this.componentContext = null;
-        }
-
-        @Modified
-        private void modified(Map<String,Object> newConfig) {
-            this.config = newConfig;
-        }
-
-        public ServiceInterface1 getReference1() {
-            return this.reference1;
-        }
-
-        public ServiceInterface1Optional getReference1Optional() {
-            return this.reference1Optional;
-        }
-
-        public List<ServiceInterface2> getReferences2() {
-            List<ServiceInterface2> services = new ArrayList<ServiceInterface2>();
-            for (ServiceReference<?> serviceReference : references2) {
-                services.add((ServiceInterface2)componentContext.getBundleContext().getService(serviceReference));
-            }
-            return services;
-        }
-
-        public List<ServiceSuperInterface3> getReferences3() {
-            return this.references3;
-        }
-
-        public List<ServiceSuperInterface3> getReferences3Filtered() {
-            return this.references3Filtered;
-        }
-
-        public ComponentContext getComponentContext() {
-            return this.componentContext;
-        }
-
-        public Map<String, Object> getConfig() {
-            return config;
-        }
-
-    }
-
-    @Component(reference = { @Reference(name = "reference2", service = ServiceInterface2.class, cardinality = ReferenceCardinality.AT_LEAST_ONE,
-            bind="bindReference2", unbind="unbindReference2") })
+    @Component
+    @References({ @Reference(name = "reference2", referenceInterface = ServiceInterface2.class, cardinality = ReferenceCardinality.MANDATORY_MULTIPLE) })
     public static class Service3StaticGreedy {
 
-        @Reference(bind="bindReference1", unbind="unbindReference1")
+        @Reference
         private ServiceInterface1 reference1;
-        @Reference(cardinality = ReferenceCardinality.OPTIONAL, bind="bindReference1Optional", unbind="unbindReference1Optional")
+        @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
         private ServiceInterface1Optional reference1Optional;
 
         private List<ServiceReference> references2 = new ArrayList<ServiceReference>();
 
-        @Reference(name = "reference3", service = ServiceInterface3.class, cardinality = ReferenceCardinality.MULTIPLE,
-                bind="bindReference3", unbind="unbindReference3")
+        @Reference(name = "reference3", referenceInterface = ServiceInterface3.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE)
         private List<ServiceSuperInterface3> references3 = new ArrayList<ServiceSuperInterface3>();
         private List<Map<String, Object>> reference3Configs = new ArrayList<Map<String, Object>>();
 
         private ComponentContext componentContext;
         private Map<String, Object> config;
 
+        @SuppressWarnings("unchecked")
         @Activate
         private void activate(ComponentContext ctx) {
             this.componentContext = ctx;
@@ -440,7 +384,7 @@
 
         public List<ServiceInterface2> getReferences2() {
             List<ServiceInterface2> services = new ArrayList<ServiceInterface2>();
-            for (ServiceReference<?> serviceReference : references2) {
+            for (ServiceReference serviceReference : references2) {
                 services.add((ServiceInterface2)componentContext.getBundleContext().getService(serviceReference));
             }
             return services;
@@ -498,7 +442,8 @@
 
     }
 
-    @Component(reference = @Reference(service = ServiceInterface1.class, name = "customName", bind = "customBind", unbind = "customUnbind"))
+    @Component
+    @Reference(referenceInterface = ServiceInterface1.class, name = "customName", bind = "customBind", unbind = "customUnbind")
     public static class Service4 {
 
         private ServiceInterface1 reference1;
@@ -517,7 +462,8 @@
 
     }
 
-    @Component(service = { ServiceInterface5.class })
+    @Component
+    @Service({ ServiceInterface5.class })
     public static class Service5 implements ServiceInterface5 {
 
         @Override
@@ -532,7 +478,8 @@
 
     }
 
-    @Component(service = ServiceFactory1.class, servicefactory = true)
+    @Component
+    @Service(value=ServiceFactory1.class, serviceFactory=true)
     public static class ServiceFactory1 {
         
     }
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java
index 36fd122..ea2e5df 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java
@@ -75,7 +75,7 @@
         Set<String> myService = new HashSet<String>();
         context.registerService(Set.class, myService, props);
 
-        ServiceReference<?> serviceReference = context.bundleContext().getServiceReference(Set.class.getName());
+        ServiceReference serviceReference = context.bundleContext().getServiceReference(Set.class.getName());
         Object serviceResult = context.bundleContext().getService(serviceReference);
         assertSame(myService, serviceResult);
         assertEquals("value1", serviceReference.getProperty("prop1"));
@@ -86,7 +86,7 @@
         Set<String> myService = new HashSet<String>();
         context.registerService(Set.class, myService, "prop1", "value1");
 
-        ServiceReference<?> serviceReference = context.bundleContext().getServiceReference(Set.class.getName());
+        ServiceReference serviceReference = context.bundleContext().getServiceReference(Set.class.getName());
         Object serviceResult = context.bundleContext().getService(serviceReference);
         assertSame(myService, serviceResult);
         assertEquals("value1", serviceReference.getProperty("prop1"));
@@ -101,8 +101,6 @@
         context.registerService(Set.class, myService1);
         Set<String> myService2 = new HashSet<String>();
         context.registerService(Set.class, myService2);
-        
-        assertSame(myService1, context.getService(Set.class));
 
         // expected: ascending order because ordering ascending by service ID
         serviceResults = context.getServices(Set.class, null);
@@ -142,7 +140,7 @@
     public void testRegisterInjectActivateWithPropertyMapNulls() {
         context.registerService(ServiceInterface1.class, mock(ServiceInterface1.class));
         context.registerService(ServiceInterface2.class, mock(ServiceInterface2.class));
-        Map<String,Object> props = new HashMap<>();
+        Map<String,Object> props = new HashMap<String,Object>();
         props.put("prop1", "value3");
         props.put("prop2", null);
         props.put(null, "value4");
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java
index 840e951..f361345 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java
@@ -37,6 +37,7 @@
     private final OsgiContextCallback contextAfterTeardown = mock(OsgiContextCallback.class);
 
     // Run all unit tests for each resource resolver types listed here
+    @SuppressWarnings("unchecked")
     @Rule
     public OsgiContext context = new OsgiContextBuilder()
         .beforeSetUp(contextBeforeSetup)
diff --git a/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest.xml b/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest.xml
index a869506..61b4bc6 100644
--- a/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest.xml
+++ b/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest.xml
@@ -36,7 +36,4 @@
   <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest$Service6" activate="activate" deactivate="deactivate">
     <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest$Service6"/>
   </scr:component>
-  <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest$Service7" activate="activate" deactivate="deactivate">
-    <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilActivateDeactivateTest$Service7"/>
-  </scr:component>
 </components>
diff --git a/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml b/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
index 0229572..bf88df7 100644
--- a/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
+++ b/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
@@ -43,15 +43,6 @@
     <reference name="reference2" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface2" cardinality="1..n" policy="dynamic" bind="bindReference2" unbind="unbindReference2"/>
     <reference name="reference3" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface3" cardinality="0..n" policy="dynamic" bind="bindReference3" unbind="unbindReference3"/>
   </scr:component>
-  <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service3OsgiR6" activate="activate" deactivate="deactivate" modified="modified">
-    <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service3OsgiR6"/>
-    <property name="service.pid" value="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service3OsgiR6"/>
-    <reference name="reference1" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface1" cardinality="1..1" policy="dynamic" field="reference1"/>
-    <reference name="reference1Optional" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface1Optional" cardinality="0..1" policy="dynamic" field="reference1Optional"/>
-    <reference name="reference2" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface2" cardinality="1..n" policy="dynamic" field="references2" field-collection-type="reference"/>
-    <reference name="reference3" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface3" cardinality="0..n" policy="dynamic" field="references3" field-collection-type="service"/>
-    <reference name="references3Filtered" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface3" cardinality="0..n" policy="dynamic" field="references3Filtered" field-collection-type="service" target="(prop1=abc)"/>
-  </scr:component>
   <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service3StaticGreedy" activate="activate" deactivate="deactivate" modified="modified">
     <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service3StaticGreedy"/>
     <property name="service.pid" value="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service3StaticGreedy"/>