diff --git a/bundles/org.eclipse.equinox.ds/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.ds/META-INF/MANIFEST.MF
index 7ddb104..8817efd 100644
--- a/bundles/org.eclipse.equinox.ds/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.ds/META-INF/MANIFEST.MF
@@ -7,12 +7,18 @@
 Bundle-Activator: org.eclipse.equinox.internal.ds.Activator
 Bundle-Description: This bundle provides support for OSGi 
  Declarative Services
+Export-Package: org.apache.felix.scr;version="1.6"
 Import-Package: 
  org.eclipse.osgi.service.environment;version="1.3.0",
  org.osgi.framework;version="1.8.0",
+ org.osgi.framework.dto;version="1.8.0",
  org.osgi.framework.namespace;version="1.1.0",
  org.osgi.framework.startlevel;version="1.0.0",
- org.osgi.framework.wiring;version="1.2.0"
+ org.osgi.framework.wiring;version="1.2.0",
+ org.osgi.service.component;version="1.3.0",
+ org.osgi.service.component.runtime;version="1.3.0",
+ org.osgi.service.component.runtime.dto;version="1.3.0",
+ org.osgi.util.tracker;version="1.5.0"
 Require-Bundle: org.apache.felix.scr;bundle-version="[2.0.0,3.0.0)";visibility:=reexport
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/Component.java b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/Component.java
new file mode 100644
index 0000000..ba7165c
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/Component.java
@@ -0,0 +1,334 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr;
+
+import java.util.Dictionary;
+import org.osgi.framework.Bundle;
+import org.osgi.service.component.ComponentInstance;
+
+/**
+ * The <code>Component</code> interface represents a single component managed
+ * by the Service Component Runtime. Management agents may access the Component
+ * instances through the {@link ScrService}.
+ * @deprecated  * @deprecated clients should use {@link org.osgi.service.component.runtime.dto.ComponentDescriptionDTO} instead.
+ */
+@Deprecated
+public interface Component {
+
+	/**
+	 * The Component has just been created and is still disabled or it has
+	 * been disabled by calling the {@link #disable()} method (value is 1).
+	 */
+	static final int STATE_DISABLED = 1;
+
+	/**
+	 * The Component is being enabled (value is 512). After the component has
+	 * been enabled it enters the {@link #STATE_UNSATISFIED} state.
+	 * @since 1.2
+	 */
+	static final int STATE_ENABLING = 512;
+
+	/**
+	 * The Component has been enabled and is now going to be activated (value
+	 * is 2).
+	 * @deprecated as of version 1.2 the enabled state is collapsed into the
+	 *      {@link #STATE_UNSATISFIED} state. This status code is never returned
+	 *      from the {@link #getState()} method.
+	 */
+	static final int STATE_ENABLED = 2;
+
+	/**
+	 * The Component activation failed because any dependency is not satisfied
+	 * (value is 4).
+	 */
+	static final int STATE_UNSATISFIED = 4;
+
+	/**
+	 * The Component is currently being activated either because it has been
+	 * enabled or because any dependency which was previously unsatisfied has
+	 * become satisfied (value is 8).
+	 */
+	static final int STATE_ACTIVATING = 8;
+
+	/**
+	 * The Component has successfully been activated and is fully functional
+	 * (value is 16). This is the state of immediate components after
+	 * successful activation. Delayed and Service Factory Components enter
+	 * this state when the service instance has actually be instantiated because
+	 * the service has been acquired.
+	 */
+	static final int STATE_ACTIVE = 16;
+
+	/**
+	 * The Component has successfully been activated but is a Delayed or Service
+	 * Factory Component pending instantiation on first use (value is 32).
+	 */
+	static final int STATE_REGISTERED = 32;
+
+	/**
+	 * The Component is a Component Factory ready to create Component instances
+	 * with the <code>ComponentFactory.newInstance(Dictionary)</code> method
+	 * or (if enabled with the <code>ds.factory.enabled</code> configuration) to
+	 * manage Component instances from configuration data received from the
+	 * Configuration Admin Service (value is 64).
+	 */
+	static final int STATE_FACTORY = 64;
+
+	/**
+	 * The Component is being deactivated either because it is being disabled
+	 * or because a dependency is not satisfied any more (value is 128). After
+	 * deactivation the Component enters the {@link #STATE_UNSATISFIED} state.
+	 */
+	static final int STATE_DEACTIVATING = 128;
+
+	/**
+	 * The Component is being disabled (value is 1024). After the component has
+	 * been disabled it enters the {@link #STATE_DISABLED} state.
+	 * @since 1.2
+	 */
+	static final int STATE_DISABLING = 1024;
+
+	/**
+	 * The Component is being disposed off (value is 2048). After the component
+	 * has been disposed off it enters the {@link #STATE_DESTROYED} state.
+	 * @since 1.2
+	 */
+	static final int STATE_DISPOSING = 2048;
+
+	/**
+	 * The Component has been destroyed and cannot be used any more (value is
+	 * 256). This state is only used when the bundle declaring the component
+	 * is being stopped and all components have to be removed.
+	 * @deprecated as of version 1.2 this constant has been renamed to
+	 *      {@link #STATE_DISPOSED}.
+	 */
+	static final int STATE_DESTROYED = 256;
+
+	/**
+	 * The Component has been disposed off and cannot be used any more (value is
+	 * 256). This state is used when the bundle declaring the component
+	 * is being stopped and all components have to be removed. This status is
+	 * also the final status of a component after the
+	 * <code>ComponentInstance.dispose()</code> method has been called.
+	 * @since 1.2
+	 */
+	static final int STATE_DISPOSED = 256;
+
+	/**
+	 * Returns the component ID of this component. This ID is managed by the
+	 * SCR. If the component is not currently enabled the ID might not be
+	 * assigned to the component (yet) and this method will return -1 in this
+	 * case.
+	 */
+	long getId();
+
+	/**
+	 * Returns the name of the component, which is also used as the service PID.
+	 * This method provides access to the <code>name</code> attribute of the
+	 * <code>component</code> element.
+	 */
+	String getName();
+
+	/**
+	 * Returns the current state of the Component, which is one of the
+	 * <code>STATE_*</code> constants defined in this interface.
+	 */
+	int getState();
+
+	/**
+	 * Returns the <code>Bundle</code> declaring this component.
+	 */
+	Bundle getBundle();
+
+	/**
+	 * Returns the component factory name or <code>null</code> if this component
+	 * is not defined as a component factory. This method provides access to
+	 * the <code>factory</code> attribute of the <code>component</code>
+	 * element.
+	 */
+	String getFactory();
+
+	/**
+	 * Returns <code>true</code> if this component is a service factory. This
+	 * method returns the value of the <code>serviceFactory</code> attribute of
+	 * the <code>service</code> element. If the component has no service
+	 * element, this method returns <code>false</code>.
+	 */
+	boolean isServiceFactory();
+
+	/**
+	 * Returns the class name of the Component implementation. This method
+	 * provides access to the <code>class</code> attribute of the
+	 * <code>implementation</code> element.
+	 */
+	String getClassName();
+
+	/**
+	 * Returns whether the Component is declared to be enabled initially. This
+	 * method provides access to the <code>enabled</code> attribute of the
+	 * <code>component</code> element.
+	 */
+	boolean isDefaultEnabled();
+
+	/**
+	 * Returns whether the Component is an Immediate or a Delayed Component.
+	 * This method provides access to the <code>immediate</code> attribute of
+	 * the <code>component</code> element.
+	 */
+	boolean isImmediate();
+
+	/**
+	 * Returns an array of service names provided by this Component or
+	 * <code>null</code> if the Component is not registered as a service. This
+	 * method provides access to the <code>interface</code> attributes of the
+	 * <code>provide</code> elements.
+	 */
+	String[] getServices();
+
+	/**
+	 * Returns the properties of the Component. The Dictionary returned is a
+	 * private copy of the actual properties and contains the same entries as
+	 * are used to register the Component as a service and are returned by
+	 * the <code>ComponentContext.getProperties()</code> method.
+	 */
+	Dictionary getProperties();
+
+	/**
+	 * Returns an array of {@link Reference} instances representing the service
+	 * references (or dependencies) of this Component. If the Component has no
+	 * references, <code>null</code> is returned.
+	 */
+	Reference[] getReferences();
+
+	/**
+	 * Returns the <code>org.osgi.service.component.ComponentInstance</code>
+	 * representing this component or <code>null</code> if this component
+	 * is not been activated yet.
+	 *
+	 * @since 1.2
+	 */
+	ComponentInstance getComponentInstance();
+
+	/**
+	 * Returns the name of the method to be called when the component is being
+	 * activated.
+	 * <p>
+	 * This method never returns <code>null</code>, that is, if this method is
+	 * not declared in the component descriptor this method returns the
+	 * default value <i>activate</i>.
+	 *
+	 * @since 1.2
+	 */
+	String getActivate();
+
+	/**
+	 * Returns <code>true</code> if the name of the method to be called on
+	 * component activation (see {@link #getActivate()} is declared in the
+	 * component descriptor or not.
+	 * <p>
+	 * For a component declared in a Declarative Services 1.0 descriptor, this
+	 * method always returns <code>false</code>.
+	 *
+	 * @since 1.2
+	 */
+	boolean isActivateDeclared();
+
+	/**
+	 * Returns the name of the method to be called when the component is being
+	 * deactivated.
+	 * <p>
+	 * This method never returns <code>null</code>, that is, if this method is
+	 * not declared in the component descriptor this method returns the
+	 * default value <i>deactivate</i>.
+	 *
+	 * @since 1.2
+	 */
+	String getDeactivate();
+
+	/**
+	 * Returns <code>true</code> if the name of the method to be called on
+	 * component deactivation (see {@link #getDeactivate()} is declared in the
+	 * component descriptor or not.
+	 * <p>
+	 * For a component declared in a Declarative Services 1.0 descriptor, this
+	 * method always returns <code>false</code>.
+	 *
+	 * @since 1.2
+	 */
+	boolean isDeactivateDeclared();
+
+	/**
+	 * Returns the name of the method to be called when the component
+	 * configuration has been updated or <code>null</code> if such a method is
+	 * not declared in the component descriptor.
+	 * <p>
+	 * For a component declared in a Declarative Services 1.0 descriptor, this
+	 * method always returns <code>null</code>.
+	 *
+	 * @since 1.2
+	 */
+	String getModified();
+
+	/**
+	 * Returns the configuration policy declared in the component descriptor.
+	 * If the component descriptor is a Declarative Services 1.0 descriptor or
+	 * not configuration policy has been declared, the default value
+	 * <i>optional</i> is returned.
+	 * <p>
+	 * The returned string is one of the three policies defined in the
+	 * Declarative Services specification 1.1:
+	 * <dl>
+	 * <dt>optional</dt>
+	 * <dd>Configuration from the Configuration Admin service is supplied to
+	 * the component if available. Otherwise the component is activated without
+	 * Configuration Admin configuration. This is the default value reflecting
+	 * the behavior of Declarative Services 1.0</dd>
+	 * <dt>require</dt>
+	 * <dd>Configuration is required. The component remains unsatisfied until
+	 * configuration is available from the Configuration Admin service.</dd>
+	 * <dt>ignore</dt>
+	 * <dd>Configuration is ignored. No Configuration Admin service
+	 * configuration is supplied to the component.</dd>
+	 * </dl>
+	 *
+	 * @since 1.2
+	 */
+	String getConfigurationPolicy();
+
+	/**
+	 * Enables this Component if it is disabled. If the Component is not
+	 * currently {@link #STATE_DISABLED disabled} this method has no effect. If
+	 * the Component is {@link #STATE_DESTROYED destroyed}, this method throws
+	 * an <code>IllegalStateException</code>.
+	 *
+	 * @throws IllegalStateException If the Component is destroyed.
+	 */
+	void enable();
+
+	/**
+	 * Disables this Component if it is enabled. If the Component is already
+	 * {@link #STATE_DISABLED disabled} this method has no effect. If the
+	 * Component is {@link #STATE_DESTROYED destroyed}, this method throws an
+	 * <code>IllegalStateException</code>.
+	 *
+	 * @throws IllegalStateException If the Component is destroyed.
+	 */
+	void disable();
+
+}
diff --git a/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/Reference.java b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/Reference.java
new file mode 100644
index 0000000..6decd81
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/Reference.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The <code>Reference</code> interface represents a single reference (or
+ * dependency) to a service used by a Component.
+ * @deprecated clients should use {@link org.osgi.service.component.runtime.dto.ReferenceDTO} instead.
+ */
+@Deprecated
+public interface Reference {
+
+	/**
+	 * Returns the name of this Reference. This method provides access to the
+	 * <code>name</code> attribute of the <code>reference</code> element.
+	 */
+	String getName();
+
+	/**
+	 * Returns the name of the service used by this Reference. This method
+	 * provides access to the <code>interface</code> attribute of the
+	 * <code>reference</code> element.
+	 */
+	String getServiceName();
+
+	/**
+	 * Returns an array of references to the services bound to this Reference
+	 * or <code>null</code> if no services are currently bound.
+	 */
+	ServiceReference[] getServiceReferences();
+
+	/**
+	 * Returns whether this reference is satisfied. A {@link #isOptional() optional}
+	 * component is always satisfied. Otherwise <code>true</code> is only
+	 * returned if at least one service is bound.
+	 */
+	boolean isSatisfied();
+
+	/**
+	 * Returns whether this reference is optional. This method provides access
+	 * to the lower bound of the <code>cardinality</code> attribute of the
+	 * <code>reference</code> element. In other words, this method returns
+	 * <code>true</code> if the cardinality is <em>0..1</em> or <em>0..n</em>.
+	 */
+	boolean isOptional();
+
+	/**
+	 * Returns whether this reference is multiple. This method provides access
+	 * to the upper bound of the <code>cardinality</code> attribute of the
+	 * <code>reference</code> element. In other words, this method returns
+	 * <code>true</code> if the cardinality is <em>0..n</em> or <em>1..n</em>.
+	 */
+	boolean isMultiple();
+
+	/**
+	 * Returns <code>true</code> if the reference is defined with static policy.
+	 * This method provides access to the <code>policy</code> element of the
+	 * <code>reference</code> element. <code>true</code> is returned if the
+	 * policy is defined as <em>static</em>.
+	 */
+	boolean isStatic();
+
+	/**
+	 * Returns the value of the target property of this reference. Initially
+	 * (without overwriting configuration) this method provides access to the
+	 * <code>target</code> attribute of the <code>reference</code> element. If
+	 * configuration overwrites the target property, this method returns the
+	 * value of the Component property whose name is derived from the
+	 * {@link #getName() reference name} plus the suffix <em>.target</em>. If
+	 * no target property exists this method returns <code>null</code>.
+	 */
+	String getTarget();
+
+	/**
+	 * Returns the name of the method called if a service is being bound to
+	 * the Component or <code>null</code> if no such method is configured. This
+	 * method provides access to the <code>bind</code> attribute of the
+	 * <code>reference</code> element.
+	 */
+	String getBindMethodName();
+
+	/**
+	 * Returns the name of the method called if a service is being unbound from
+	 * the Component or <code>null</code> if no such method is configured. This
+	 * method provides access to the <code>unbind</code> attribute of the
+	 * <code>reference</code> element.
+	 */
+	String getUnbindMethodName();
+
+	/**
+	 * Returns the name of the method called if a bound service updates its
+	 * service registration properties or <code>null</code> if no such method
+	 * is configured. This method provides access to the <code>updated</code>
+	 * attribute of the <code>reference</code> element.
+	 * <p>
+	 * For a component declared in a Declarative Services 1.0 and 1.1
+	 * descriptor, this method always returns <code>null</code>.
+	 *
+	 * @since 1.4
+	 */
+	String getUpdatedMethodName();
+
+}
diff --git a/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/ScrService.java b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/ScrService.java
new file mode 100644
index 0000000..f39661a
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/ScrService.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * The <code>ScrService</code> represents the Declarative Services main
+ * controller also known as the Service Component Runtime or SCR for short.
+ * It provides access to the components managed the SCR.
+ * @deprecated clients should use {@link org.osgi.service.component.runtime.ServiceComponentRuntime} instead.
+ */
+@Deprecated
+public interface ScrService {
+
+	/**
+	 * Returns an array of all components managed by this SCR instance. The
+	 * components are returned in ascending order of their component.id. If
+	 * there are no components currently managed by the SCR, <code>null</code>
+	 * is returned.
+	 *
+	 * @return The components or <code>null</code> if there are none.
+	 */
+	Component[] getComponents();
+
+	/**
+	 * Returns the component whose component.id matches the given
+	 * <code>componentId</code> or <code>null</code> if no component with the
+	 * given id is currently managed.
+	 *
+	 * @param componentId The ID of the component to return
+	 *
+	 * @return The indicated component or <code>null</code> if no such
+	 *      component exists.
+	 */
+	Component getComponent(long componentId);
+
+	/**
+	 * Returns the components whose <code>component.name</code> matches the
+	 * given <code>componentName</code> or <code>null</code> if no component
+	 * with the given name is currently managed.
+	 * <p>
+	 * If the component name refers to a component factory component or a
+	 * component configured with multiple factory configurations this method
+	 * returns multiple component instances.
+	 *
+	 * @param componentName The name of the component to return
+	 *
+	 * @return The indicated components or <code>null</code> if no such
+	 *      component exists.
+	 * @since 1.5 (Apache Felix Declarative Services 1.4.2)
+	 */
+	Component[] getComponents(String componentName);
+
+	/**
+	 * Returns an array of all components managed by this SCR instance on
+	 * behalf of the given bundle. The components are returned in ascending
+	 * order of their component.id. If there are no components managed by the
+	 * SCR for the given bundle, <code>null</code> is returned.
+	 *
+	 * @param bundle The <code>Bundle</code> whose components are to be
+	 *      returned.
+	 *
+	 * @return The bundle's components or <code>null</code> if the bundle
+	 *      has none.
+	 */
+	Component[] getComponents(Bundle bundle);
+
+}
diff --git a/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/package.html b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/package.html
new file mode 100644
index 0000000..4efb8d9
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds/src/org/apache/felix/scr/package.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <title>Package-level Javadoc</title>
+</head>
+<body>
+Provides access to the components managed by the Service Component Runtime (Declarative Services).
+<h2>
+Package Specification</h2>
+<p>
+This package specifies API for accessing to the components managed by the Service Component Runtime (Declarative Services).
+</p>
+</body>
+</html>
diff --git a/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/Activator.java b/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/Activator.java
index 6c8e325..509d775 100644
--- a/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/Activator.java
+++ b/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/Activator.java
@@ -11,18 +11,26 @@
 package org.eclipse.equinox.internal.ds;
 
 import java.util.List;
