SLING-8595 update to bundle-parent 40 (#44)

* update pom, fix package-info.java files

* fix @ConsumerType annotations

* migrate the first large service to use OSGI annotations

* converted more services

* converted more services

* converted more services

* converted more services

* converted more stuff

* converted more stuff

* converted more stuff

* convert servlets

* more conversions

* fixed testing

* version bump

* fix issues pointed out by osgi-ds-metatype-diff

* implement Robert's suggestions, fixed the failing test (hardcoding the locale to english) and increased coverage a tiny bit; also fixed some sonar remarks

* fix previous merging issue

* SLING-8595 - Update parent

* implement PR feedback

* SLING-11255 - Use import rules from old bundle

* SLING-11255 - Fix ds config

Co-authored-by: Christian Schneider <cschneid@adobe.com>
diff --git a/.gitignore b/.gitignore
index 5b783ed..19758c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@
 .DS_Store
 jcr.log
 atlassian-ide-plugin.xml
+.vscode
diff --git a/bnd.bnd b/bnd.bnd
new file mode 100644
index 0000000..141452f
--- /dev/null
+++ b/bnd.bnd
@@ -0,0 +1,8 @@
+Import-Package: \
+    org.apache.http.nio.*;resolution:=optional,\
+    org.apache.http.impl.nio.client.*;resolution:=optional,\
+    org.apache.felix.hc.api;resolution:=optional,\
+    org.apache.sling.event.jobs;version="[1.5.0,3.0)",\
+    org.apache.sling.event.jobs.consumer;version="[1.1,2)",\
+    org.apache.sling.jcr.api;version="2.2.0",\
+    *
diff --git a/pom.xml b/pom.xml
index f072686..4a3bc27 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,16 +24,15 @@
     <!-- ======================================================================= -->
     <parent>
         <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>28</version>
+        <artifactId>sling-bundle-parent</artifactId>
+        <version>47</version>
     </parent>
 
     <!-- ======================================================================= -->
     <!-- P R O J E C T                                                           -->
     <!-- ======================================================================= -->
     <artifactId>org.apache.sling.distribution.core</artifactId>
-    <version>0.5.1-SNAPSHOT</version>
-    <packaging>bundle</packaging>
+    <version>0.6.0-SNAPSHOT</version>
 
     <name>Apache Sling Distribution Core</name>
     <description>
@@ -51,6 +50,7 @@
     <properties>
         <exam.version>4.11.0</exam.version>
         <sling.java.version>8</sling.java.version>
+        <project.build.outputTimestamp>10</project.build.outputTimestamp>
     </properties>
 
     <!-- ======================================================================= -->
@@ -59,42 +59,8 @@
     <build>
         <plugins>
             <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-scr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.sling</groupId>
-                <artifactId>maven-sling-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>org.apache.sling.distribution.core</Bundle-SymbolicName>
-                        <Export-Package>
-                            org.apache.sling.distribution.util,
-                            org.apache.sling.distribution.common,
-                            org.apache.sling.distribution.serialization,
-                            org.apache.sling.distribution.queue.spi,
-                            org.apache.sling.distribution.queue,
-                            org.apache.sling.distribution.log.spi,
-                            org.apache.sling.distribution.agent,
-                            org.apache.sling.distribution.agent.spi,
-                            org.apache.sling.distribution.packaging
-                        </Export-Package>
-                        <Import-Package>
-                            org.apache.http.nio.*;resolution:=optional,
-                            org.apache.http.impl.nio.client.*;resolution:=optional,
-                            org.apache.felix.hc.api;resolution:=optional,
-                            org.apache.sling.event.jobs;version="[1.5.0,3.0)",
-                            org.apache.sling.event.jobs.consumer;version="[1.1,2)",
-                            org.apache.sling.jcr.api;version="2.2.0",
-                            *
-                        </Import-Package>
-                    </instructions>
-                </configuration>
+                <groupId>biz.aQute.bnd</groupId>
+                <artifactId>bnd-maven-plugin</artifactId>
             </plugin>
             <plugin>
                 <artifactId>maven-surefire-plugin</artifactId>
@@ -159,21 +125,39 @@
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.service.cm</artifactId>
-            <version>1.6.0</version>
            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.service.component</artifactId>
-            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.service.event</artifactId>
-            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.annotation.versioning</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.annotation.bundle</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.metatype.annotations</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        
 
         <!-- need it here as to avoid classpath conflicts with testing mock -->
         <dependency>
@@ -214,7 +198,7 @@
         <!-- Sling Mock -->
         <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
+            <artifactId>org.apache.sling.testing.osgi-mock.junit4</artifactId>
             <version>2.4.10</version>
             <scope>test</scope>
         </dependency>
@@ -249,6 +233,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.servlets.annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.scheduler</artifactId>
             <version>2.4.0</version>
         </dependency>
@@ -325,6 +313,7 @@
             <artifactId>httpasyncclient</artifactId>
             <version>4.0.2</version>
             <scope>provided</scope>
+            <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java b/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java
index 4d2fde0..506ee4d 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java
@@ -18,12 +18,12 @@
  */
 package org.apache.sling.distribution.agent.impl;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * Strategy for authorizing requests
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
index 977f652..b849aec 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
@@ -25,22 +25,12 @@
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.jackrabbit.vault.packaging.Packaging;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequestType;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.event.impl.DistributionEventFactory;
 import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
@@ -52,9 +42,9 @@
 import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.apache.sling.distribution.packaging.impl.exporter.LocalDistributionPackageExporter;
 import org.apache.sling.distribution.packaging.impl.importer.RemoteDistributionPackageImporter;
-import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
 import org.apache.sling.distribution.queue.impl.AsyncDeliveryDispatchingStrategy;
 import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
+import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
 import org.apache.sling.distribution.queue.impl.ErrorQueueDispatchingStrategy;
 import org.apache.sling.distribution.queue.impl.MultipleQueueDispatchingStrategy;
 import org.apache.sling.distribution.queue.impl.PriorityQueueDispatchingStrategy;
@@ -69,125 +59,52 @@
 import org.apache.sling.settings.SlingSettingsService;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+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.metatype.annotations.Designate;
+
+
+
 
 /**
  * An OSGi service factory for {@link DistributionAgent}s which references already existing OSGi services.
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Agent - Forward Agents Factory",
-        description = "OSGi configuration factory for forward agents",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property= {"webconsole.configurationFactory.nameHint=Agent name: {name}"}
 )
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
-        policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-        bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Agent name: {name}")
+@Designate(ocd =ForwardDistributionAgentFactoryConfig.class, factory=true)
 public class ForwardDistributionAgentFactory extends AbstractDistributionAgentFactory<ForwardDistributionAgentMBean> {
-
-    @Property(label = "Name", description = "The name of the agent.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "Title", description = "The display friendly title of the agent.")
-    public static final String TITLE = "title";
-
-    @Property(label = "Details", description = "The display friendly details of the agent.")
-    public static final String DETAILS = "details";
-
-
-    @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
-    private static final String ENABLED = "enabled";
-
-    @Property(label = "Service Name", description = "The name of the service used to access the repository. " +
-            "If not set, the calling user ResourceResolver will be used")
-    private static final String SERVICE_NAME = "serviceName";
-
-    @Property(options = {
-            @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
-            @PropertyOption(name = "error", value = "error")},
-            value = "info",
-            label = "Log Level", description = "The log level recorded in the transient log accessible via http."
-    )
-    public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
-    @Property(cardinality = 100, label = "Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
-    private static final String ALLOWED_ROOTS = "allowed.roots";
-
-
-    @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
-    private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
-
-
+    
     /**
-     * endpoints property
+     * Need to keep the constants around so the code below is still working.
      */
-    @Property(cardinality = 100, label = "Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
-            "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
-    private static final String IMPORTER_ENDPOINTS = "packageImporter.endpoints";
-
-
-    @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
-            "These queues will gather all the packages until they are removed explicitly.")
+    private static final String ALLOWED_ROOTS = "allowed.roots";
+    private static final String SERVICE_NAME = "serviceName";
+    private static final Object QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
     private static final String PASSIVE_QUEUES = "passiveQueues";
-
-    @Property(cardinality = 100, label = "Priority queues", description = "List of priority queues that should used for specific paths." +
-            "The selector format is  {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*")
     private static final String PRIORITY_QUEUES = "priorityQueues";
+    private static final String QUEUE_PROVIDER = "queue.provider";
+    private static final String ASYNC_DELIVERY = "async.delivery";
+    private static final String RETRY_STRATEGY = "retry.attempt";
+    private static final String RETRY_ATTEMPTS = "retry.strategy";
+    private static final String IMPORTER_ENDPOINTS = "packageImporter.endpoints";
+    private static final String HTTP = "http.conn.timeout";
 
-    @Property(options = {
-            @PropertyOption(name = "none", value = "none"), @PropertyOption(name = "errorQueue", value = "errorQueue")},
-            value = "none",
-            label = "Retry Strategy", description = "The strategy to apply after a certain number of failed retries."
-    )
-    private static final String RETRY_STRATEGY = "retry.strategy";
-
-    @Property(intValue = 100, label = "Retry attempts", description = "The number of times to retry until the retry strategy is applied.")
-    private static final String RETRY_ATTEMPTS = "retry.attempts";
-
-
-    @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "requestAuthorizationStrategy")
     private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
 
-
-    @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "transportSecretProvider")
-    private
-    DistributionTransportSecretProvider transportSecretProvider;
+    private DistributionTransportSecretProvider transportSecretProvider;
 
-
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
-    @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
-            "e.g. use target=(name=...) to bind to services by name.")
-    public static final String TRIGGERS_TARGET = "triggers.target";
-
-    @Property(options = {
-            @PropertyOption(name = JobHandlingDistributionQueueProvider.TYPE, value = "Sling Jobs"),
-            @PropertyOption(name = ResourceQueueProvider.TYPE, value = "Resource Backed"),
-            @PropertyOption(name = SimpleDistributionQueueProvider.TYPE, value = "In-memory"),
-            @PropertyOption(name = SimpleDistributionQueueProvider.TYPE_CHECKPOINT, value = "In-file")},
-            value = "jobs",
-            label = "Queue provider", description = "The queue provider implementation."
-    )
-    public static final String QUEUE_PROVIDER = "queue.provider";
-
-    @Property(boolValue = false, label = "Async delivery", description = "Whether or not to use a separate delivery queue to maximize transport throughput when queue has more than 100 items")
-    public static final String ASYNC_DELIVERY = "async.delivery";
-
-    /**
-     * timeout for HTTP requests
-     */
-    @Property(label = "HTTP connection timeout", intValue = 10, description = "The connection timeout for HTTP requests (in seconds).")
-    public static final String HTTP = "http.conn.timeout";
-
     @Reference
     private Packaging packaging;
 
@@ -216,11 +133,9 @@
         super(ForwardDistributionAgentMBean.class);
     }
 
-    @Activate
-    protected void activate(BundleContext context, Map<String, Object> config) {
-        super.activate(context, config);
-    }
-
+    @Reference(name = "triggers", service = DistributionTrigger.class,
+            policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+            bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
     protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         super.bindDistributionTrigger(distributionTrigger, config);
     }
@@ -228,6 +143,16 @@
     protected void unbindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         super.unbindDistributionTrigger(distributionTrigger, config);
     }
+    
+    /**
+     * In the first round it's not possible to utilize the signature with the above
+     * config class because of the way the configuration is processed ...
+     * 
+     */
+    @Activate
+    protected void activate(BundleContext context, Map<String, Object> config) {
+        super.activate(context, config);
+    }
 
     @Deactivate
     protected void deactivate(BundleContext context) {
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactoryConfig.java b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactoryConfig.java
new file mode 100644
index 0000000..f6e47da
--- /dev/null
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactoryConfig.java
@@ -0,0 +1,116 @@
+/*
+ * 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.distribution.agent.impl;
+
+import org.apache.sling.distribution.component.impl.SettingsUtils;
+import org.apache.sling.distribution.queue.impl.jobhandling.JobHandlingDistributionQueueProvider;
+import org.apache.sling.distribution.queue.impl.resource.ResourceQueueProvider;
+import org.apache.sling.distribution.queue.impl.simple.SimpleDistributionQueueProvider;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
+
+@ObjectClassDefinition(name="Apache Sling Distribution Agent - Forward Agents Factory",
+        description="OSGi configuration factory for forward agents")
+public @interface ForwardDistributionAgentFactoryConfig {
+    @AttributeDefinition(name = "Name", description = "The name of the agent." )
+    String name() default "";
+    
+    @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+    String title() default "";
+    
+    @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+    String details() default "";
+    
+    @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+    boolean enabled() default true;
+    
+    @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+        "If not set, the calling user ResourceResolver will be used")
+    String serviceName() default "";
+    
+    @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+            options = {
+                    @Option(label="debug", value="debug"),
+                    @Option(label="info", value="info"),
+                    @Option(label="warn", value="warn"),
+                    @Option(label="error", value="error")
+            })
+    String log_level() default "info";
+    
+    @AttributeDefinition(cardinality=100, name="Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
+    String[] allowed_roots();
+    
+    @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+    boolean queue_processing_enabled() default true;
+    
+    // endpoints property
+    @AttributeDefinition(cardinality=100, name="Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
+            "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
+    String[] packageImporter_endpoints();
+    
+    @AttributeDefinition(cardinality=100,name="passive queues", description = "List of queues that should be disabled." +
+            "These queues will gather all the packages until they are removed explicitly.")
+    String[] passiveQueues();
+    
+    @AttributeDefinition(cardinality=100, name="Priority queues", description = "List of priority queues that should used for specific paths." +
+            "The selector format is  {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*")
+    String[] priorityQueues();
+    
+    @AttributeDefinition(name="Retry Strategy", description = "The strategy to apply after a certain number of failed retries.",
+            options= {
+                    @Option(label="none",value="none"),
+                    @Option(label="errorQueue", value="errorQueue")
+            })
+    String retry_strategy() default "none";
+    
+    @AttributeDefinition(name="Retry attemps", description = "The number of times to retry until the retry strategy is applied.")
+    int retry_attempts() default 100;
+    
+    @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+        "e.g. use target=(name=...) to bind to services by name.")
+    String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+    
+    @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+        "e.g. use target=(name=...) to bind to services by name.")
+    String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+    
+    @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+        "e.g. use target=(name=...) to bind to services by name.")
+    String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+    
+    @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+        "e.g. use target=(name=...) to bind to services by name.")
+    String triggers_target() default ForwardDistributionAgentFactory.DEFAULT_TRIGGER_TARGET;
+    
+    @AttributeDefinition(name="Queue provider", description="he queue provider implementation.",
+            options = {
+                    @Option(label=JobHandlingDistributionQueueProvider.TYPE, value="jobs"),
+                    @Option(label=ResourceQueueProvider.TYPE, value="Resource Backed"),
+                    @Option(label=SimpleDistributionQueueProvider.TYPE, value="In-memory"),
+                    @Option(label=SimpleDistributionQueueProvider.TYPE_CHECKPOINT,value="In-file")
+            })
+    String queue_provider() default "jobs";
+    
+    @AttributeDefinition(name="Async delivery", description = "Whether or not to use a separate delivery queue to maximize transport throughput when queue has more than 100 items" )
+    boolean async_delivery() default false;
+    
+    @AttributeDefinition(name="HTTP connection timeout", description = "The connection timeout for HTTP requests (in seconds).")
+    int http_conn_timeout() default 10;
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
index fc93ce7..478a8cc 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
@@ -18,69 +18,58 @@
  */
 package org.apache.sling.distribution.agent.impl;
 
-import java.util.Map;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.DistributionRequest;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.common.DistributionException;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * OSGi configuration factory for {@link PrivilegeDistributionRequestAuthorizationStrategy}
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Request Authorization - Privilege Request Authorization Strategy",
-        description = "OSGi configuration for request based authorization strategy based on privileges",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE,
-        immediate = true
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionRequestAuthorizationStrategy.class,
+        immediate = true,
+        property = {
+                "webconsole.configurationFactory.nameHint=Strategy name: {name}"
+        }
 )
