Index: src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java
===================================================================
--- src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java	(revision 571820)
+++ src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java	(working copy)
@@ -257,6 +257,68 @@
         assertEquals(200, response.getStatus());
     }
     
+    /**
+     * <p>This test is for bug COCOON-1939 for more than 2 level of inheritance.
+     *        
+     * <p>Servlets are connected that way:</p>
+     * <pre>
+     * 	  SerlvetC
+     * 		 ^
+     * 		 |
+     *    ServletB
+     *       ^
+     *       |
+     *    ServletA
+     * </pre>
+     * 
+     * @throws Exception
+     */
+    public void testThreeLevelInheritance() throws Exception {
+        servletA = new HttpServlet() {
+            public ServletConfig getServletConfig() { return new ServletConfigWithContext(servletAContext); }
+
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+                super.service(request, response);
+                response.setStatus(500);
+            }
+
+        };
+        
+        servletB = new HttpServlet() {
+            public ServletConfig getServletConfig() { return new ServletConfigWithContext(servletBContext); }
+            
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+            	super.service(request, response);
+                response.setStatus(500);
+            }
+        };
+        
+        servletC = new HttpServlet() {
+            public ServletConfig getServletConfig() { return new ServletConfigWithContext(servletCContext); }
+            
+            protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
+                super.service(req, response);
+                assertEquals(request, req);
+                assertEquals(response, res);
+                assertEquals(servletAContext, CallStackHelper.getBaseServletContext());
+                assertEquals(servletCContext, CallStackHelper.getCurrentServletContext());
+                res.setStatus(200);
+            }
+        };
+        servletAContext.setServlet(servletA);
+        servletBContext.setServlet(servletB);
+        servletCContext.setServlet(servletC);
+        
+        //connecting servlets
+        setMainConnection(servletA, "servletA");
+        connectServlets(servletA, servletB, "super");
+        connectServlets(servletB, servletC, "super");
+
+        RequestDispatcher dispatcher = mainContext.getNamedDispatcher("servletA");
+        dispatcher.forward(request, response);
+        assertEquals(200, response.getStatus());
+    }    
+    
     //-----------------------------------------------------------------------------------------
     
     private void connectServlets(HttpServlet connectFrom, HttpServlet connectTo, String connectionName) {
Index: src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java
===================================================================
--- src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java	(revision 571820)
+++ src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java	(working copy)
@@ -413,11 +413,22 @@
         if (this.connections == null) {
             return null;
         }
-
-        Servlet servlet = (Servlet) this.connections.get(name);
+        
+        Servlet servlet =
+            (Servlet) this.connections.get(name);
+        if (servlet == null && !name.equals(SUPER)) {
+        	Servlet _super = ((Servlet)this.connections.get(SUPER));
+        	if (_super != null) {
+        		ServletContext c = _super.getServletConfig().getServletContext();
+        		if (c instanceof ServletServiceContext)
+        			return ((ServletServiceContext)c).getNamedContext(name);
+        		
+        		return null;
+        	}
+        }        
         return servlet != null ? servlet.getServletConfig().getServletContext() : null;
     }
-
+    
     /**
      * @param mountPath The mountPath to set.
      */
@@ -466,16 +477,6 @@
 
             // Call to a named servlet service that exists in the current context
             this.context = ServletServiceContext.this.getNamedContext(this.servletServiceName);
-            if (this.context == null) {
-                // If there is a super servlet service, the connection might
-                // be defined there instead.
-                ServletServiceContext superContext =
-                        (ServletServiceContext) ServletServiceContext.this.getNamedContext(SUPER);
-                if (superContext != null) {
-                    this.context = superContext.getNamedContext(this.servletServiceName);
-                    this.superCall = true;
-                }
-            }
         }
 
         protected boolean exists() {
@@ -557,7 +558,24 @@
                     // current context for resolving super calls relative it.
                     CallStackHelper.enterSuperServlet(ServletServiceContext.this, (HttpServletRequest)request, (HttpServletResponse)response);
                 }
-                ServletServiceContext.this.servlet.service(request, response);
+                ServletException se = null;
+                try {
+                	ServletServiceContext.this.servlet.service(request, response);
+                }
+                catch (ServletException e) {
+                	se = e;
+                }
+               	int status = ((StatusRetrievableResponse)response).getStatus();
+               	if (se != null || (status < 200 || status >= 400)) {
+               		response.reset();
+               		NamedDispatcher _super = (NamedDispatcher) ServletServiceContext.this.getNamedDispatcher(SUPER);
+               		if (_super != null) {
+               			_super.forward(request, response);
+               		}
+               		else
+               			throw se;
+               	}
+
             } finally {
                 CallStackHelper.leaveServlet();
             }
Index: src/main/java/org/apache/cocoon/servletservice/DispatcherServlet.java
===================================================================
--- src/main/java/org/apache/cocoon/servletservice/DispatcherServlet.java	(revision 571820)
+++ src/main/java/org/apache/cocoon/servletservice/DispatcherServlet.java	(working copy)
@@ -28,6 +28,7 @@
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -98,7 +99,7 @@
                               " servletPath=" + request.getServletPath() +
                               " pathInfo=" + request.getPathInfo());
         }
-        
+        res = new Response(res);        
         servlet.service(request, res);
     }
     
@@ -135,4 +136,38 @@
         }
         return blockServletCollector;
     }
+    
+    private static class Response extends HttpServletResponseWrapper implements StatusRetrievableResponse {
+    	
+       	private int status;
+
+       	public Response(HttpServletResponse wrapped) {
+       		super(wrapped);
+       	}
+       	
+		public void setStatus(int sc, String sm) {
+			this.status = sc;
+			super.setStatus(sc, sm);
+		}
+
+		public void setStatus(int sc) {
+			this.status = sc;
+			super.setStatus(sc);
+		}
+		
+		public int getStatus() {
+			return this.status;
+		}
+		
+		public void sendError(int errorCode) throws IOException {
+			this.status = errorCode;
+			super.sendError(errorCode);	
+		}
+		
+		public void sendError(int errorCode, String errorMessage) throws IOException {
+			this.status = errorCode;
+			super.sendError(errorCode, errorMessage);	
+		}		
+    	    	
+    }
 }
Index: src/main/java/org/apache/cocoon/servletservice/util/BlockCallHttpServletResponse.java
===================================================================
--- src/main/java/org/apache/cocoon/servletservice/util/BlockCallHttpServletResponse.java	(revision 571820)
+++ src/main/java/org/apache/cocoon/servletservice/util/BlockCallHttpServletResponse.java	(working copy)
@@ -31,12 +31,14 @@
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.cocoon.servletservice.StatusRetrievableResponse;
+
 /**
  * Creates a HttpServletResponse object that is usable for internal block calls.
  *
  * @version $Id$
  */
-public class BlockCallHttpServletResponse implements HttpServletResponse {
+public class BlockCallHttpServletResponse implements HttpServletResponse, StatusRetrievableResponse {
 
     private OutputStream outputStream;
     private ServletOutputStream servletStream;
