diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ErrorsMapping.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ErrorsMapping.java
index a41ce46..de8fef3 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ErrorsMapping.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ErrorsMapping.java
@@ -17,12 +17,13 @@
 package org.apache.felix.http.base.internal.handler;
 
 import static org.apache.felix.http.base.internal.util.CollectionUtils.sortedUnion;
+import static org.apache.felix.http.base.internal.util.ErrorPageUtil.parseErrorCodes;
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
-import org.apache.felix.http.base.internal.util.ErrorPageUtil;
 import org.apache.felix.http.base.internal.whiteboard.RegistrationFailureException;
 import org.osgi.service.http.runtime.dto.DTOConstants;
 
@@ -50,10 +51,10 @@
         for (Map.Entry<String, ServletHandler> errorPage : remove.entrySet())
         {
             String errorString = errorPage.getKey();
-            if (ErrorPageUtil.isErrorCode(errorString))
+            List<Integer> parsedErrorCodes = parseErrorCodes(errorString);
+            if (parsedErrorCodes != null)
             {
-                Integer errorCode = Integer.valueOf(errorString);
-                newErrorCodesMap.remove(errorCode);
+                removeAllMappings(parsedErrorCodes, newErrorCodesMap);
             }
             else
             {
@@ -64,10 +65,10 @@
         for (Map.Entry<String, ServletHandler> errorPage : add.entrySet())
         {
             String errorString = errorPage.getKey();
-            if (ErrorPageUtil.isErrorCode(errorString))
+            List<Integer> parsedErrorCodes = parseErrorCodes(errorString);
+            if (parsedErrorCodes != null)
             {
-                Integer errorCode = Integer.valueOf(errorString);
-                addErrorServlet(errorCode, errorPage.getValue(), newErrorCodesMap);
+                addErrorServlets(parsedErrorCodes, errorPage.getValue(), newErrorCodesMap);
             }
             else
             {
@@ -78,6 +79,22 @@
         return new ErrorsMapping(newErrorCodesMap, newExceptionsMap);
     }
 
+    private void removeAllMappings(List<Integer> parsedErrorCodes, Map<Integer, ServletHandler> newErrorCodesMap)
+    {
+        for (Integer errorCode : parsedErrorCodes)
+        {
+            newErrorCodesMap.remove(errorCode);
+        }
+    }
+
+    private <E> void addErrorServlets(List<E> errors, ServletHandler handler, Map<E, ServletHandler> index) throws RegistrationFailureException
+    {
+        for (E error : errors)
+        {
+            addErrorServlet(error, handler, index);
+        }
+    }
+
     private <E> void addErrorServlet(E error, ServletHandler handler, Map<E, ServletHandler> index) throws RegistrationFailureException
     {
         if (index.containsKey(error))
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
index d32af7a..10d353b 100644
--- 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
@@ -49,9 +49,10 @@
 
         for (String string : servletRuntime.getServletInfo().getErrorPage())
         {
-            if (ErrorPageUtil.isErrorCode(string))
+            List<Integer> parsedErrorCodes = ErrorPageUtil.parseErrorCodes(string);
+            if (parsedErrorCodes != null)
             {
-                errorCodes.add(Integer.valueOf(string));
+                errorCodes.addAll(parsedErrorCodes);
             }
             else
             {
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/util/ErrorPageUtil.java b/http/base/src/main/java/org/apache/felix/http/base/internal/util/ErrorPageUtil.java
index 57022af..35da8e8 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/util/ErrorPageUtil.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/util/ErrorPageUtil.java
@@ -16,15 +16,46 @@
  */
 package org.apache.felix.http.base.internal.util;
 
+import static java.util.Arrays.asList;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import java.util.regex.Pattern;
 
 public final class ErrorPageUtil
 {
-    // TODO Handle special values 4xx and 5xx
-    public static final Pattern ERROR_CODE_PATTERN = Pattern.compile("\\d{3}");
+    private static final String CLIENT_ERROR = "4xx";
+    private static final String SERVER_ERROR = "5xx";
+    private static final Pattern ERROR_CODE_PATTERN = Pattern.compile("\\d{3}");
 
-    public static boolean isErrorCode(String string)
+    private static final List<Integer> CLIENT_ERROR_CODES = hundredOf(400);
+    private static final List<Integer> SERVER_ERROR_CODES = hundredOf(500);
+
+    private static List<Integer> hundredOf(int start)
     {
-        return ERROR_CODE_PATTERN.matcher(string).matches();
+        List<Integer> result = new ArrayList<Integer>();
+        for (int i = start; i < start + 100; i++)
+        {
+            result.add(i);
+        }
+        return Collections.unmodifiableList(result);
+    }
+
+    public static List<Integer> parseErrorCodes(String string)
+    {
+        if (CLIENT_ERROR.equalsIgnoreCase(string))
+        {
+            return CLIENT_ERROR_CODES;
+        }
+        else if (SERVER_ERROR.equalsIgnoreCase(string))
+        {
+            return SERVER_ERROR_CODES;
+        }
+        else if (ERROR_CODE_PATTERN.matcher(string).matches())
+        {
+            return asList(Integer.parseInt(string));
+        }
+        return null;
     }
 }