-@Service(DistributionRequestAuthorizationStrategy.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Strategy name: {name}")
+@Designate(ocd = PrivilegeDistributionRequestAuthorizationStrategyFactory.Config.class, factory = true)
 public class PrivilegeDistributionRequestAuthorizationStrategyFactory implements DistributionRequestAuthorizationStrategy {
-
-    /**
-     * name of this strategy.
-     */
-    @Property(label = "Name")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * privilege request authorization strategy jcr privilege property
-     */
-    @Property(label = "Jcr Privilege", description = "Jcr privilege to check for authorizing distribution requests. The privilege is checked for the calling user session.")
-    private static final String JCR_PRIVILEGE = "jcrPrivilege";
-
-    /**
-     * privilege ADD request authorization strategy jcr privilege property
-     */
-    @Property(cardinality = 100, label = "Additional Jcr Privileges for Add", description = "Additional Jcr privileges to check for authorizing ADD distribution requests. " +
-            "The privilege is checked for the calling user session.", value = "jcr:read")
-    private static final String JCR_ADD_PRIVILEGES = "additionalJcrPrivilegesForAdd";
-
-    /**
-     * privilege DELETE request authorization strategy jcr privilege property
-     */
-    @Property(cardinality = 100, label = "Additional Jcr Privileges for Delete", description = "Additional Jcr privileges to check for authorizing DELETE distribution requests. " +
-             "The privilege is checked for the calling user session.", value = "jcr:removeNode")
-    private static final String JCR_DELETE_PRIVILEGES = "additionalJcrPrivilegesForDelete";
+    
+    @ObjectClassDefinition(name = "Apache Sling Distribution Request Authorization - Privilege Request Authorization Strategy",
+            description = "OSGi configuration for request based authorization strategy based on privileges")
+    public @interface Config {
+        
+        @AttributeDefinition(name="name")
+        String name() default "";
+        
+        @AttributeDefinition(name="Jcr Privilege", description = "Jcr privilege to check for authorizing distribution requests. The privilege is checked for the calling user session.")
+        String jcrPrivilege() default "";
+        
+        @AttributeDefinition(cardinality = 100, name="Additional Jcr Privileges for Add",description = "Additional Jcr privileges to check for authorizing ADD distribution requests. " +
+            "The privilege is checked for the calling user session.")
+        String[] additionalJcrPrivilegesForAdd() default "jcr:read";
+        
+        @AttributeDefinition(cardinality = 100, name="Additional Jcr Privileges for Delete", description = "Additional Jcr privileges to check for authorizing ADD distribution requests. " +
+            "The privilege is checked for the calling user session.")
+        String[] additionalJcrPrivilegesForDelete() default "jcr:removeNode";
+    }
 
     private DistributionRequestAuthorizationStrategy authorizationStrategy;
 
     @Activate
-    public void activate(BundleContext context, Map<String, Object> config) {
-        String jcrPrivilege = PropertiesUtil.toString(config.get(JCR_PRIVILEGE), null);
-        String[] jcrAddPrivileges = PropertiesUtil.toStringArray(config.get(JCR_ADD_PRIVILEGES));
-        String[] jcrDeletePrivileges = PropertiesUtil.toStringArray(config.get(JCR_DELETE_PRIVILEGES));
+    public void activate(BundleContext context, Config conf) {
+        String jcrPrivilege = conf.jcrPrivilege();
+        String[] jcrAddPrivileges = conf.additionalJcrPrivilegesForAdd();
+        String[] jcrDeletePrivileges = conf.additionalJcrPrivilegesForDelete();
         authorizationStrategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, jcrAddPrivileges, jcrDeletePrivileges);
     }
 
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
index bd15e63..5a41cd1 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
@@ -20,15 +20,7 @@
 
 import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
+
 import org.apache.jackrabbit.vault.packaging.Packaging;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -53,6 +45,17 @@
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.settings.SlingSettingsService;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+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.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 
 /**
  * An OSGi service factory for "queuing agents" that queue resources from the local instance (and can be eventually
@@ -60,76 +63,84 @@
  *
  * @see {@link DistributionAgent}
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Agent - Queue Agents Factory",
-        description = "OSGi configuration factory for queueing agents",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
-)
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
-        policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-        bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name="webconsole.configurationFactory.nameHint", value="Agent name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property = {
+             "webconsole.configurationFactory.nameHint=Agent name: {name}"   
+        })
+@Designate(ocd = QueueDistributionAgentFactory.Config.class,factory = true)
 public class QueueDistributionAgentFactory extends AbstractDistributionAgentFactory<QueueDistributionAgentMBean> {
 
-    @Property(label = "Name", description = "The name of the agent.")
+    @ObjectClassDefinition(name = "Apache Sling Distribution Agent - Queue Agents Factory",
+            description = "OSGi configuration factory for queueing agents")
+    public @interface Config {
+        @AttributeDefinition(name = "Name",description = "The name of the agent.")
+        String name() default "";
+        
+        @AttributeDefinition(name="Title", description = "The display friendly title of the agent.")
+        String title() default "";
+        
+        @AttributeDefinition(name="Details", description = "The display friendly details of the agent.")
+        String details() default "";
+        
+        @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+        boolean enabled() default true;
+        
+        @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+            "If not set, the calling user ResourceResolver will be used" )
+        String serviceName() default "";
+        
+        @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+                options = {
+                        @Option(label="debug", value="debug"),
+                        @Option(label="info", value="info"),
+                        @Option(label="warn", value="warn"),
+                        @Option(label="error", value="error")
+                })
+        String log_level() default "info";
+
+        @AttributeDefinition(cardinality=100, name="Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
+        String[] allowed_roots();
+        
+        @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Queue Provider Factory", description = "The target reference for the DistributionQueueProviderFactory used to build queues," +
+            "e.g. use target=(name=...) to bind to services by name.")
+        String queueProviderFactory_target() default "(name=jobQueue)";
+        
+        @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
+            "e.g. use target=(name=...) to bind to services by name.")
+        String triggers_target() default DEFAULT_TRIGGER_TARGET;
+        
+        @AttributeDefinition(cardinality = 100, name="Priority queues", description = "List of priority queues that should used for specific paths." +
+            "The selector format is  {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*" )
+        String[] priorityQueues();
+    }
+    
     public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "Title", description = "The display friendly title of the agent.")
     public static final String TITLE = "title";
-
-    @Property(label = "Details", description = "The display friendly details of the agent.")
     public static final String DETAILS = "details";
-
-
-    @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
-    private static final String ENABLED = "enabled";
-
-
-    @Property(label = "Service Name", description = "The name of the service used to access the repository. " +
-            "If not set, the calling user ResourceResolver will be used")
     private static final String SERVICE_NAME = "serviceName";
-
-    @Property(options = {
-            @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
-            @PropertyOption(name = "error", value = "error")},
-            value = "info",
-            label = "Log Level", description = "The log level recorded in the transient log accessible via http."
-    )
     public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
-    @Property(cardinality = 100, label = "Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
     private static final String ALLOWED_ROOTS = "allowed.roots";
+    public static final String TRIGGERS_TARGET = "triggers.target";
+    private static final String PRIORITY_QUEUES = "priorityQueues";
 
-
-    @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "requestAuthorizationStrategy")
     private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
 
-
-    @Property(name = "queueProviderFactory.target", label = "Queue Provider Factory", description = "The target reference for the DistributionQueueProviderFactory used to build queues," +
-            "e.g. use target=(name=...) to bind to services by name.", value = "(name=jobQueue)")
     @Reference(name = "queueProviderFactory")
     private DistributionQueueProviderFactory queueProviderFactory;
 
-
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
-    @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
-            "e.g. use target=(name=...) to bind to services by name.")
-    public static final String TRIGGERS_TARGET = "triggers.target";
-
-    @Property(cardinality = 100, label = "Priority queues", description = "List of priority queues that should used for specific paths." +
-            "The selector format is  {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*")
-    private static final String PRIORITY_QUEUES = "priorityQueues";
-
-
     @Reference
     private Packaging packaging;
 
@@ -156,6 +167,9 @@
         super.activate(context, config);
     }
 
+    @Reference(name = "triggers",
+            policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+            bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
     protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         super.bindDistributionTrigger(distributionTrigger, config);
 
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
index 49db09c..7fb0df8 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
@@ -22,15 +22,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.jackrabbit.vault.packaging.Packaging;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -59,90 +50,107 @@
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.settings.SlingSettingsService;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+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.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 
 /**
  * An OSGi service factory for "reverse agents" that pull resources from remote instances (e.g. from "queueing agents").
  *
  * @see {@link DistributionAgent}
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Agent - Reverse Agents Factory",
-        description = "OSGi configuration factory for reverse agents",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property = {
+             "webconsole.configurationFactory.nameHint=Agent name: {name}"   
+        }
 )
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
-        policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-        bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name="webconsole.configurationFactory.nameHint", value="Agent name: {name}")
+@Designate(ocd = ReverseDistributionAgentFactory.Config.class, factory = true)
 public class ReverseDistributionAgentFactory extends AbstractDistributionAgentFactory<ReverseDistributionAgentMBean> {
+    
+    @ObjectClassDefinition(name = "Apache Sling Distribution Agent - Reverse Agents Factory", 
+            description = "OSGi configuration factory for reverse agents")
+    public @interface Config {
+        @AttributeDefinition(name = "Name", description = "The name of the agent." )
+        String name() default "";
+        @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+        String title() default "";
+        @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+        String details() default "";
+        @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+        boolean enabled() default true;
+        
+        @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+                "If not set, the calling user ResourceResolver will be used" )
+        String serviceName() default "";
+            
+        @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+                options = {
+                        @Option(label="debug", value="debug"),
+                        @Option(label="info", value="info"),
+                        @Option(label="warn", value="warn"),
+                        @Option(label="error", value="error")
+        })
+        String log_level() default "info";
+        
+        @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+        boolean queue_processing_enabled() default true;
+        
+        @AttributeDefinition(cardinality=100, name="Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
+                "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
+        String[] packageExporter_endpoints();
+        
+        @AttributeDefinition(name="Pull Items", description = "Number of subsequent pull requests to make.")
+        int pull_items() default 100;
+        
+        @AttributeDefinition(name="HTTP connection timeout", description = "The connection timeout for HTTP requests (in seconds).")
+        int http_conn_timeout() default 10;
+        
+        @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String triggers_target() default DEFAULT_TRIGGER_TARGET;
+        
+    }
 
-    @Property(label = "Name", description = "The name of the agent.")
     public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "Title", description = "The display friendly title of the agent.")
     public static final String TITLE = "title";
-
-    @Property(label = "Details", description = "The display friendly details of the agent.")
     public static final String DETAILS = "details";
-
-    @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
-    private static final String ENABLED = "enabled";
-
-
-    @Property(label = "Service Name", description = "The name of the service used to access the repository.")
     private static final String SERVICE_NAME = "serviceName";
-
-    @Property(options = {
-            @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
-            @PropertyOption(name = "error", value = "error")},
-            value = "info",
-            label = "Log Level", description = "The log level recorded in the transient log accessible via http."
-    )
-    public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
-    @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
     private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
-
-    /**
-     * endpoints property
-     */
-    @Property(cardinality = 100, label = "Importer Endpoints", description = "List of endpoints from which packages are received (exported).")
     private static final String EXPORTER_ENDPOINTS = "packageExporter.endpoints";
-
-    /**
-     * no. of items to poll property
-     */
-    @Property(intValue = 100, label = "Pull Items", description = "Number of subsequent pull requests to make.")
     private static final String PULL_ITEMS = "pull.items";
-
-    /**
-     * timeout for HTTP requests
-     */
-    @Property(label = "HTTP connection timeout", intValue = 10, description = "The connection timeout for HTTP requests (in seconds).")
     public static final String HTTP = "http.conn.timeout";
+    public static final String TRIGGERS_TARGET = "triggers.target";
 
-    @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "requestAuthorizationStrategy")
     private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
 
-    @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "transportSecretProvider")
     private DistributionTransportSecretProvider transportSecretProvider;
 
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
-    @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
-            "e.g. use target=(name=...) to bind to services by name.")
-    public static final String TRIGGERS_TARGET = "triggers.target";
-
     @Reference
     private Packaging packaging;
 
@@ -170,6 +178,9 @@
         super.activate(context, config);
     }
 
+    @Reference(name = "triggers",
+            policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+            bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
     protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         super.bindDistributionTrigger(distributionTrigger, config);
 
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
index b58f0b7..f23c8bb 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
@@ -22,15 +22,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
@@ -51,73 +42,92 @@
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.settings.SlingSettingsService;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+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.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 
 /**
  * An OSGi service factory for {@link DistributionAgent}s which references already existing OSGi services.
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Agent - Simple Agents Factory",
-        description = "OSGi configuration factory for agents",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property = {
+                "webconsole.configurationFactory.nameHint=Agent name: {name}"
+        }
 )
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
-        policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-        bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name="webconsole.configurationFactory.nameHint", value="Agent name: {name}")
+
+@Designate(ocd=SimpleDistributionAgentFactory.Config.class, factory = true)
 public class SimpleDistributionAgentFactory extends AbstractDistributionAgentFactory<SimpleDistributionAgentMBean> {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Agent - Simple Agents Factory",
+            description = "OSGi configuration factory for agents")
+    public @interface Config {
+        @AttributeDefinition(name = "Name", description = "The name of the agent." )
+        String name() default "";
+        @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+        String title() default "";
+        @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+        String details() default "";
+        @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+        boolean enabled() default true;
+        
+        @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+                "If not set, the calling user ResourceResolver will be used" )
+        String serviceName() default "";
+        
+        @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+                options = {
+                        @Option(label="debug", value="debug"),
+                        @Option(label="info", value="info"),
+                        @Option(label="warn", value="warn"),
+                        @Option(label="error", value="error")
+        })
+        String log_level() default "info";
+        
+        @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+        boolean queue_processing_enabled() default true;
+        
+        @AttributeDefinition(name="Exporter", description="The target reference for the DistributionPackageExporter used to receive (export) the distribution packages,\" +\n"
+                + "            \"e.g. use target=(name=...) to bind to services by name.")
+        String packageExporter_target();
+        
+        @AttributeDefinition(name="Importer", description = "The target reference for the DistributionPackageImporter used to send (import) the distribution packages," +
+            "e.g. use target=(name=...) to bind to services by name.")
+        String packageImporter_target();
+        
+        @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String requestAuthorizationStrategy_target();
+        
+        @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String triggers_target() default DEFAULT_TRIGGER_TARGET;
+    }
 
-    @Property(label = "Name", description = "The name of the agent.")
     public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "Title", description = "The display friendly title of the agent.")
     public static final String TITLE = "title";
-
-    @Property(label = "Details", description = "The display friendly details of the agent.")
     public static final String DETAILS = "details";
-
-
-    @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
-    private static final String ENABLED = "enabled";
-
-
-    @Property(label = "Service Name", description = "The name of the service used to access the repository.")
     private static final String SERVICE_NAME = "serviceName";
-
-    @Property(options = {
-            @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
-            @PropertyOption(name = "error", value = "error")},
-            value = "info",
-            label = "Log Level", description = "The log level recorded in the transient log accessible via http."
-    )
-    public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
-    @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
     private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
 
 
-    @Property(name = "packageExporter.target", label = "Exporter", description = "The target reference for the DistributionPackageExporter used to receive (export) the distribution packages," +
-            "e.g. use target=(name=...) to bind to services by name.")
     @Reference(name = "packageExporter")
     private DistributionPackageExporter packageExporter;
 
-
-    @Property(name = "packageImporter.target", label = "Importer", description = "The target reference for the DistributionPackageImporter used to send (import) the distribution packages," +
-            "e.g. use target=(name=...) to bind to services by name.")
     @Reference(name = "packageImporter")
     private DistributionPackageImporter packageImporter;
 
-
-    @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
-            "e.g. use target=(name=...) to bind to services by name.")
     @Reference(name = "requestAuthorizationStrategy")
     private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
 
-
-    @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
-            "e.g. use target=(name=...) to bind to services by name.")
     public static final String TRIGGERS_TARGET = "triggers.target";
 
 
@@ -145,6 +155,9 @@
         super.activate(context, config);
     }
 
+    @Reference(name = "triggers",
+            policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+            bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
     protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         super.bindDistributionTrigger(distributionTrigger, config);
 
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
index 1aa283c..3ebf6e2 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.distribution.agent.impl;
 
-import org.apache.felix.scr.annotations.*;
 import org.apache.jackrabbit.vault.packaging.Packaging;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -48,6 +47,17 @@
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.settings.SlingSettingsService;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+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.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 
 import java.util.*;
 
@@ -56,110 +66,116 @@
  *
  * @see {@link DistributionAgent}
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Agent - Sync Agents Factory",
-        description = "OSGi configuration factory for syncing agents",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property = {
+                "webconsole.configurationFactory.nameHint=Agent name: {name}"
+        }
 )
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
-        policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-        bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Agent name: {name}")
+@Designate(ocd=SyncDistributionAgentFactory.Config.class, factory = true)
 public class SyncDistributionAgentFactory extends AbstractDistributionAgentFactory<SyncDistributionAgentMBean> {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Agent - Sync Agents Factory",
+            description = "OSGi configuration factory for syncing agents")
+    public @interface Config {
+        @AttributeDefinition(name = "Name", description = "The name of the agent." )
+        String name() default "";
+        @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+        String title() default "";
+        @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+        String details() default "";
+        @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+        boolean enabled() default true;
+        
+        @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+                "If not set, the calling user ResourceResolver will be used" )
+        String serviceName() default "";
+            
+        @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+                options = {
+                        @Option(label="debug", value="debug"),
+                        @Option(label="info", value="info"),
+                        @Option(label="warn", value="warn"),
+                        @Option(label="error", value="error")
+        })
+        String log_level() default "info";
+        
+        @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+        boolean queue_processing_enabled() default true;
+        
 
-    @Property(label = "Name", description = "The name of the agent.")
+        
+        @AttributeDefinition(cardinality=100,name="passive queues", description = "List of queues that should be disabled." +
+                "These queues will gather all the packages until they are removed explicitly.")
+        String[] passiveQueues();
+        
+        @AttributeDefinition(cardinality=100, name="Exporter Endpoints", description = "List of endpoints to which packages are sent (imported). " +
+                "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
+        String[] packageExporter_endpoints();
+        
+        @AttributeDefinition(cardinality=100, name="Importer Endpoints", description = "List of endpoints from which packages are received (exported)")
+        String[] packageImporter_endpoints();
+        
+        @AttributeDefinition(name="Retry Strategy", description = "The strategy to apply after a certain number of failed retries.",
+                options= {
+                        @Option(label="none",value="none"),
+                        @Option(label="errorQueue", value="errorQueue")
+                })
+        String retry_strategy() default "none";
+        
+        @AttributeDefinition(name="Retry attempts", description = "The number of times to retry until the retry strategy is applied.")
+        int retry_attempts() default 100;
+        
+        @AttributeDefinition(name="Pull items", description = "Number of subsequent pull requests to make.")
+        int pull_items() default 100;
+        
+        @AttributeDefinition(name="HTTP connection timeout", description = "The connection timeout for HTTP requests (in seconds).")
+        int http_conn_timeout() default 10;
+        
+        @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String triggers_target() default DEFAULT_TRIGGER_TARGET;
+    }
+
     public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "Title", description = "The display friendly title of the agent.")
     public static final String TITLE = "title";
-
-    @Property(label = "Details", description = "The display friendly details of the agent.")
     public static final String DETAILS = "details";
-
-    @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
-    private static final String ENABLED = "enabled";
-
-
-    @Property(label = "Service Name", description = "The name of the service used to access the repository. " +
-            "If not set, the calling user ResourceResolver will be used")
     private static final String SERVICE_NAME = "serviceName";
-
-    @Property(options = {
-            @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
-            @PropertyOption(name = "error", value = "error")},
-            value = "info",
-            label = "Log Level", description = "The log level recorded in the transient log accessible via http."
-    )
-    public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
-    @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
     private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
-
-    @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
-            "These queues will gather all the packages until they are removed explicitly.")
-    private static final String PASSIVE_QUEUES = "passiveQueues";
-
-    /**
-     * endpoints property
-     */
-    @Property(cardinality = 100, label = "Exporter Endpoints", description = "List of endpoints from which packages are received (exported)")
     private static final String EXPORTER_ENDPOINTS = "packageExporter.endpoints";
-
-    /**
-     * endpoints property
-     */
-    @Property(cardinality = 100, label = "Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
-            "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
     private static final String IMPORTER_ENDPOINTS = "packageImporter.endpoints";
-
-    @Property(options = {
-            @PropertyOption(name = "none", value = "none"), @PropertyOption(name = "errorQueue", value = "errorQueue")},
-            value = "none",
-            label = "Retry Strategy", description = "The strategy to apply after a certain number of failed retries."
-    )
-    private static final String RETRY_STRATEGY = "retry.strategy";
-
-    @Property(intValue = 100, label = "Retry attempts", description = "The number of times to retry until the retry strategy is applied.")
-    private static final String RETRY_ATTEMPTS = "retry.attempts";
-
-    /**
-     * no. of items to poll property
-     */
-    @Property(intValue = 100, label = "Pull Items", description = "Number of subsequent pull requests to make.")
     private static final String PULL_ITEMS = "pull.items";
-
-    /**
-     * timeout for HTTP requests
-     */
-    @Property(label = "HTTP connection timeout", intValue = 10, description = "The connection timeout for HTTP requests (in seconds).")
     public static final String HTTP = "http.conn.timeout";
+    public static final String TRIGGERS_TARGET = "triggers.target";
+    public static final String RETRY_ATTEMPTS = "retry.attempts";
+    public static final String RETRY_STRATEGY = "retry.strategy";
+    public static final String PASSIVE_QUEUES = "passiveQueues";
+
 
     @Reference
     private Packaging packaging;
 
-    @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "requestAuthorizationStrategy")
     private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
 
-
-    @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "transportSecretProvider")
     private DistributionTransportSecretProvider transportSecretProvider;
 
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
-    @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
-            "e.g. use target=(name=...) to bind to services by name.")
-    public static final String TRIGGERS_TARGET = "triggers.target";
-
     @Reference
     private DistributionEventFactory distributionEventFactory;
 
