diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
index f45479c..8d27a96 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
@@ -354,17 +354,29 @@
     }
 
     public synchronized HandlerRuntime getRuntime() {
-        List<ServletHandler> servletHandlers = new ArrayList<ServletHandler>(servletMap.values());
-        List<FilterHandler> filterHandlers = new ArrayList<FilterHandler>(filterMap.values());
-
         Collection<ErrorPage> errorPages = new ArrayList<HandlerRuntime.ErrorPage>();
         Collection<ServletHandler> errorHandlers = errorsMapping.getMappedHandlers();
         for (ServletHandler servletHandler : errorHandlers)
         {
             errorPages.add(errorsMapping.getErrorPage(servletHandler));
         }
-        servletHandlers.removeAll(errorHandlers);
 
-        return new HandlerRuntime(servletHandlers, filterHandlers, errorPages, serviceId);
+        List<FilterHandler> filterHandlers = new ArrayList<FilterHandler>(filterMap.values());
+
+        List<ServletHandler> servletHandlers = new ArrayList<ServletHandler>();
+        List<ServletHandler> resourceHandlers = new ArrayList<ServletHandler>();
+        for (ServletHandler servletHandler : servletMap.values())
+        {
+            if (servletHandler.getServletInfo().isResource())
+            {
+                resourceHandlers.add(servletHandler);
+            }
+            else if (!errorHandlers.contains(servletHandler))
+            {
+                servletHandlers.add(servletHandler);
+            }
+        }
+
+        return new HandlerRuntime(servletHandlers, filterHandlers, resourceHandlers, errorPages, serviceId);
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HandlerRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HandlerRuntime.java
index ee86d25..ab815bf 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HandlerRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HandlerRuntime.java
@@ -28,16 +28,19 @@
 {
     private final Collection<ServletHandler> servletHandlers;
     private final Collection<FilterHandler> filterHandlers;
+    private final Collection<ServletHandler> resourceHandlers;
     private final Collection<ErrorPage> errorPages;
     private final long serviceId;
 
     public HandlerRuntime(Collection<ServletHandler> servletHandlers,
             Collection<FilterHandler> filterHandlers,
+            Collection<ServletHandler> resourceHandlers,
             Collection<ErrorPage> errorPages,
             long serviceId)
     {
         this.servletHandlers = servletHandlers;
         this.filterHandlers = filterHandlers;
+        this.resourceHandlers = resourceHandlers;
         this.errorPages = errorPages;
         this.serviceId = serviceId;
     }
@@ -46,6 +49,7 @@
     {
         return new HandlerRuntime(Collections.<ServletHandler>emptyList(),
                 Collections.<FilterHandler>emptyList(),
+                Collections.<ServletHandler>emptyList(),
                 Collections.<ErrorPage> emptyList(),
                 serviceId);
     }
@@ -60,6 +64,11 @@
         return filterHandlers;
     }
 
+    public Collection<ServletHandler> getResourceHandlers()
+    {
+        return resourceHandlers;
+    }
+
     public Collection<ErrorPage> getErrorPages()
     {
         return errorPages;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
index 560234d..ec139e7 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
@@ -24,6 +24,7 @@
 import javax.servlet.Servlet;
 
 import org.osgi.dto.DTO;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.http.runtime.dto.ServletDTO;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
@@ -36,7 +37,7 @@
  *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public final class ServletInfo extends WhiteboardServiceInfo<Servlet>
+public class ServletInfo extends WhiteboardServiceInfo<Servlet>
 {
     /**
      * Properties starting with this prefix are passed as servlet init parameters to the
@@ -68,10 +69,17 @@
     private final boolean asyncSupported;
 
     /**
+     * Specifies whether the info represents a resource.
+     */
+    private final boolean isResource;
+
+    /**
      * The servlet initialization parameters as provided during registration of the servlet.
      */
     private final Map<String, String> initParams;
 
+    private final String prefix;
+
     public ServletInfo(final ServiceReference<Servlet> ref)
     {
         super(ref);
@@ -80,6 +88,8 @@
         this.patterns = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN);
         this.asyncSupported = getBooleanProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED);
         this.initParams = getInitParams(ref, SERVLET_INIT_PREFIX);
+        this.isResource = false;
+        this.prefix = null;
     }
 
     @SuppressWarnings("unchecked")
@@ -91,8 +101,11 @@
         this.errorPage = null;
         this.asyncSupported = false;
         this.initParams = Collections.emptyMap();
+        this.isResource = true;
+        this.prefix = resource.getPrefix();
     }
 
