docs: public Runnable createRunnableHandler(final IRequest ireq ,final IResponse ires,final HttpInboundConnection inboundConnection) {
  
          String requestUri = ireq.getRequestURI();
          
          //PI05525
          // needs to make sure we normalize and then map it to an webapp. In case the request is http://host/contextroot/../ , map to / 
          if(normalizeRequestURI){            
              requestUri = WebApp.normalize(requestUri); // normalize is a helper method not mapped to any webapp
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc,"normalized request uri --> ", requestUri);
          }
                 
          WebApp sc = (WebApp) findContext(requestUri);            
          if ((sc == null) && (requestUri.indexOf("%") >= 0)) {
              // context could contain double byte char, so decode it now.
              // for performance reasons this was not decoded before doing the first look up, since it is not
              // common to have double byte chars in the context.  
              try {
                  if (this.webContainerParent.getDecodePlusSign()) {
                      requestUri = URLDecoder.decode(requestUri, this.webContainerParent.getURIEncoding());
                  } else {
                      requestUri = WSURLDecoder.decode(requestUri, this.webContainerParent.getURIEncoding());
                  }
              } catch (IOException e) {
                  // unexpected - log FFDC and leave.
                  com.ibm.wsspi.webcontainer.util.FFDCWrapper.processException(e, CLASS_NAME, "222", this);
                  return null;
              }
  
              sc = (WebApp) findContext(requestUri);
          }
  
          final WebApp webApp = sc;
  
          if (webApp == null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) { 
                  Tr.debug(this, tc, "request for--> ["+ requestUri+"], inboundConnection --> [" + inboundConnection + "], this --> " + this);
                  Tr.debug(tc, "Context not found, return null");
              }
              
              // check if we need to send back a 503 since its predefined
              if (predefinedMatcher != null && predefinedMatcher.match(requestUri) != null) {
                  return new Runnable() {
  
                      @Override
                      public void run() {
                          sendError(inboundConnection, ireq, ires);
                      }
  
                  };
              }
  
              return null;
          } else if (!webApp.isInitialized()) {
              if (startWebApp(webApp) == false) {
                  return null;
              }
          }
  
          return new Bridge() {
              HttpInboundConnection httpInboundConnection = inboundConnection;
              public void run() {
                  Exception error = null;
                  try {
                      // give a way to speed up finding the request processor: 
                      // we know where it has to come back to.. 
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) { 
                          Tr.debug(this, tc, "Webcontainer handleRequest start for--> ["+ireq.getRequestURI()+"], mapped webApp context ["+ webApp + "], inboundConnection --> [" + inboundConnection + "], this --> " + this);
                      }
                      webContainerParent.handleRequest(ireq, ires, DynamicVirtualHost.this, this);
                      
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) { 
                          Tr.debug(this, tc, "Webcontainer handleRequest complete for--> ["+ireq.getRequestURI()+"], mapped webApp context ["+ webApp + "], inboundConnection --> [" + inboundConnection + "], this --> " + this);
                      }
                      
                  } catch (IOException e) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(this, tc, "Error during request handling; " + e, inboundConnection, ireq);
                      }
                      error = e;
                  } finally {
                      // If not async, then finish.  Else, finish will need to be done by the last thread working on the response  
                      if (ireq.isStartAsync() == false)
                          inboundConnection.finish(error);
                  }
              }
  
              @Override
              public String getName() {
                  return DynamicVirtualHost.this.getName();
              }
  
              /**
               * Invocation of this is via the webContainerParent.handleRequest, and
               * from other sources that look up this vhost by name..
               * In this case, we're looking in our requestMapper by the request URI
               * to see which processor should be used to handle the request.
               */
              @Override
              public void handleRequest(ServletRequest req, ServletResponse res) throws Exception {
                  String hostAlias = WebContainer.getHostAliasKey(req.getServerName(), req.getServerPort());
  
                  addSecureRedirect(req, hostAlias);
  
                  webApp.handleRequest(req, res,  httpInboundConnection);
              }
  
              @Override
              public boolean isInternal() {
                  return DynamicVirtualHost.this.isInternal();
              }
          };
      }