@@ -184,6 +200,9 @@
         super.activate(context, config);
     }
 
+    @Reference(name = "triggers",
+            policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+            bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
     protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         super.bindDistributionTrigger(distributionTrigger, config);
 
diff --git a/src/main/java/org/apache/sling/distribution/agent/package-info.java b/src/main/java/org/apache/sling/distribution/agent/package-info.java
index 59b30d6..035ab12 100644
--- a/src/main/java/org/apache/sling/distribution/agent/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/agent/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.0.0")
 package org.apache.sling.distribution.agent;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java b/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java
index a27ee05..6c23fa6 100644
--- a/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java
+++ b/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.distribution.agent.spi;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.DistributionResponse;
@@ -28,6 +27,7 @@
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * A distribution agent is responsible for handling {@link org.apache.sling.distribution.DistributionRequest}s.
diff --git a/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java b/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java
index dfd1253..3372ce4 100644
--- a/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.0.1")
 package org.apache.sling.distribution.agent.spi;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/common/package-info.java b/src/main/java/org/apache/sling/distribution/common/package-info.java
index 3101fcc..205b866 100644
--- a/src/main/java/org/apache/sling/distribution/common/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/common/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.1.0")
 package org.apache.sling.distribution.common;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
index 05e92f0..000a22e 100644
--- a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
+++ b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
@@ -23,13 +23,6 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.felix.scr.annotations.Component;
-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.ReferencePolicy;
-import org.apache.felix.scr.annotations.References;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.agent.impl.DistributionRequestAuthorizationStrategy;
@@ -40,24 +33,17 @@
 import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
 import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
 
 /**
  * {@link DistributionComponentProvider} OSGi service.
  */
-@Component
-@Property(name = "name", value = "default")
-@References({
-        @Reference(name = "distributionAgent", referenceInterface = DistributionAgent.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionPackageImporter", referenceInterface = DistributionPackageImporter.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionPackageExporter", referenceInterface = DistributionPackageExporter.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionQueueProvider", referenceInterface = DistributionQueueProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionQueueDistributionStrategy", referenceInterface = DistributionQueueDispatchingStrategy.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionTransportSecretProvider", referenceInterface = DistributionTransportSecretProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionTrigger", referenceInterface = DistributionTrigger.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionRequestAuthorizationStrategy", referenceInterface = DistributionRequestAuthorizationStrategy.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
-        @Reference(name = "distributionPackageBuilder", referenceInterface = DistributionPackageBuilder.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+@Component ( property = {
+        "name=default"
 })
-@Service(DistributionComponentProvider.class)
 public class DefaultDistributionComponentProvider implements DistributionComponentProvider {
 
     private static final String NAME = DistributionComponentConstants.PN_NAME;
@@ -133,6 +119,9 @@
 
     // (un)binding methods
 
+    @Reference(name = "distributionQueueProvider",  
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionQueueProvider(DistributionQueueProvider distributionQueueProvider, Map<String, Object> config) {
         put(DistributionQueueProvider.class, distributionQueueProvider, config);
     }
@@ -141,6 +130,9 @@
         remove(DistributionQueueProvider.class, distributionQueueProvider, config);
     }
 
+    @Reference(name = "distributionQueueDistributionStrategy", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionQueueDistributionStrategy(DistributionQueueDispatchingStrategy distributionQueueDispatchingStrategy, Map<String, Object> config) {
         put(DistributionQueueDispatchingStrategy.class, distributionQueueDispatchingStrategy, config);
     }
@@ -149,6 +141,9 @@
         remove(DistributionQueueDispatchingStrategy.class, distributionQueueDispatchingStrategy, config);
     }
 
+    @Reference(name = "distributionTransportSecretProvider",  
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionTransportSecretProvider(DistributionTransportSecretProvider distributionTransportSecretProvider, Map<String, Object> config) {
         put(DistributionTransportSecretProvider.class, distributionTransportSecretProvider, config);
     }
@@ -157,6 +152,9 @@
         remove(DistributionTransportSecretProvider.class, distributionTransportSecretProvider, config);
     }
 
+    @Reference(name = "distributionPackageImporter", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionPackageImporter(DistributionPackageImporter distributionPackageImporter, Map<String, Object> config) {
         put(DistributionPackageImporter.class, distributionPackageImporter, config);
     }
@@ -165,6 +163,9 @@
         remove(DistributionPackageImporter.class, distributionPackageImporter, config);
     }
 
+    @Reference(name = "distributionPackageExporter", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionPackageExporter(DistributionPackageExporter distributionPackageExporter, Map<String, Object> config) {
         put(DistributionPackageExporter.class, distributionPackageExporter, config);
     }
@@ -173,6 +174,9 @@
         remove(DistributionPackageExporter.class, distributionPackageExporter, config);
     }
 
+    @Reference(name = "distributionAgent", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionAgent(DistributionAgent distributionAgent, Map<String, Object> config) {
         put(DistributionAgent.class, distributionAgent, config);
     }
@@ -181,6 +185,9 @@
         remove(DistributionAgent.class, distributionAgent, config);
     }
 
+    @Reference(name = "distributionPackageBuilder", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionPackageBuilder(DistributionPackageBuilder distributionPackageBuilder, Map<String, Object> config) {
         put(DistributionPackageBuilder.class, distributionPackageBuilder, config);
     }
@@ -189,6 +196,9 @@
         remove(DistributionPackageBuilder.class, distributionPackageBuilder, config);
     }
 
+    @Reference(name = "distributionTrigger", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
         put(DistributionTrigger.class, distributionTrigger, config);
     }
@@ -197,6 +207,9 @@
         remove(DistributionTrigger.class, distributionTrigger, config);
     }
 
+    @Reference(name = "distributionRequestAuthorizationStrategy", 
+            cardinality = ReferenceCardinality.MULTIPLE, 
+            policy = ReferencePolicy.DYNAMIC)
     public void bindDistributionRequestAuthorizationStrategy(DistributionRequestAuthorizationStrategy distributionRequestAuthorizationStrategy, Map<String, Object> config) {
         put(DistributionRequestAuthorizationStrategy.class, distributionRequestAuthorizationStrategy, config);
     }
diff --git a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java
index 6c2538b..54b0d0b 100644
--- a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java
+++ b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java
@@ -24,16 +24,17 @@
 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.Service;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.osgi.service.cm.ConfigurationAdmin;
 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.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,24 +43,27 @@
  * For each tree of properties a set of OSGI configs is generated and registered in ConfigurationAdmin.
  * To delete a component all configs owned by that component will be unregistered from ConfigurationAdmin.
  */
-@Component
-@Service(DistributionConfigurationManager.class)
+@Component(service=DistributionConfigurationManager.class)
+@Designate(ocd=DefaultDistributionConfigurationManager.Config.class)
 public class DefaultDistributionConfigurationManager implements DistributionConfigurationManager {
-
-    @Property(label = "Resource Config Enabled", description = "If storing config in resource tree is enabled.", boolValue = false)
-    public static final String CONFIG_ENABLED = "resource.config.enabled";
-
-    @Property(label = "Resource Config Prefix", description = "The prefix of properties to be stored in content", value = "etc.")
-    public static final String CONFIG_PREFIX = "resource.config.prefix";
-
-    @Property(label = "Resource Config Root", description = "The resource config root", value = "/etc/distribution")
-    public static final String CONFIG_ROOT = "resource.config.root";
-
-    @Property(label = "Resource Config Properties", description = "The resource config properties", value = {"enabled"})
-    public static final String CONFIG_PROPERTIES = "resource.config.properties";
-
-    @Property(label = "Resource Config Defaults", description = "The default values for resource config properties", value = {"serializationType=distribution"})
-    public static final String CONFIG_DEFAULTS = "resource.config.defaults";
+    
+    @ObjectClassDefinition()
+    public @interface Config {
+        @AttributeDefinition(name="Resource Config enabled",description = "If storing config in resource tree is enabled.")
+        boolean resource_config_enabled() default false;
+        
+        @AttributeDefinition(name="Resource Config prefix",description = "The prefix of properties to be stored in content")
+        String resourceConfigPrefix() default "etc.";
+        
+        @AttributeDefinition(name="Resource Config Root", description = "The resource config root")
+        String resourceConfigRoot() default "/etc/distribution";
+        
+        @AttributeDefinition(name="Resource Config Properties", description = "The resource config properties")
+        String[] resourceConfigProperties() default {"enabled"};
+        
+        @AttributeDefinition(name="Resource Config Defaults", description = "The default values for resource config properties")
+        String[] resourceConfigDefaults() default {"serializationType=distribution"};
+    }
 
     @Reference
     ConfigurationAdmin configurationAdmin;
@@ -70,22 +74,22 @@
     private DistributionConfigurationManager osgiManager;
     private DistributionConfigurationManager resourceManager;
 
-    static String resourcePrefix;
+    private String resourcePrefix;
     static final String OSGI_PREFIX = "";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     @Activate
-    void activate(ComponentContext ctx, Map<String, Object> properties) {
-        boolean configEnabled = PropertiesUtil.toBoolean(properties.get(CONFIG_ENABLED), false);
+    void activate(ComponentContext ctx, Config conf) {
+        boolean configEnabled = conf.resource_config_enabled();
 
-        String configRoot = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(properties.get(CONFIG_ROOT), null));
-        resourcePrefix = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(properties.get(CONFIG_PREFIX), null));
+        String configRoot = SettingsUtils.removeEmptyEntry(conf.resourceConfigRoot());
+        resourcePrefix = SettingsUtils.removeEmptyEntry(conf.resourceConfigPrefix());
 
-        String[] configProperties = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(properties.get(CONFIG_PROPERTIES), null));
+        String[] configProperties = SettingsUtils.removeEmptyEntries(conf.resourceConfigProperties());
 
         if (configEnabled && configRoot != null && configProperties != null) {
-            Map<String, String> configDefaults = PropertiesUtil.toMap(properties.get(CONFIG_DEFAULTS), new String[0]);
+            Map<String, String> configDefaults = PropertiesUtil.toMap(conf.resourceConfigDefaults(), new String[0]);
 
             resourceManager = new ResourceConfigurationManager(configRoot, configProperties, configDefaults);
         }
diff --git a/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java b/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java
index dfe2f53..7116d46 100644
--- a/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java
+++ b/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java
@@ -19,16 +19,22 @@
 package org.apache.sling.distribution.component.impl;
 
 
+import static java.lang.String.format;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.AGENT;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.EXPORTER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.IMPORTER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.PACKAGE_BUILDER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.QUEUE_PROVIDER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.QUEUE_STRATEGY;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.REQUEST_AUTHORIZATION;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.TRANSPORT_SECRET_PROVIDER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.TRIGGER;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 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.Property;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory;
 import org.apache.sling.distribution.agent.impl.PrivilegeDistributionRequestAuthorizationStrategy;
 import org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory;
@@ -49,16 +55,51 @@
 import org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static java.lang.String.format;
-import static org.apache.sling.commons.osgi.PropertiesUtil.*;
-import static org.apache.sling.distribution.component.impl.DistributionComponentKind.*;
 
-@Service(value = DistributionComponentFactoryMap.class)
-@Component(metatype = false)
+@Component(service=DistributionComponentFactoryMap.class)
+@Designate(ocd=DistributionComponentFactoryMap.Config.class)
 public class DistributionComponentFactoryMap {
+    
+    // Note: Before converting to OSGI annotations there were properties, but
+    // not metatype(s)!
+    
+    @ObjectClassDefinition()
+    public @interface Config {
+        @AttributeDefinition()
+        String[] mapping_agent();
+        
+        @AttributeDefinition()
+        String[] mapping_importer();
+        
+        @AttributeDefinition()
+        String[] mapping_exporter();
+        
+        @AttributeDefinition()
+        String[] mapping_queueProvider();
+        
+        @AttributeDefinition() 
+        String[] mapping_queueStrategy();
+        
+        @AttributeDefinition()
+        String[] mapping_transportSecretProvider();
+        
+        @AttributeDefinition()
+        String[] mapping_packageBuilder();
+        
+        @AttributeDefinition()
+        String[] mapping_requestAuthorization();
+        
+        @AttributeDefinition()
+        String[] mapping_trigger();
+    }
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -110,47 +151,20 @@
             format("jcrEvent:%s", JcrEventDistributionTriggerFactory.class.getName()) };
 
 
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_AGENT = "mapping.agent";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_IMPORTER = "mapping.importer";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_EXPORTER = "mapping.exporter";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_QUEUE_PROVIDER = "mapping.queueProvider";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_QUEUE_STRATEGY = "mapping.queueStrategy";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_TRANSPORT_SECRET_PROVIDER = "mapping.transportSecretProvider";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_PACKAGE_BUILDER = "mapping.packageBuilder";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_REQUEST_AUTHORIZATION = "mapping.requestAuthorization";
-
-    @Property(unbounded = PropertyUnbounded.ARRAY)
-    private static final String MAPPING_TRIGGER = "mapping.trigger";
-
     private final Map<DistributionComponentKind, Map<String, String>> mapping =
             new HashMap<DistributionComponentKind, Map<String, String>>();
 
     @Activate
-    protected void activate(Map<String, Object> config) {
-        mapping.put(AGENT, parse(toStringArray(config.get(MAPPING_AGENT)), MAPPING_AGENT_DEFAULT));
-        mapping.put(IMPORTER, parse(toStringArray(config.get(MAPPING_IMPORTER)), MAPPING_IMPORTER_DEFAULT));
-        mapping.put(EXPORTER, parse(toStringArray(config.get(MAPPING_EXPORTER)), MAPPING_EXPORTER_DEFAULT));
-        mapping.put(QUEUE_PROVIDER, parse(toStringArray(config.get(MAPPING_QUEUE_PROVIDER)), MAPPING_QUEUE_PROVIDER_DEFAULT));
-        mapping.put(QUEUE_STRATEGY, parse(toStringArray(config.get(MAPPING_QUEUE_STRATEGY)), MAPPING_QUEUE_STRATEGY_DEFAULT));
-        mapping.put(TRANSPORT_SECRET_PROVIDER, parse(toStringArray(config.get(MAPPING_TRANSPORT_SECRET_PROVIDER)), MAPPING_TRANSPORT_SECRET_PROVIDER_DEFAULT));
-        mapping.put(PACKAGE_BUILDER, parse(toStringArray(config.get(MAPPING_PACKAGE_BUILDER)), MAPPING_PACKAGE_BUILDER_DEFAULT));
-        mapping.put(REQUEST_AUTHORIZATION, parse(toStringArray(config.get(MAPPING_REQUEST_AUTHORIZATION)), MAPPING_REQUEST_AUTHORIZATION_DEFAULT));
-        mapping.put(TRIGGER, parse(toStringArray(config.get(MAPPING_TRIGGER)), MAPPING_TRIGGER_DEFAULT));
+    protected void activate(Config conf) {
+        mapping.put(AGENT, parse(conf.mapping_agent(), MAPPING_AGENT_DEFAULT));
+        mapping.put(IMPORTER, parse(conf.mapping_importer(), MAPPING_IMPORTER_DEFAULT));
+        mapping.put(EXPORTER, parse(conf.mapping_exporter(), MAPPING_EXPORTER_DEFAULT));
+        mapping.put(QUEUE_PROVIDER, parse(conf.mapping_queueProvider(), MAPPING_QUEUE_PROVIDER_DEFAULT));
+        mapping.put(QUEUE_STRATEGY, parse(conf.mapping_queueStrategy(), MAPPING_QUEUE_STRATEGY_DEFAULT));
+        mapping.put(TRANSPORT_SECRET_PROVIDER, parse(conf.mapping_transportSecretProvider(), MAPPING_TRANSPORT_SECRET_PROVIDER_DEFAULT));
+        mapping.put(PACKAGE_BUILDER, parse(conf.mapping_packageBuilder(), MAPPING_PACKAGE_BUILDER_DEFAULT));
+        mapping.put(REQUEST_AUTHORIZATION, parse(conf.mapping_requestAuthorization(), MAPPING_REQUEST_AUTHORIZATION_DEFAULT));
+        mapping.put(TRIGGER, parse(conf.mapping_trigger(), MAPPING_TRIGGER_DEFAULT));
     }
 
     String getType(DistributionComponentKind kind, @NotNull String factoryPid) {
diff --git a/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java b/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java
index 695ee73..6ad5cd7 100644
--- a/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java
+++ b/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java
@@ -20,13 +20,12 @@
 
 import java.util.Dictionary;
 import java.util.Hashtable;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.distribution.component.impl.DistributionComponentKind;
 import org.apache.sling.distribution.event.DistributionEventProperties;
 import org.apache.sling.distribution.packaging.DistributionPackageInfo;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
 import org.slf4j.Logger;
@@ -35,8 +34,7 @@
 /**
  * {@link DistributionEventFactory} OSGi service
  */
-@Component(immediate = true)
-@Service(value = DistributionEventFactory.class)
+@Component(immediate = true, service=DistributionEventFactory.class)
 public class DefaultDistributionEventFactory implements DistributionEventFactory {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java b/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java
index 3b2537c..a9be2d7 100644
--- a/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java
+++ b/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java
@@ -19,9 +19,6 @@
 
 package org.apache.sling.distribution.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.DistributionRequestState;
@@ -31,22 +28,22 @@
 import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
 import org.apache.sling.distribution.common.DistributionException;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Default implementation of Distributor interface that dispatches the request to available agents.
  */
-@Component
-@Service(Distributor.class)
+@Component()
 public class DefaultDistributor implements Distributor {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
 
     @Reference
-    private
-    DistributionComponentProvider componentProvider;
+    private DistributionComponentProvider componentProvider;
 
     @NotNull
     public DistributionResponse distribute(@NotNull String agentName, @NotNull ResourceResolver resourceResolver, @NotNull DistributionRequest distributionRequest) {
diff --git a/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java b/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java
index 289f81b..6760a54 100644
--- a/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java
+++ b/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java
@@ -22,7 +22,7 @@
 import java.util.Collection;
 import java.util.List;
 
-import aQute.bnd.annotation.ConsumerType;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * The log of a distribution component activity (e.g. a DistributionAgent)
diff --git a/src/main/java/org/apache/sling/distribution/log/spi/package-info.java b/src/main/java/org/apache/sling/distribution/log/spi/package-info.java
index 71bb8a9..acd33e8 100644
--- a/src/main/java/org/apache/sling/distribution/log/spi/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/log/spi/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.0.0")
 package org.apache.sling.distribution.log.spi;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java b/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java
index 3ca3a36..2d3cdd8 100644
--- a/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java
+++ b/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java
@@ -26,22 +26,19 @@
 import org.apache.felix.hc.api.FormattingResultLog;
 import org.apache.felix.hc.api.HealthCheck;
 import org.apache.felix.hc.api.Result;
-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.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-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.References;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
 import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
+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.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,23 +46,19 @@
  * {@link HealthCheck} that checks if distribution queues' first item has been retried more than a configurable amount
  * of times
  */
-@Component(immediate = true,
-        metatype = true,
-        label = "Apache Sling Distribution Queue Health Check")
-@Properties({
-        @Property(name = HealthCheck.NAME, value = "SlingDistributionQueueHC", description = "Health Check name", label = "Name"),
-        @Property(name = HealthCheck.TAGS, unbounded = PropertyUnbounded.ARRAY, description = "Health Check tags", label = "Tags"),
-        @Property(name = HealthCheck.MBEAN_NAME, value = "slingDistributionQueue", description = "Health Check MBean name", label = "MBean name")
-})
-@References({
-        @Reference(name = "distributionAgent",
-                referenceInterface = DistributionAgent.class,
-                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-                policy = ReferencePolicy.DYNAMIC)
-})
-
-@Service(value = HealthCheck.class)
+@Component(immediate = true, service=HealthCheck.class,
+    property = {
+            HealthCheck.NAME + "=SlingDistributionQueueHC",
+            HealthCheck.MBEAN_NAME + "=slingDistributionQueue"
+    })
+@Designate(ocd=DistributionQueueHealthCheck.Config.class)
 public class DistributionQueueHealthCheck implements HealthCheck {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Queue Health Check")
+    public @interface Config {
+        @AttributeDefinition(name="Allowed retries", description = "Number of allowed retries")
+        int numberOfRetriesAllowed() default DEFAULT_NUMBER_OF_RETRIES_ALLOWED;
+    }
 
     private static final Logger log = LoggerFactory.getLogger(DistributionQueueHealthCheck.class);
 
@@ -73,14 +66,12 @@
 
     private int numberOfRetriesAllowed;
 
-    @Property(intValue = DEFAULT_NUMBER_OF_RETRIES_ALLOWED, description = "Number of allowed retries", label = "Allowed retries")
-    private static final String NUMBER_OF_RETRIES_ALLOWED = "numberOfRetriesAllowed";
 
     private final List<DistributionAgent> distributionAgents = new CopyOnWriteArrayList<DistributionAgent>();
 
     @Activate
-    public void activate(final Map<String, Object> properties) {
-        numberOfRetriesAllowed = PropertiesUtil.toInteger(properties.get(NUMBER_OF_RETRIES_ALLOWED), DEFAULT_NUMBER_OF_RETRIES_ALLOWED);
+    public void activate(final Config conf) {
+        numberOfRetriesAllowed = conf.numberOfRetriesAllowed();
         log.info("Activated, numberOfRetriesAllowed={}", numberOfRetriesAllowed);
     }
 
@@ -89,6 +80,9 @@
         distributionAgents.clear();
     }
 
+    @Reference(name = "distributionAgent",
+            cardinality = ReferenceCardinality.MULTIPLE,
+            policy = ReferencePolicy.DYNAMIC)
     void bindDistributionAgent(final DistributionAgent distributionAgent) {
         distributionAgents.add(distributionAgent);
 
diff --git a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java
index a2925d0..e36918a 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java
@@ -20,9 +20,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import aQute.bnd.annotation.ProviderType;
 
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * A distribution package
diff --git a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java
index 46f0e4d..b8b2e75 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java
@@ -19,12 +19,12 @@
 package org.apache.sling.distribution.packaging;
 
 import java.io.InputStream;
-import aQute.bnd.annotation.ProviderType;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * A builder for {@link DistributionPackage}s
diff --git a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java
index 828af92..a528d37 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java
@@ -21,12 +21,12 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
-import aQute.bnd.annotation.ProviderType;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.distribution.DistributionRequestType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * Additional information about a package.
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java
index 0c7169d..afa2bd1 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java
@@ -18,9 +18,9 @@
  */
 package org.apache.sling.distribution.packaging.impl;
 
-import aQute.bnd.annotation.ProviderType;
 import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * A helper interface to allow finding registered {@link DistributionPackageBuilder}s
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java
index 975b986..c5855c2 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.distribution.packaging.impl;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
@@ -26,13 +25,14 @@
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * A {@link DistributionPackageExporter) is responsible of exporting {@link DistributionPackage }s from a local or remote
  * Sling instance.
  * Such packages are usually imported by a {@link DistributionPackageImporter } or put inside
  * {@link DistributionQueue }s for others to consume them.
- * Exporting a {@link DistributionPackage} means obtaining that package by e.g. directly creating it by bundling local
+ DistributionPackageExporter* Exporting a {@link DistributionPackage} means obtaining that package by e.g. directly creating it by bundling local
  * Sling resources, retrieving it from a remote endpoint (by executing an HTTP POST request on another Sling
  * instance exposing packages ina queue).
  */
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java
index 8122566..afaa44c 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java
@@ -19,12 +19,13 @@
 package org.apache.sling.distribution.packaging.impl;
 
 import java.io.InputStream;
-import aQute.bnd.annotation.ConsumerType;
+
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageInfo;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * A {@link DistributionPackageImporter} is responsible for importing {@link DistributionPackage}s into either a local
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java b/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java
index a48b11b..fe90ae4 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java
@@ -18,9 +18,9 @@
  */
 package org.apache.sling.distribution.packaging.impl;
 
-import aQute.bnd.annotation.ProviderType;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * A {@link DistributionPackage} that offers basic reference counting.
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
index e4490f6..bc67aab 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
@@ -18,20 +18,10 @@
  */
 package org.apache.sling.distribution.packaging.impl.exporter;
 
-import java.util.Map;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
@@ -39,32 +29,40 @@
 import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
 import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * OSGi configuration factory for {@link AgentDistributionPackageExporter}s
  */
-@Component(label = "Apache Sling Distribution Exporter - Agent Based Package Exporter",
-        metatype = true,
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageExporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Exporter name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionPackageExporter.class,
+        property = {
+                "webconsole.configurationFactory.nameHint=Exporter name: {name}"
+        })
+@Designate(ocd=AgentDistributionPackageExporterFactory.Config.class, factory = true)
 public class AgentDistributionPackageExporterFactory implements DistributionPackageExporter {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Exporter - Agent Based Package Exporter")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the exporter.")
+        String name();
+        @AttributeDefinition(name="Queue", description = "The name of the queue from which the packages should be exported.")
+        String queue() default DistributionQueueDispatchingStrategy.DEFAULT_QUEUE_NAME;
+        
+        @AttributeDefinition(name="Drop invalid queue items", description = "Remove invalid items from the queue.")
+        boolean drop_invalid_items() default false;
+        
+        @AttributeDefinition(name = "The target reference for the DistributionAgent that will be used to export packages.")
+        String agent_target();
+    }
 
-    /**
-     * name of this exporter.
-     */
-    @Property(label = "Name", description = "The name of the exporter.")
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "Queue", description = "The name of the queue from which the packages should be exported.")
-    private static final String QUEUE_NAME = "queue";
-
-    @Property(label = "Drop invalid queue items", description = "Remove invalid items from the queue.", boolValue = false)
-    private static final String DROP_INVALID_QUEUE_ITEMS = "drop.invalid.items";
-
-    @Property(name = "agent.target", label = "The target reference for the DistributionAgent that will be used to export packages.")
     @Reference(name = "agent")
     private DistributionAgent agent;
 
@@ -76,14 +74,14 @@
 
 
     @Activate
-    public void activate(Map<String, Object> config) throws Exception {
+    public void activate(Config conf) {
 
-        String queueName = PropertiesUtil.toString(config.get(QUEUE_NAME), DistributionQueueDispatchingStrategy.DEFAULT_QUEUE_NAME);
+        String queueName = conf.queue();
         queueName = SettingsUtils.removeEmptyEntry(queueName);
         queueName = queueName == null ? DistributionQueueDispatchingStrategy.DEFAULT_QUEUE_NAME : queueName;
 
-        String name = PropertiesUtil.toString(config.get(NAME), "");
-        boolean dropInvalidItems = PropertiesUtil.toBoolean(config.get(DROP_INVALID_QUEUE_ITEMS), false);
+        String name = conf.name();
+        boolean dropInvalidItems = conf.drop_invalid_items();
 
 
         packageExporter = new AgentDistributionPackageExporter(queueName, agent, packageBuilderProvider, name, dropInvalidItems);
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java
index ca6663d..79b3dc0 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java
@@ -20,42 +20,42 @@
 
 import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
 import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
 import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * OSGi configuration factory for {@link LocalDistributionPackageExporter}s.
  */
-@Component(label = "Apache Sling Distribution Exporter - Local Package Exporter Factory",
-        metatype = true,
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageExporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Exporter name: {name}")
+@Component(service=DistributionPackageExporter.class,
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property = {
+                "webconsole.configurationFactory.nameHint=Exporter name: {name}" 
+        })
+@Designate(ocd=LocalDistributionPackageExporterFactory.Config.class, factory=true)
 public class LocalDistributionPackageExporterFactory implements DistributionPackageExporter {
-
-    /**
-     * name of this exporter.
-     */
-    @Property(label = "Name", description = "The name of the exporter.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Exporter - Local Package Exporter Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the exporter.")
+        String name();
+        @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
             "e.g. use target=(name=...) to bind to services by name.")
+        String packageBuilder_target();
+    }
+    
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java
index 9cc995d..ee91a3f 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java
@@ -18,74 +18,64 @@
  */
 package org.apache.sling.distribution.packaging.impl.exporter;
 
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-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.Service;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.DistributionComponentKind;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
 import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
 import org.apache.sling.distribution.transport.impl.HttpConfiguration;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * OSGi configuration factory for {@link RemoteDistributionPackageExporter}s.
  */
-@Component(label = "Apache Sling Distribution Exporter - Remote Package Exporter Factory",
-        metatype = true,
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
-)
-@Service(value = DistributionPackageExporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Exporter name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionPackageExporter.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Exporter name: {name}"
+        })
+@Designate(ocd=RemoteDistributionPackageExporterFactory.Config.class, factory=true)
 public class RemoteDistributionPackageExporterFactory implements DistributionPackageExporter {
 
+    @ObjectClassDefinition(name="Apache Sling Distribution Exporter - Remote Package Exporter Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the exporter.")
+        String name();
+        @AttributeDefinition(cardinality = 100, name="Endpoints", description = "The list of endpoints from which the packages will be exported.")
+        String[] endpoints();
+        @AttributeDefinition(name="Pull Items", description = "number of subsequent pull requests to make")
+        int pull_items() default Integer.MAX_VALUE;
+        @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+            "e.g. use target=(name=...) to bind to services by name.")
+        String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+            "e.g. use target=(name=...) to bind to services by name.")
+        String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+    }
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    /**
-     * name of this exporter.
-     */
-    @Property(label = "Name", description = "The name of the exporter.")
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * endpoints property
-     */
-    @Property(cardinality = 100, label = "Endpoints", description = "The list of endpoints from which the packages will be exported.")
-    private static final String ENDPOINTS = "endpoints";
-
-    /**
-     * no. of items to poll property
-     */
-    @Property(label = "Pull Items", description = "number of subsequent pull requests to make", intValue = 1)
-    private static final String PULL_ITEMS = "pull.items";
-
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
-
-    @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "transportSecretProvider")
     private
     DistributionTransportSecretProvider transportSecretProvider;
@@ -93,17 +83,13 @@
     private DistributionPackageExporter exporter;
 
     @Activate
-    protected void activate(Map<String, Object> config) throws Exception {
-        log.info("activating remote exporter with pb {} and dtsp {}", packageBuilder, transportSecretProvider);
+    protected void activate(Config conf) {
+        log.info("activating remote exporter with packagebuilder {} and transportSecretProvider {}", packageBuilder, transportSecretProvider);
 
-        String[] endpoints = PropertiesUtil.toStringArray(config.get(ENDPOINTS), new String[0]);
+        String[] endpoints = conf.endpoints();
         endpoints = SettingsUtils.removeEmptyEntries(endpoints);
-
-        int pollItems = PropertiesUtil.toInteger(config.get(PULL_ITEMS), Integer.MAX_VALUE);
-
-
-
-        String exporterName = PropertiesUtil.toString(config.get(NAME), null);
+        int pollItems = conf.pull_items();
+        String exporterName = conf.name();
 
         DefaultDistributionLog distributionLog = new DefaultDistributionLog(DistributionComponentKind.EXPORTER, exporterName, RemoteDistributionPackageExporter.class, DefaultDistributionLog.LogLevel.ERROR);
 
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
index 381d69c..953aeff 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
@@ -19,44 +19,46 @@
 package org.apache.sling.distribution.packaging.impl.importer;
 
 import java.io.InputStream;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
+import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.event.impl.DistributionEventFactory;
-import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.packaging.DistributionPackage;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
-import org.apache.sling.distribution.packaging.DistributionPackageInfo;
 import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
+import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * OSGi configuration factory for {@link LocalDistributionPackageImporter}s.
  */
-@Component(label = "Apache Sling Distribution Importer - Local Package Importer Factory",
-        metatype = true,
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageImporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Importer name: {name}")
+@Component(service=DistributionPackageImporter.class,
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        property = {
+                "webconsole.configurationFactory.nameHint=Importer name: {name}"
+        })
+@Designate(ocd=LocalDistributionPackageImporterFactory.Config.class, factory = true)
 public class LocalDistributionPackageImporterFactory implements DistributionPackageImporter {
-    /**
-     * name of this importer.
-     */
-    @Property(label = "Name", description = "The name of the importer.")
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Importer - Local Package Importer Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "THe name of the importer.")
+        String name();
+        
+        @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+            "e.g. use target=(name=...) to bind to services by name.")
+        String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+    }
 
-    @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
     @Reference(name = "packageBuilder")
     private DistributionPackageBuilder packageBuilder;
 
@@ -66,8 +68,8 @@
     private DistributionPackageImporter importer;
 
     @Activate
-    public void activate(Map<String, Object> config) {
-        String name = PropertiesUtil.toString(config.get(NAME), null);
+    public void activate(Config conf) {
+        String name = conf.name();
         importer = new LocalDistributionPackageImporter(name, eventFactory, packageBuilder);
     }
 
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
index 21e3db7..72c6ef9 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
@@ -21,53 +21,48 @@
 import java.io.InputStream;
 import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.DistributionComponentKind;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
 import org.apache.sling.distribution.packaging.DistributionPackage;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
 import org.apache.sling.distribution.transport.impl.HttpConfiguration;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * OSGi configuration factory for {@link RemoteDistributionPackageImporter}s.
  */
-@Component(label = "Apache Sling Distribution Importer - Remote Package Importer Factory",
-        metatype = true,
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageImporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Importer name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionPackageImporter.class,
+        property= {
+               "webconsole.configurationFactory.nameHint=Importer name: {name}" 
+        })
+@Designate(ocd=RemoteDistributionPackageImporterFactory.Config.class, factory=true)
 public class RemoteDistributionPackageImporterFactory implements DistributionPackageImporter {
-
-    /**
-     * name of this importer.
-     */
-    @Property(label = "Name", description = "The name of the importer.")
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-
-    /**
-     * endpoints property
-     */
-    @Property(cardinality = 100, label = "Endpoints", description = "The list of endpoints to which the packages will be imported.")
-    private static final String ENDPOINTS = "endpoints";
-
-    @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Importer - Remote Package Importer Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the importer.")
+        String name();
+        @AttributeDefinition(cardinality = 100, name="Endpoints", description = "The list of endpoints to which the packages will be imported.")
+        String[] endpoints();
+        @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
             "e.g. use target=(name=...) to bind to services by name.")
+        String transportSecretProvider_target();
+    }
+
     @Reference(name = "transportSecretProvider")
     private
     DistributionTransportSecretProvider transportSecretProvider;
@@ -75,11 +70,10 @@
     private DistributionPackageImporter importer;
 
     @Activate
-    protected void activate(Map<String, Object> config) {
+    protected void activate(Config conf) {
 
-        Map<String, String> endpoints = SettingsUtils.toUriMap(config.get(ENDPOINTS));
-
-        String importerName = PropertiesUtil.toString(config.get(NAME), null);
+        Map<String, String> endpoints = SettingsUtils.toUriMap(conf.endpoints());
+        String importerName = conf.name();
 
         DefaultDistributionLog distributionLog = new DefaultDistributionLog(DistributionComponentKind.IMPORTER, importerName, RemoteDistributionPackageImporter.class, DefaultDistributionLog.LogLevel.ERROR);
 
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
index cc4f15e..02290fe 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
@@ -19,50 +19,45 @@
 package org.apache.sling.distribution.packaging.impl.importer;
 
 import java.io.InputStream;
-import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.packaging.DistributionPackage;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * OSGi configuration factory for {@link RepositoryDistributionPackageImporter}s.
  */
-@Component(label = "Apache Sling Distribution Importer - Repository Package Importer Factory",
-        metatype = true,
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(DistributionPackageImporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Importer name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionPackageImporter.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Importer name: {name}"     
+        })
+@Designate(ocd=RepositoryDistributionPackageImporterFactory.Config.class, factory = true)
 public class RepositoryDistributionPackageImporterFactory implements DistributionPackageImporter {
-
-    /**
-     * name of this component.
-     */
-    @Property
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(name = "service.name")
-    private static String SERVICE_NAME;
-
-    @Property(name = "path")
-    private static String PATH;
-
-    @Property(name = "privilege.name")
-    private static String PRIVILEGE_NAME;
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Importer - Repository Package Importer Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the importer.")
+        String name();
+        @AttributeDefinition()
+        String service_name() default "admin";
+        @AttributeDefinition()
+        String path() default "/var/sling/distribution/import";
+        @AttributeDefinition()
+        String privilege_name() default "jcr:read";
+    }
 
     @Reference
     private SlingRepository repository;
@@ -70,12 +65,12 @@
     private RepositoryDistributionPackageImporter importer;
 
     @Activate
-    protected void activate(Map<String, Object> config) {
+    protected void activate(Config conf) {
 
         importer = new RepositoryDistributionPackageImporter(repository,
-                PropertiesUtil.toString(config.get(SERVICE_NAME), "admin"),
-                PropertiesUtil.toString(config.get(PATH), "/var/sling/distribution/import"),
-                PropertiesUtil.toString(config.get(PRIVILEGE_NAME), "jcr:read"));
+                conf.service_name(),
+                conf.path(),
+                conf.privilege_name());
     }
 
     public void importPackage(@NotNull ResourceResolver resourceResolver, @NotNull DistributionPackage distributionPackage) throws DistributionException {
diff --git a/src/main/java/org/apache/sling/distribution/packaging/package-info.java b/src/main/java/org/apache/sling/distribution/packaging/package-info.java
index 8f378be..88834d1 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.0.1")
 package org.apache.sling.distribution.packaging;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java b/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java
index 048e815..18c0bbb 100644
--- a/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java
+++ b/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.distribution.queue;
 
-import aQute.bnd.annotation.ProviderType;
+import org.osgi.annotation.versioning.ProviderType;
 
 @ProviderType
 public final class DistributionQueueCapabilities {
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java
index dae4877..f65c32e 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java
@@ -19,12 +19,13 @@
 package org.apache.sling.distribution.queue.impl;
 
 import java.util.List;
-import aQute.bnd.annotation.ConsumerType;
+
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * a {@link DistributionQueueDispatchingStrategy} implements an algorithm for dispatching
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java
index 7597bcc..1f9d896 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java
@@ -18,11 +18,11 @@
  */
 package org.apache.sling.distribution.queue.impl;
 
-import aQute.bnd.annotation.ProviderType;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
 import org.apache.sling.distribution.queue.DistributionQueueItem;
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * Processor of {@link DistributionQueueItem}s
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java
index 14e3ef7..430f621 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java
@@ -18,11 +18,11 @@
  */
 package org.apache.sling.distribution.queue.impl;
 
-import aQute.bnd.annotation.ProviderType;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.queue.DistributionQueueType;
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * A provider for {@link DistributionQueue}s
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java b/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java
index d6a450d..6932a61 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java
@@ -19,22 +19,21 @@
 
 package org.apache.sling.distribution.queue.impl.jobhandling;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
 import org.apache.sling.distribution.queue.impl.DistributionQueueProviderFactory;
 import org.apache.sling.event.jobs.JobManager;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
 import java.util.Map;
 
-@Component
-@Service(DistributionQueueProviderFactory.class)
-@Property(name = DistributionComponentConstants.PN_NAME, value = "jobQueue")
+@Component(service=DistributionQueueProviderFactory.class,
+    property= {
+            DistributionComponentConstants.PN_NAME + "=jobQueue"    
+    })
 public class JobHandlingQueueDistributionProviderFactory implements DistributionQueueProviderFactory {
 
     @Reference
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java
index 76ae581..162bde0 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java
@@ -19,38 +19,35 @@
 
 package org.apache.sling.distribution.queue.impl.resource;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
 import org.apache.sling.distribution.queue.impl.DistributionQueueProviderFactory;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-import java.util.Map;
-
-@Component(metatype = true,
-            label = "Apache Sling Resource Queue Provider Factory",
-            description = "OSGi configuration factory for Resource-backed queues",
-            configurationFactory = true,
-            policy = ConfigurationPolicy.REQUIRE)
-@Service(DistributionQueueProviderFactory.class)
-@Properties({
-        @Property(name = DistributionComponentConstants.PN_NAME, value = "resourceQueue"),
-        @Property(name = ResourceQueueProviderFactory.PN_IS_ACTIVE,
-                label = "Should the Resource-backed queue created with a Queue Processor (i.e., ACTIVE)",
-                boolValue = {false})
-})
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionQueueProviderFactory.class,
+        property= {
+                DistributionComponentConstants.PN_NAME + "=resourceQueue" 
+        })
+@Designate(ocd=ResourceQueueProviderFactory.Config.class, factory = true)
 public class ResourceQueueProviderFactory implements DistributionQueueProviderFactory {
-
-    static final String PN_IS_ACTIVE = "queue.isActive";
+    
+    @ObjectClassDefinition(name="Apache Sling Resource Queue Provider Factory",
+            description="OSGi configuration factory for Resource-backed queues")
+    public @interface Config {
+        @AttributeDefinition(name="Should the Resource-backed queue created with a Queue Processor (i.e., ACTIVE)")
+        boolean queue_isActive() default false;
+    }
 
     @Reference
     ResourceResolverFactory resourceResolverFactory;
@@ -62,9 +59,8 @@
     private boolean isActive;
 
     @Activate
-    protected void activate(BundleContext context, Map<String, Object> config)
-    {
-        this.isActive = PropertiesUtil.toBoolean(PN_IS_ACTIVE, false);
+    protected void activate(BundleContext context, Config conf) {
+        this.isActive = conf.queue_isActive();
         this.context = context;
     }
 
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java
index 2a389d2..4d139c4 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java
@@ -36,12 +36,6 @@
 import org.slf4j.LoggerFactory;
 
 
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java b/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java
index 2b2b600..08545b2 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java
@@ -23,6 +23,7 @@
 import java.text.NumberFormat;
 import java.text.ParseException;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.json.Json;
@@ -52,7 +53,7 @@
 
         JsonReader reader = Json.createReader(new StringReader(infoString));
         JsonObject jsonObject = reader.readObject();
-        NumberFormat numberFormat = NumberFormat.getInstance();
+        NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH);
 
         for (Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) {
             if (entry.getValue().getValueType().equals(JsonValue.ValueType.ARRAY)) {
diff --git a/src/main/java/org/apache/sling/distribution/queue/package-info.java b/src/main/java/org/apache/sling/distribution/queue/package-info.java
index 6f003ea..d543e33 100644
--- a/src/main/java/org/apache/sling/distribution/queue/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/queue/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.2.0")
 package org.apache.sling.distribution.queue;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java b/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java
index c14d069..4576a83 100644
--- a/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java
+++ b/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java
@@ -20,7 +20,6 @@
 
 import java.util.Set;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
 import org.apache.sling.distribution.queue.DistributionQueueItem;
@@ -28,6 +27,7 @@
 import org.apache.sling.distribution.queue.DistributionQueueType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * Holds the {@link DistributionQueueItem} queue items in a sequential queue.
diff --git a/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java b/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java
index 912273a..0fa6cfc 100644
--- a/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java
@@ -17,8 +17,7 @@
  * under the License.
  */
 
-@Version("1.0.0")
+@Version("1.0.1")
 package org.apache.sling.distribution.queue.spi;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java
index 9f36c44..228366c 100644
--- a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java
@@ -21,46 +21,46 @@
 
 import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.ResourceProvider;
 import org.apache.sling.api.resource.ResourceProviderFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.DistributionConfigurationManager;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * A {@link ResourceProviderFactory} for distribution configuration resources.
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Resources - Configuration Resource Provider Factory",
-        description = "Distribution Configuration Resource Provider Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = ResourceProviderFactory.class)
-@Properties({
-        @Property(name = ResourceProvider.ROOTS),
-        @Property(name = ResourceProvider.OWNS_ROOTS, boolValue = true, propertyPrivate = true)
-})
-@Property(name="webconsole.configurationFactory.nameHint", value="Resource kind: {kind}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=ResourceProviderFactory.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Resource kind: {kind}",
+                "provider.ownsRoots=true"
+        })
+@Designate(ocd=DistributionConfigurationResourceProviderFactory.Config.class, factory = true)
 public class DistributionConfigurationResourceProviderFactory implements ResourceProviderFactory {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Resources - Configuration Resource Provider Factory",
+            description="Distribution Configuration Resource Provider Factory")
+    public @interface Config {
+        @AttributeDefinition()
+        String provider_roots();
+        @AttributeDefinition()
+        String kind();
+    }
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Property
-    private final static String KIND = DistributionComponentConstants.PN_KIND;
-
     @Reference
     private
     DistributionConfigurationManager configurationManager;
@@ -69,13 +69,10 @@
     private String kind;
 
     @Activate
-    public void activate(BundleContext context, Map<String, Object> properties) {
-
-        log.debug("activating resource provider with config {}", properties);
-
-        resourceRoot = PropertiesUtil.toString(properties.get(ResourceProvider.ROOTS), null);
-        kind = PropertiesUtil.toString(properties.get(KIND), null);
-
+    public void activate(BundleContext context, Config conf) {
+        log.debug("activating resource provider with config {}", conf);
+        resourceRoot = conf.provider_roots();
+        kind = conf.kind();
     }
 
     @Deactivate
diff --git a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java
index 8ed3d87..92f9100 100644
--- a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java
@@ -19,51 +19,52 @@
 
 package org.apache.sling.distribution.resources.impl;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.Iterator;
-import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * A {@link org.apache.sling.api.resource.ResourceProviderFactory} for resources backing distribution services.
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Resources - Service Resource Provider Factory",
-        description = "Distribution Service Resource Provider Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = ResourceProvider.class)
-@Properties({
-        @Property(name = ResourceProvider.ROOTS),
-        @Property(name = ResourceProvider.OWNS_ROOTS, boolValue = true, propertyPrivate = true)
-})
-@Property(name="webconsole.configurationFactory.nameHint", value="Resource kind: {kind}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=ResourceProvider.class,
+        enabled = true,
+        property = {
+                "webconsole.configurationFactory.nameHint=Resource kind: {kind}",
+                ResourceProvider.OWNS_ROOTS + ":Boolean=true",
+                "service.vendor=The Apache Software Foundation"
+        })
+@Designate(ocd=DistributionServiceResourceProviderFactory.Config.class, factory=true)
 public class DistributionServiceResourceProviderFactory implements ResourceProvider {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Resources - Service Resource Provider Factory",
+            description = "Distribution Service Resource Provider Factory")
+    public @interface Config {
+        @AttributeDefinition()
+        String provider_roots();
+        @AttributeDefinition()
+        String kind();
+    }
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-
-    @Property
-    private final static String KIND = DistributionComponentConstants.PN_KIND;
-
     @Reference
     private
     DistributionComponentProvider componentProvider;
@@ -71,12 +72,12 @@
     private ResourceProvider resourceProvider;
 
     @Activate
-    public void activate(BundleContext context, Map<String, Object> properties) {
+    public void activate(BundleContext context, Config conf) {
 
-        log.debug("activating resource provider with config {}", properties);
+        log.debug("activating resource provider with config {}", conf);
 
-        String kind = PropertiesUtil.toString(properties.get(KIND), null);
-        String resourceRoot = PropertiesUtil.toString(properties.get(ResourceProvider.ROOTS), null);
+        String kind = conf.kind();
+        String resourceRoot = conf.provider_roots();
 
         resourceProvider = new ExtendedDistributionServiceResourceProvider(kind,
                 componentProvider,
diff --git a/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java b/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java
index 60f1fa6..6244bac 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java
@@ -21,9 +21,9 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.common.DistributionException;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * A content serializer used to convert distribution payloads to and from binary streams.
diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java b/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
index d1beb1f..3dd31ed 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
@@ -20,17 +20,15 @@
 
 import java.util.List;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.distribution.component.impl.DistributionComponent;
 import org.apache.sling.distribution.component.impl.DistributionComponentKind;
 import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
 import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
 import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
-@Component
-@Service(DistributionPackageBuilderProvider.class)
+@Component(service=DistributionPackageBuilderProvider.class)
 public class DefaultDistributionPackageBuilderProvider implements DistributionPackageBuilderProvider {
 
     @Reference
diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java b/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
index aaacbc1..534f9cc 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
@@ -21,24 +21,12 @@
 import java.io.InputStream;
 import java.util.Dictionary;
 import java.util.Hashtable;
-import java.util.Map;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.monitor.impl.MonitoringDistributionPackageBuilder;
 import org.apache.sling.distribution.packaging.DistributionPackage;
@@ -54,155 +42,131 @@
 import org.jetbrains.annotations.Nullable;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 
 /**
  * A factory for package builders
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Packaging - Package Builder Factory",
-        description = "OSGi configuration for package builders",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionPackageBuilder.class)
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Builder name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionPackageBuilder.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Builder name: {name}"     
+        })
+@Designate(ocd=DistributionPackageBuilderFactory.Config.class, factory=true)
 public class DistributionPackageBuilderFactory implements DistributionPackageBuilder {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Packaging - Package Builder Factory",
+            description = "OSGi configuration for package builders")
+    public @interface Config {
+        @AttributeDefinition(name="name", description = "The name of the package builder.")
+        String name();
+        @AttributeDefinition(name="type",description = "The persistence type used by this package builder",
+                options = {
+                        @Option(label = "resource", value="resource package"),
+                        @Option(label="file", value="file package"),
+                        @Option(label="inmemory", value="in memory packages")
+                })
+        String type() default "resource"; // persistence
+        
+        @AttributeDefinition(name="Content Serializer",description = "The target reference for the DistributionSerializationFormat used to (de)serialize packages, " +
+                "e.g. use target=(name=...) to bind to services by name.")
+        String format_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+        
+        @AttributeDefinition(name="Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
+        String tempFsFolder();
+        
+        @AttributeDefinition(name="File threshold",description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.")
+        int fileThreshold() default DEFAULT_FILE_THRESHOLD_VALUE;
+        
+        @AttributeDefinition(name="The memory unit for the file threshold",
+        description = "The memory unit for the file threshold, Megabytes by default",
+        options = {
+                @Option(label = "BYTES", value = "Bytes"),
+                @Option(label = "KILO_BYTES", value = "Kilobytes"),
+                @Option(label = "MEGA_BYTES", value = "Megabytes"),
+                @Option(label = "GIGA_BYTES", value = "Gigabytes")
+        })
+        String memoryUnit() default DEFAULT_MEMORY_UNIT;
+        
+        @AttributeDefinition(name="Flag to enable/disable the off-heap memory", description="Flag to enable/disable the off-heap memory, false by default")
+        boolean useOffHeapMemory() default DEFAULT_USE_OFF_HEAP_MEMORY;
+        
+        @AttributeDefinition(
+                name = "The digest algorithm to calculate the package checksum",
+                description = "The digest algorithm to calculate the package checksum, Megabytes by default",
+                options = {
+                    @Option(label = "NONE", value = "Do not send digest"),
+                    @Option(label = "MD2", value = "md2"),
+                    @Option(label = "MD5", value = "md5"),
+                    @Option(label = "SHA-1", value = "sha1"),
+                    @Option(label = "SHA-256", value = "sha256"),
+                    @Option(label = "SHA-384", value = "sha384"),
+                    @Option(label = "SHA-512", value = "sha512")
+                })
+        String digestAlgorithm() default DEFAULT_DIGEST_ALGORITHM;
+        
+        @AttributeDefinition(
+                name="The number of items for monitoring distribution packages creation/installation",
+                description = "The number of items for monitoring distribution packages creation/installation, 100 by default")
+        int monitoringQueueSize() default DEFAULT_MONITORING_QUEUE_SIZE;
+        
+        @AttributeDefinition(
+                name="The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
+                description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
+                        "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default")
+        long cleanupDelay() default DEFAULT_PACKAGE_CLEANUP_DELAY;
+        
+        @AttributeDefinition(
+                name = "Package Node Filters", 
+                description = "The package node path filters. Filter format: path|+include|-exclude", 
+                cardinality = 100)
+        String[] package_filters();
+        
+        @AttributeDefinition(
+                name = "Package Property Filters", 
+                description = "The package property path filters. Filter format: path|+include|-exclude",
+                cardinality = Integer.MAX_VALUE)
+        String[] property_filters();
+    }
 
-    /**
-     * name of this package builder.
-     */
-    @Property(label = "Name", description = "The name of the package builder.")
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
+    private MonitoringDistributionPackageBuilder packageBuilder;
 
-    /**
-     * type of this package builder.
-     */
-    @Property(options = {
-            @PropertyOption(name = "resource",
-                    value = "resource packages"
-            ),
-            @PropertyOption(name = "file",
-                    value = "file packages"
-            ),
-            @PropertyOption(name = "inmemory",
-                    value = "in memory packages"
-            )},
-            value = "resource", label = "type", description = "The persistence type used by this package builder")
-    private static final String PERSISTENCE = DistributionComponentConstants.PN_TYPE;
-
-    @Property(name = "format.target", label = "Content Serializer", description = "The target reference for the DistributionSerializationFormat used to (de)serialize packages, " +
-            "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
+    private ServiceRegistration<Runnable> packageCleanup = null;
+    
     @Reference(name = "format")
     private DistributionContentSerializer contentSerializer;
 
     @Reference
     private ResourceResolverFactory resolverFactory;
 
-    /**
-     * Temp file folder
-     */
-    @Property(label = "Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
-    private static final String TEMP_FS_FOLDER = "tempFsFolder";
 
     // 1M
     private static final int DEFAULT_FILE_THRESHOLD_VALUE = 1;
-
-    @Property(
-        label="File threshold",
-        description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.",
-        intValue = DEFAULT_FILE_THRESHOLD_VALUE
-    )
-    public static final String FILE_THRESHOLD = "fileThreshold";
-
     private static final String DEFAULT_MEMORY_UNIT = "MEGA_BYTES";
-
-    @Property(
-        label = "The memory unit for the file threshold",
-        description = "The memory unit for the file threshold, Megabytes by default",
-        value = DEFAULT_MEMORY_UNIT,
-        options = {
-            @PropertyOption(name = "BYTES", value = "Bytes"),
-            @PropertyOption(name = "KILO_BYTES", value = "Kilobytes"),
-            @PropertyOption(name = "MEGA_BYTES", value = "Megabytes"),
-            @PropertyOption(name = "GIGA_BYTES", value = "Gigabytes")
-        }
-    )
-    private static final String MEMORY_UNIT = "memoryUnit";
-
     private static final boolean DEFAULT_USE_OFF_HEAP_MEMORY = false;
-
-    @Property(
-        label="Flag to enable/disable the off-heap memory",
-        description = "Flag to enable/disable the off-heap memory, false by default",
-        boolValue = DEFAULT_USE_OFF_HEAP_MEMORY
-    )
-    public static final String USE_OFF_HEAP_MEMORY = "useOffHeapMemory";
-
     private static final String DEFAULT_DIGEST_ALGORITHM = "NONE";
-
-    @Property(
-        label = "The digest algorithm to calculate the package checksum",
-        description = "The digest algorithm to calculate the package checksum, Megabytes by default",
-        value = DEFAULT_DIGEST_ALGORITHM,
-        options = {
-            @PropertyOption(name = DEFAULT_DIGEST_ALGORITHM, value = "Do not send digest"),
-            @PropertyOption(name = "MD2", value = "md2"),
-            @PropertyOption(name = "MD5", value = "md5"),
-            @PropertyOption(name = "SHA-1", value = "sha1"),
-            @PropertyOption(name = "SHA-256", value = "sha256"),
-            @PropertyOption(name = "SHA-384", value = "sha384"),
-            @PropertyOption(name = "SHA-512", value = "sha512")
-        }
-    )
-    private static final String DIGEST_ALGORITHM = "digestAlgorithm";
-
     private static final int DEFAULT_MONITORING_QUEUE_SIZE = 0;
-
-    @Property(
-        label="The number of items for monitoring distribution packages creation/installation",
-        description = "The number of items for monitoring distribution packages creation/installation, 100 by default",
-        intValue = DEFAULT_MONITORING_QUEUE_SIZE
-    )
-    private static final String MONITORING_QUEUE_SIZE = "monitoringQueueSize";
-
     private static final long DEFAULT_PACKAGE_CLEANUP_DELAY = 60L;
 
-    @Property(
-            label="The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
-            description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
-                    "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default",
-            longValue = DEFAULT_PACKAGE_CLEANUP_DELAY
-    )
-    private static final String PACKAGE_CLEANUP_DELAY = "cleanupDelay";
-
-    /**
-     * Package node filters
-     */
-    @Property(label = "Package Node Filters", description = "The package node path filters. Filter format: path|+include|-exclude", cardinality = 100)
-    private static final String PACKAGE_FILTERS = "package.filters";
-
-    /**
-     * Package property filters
-     */
-    @Property(label = "Package Property Filters", description = "The package property path filters. Filter format: path|+include|-exclude",
-            unbounded = PropertyUnbounded.ARRAY, value = {})
-    private static final String PROPERTY_FILTERS = "property.filters";
-
-    private MonitoringDistributionPackageBuilder packageBuilder;
-
-    private ServiceRegistration<Runnable> packageCleanup = null;
-
     @Activate
     public void activate(BundleContext context,
-                         Map<String, Object> config) {
+                         Config conf) {
 
-        String[] nodeFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PACKAGE_FILTERS), null));
-        String[] propertyFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PROPERTY_FILTERS), null));
-        String persistenceType = PropertiesUtil.toString(config.get(PERSISTENCE), null);
-        String tempFsFolder = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(TEMP_FS_FOLDER), null));
-        String digestAlgorithm = PropertiesUtil.toString(config.get(DIGEST_ALGORITHM), DEFAULT_DIGEST_ALGORITHM);
-        long cleanupDelay = PropertiesUtil.toLong(config.get(PACKAGE_CLEANUP_DELAY), DEFAULT_PACKAGE_CLEANUP_DELAY);
+        String[] nodeFilters = SettingsUtils.removeEmptyEntries(conf.package_filters());
+        String[] propertyFilters = SettingsUtils.removeEmptyEntries(conf.property_filters());
+        String persistenceType = conf.type();
+        String tempFsFolder = SettingsUtils.removeEmptyEntry(conf.tempFsFolder());
+        String digestAlgorithm = conf.digestAlgorithm();
+        long cleanupDelay = conf.cleanupDelay();
         if (DEFAULT_DIGEST_ALGORITHM.equals(digestAlgorithm)) {
             digestAlgorithm = null;
         }
@@ -213,10 +177,10 @@
         } else if ("inmemory".equals(persistenceType)) {
             wrapped = new InMemoryDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, nodeFilters, propertyFilters);
         } else {
-            final int fileThreshold = PropertiesUtil.toInteger(config.get(FILE_THRESHOLD), DEFAULT_FILE_THRESHOLD_VALUE);
-            String memoryUnitName = PropertiesUtil.toString(config.get(MEMORY_UNIT), DEFAULT_MEMORY_UNIT);
+            final int fileThreshold = conf.fileThreshold();
+            String memoryUnitName = conf.memoryUnit();
             final MemoryUnit memoryUnit = MemoryUnit.valueOf(memoryUnitName);
-            final boolean useOffHeapMemory = PropertiesUtil.toBoolean(config.get(USE_OFF_HEAP_MEMORY), DEFAULT_USE_OFF_HEAP_MEMORY);
+            final boolean useOffHeapMemory = conf.useOffHeapMemory();
             ResourceDistributionPackageBuilder resourceDistributionPackageBuilder = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm, nodeFilters, propertyFilters);
             Runnable cleanup = new ResourceDistributionPackageCleanup(resolverFactory, resourceDistributionPackageBuilder);
             Dictionary<String, Object> props = new Hashtable<String, Object>();
@@ -226,7 +190,7 @@
             wrapped = resourceDistributionPackageBuilder;
         }
 
-        int monitoringQueueSize = PropertiesUtil.toInteger(config.get(MONITORING_QUEUE_SIZE), DEFAULT_MONITORING_QUEUE_SIZE);
+        int monitoringQueueSize = conf.monitoringQueueSize();
         packageBuilder = new MonitoringDistributionPackageBuilder(monitoringQueueSize, wrapped, context);
     }
 
diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
index 0b561c0..05c888f 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
@@ -18,17 +18,14 @@
  */
 package org.apache.sling.distribution.serialization.impl.vlt;
 
-import org.apache.felix.scr.annotations.*;
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
 import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
 import org.apache.jackrabbit.vault.packaging.Packaging;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.monitor.impl.MonitoringDistributionPackageBuilder;
 import org.apache.sling.distribution.packaging.DistributionPackage;
@@ -44,183 +41,141 @@
 import org.jetbrains.annotations.Nullable;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 
 import java.io.InputStream;
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.LinkedHashMap;
 import java.util.Map;
 /**
  * A package builder for Apache Jackrabbit FileVault based implementations.
  */
-@Component(metatype = true,
-        label = "Apache Sling Distribution Packaging - Vault Package Builder Factory",
-        description = "OSGi configuration for vault package builders",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionPackageBuilder.class)
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Builder name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionPackageBuilder.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Builder name: {name}"
+        })
+@Designate(ocd=VaultDistributionPackageBuilderFactory.Config.class, factory=true)
 public class VaultDistributionPackageBuilderFactory implements DistributionPackageBuilder {
-
-    /**
-     * name of this package builder.
-     */
-    @Property(label = "Name", description = "The name of the package builder.")
-    private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-
-    /**
-     * type of this package builder.
-     */
-    @Property(options = {
-            @PropertyOption(name = "jcrvlt",
-                    value = "jcr packages"
-            ),
-            @PropertyOption(name = "filevlt",
-                    value = "file packages"
-            ),
-            @PropertyOption(name = "inmemory",
-                    value = "in memory packages"
-            )},
-            value = "jcrvlt", label = "type", description = "The type of this package builder")
-    private static final String TYPE = DistributionComponentConstants.PN_TYPE;
-
-
-    /**
-     * import mode property for file vault package builder
-     */
-    @Property(label = "Import Mode", description = "The vlt import mode for created packages.")
-    private static final String IMPORT_MODE = "importMode";
-
-    /**
-     * ACL handling property for file vault package builder
-     */
-    @Property(label = "Acl Handling", description = "The vlt acl handling mode for created packages.")
-    private static final String ACL_HANDLING = "aclHandling";
-
-    /**
-     * CUG handling property for file vault package builder
-     */
-    @Property(label = "Cug Handling", description = "The vlt cug handling mode for created packages.")
-    private static final String CUG_HANDLING = "cugHandling";
-
-    /**
-     * Package roots
-     */
-    @Property(label = "Package Roots", description = "The package roots to be used for created packages. (this is useful for assembling packages with an user that cannot read above the package root)")
-    private static final String PACKAGE_ROOTS = "package.roots";
-
-    /**
-     * Package node filters
-     */
-    @Property(label = "Package Node Filters", description = "The package node path filters. Filter format: path|+include|-exclude", cardinality = 100)
-    private static final String PACKAGE_FILTERS = "package.filters";
-
-    /**
-     * Package property filters
-     */
-    @Property(label = "Package Property Filters", description = "The package property path filters. Filter format: path|+include|-exclude",
-            unbounded = PropertyUnbounded.ARRAY, value = {})
-    private static final String PROPERTY_FILTERS = "property.filters";
-
-    /**
-     * Temp file folder
-     */
-    @Property(label = "Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
-    private static final String TEMP_FS_FOLDER = "tempFsFolder";
-
-    @Property(label = "Use Binary References", description = "If activated, it avoids sending binaries in the distribution package.", boolValue = false)
-    public static final String USE_BINARY_REFERENCES = "useBinaryReferences";
-
-    @Property(label = "Autosave threshold", description = "The value after which autosave is triggered for intermediate changes.", intValue = -1)
-    public static final String AUTOSAVE_THRESHOLD = "autoSaveThreshold";
-
+    
+    @ObjectClassDefinition(name="pache Sling Distribution Packaging - Vault Package Builder Factory",
+            description = "OSGi configuration for vault package builders")
+    public @interface Config {
+        @AttributeDefinition(name="name",description = "The name of the package builder.")
+        String name();
+        @AttributeDefinition(options = {
+                @Option(label = "jcrvlt", value = "jcr packages"),
+                @Option(label = "filevlt",value = "file packages"),
+                @Option(label = "inmemory",value = "in memory packages")},
+                name = "type", description = "The type of this package builder")
+        String type() default "jcrvlt";
+        @AttributeDefinition(name="Import Mode", description = "The vlt import mode for created packages.")
+        String importMode();
+        @AttributeDefinition(name="Acl Handling", description = "The vlt acl handling mode for created packages.")
+        String aclHandling();
+        @AttributeDefinition(name="Cug Handling", description = "The vlt cug handling mode for created packages.")
+        String cugHandling();
+        @AttributeDefinition(name="Package Roots", description = "The package roots to be used for created packages. "
+                + "(this is useful for assembling packages with an user that cannot read above the package root)")
+        String[] package_roots();
+        
+        @AttributeDefinition(name="Package Node Filters", 
+                description = "The package node path filters. Filter format: path|+include|-exclude", 
+                cardinality = 100)
+        String[] package_filters();
+        
+        @AttributeDefinition(name="Package Property Filters", 
+                description = "The package property path filters. Filter format: path|+include|-exclude")
+        String[] property_filters();
+        
+        @AttributeDefinition(name="Temp Filesystem Folder", 
+                description = "The filesystem folder where the temporary files should be saved.")
+        String tempFsFolder();
+        
+        @AttributeDefinition(name="Use Binary References", 
+                description = "If activated, it avoids sending binaries in the distribution package.")
+        boolean useBinaryReferences() default false;
+        
+        @AttributeDefinition(name="Autosave threshold", description = "The value after which autosave is triggered for intermediate changes.")
+        int autoSaveThreshold() default -1;
+        
+        @AttributeDefinition(
+                name = "The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
+                description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
+                        "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default")
+        long cleanupDelay() default DEFAULT_PACKAGE_CLEANUP_DELAY;
+        
+        @AttributeDefinition(
+                name = "File threshold (in bytes)",
+                description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.")
+        int fileThreshold() default DEFAULT_FILE_THRESHOLD_VALUE;
+        
+        @AttributeDefinition(
+                name = "The memory unit for the file threshold",
+                description = "The memory unit for the file threshold, Megabytes by default",
+                options = {
+                        @Option(label = "BYTES", value = "Bytes"),
+                        @Option(label = "KILO_BYTES", value = "Kilobytes"),
+                        @Option(label = "MEGA_BYTES", value = "Megabytes"),
+                        @Option(label = "GIGA_BYTES", value = "Gigabytes")
+                })
+        String MEGA_BYTES() default DEFAULT_MEMORY_UNIT;
+        
+        @AttributeDefinition(
+                name = "Flag to enable/disable the off-heap memory",
+                description = "Flag to enable/disable the off-heap memory, false by default")
+        boolean useOffHeapMemory() default DEFAULT_USE_OFF_HEAP_MEMORY;
+        
+        @AttributeDefinition(
+                name = "The digest algorithm to calculate the package checksum",
+                description = "The digest algorithm to calculate the package checksum, Megabytes by default",
+                options = {
+                        @Option(label = DEFAULT_DIGEST_ALGORITHM, value = "Do not send digest"),
+                        @Option(label = "MD2", value = "md2"),
+                        @Option(label = "MD5", value = "md5"),
+                        @Option(label = "SHA-1", value = "sha1"),
+                        @Option(label = "SHA-256", value = "sha256"),
+                        @Option(label = "SHA-384", value = "sha384"),
+                        @Option(label = "SHA-512", value = "sha512")
+                })
+        String digestAlgorithm() default DEFAULT_DIGEST_ALGORITHM;
+        
+        @AttributeDefinition(
+                name = "The number of items for monitoring distribution packages creation/installation",
+                description = "The number of items for monitoring distribution packages creation/installation, 100 by default")
+        int monitoringQueueSize() default DEFAULT_MONITORING_QUEUE_SIZE;
+        
+        @AttributeDefinition(cardinality = 100,
+                name = "Paths mapping",
+                description = "List of paths that require be mapped." +
+                "The format is {sourcePattern}={destinationPattern}, e.g. /etc/(.*)=/var/$1/some or simply /data=/bak")
+        String[] pathsMapping();
+        
+        @AttributeDefinition(
+                name = "Install a content package in a strict mode",
+                description = "Flag to mark an error response will be thrown, if a content package will incorrectly installed")
+        boolean strictImport() default DEFAULT_STRICT_IMPORT_SETTINGS;
+    }
+    
     private static final long DEFAULT_PACKAGE_CLEANUP_DELAY = 60L;
-
-    @Property(
-            label = "The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
-            description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
-                    "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default",
-            longValue = DEFAULT_PACKAGE_CLEANUP_DELAY
-    )
-    private static final String PACKAGE_CLEANUP_DELAY = "cleanupDelay";
-
     // 1M
     private static final int DEFAULT_FILE_THRESHOLD_VALUE = 1;
-
-    @Property(
-            label = "File threshold (in bytes)",
-            description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.",
-            intValue = DEFAULT_FILE_THRESHOLD_VALUE
-    )
-    public static final String FILE_THRESHOLD = "fileThreshold";
-
     private static final String DEFAULT_MEMORY_UNIT = "MEGA_BYTES";
-
-    @Property(
-            label = "The memory unit for the file threshold",
-            description = "The memory unit for the file threshold, Megabytes by default",
-            value = DEFAULT_MEMORY_UNIT,
-            options = {
-                    @PropertyOption(name = "BYTES", value = "Bytes"),
-                    @PropertyOption(name = "KILO_BYTES", value = "Kilobytes"),
-                    @PropertyOption(name = "MEGA_BYTES", value = "Megabytes"),
-                    @PropertyOption(name = "GIGA_BYTES", value = "Gigabytes")
-            }
-    )
-    private static final String MEMORY_UNIT = "MEGA_BYTES";
-
     private static final boolean DEFAULT_USE_OFF_HEAP_MEMORY = false;
-
-    @Property(
-            label = "Flag to enable/disable the off-heap memory",
-            description = "Flag to enable/disable the off-heap memory, false by default",
-            boolValue = DEFAULT_USE_OFF_HEAP_MEMORY
-    )
-    public static final String USE_OFF_HEAP_MEMORY = "useOffHeapMemory";
-
     private static final String DEFAULT_DIGEST_ALGORITHM = "NONE";
-
-    @Property(
-            label = "The digest algorithm to calculate the package checksum",
-            description = "The digest algorithm to calculate the package checksum, Megabytes by default",
-            value = DEFAULT_DIGEST_ALGORITHM,
-            options = {
-                    @PropertyOption(name = DEFAULT_DIGEST_ALGORITHM, value = "Do not send digest"),
-                    @PropertyOption(name = "MD2", value = "md2"),
-                    @PropertyOption(name = "MD5", value = "md5"),
-                    @PropertyOption(name = "SHA-1", value = "sha1"),
-                    @PropertyOption(name = "SHA-256", value = "sha256"),
-                    @PropertyOption(name = "SHA-384", value = "sha384"),
-                    @PropertyOption(name = "SHA-512", value = "sha512")
-            }
-    )
-    private static final String DIGEST_ALGORITHM = "digestAlgorithm";
-
     private static final int DEFAULT_MONITORING_QUEUE_SIZE = 0;
-
-    @Property(
-            label = "The number of items for monitoring distribution packages creation/installation",
-            description = "The number of items for monitoring distribution packages creation/installation, 100 by default",
-            intValue = DEFAULT_MONITORING_QUEUE_SIZE
-    )
-    private static final String MONITORING_QUEUE_SIZE = "monitoringQueueSize";
-
-    @Property(cardinality = 100,
-              label = "Paths mapping",
-              description = "List of paths that require be mapped." +
-              "The format is {sourcePattern}={destinationPattern}, e.g. /etc/(.*)=/var/$1/some or simply /data=/bak")
-    private static final String PATHS_MAPPING = "pathsMapping";
-
     private static final boolean DEFAULT_STRICT_IMPORT_SETTINGS = true;
 
-    @Property(
-        label = "Install a content package in a strict mode",
-        description = "Flag to mark an error response will be thrown, if a content package will incorrectly installed",
-        boolValue = DEFAULT_STRICT_IMPORT_SETTINGS
-    )
-    public static final String STRICT_IMPORT_SETTINGS = "strictImport";
 
     @Reference
     private Packaging packaging;
@@ -233,25 +188,25 @@
     private MonitoringDistributionPackageBuilder packageBuilder;
 
     @Activate
-    public void activate(BundleContext context, Map<String, Object> config) {
+    public void activate(BundleContext context, Config conf) {
 
-        String name = PropertiesUtil.toString(config.get(NAME), null);
-        String type = PropertiesUtil.toString(config.get(TYPE), null);
-        String importModeString = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(IMPORT_MODE), null));
-        String aclHandlingString = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(ACL_HANDLING), null));
-        String cugHandlingString = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(CUG_HANDLING), null));
+        String name = conf.name();
+        String type = conf.type();
+        String importModeString = SettingsUtils.removeEmptyEntry(conf.importMode());
+        String aclHandlingString = SettingsUtils.removeEmptyEntry(conf.aclHandling());
+        String cugHandlingString = SettingsUtils.removeEmptyEntry(conf.cugHandling());
 
-        String[] packageRoots = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PACKAGE_ROOTS), null));
-        String[] packageNodeFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PACKAGE_FILTERS), null));
-        String[] packagePropertyFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PROPERTY_FILTERS), null));
+        String[] packageRoots = SettingsUtils.removeEmptyEntries(conf.package_roots());
+        String[] packageNodeFilters = SettingsUtils.removeEmptyEntries(conf.package_filters());
+        String[] packagePropertyFilters = SettingsUtils.removeEmptyEntries(conf.property_filters());
 
