FELIX-4888 : ServletHandler's are not sorted by longest matching path. DTO handling (WiP)

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1680011 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
index 138a8d0..50e2a3c 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
@@ -31,14 +31,14 @@
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.logger.SystemLogger;
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
-import org.apache.felix.http.base.internal.runtime.dto.FilterRuntime;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
 import org.apache.felix.http.base.internal.util.PatternUtil;
 import org.osgi.service.http.runtime.dto.DTOConstants;
 
 /**
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class FilterHandler implements Comparable<FilterHandler>, FilterRuntime
+public class FilterHandler implements Comparable<FilterHandler>, FilterState
 {
     private final long contextServiceId;
 
@@ -99,7 +99,6 @@
         return this.filterInfo.compareTo(other.filterInfo);
     }
 
-    @Override
     public long getContextServiceId()
     {
         return this.contextServiceId;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
index 9872ec1..25091c6 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
@@ -26,13 +26,12 @@
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.logger.SystemLogger;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.apache.felix.http.base.internal.runtime.dto.ServletRuntime;
 import org.osgi.service.http.runtime.dto.DTOConstants;
 
 /**
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public abstract class ServletHandler implements Comparable<ServletHandler>, ServletRuntime
+public abstract class ServletHandler implements Comparable<ServletHandler>
 {
     private final long contextServiceId;
 
@@ -59,7 +58,6 @@
         return this.servletInfo.compareTo(other.servletInfo);
     }
 
-    @Override
     public long getContextServiceId()
     {
         return this.contextServiceId;
@@ -70,7 +68,6 @@
         return this.context;
     }
 
-    @Override
     public Servlet getServlet()
     {
         return servlet;
@@ -87,7 +84,6 @@
         this.servlet.service(req, res);
     }
 
-    @Override
     public ServletInfo getServletInfo()
     {
         return this.servletInfo;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistry.java
index 6ad8aa9..90101e6 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistry.java
@@ -19,7 +19,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -29,11 +29,12 @@
 import java.util.regex.Pattern;
 
 import javax.annotation.Nonnull;
+import javax.servlet.Servlet;
 
 import org.apache.felix.http.base.internal.handler.ServletHandler;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.apache.felix.http.base.internal.runtime.dto.ErrorPageRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.ServletRuntime;
+import org.apache.felix.http.base.internal.runtime.dto.state.FailureServletState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.service.http.runtime.dto.DTOConstants;
 
 /**
@@ -58,7 +59,7 @@
         return Collections.unmodifiableList(result);
     }
 
-    private static String parseErrorCodes(final List<Long> codes, final String string)
+    private static String parseErrorCodes(final Set<Long> codes, final String string)
     {
         if (CLIENT_ERROR.equalsIgnoreCase(string))
         {
@@ -85,8 +86,8 @@
     private final Map<ServletInfo, ErrorRegistrationStatus> statusMapping = new ConcurrentHashMap<ServletInfo, ErrorRegistrationStatus>();
 
     private static final class ErrorRegistration {
-        final List<Long> errorCodes = new ArrayList<Long>();
-        final Set<String> exceptions = new HashSet<String>();
+        final Set<Long> errorCodes = new TreeSet<Long>();
+        final Set<String> exceptions = new TreeSet<String>();
     }
 
     private static final class ErrorRegistrationStatus {
@@ -385,50 +386,140 @@
         return result == -1;
     }
 
-    public Collection<ErrorPageRuntime> getErrorPageRuntimes()
+    public void getRuntimeInfo(final Collection<ServletState> servletStates,
+            final Collection<FailureServletState> failureServletStates)
     {
-        final Collection<ErrorPageRuntime> errorPages = new TreeSet<ErrorPageRuntime>(ServletRuntime.COMPARATOR);
-
         for(final ErrorRegistrationStatus status : this.statusMapping.values())
         {
             // TODO - we could do this calculation already when generating the status object
-            final Set<Long> activeCodes = new HashSet<Long>();
-            final Set<String> activeExceptions = new HashSet<String>();
-            final Set<Long> inactiveCodes = new HashSet<Long>();
-            final Set<String> inactiveExceptions = new HashSet<String>();
+            final ErrorRegistration active = new ErrorRegistration();
+            final Map<Integer, ErrorRegistration> inactive = new HashMap<Integer, ErrorRegistration>();
 
             for(Map.Entry<Long, Integer> codeEntry : status.errorCodeMapping.entrySet() )
             {
                 if ( codeEntry.getValue() == -1 )
                 {
-                    activeCodes.add(codeEntry.getKey());
+                    active.errorCodes.add(codeEntry.getKey());
                 }
                 else
                 {
-                    inactiveCodes.add(codeEntry.getKey());
+                    ErrorRegistration set = inactive.get(codeEntry.getValue());
+                    if ( set == null )
+                    {
+                        set = new ErrorRegistration();
+                        inactive.put(codeEntry.getValue(), set);
+                    }
+                    set.errorCodes.add(codeEntry.getKey());
                 }
             }
             for(Map.Entry<String, Integer> codeEntry : status.exceptionMapping.entrySet() )
             {
                 if ( codeEntry.getValue() == -1 )
                 {
-                    activeExceptions.add(codeEntry.getKey());
+                    active.exceptions.add(codeEntry.getKey());
                 }
                 else
                 {
-                    inactiveExceptions.add(codeEntry.getKey());
+                    ErrorRegistration set = inactive.get(codeEntry.getValue());
+                    if ( set == null )
+                    {
+                        set = new ErrorRegistration();
+                        inactive.put(codeEntry.getValue(), set);
+                    }
+                    set.exceptions.add(codeEntry.getKey());
                 }
             }
-            if ( !activeCodes.isEmpty() || !activeExceptions.isEmpty() )
+            if ( !active.errorCodes.isEmpty() || !active.exceptions.isEmpty() )
             {
-                errorPages.add(new ErrorPageRuntime(status.handler, activeCodes, activeExceptions));
+                servletStates.add(new ServletState()
+                {
+
+                    @Override
+                    public Servlet getServlet()
+                    {
+                        return status.handler.getServlet();
+                    }
+
+                    @Override
+                    public ServletInfo getServletInfo()
+                    {
+                        return status.handler.getServletInfo();
+                    }
+
+                    @Override
+                    public String[] getPatterns()
+                    {
+                        return null;
+                    }
+
+                    @Override
+                    public long[] getErrorCodes()
+                    {
+                        final long[] codes = new long[active.errorCodes.size()];
+                        final Iterator<Long> iter = active.errorCodes.iterator();
+                        for(int i=0; i<codes.length; i++)
+                        {
+                            codes[i] = iter.next();
+                        }
+                        return codes;
+                    }
+
+                    @Override
+                    public String[] getErrorExceptions()
+                    {
+                        return active.exceptions.toArray(new String[active.exceptions.size()]);
+                    }
+                });
             }
-            if ( !inactiveCodes.isEmpty() || !inactiveExceptions.isEmpty() )
+            for(final Map.Entry<Integer, ErrorRegistration> entry : inactive.entrySet())
             {
-                // add failure
+                failureServletStates.add(new FailureServletState()
+                {
+
+                    @Override
+                    public Servlet getServlet()
+                    {
+                        return status.handler.getServlet();
+                    }
+
+                    @Override
+                    public ServletInfo getServletInfo()
+                    {
+                        return status.handler.getServletInfo();
+                    }
+
+                    @Override
+                    public String[] getPatterns()
+                    {
+                        return null;
+                    }
+
+                    @Override
+                    public long[] getErrorCodes()
+                    {
+                        final long[] codes = new long[entry.getValue().errorCodes.size()];
+                        final Iterator<Long> iter = entry.getValue().errorCodes.iterator();
+                        for(int i=0; i<codes.length; i++)
+                        {
+                            codes[i] = iter.next();
+                        }
+                        return codes;
+                    }
+
+                    @Override
+                    public String[] getErrorExceptions()
+                    {
+                        return entry.getValue().exceptions.toArray(new String[entry.getValue().exceptions.size()]);
+                    }
+
+                    @Override
+                    public long getReason()
+                    {
+                        return entry.getKey();
+                    }
+
+                });
             }
         }
-
-        return errorPages;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/FilterRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/FilterRegistry.java
index 7d5649a..b69cac8 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/FilterRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/FilterRegistry.java
@@ -22,7 +22,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.annotation.CheckForNull;
@@ -32,8 +31,8 @@
 import org.apache.felix.http.base.internal.handler.FilterHandler;
 import org.apache.felix.http.base.internal.handler.ServletHandler;
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
-import org.apache.felix.http.base.internal.runtime.dto.FailureRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.FilterRuntime;
+import org.apache.felix.http.base.internal.runtime.dto.state.FailureFilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
 
 /**
  * TODO - check if add/remove needs syncing
@@ -44,10 +43,19 @@
 
     private final Map<FilterInfo, FilterRegistrationStatus> statusMapping = new ConcurrentHashMap<FilterInfo, FilterRegistrationStatus>();
 
-    private static final class FilterRegistrationStatus
+    private static final class FilterRegistrationStatus implements FailureFilterState
     {
         public int result;
         public FilterHandler handler;
+
+        @Override
+        public FilterInfo getFilterInfo() {
+            return handler.getFilterInfo();
+        }
+        @Override
+        public long getReason() {
+            return result;
+        }
     }
 
     public void addFilter(@Nonnull final FilterHandler handler)
@@ -134,11 +142,11 @@
         return false;
     }
 
-    public Collection<FilterRuntime> getFilterRuntimes(final FailureRuntime.Builder failureRuntimeBuilder)
+    public void getRuntimeInfo(final Collection<FilterState> filterRuntimes,
+            final Collection<FailureFilterState> failureFilterRuntimes)
     {
         final HandlerMapping mapping = this.filterMapping;
-        final Collection<FilterRuntime> filterRuntimes = new TreeSet<FilterRuntime>(FilterRuntime.COMPARATOR);
-        for (final FilterRuntime filterRuntime : mapping.values())
+        for (final FilterState filterRuntime : mapping.values())
         {
             filterRuntimes.add(filterRuntime);
         }
@@ -147,9 +155,8 @@
         {
             if ( status.getValue().result != -1 )
             {
-                failureRuntimeBuilder.add(status.getKey(), status.getValue().result);
+                failureFilterRuntimes.add(status.getValue());
             }
         }
-        return filterRuntimes;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java
index c67ef55..5cada7e 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java
@@ -30,7 +30,6 @@
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
 import org.apache.felix.http.base.internal.runtime.dto.ContextRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.FailureRuntime;
 
 /**
  * Registry for all services.
@@ -277,16 +276,13 @@
         return null;
     }
 
-    public List<ContextRuntime> getRuntime(FailureRuntime.Builder failureRuntimeBuilder)
+    public ContextRuntime getRuntime(final long contextId)
     {
-        final List<ContextRuntime> handlerRuntimes = new ArrayList<ContextRuntime>();
-
-        final List<PerContextHandlerRegistry> regs = this.registrations;
-        for (final PerContextHandlerRegistry contextRegistry : regs)
+        final PerContextHandlerRegistry reg = this.getRegistry(contextId);
+        if ( reg != null )
         {
-            handlerRuntimes.add(contextRegistry.getRuntime(failureRuntimeBuilder));
+            return reg.getRuntime();
         }
-
-        return handlerRuntimes;
+        return null;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java
index 26e4e95..937a963 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java
@@ -16,6 +16,9 @@
  */
 package org.apache.felix.http.base.internal.registry;
 
