diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java
index fad6b03..9a8c0ca 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java
@@ -32,7 +32,7 @@
      * @param sref reference of the service to be exported
      * @param effectiveProperties combined properties of the service and additional properties from rsa
      * @param exportedInterface name of the interface to be exported
-     * @return
+     * @return closeable Endpoint that represents the service that is exposed to the outside world
      */
     Endpoint exportService(ServiceReference<?> sref, 
                            Map<String, Object> effectiveProperties,
@@ -40,13 +40,13 @@
 
     /**
      * @param sref reference of the service offered to the requesting bundle
-     * @param iClass interface of the service to proxy
+     * @param interfaces interfaces of the service to proxy
      * @param endpoint description of the remote endpoint
      * @return service proxy to be given to the requesting bundle
      * @throws IntentUnsatisfiedException
      */
     Object importEndpoint(BundleContext consumerContext, 
-                          Class<?> iClass, 
+                          Class<?>[] interfaces, 
                           EndpointDescription endpoint)
         throws IntentUnsatisfiedException;
     
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
index dad4a89..0be2fbf 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
@@ -79,7 +79,7 @@
     }
 
     @Override
-    public Object importEndpoint(BundleContext consumerContext, Class<?> iClass, EndpointDescription endpoint)
+    public Object importEndpoint(BundleContext consumerContext, Class<?>[] iClass, EndpointDescription endpoint)
         throws IntentUnsatisfiedException {
         List<String> configurationTypes = determineConfigTypesForImport(endpoint);
         DistributionProvider handler = getHandler(configurationTypes, endpoint.getProperties());
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java
index 3c95200..e67bc31 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java
@@ -56,8 +56,9 @@
     }
 
     public Object importEndpoint(BundleContext consumerContext,
-                              Class<?> iClass,
+                              Class<?>[] interfaces,
                               EndpointDescription endpoint) {
+        Class<?> iClass = interfaces[0];
         String address = getPojoAddress(endpoint, iClass);
         if (address == null) {
             LOG.warn("Remote address is unavailable");
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java
index fefa0ee..0451a8e 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java
@@ -55,8 +55,9 @@
     }
 
     public Object importEndpoint(BundleContext consumerContext,
-                              Class<?> iClass,
+                              Class<?>[] interfaces,
                               EndpointDescription endpoint) throws IntentUnsatisfiedException {
+        Class<?> iClass = interfaces[0];
         Map<String, Object> sd = endpoint.getProperties();
         String address = getClientAddress(sd);
         if (address == null) {
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
index ec0f638..9384958 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
@@ -55,8 +55,9 @@
     }
 
     public Object importEndpoint(BundleContext consumerContext,
-                              Class<?> iClass,
+                              Class<?>[] interfaces,
                               EndpointDescription endpoint) {
+        Class<?> iClass = interfaces[0];
         String wsdlAddressProp = getWsdlAddress(endpoint, iClass);
         if (wsdlAddressProp == null) {
             LOG.warn("WSDL address is unavailable");
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java
index 343c406..b482b64 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java
@@ -20,6 +20,7 @@
 
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -52,14 +53,17 @@
     }
 
     public Object getService(final Bundle requestingBundle, final ServiceRegistration sreg) {
-        List<String> interfaces = endpoint.getInterfaces();
-        String interfaceName = interfaces == null || interfaces.isEmpty() ? null : interfaces.get(0);
-        LOG.debug("getService() from serviceFactory for {}", interfaceName);
+        List<String> interfaceNames = endpoint.getInterfaces();
         try {
-            final Class<?> iClass = requestingBundle.loadClass(interfaceName);
+            LOG.debug("getService() from serviceFactory for {}", interfaceNames);
+            final List<Class<?>> interfaces = new ArrayList<Class<?>>();
+            for (String ifaceName : interfaceNames) {
+                interfaces.add(requestingBundle.loadClass(ifaceName));
+            }
             Object proxy = AccessController.doPrivileged(new PrivilegedAction<Object>() {
                 public Object run() {
-                    return handler.importEndpoint(requestingBundle.getBundleContext(), iClass, endpoint);
+                    Class<?>[] ifAr = interfaces.toArray(new Class[]{});
+                    return handler.importEndpoint(requestingBundle.getBundleContext(), ifAr, endpoint);
                 }
             });
 
@@ -69,9 +73,9 @@
             return proxy;
         } catch (IntentUnsatisfiedException iue) {
             LOG.info("Did not create proxy for {} because intent {} could not be satisfied",
-                    interfaceName, iue.getIntent());
+                    interfaceNames, iue.getIntent());
         } catch (Exception e) {
-            LOG.warn("Problem creating a remote proxy for {}", interfaceName, e);
+            LOG.warn("Problem creating a remote proxy for {}", interfaceNames, e);
         }
         return null;
     }
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java
index afc45d1..8de459d 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java
@@ -18,12 +18,15 @@
  */
 package org.apache.cxf.dosgi.dsw.handlers;
 
+
 import java.util.HashMap;
 import java.util.Map;
 
 import junit.framework.TestCase;
 
 import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
+import org.apache.cxf.dosgi.dsw.api.IntentUnsatisfiedException;
 import org.apache.cxf.dosgi.dsw.service.ClientServiceFactory;
 import org.apache.cxf.dosgi.dsw.service.ImportRegistrationImpl;
 import org.easymock.EasyMock;
@@ -31,6 +34,7 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
 import org.osgi.service.remoteserviceadmin.RemoteConstants;
@@ -41,17 +45,10 @@
      "rawtypes", "unchecked"
     })
     public void testGetService() throws ClassNotFoundException {
-        Object myTestProxyObject = new Object();
+        final Object myTestProxyObject = new Object();
 
         IMocksControl control = EasyMock.createControl();
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put(RemoteConstants.ENDPOINT_ID, "http://google.de");
-        map.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "myGreatConfiguration");
-        map.put(Constants.OBJECTCLASS, new String[]{String.class.getName()});
-
-        EndpointDescription endpoint = new EndpointDescription(map);
-        
-
+        EndpointDescription endpoint = createTestEndpointDesc();
         ImportRegistrationImpl iri = new ImportRegistrationImpl(endpoint, null);
 
         BundleContext requestingContext = control.createMock(BundleContext.class);