-        long cleanupDelay = PropertiesUtil.toLong(config.get(PACKAGE_CLEANUP_DELAY), DEFAULT_PACKAGE_CLEANUP_DELAY);
+        long cleanupDelay = conf.cleanupDelay();
 
-        String tempFsFolder = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(TEMP_FS_FOLDER), null));
-        boolean useBinaryReferences = PropertiesUtil.toBoolean(config.get(USE_BINARY_REFERENCES), false);
-        int autosaveThreshold = PropertiesUtil.toInteger(config.get(AUTOSAVE_THRESHOLD), -1);
+        String tempFsFolder = SettingsUtils.removeEmptyEntry(conf.tempFsFolder());
+        boolean useBinaryReferences = conf.useBinaryReferences();
+        int autosaveThreshold = conf.autoSaveThreshold();
 
-        String digestAlgorithm = PropertiesUtil.toString(config.get(DIGEST_ALGORITHM), DEFAULT_DIGEST_ALGORITHM);
+        String digestAlgorithm = conf.digestAlgorithm();
         if (DEFAULT_DIGEST_ALGORITHM.equals(digestAlgorithm)) {
             digestAlgorithm = null;
         }
@@ -272,10 +227,10 @@
         }
 
         // check the mount path patterns, if any
-        Map<String, String> pathsMapping = PropertiesUtil.toMap(config.get(PATHS_MAPPING), new String[0]);
+        Map<String, String> pathsMapping = toMap(conf.pathsMapping(), new String[0]);
         pathsMapping = SettingsUtils.removeEmptyEntries(pathsMapping);
 