+    @SuppressWarnings("rawtypes")
     private static ServiceReference getRef(ServiceReference ref)
     {
         return ref;
@@ -119,6 +132,8 @@
         this.initParams = initParams;
         this.asyncSupported = true;
         this.errorPage = null;
+        this.isResource = false;
+        this.prefix = null;
     }
 
     ServletInfo(int serviceRanking,
@@ -135,6 +150,8 @@
         this.errorPage = errorPage;
         this.asyncSupported = asyncSupported;
         this.initParams = initParams;
+        this.isResource = false;
+        this.prefix = null;
     }
 
     @Override
@@ -167,4 +184,41 @@
     {
         return initParams;
     }
+
+    public boolean isResource()
+    {
+        return isResource;
+    }
+
+    public String getPrefix()
+    {
+        return prefix;
+    }
+
+    @Override
+    public ServiceReference<Servlet> getServiceReference()
+    {
+        // TODO This method returns a ServiceReference<Object> in case of a resource
+        return super.getServiceReference();
+    }
+
+    @Override
+    public Servlet getService(Bundle bundle)
+    {
+        if (isResource)
+        {
+            throw new UnsupportedOperationException();
+        };
+        return super.getService(bundle);
+    }
+
+    @Override
+    public void ungetService(Bundle bundle, Servlet service)
+    {
+        if (isResource)
+        {
+            throw new UnsupportedOperationException();
+        };
+        super.ungetService(bundle, service);
+    }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ResourceDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ResourceDTOBuilder.java
index 25a40da..5fa0156 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ResourceDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ResourceDTOBuilder.java
@@ -19,18 +19,22 @@
 package org.apache.felix.http.base.internal.runtime.dto;
 
 import org.apache.felix.http.base.internal.handler.ServletHandler;
+import org.apache.felix.http.base.internal.runtime.ServletInfo;
 import org.osgi.service.http.runtime.dto.ResourceDTO;
 
