code: @SuppressWarnings("unchecked")
      public static <T> ThreadLocalProxy<T> createThreadLocalProxy(Class<T> type) {
          ThreadLocalProxy<?> proxy = null;
          if (UriInfo.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalUriInfo();
          } else if (HttpHeaders.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalHttpHeaders();
          } else if (ProtocolHeaders.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalProtocolHeaders();
          } else if (SecurityContext.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalSecurityContext();
          } else if (ContextResolver.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalContextResolver<Object>();
          } else if (Request.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalRequest();
          } else if (Providers.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalProviders();
          } else if (MessageContext.class.isAssignableFrom(type)) {
              proxy = new ThreadLocalMessageContext();
  // Liberty Change for CXF Begin
          } else if (type.getName().equals(MessageContext.class.getName())) {
              MessageContextProxyClassLoader loader = new MessageContextProxyClassLoader(Proxy.class.getClassLoader(), type.getClassLoader(), ThreadLocalProxy.class.getClassLoader());
              proxy = (ThreadLocalProxy<T>) Proxy.newProxyInstance(loader,
                                                                   new Class[] { type, ThreadLocalProxy.class },
                                                                   new ProxyInvocationHandler(new ThreadLocalMessageContext()));
  // Liberty Change for CXF Begin
          }
  
          if (proxy == null && isServletApiContext(type.getName())) {
              proxy = createThreadLocalServletApiContext(type.getName());
          }
          if (proxy == null) {
              ProxyClassLoader loader = new ProxyClassLoader(Proxy.class.getClassLoader());
              loader.addLoader(type.getClassLoader());
              loader.addLoader(ThreadLocalProxy.class.getClassLoader());
              return (ThreadLocalProxy<T>) Proxy.newProxyInstance(loader,
                                                                  new Class[] { type, ThreadLocalProxy.class },
                                                                  new ThreadLocalInvocationHandler<T>());
          }
  
          return (ThreadLocalProxy<T>) proxy;
      }
docs: TODO : investigate the possibility of using generic proxies only