-        boolean strictImport = PropertiesUtil.toBoolean(config.get(STRICT_IMPORT_SETTINGS), DEFAULT_STRICT_IMPORT_SETTINGS);
+        boolean strictImport = conf.strictImport();
 
         DistributionContentSerializer contentSerializer = new FileVaultContentSerializer(name, packaging, importMode, aclHandling, cugHandling,
                 packageRoots, packageNodeFilters, packagePropertyFilters, useBinaryReferences, autosaveThreshold, pathsMapping, strictImport);
@@ -286,10 +241,10 @@
         } else if ("inmemory".equals(type)) {
             wrapped = new InMemoryDistributionPackageBuilder(name, contentSerializer, packageNodeFilters, packagePropertyFilters);
         } else {
-            final int fileThreshold = PropertiesUtil.toInteger(config.get(FILE_THRESHOLD), DEFAULT_FILE_THRESHOLD_VALUE);
-            String memoryUnitName = PropertiesUtil.toString(config.get(MEMORY_UNIT), DEFAULT_MEMORY_UNIT);
+            final int fileThreshold = conf.fileThreshold();
+            String memoryUnitName = conf.MEGA_BYTES();
             final MemoryUnit memoryUnit = MemoryUnit.valueOf(memoryUnitName);
-            final boolean useOffHeapMemory = PropertiesUtil.toBoolean(config.get(USE_OFF_HEAP_MEMORY), DEFAULT_USE_OFF_HEAP_MEMORY);
+            final boolean useOffHeapMemory = conf.useOffHeapMemory();
             ResourceDistributionPackageBuilder resourceDistributionPackageBuilder = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm, packageNodeFilters, packagePropertyFilters);
             Runnable cleanup = new ResourceDistributionPackageCleanup(resolverFactory, resourceDistributionPackageBuilder);
             Dictionary<String, Object> props = new Hashtable<String, Object>();