-//TODO
 final class ResourceDTOBuilder extends BaseDTOBuilder<ServletHandler, ResourceDTO>
 {
+    private static final String[] STRING_ARRAY = new String[0];
+
     @Override
     ResourceDTO buildDTO(ServletHandler handler, long servletContextId)
     {
+        ServletInfo servletInfo = handler.getServletInfo();
+
         ResourceDTO resourceDTO = new ResourceDTO();
-        resourceDTO.patterns = null;
-        resourceDTO.prefix = null;
-        resourceDTO.serviceId = handler.getServletInfo().getServiceId();
+        resourceDTO.patterns = copyWithDefault(servletInfo.getPatterns(), STRING_ARRAY);
+        resourceDTO.prefix = servletInfo.getPrefix();
+        resourceDTO.serviceId = servletInfo.getServiceId();
         resourceDTO.servletContextId = servletContextId;
         return resourceDTO;
     }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java
index eb4dcc1..7a03b83 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilder.java
@@ -20,7 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -108,8 +107,7 @@
             Collection<ServiceReference<?>> listenerRefs)
     {
         Collection<ServletHandler> servletHandlers = handlerRuntime.getServletHandlers();
-        //TODO missing functionality
-        Collection<ServletHandler> resourceHandlers = Collections.emptyList();
+        Collection<ServletHandler> resourceHandlers = handlerRuntime.getResourceHandlers();
         Collection<FilterHandler> filterHandlers = handlerRuntime.getFilterHandlers();
         Collection<ErrorPage> errorPages = handlerRuntime.getErrorPages();
         long servletContextId = handlerRuntime.getServiceId();
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilderTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilderTest.java
index 5db1315..a78d8b0 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilderTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/dto/RuntimeDTOBuilderTest.java
@@ -81,6 +81,7 @@
 import org.osgi.service.http.runtime.dto.ErrorPageDTO;
 import org.osgi.service.http.runtime.dto.FilterDTO;
 import org.osgi.service.http.runtime.dto.ListenerDTO;
+import org.osgi.service.http.runtime.dto.ResourceDTO;
 import org.osgi.service.http.runtime.dto.RuntimeDTO;
 import org.osgi.service.http.runtime.dto.ServletContextDTO;
 import org.osgi.service.http.runtime.dto.ServletDTO;
@@ -197,21 +198,25 @@
 
         List<ServletHandler> servlets_0 = asList(createTestServlet("1", context_0));
         List<FilterHandler> filters_0 = asList(createTestFilter("1", context_0));
+        List<ServletHandler> resources_0 = asList(createTestServlet("1", context_0));
         List<ErrorPage> errorPages_0 = asList(createErrorPage("E_1", context_0));
-        HandlerRuntime contextRuntime_0 = new HandlerRuntime(servlets_0, filters_0, errorPages_0, ID_0);
+        HandlerRuntime contextRuntime_0 = new HandlerRuntime(servlets_0, filters_0, resources_0, errorPages_0, ID_0);
 
         List<ServletHandler> servlets_A = asList(createTestServlet("A_1", context_A));
         List<FilterHandler> filters_A = asList(createTestFilter("A_1", context_A));
+        List<ServletHandler> resources_A = asList(createTestServlet("A_1", context_A));
         List<ErrorPage> errorPages_A = asList(createErrorPage("E_A_1", context_A));
-        HandlerRuntime contextRuntime_A = new HandlerRuntime(servlets_A, filters_A, errorPages_A, ID_A);
+        HandlerRuntime contextRuntime_A = new HandlerRuntime(servlets_A, filters_A, resources_A, errorPages_A, ID_A);
 
         List<ServletHandler> servlets_B = asList(createTestServletWithServiceId("B_1", context_B),
                 createTestServletWithServiceId("B_2", context_B));
         List<FilterHandler> filters_B = asList(createTestFilterWithServiceId("B_1", context_B),
                 createTestFilterWithServiceId("B_2", context_B));
+        List<ServletHandler> resources_B = asList(createTestServletWithServiceId("B_1", context_B),
+                createTestServletWithServiceId("B_2", context_B));
         List<ErrorPage> errorPages_B = asList(createErrorPageWithServiceId("E_B_1", context_B),
                 createErrorPageWithServiceId("E_B_2", context_B));
-        HandlerRuntime contextRuntime_B = new HandlerRuntime(servlets_B, filters_B, errorPages_B, ID_B);
+        HandlerRuntime contextRuntime_B = new HandlerRuntime(servlets_B, filters_B, resources_B, errorPages_B, ID_B);
 
         Map<Long, Collection<ServiceReference<?>>> listenerRuntimes = setupListeners();
 
@@ -243,6 +248,8 @@
                 assertEquals(contextName,
                         1, servletContextDTO.filterDTOs.length);
                 assertEquals(contextName,
+                        1, servletContextDTO.resourceDTOs.length);
+                assertEquals(contextName,
                         1, servletContextDTO.errorPageDTOs.length);
                 assertEquals(contextName,
                         2, servletContextDTO.listenerDTOs.length);
@@ -259,6 +266,8 @@
                 assertEquals(contextName,
                         expectedChildren, servletContextDTO.filterDTOs.length);
                 assertEquals(contextName,
+                        expectedChildren, servletContextDTO.resourceDTOs.length);
+                assertEquals(contextName,
                         expectedChildren, servletContextDTO.errorPageDTOs.length);
                 assertEquals(contextName,
                         expectedChildren, servletContextDTO.listenerDTOs.length);
@@ -292,6 +301,10 @@
                     servletContextDTO.serviceId, servletContextDTO.filterDTOs);
             seenServiceIds.addAll(serviceIds);
 