+import java.util.Collection;
+import java.util.TreeSet;
+
 import javax.annotation.Nonnull;
 import javax.servlet.DispatcherType;
 
@@ -25,7 +28,10 @@
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
 import org.apache.felix.http.base.internal.runtime.dto.ContextRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.FailureRuntime;
+import org.apache.felix.http.base.internal.runtime.dto.state.FailureFilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.FailureServletState;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 
 /**
  * This registry keeps track of all processing components per context:
@@ -184,14 +190,24 @@
         return this.errorPageRegistry.get(exception, code);
     }
 
-    public ContextRuntime getRuntime(final FailureRuntime.Builder failureRuntimeBuilder)
+    public ContextRuntime getRuntime()
     {
+        final Collection<FilterState> filterRuntimes = new TreeSet<FilterState>(FilterState.COMPARATOR);
+        final Collection<FailureFilterState> failureFilterRuntimes = new TreeSet<FailureFilterState>(FailureFilterState.COMPARATOR);
+        this.filterRegistry.getRuntimeInfo(filterRuntimes, failureFilterRuntimes);
+
+        final Collection<ServletState> errorPageRuntimes = new TreeSet<ServletState>(ServletState.COMPARATOR);
+        final Collection<FailureServletState> failureErrorPageRuntimes = new TreeSet<FailureServletState>(FailureServletState.COMPARATOR);
+        this.errorPageRegistry.getRuntimeInfo(errorPageRuntimes, failureErrorPageRuntimes);
         // TODO - add servlets
         // TODO - add failures from filters and error pages
-        return new ContextRuntime(this.filterRegistry.getFilterRuntimes(failureRuntimeBuilder),
-                this.errorPageRegistry.getErrorPageRuntimes(),
+        return new ContextRuntime(filterRuntimes,
+                errorPageRuntimes,
                 null,
                 null,
-                this.serviceId);
+                failureFilterRuntimes,
+                failureErrorPageRuntimes,
+                null,
+                null);
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/BaseServletDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/BaseServletDTOBuilder.java
index f975e3a..65f43a0 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/BaseServletDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/BaseServletDTOBuilder.java
@@ -21,9 +21,10 @@
 import javax.servlet.Servlet;
 
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.service.http.runtime.dto.BaseServletDTO;
 
-abstract class BaseServletDTOBuilder<T extends ServletRuntime, U extends BaseServletDTO> extends BaseDTOBuilder<T, U>
+abstract class BaseServletDTOBuilder<T extends ServletState, U extends BaseServletDTO> extends BaseDTOBuilder<T, U>
 {
     BaseServletDTOBuilder(DTOFactory<U> servletDTOFactory)
     {
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ContextRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ContextRuntime.java
index 82fe9ef..08010c1 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ContextRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ContextRuntime.java
@@ -19,61 +19,83 @@
 package org.apache.felix.http.base.internal.runtime.dto;
 
 import java.util.Collection;
-import java.util.Collections;
 
+import org.apache.felix.http.base.internal.runtime.dto.state.FailureFilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.FailureServletState;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
+
+/**
+ * Contains all information about a context wrt to the servlet/filter registry.
+ */
 public final class ContextRuntime
 {
-    private final Collection<FilterRuntime> filterRuntimes;
-    private final Collection<ErrorPageRuntime> errorPageRuntimes;
-    private final long serviceId;
-    private final Collection<ServletRuntime> servletRuntimes;
-    private final Collection<ServletRuntime> resourceRuntimes;
+    private final Collection<FilterState> filterRuntimes;
+    private final Collection<ServletState> errorPageRuntimes;
+    private final Collection<ServletState> servletRuntimes;
+    private final Collection<ServletState> resourceRuntimes;
 
+    private final Collection<FailureFilterState> failureFilterRuntimes;
+    private final Collection<FailureServletState> failureErrorPageRuntimes;
+    private final Collection<FailureServletState> failureServletRuntimes;
+    private final Collection<FailureServletState> failureResourceRuntimes;
 
-    public ContextRuntime(Collection<FilterRuntime> filterRuntimes,
-            Collection<ErrorPageRuntime> errorPageRuntimes,
-            Collection<ServletRuntime> servletRuntimes,
-            Collection<ServletRuntime> resourceRuntimes,
-            long serviceId)
+    public ContextRuntime(final Collection<FilterState> filterRuntimes,
+            final Collection<ServletState> errorPageRuntimes,
+            final Collection<ServletState> servletRuntimes,
+            final Collection<ServletState> resourceRuntimes,
+            final Collection<FailureFilterState> failureFilterRuntimes,
+            final Collection<FailureServletState> failureErrorPageRuntimes,
+            final Collection<FailureServletState> failureServletRuntimes,
+            final Collection<FailureServletState> failureResourceRuntimes)
     {
         this.filterRuntimes = filterRuntimes;
         this.errorPageRuntimes = errorPageRuntimes;
-        this.serviceId = serviceId;
         this.servletRuntimes = servletRuntimes;
         this.resourceRuntimes = resourceRuntimes;
+        this.failureFilterRuntimes = failureFilterRuntimes;
+        this.failureErrorPageRuntimes = failureErrorPageRuntimes;
+        this.failureServletRuntimes = failureServletRuntimes;
+        this.failureResourceRuntimes = failureResourceRuntimes;
     }
 
-    public static ContextRuntime empty(long serviceId)
-    {
-        return new ContextRuntime(Collections.<FilterRuntime>emptyList(),
-                Collections.<ErrorPageRuntime> emptyList(),
-                Collections.<ServletRuntime> emptyList(),
-                Collections.<ServletRuntime> emptyList(),
-                serviceId);
-    }
-
-    Collection<ServletRuntime> getServletRuntimes()
+    Collection<ServletState> getServletRuntimes()
     {
         return servletRuntimes;
     }
 
-    Collection<ServletRuntime> getResourceRuntimes()
+    Collection<ServletState> getResourceRuntimes()
     {
         return resourceRuntimes;
     }
 
-    Collection<FilterRuntime> getFilterRuntimes()
+    Collection<FilterState> getFilterRuntimes()
     {
         return filterRuntimes;
     }
 
-    Collection<ErrorPageRuntime> getErrorPageRuntimes()
+    Collection<ServletState> getErrorPageRuntimes()
     {
         return errorPageRuntimes;
     }
 
-    public long getServiceId()
+    Collection<FailureServletState> getFailureServletRuntimes()
     {
-        return serviceId;
+        return failureServletRuntimes;
+    }
+
+    Collection<FailureServletState> getFailureResourceRuntimes()
+    {
+        return failureResourceRuntimes;
+    }
+
+    Collection<FailureFilterState> getFailureFilterRuntimes()
+    {
+        return failureFilterRuntimes;
+    }
+
+    Collection<FailureServletState> getFailureErrorPageRuntimes()
+    {
+        return failureErrorPageRuntimes;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageDTOBuilder.java
index 84470a9..8cd2c35 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageDTOBuilder.java
@@ -18,12 +18,10 @@
  */
 package org.apache.felix.http.base.internal.runtime.dto;
 
-import java.util.Collection;
-import java.util.Iterator;
-
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.service.http.runtime.dto.ErrorPageDTO;
 
-final class ErrorPageDTOBuilder<T extends ErrorPageDTO> extends BaseServletDTOBuilder<ErrorPageRuntime, T>
+final class ErrorPageDTOBuilder<T extends ErrorPageDTO> extends BaseServletDTOBuilder<ServletState, T>
 {
     static ErrorPageDTOBuilder<ErrorPageDTO> create()
     {
@@ -36,22 +34,11 @@
     }
 
     @Override
-    T buildDTO(ErrorPageRuntime errorPage, long servletConextId)
+    T buildDTO(ServletState errorPage, long servletConextId)
     {
         T errorPageDTO = super.buildDTO(errorPage, servletConextId);
-        errorPageDTO.errorCodes = getErrorCodes(errorPage.getErrorCodes());
-        errorPageDTO.exceptions = errorPage.getExceptions().toArray(BuilderConstants.STRING_ARRAY);
+        errorPageDTO.errorCodes = errorPage.getErrorCodes();
+        errorPageDTO.exceptions = errorPage.getErrorExceptions();
         return errorPageDTO;
     }
-
-    private long[] getErrorCodes(Collection<Long> errorCodes)
-    {
-        Iterator<Long> itr = errorCodes.iterator();
-        long[] result = new long[errorCodes.size()];
-        for (int i = 0; i < result.length; i++)
-        {
-            result[i] = itr.next();
-        }
-        return result;
-    }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageRuntime.java
deleted file mode 100644
index 402e61f..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ErrorPageRuntime.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.http.base.internal.runtime.dto;
-
-import java.util.Collection;
-
-import javax.servlet.Servlet;
-
-import org.apache.felix.http.base.internal.runtime.ServletInfo;
-
-public class ErrorPageRuntime implements ServletRuntime
-{
-    private final ServletRuntime servletRuntime;
-    private final Collection<Long> errorCodes;
-    private final Collection<String> exceptions;
-
-    public ErrorPageRuntime(ServletRuntime servletRuntime,
-            Collection<Long> errorCodes,
-            Collection<String> exceptions)
-    {
-        this.servletRuntime = servletRuntime;
-        this.errorCodes = errorCodes;
-        this.exceptions = exceptions;
-    }
-
-    public Collection<Long> getErrorCodes()
-    {
-        return errorCodes;
-    }
-
-    public Collection<String> getExceptions()
-    {
-        return exceptions;
-    }
-
-    @Override
-    public long getContextServiceId()
-    {
-        return servletRuntime.getContextServiceId();
-    }
-
-    @Override
-    public Servlet getServlet()
-    {
-        return servletRuntime.getServlet();
-    }
-
-    @Override
-    public ServletInfo getServletInfo()
-    {
-        return servletRuntime.getServletInfo();
-    }
-}
\ No newline at end of file
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureRuntime.java
index acf935a..bf9fc35 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureRuntime.java
@@ -37,6 +37,8 @@
 import org.apache.felix.http.base.internal.runtime.ResourceInfo;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.http.runtime.dto.FailedErrorPageDTO;
 import org.osgi.service.http.runtime.dto.FailedFilterDTO;
@@ -47,10 +49,10 @@
 
 public final class FailureRuntime
 {
-    private static final FailureComparator<ErrorPageRuntime> ERROR_PAGE_COMPARATOR = FailureComparator.<ErrorPageRuntime>create(ServletRuntime.COMPARATOR);
-    private static final FailureComparator<FilterRuntime> FILTER_COMPARATOR = FailureComparator.create(FilterRuntime.COMPARATOR);
+    private static final FailureComparator<ServletState> ERROR_PAGE_COMPARATOR = FailureComparator.<ServletState>create(ServletState.COMPARATOR);
+    private static final FailureComparator<FilterState> FILTER_COMPARATOR = FailureComparator.create(FilterState.COMPARATOR);
     private static final FailureComparator<ServletContextHelperRuntime> CONTEXT_COMPARATOR = FailureComparator.create(ServletContextHelperRuntime.COMPARATOR);
-    private static final FailureComparator<ServletRuntime> SERVLET_COMPARATOR = FailureComparator.create(ServletRuntime.COMPARATOR);
+    private static final FailureComparator<ServletState> SERVLET_COMPARATOR = FailureComparator.create(ServletState.COMPARATOR);
     private static final Comparator<Failure<ServiceReference<?>>> REFERENCE_COMPARATOR = new Comparator<Failure<ServiceReference<?>>>()
     {
         @Override
@@ -61,18 +63,18 @@
     };
 
     private final List<Failure<ServletContextHelperRuntime>> contextRuntimes;
-    private final List<Failure<ServletRuntime>> servletRuntimes;
-    private final List<Failure<FilterRuntime>> filterRuntimes;
-    private final List<Failure<ServletRuntime>> resourceRuntimes;
-    private final List<Failure<ErrorPageRuntime>> errorPageRuntimes;
+    private final List<Failure<ServletState>> servletRuntimes;
+    private final List<Failure<FilterState>> filterRuntimes;
+    private final List<Failure<ServletState>> resourceRuntimes;
+    private final List<Failure<ServletState>> errorPageRuntimes;
     private final List<Failure<ServiceReference<?>>> listenerRuntimes;
 
     private FailureRuntime(List<Failure<ServletContextHelperRuntime>> contextRuntimes,
             List<Failure<ServiceReference<?>>> listenerRuntimes,
-            List<Failure<ServletRuntime>> servletRuntimes,
-            List<Failure<FilterRuntime>> filterRuntimes,
-            List<Failure<ServletRuntime>> resourceRuntimes,
-            List<Failure<ErrorPageRuntime>> errorPageRuntimes)
+            List<Failure<ServletState>> servletRuntimes,
+            List<Failure<FilterState>> filterRuntimes,
+            List<Failure<ServletState>> resourceRuntimes,
+            List<Failure<ServletState>> errorPageRuntimes)
     {
         this.contextRuntimes = contextRuntimes;
         this.servletRuntimes = servletRuntimes;
@@ -86,10 +88,10 @@
     {
         return new FailureRuntime(Collections.<Failure<ServletContextHelperRuntime>>emptyList(),
                 Collections.<Failure<ServiceReference<?>>>emptyList(),
-                Collections.<Failure<ServletRuntime>>emptyList(),
-                Collections.<Failure<FilterRuntime>>emptyList(),
-                Collections.<Failure<ServletRuntime>>emptyList(),
-                Collections.<Failure<ErrorPageRuntime>>emptyList());
+                Collections.<Failure<ServletState>>emptyList(),
+                Collections.<Failure<FilterState>>emptyList(),
+                Collections.<Failure<ServletState>>emptyList(),
+                Collections.<Failure<ServletState>>emptyList());
     }
 
     public static FailureRuntime.Builder builder()
@@ -100,14 +102,14 @@
     public FailedServletDTO[] getServletDTOs()
     {
         List<FailedServletDTO> servletDTOs = new ArrayList<FailedServletDTO>();
-        for (Failure<ServletRuntime> failure : servletRuntimes)
+        for (Failure<ServletState> failure : servletRuntimes)
         {
             servletDTOs.add(getServletDTO(failure.service, failure.failureCode));
         }
         return servletDTOs.toArray(SERVLET_FAILURE_DTO_ARRAY);
     }
 
-    private FailedServletDTO getServletDTO(ServletRuntime failedServlet, int failureCode)
+    private FailedServletDTO getServletDTO(ServletState failedServlet, int failureCode)
     {
         ServletDTOBuilder<FailedServletDTO> dtoBuilder = new ServletDTOBuilder<FailedServletDTO>(DTOFactories.FAILED_SERVLET);
         FailedServletDTO servletDTO = dtoBuilder.buildDTO(failedServlet, 0);
@@ -118,14 +120,14 @@
     public FailedFilterDTO[] getFilterDTOs()
     {
         List<FailedFilterDTO> filterDTOs = new ArrayList<FailedFilterDTO>();
-        for (Failure<FilterRuntime> failure : filterRuntimes)
+        for (Failure<FilterState> failure : filterRuntimes)
         {
             filterDTOs.add(getFilterDTO(failure.service, failure.failureCode));
         }
         return filterDTOs.toArray(FILTER_FAILURE_DTO_ARRAY);
     }
 
-    private FailedFilterDTO getFilterDTO(FilterRuntime failedFilter, int failureCode)
+    private FailedFilterDTO getFilterDTO(FilterState failedFilter, int failureCode)
     {
         FilterDTOBuilder<FailedFilterDTO> dtoBuilder = new FilterDTOBuilder<FailedFilterDTO>(DTOFactories.FAILED_FILTER);
         FailedFilterDTO filterDTO = dtoBuilder.buildDTO(failedFilter, 0);
@@ -136,14 +138,14 @@
     public FailedResourceDTO[] getResourceDTOs()
     {
         List<FailedResourceDTO> resourceDTOs = new ArrayList<FailedResourceDTO>();
-        for (Failure<ServletRuntime> failure : resourceRuntimes)
+        for (Failure<ServletState> failure : resourceRuntimes)
         {
             resourceDTOs.add(getResourceDTO(failure.service, failure.failureCode));
         }
         return resourceDTOs.toArray(RESOURCE_FAILURE_DTO_ARRAY);
     }
 
-    private FailedResourceDTO getResourceDTO(ServletRuntime failedResource, int failureCode)
+    private FailedResourceDTO getResourceDTO(ServletState failedResource, int failureCode)
     {
         ResourceDTOBuilder<FailedResourceDTO> dtoBuilder = new ResourceDTOBuilder<FailedResourceDTO>(DTOFactories.FAILED_RESOURCE);
         FailedResourceDTO resourceDTO = dtoBuilder.buildDTO(failedResource, 0);
@@ -154,14 +156,14 @@
     public FailedErrorPageDTO[] getErrorPageDTOs()
     {
         List<FailedErrorPageDTO> errorPageDTOs = new ArrayList<FailedErrorPageDTO>();
-        for (Failure<ErrorPageRuntime> failure : errorPageRuntimes)
+        for (Failure<ServletState> failure : errorPageRuntimes)
         {
             errorPageDTOs.add(getErrorPageDTO(failure.service, failure.failureCode));
         }
         return errorPageDTOs.toArray(ERROR_PAGE_FAILURE_DTO_ARRAY);
     }
 
-    private FailedErrorPageDTO getErrorPageDTO(ErrorPageRuntime failedErrorPage, int failureCode)
+    private FailedErrorPageDTO getErrorPageDTO(ServletState failedErrorPage, int failureCode)
     {
         ErrorPageDTOBuilder<FailedErrorPageDTO> dtoBuilder = new ErrorPageDTOBuilder<FailedErrorPageDTO>(DTOFactories.FAILED_ERROR_PAGE);
         FailedErrorPageDTO errorPageDTO = dtoBuilder.buildDTO(failedErrorPage, 0);
@@ -208,10 +210,10 @@
     public static class Builder
     {
         private final List<Failure<ServletContextHelperRuntime>> contextRuntimes = new ArrayList<FailureRuntime.Failure<ServletContextHelperRuntime>>();
-        private final List<Failure<ServletRuntime>> servletRuntimes = new ArrayList<Failure<ServletRuntime>>();
-        private final List<Failure<FilterRuntime>> filterRuntimes = new ArrayList<Failure<FilterRuntime>>();
-        private final List<Failure<ServletRuntime>> resourceRuntimes = new ArrayList<Failure<ServletRuntime>>();
-        private final List<Failure<ErrorPageRuntime>> errorPageRuntimes = new ArrayList<Failure<ErrorPageRuntime>>();
+        private final List<Failure<ServletState>> servletRuntimes = new ArrayList<Failure<ServletState>>();
+        private final List<Failure<FilterState>> filterRuntimes = new ArrayList<Failure<FilterState>>();
+        private final List<Failure<ServletState>> resourceRuntimes = new ArrayList<Failure<ServletState>>();
+        private final List<Failure<ServletState>> errorPageRuntimes = new ArrayList<Failure<ServletState>>();
         private final List<Failure<ServiceReference<?>>> listenerRuntimes = new ArrayList<Failure<ServiceReference<?>>>();
 
         public FailureRuntime.Builder add(Map<AbstractInfo<?>, Integer> failureInfos)
@@ -227,30 +229,33 @@
         {
             if (info instanceof ServletContextHelperInfo)
             {
-                ServletContextHelperRuntime servletRuntime = new InfoServletContextHelperRuntime((ServletContextHelperInfo) info);
-                contextRuntimes.add(new Failure<ServletContextHelperRuntime>(servletRuntime, failureCode));
+                // TODO
+//                ServletContextHelperRuntime servletRuntime = new InfoServletContextHelperRuntime((ServletContextHelperInfo) info);
+//                contextRuntimes.add(new Failure<ServletContextHelperRuntime>(servletRuntime, failureCode));
             }
             else if (info instanceof ServletInfo && ((ServletInfo) info).getErrorPage() != null)
             {
                 // TODO
-                FailureServletRuntime servletRuntime = new FailureServletRuntime((ServletInfo) info);
+//                FailureServletState servletRuntime = new FailureServletRuntime((ServletInfo) info);
 //                ErrorPageRuntime errorPageRuntime = ErrorPageRuntime.fromServletRuntime(servletRuntime);
 //                errorPageRuntimes.add(new Failure<ErrorPageRuntime>(errorPageRuntime, failureCode));
             }
             else if (info instanceof ServletInfo)
             {
-                ServletRuntime servletRuntime = new FailureServletRuntime((ServletInfo) info);
-                servletRuntimes.add(new Failure<ServletRuntime>(servletRuntime, failureCode));
+                // TODO
+//                ServletState servletRuntime = new FailureServletState((ServletInfo) info);
+//                servletRuntimes.add(new Failure<ServletRuntime>(servletRuntime, failureCode));
             }
             else if (info instanceof FilterInfo)
             {
-                FilterRuntime filterRuntime = new FailureFilterRuntime((FilterInfo) info);
-                filterRuntimes.add(new Failure<FilterRuntime>(filterRuntime, failureCode));
+                // TODO
+//                FilterState filterRuntime = new FailureFilterState((FilterInfo) info, failureCode);
+//                filterRuntimes.add(new Failure<FilterState>(filterRuntime, failureCode));
             }
             else if (info instanceof ResourceInfo)
             {
-                ServletRuntime servletRuntime = new FailureServletRuntime(new ServletInfo((ResourceInfo) info));
-                resourceRuntimes.add(new Failure<ServletRuntime>(servletRuntime, failureCode));
+//                ServletState servletRuntime = new FailureServletRuntime(new ServletInfo((ResourceInfo) info));
+//                resourceRuntimes.add(new Failure<ServletRuntime>(servletRuntime, failureCode));
             }
             else if (info instanceof ListenerInfo)
             {
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureServletRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureServletRuntime.java
deleted file mode 100644
index 2f4383f..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureServletRuntime.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.http.base.internal.runtime.dto;
-
-import javax.servlet.Servlet;
-
-import org.apache.felix.http.base.internal.runtime.ServletInfo;
-
-
-
-public class FailureServletRuntime implements ServletRuntime
-{
-    private final ServletInfo servletInfo;
-
-    FailureServletRuntime(ServletInfo servletInfo)
-    {
-        this.servletInfo = servletInfo;
-    }
-
-    @Override
-    public ServletInfo getServletInfo()
-    {
-        return servletInfo;
-    }
-
-    @Override
-    public long getContextServiceId()
-    {
-        return 0L;
-    }
-
-    @Override
-    public Servlet getServlet()
-    {
-        return null;
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterDTOBuilder.java
index 902e079..2d0d167 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterDTOBuilder.java
@@ -21,9 +21,10 @@
 import javax.servlet.DispatcherType;
 
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
 import org.osgi.service.http.runtime.dto.FilterDTO;
 
-final class FilterDTOBuilder<T extends FilterDTO> extends BaseDTOBuilder<FilterRuntime, T>
+final class FilterDTOBuilder<T extends FilterDTO> extends BaseDTOBuilder<FilterState, T>
 {
     static FilterDTOBuilder<FilterDTO> create()
     {
@@ -36,7 +37,7 @@
     }
 
     @Override
-    T buildDTO(FilterRuntime filterRuntime, long servletContextId)
+    T buildDTO(FilterState filterRuntime, long servletContextId)
     {
         FilterInfo info = filterRuntime.getFilterInfo();
 
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/InfoServletContextHelperRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/InfoServletContextHelperRuntime.java
deleted file mode 100644
index d938a8a..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/InfoServletContextHelperRuntime.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.http.base.internal.runtime.dto;
-
-import javax.servlet.ServletContext;
-
-import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
-
-public class InfoServletContextHelperRuntime implements ServletContextHelperRuntime, Comparable<InfoServletContextHelperRuntime>
-{
-    private final ServletContextHelperInfo info;
-
-    private final ServletContext servletContext;
-
-    public InfoServletContextHelperRuntime(final ServletContextHelperInfo info)
-    {
-        this(info, null);
-    }
-
-    public InfoServletContextHelperRuntime(final ServletContextHelperInfo info, final ServletContext ctx)
-    {
-        this.info = info;
-        this.servletContext = ctx;
-    }
-
-    @Override
-    public ServletContext getSharedContext()
-    {
-        return this.servletContext;
-    }
-
-    @Override
-    public ServletContextHelperInfo getContextInfo()
-    {
-        return info;
-    }
-
-    @Override
-    public int compareTo(final InfoServletContextHelperRuntime other)
-    {
-        return info.compareTo(other.info);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RegistryRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RegistryRuntime.java
index edb8be1..08a1341 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RegistryRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RegistryRuntime.java
@@ -22,62 +22,28 @@
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeSet;
 
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.framework.ServiceReference;
 
 public final class RegistryRuntime
 {
     private final Collection<ServletContextHelperRuntime> contexts;
-    private final Map<Long, Collection<ServiceReference<?>>> listenerRuntimes;
-    private final Map<Long, ContextRuntime> handlerRuntimes;
     private final FailureRuntime failureRuntime;
 
     public RegistryRuntime(Collection<ServletContextHelperRuntime> contexts,
-            Collection<ContextRuntime> contextRuntimes,
-            Map<Long, Collection<ServiceReference<?>>> listenerRuntimes,
             FailureRuntime failureRuntime)
     {
         this.contexts = contexts;
         this.failureRuntime = failureRuntime;
-        this.handlerRuntimes = createServiceIdMap(contextRuntimes);
-        // TODO
-//        this.servletRuntimes = createServletServiceIdMap(servletRegistryRuntime.getServletRuntimes());
-//        this.resourceRuntimes = createServletServiceIdMap(servletRegistryRuntime.getResourceRuntimes());
-        this.listenerRuntimes = listenerRuntimes;
     }
 
-    private static Map<Long, ContextRuntime> createServiceIdMap(Collection<ContextRuntime> contextRuntimes)
-    {
-        Map<Long, ContextRuntime> runtimesMap = new HashMap<Long, ContextRuntime>();
-        for (ContextRuntime contextRuntime : contextRuntimes)
-        {
-            runtimesMap.put(contextRuntime.getServiceId(), contextRuntime);
-        }
-        return runtimesMap;
-    }
 
-    private static Map<Long, Collection<ServletRuntime>> createServletServiceIdMap(Collection<ServletRuntime> runtimes)
-    {
-        Map<Long, Collection<ServletRuntime>> runtimesMap = new HashMap<Long, Collection<ServletRuntime>>();
-        for (ServletRuntime runtime : runtimes)
-        {
-            long contextServiceId = runtime.getContextServiceId();
-            if (!runtimesMap.containsKey(contextServiceId))
-            {
-                runtimesMap.put(contextServiceId, new TreeSet<ServletRuntime>(ServletRuntime.COMPARATOR));
-            }
-            runtimesMap.get(contextServiceId).add(runtime);
-        }
-        return runtimesMap;
-    }
 
     public ContextRuntime getHandlerRuntime(ServletContextHelperRuntime contextRuntime)
     {
         long serviceId = contextRuntime.getContextInfo().getServiceId();
-
+/**
         if (handlerRuntimes.containsKey(serviceId) && isDefaultContext(contextRuntime))
         {
             // TODO Merge with the default context of the HttpService ( handlerRuntimes.get(0) )
@@ -86,11 +52,11 @@
         else if (handlerRuntimes.containsKey(serviceId))
         {
             return handlerRuntimes.get(serviceId);
-        }
-        return ContextRuntime.empty(serviceId);
+        }**/
+        return null; //ContextRuntime.empty(serviceId);
     }
 
-    public Collection<ServletRuntime> getServletRuntimes(ServletContextHelperRuntime contextRuntime)
+    public Collection<ServletState> getServletRuntimes(ServletContextHelperRuntime contextRuntime)
     {
         /* TODO
         if (servletRuntimes.containsKey(contextRuntime.getContextInfo().getServiceId()))
@@ -101,7 +67,7 @@
         return Collections.emptyList();
     }
 
-    public Collection<ServletRuntime> getResourceRuntimes(ServletContextHelperRuntime contextRuntime)
+    public Collection<ServletState> getResourceRuntimes(ServletContextHelperRuntime contextRuntime)
     {
         /* TODO
         if (resourceRuntimes.containsKey(contextRuntime.getContextInfo().getServiceId()))
@@ -119,10 +85,11 @@
 
     public Collection<ServiceReference<?>> getListenerRuntimes(ServletContextHelperRuntime contextRuntime)
     {
+        /**
         if (listenerRuntimes.containsKey(contextRuntime.getContextInfo().getServiceId()))
         {
             return listenerRuntimes.get(contextRuntime.getContextInfo().getServiceId());
-        }
+        }*/
         return Collections.emptyList();
     }
 
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RequestInfoDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RequestInfoDTOBuilder.java
index 92a7fd3..e27f2c9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RequestInfoDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/RequestInfoDTOBuilder.java
@@ -18,9 +18,13 @@
 
 import static java.util.Arrays.asList;
 
+import javax.servlet.Servlet;
+
 import org.apache.felix.http.base.internal.handler.FilterHandler;
 import org.apache.felix.http.base.internal.registry.HandlerRegistry;
 import org.apache.felix.http.base.internal.registry.PathResolution;
+import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.service.http.runtime.dto.FilterDTO;
 import org.osgi.service.http.runtime.dto.RequestInfoDTO;
 
@@ -53,12 +57,80 @@
         if (pr.handler.getServletInfo().isResource())
         {
             requestInfoDTO.resourceDTO = ResourceDTOBuilder.create()
-                    .buildDTO(pr.handler, pr.handler.getContextServiceId());
+                    .buildDTO(new ServletState()
+                    {
+
+                        @Override
+                        public ServletInfo getServletInfo()
+                        {
+                            // TODO Auto-generated method stub
+                            return pr.handler.getServletInfo();
+                        }
+
+                        @Override
+                        public Servlet getServlet()
+                        {
+                            // TODO Auto-generated method stub
+                            return pr.handler.getServlet();
+                        }
+
+                        @Override
+                        public String[] getPatterns()
+                        {
+                            return pr.handler.getServletInfo().getPatterns();
+                        }
+
+                        @Override
+                        public String[] getErrorExceptions()
+                        {
+                            return null;
+                        }
+
+                        @Override
+                        public long[] getErrorCodes()
+                        {
+                            return null;
+                        }
+                    },
+
+                            pr.handler.getContextServiceId());
         }
         else
         {
             requestInfoDTO.servletDTO = ServletDTOBuilder.create()
-                    .buildDTO(pr.handler, pr.handler.getContextServiceId());
+                    .buildDTO(new ServletState()
+                    {
+
+                        @Override
+                        public ServletInfo getServletInfo()
+                        {
+                            return pr.handler.getServletInfo();
+                        }
+
+                        @Override
+                        public Servlet getServlet()
+                        {
+                            return pr.handler.getServlet();
+                        }
+
+                        @Override
+                        public String[] getPatterns()
+                        {
+                            return pr.handler.getServletInfo().getPatterns();
+                        }
+
+                        @Override
+                        public String[] getErrorExceptions()
+                        {
+                            return new String[0];
+                        }
+
+                        @Override
+                        public long[] getErrorCodes()
+                        {
+                            return new long[0];
+                        }
+                    }, pr.handler.getContextServiceId());
         }
 
         final FilterHandler[] filterHandlers = registry.getFilters(pr, null, path);
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 9aac097..552e4ef 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,9 +19,10 @@
 package org.apache.felix.http.base.internal.runtime.dto;
 
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.service.http.runtime.dto.ResourceDTO;
 
-final class ResourceDTOBuilder<T extends ResourceDTO> extends BaseDTOBuilder<ServletRuntime, T>
+final class ResourceDTOBuilder<T extends ResourceDTO> extends BaseDTOBuilder<ServletState, T>
 {
     static ResourceDTOBuilder<ResourceDTO> create()
     {
@@ -34,7 +35,7 @@
     }
 
     @Override
-    T buildDTO(ServletRuntime runtime, long servletContextId)
+    T buildDTO(ServletState runtime, long servletContextId)
     {
         ServletInfo servletInfo = runtime.getServletInfo();
 
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 2161d6a..e4794b7 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
@@ -18,12 +18,12 @@
  */
 package org.apache.felix.http.base.internal.runtime.dto;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -96,27 +96,29 @@
 
     private ServletContextDTO[] createContextDTOs()
     {
-        List<ServletContextDTO> contextDTOs = new ArrayList<ServletContextDTO>();
-        for (ServletContextHelperRuntime context : registry.getContexts())
+        final Collection<ServletContextHelperRuntime> contexts = registry.getContexts();
+        final ServletContextDTO[] result = new ServletContextDTO[contexts.size()];
+        int index = 0;
+        for (final ServletContextHelperRuntime context : contexts)
         {
-            contextDTOs.add(createContextDTO(context,
+            result[index++] = createContextDTO(context,
                     registry.getHandlerRuntime(context),
                     registry.getServletRuntimes(context),
                     registry.getResourceRuntimes(context),
-                    registry.getListenerRuntimes(context)));
+                    registry.getListenerRuntimes(context));
         }
-        return contextDTOs.toArray(BuilderConstants.CONTEXT_DTO_ARRAY);
+        return result;
     }
 
     private ServletContextDTO createContextDTO(ServletContextHelperRuntime context,
             ContextRuntime contextRuntime,
-            Collection<ServletRuntime> servletRuntimes,
-            Collection<ServletRuntime> resourceRuntimes,
+            Collection<ServletState> servletRuntimes,
+            Collection<ServletState> resourceRuntimes,
             Collection<ServiceReference<?>> listenerRuntimes)
     {
-        Collection<FilterRuntime> filterRuntimes = contextRuntime.getFilterRuntimes();
-        Collection<ErrorPageRuntime> errorPageRuntimes = contextRuntime.getErrorPageRuntimes();
-        long servletContextId = contextRuntime.getServiceId();
+        Collection<FilterState> filterRuntimes = contextRuntime.getFilterRuntimes();
+        Collection<ServletState> errorPageRuntimes = contextRuntime.getErrorPageRuntimes();
+        long servletContextId = context.getContextInfo().getServiceId();
 
         Collection<ServletDTO> servletDTOs = ServletDTOBuilder.create().build(servletRuntimes, servletContextId);
         Collection<ResourceDTO> resourceDTOs = ResourceDTOBuilder.create().build(resourceRuntimes, servletContextId);
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletContextHelperRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletContextHelperRuntime.java
index b597e45..04f02bb 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletContextHelperRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletContextHelperRuntime.java
@@ -18,11 +18,13 @@
  */
 package org.apache.felix.http.base.internal.runtime.dto;
 
+import java.util.Collection;
 import java.util.Comparator;
 
 import javax.servlet.ServletContext;
 
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
+import org.osgi.framework.ServiceReference;
 
 public interface ServletContextHelperRuntime
 {
@@ -38,4 +40,8 @@
     ServletContext getSharedContext();
 
     ServletContextHelperInfo getContextInfo();
+
+    ContextRuntime getContextRuntime();
+
+    Collection<ServiceReference<?>> getListeners();
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletDTOBuilder.java
index 107d683..94c8fa9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletDTOBuilder.java
@@ -19,9 +19,10 @@
 package org.apache.felix.http.base.internal.runtime.dto;
 
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.service.http.runtime.dto.ServletDTO;
 
-final class ServletDTOBuilder<T extends ServletDTO> extends BaseServletDTOBuilder<ServletRuntime, T>
+final class ServletDTOBuilder<T extends ServletDTO> extends BaseServletDTOBuilder<ServletState, T>
 {
     static ServletDTOBuilder<ServletDTO> create()
     {
@@ -34,7 +35,7 @@
     }
 
     @Override
-    T buildDTO(ServletRuntime servletRuntime, long servletContextId)
+    T buildDTO(ServletState servletRuntime, long servletContextId)
     {
         ServletInfo info = servletRuntime.getServletInfo();
 
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureFilterRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FailureFilterState.java
similarity index 61%
copy from http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureFilterRuntime.java
copy to http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FailureFilterState.java
index 52feeb3..7147f04 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureFilterRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FailureFilterState.java
@@ -16,30 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.http.base.internal.runtime.dto;
-
-import org.apache.felix.http.base.internal.runtime.FilterInfo;
+package org.apache.felix.http.base.internal.runtime.dto.state;
 
 
+public interface FailureFilterState extends FilterState {
 
-public class FailureFilterRuntime implements FilterRuntime
-{
-    private final FilterInfo filterInfo;
-
-    FailureFilterRuntime(FilterInfo FilterInfo)
-    {
-        this.filterInfo = FilterInfo;
-    }
-
-    @Override
-    public FilterInfo getFilterInfo()
-    {
-        return filterInfo;
-    }
-
-    @Override
-    public long getContextServiceId()
-    {
-        return 0L;
-    }
+    long getReason();
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureFilterRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FailureServletState.java
similarity index 61%
rename from http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureFilterRuntime.java
rename to http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FailureServletState.java
index 52feeb3..d2ce336 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailureFilterRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FailureServletState.java
@@ -16,30 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.http.base.internal.runtime.dto;
-
-import org.apache.felix.http.base.internal.runtime.FilterInfo;
+package org.apache.felix.http.base.internal.runtime.dto.state;
 
 
-
-public class FailureFilterRuntime implements FilterRuntime
+public interface FailureServletState extends ServletState
 {
-    private final FilterInfo filterInfo;
-
-    FailureFilterRuntime(FilterInfo FilterInfo)
-    {
-        this.filterInfo = FilterInfo;
-    }
-
-    @Override
-    public FilterInfo getFilterInfo()
-    {
-        return filterInfo;
-    }
-
-    @Override
-    public long getContextServiceId()
-    {
-        return 0L;
-    }
+    long getReason();
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FilterState.java
similarity index 78%
rename from http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterRuntime.java
rename to http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FilterState.java
index 501402e..ddcdcb9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FilterRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/FilterState.java
@@ -16,20 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.http.base.internal.runtime.dto;
+package org.apache.felix.http.base.internal.runtime.dto.state;
 
 import java.util.Comparator;
 
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
 
+public interface FilterState {
 
-
-public interface FilterRuntime extends WhiteboardServiceRuntime
-{
-    static final Comparator<FilterRuntime> COMPARATOR = new Comparator<FilterRuntime>()
+    static final Comparator<FilterState> COMPARATOR = new Comparator<FilterState>()
     {
         @Override
-        public int compare(FilterRuntime o1, FilterRuntime o2)
+        public int compare(final FilterState o1, final FilterState o2)
         {
             return o1.getFilterInfo().compareTo(o2.getFilterInfo());
         }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletRuntime.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/ServletState.java
similarity index 76%
rename from http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletRuntime.java
rename to http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/ServletState.java
index 0b7ee11..517dd81 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ServletRuntime.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/state/ServletState.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.http.base.internal.runtime.dto;
+package org.apache.felix.http.base.internal.runtime.dto.state;
 
 import java.util.Comparator;
 
@@ -24,14 +24,12 @@
 
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
 
-
-
-public interface ServletRuntime extends WhiteboardServiceRuntime
+public interface ServletState
 {
-    static final Comparator<ServletRuntime> COMPARATOR = new Comparator<ServletRuntime>()
+    static final Comparator<ServletState> COMPARATOR = new Comparator<ServletState>()
     {
         @Override
-        public int compare(ServletRuntime o1, ServletRuntime o2)
+        public int compare(ServletState o1, ServletState o2)
         {
             return o1.getServletInfo().compareTo(o2.getServletInfo());
         }
@@ -41,6 +39,9 @@
 
     ServletInfo getServletInfo();
 
-    long getContextServiceId();
+    String[] getPatterns();
 
+    long[] getErrorCodes();
+
+    String[] getErrorExceptions();
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java
index ab6eca5..bbfeb05 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java
@@ -22,7 +22,6 @@
 import java.util.Hashtable;
 
 import org.apache.felix.http.base.internal.registry.HandlerRegistry;
-import org.apache.felix.http.base.internal.runtime.dto.RegistryRuntime;
 import org.apache.felix.http.base.internal.runtime.dto.RequestInfoDTOBuilder;
 import org.apache.felix.http.base.internal.runtime.dto.RuntimeDTOBuilder;
 import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
@@ -50,8 +49,8 @@
     @Override
     public RuntimeDTO getRuntimeDTO()
     {
-        RegistryRuntime runtime = contextManager.getRuntime(registry);
-        RuntimeDTOBuilder runtimeDTOBuilder = new RuntimeDTOBuilder(runtime, this.serviceReference);
+        final RuntimeDTOBuilder runtimeDTOBuilder = new RuntimeDTOBuilder(contextManager.getRuntime(registry),
+                this.serviceReference);
         return runtimeDTOBuilder.build();
     }
 
@@ -84,7 +83,8 @@
     }
 
     public void setServiceReference(
-            final ServiceReference<HttpServiceRuntime> reference) {
+            final ServiceReference<HttpServiceRuntime> reference)
+    {
         this.serviceReference = reference;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
index 2555312..7b96cdd 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
@@ -24,12 +24,11 @@
 
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
-import org.apache.felix.http.base.internal.runtime.dto.ServletContextHelperRuntime;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceObjects;
 import org.osgi.service.http.context.ServletContextHelper;
 
-public final class ContextHandler implements Comparable<ContextHandler>, ServletContextHelperRuntime
+public final class ContextHandler implements Comparable<ContextHandler>
 {
     /** The info object for the context. */
     private final ServletContextHelperInfo info;
@@ -59,7 +58,6 @@
                 eventListener);
     }
 
-    @Override
     public ServletContextHelperInfo getContextInfo()
     {
         return this.info;
@@ -81,7 +79,6 @@
         this.ungetServletContext(bundle);
     }
 
-    @Override
     public ServletContext getSharedContext()
     {
         return sharedContext;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
index 776adba..f97aa24 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
@@ -61,7 +61,6 @@
 import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
 import org.apache.felix.http.base.internal.runtime.dto.ContextRuntime;
 import org.apache.felix.http.base.internal.runtime.dto.FailureRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.InfoServletContextHelperRuntime;
 import org.apache.felix.http.base.internal.runtime.dto.RegistryRuntime;
 import org.apache.felix.http.base.internal.runtime.dto.ServletContextHelperRuntime;
 import org.apache.felix.http.base.internal.service.HttpServiceFactory;
@@ -744,36 +743,78 @@
 
     private static final String HTTP_SERVICE_CONTEXT_NAME = "Http Service context";
 
-    public RegistryRuntime getRuntime(HandlerRegistry registry)
+    public RegistryRuntime getRuntime(final HandlerRegistry registry)
     {
+        // we create a ServletContextHelperRuntime for each servlet context
         final Collection<ServletContextHelperRuntime> contextRuntimes = new TreeSet<ServletContextHelperRuntime>(ServletContextHelperRuntime.COMPARATOR);
-        List<ContextRuntime> handlerRuntimes;
-        final Map<Long, Collection<ServiceReference<?>>> listenerRuntimes = new HashMap<Long, Collection<ServiceReference<?>>>();
+
         final FailureRuntime.Builder failureRuntime = FailureRuntime.builder();
         synchronized ( this.contextMap )
         {
-            for (List<ContextHandler> contextHandlerList : this.contextMap.values())
+            for (final List<ContextHandler> contextHandlerList : this.contextMap.values())
             {
                 if ( !contextHandlerList.isEmpty() )
                 {
                     final ContextHandler handler = contextHandlerList.get(0);
-                    contextRuntimes.add(handler);
+                    final ContextRuntime cr = registry.getRuntime(handler.getContextInfo().getServiceId());
+                    if ( cr != null )
+                    {
+                        contextRuntimes.add(new ServletContextHelperRuntime() {
 
-                    final long serviceId = handler.getContextInfo().getServiceId();
-                    listenerRuntimes.put(serviceId, handler.getListenerRegistry().getRuntime());
+                            @Override
+                            public ServletContext getSharedContext() {
+                                return handler.getSharedContext();
+                            }
+
+                            @Override
+                            public Collection<ServiceReference<?>> getListeners() {
+                                return handler.getListenerRegistry().getRuntime();
+                            }
+
+                            @Override
+                            public ContextRuntime getContextRuntime() {
+                                return cr;
+                            }
+
+                            @Override
+                            public ServletContextHelperInfo getContextInfo() {
+                                return handler.getContextInfo();
+                            }
+                        });
+                    }
                 }
             }
-            // TODO - this is the wrong place, it adds the context for the http service
-            final ServletContextHelperInfo info = new ServletContextHelperInfo(Integer.MAX_VALUE, 0, HTTP_SERVICE_CONTEXT_NAME, "/", null);
-            contextRuntimes.add(new InfoServletContextHelperRuntime(info, this.webContext));
-
-            handlerRuntimes = registry.getRuntime(failureRuntime);
             failureRuntime.add(serviceFailures);
         }
 
-        return new RegistryRuntime(contextRuntimes,
-            handlerRuntimes,
-            listenerRuntimes,
-            failureRuntime.build());
+        // add the context for the http service
+        final ServletContextHelperInfo info = new ServletContextHelperInfo(Integer.MAX_VALUE, 0, HTTP_SERVICE_CONTEXT_NAME, "/", null);
+        final ContextRuntime cr = registry.getRuntime(0);
+        if ( cr != null )
+        {
+            contextRuntimes.add(new ServletContextHelperRuntime() {
+
+                @Override
+                public ServletContext getSharedContext() {
+                    return webContext;
+                }
+
+                @Override
+                public Collection<ServiceReference<?>> getListeners() {
+                    return Collections.emptyList();
+                }
+
+                @Override
+                public ContextRuntime getContextRuntime() {
+                    return cr;
+                }
+
+                @Override
+                public ServletContextHelperInfo getContextInfo() {
+                    return info;
+                }
+            });
+        }
+        return new RegistryRuntime(contextRuntimes, failureRuntime.build());
     }
 }
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
index 93450d2..0abde0a 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
@@ -16,12 +16,8 @@
  */
 package org.apache.felix.http.base.internal.registry;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.List;
+import static org.junit.Assert.assertNull;
 
 import org.apache.felix.http.base.internal.runtime.dto.ContextRuntime;
 import org.junit.Test;
@@ -33,25 +29,17 @@
 
     @Test public void testInitialSetup()
     {
-        List<ContextRuntime> runtimes = registry.getRuntime(null);
-        assertNotNull(runtimes);
-        assertTrue(runtimes.isEmpty());
+        ContextRuntime runtime = registry.getRuntime(0);
+        assertNull(runtime);
 
         registry.init();
 
-        runtimes = registry.getRuntime(null);
-        assertNotNull(runtimes);
-        assertFalse(runtimes.isEmpty());
-        assertEquals(1, runtimes.size());
-
-        final ContextRuntime cr = runtimes.get(0);
-
-        assertEquals(0, cr.getServiceId());
+        runtime = registry.getRuntime(0);
+        assertNotNull(runtime);
 
         registry.shutdown();
-        runtimes = registry.getRuntime(null);
-        assertNotNull(runtimes);
-        assertTrue(runtimes.isEmpty());
+        runtime = registry.getRuntime(0);
+        assertNull(runtime);
     }
     /*
     @Test
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/WhiteboardServiceHelper.java b/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/WhiteboardServiceHelper.java
index d7a85f0..48b8668 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/WhiteboardServiceHelper.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/runtime/WhiteboardServiceHelper.java
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -34,28 +35,28 @@
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.handler.HttpServiceFilterHandler;
 import org.apache.felix.http.base.internal.handler.HttpServiceServletHandler;
-import org.apache.felix.http.base.internal.runtime.dto.ErrorPageRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.FilterRuntime;
-import org.apache.felix.http.base.internal.runtime.dto.ServletRuntime;
+import org.apache.felix.http.base.internal.handler.ServletHandler;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.osgi.framework.ServiceReference;
 
 public final class WhiteboardServiceHelper
 {
     public static final AtomicLong ID_COUNTER = new AtomicLong();
 
-    public static FilterRuntime createTestFilterWithServiceId(String identifier,
+    public static FilterState createTestFilterWithServiceId(String identifier,
             ExtServletContext context)
     {
         return createTestFilter(identifier, context, ID_COUNTER.incrementAndGet());
     }
 
-    public static FilterRuntime createTestFilter(String identifier,
+    public static FilterState createTestFilter(String identifier,
             ExtServletContext context)
     {
         return createTestFilter(identifier, context, -ID_COUNTER.incrementAndGet());
     }
 
-    private static FilterRuntime createTestFilter(String identifier,
+    private static FilterState createTestFilter(String identifier,
             ExtServletContext context,
             Long serviceId)
     {
@@ -97,19 +98,19 @@
         return info;
     }
 
-    public static ServletRuntime createTestServletWithServiceId(String identifier,
+    public static ServletState createTestServletWithServiceId(String identifier,
             ExtServletContext context,
             long contextServiceId)
     {
         return createTestServlet(identifier, context, ID_COUNTER.incrementAndGet(), contextServiceId);
     }
 
-    public static ServletRuntime createTestServlet(String identifier, ExtServletContext context, long contextServiceId)
+    public static ServletState createTestServlet(String identifier, ExtServletContext context, long contextServiceId)
     {
         return createTestServlet(identifier, context, -ID_COUNTER.incrementAndGet(), contextServiceId);
     }
 
-    private static ServletRuntime createTestServlet(String identifier,
+    private static ServletState createTestServlet(String identifier,
             ExtServletContext context,
             Long serviceId,
             Long contextServiceId)
@@ -117,7 +118,35 @@
         ServletInfo servletInfo = createServletInfo(identifier, serviceId);
         Servlet servlet = mock(Servlet.class);
         when(servlet.getServletInfo()).thenReturn("info_" + identifier);
-        return new HttpServiceServletHandler(contextServiceId, context, servletInfo, servlet);
+        final ServletHandler h = new HttpServiceServletHandler(contextServiceId, context, servletInfo, servlet);
+
+        return new ServletState() {
+
+            @Override
+            public ServletInfo getServletInfo() {
+                return h.getServletInfo();
+            }
+
+            @Override
+            public Servlet getServlet() {
+                return h.getServlet();
+            }
+
+            @Override
+            public String[] getPatterns() {
+                return h.getServletInfo().getPatterns();
+            }
+
+            @Override
+            public String[] getErrorExceptions() {
+                return null;
+            }
+
+            @Override
+            public long[] getErrorCodes() {
+                return null;
+            }
+        };
     }
 
     private static ServletInfo createServletInfo(String identifier, Long serviceId)
@@ -158,26 +187,64 @@
                 };
     }
 
-    public static ErrorPageRuntime createErrorPageWithServiceId(String identifier, ExtServletContext context, long contextServiceId)
+    public static ServletState createErrorPageWithServiceId(String identifier, ExtServletContext context, long contextServiceId)
     {
         return createErrorPage(identifier, context, ID_COUNTER.incrementAndGet(), contextServiceId);
     }
 
-    public static ErrorPageRuntime createErrorPage(String identifier, ExtServletContext context, long contextServiceId)
+    public static ServletState createErrorPage(String identifier, ExtServletContext context, long contextServiceId)
     {
         return createErrorPage(identifier, context, -ID_COUNTER.incrementAndGet(), contextServiceId);
     }
 
-    private static ErrorPageRuntime createErrorPage(String identifier,
+    private static ServletState createErrorPage(String identifier,
             ExtServletContext context,
             Long serviceId,
             long contextServiceId)
     {
-        ServletRuntime servletHandler = createTestServlet(identifier, context, serviceId, contextServiceId);
-        Collection<Long> errorCodes = Arrays.asList(400L, 500L);
-        Collection<String> exceptions = Arrays.asList("Bad request", "Error");
+        final ServletState servletHandler = createTestServlet(identifier, context, serviceId, contextServiceId);
+        final Collection<Long> errorCodes = Arrays.asList(400L, 500L);
+        final Collection<String> exceptions = Arrays.asList("Bad request", "Error");
 
-        return new ErrorPageRuntime(servletHandler, errorCodes, exceptions);
+        return new ServletState()
+        {
+
+            @Override
+            public ServletInfo getServletInfo()
+            {
+                return servletHandler.getServletInfo();
+            }
+
+            @Override
+            public Servlet getServlet()
+            {
+                return servletHandler.getServlet();
+            }
+
+            @Override
+            public String[] getPatterns()
+            {
+                return servletHandler.getPatterns();
+            }
+
+            @Override
+            public String[] getErrorExceptions()
+            {
+                return exceptions.toArray(new String[1]);
+            }
+
+            @Override
+            public long[] getErrorCodes()
+            {
+                final long[] codes = new long[errorCodes.size()];
+                final Iterator<Long> iter = errorCodes.iterator();
+                for(int i=0; i<codes.length; i++)
+                {
+                    codes[i] = iter.next();
+                }
+                return codes;
+            }
+        };
     }
 
     public static ServletContextHelperInfo createContextInfo(int serviceRanking,
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 b5f22bb..30320f6 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
@@ -58,10 +58,13 @@
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.handler.HttpServiceFilterHandler;
 import org.apache.felix.http.base.internal.handler.HttpServiceServletHandler;
+import org.apache.felix.http.base.internal.handler.ServletHandler;
 import org.apache.felix.http.base.internal.runtime.AbstractInfo;
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.state.FilterState;
+import org.apache.felix.http.base.internal.runtime.dto.state.ServletState;
 import org.apache.felix.http.base.internal.whiteboard.ContextHandler;
 import org.apache.felix.http.base.internal.whiteboard.PerContextEventListener;
 import org.junit.Before;
@@ -181,7 +184,9 @@
         sharedContext.setAttribute("stringAttr", "one");
         sharedContext.setAttribute("dtoAttr", testDTO);
 
-        return contextHandler;
+        // TODO
+        return null;
+//        return contextHandler;
     }
 
     private Map<String, String> createInitParameterMap()
@@ -223,10 +228,12 @@
             Map<Long, Collection<ServiceReference<?>>> listenerRuntimes,
             FailureRuntime failures)
     {
+        /** TODO
         registry = new RegistryRuntime(contexts,
             contextRuntimes,
             listenerRuntimes,
             failures);
+            */
     }
 
     @Test
@@ -236,30 +243,30 @@
         ServletContextHelperRuntime contextHelper_A = setupContext(context_A, "A", ID_A);
         ServletContextHelperRuntime contextHelper_B = setupContext(context_B, "B", ID_B);
 
-        List<ServletRuntime> servlets = new ArrayList<ServletRuntime>();
-        List<ServletRuntime> resources = new ArrayList<ServletRuntime>();
+        List<ServletState> servlets = new ArrayList<ServletState>();
+        List<ServletState> resources = new ArrayList<ServletState>();
 
         servlets.add(createTestServlet("1", context_0, ID_0));
         resources.add(createTestServlet("1", context_0, ID_0));
-        List<FilterRuntime> filters_0 = asList(createTestFilter("1", context_0));
-        List<ErrorPageRuntime> errorPages_0 = asList(createErrorPage("E_1", context_0, ID_0));
-        ContextRuntime contextRuntime_0 = new ContextRuntime(filters_0, errorPages_0, null, null, ID_0);
+        List<FilterState> filters_0 = asList(createTestFilter("1", context_0));
+        List<ServletState> errorPages_0 = asList(createErrorPage("E_1", context_0, ID_0));
+        ContextRuntime contextRuntime_0 = new ContextRuntime(filters_0, errorPages_0, null, null, null, null, null, null);
 
         servlets.add(createTestServlet("A_1", context_A, ID_A));
         resources.add(createTestServlet("A_1", context_A, ID_A));
-        List<FilterRuntime> filters_A = asList(createTestFilter("A_1", context_A));
-        List<ErrorPageRuntime> errorPages_A = asList(createErrorPage("E_A_1", context_A, ID_A));
-        ContextRuntime contextRuntime_A = new ContextRuntime(filters_A, errorPages_A, null, null, ID_A);
+        List<FilterState> filters_A = asList(createTestFilter("A_1", context_A));
+        List<ServletState> errorPages_A = asList(createErrorPage("E_A_1", context_A, ID_A));
+        ContextRuntime contextRuntime_A = new ContextRuntime(filters_A, errorPages_A, null, null, null, null, null, null);
 
         servlets.addAll(asList(createTestServletWithServiceId("B_1", context_B, ID_B),
                 createTestServletWithServiceId("B_2", context_B, ID_B)));
         resources.addAll(asList(createTestServletWithServiceId("B_1", context_B, ID_B),
             createTestServletWithServiceId("B_2", context_B, ID_B)));
-        List<FilterRuntime> filters_B = asList(createTestFilterWithServiceId("B_1", context_B),
+        List<FilterState> filters_B = asList(createTestFilterWithServiceId("B_1", context_B),
                 createTestFilterWithServiceId("B_2", context_B));
-        List<ErrorPageRuntime> errorPages_B = asList(createErrorPageWithServiceId("E_B_1", context_B, ID_B),
+        List<ServletState> errorPages_B = asList(createErrorPageWithServiceId("E_B_1", context_B, ID_B),
                 createErrorPageWithServiceId("E_B_2", context_B, ID_B));
-        ContextRuntime contextRuntime_B = new ContextRuntime(filters_B, errorPages_B, null, null, ID_B);
+        ContextRuntime contextRuntime_B = new ContextRuntime(filters_B, errorPages_B, null, null, null, null, null, null);
 
         Map<Long, Collection<ServiceReference<?>>> listenerRuntimes = setupListeners();
 
@@ -584,7 +591,7 @@
                 true,
                 Collections.<String, String>emptyMap());
         Servlet servlet = mock(Servlet.class);
-        ServletRuntime servletHandler = new HttpServiceServletHandler(0, context_0, servletInfo, servlet);
+        ServletHandler servletHandler = new HttpServiceServletHandler(0, context_0, servletInfo, servlet);
         when(servlet.getServletInfo()).thenReturn("info_0");
 
         FilterInfo filterInfo = createFilterInfo(0,
@@ -596,7 +603,7 @@
                 true,
                 null,
                 Collections.<String, String>emptyMap());
-        FilterRuntime filterHandler = new HttpServiceFilterHandler(0, context_0, filterInfo, mock(Filter.class));
+        FilterState filterHandler = new HttpServiceFilterHandler(0, context_0, filterInfo, mock(Filter.class));
 
         ServletInfo resourceInfo = createServletInfo(0,
                 ID_COUNTER.incrementAndGet(),
@@ -606,12 +613,12 @@
                 true,
                 Collections.<String, String>emptyMap());
         Servlet resource = mock(Servlet.class);
-        ServletRuntime resourceHandler = new HttpServiceServletHandler(ID_0, context_0, resourceInfo, resource);
+        ServletHandler resourceHandler = new HttpServiceServletHandler(ID_0, context_0, resourceInfo, resource);
 
         ContextRuntime contextRuntime = new ContextRuntime(asList(filterHandler),
-                Collections.<ErrorPageRuntime>emptyList(),
+                Collections.<ServletState>emptyList(),
                 null, null,
-                ID_0);
+                null, null, null, null);
         setupRegistry(asList(contextHandler), asList(contextRuntime),
 //                new ServletRegistryRuntime(asList(resourceHandler), asList(servletHandler)),
                 Collections.<Long, Collection<ServiceReference<?>>>emptyMap(),
@@ -635,8 +642,9 @@
         ServletContextHelperRuntime contextHandler_0 = setupContext(context_0, "0", ID_0);
         ServletContextHelperRuntime contextHandler_A = setupContext(context_A, "A", ID_A);
 
+        // TODO
         setupRegistry(asList(contextHandler_0, contextHandler_A),
-                asList(ContextRuntime.empty(ID_0), ContextRuntime.empty(ID_A)),
+null, //                asList(ContextRuntime.empty(ID_0), ContextRuntime.empty(ID_A)),
                 Collections.<Long, Collection<ServiceReference<?>>>emptyMap(),
                 FailureRuntime.empty());
 
@@ -665,13 +673,13 @@
                 true,
                 Collections.<String, String>emptyMap());
         Servlet servlet = mock(Servlet.class);
-        ServletRuntime servletHandler = new HttpServiceServletHandler(ID_0, context_0, servletInfo, servlet);
+        ServletHandler servletHandler = new HttpServiceServletHandler(ID_0, context_0, servletInfo, servlet);
         when(servlet.getServletInfo()).thenReturn("info_0");
 
-        ContextRuntime contextRuntime = new ContextRuntime(Collections.<FilterRuntime>emptyList(),
-                Collections.<ErrorPageRuntime>emptyList(),
+        ContextRuntime contextRuntime = new ContextRuntime(Collections.<FilterState>emptyList(),
+                Collections.<ServletState>emptyList(),
                 null, null,
-                ID_0);
+                null, null, null, null);
         setupRegistry(asList(contextHandler), asList(contextRuntime),
 //                new ServletRegistryRuntime(asList(servletHandler), Collections.<ServletRuntime>emptyList()),
                 Collections.<Long, Collection<ServiceReference<?>>>emptyMap(),