 +    for (final ServletDefinition servletDefinition : servletDefinitions()) {
 +      if (servletDefinition.shouldServe(path)) {
 +        return new RequestDispatcher() {
++          @Override
 +          public void forward(ServletRequest servletRequest, ServletResponse servletResponse)
 +              throws ServletException, IOException {
-+            Preconditions.checkState(!servletResponse.isCommitted(),
++            Preconditions.checkState(
++                !servletResponse.isCommitted(),
 +                "Response has been committed--you can only call forward before"
-+                + " committing the response (hint: don't flush buffers)");
++                    + " committing the response (hint: don't flush buffers)");
 +
 +            // clear buffer before forwarding
 +            servletResponse.resetBuffer();
 +
 +            ServletRequest requestToProcess;
 +            if (servletRequest instanceof HttpServletRequest) {
-+               requestToProcess = wrapRequest((HttpServletRequest)servletRequest, newRequestUri);
++              requestToProcess = wrapRequest((HttpServletRequest) servletRequest, newRequestUri);
 +            } else {
 +              // This should never happen, but instead of throwing an exception
 +              // we will allow a happy case pass thru for maximum tolerance to

-            doServiceImpl(servletDefinition, requestToProcess, servletResponse);
-          }
-
-          public void include(ServletRequest servletRequest, ServletResponse servletResponse)
-              throws ServletException, IOException {
-            // route to the target servlet
-            doServiceImpl(servletDefinition, servletRequest, servletResponse);
-          }
-
-          private void doServiceImpl(ServletDefinition servletDefinition, ServletRequest servletRequest,
-              ServletResponse servletResponse) throws ServletException, IOException {
-            servletRequest.setAttribute(REQUEST_DISPATCHER_REQUEST, Boolean.TRUE);
-
-            try {

+   */
+  protected abstract FilterDefinition[] filterDefinitions();
+
+  @Override
+  public synchronized void initPipeline(ServletContext servletContext) throws ServletException {
+
+    //double-checked lock, prevents duplicate initialization
+    if (initialized)