+            serviceIds = assertResourceDTOs(contextName,
+                    servletContextDTO.serviceId, servletContextDTO.resourceDTOs);
+            seenServiceIds.addAll(serviceIds);
+
             serviceIds = assertErrorPageDTOs(contextName,
                     servletContextDTO.serviceId, servletContextDTO.errorPageDTOs);
             seenServiceIds.addAll(serviceIds);
@@ -300,8 +313,8 @@
                     servletContextDTO.serviceId, servletContextDTO.listenerDTOs);
             seenServiceIds.addAll(serviceIds);
         }
-        assertEquals(10, seenServiceIds.tailSet(0L).size());
-        assertEquals(7, seenServiceIds.headSet(0L).size());
+        assertEquals(12, seenServiceIds.tailSet(0L).size());
+        assertEquals(9, seenServiceIds.headSet(0L).size());
     }
 
     private Collection<Long> assertServletDTOs(String contextName, long contextId, ServletDTO[] dtos) {
@@ -401,6 +414,33 @@
         return serviceIds;
     }
 
+    private Collection<Long> assertResourceDTOs(String contextName, long contextId, ResourceDTO[] dtos) {
+        List<Long> serviceIds = new ArrayList<Long>();
+        for (ResourceDTO resourceDTO : dtos)
+        {
+            if (contextId != ID_B)
+            {
+                assertTrue(contextId + " " + contextName,
+                        resourceDTO.serviceId < 0);
+            }
+            else
+            {
+                assertTrue(contextId + " " + contextName,
+                        resourceDTO.serviceId > 0);
+            }
+            serviceIds.add(resourceDTO.serviceId);
+
+            assertEquals(contextId + " " + contextName,
+                    contextId, resourceDTO.servletContextId);
+
+            assertEquals(contextId + " " + contextName,
+                    1, resourceDTO.patterns.length);
+            assertTrue(contextId + " " + contextName,
+                    resourceDTO.patterns[0].startsWith("/"));
+        }
+        return serviceIds;
+    }
+
     private Collection<Long> assertErrorPageDTOs(String contextName, long contextId, ErrorPageDTO[] dtos)
     {
         List<Long> serviceIds = new ArrayList<Long>();
@@ -506,7 +546,21 @@
                 Collections.<String, String>emptyMap());
         FilterHandler filterHandler = new FilterHandler(null, context_0, mock(Filter.class), filterInfo);
 
-        HandlerRuntime contextRuntime = new HandlerRuntime(asList(servletHandler), asList(filterHandler), Collections.<ErrorPage>emptyList(), ID_0);
+        ServletInfo resourceInfo = createServletInfo(0,
+                ID_COUNTER.incrementAndGet(),
+                "1",
+                new String[] { "/*" },
+                null,
+                true,
+                Collections.<String, String>emptyMap());
+        Servlet resource = mock(Servlet.class);
+        ServletHandler resourceHandler = new ServletHandler(null, context_0, resourceInfo, resource);
+
+        HandlerRuntime contextRuntime = new HandlerRuntime(asList(servletHandler),
+                asList(filterHandler),
+                asList(resourceHandler),
+                Collections.<ErrorPage>emptyList(),
+                ID_0);
         setupRegistry(asList(contextHandler), asList(contextRuntime),
                 Collections.<Long, Collection<ServiceReference<?>>>emptyMap());
 
@@ -562,6 +616,7 @@
 
         HandlerRuntime contextRuntime = new HandlerRuntime(asList(servletHandler),
                 Collections.<FilterHandler>emptyList(),
+                Collections.<ServletHandler>emptyList(),
                 Collections.<ErrorPage>emptyList(),
                 ID_0);
         setupRegistry(asList(contextHandler), asList(contextRuntime),