@@ -300,7 +255,7 @@
             wrapped = resourceDistributionPackageBuilder;
         }
 
-        int monitoringQueueSize = PropertiesUtil.toInteger(config.get(MONITORING_QUEUE_SIZE), DEFAULT_MONITORING_QUEUE_SIZE);
+        int monitoringQueueSize = conf.monitoringQueueSize();
         packageBuilder = new MonitoringDistributionPackageBuilder(monitoringQueueSize, wrapped, context);
     }
 
@@ -340,4 +295,48 @@
     public DistributionPackageInfo installPackage(@NotNull ResourceResolver resourceResolver, @NotNull InputStream stream) throws DistributionException {
         return packageBuilder.installPackage(resourceResolver, stream);
     }
+    
+    
+   /**
+    * (taken and adjusted from PropertiesUtil, because the handy toMap() function is not available as
+    * part of the metatype functionality
+    * 
+    * @param propValue The object to convert.
+    * @param defaultArray The default array converted to map.
+    * @return Map value
+    */
+   private static Map<String, String> toMap(String[] values, String[] defaultArray) {
+
+       if (values == null) {
+           values = defaultArray;
+       }
+
+       //in property values
+       Map<String, String> result = new LinkedHashMap<String, String>();
+       for (String kv : values) {
+           int indexOfEqual = kv.indexOf('=');
+           if (indexOfEqual > 0) {
+               String key = trimToNull(kv.substring(0, indexOfEqual));
+               String value = trimToNull(kv.substring(indexOfEqual + 1));
+               if (key != null) {
+                   result.put(key, value);
+               }
+           }
+       }
+       return result;
+   }
+   
+   private static String trimToNull(String str)    {
+       String ts = trim(str);
+       return isEmpty(ts) ? null : ts;
+   }
+   
+   private static String trim(String str){
+       return str == null ? null : str.trim();
+   }
+   
+   private static boolean isEmpty(String str){
+       return str == null || str.length() == 0;
+   }
+    
 }
