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"/>