@@ -60,12 +57,47 @@
         EasyMock.expect(requestingBundle.getBundleContext()).andReturn(requestingContext);
         ServiceRegistration sreg = control.createMock(ServiceRegistration.class);
 
-        DistributionProvider handler = control.createMock(DistributionProvider.class);
-        handler.importEndpoint(requestingContext, String.class, endpoint);
-        EasyMock.expectLastCall().andReturn(myTestProxyObject);
+        DistributionProvider handler = mockDistributionProvider(myTestProxyObject);
         control.replay();
 
         ClientServiceFactory csf = new ClientServiceFactory(endpoint, handler, iri);
         assertSame(myTestProxyObject, csf.getService(requestingBundle, sreg));
     }
+
+    /**
+     * Creating dummy class as I was not able to really mock it
+     * @param myTestProxyObject
+     * @return
+     */
+    private DistributionProvider mockDistributionProvider(final Object myTestProxyObject) {
+        return new DistributionProvider() {
+            
+            @Override
+            public Object importEndpoint(BundleContext consumerContext, Class<?>[] interfaces,
+                                         EndpointDescription endpoint)
+                throws IntentUnsatisfiedException {
+                return myTestProxyObject;
+            }
+            
+            @Override
+            public String[] getSupportedTypes() {
+                return null;
+            }
+            
+            @Override
+            public Endpoint exportService(ServiceReference<?> sref, Map<String, Object> effectiveProperties,
+                                          String exportedInterface) {
+                return null;
+            }
+        };
+    }
+
+    private EndpointDescription createTestEndpointDesc() {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put(RemoteConstants.ENDPOINT_ID, "http://google.de");
+        map.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "myGreatConfiguration");
+        map.put(Constants.OBJECTCLASS, new String[]{String.class.getName()});
+        EndpointDescription endpoint = new EndpointDescription(map);
+        return endpoint;
+    }
 }
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java
index 8e9d64d..4058de4 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java
@@ -148,7 +148,7 @@
         EasyMock.expectLastCall().atLeastOnce();
 
         c.replay();
-        Object proxy = p.importEndpoint(requestingContext, CharSequence.class, endpoint);
+        Object proxy = p.importEndpoint(requestingContext, new Class<?>[]{CharSequence.class}, endpoint);
         assertNotNull(proxy);
         assertTrue("Proxy is not of the requested type! ", proxy instanceof CharSequence);
         c.verify();