diff --git a/src/main/java/org/apache/sling/distribution/serialization/package-info.java b/src/main/java/org/apache/sling/distribution/serialization/package-info.java
index 6832ef7..653beb5 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/package-info.java
@@ -20,5 +20,4 @@
 @Version("0.1.1")
 package org.apache.sling.distribution.serialization;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java
index 33880a3..66397eb 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java
@@ -18,6 +18,12 @@
  */
 package org.apache.sling.distribution.servlet;
 
+import static java.lang.String.format;
+import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
+
+import java.io.IOException;
+import java.util.Collection;
+
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -25,38 +31,30 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.Collection;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static java.lang.String.format;
-import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
-
 /**
  * {@link Filter} to avoid creation of duplicate agents.
  */
-@Component(immediate = true, metatype = false)
-@Service(value = Filter.class)
-@Properties({
-        @Property(name = "service.description", value = "Duplicate replication agents IDs checking Filter"),
-        @Property(name = "service.vendor", value = "The Apache Software Foundation"),
-        @Property(name = "sling.filter.scope", value = "request"),
-        @Property(name = "sling.filter.pattern", value = "/libs/sling/distribution/settings/agents/.*"),
-        @Property(name = "osgi.http.whiteboard.filter.regex", value = "/libs/sling/distribution/settings/agents/.*"),
-        @Property(name = "service.ranking", intValue = Integer.MAX_VALUE)
-})
+@Component(immediate = true, service=Filter.class,
+        property= {
+                "service.description=Duplicate replication agents IDs checking Filter",
+                "service.vendor=The Apache Software Foundation",
+                "sling.filter.scope=request",
+                "sling.filter.pattern=/libs/sling/distribution/settings/agents/.*",
+                "osgi.http.whiteboard.filter.regex=/libs/sling/distribution/settings/agents/.*",
+                "service.ranking="+ Integer.MAX_VALUE
+                
+        })
 public final class DistributionAgentCreationFilter implements Filter {
 
     private static final String METHOD_POST = "POST";
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java
index 1e2e485..fc84383 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java
@@ -18,19 +18,22 @@
  */
 package org.apache.sling.distribution.servlet;
 
-import javax.servlet.ServletException;
 import java.io.IOException;
 import java.io.PrintWriter;
 
-import org.apache.felix.scr.annotations.sling.SlingServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.servlets.SlingAllMethodsServlet;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.log.spi.DistributionLog;
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
 import org.apache.sling.distribution.util.RequestUtils;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,8 +41,12 @@
  * Servlet to ask {@link DistributionAgent}s to distribute (via HTTP POST).
  */
 @SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.LOG_RESOURCE_TYPE, methods = "GET", extensions = "txt")
-public class DistributionAgentLogServlet extends SlingAllMethodsServlet {
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+        methods = {"GET"},
+        resourceTypes = {DistributionResourceTypes.LOG_RESOURCE_TYPE}, 
+        extensions = {"txt"})
+public class DistributionAgentLogServlet extends SlingSafeMethodsServlet {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
index 104fe19..7513960 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
@@ -18,14 +18,18 @@
  */
 package org.apache.sling.distribution.servlet;
 
-import javax.servlet.ServletException;
+import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.APPENDABLE;
+import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.CLEARABLE;
+import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.REMOVABLE;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -33,27 +37,29 @@
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.packaging.DistributionPackage;
+import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
 import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
 import org.apache.sling.distribution.packaging.impl.DistributionPackageUtils;
-import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
 import org.apache.sling.distribution.queue.DistributionQueueItem;
+import org.apache.sling.distribution.queue.spi.DistributionQueue;
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
-import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.REMOVABLE;
-import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.CLEARABLE;
-import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.APPENDABLE;
-
 /**
  * Servlet to retrieve a {@link DistributionQueue} status.
  */
 @SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.AGENT_QUEUE_RESOURCE_TYPE, methods = {"POST"})
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+        methods = {"POST"},
+        resourceTypes = {DistributionResourceTypes.AGENT_QUEUE_RESOURCE_TYPE})
 public class DistributionAgentQueueServlet extends SlingAllMethodsServlet {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java
index edada7c..98acf36 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java
@@ -18,10 +18,10 @@
  */
 package org.apache.sling.distribution.servlet;
 
+import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import java.io.IOException;
 
-import org.apache.felix.scr.annotations.sling.SlingServlet;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -31,6 +31,8 @@
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
 import org.apache.sling.distribution.util.RequestUtils;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,7 +40,10 @@
  * Servlet to ask {@link DistributionAgent}s to distribute (via HTTP POST).
  */
 @SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.AGENT_RESOURCE_TYPE, methods = "POST")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+        methods = {"POST"},
+        resourceTypes = {DistributionResourceTypes.AGENT_RESOURCE_TYPE})
 public class DistributionAgentServlet extends SlingAllMethodsServlet {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
index 88f6834..59ccdd3 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.distribution.servlet;
 
+import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -25,7 +26,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
 import org.apache.http.entity.ContentType;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
@@ -40,6 +40,8 @@
 import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
 import org.apache.sling.distribution.util.RequestUtils;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +49,10 @@
  * Servlet to handle fetching of distribution content.
  */
 @SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.EXPORTER_RESOURCE_TYPE, methods = "POST")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+        methods = {"POST"},
+        resourceTypes = {DistributionResourceTypes.EXPORTER_RESOURCE_TYPE})
 public class DistributionPackageExporterServlet extends SlingAllMethodsServlet {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java
index 85ead70..dad37de 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java
@@ -30,9 +30,9 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 
-import org.apache.felix.scr.annotations.sling.SlingServlet;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -40,6 +40,8 @@
 import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
 import org.apache.sling.distribution.packaging.DistributionPackageInfo;
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +49,10 @@
  * Servlet to handle reception of distribution content.
  */
 @SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.IMPORTER_RESOURCE_TYPE, methods = "POST")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+        methods = {"POST"},
+        resourceTypes = {DistributionResourceTypes.IMPORTER_RESOURCE_TYPE})
 public class DistributionPackageImporterServlet extends SlingAllMethodsServlet {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
index 7430dba..38fc007 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
@@ -18,12 +18,12 @@
  */
 package org.apache.sling.distribution.servlet;
 
+import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Arrays;
 
-import org.apache.felix.scr.annotations.sling.SlingServlet;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -34,8 +34,10 @@
 import org.apache.sling.distribution.resources.DistributionResourceTypes;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,7 +45,11 @@
  * Triggers Server Sent Events servlet
  */
 @SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.TRIGGER_RESOURCE_TYPE, extensions = "event", methods = "GET")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+        methods = {"GET"},
+        resourceTypes = {DistributionResourceTypes.TRIGGER_RESOURCE_TYPE},
+        extensions = {"event"})
 public class DistributionTriggerServlet extends SlingAllMethodsServlet {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java b/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
index 3d57e44..663ed2e 100644
--- a/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
+++ b/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
@@ -30,9 +30,7 @@
 import org.apache.http.client.fluent.Request;
 import org.apache.http.client.fluent.Response;
 import org.apache.http.conn.HttpHostConnectException;
-import org.apache.http.entity.BufferedHttpEntity;
 import org.apache.http.entity.ContentType;
-import org.apache.http.entity.InputStreamEntity;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.protocol.HTTP;
 import org.apache.sling.api.resource.ResourceResolver;
diff --git a/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java b/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java
index f6b879e..1affcb5 100644
--- a/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java
+++ b/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java
@@ -27,42 +27,43 @@
 
 import javax.management.ObjectName;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.monitor.impl.UserCredentialsDistributionTransportSecretMBean;
 import org.apache.sling.distribution.monitor.impl.UserCredentialsDistributionTransportSecretMBeanImpl;
 import org.apache.sling.distribution.transport.DistributionTransportSecret;
 import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.AttributeType;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Transport Credentials - User Credentials based DistributionTransportSecretProvider",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionTransportSecretProvider.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Secret provider name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTransportSecretProvider.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Secret provider name: {name}"
+        })
+@Designate(ocd=UserCredentialsDistributionTransportSecretProvider.Config.class, factory = true)
 public class UserCredentialsDistributionTransportSecretProvider implements
         DistributionTransportSecretProvider {
-
-    /**
-     * name of this component.
-     */
-    @Property(label = "Name")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    @Property(label = "User Name", description = "The name of the user used to perform remote actions.")
-    private final static String USERNAME = "username";
-
-    @Property(passwordValue = "", label = "Password", description = "The clear text password to perform authentication. Warning: storing clear text passwords is not safe.")
-    private final static String PASSWORD = "password";
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Transport Credentials - User Credentials based DistributionTransportSecretProvider")
+    public @interface Config {
+        @AttributeDefinition(name="Name")
+        String name();
+        
+        @AttributeDefinition(name="User Name", description = "The name of the user used to perform remote actions.")
+        String username();
+        
+        @AttributeDefinition(type = AttributeType.PASSWORD, name="Password", 
+                description = "The clear text password to perform authentication. Warning: storing clear text passwords is not safe.")
+        String password();
+    }
 
     private String username;
     private String password;
@@ -70,9 +71,9 @@
     private ServiceRegistration<UserCredentialsDistributionTransportSecretMBean> mbeanServiceRegistration;
 
     @Activate
-    protected void activate(BundleContext context, Map<String, Object> config) {
-        username = PropertiesUtil.toString(config.get(USERNAME), "").trim();
-        password = PropertiesUtil.toString(config.get(PASSWORD), "").trim();
+    protected void activate(BundleContext context, Config conf) {
+        username = conf.username().trim();
+        password = conf.password().trim();
 
         String id = String.valueOf(username.hashCode());
 
@@ -97,8 +98,8 @@
         return new DistributionTransportSecret() {
             public Map<String, String> asCredentialsMap() {
                 Map<String, String> map = new HashMap<String, String>();
-                map.put(USERNAME, username);
-                map.put(PASSWORD, password);
+                map.put("username", username);
+                map.put("password", password);
                 return Collections.unmodifiableMap(map);
             }
         };
diff --git a/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java b/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
index a84b579..a1bf41f 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
@@ -18,12 +18,12 @@
  */
 package org.apache.sling.distribution.trigger;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.component.impl.DistributionComponentKind;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * An handler for {@link org.apache.sling.distribution.DistributionRequest}s passed to a
diff --git a/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java b/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java
index fa4a7ed..ae8ee4a 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java
@@ -18,9 +18,9 @@
  */
 package org.apache.sling.distribution.trigger;
 
-import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.distribution.common.DistributionException;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
 
 /**
  * A {@link DistributionTrigger} is responsible to trigger
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java
index b90b715..11d2f0d 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java
@@ -18,48 +18,42 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Trigger - Distribution Event Triggers Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTrigger.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Trigger name: {name}"    
+        })
+@Designate(ocd=DistributionEventDistributeDistributionTriggerFactory.Config.class, factory = true)
 public class DistributionEventDistributeDistributionTriggerFactory implements DistributionTrigger {
-
-    @Property(label = "Name", description = "The name of the trigger.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * chain distribution path property
-     */
-    @Property(label = "Path", description = "The path for which the distribution events will be forwarded.")
-    private static final String PATH = "path";
-
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Distribution Event Triggers Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name",description = "The name of the trigger.")
+        String name();
+        @AttributeDefinition(name="Path", description = "The path for which the distribution events will be forwarded.")
+        String path();
+    }
 
     private DistributionEventDistributeDistributionTrigger trigger;
 
 
     @Activate
-    public void activate(BundleContext bundleContext, Map<String, Object> config) {
-        String path = PropertiesUtil.toString(config.get(PATH), null);
-
+    public void activate(BundleContext bundleContext, Config conf) {
+        String path = conf.path();
         trigger = new DistributionEventDistributeDistributionTrigger(path, bundleContext);
     }
 
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
index fa0914d..6213d45 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
@@ -18,65 +18,49 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
-import java.util.Map;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-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.Service;
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Trigger - Jcr Event Triggers Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE,
-        description = "Triggers a distribution request ('ADD', 'DELETE') " +
-                "for the given path (path) whenever the JCR node at the given path is modified (added, resp. removed)."
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name} on path {path}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTrigger.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Trigger name: {name} on path {path}"
+        })
+@Designate(ocd=JcrEventDistributionTriggerFactory.Config.class, factory = true)
 public class JcrEventDistributionTriggerFactory implements DistributionTrigger {
 
-
-    @Property(label = "Name", description = "The name of the trigger.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * jcr event trigger path property
-     */
-    @Property(label = "Path", description = "The path for which changes are distributed.")
-    private static final String PATH = "path";
-
-    /**
-     * jcr event trigger path property
-     */
-    @Property(cardinality = 100, label = "Ignored Paths Patterns", description = "The paths matching one of these patterns will be ignored.")
-    private static final String IGNORED_PATHS_PATTERNS = "ignoredPathsPatterns";
-
-    /**
-     * jcr event trigger service user property
-     */
-    @Property(label = "Service Name", description = "The service used to listen for jcr events")
-    private static final String SERVICE_NAME = "serviceName";
-
-    /**
-     * use deep distribution
-     */
-    @Property(label = "Use deep distribution", description = "Distribute entire subtree of the event node path. Default is 'false'.", boolValue = false)
-    private static final String DEEP = "deep";
+    @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Jcr Event Triggers Factory",
+            description = "Triggers a distribution request ('ADD', 'DELETE') " +
+                    "for the given path (path) whenever the JCR node at the given path is modified (added, resp. removed).")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the trigger.")
+        String name();
+        @AttributeDefinition(name="Name", description = "The path for which changes are distributed.")
+        String path();
+        @AttributeDefinition(cardinality = 100, 
+                name = "Ignored Paths Patterns", 
+                description = "The paths matching one of these patterns will be ignored.")
+        String[] ignoredPathsPatterns();
+        @AttributeDefinition(name="Service Name", description = "The service used to listen for jcr events")
+        String serviceName();
+        @AttributeDefinition(name="Use deep distribution", description = "Distribute entire subtree of the event node path. Default is 'false'.")
+        boolean deep() default false;
+    }
 
 
     private JcrEventDistributionTrigger trigger;