+import org.apache.felix.scr.ScrService;
 import org.eclipse.osgi.service.environment.EnvironmentInfo;
 import org.osgi.framework.*;
 import org.osgi.framework.namespace.BundleNamespace;
 import org.osgi.framework.startlevel.BundleStartLevel;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
-public class Activator implements BundleActivator {
+@SuppressWarnings("deprecation")
+public class Activator implements BundleActivator, ServiceTrackerCustomizer<ServiceComponentRuntime, ServiceRegistration<ScrService>> {
 
+	private BundleContext bc;
 	private Bundle scr;
+	private ServiceTracker<ServiceComponentRuntime, ServiceRegistration<ScrService>> tracker;
 
 	public void start(BundleContext context) throws Exception {
+		this.bc = context;
 		ServiceReference<EnvironmentInfo> envInfoRef = context.getServiceReference(EnvironmentInfo.class);
 		EnvironmentInfo envInfo = null;
 		if (envInfoRef != null) {
@@ -50,10 +58,33 @@
 		BundleStartLevel scrStartLevel = scr.adapt(BundleStartLevel.class);
 		scrStartLevel.setStartLevel(equinoxSDstartLevel.getStartLevel());
 		scr.start(Bundle.START_TRANSIENT);
+		tracker = new ServiceTracker<ServiceComponentRuntime, ServiceRegistration<ScrService>>(context, ServiceComponentRuntime.class, this);
+		tracker.open();
 	}
 
 	public void stop(BundleContext context) throws Exception {
+		tracker.close();
 		scr.stop(Bundle.STOP_TRANSIENT);
 	}
 
+	@Override
+	public ServiceRegistration<ScrService> addingService(ServiceReference<ServiceComponentRuntime> reference) {
+		ServiceComponentRuntime scrService = bc.getService(reference);
+		if (scr != null) {
+			return bc.registerService(ScrService.class, new ScrServiceImpl(scrService, bc), null);
+		}
+		return null;
+	}
+
+	@Override
+	public void modifiedService(ServiceReference<ServiceComponentRuntime> reference, ServiceRegistration<ScrService> reg) {
+		// do nothing
+	}
+
+	@Override
+	public void removedService(ServiceReference<ServiceComponentRuntime> reference, ServiceRegistration<ScrService> reg) {
+		reg.unregister();
+		bc.ungetService(reference);
+	}
+
 }
diff --git a/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/ScrServiceImpl.java b/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/ScrServiceImpl.java
new file mode 100644
index 0000000..7f5a97f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/ScrServiceImpl.java
@@ -0,0 +1,346 @@
+/*******************************************************************************
+ * Copyright (c) 2017 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.internal.ds;
+
+import java.util.*;
+import java.util.Map.Entry;
+import org.apache.felix.scr.*;
+import org.osgi.framework.*;
+import org.osgi.framework.dto.ServiceReferenceDTO;
+import org.osgi.service.component.ComponentConstants;
+import org.osgi.service.component.ComponentInstance;
+import org.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.service.component.runtime.dto.*;
+
+@Deprecated
+public class ScrServiceImpl implements ScrService {
+	final ServiceComponentRuntime scr;
+	final BundleContext context;
+
+	ScrServiceImpl(ServiceComponentRuntime scr, BundleContext context) {
+		this.scr = scr;
+		this.context = context.getBundle(Constants.SYSTEM_BUNDLE_LOCATION).getBundleContext();
+	}
+
+	@Override
+	public Component[] getComponents() {
+		return toComponents(scr.getComponentDescriptionDTOs());
+	}
+
+	private Component[] toComponents(Collection<ComponentDescriptionDTO> componentDescriptionDTOs) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Component getComponent(long componentId) {
+		for (ComponentDescriptionDTO dto : scr.getComponentDescriptionDTOs()) {
+			Long id = (Long) dto.properties.get(ComponentConstants.COMPONENT_ID);
+			if (componentId == id) {
+				return toComponent(dto);
+			}
+		}
+		return null;
+	}
+
+	private Component toComponent(ComponentDescriptionDTO dto) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Component[] getComponents(String componentName) {
+		Collection<ComponentDescriptionDTO> dtos = new ArrayList<ComponentDescriptionDTO>();
+		for (ComponentDescriptionDTO dto : scr.getComponentDescriptionDTOs()) {
+			if (componentName.equals(dto.name)) {
+				dtos.add(dto);
+			}
+		}
+		return toComponents(dtos);
+	}
+
+	@Override
+	public Component[] getComponents(Bundle bundle) {
+		return toComponents(scr.getComponentDescriptionDTOs(bundle));
+	}
+
+	ServiceReference<?> getServiceReference(long id) {
+		try {
+			ServiceReference<?>[] refs = context.getServiceReferences((String) null, "(" + Constants.SERVICE_ID + "=" + id + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			if (refs != null && refs.length > 0) {
+				return refs[0];
+			}
+		} catch (InvalidSyntaxException e) {
+			throw new RuntimeException(e);
+		}
+		return null;
+	}
+
+	class ComponentImpl implements Component {
+		private final ComponentConfigurationDTO config;
+
+		ComponentImpl(ComponentConfigurationDTO config) {
+			this.config = config;
+		}
+
+		@Override
+		public long getId() {
+			return config.id;
+		}
+
+		@Override
+		public String getName() {
+			return config.description.name;
+		}
+
+		@Override
+		public int getState() {
+			switch (config.state) {
+				case ComponentConfigurationDTO.ACTIVE :
+					return Component.STATE_ACTIVE;
+				case ComponentConfigurationDTO.SATISFIED :
+					return Component.STATE_REGISTERED;
+				case ComponentConfigurationDTO.UNSATISFIED_CONFIGURATION :
+					return Component.STATE_UNSATISFIED;
+				case ComponentConfigurationDTO.UNSATISFIED_REFERENCE :
+					return Component.STATE_UNSATISFIED;
+				default :
+					break;
+			}
+			return Component.STATE_DISABLED;
+		}
+
+		@Override
+		public Bundle getBundle() {
+			return context.getBundle(config.description.bundle.id);
+		}
+
+		@Override
+		public String getFactory() {
+			return config.description.factory;
+		}
+
+		@Override
+		public boolean isServiceFactory() {
+			return Constants.SCOPE_BUNDLE.equals(config.description.scope);
+		}
+
+		@Override
+		public String getClassName() {
+			return config.description.implementationClass;
+		}
+
+		@Override
+		public boolean isDefaultEnabled() {
+			return config.description.defaultEnabled;
+		}
+
+		@Override
+		public boolean isImmediate() {
+			return config.description.immediate;
+		}
+
+		@Override
+		public String[] getServices() {
+			return config.description.serviceInterfaces;
+		}
+
+		@SuppressWarnings({"rawtypes", "unchecked"})
+		@Override
+		public Dictionary getProperties() {
+			return new Hashtable(config.description.properties);
+		}
+
+		@Override
+		public Reference[] getReferences() {
+			if (config.description.references.length == 0) {
+				return null;
+			}
+			Map<String, ReferenceDTO> referenceDTOs = new HashMap<String, ReferenceDTO>();
+			for (ReferenceDTO reference : config.description.references) {
+				referenceDTOs.put(reference.name, reference);
+			}
+			Map<String, SatisfiedReferenceDTO> satisfiedDTOs = new HashMap<String, SatisfiedReferenceDTO>();
+			for (SatisfiedReferenceDTO satisfied : config.satisfiedReferences) {
+				satisfiedDTOs.put(satisfied.name, satisfied);
+			}
+			Map<String, UnsatisfiedReferenceDTO> unsatisfiedDTOs = new HashMap<String, UnsatisfiedReferenceDTO>();
+			for (UnsatisfiedReferenceDTO unsatisfied : config.unsatisfiedReferences) {
+				unsatisfiedDTOs.put(unsatisfied.name, unsatisfied);
+			}
+			return toReferences(referenceDTOs, satisfiedDTOs, unsatisfiedDTOs);
+		}
+
+		private Reference[] toReferences(Map<String, ReferenceDTO> referenceDTOs, Map<String, SatisfiedReferenceDTO> satisfiedDTOs, Map<String, UnsatisfiedReferenceDTO> unsatisfiedDTOs) {
+			Collection<Reference> references = new ArrayList<Reference>();
+			for (Entry<String, SatisfiedReferenceDTO> satisfied : satisfiedDTOs.entrySet()) {
+				references.add(new SatsifiedReference(satisfied.getValue(), referenceDTOs.get(satisfied.getValue().name)));
+			}
+			for (Entry<String, UnsatisfiedReferenceDTO> unsatisfied : unsatisfiedDTOs.entrySet()) {
+				references.add(new UnsatsifiedReference(unsatisfied.getValue(), referenceDTOs.get(unsatisfied.getValue().name)));
+			}
+			return references.toArray(new Reference[0]);
+		}
+
+		@Override
+		public ComponentInstance getComponentInstance() {
+			throw new UnsupportedOperationException("Not supported."); //$NON-NLS-1$
+		}
+
+		@Override
+		public String getActivate() {
+			return config.description.activate;
+		}
+
+		@Override
+		public boolean isActivateDeclared() {
+			return config.description.activate != null;
+		}
+
+		@Override
+		public String getDeactivate() {
+			return config.description.deactivate;
+		}
+
+		@Override
+		public boolean isDeactivateDeclared() {
+			return config.description.deactivate != null;
+		}
+
+		@Override
+		public String getModified() {
+			return config.description.modified;
+		}
+
+		@Override
+		public String getConfigurationPolicy() {
+			return config.description.configurationPolicy;
+		}
+
+		@Override
+		public void enable() {
+			scr.disableComponent(config.description);
+		}
+
+		@Override
+		public void disable() {
+			scr.disableComponent(config.description);
+		}
+	}
+
+	abstract class ReferenceBase implements Reference {
+		protected final ReferenceDTO reference;
+
+		ReferenceBase(ReferenceDTO reference) {
+			this.reference = reference;
+		}
+
+		@Override
+		public String getName() {
+			return reference.name;
+		}
+
+		@Override
+		public String getServiceName() {
+			return reference.interfaceName;
+		}
+
+		@Override
+		public boolean isOptional() {
+			return reference.cardinality.startsWith("0"); //$NON-NLS-1$
+		}
+
+		@Override
+		public boolean isMultiple() {
+			return reference.cardinality.startsWith("1"); //$NON-NLS-1$
+		}
+
+		@Override
+		public boolean isStatic() {
+			return "static".equals(reference.policy); //$NON-NLS-1$
+		}
+
+		@Override
+		public String getTarget() {
+			return reference.target;
+		}
+
+		@Override
+		public String getBindMethodName() {
+			return reference.bind;
+		}
+
+		@Override
+		public String getUnbindMethodName() {
+			return reference.unbind;
+		}
+
+		@Override
+		public String getUpdatedMethodName() {
+			return reference.updated;
+		}
+	}
+
+	class SatsifiedReference extends ReferenceBase {
+		private final SatisfiedReferenceDTO satisfied;
+
+		SatsifiedReference(SatisfiedReferenceDTO satisifed, ReferenceDTO reference) {
+			super(reference);
+			this.satisfied = satisifed;
+		}
+
+		@SuppressWarnings("rawtypes")
+		@Override
+		public ServiceReference[] getServiceReferences() {
+			Collection<ServiceReference<?>> serviceReferences = new ArrayList<ServiceReference<?>>();
+			for (ServiceReferenceDTO serviceRefDTO : satisfied.boundServices) {
+				ServiceReference<?> ref = getServiceReference(serviceRefDTO.id);
+				if (ref != null) {
+					serviceReferences.add(ref);
+				}
+			}
+			return serviceReferences.isEmpty() ? null : serviceReferences.toArray(new ServiceReference[0]);
+		}
+
+		@Override
+		public boolean isSatisfied() {
+			return true;
+		}
+	}
+
+	class UnsatsifiedReference extends ReferenceBase {
+		private final UnsatisfiedReferenceDTO unsatisfied;
+
+		UnsatsifiedReference(UnsatisfiedReferenceDTO unsatisifed, ReferenceDTO reference) {
+			super(reference);
+			this.unsatisfied = unsatisifed;
+		}
+
+		@SuppressWarnings("rawtypes")
+		@Override
+		public ServiceReference[] getServiceReferences() {
+			Collection<ServiceReference<?>> serviceReferences = new ArrayList<ServiceReference<?>>();
+			for (ServiceReferenceDTO serviceRefDTO : unsatisfied.targetServices) {
+				ServiceReference<?> ref = getServiceReference(serviceRefDTO.id);
+				if (ref != null) {
+					serviceReferences.add(ref);
+				}
+			}
+			return serviceReferences.isEmpty() ? null : serviceReferences.toArray(new ServiceReference[0]);
+		}
+
+		@Override
+		public boolean isSatisfied() {
+			return false;
+		}
+	}
+
+}