@@ -92,12 +76,12 @@
 
 
     @Activate
-    public void activate(Map<String, Object> config) {
-        String path = PropertiesUtil.toString(config.get(PATH), null);
-        String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
-        String[] ignoredPathsPatterns = PropertiesUtil.toStringArray(config.get(IGNORED_PATHS_PATTERNS), null);
+    public void activate(Config conf) {
+        String path = conf.path();
+        String serviceName = SettingsUtils.removeEmptyEntry(conf.serviceName());
+        String[] ignoredPathsPatterns = conf.ignoredPathsPatterns();
         ignoredPathsPatterns = SettingsUtils.removeEmptyEntries(ignoredPathsPatterns);
-        boolean deep = PropertiesUtil.toBoolean(config.get(DEEP), false);
+        boolean deep = conf.deep();
 
         trigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, deep, serviceName, ignoredPathsPatterns);
         trigger.enable();
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
index 5d71e5b..18b746e 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
@@ -18,18 +18,9 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-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.Service;
+
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
@@ -37,39 +28,35 @@
 import org.apache.sling.jcr.api.SlingRepository;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Trigger - Persisted Jcr Event Triggers Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTrigger.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Trigger name: {name}"    
+        })
+@Designate(ocd=PersistedJcrEventDistributionTriggerFactory.Config.class, factory = true)
 public class PersistedJcrEventDistributionTriggerFactory implements DistributionTrigger {
 
-
-    @Property(label = "Name", description = "The name of the trigger.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-
-    /**
-     * jcr persisting event trigger path property
-     */
-    @Property(label = "Path", description = "The path for which changes are listened and distributed as persisted nugget events.")
-    private static final String PATH = "path";
-
-    /**
-     * jcr persisting event trigger service user property
-     */
-    @Property(label = "Service Name", description = "The service used to listen for jcr events")
-    private static final String SERVICE_NAME = "serviceName";
-
-    /**
-     * jcr persisting event trigger nuggets path property
-     */
-    @Property(value = PersistedJcrEventDistributionTrigger.DEFAULT_NUGGETS_PATH, label = "Nuggets Path", description = "The location where serialization of jcr events will be stored")
-    private static final String NUGGETS_PATH = "nuggetsPath";
+    @ObjectClassDefinition(name = "Apache Sling Distribution Trigger - Persisted Jcr Event Triggers Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the trigger.")
+        String name();
+        @AttributeDefinition(name="Name", description = "The path for which changes are listened and distributed as persisted nugget events.")
+        String path();
+        @AttributeDefinition(name="Service Name", description = "The service used to listen for jcr events")
+        String serviceName();
+        @AttributeDefinition(name="Nuggets Path", description = "The location where serialization of jcr events will be stored")
+        String nuggetsPath() default PersistedJcrEventDistributionTrigger.DEFAULT_NUGGETS_PATH;
+    }
 
 
     private PersistedJcrEventDistributionTrigger trigger;
@@ -85,11 +72,11 @@
 
 
     @Activate
-    public void activate(BundleContext bundleContext, Map<String, Object> config) {
+    public void activate(BundleContext bundleContext, Config conf) {
 
-        String path = PropertiesUtil.toString(config.get(PATH), null);
-        String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
-        String nuggetsPath = PropertiesUtil.toString(config.get(NUGGETS_PATH), null);
+        String path = conf.path();
+        String serviceName = SettingsUtils.removeEmptyEntry(conf.serviceName());
+        String nuggetsPath = conf.nuggetsPath();
 
         trigger = new PersistedJcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
         trigger.enable();
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java
index 05d591a..41a1fd3 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java
@@ -18,46 +18,42 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-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.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Trigger - Remote Event Triggers Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTrigger.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+        }
 )
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Designate(ocd=RemoteEventDistributionTriggerFactory.Config.class)
 public class RemoteEventDistributionTriggerFactory implements DistributionTrigger {
+    
+    @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Remote Event Triggers Factory")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the trigger.")
+        String name();
+        @AttributeDefinition(name="Endpoint", description = "The endpoint from which the remote requests should be polled.")
+        String endpoint();
+        @AttributeDefinition()
+        String transportSecretProvider_target();
+    }
 
-
-    @Property(label = "Name", description = "The name of the trigger.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * remote event endpoint property
-     */
-    @Property(label = "Endpoint", description = "The endpoint from which the remote requests should be polled.")
-    private static final String ENDPOINT = "endpoint";
-
-
-    @Property(name = "transportSecretProvider.target")
     @Reference(name = "transportSecretProvider")
     private
     DistributionTransportSecretProvider transportSecretProvider;
@@ -70,8 +66,8 @@
 
 
     @Activate
-    public void activate(BundleContext bundleContext, Map<String, Object> config) {
-        String endpoint = PropertiesUtil.toString(config.get(ENDPOINT), null);
+    public void activate(BundleContext bundleContext, Config conf) {
+        String endpoint = conf.endpoint();
         trigger = new RemoteEventDistributionTrigger(endpoint, transportSecretProvider, scheduler);
     }
 
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java
index 7a4c951..4bb3be6 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java
@@ -18,44 +18,40 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-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.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Trigger - Resource Event Triggers Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE,
-        description = "Triggers a distribution request ('ADD', 'DELETE') " +
-                "for the given path (path) whenever the resource at the given path is modified (added, resp. removed)."
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTrigger.class,
+        property= {
+                "webconsole.configurationFactory.nameHint=Trigger name: {name}"    
+        }
 )
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Designate(ocd=ResourceEventDistributionTriggerFactory.Config.class, factory=true)
 public class ResourceEventDistributionTriggerFactory implements DistributionTrigger {
 
-
-    @Property(label = "Name", description = "The name of the trigger.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * resource event path property
-     */
-    @Property(label = "Path", description = "The resource path for which changes are distributed")
-    private static final String PATH = "path";
+    @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Resource Event Triggers Factory",
+            description = "Triggers a distribution request ('ADD', 'DELETE') " +
+                    "for the given path (path) whenever the resource at the given path is modified (added, resp. removed).")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the trigger.")
+        String name();
+        @AttributeDefinition(name="Name", description = "The resource path for which changes are distributed")
+        String path();
+    }
 
     private ResourceEventDistributionTrigger trigger;
 
@@ -63,8 +59,8 @@
     private SlingRepository repository;
 
     @Activate
-    public void activate(BundleContext bundleContext, Map<String, Object> config) {
-        String path = PropertiesUtil.toString(config.get(PATH), null);
+    public void activate(BundleContext bundleContext, Config conf) {
+        String path = conf.path();
 
         trigger = new ResourceEventDistributionTrigger(path, bundleContext);
     }
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
index a0109d3..b6f5d97 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
@@ -18,62 +18,52 @@
  */
 package org.apache.sling.distribution.trigger.impl;
 
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-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.Service;
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.distribution.DistributionRequestType;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
 import org.apache.sling.distribution.common.DistributionException;
 import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(metatype = true,
-        label = "Apache Sling Distribution Trigger - Scheduled Triggers Factory",
-        configurationFactory = true,
-        specVersion = "1.1",
-        policy = ConfigurationPolicy.REQUIRE,
-        description = "Triggers a distribution request of the given type (action) " +
-                "for the given path (path) at a periodical time interval (seconds)."
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Component(
+        configurationPolicy = ConfigurationPolicy.REQUIRE,
+        service=DistributionTrigger.class,
+        property= {
+               "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+        })
+@Designate(ocd=ScheduledDistributionTriggerFactory.Config.class,factory=true)
 public class ScheduledDistributionTriggerFactory implements DistributionTrigger {
 
-
-    @Property(label = "Name", description = "The name of the trigger.")
-    public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-    /**
-     * scheduled trigger action property
-     */
-    @Property(label = "Distribution Type", description = "The type of the distribution request produced by this trigger in ('ADD', 'DELETE', 'PULL', 'TEST'). Default 'PULL'.")
-    private static final String ACTION = "action";
-
-    /**
-     * scheduled trigger path property
-     */
-    @Property(label = "Distributed Path", description = "The path to be distributed periodically.")
-    private static final String PATH = "path";
-
-    /**
-     * scheduled trigger seconds property
-     */
-    @Property(label = "Interval in Seconds", description = "The number of seconds between distribution requests. Default 30 seconds.")
-    private static final String SECONDS = "seconds";
-
-    @Property(label = "Service Name", description = "The name of the service used to trigger the distribution requests.")
-    private static final String SERVICE_NAME = "serviceName";
+    @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Scheduled Triggers Factory",
+            description = "Triggers a distribution request of the given type (action) " +
+                    "for the given path (path) at a periodical time interval (seconds).")
+    public @interface Config {
+        @AttributeDefinition(name="Name", description = "The name of the trigger.")
+        String name();
+        @AttributeDefinition(name="Distribution Type", description = "The type of the distribution request produced by "
+                + "this trigger in ('ADD', 'DELETE', 'PULL', 'TEST'). Default 'PULL'.")
+        String action();
+        @AttributeDefinition(name="Name", description = "The path to be distributed periodically.")
+        String path();
+        
+        @AttributeDefinition(name="Interval in Seconds", 
+                description = "The number of seconds between distribution requests. Default 30 seconds.")
+        int seconds() default 30;
+        
+        @AttributeDefinition(name="Service Name", description = "The name of the service used to trigger the distribution requests.")
+        String serviceName();
+    }
 
     private ScheduledDistributionTrigger trigger;
 
@@ -85,11 +75,16 @@
 
 
     @Activate
-    public void activate(BundleContext bundleContext, Map<String, Object> config) {
-        String action = PropertiesUtil.toString(config.get(ACTION), DistributionRequestType.PULL.name());
-        String path = PropertiesUtil.toString(config.get(PATH), null);
-        int interval = PropertiesUtil.toInteger(config.get(SECONDS), 30);
-        String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
+    public void activate(BundleContext bundleContext, Config conf) {
+        // Unfortunately we cannot make DistributionRequestType.PULL.name() a default value in the above annotation.
+        // see https://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from-a-constant-in-java
+        String action = conf.action();
+        if (action == null || action.isEmpty()) {
+            action = DistributionRequestType.PULL.name();
+        }
+        String path = conf.path();
+        int interval = conf.seconds();
+        String serviceName = SettingsUtils.removeEmptyEntry(conf.serviceName());
 
         trigger = new ScheduledDistributionTrigger(action, path, interval, serviceName, scheduler, resolverFactory);
     }
diff --git a/src/main/java/org/apache/sling/distribution/util/package-info.java b/src/main/java/org/apache/sling/distribution/util/package-info.java
index 01f959e..aa1d89a 100644
--- a/src/main/java/org/apache/sling/distribution/util/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/util/package-info.java
@@ -19,5 +19,5 @@
 
 @Version("0.1.1") package org.apache.sling.distribution.util;
 
-import aQute.bnd.annotation.Version;
+import  org.osgi.annotation.versioning.Version;
 
diff --git a/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java b/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java
index 3cbb9f3..a592a28 100644
--- a/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java
+++ b/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java
@@ -20,17 +20,22 @@
 
 import java.util.Collections;
 
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
+import org.junit.Rule;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
 public class DistributionComponentFactoryMapTest {
+    
+    @Rule
+    public final OsgiContext context = new OsgiContext();
 
     @Test
     public void testGetDefaultType() throws Exception {
         DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
-        dcfm.activate(Collections.<String,Object>emptyMap());
+        context.registerInjectActivateService(dcfm);
         String type = dcfm.getType(DistributionComponentKind.AGENT,
                 "org.apache.sling.distribution.agent.impl.SimpleDistributionAgentFactory");
         assertEquals("simple", type);
@@ -39,7 +44,7 @@
     @Test
     public void testGetDefaultFactoryPid() throws Exception {
         DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
-        dcfm.activate(Collections.<String,Object>emptyMap());
+        context.registerInjectActivateService(dcfm);
         String factoryPid = dcfm.getFactoryPid(DistributionComponentKind.AGENT, "simple");
         assertEquals("org.apache.sling.distribution.agent.impl.SimpleDistributionAgentFactory",
                 factoryPid);
@@ -48,7 +53,7 @@
     @Test
     public void testGetDefaultFactoryPids() throws Exception {
         DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
-        dcfm.activate(Collections.<String,Object>emptyMap());
+        context.registerInjectActivateService(dcfm);
         assertEquals(5, dcfm.getFactoryPids(DistributionComponentKind.AGENT).size());
     }
 
@@ -56,7 +61,7 @@
     public void testAddMapping() throws Exception {
         DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
         String customFactoryPid = "org.test.CustomAgentFactory";
-        dcfm.activate(Collections.<String, Object>singletonMap("mapping.agent", String.format("custom:%s", customFactoryPid)));
+        context.registerInjectActivateService(dcfm,Collections.<String, Object>singletonMap("mapping.agent", String.format("custom:%s", customFactoryPid)));
         assertEquals(6, dcfm.getFactoryPids(DistributionComponentKind.AGENT).size());
         String type = dcfm.getType(DistributionComponentKind.AGENT, customFactoryPid);
         assertEquals("custom", type);
@@ -66,7 +71,7 @@
     public void testAddWrongMapping() throws Exception {
         DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
         String customFactoryPid = "org.test.CustomAgentFactory";
-        dcfm.activate(Collections.<String, Object>singletonMap("mapping.agent", String.format("custom-%s", customFactoryPid)));
+        context.registerInjectActivateService(dcfm,Collections.<String, Object>singletonMap("mapping.agent", String.format("custom-%s", customFactoryPid)));
         assertEquals(5, dcfm.getFactoryPids(DistributionComponentKind.AGENT).size());
         String type = dcfm.getType(DistributionComponentKind.AGENT, customFactoryPid);
         assertNull(type);
diff --git a/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java b/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java
index 6b39611..08d01f8 100644
--- a/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java
+++ b/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java
@@ -27,10 +27,12 @@
 import org.apache.sling.distribution.agent.spi.DistributionAgent;
 import org.apache.sling.distribution.queue.DistributionQueueItemState;
 import org.apache.sling.distribution.queue.spi.DistributionQueue;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
 import org.apache.sling.distribution.queue.DistributionQueueItem;
 import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
 import org.apache.felix.hc.api.Result;
+import org.junit.Rule;
 import org.junit.Test;
 
 import static org.junit.Assert.assertFalse;
@@ -45,11 +47,14 @@
  * Testcase for {@link DistributionQueueHealthCheck}
  */
 public class DistributionQueueHealthCheckTest {
+    
+    @Rule
+    public final OsgiContext context = new OsgiContext();
 
     @Test
     public void testWithNoDistributionQueueProvider() throws Exception {
         DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
-        distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+        context.registerInjectActivateService(distributionQueueHealthCheck);
         Result result = distributionQueueHealthCheck.execute();
         assertNotNull(result);
         assertTrue(result.isOk());
@@ -59,7 +64,7 @@
     public void testWithNoItemInTheQueue() throws Exception {
         DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
 
-        distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+        context.registerInjectActivateService(distributionQueueHealthCheck);
         DistributionQueue queue = mock(DistributionQueue.class);
         when(queue.getHead()).thenReturn(null);
         DistributionAgent distributionAgent = mock(DistributionAgent.class);
@@ -79,7 +84,7 @@
     public void testWithOneOkItemInTheQueue() throws Exception {
         DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
 
-        distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+        context.registerInjectActivateService(distributionQueueHealthCheck);
         DistributionQueue queue = mock(DistributionQueue.class);
         DistributionQueueItem item = new DistributionQueueItem("packageId", new HashMap<String, Object>());
         DistributionQueueItemStatus status = new DistributionQueueItemStatus(Calendar.getInstance(), DistributionQueueItemState.QUEUED, 1, "queueName");
@@ -103,7 +108,7 @@
     public void testWithNotOkItemInTheQueue() throws Exception {
         DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
 
-        distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+        context.registerInjectActivateService(distributionQueueHealthCheck);
         DistributionQueue queue = mock(DistributionQueue.class);
         DistributionQueueItem item = new DistributionQueueItem("packageId", new HashMap<String, Object>());
         DistributionQueueItemStatus status = new DistributionQueueItemStatus(Calendar.getInstance(), DistributionQueueItemState.QUEUED, 10, "queueName");
diff --git a/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java b/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java
index 09dd7e8..a58877e 100644
--- a/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java
+++ b/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java
@@ -18,14 +18,15 @@
  */
 package org.apache.sling.distribution.queue.impl.simple;
 
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.sling.distribution.queue.DistributionQueueItem;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
-
 public class QueueItemMapperTest {
 
     @Test
@@ -36,11 +37,18 @@
         properties.put("null", null);
         properties.put("long", 200L);
         properties.put("double", 300.3d);
+        properties.put("array", new String[] {"one","two"});
         DistributionQueueItem expected = new DistributionQueueItem("packageId", properties);
         DistributionQueueItem actual = mapper.readQueueItem(mapper.writeQueueItem(expected));
         assertEquals(expected.getPackageId(), actual.getPackageId());
         for (Map.Entry<String, Object> entry : actual.entrySet()) {
-            assertEquals(expected.get(entry.getKey()), entry.getValue());
+            if (entry.getValue() != null && entry.getValue().getClass().isArray()) {
+                Object[] e = (Object[]) expected.get(entry.getKey());
+                Object[] a = (Object[]) entry.getValue();
+                assertArrayEquals(e, a);
+            } else {
+                assertEquals(expected.get(entry.getKey()), entry.getValue());
+            }
         }
     }
 }
\ No newline at end of file