diff --git a/.travis.yml b/.travis.yml
index 0ff322d..c6cff08 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -36,10 +36,6 @@
 
 jobs:
   include:
-    - name: amd64-jdk7
-      arch: amd64
-      jdk: openjdk7
-      script: mvn verify -B
     - name: arm64
       arch: arm64
       script: mvn verify -B
diff --git a/README.md b/README.md
index ff3516b..2736f26 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@
 Dependencies
 ------------
 
-HttpCore requires Java 1.7 compatible runtime.
+HttpCore requires Java 1.8 compatible runtime.
 
 Licensing
 ---------
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/hpack/OutboundDynamicTable.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/hpack/OutboundDynamicTable.java
index a1c2e6a..825ae84 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/hpack/OutboundDynamicTable.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/hpack/OutboundDynamicTable.java
@@ -103,11 +103,7 @@
         }
         final String key = header.getName();
         final FifoLinkedList.InternalNode node = headers.addFirst(header);
-        LinkedList<HPackEntry> nodes = mapByName.get(key);
-        if (nodes == null) {
-            nodes = new LinkedList<>();
-            mapByName.put(key, nodes);
-        }
+        final LinkedList<HPackEntry> nodes = mapByName.computeIfAbsent(key, k -> new LinkedList<>());
         nodes.addFirst(node);
         currentSize += entrySize;
         evict();
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/DefaultH2RequestConverter.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/DefaultH2RequestConverter.java
index 553aba6..7771ee5 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/DefaultH2RequestConverter.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/DefaultH2RequestConverter.java
@@ -81,25 +81,30 @@
                     throw new ProtocolException("Invalid sequence of headers (pseudo-headers must precede message headers)");
                 }
 
-                if (name.equals(H2PseudoRequestHeaders.METHOD)) {
-                    if (method != null) {
-                        throw new ProtocolException("Multiple '%s' request headers are illegal", name);
-                    }
-                    method = value;
-                } else if (name.equals(H2PseudoRequestHeaders.SCHEME)) {
-                    if (scheme != null) {
-                        throw new ProtocolException("Multiple '%s' request headers are illegal", name);
-                    }
-                    scheme = value;
-                } else if (name.equals(H2PseudoRequestHeaders.PATH)) {
-                    if (path != null) {
-                        throw new ProtocolException("Multiple '%s' request headers are illegal", name);
-                    }
-                    path = value;
-                } else if (name.equals(H2PseudoRequestHeaders.AUTHORITY)) {
-                    authority = value;
-                } else {
-                    throw new ProtocolException("Unsupported request header '%s'", name);
+                switch (name) {
+                    case H2PseudoRequestHeaders.METHOD:
+                        if (method != null) {
+                            throw new ProtocolException("Multiple '%s' request headers are illegal", name);
+                        }
+                        method = value;
+                        break;
+                    case H2PseudoRequestHeaders.SCHEME:
+                        if (scheme != null) {
+                            throw new ProtocolException("Multiple '%s' request headers are illegal", name);
+                        }
+                        scheme = value;
+                        break;
+                    case H2PseudoRequestHeaders.PATH:
+                        if (path != null) {
+                            throw new ProtocolException("Multiple '%s' request headers are illegal", name);
+                        }
+                        path = value;
+                        break;
+                    case H2PseudoRequestHeaders.AUTHORITY:
+                        authority = value;
+                        break;
+                    default:
+                        throw new ProtocolException("Unsupported request header '%s'", name);
                 }
             } else {
                 if (name.equalsIgnoreCase(HttpHeaders.CONNECTION)) {
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java
index 67d5db2..aa79ad1 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java
@@ -26,7 +26,6 @@
  */
 package org.apache.hc.core5.http2.impl.nio;
 
-import javax.net.ssl.SSLSession;
 import java.io.IOException;
 import java.net.SocketAddress;
 import java.nio.ByteBuffer;
@@ -43,7 +42,8 @@
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.hc.core5.concurrent.Cancellable;
+import javax.net.ssl.SSLSession;
+
 import org.apache.hc.core5.concurrent.CancellableDependency;
 import org.apache.hc.core5.http.ConnectionClosedException;
 import org.apache.hc.core5.http.EndpointDetails;
@@ -628,14 +628,7 @@
                 }
                 final CancellableDependency cancellableDependency = executableCommand.getCancellableDependency();
                 if (cancellableDependency != null) {
-                    cancellableDependency.setDependency(new Cancellable() {
-
-                        @Override
-                        public boolean cancel() {
-                            return stream.abort();
-                        }
-
-                    });
+                    cancellableDependency.setDependency(stream::abort);
                 }
                 if (!outputQueue.isEmpty()) {
                     return;
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientH2StreamHandler.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientH2StreamHandler.java
index a1dc57f..732e60c 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientH2StreamHandler.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientH2StreamHandler.java
@@ -49,8 +49,6 @@
 import org.apache.hc.core5.http.nio.AsyncPushConsumer;
 import org.apache.hc.core5.http.nio.DataStreamChannel;
 import org.apache.hc.core5.http.nio.HandlerFactory;
-import org.apache.hc.core5.http.nio.RequestChannel;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.apache.hc.core5.http2.H2ConnectionException;
@@ -168,15 +166,7 @@
     public void produceOutput() throws HttpException, IOException {
         switch (requestState) {
             case HEADERS:
-                exchangeHandler.produceRequest(new RequestChannel() {
-
-                    @Override
-                    public void sendRequest(
-                            final HttpRequest request, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
-                        commitRequest(request, entityDetails);
-                    }
-
-                }, context);
+                exchangeHandler.produceRequest((request, entityDetails, httpContext) -> commitRequest(request, entityDetails), context);
                 break;
             case BODY:
                 exchangeHandler.produce(dataChannel);
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequester.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequester.java
index 552b4d3..082ce9e 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequester.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequester.java
@@ -48,7 +48,6 @@
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http.impl.DefaultAddressResolver;
@@ -150,99 +149,92 @@
         Args.notNull(timeout, "Timeout");
         Args.notNull(context, "Context");
         try {
-            exchangeHandler.produceRequest(new RequestChannel() {
-
-                @Override
-                public void sendRequest(
-                        final HttpRequest request,
-                        final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
-                    final String scheme = request.getScheme();
-                    final URIAuthority authority = request.getAuthority();
-                    if (authority == null) {
-                        throw new ProtocolException("Request authority not specified");
-                    }
-                    final HttpHost target = new HttpHost(scheme, authority);
-                    connPool.getSession(target, timeout, new FutureCallback<IOSession>() {
-
-                        @Override
-                        public void completed(final IOSession ioSession) {
-                            ioSession.enqueue(new RequestExecutionCommand(new AsyncClientExchangeHandler() {
-
-                                @Override
-                                public void releaseResources() {
-                                    exchangeHandler.releaseResources();
-                                }
-
-                                @Override
-                                public void produceRequest(final RequestChannel channel, final HttpContext httpContext) throws HttpException, IOException {
-                                    channel.sendRequest(request, entityDetails, httpContext);
-                                }
-
-                                @Override
-                                public int available() {
-                                    return exchangeHandler.available();
-                                }
-
-                                @Override
-                                public void produce(final DataStreamChannel channel) throws IOException {
-                                    exchangeHandler.produce(channel);
-                                }
-
-                                @Override
-                                public void consumeInformation(final HttpResponse response, final HttpContext httpContext) throws HttpException, IOException {
-                                    exchangeHandler.consumeInformation(response, httpContext);
-                                }
-
-                                @Override
-                                public void consumeResponse(
-                                        final HttpResponse response, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
-                                    exchangeHandler.consumeResponse(response, entityDetails, httpContext);
-                                }
-
-                                @Override
-                                public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                                    exchangeHandler.updateCapacity(capacityChannel);
-                                }
-
-                                @Override
-                                public void consume(final ByteBuffer src) throws IOException {
-                                    exchangeHandler.consume(src);
-                                }
-
-                                @Override
-                                public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
-                                    exchangeHandler.streamEnd(trailers);
-                                }
-
-                                @Override
-                                public void cancel() {
-                                    exchangeHandler.cancel();
-                                }
-
-                                @Override
-                                public void failed(final Exception cause) {
-                                    exchangeHandler.failed(cause);
-                                }
-
-                            }, pushHandlerFactory, cancellableDependency, context), Command.Priority.NORMAL);
-                            if (!ioSession.isOpen()) {
-                                exchangeHandler.failed(new ConnectionClosedException());
-                            }
-                        }
-
-                        @Override
-                        public void failed(final Exception ex) {
-                            exchangeHandler.failed(ex);
-                        }
-
-                        @Override
-                        public void cancelled() {
-                            exchangeHandler.cancel();
-                        }
-
-                    });
-
+            exchangeHandler.produceRequest((request, entityDetails, httpContext) -> {
+                final String scheme = request.getScheme();
+                final URIAuthority authority = request.getAuthority();
+                if (authority == null) {
+                    throw new ProtocolException("Request authority not specified");
                 }
+                final HttpHost target = new HttpHost(scheme, authority);
+                connPool.getSession(target, timeout, new FutureCallback<IOSession>() {
+
+                    @Override
+                    public void completed(final IOSession ioSession) {
+                        ioSession.enqueue(new RequestExecutionCommand(new AsyncClientExchangeHandler() {
+
+                            @Override
+                            public void releaseResources() {
+                                exchangeHandler.releaseResources();
+                            }
+
+                            @Override
+                            public void produceRequest(final RequestChannel channel, final HttpContext httpContext) throws HttpException, IOException {
+                                channel.sendRequest(request, entityDetails, httpContext);
+                            }
+
+                            @Override
+                            public int available() {
+                                return exchangeHandler.available();
+                            }
+
+                            @Override
+                            public void produce(final DataStreamChannel channel) throws IOException {
+                                exchangeHandler.produce(channel);
+                            }
+
+                            @Override
+                            public void consumeInformation(final HttpResponse response, final HttpContext httpContext) throws HttpException, IOException {
+                                exchangeHandler.consumeInformation(response, httpContext);
+                            }
+
+                            @Override
+                            public void consumeResponse(
+                                    final HttpResponse response, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
+                                exchangeHandler.consumeResponse(response, entityDetails, httpContext);
+                            }
+
+                            @Override
+                            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                                exchangeHandler.updateCapacity(capacityChannel);
+                            }
+
+                            @Override
+                            public void consume(final ByteBuffer src) throws IOException {
+                                exchangeHandler.consume(src);
+                            }
+
+                            @Override
+                            public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
+                                exchangeHandler.streamEnd(trailers);
+                            }
+
+                            @Override
+                            public void cancel() {
+                                exchangeHandler.cancel();
+                            }
+
+                            @Override
+                            public void failed(final Exception cause) {
+                                exchangeHandler.failed(cause);
+                            }
+
+                        }, pushHandlerFactory, cancellableDependency, context), Command.Priority.NORMAL);
+                        if (!ioSession.isOpen()) {
+                            exchangeHandler.failed(new ConnectionClosedException());
+                        }
+                    }
+
+                    @Override
+                    public void failed(final Exception ex) {
+                        exchangeHandler.failed(ex);
+                    }
+
+                    @Override
+                    public void cancelled() {
+                        exchangeHandler.cancel();
+                    }
+
+                });
 
             }, context);
         } catch (final IOException | HttpException ex) {
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequesterBootstrap.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequesterBootstrap.java
index e59802a..4351b5c 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequesterBootstrap.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequesterBootstrap.java
@@ -46,12 +46,9 @@
 import org.apache.hc.core5.http2.impl.nio.H2StreamListener;
 import org.apache.hc.core5.http2.nio.support.DefaultAsyncPushConsumerFactory;
 import org.apache.hc.core5.http2.ssl.H2ClientTlsStrategy;
-import org.apache.hc.core5.reactor.IOEventHandler;
-import org.apache.hc.core5.reactor.IOEventHandlerFactory;
 import org.apache.hc.core5.reactor.IOReactorConfig;
 import org.apache.hc.core5.reactor.IOSession;
 import org.apache.hc.core5.reactor.IOSessionListener;
-import org.apache.hc.core5.reactor.ProtocolIOSession;
 import org.apache.hc.core5.util.Args;
 
 /**
@@ -210,14 +207,7 @@
                 streamListener);
         return new H2MultiplexingRequester(
                 ioReactorConfig,
-                new IOEventHandlerFactory() {
-
-                    @Override
-                    public IOEventHandler createHandler(final ProtocolIOSession ioSession, final Object attachment) {
-                        return new H2OnlyClientProtocolNegotiator(ioSession, http2StreamHandlerFactory, strictALPNHandshake);
-                    }
-
-                },
+                (ioSession, attachment) -> new H2OnlyClientProtocolNegotiator(ioSession, http2StreamHandlerFactory, strictALPNHandshake),
                 ioSessionDecorator,
                 exceptionCallback,
                 sessionListener,
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
index 44adb0d..bce7df9 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
@@ -295,7 +295,7 @@
                         defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
                         timeToLive,
                         poolReusePolicy,
-                        new DefaultDisposalCallback<IOSession>(),
+                        new DefaultDisposalCallback<>(),
                         connPoolListener);
                 break;
             case STRICT:
@@ -305,7 +305,7 @@
                         maxTotal > 0 ? maxTotal : 50,
                         timeToLive,
                         poolReusePolicy,
-                        new DefaultDisposalCallback<IOSession>(),
+                        new DefaultDisposalCallback<>(),
                         connPoolListener);
                 break;
         }
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2ServerBootstrap.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2ServerBootstrap.java
index a983611..5448c9b 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2ServerBootstrap.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2ServerBootstrap.java
@@ -268,14 +268,7 @@
     public final <T> H2ServerBootstrap register(
             final String uriPattern,
             final AsyncServerRequestHandler<T> requestHandler) {
-        register(uriPattern, new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new BasicServerExchangeHandler<>(requestHandler);
-            }
-
-        });
+        register(uriPattern, () -> new BasicServerExchangeHandler<>(requestHandler));
         return this;
     }
 
@@ -291,14 +284,7 @@
             final String hostname,
             final String uriPattern,
             final AsyncServerRequestHandler<T> requestHandler) {
-        registerVirtual(hostname, uriPattern, new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new BasicServerExchangeHandler<>(requestHandler);
-            }
-
-        });
+        registerVirtual(hostname, uriPattern, () -> new BasicServerExchangeHandler<>(requestHandler));
         return this;
     }
 
@@ -358,15 +344,8 @@
         final String actualCanonicalHostName = canonicalHostName != null ? canonicalHostName : InetAddressUtils.getCanonicalLocalHostName();
         final RequestHandlerRegistry<Supplier<AsyncServerExchangeHandler>> registry = new RequestHandlerRegistry<>(
                 actualCanonicalHostName,
-                new Supplier<LookupRegistry<Supplier<AsyncServerExchangeHandler>>>() {
-
-                    @Override
-                    public LookupRegistry<Supplier<AsyncServerExchangeHandler>> get() {
-                        return lookupRegistry != null ? lookupRegistry :
-                                UriPatternType.<Supplier<AsyncServerExchangeHandler>>newMatcher(UriPatternType.URI_PATTERN);
-                    }
-
-                });
+                () -> lookupRegistry != null ? lookupRegistry :
+                        UriPatternType.<Supplier<AsyncServerExchangeHandler>>newMatcher(UriPatternType.URI_PATTERN));
         for (final HandlerEntry<Supplier<AsyncServerExchangeHandler>> entry: handlerList) {
             registry.register(entry.hostname, entry.uriPattern, entry.handler);
         }
@@ -412,14 +391,7 @@
 
             handlerFactory = new AsyncServerFilterChainExchangeHandlerFactory(execChain, exceptionCallback);
         } else {
-            handlerFactory = new DefaultAsyncResponseExchangeHandlerFactory(registry, new Decorator<AsyncServerExchangeHandler>() {
-
-                @Override
-                public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-                    return new BasicAsyncServerExpectationDecorator(handler, exceptionCallback);
-                }
-
-            });
+            handlerFactory = new DefaultAsyncResponseExchangeHandlerFactory(registry, handler -> new BasicAsyncServerExpectationDecorator(handler, exceptionCallback));
         }
 
         final ServerH2StreamMultiplexerFactory http2StreamHandlerFactory = new ServerH2StreamMultiplexerFactory(
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java
index 8b8f32b..37107ca 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java
@@ -139,14 +139,9 @@
             final long deadline = lastAccessTime + timeValue.toMilliseconds();
             if (deadline <= System.currentTimeMillis()) {
                 final Timeout socketTimeoutMillis = ioSession.getSocketTimeout();
-                ioSession.enqueue(new PingCommand(new BasicPingHandler(new Callback<Boolean>() {
-
-                    @Override
-                    public void execute(final Boolean result) {
-                        ioSession.setSocketTimeout(socketTimeoutMillis);
-                        callback.execute(result);
-                    }
-
+                ioSession.enqueue(new PingCommand(new BasicPingHandler(result -> {
+                    ioSession.setSocketTimeout(socketTimeoutMillis);
+                    callback.execute(result);
                 })), Command.Priority.NORMAL);
                 return;
             }
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/ConscryptSupport.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/ConscryptSupport.java
index 2c2440b..4cd7a6e 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/ConscryptSupport.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/ConscryptSupport.java
@@ -27,13 +27,10 @@
 
 package org.apache.hc.core5.http2.ssl;
 
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLParameters;
 
 import org.apache.hc.core5.http.ssl.TLS;
 import org.apache.hc.core5.http.ssl.TlsCiphers;
-import org.apache.hc.core5.net.NamedEndpoint;
 import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
 import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier;
 import org.apache.hc.core5.reactor.ssl.TlsDetails;
@@ -49,42 +46,32 @@
     public static SSLSessionInitializer initialize(
             final Object attachment,
             final SSLSessionInitializer initializer) {
-        return new SSLSessionInitializer() {
-
-            @Override
-            public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                final SSLParameters sslParameters = sslEngine.getSSLParameters();
-                sslParameters.setProtocols(TLS.excludeWeak(sslParameters.getProtocols()));
-                sslParameters.setCipherSuites(TlsCiphers.excludeH2Blacklisted(sslParameters.getCipherSuites()));
-                H2TlsSupport.setEnableRetransmissions(sslParameters, false);
-                final String[] appProtocols = H2TlsSupport.selectApplicationProtocols(attachment);
-                if (Conscrypt.isConscrypt(sslEngine)) {
-                    sslEngine.setSSLParameters(sslParameters);
-                    Conscrypt.setApplicationProtocols(sslEngine, appProtocols);
-                } else {
-                    H2TlsSupport.setApplicationProtocols(sslParameters, appProtocols);
-                    sslEngine.setSSLParameters(sslParameters);
-                }
-                if (initializer != null) {
-                    initializer.initialize(endpoint, sslEngine);
-                }
+        return (endpoint, sslEngine) -> {
+            final SSLParameters sslParameters = sslEngine.getSSLParameters();
+            sslParameters.setProtocols(TLS.excludeWeak(sslParameters.getProtocols()));
+            sslParameters.setCipherSuites(TlsCiphers.excludeH2Blacklisted(sslParameters.getCipherSuites()));
+            H2TlsSupport.setEnableRetransmissions(sslParameters, false);
+            final String[] appProtocols = H2TlsSupport.selectApplicationProtocols(attachment);
+            if (Conscrypt.isConscrypt(sslEngine)) {
+                sslEngine.setSSLParameters(sslParameters);
+                Conscrypt.setApplicationProtocols(sslEngine, appProtocols);
+            } else {
+                H2TlsSupport.setApplicationProtocols(sslParameters, appProtocols);
+                sslEngine.setSSLParameters(sslParameters);
             }
-
+            if (initializer != null) {
+                initializer.initialize(endpoint, sslEngine);
+            }
         };
     }
 
     public static SSLSessionVerifier verify(final SSLSessionVerifier verifier) {
-        return new SSLSessionVerifier() {
-
-            @Override
-            public TlsDetails verify(final NamedEndpoint endpoint, final SSLEngine sslEngine) throws SSLException {
-                TlsDetails tlsDetails = verifier != null ? verifier.verify(endpoint, sslEngine) : null;
-                if (tlsDetails == null && Conscrypt.isConscrypt(sslEngine)) {
-                    tlsDetails = new TlsDetails(sslEngine.getSession(), Conscrypt.getApplicationProtocol(sslEngine));
-                }
-                return tlsDetails;
+        return (endpoint, sslEngine) -> {
+            TlsDetails tlsDetails = verifier != null ? verifier.verify(endpoint, sslEngine) : null;
+            if (tlsDetails == null && Conscrypt.isConscrypt(sslEngine)) {
+                tlsDetails = new TlsDetails(sslEngine.getSession(), Conscrypt.getApplicationProtocol(sslEngine));
             }
-
+            return tlsDetails;
         };
     }
 
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/H2TlsSupport.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/H2TlsSupport.java
index da46bc5..4362ee3 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/H2TlsSupport.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/ssl/H2TlsSupport.java
@@ -27,13 +27,11 @@
 
 package org.apache.hc.core5.http2.ssl;
 
-import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
 
 import org.apache.hc.core5.http.ssl.TLS;
 import org.apache.hc.core5.http.ssl.TlsCiphers;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
-import org.apache.hc.core5.net.NamedEndpoint;
 import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
 import org.apache.hc.core5.util.ReflectionUtils;
 
@@ -68,21 +66,16 @@
     public static SSLSessionInitializer enforceRequirements(
             final Object attachment,
             final SSLSessionInitializer initializer) {
-        return new SSLSessionInitializer() {
-
-            @Override
-            public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                final SSLParameters sslParameters = sslEngine.getSSLParameters();
-                sslParameters.setProtocols(TLS.excludeWeak(sslParameters.getProtocols()));
-                sslParameters.setCipherSuites(TlsCiphers.excludeH2Blacklisted(sslParameters.getCipherSuites()));
-                setEnableRetransmissions(sslParameters, false);
-                setApplicationProtocols(sslParameters, selectApplicationProtocols(attachment));
-                sslEngine.setSSLParameters(sslParameters);
-                if (initializer != null) {
-                    initializer.initialize(endpoint, sslEngine);
-                }
+        return (endpoint, sslEngine) -> {
+            final SSLParameters sslParameters = sslEngine.getSSLParameters();
+            sslParameters.setProtocols(TLS.excludeWeak(sslParameters.getProtocols()));
+            sslParameters.setCipherSuites(TlsCiphers.excludeH2Blacklisted(sslParameters.getCipherSuites()));
+            setEnableRetransmissions(sslParameters, false);
+            setApplicationProtocols(sslParameters, selectApplicationProtocols(attachment));
+            sslEngine.setSSLParameters(sslParameters);
+            if (initializer != null) {
+                initializer.initialize(endpoint, sslEngine);
             }
-
         };
     }
 
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2ConscriptRequestExecutionExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2ConscriptRequestExecutionExample.java
index 197bd33..e33f4e2 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2ConscriptRequestExecutionExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2ConscriptRequestExecutionExample.java
@@ -59,7 +59,7 @@
  */
 public class H2ConscriptRequestExecutionExample {
 
-    public final static void main(final String[] args) throws Exception {
+    public static void main(final String[] args) throws Exception {
 
         // Create and start requester
         final H2Config h2Config = H2Config.custom()
@@ -107,13 +107,10 @@
 
                 })
                 .create();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final HttpHost target = new HttpHost("https", "nghttp2.org", 443);
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FileServerExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FileServerExample.java
index daa975f..5104751 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FileServerExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FileServerExample.java
@@ -51,7 +51,7 @@
 import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
 import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
 import org.apache.hc.core5.http.nio.entity.AsyncEntityProducers;
-import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
+import org.apache.hc.core5.http.nio.entity.DiscardingEntityConsumer;
 import org.apache.hc.core5.http.nio.support.AsyncResponseBuilder;
 import org.apache.hc.core5.http.nio.support.BasicRequestConsumer;
 import org.apache.hc.core5.http.protocol.HttpContext;
@@ -130,7 +130,7 @@
                             final HttpRequest request,
                             final EntityDetails entityDetails,
                             final HttpContext context) throws HttpException {
-                        return new BasicRequestConsumer<>(entityDetails != null ? new NoopEntityConsumer() : null);
+                        return new BasicRequestConsumer<>(entityDetails != null ? new DiscardingEntityConsumer<>() : null);
                     }
 
                     @Override
@@ -194,13 +194,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
+        }));
 
         server.start();
         final Future<ListenerEndpoint> future = server.listen(new InetSocketAddress(port), URIScheme.HTTP);
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexClientExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexClientExample.java
index 43d36b9..c752175 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexClientExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexClientExample.java
@@ -113,13 +113,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final URI requestUri = new URI("http://nghttp2.org/httpbin/post");
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexServerExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexServerExample.java
index 78e5f59..d09f09b 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexServerExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2FullDuplexServerExample.java
@@ -34,7 +34,6 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpConnection;
@@ -118,122 +117,112 @@
                     }
 
                 })
-                .register("/echo", new Supplier<AsyncServerExchangeHandler>() {
+                .register("/echo", () -> new AsyncServerExchangeHandler() {
+
+                    ByteBuffer buffer = ByteBuffer.allocate(2048);
+                    CapacityChannel inputCapacityChannel;
+                    DataStreamChannel outputDataChannel;
+                    boolean endStream;
+
+                    private void ensureCapacity(final int chunk) {
+                        if (buffer.remaining() < chunk) {
+                            final ByteBuffer oldBuffer = buffer;
+                            oldBuffer.flip();
+                            buffer = ByteBuffer.allocate(oldBuffer.remaining() + (chunk > 2048 ? chunk : 2048));
+                            buffer.put(oldBuffer);
+                        }
+                    }
 
                     @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new AsyncServerExchangeHandler() {
+                    public void handleRequest(
+                            final HttpRequest request,
+                            final EntityDetails entityDetails,
+                            final ResponseChannel responseChannel,
+                            final HttpContext context) throws HttpException, IOException {
+                        final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_OK);
+                        responseChannel.sendResponse(response, entityDetails, context);
+                    }
 
-                            ByteBuffer buffer = ByteBuffer.allocate(2048);
-                            CapacityChannel inputCapacityChannel;
-                            DataStreamChannel outputDataChannel;
-                            boolean endStream;
-
-                            private void ensureCapacity(final int chunk) {
-                                if (buffer.remaining() < chunk) {
-                                    final ByteBuffer oldBuffer = buffer;
-                                    oldBuffer.flip();
-                                    buffer = ByteBuffer.allocate(oldBuffer.remaining() + (chunk > 2048 ? chunk : 2048));
-                                    buffer.put(oldBuffer);
-                                }
+                    @Override
+                    public void consume(final ByteBuffer src) throws IOException {
+                        if (buffer.position() == 0) {
+                            if (outputDataChannel != null) {
+                                outputDataChannel.write(src);
                             }
-
-                            @Override
-                            public void handleRequest(
-                                    final HttpRequest request,
-                                    final EntityDetails entityDetails,
-                                    final ResponseChannel responseChannel,
-                                    final HttpContext context) throws HttpException, IOException {
-                                final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_OK);
-                                responseChannel.sendResponse(response, entityDetails, context);
+                        }
+                        if (src.hasRemaining()) {
+                            ensureCapacity(src.remaining());
+                            buffer.put(src);
+                            if (outputDataChannel != null) {
+                                outputDataChannel.requestOutput();
                             }
+                        }
+                    }
 
-                            @Override
-                            public void consume(final ByteBuffer src) throws IOException {
-                                if (buffer.position() == 0) {
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.write(src);
-                                    }
-                                }
-                                if (src.hasRemaining()) {
-                                    ensureCapacity(src.remaining());
-                                    buffer.put(src);
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.requestOutput();
-                                    }
-                                }
+                    @Override
+                    public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                        if (buffer.hasRemaining()) {
+                            capacityChannel.update(buffer.remaining());
+                            inputCapacityChannel = null;
+                        } else {
+                            inputCapacityChannel = capacityChannel;
+                        }
+                    }
+
+                    @Override
+                    public void streamEnd(final List<? extends Header> trailers) throws IOException {
+                        endStream = true;
+                        if (buffer.position() == 0) {
+                            if (outputDataChannel != null) {
+                                outputDataChannel.endStream();
                             }
-
-                            @Override
-                            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                                if (buffer.hasRemaining()) {
-                                    capacityChannel.update(buffer.remaining());
-                                    inputCapacityChannel = null;
-                                } else {
-                                    inputCapacityChannel = capacityChannel;
-                                }
+                        } else {
+                            if (outputDataChannel != null) {
+                                outputDataChannel.requestOutput();
                             }
+                        }
+                    }
 
-                            @Override
-                            public void streamEnd(final List<? extends Header> trailers) throws IOException {
-                                endStream = true;
-                                if (buffer.position() == 0) {
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.endStream();
-                                    }
-                                } else {
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.requestOutput();
-                                    }
-                                }
-                            }
+                    @Override
+                    public int available() {
+                        return buffer.position();
+                    }
 
-                            @Override
-                            public int available() {
-                                return buffer.position();
-                            }
+                    @Override
+                    public void produce(final DataStreamChannel channel) throws IOException {
+                        outputDataChannel = channel;
+                        buffer.flip();
+                        if (buffer.hasRemaining()) {
+                            channel.write(buffer);
+                        }
+                        buffer.compact();
+                        if (buffer.position() == 0 && endStream) {
+                            channel.endStream();
+                        }
+                        final CapacityChannel capacityChannel = inputCapacityChannel;
+                        if (capacityChannel != null && buffer.hasRemaining()) {
+                            capacityChannel.update(buffer.remaining());
+                        }
+                    }
 
-                            @Override
-                            public void produce(final DataStreamChannel channel) throws IOException {
-                                outputDataChannel = channel;
-                                buffer.flip();
-                                if (buffer.hasRemaining()) {
-                                    channel.write(buffer);
-                                }
-                                buffer.compact();
-                                if (buffer.position() == 0 && endStream) {
-                                    channel.endStream();
-                                }
-                                final CapacityChannel capacityChannel = inputCapacityChannel;
-                                if (capacityChannel != null && buffer.hasRemaining()) {
-                                    capacityChannel.update(buffer.remaining());
-                                }
-                            }
+                    @Override
+                    public void failed(final Exception cause) {
+                        if (!(cause instanceof SocketException)) {
+                            cause.printStackTrace(System.out);
+                        }
+                    }
 
-                            @Override
-                            public void failed(final Exception cause) {
-                                if (!(cause instanceof SocketException)) {
-                                    cause.printStackTrace(System.out);
-                                }
-                            }
-
-                            @Override
-                            public void releaseResources() {
-                            }
-
-                        };
+                    @Override
+                    public void releaseResources() {
                     }
 
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
+        }));
 
         server.start();
         final Future<ListenerEndpoint> future = server.listen(new InetSocketAddress(port), URIScheme.HTTP);
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2GreetingServer.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2GreetingServer.java
index 8e1c65c..c6f86b4 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2GreetingServer.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2GreetingServer.java
@@ -33,7 +33,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.EndpointDetails;
 import org.apache.hc.core5.http.EntityDetails;
@@ -49,10 +48,9 @@
 import org.apache.hc.core5.http.message.BasicHttpResponse;
 import org.apache.hc.core5.http.nio.AsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
 import org.apache.hc.core5.http.nio.entity.AsyncEntityProducers;
-import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
+import org.apache.hc.core5.http.nio.entity.DiscardingEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.support.AbstractServerExchangeHandler;
 import org.apache.hc.core5.http.nio.support.BasicRequestConsumer;
@@ -98,21 +96,13 @@
                 .setVersionPolicy(HttpVersionPolicy.NEGOTIATE) // fallback to HTTP/1 as needed
 
                 // wildcard path matcher:
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new CustomServerExchangeHandler();
-                    }
-                })
+                .register("*", CustomServerExchangeHandler::new)
                 .create();
 
 
-        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
-            @Override
-            public void run() {
-                System.out.println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
         }));
 
         server.start();
@@ -131,7 +121,7 @@
                 final EntityDetails entityDetails,
                 final HttpContext context) {
             // if there's no body don't try to parse entity:
-            AsyncEntityConsumer entityConsumer = new NoopEntityConsumer();
+            AsyncEntityConsumer<String> entityConsumer = new DiscardingEntityConsumer<>();
 
             if (entityDetails != null) {
                 entityConsumer = new StringAsyncEntityConsumer();
@@ -155,10 +145,10 @@
             final HttpResponse resp = new BasicHttpResponse(200);
 
             // recording the request
-            System.out.println(String.format("[%s] %s %s %s", new Date(),
+            System.out.printf("[%s] %s %s %s%n", new Date(),
                     endpoint.getRemoteAddress(),
                     req.getMethod(),
-                    req.getPath()));
+                    req.getPath());
 
             // Request without an entity - GET/HEAD/DELETE
             if (httpEntity == null) {
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2MultiStreamExecutionExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2MultiStreamExecutionExample.java
index f1545bc..2628387 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2MultiStreamExecutionExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2MultiStreamExecutionExample.java
@@ -106,13 +106,10 @@
 
                 })
                 .create();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final HttpHost target = new HttpHost("nghttp2.org");
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2RequestExecutionExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2RequestExecutionExample.java
index c150353..3653bae 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2RequestExecutionExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2RequestExecutionExample.java
@@ -98,13 +98,10 @@
 
                 })
                 .create();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final HttpHost target = new HttpHost("nghttp2.org");
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2TlsAlpnRequestExecutionExample.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2TlsAlpnRequestExecutionExample.java
index 53aae42..5a67e09 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2TlsAlpnRequestExecutionExample.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2TlsAlpnRequestExecutionExample.java
@@ -30,9 +30,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Future;
 
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLException;
-
 import org.apache.hc.core5.concurrent.FutureCallback;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpConnection;
@@ -50,9 +47,6 @@
 import org.apache.hc.core5.http2.impl.nio.bootstrap.H2RequesterBootstrap;
 import org.apache.hc.core5.http2.ssl.H2ClientTlsStrategy;
 import org.apache.hc.core5.io.CloseMode;
-import org.apache.hc.core5.net.NamedEndpoint;
-import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier;
-import org.apache.hc.core5.reactor.ssl.TlsDetails;
 import org.apache.hc.core5.ssl.SSLContexts;
 import org.apache.hc.core5.util.Timeout;
 
@@ -63,7 +57,7 @@
  */
 public class H2TlsAlpnRequestExecutionExample {
 
-    public final static void main(final String[] args) throws Exception {
+    public static void main(final String[] args) throws Exception {
         // Create and start requester
         final H2Config h2Config = H2Config.custom()
                 .setPushEnabled(false)
@@ -71,18 +65,13 @@
 
         final HttpAsyncRequester requester = H2RequesterBootstrap.bootstrap()
                 .setH2Config(h2Config)
-                .setTlsStrategy(new H2ClientTlsStrategy(SSLContexts.createSystemDefault(), new SSLSessionVerifier() {
-
-                    @Override
-                    public TlsDetails verify(final NamedEndpoint endpoint, final SSLEngine sslEngine) throws SSLException {
-                        // IMPORTANT uncomment the following line when running Java 9 or older
-                        // in order to avoid the illegal reflective access operation warning
-                        // ====
-                        // return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol());
-                        // ====
-                        return null;
-                    }
-
+                .setTlsStrategy(new H2ClientTlsStrategy(SSLContexts.createSystemDefault(), (endpoint, sslEngine) -> {
+                    // IMPORTANT uncomment the following line when running Java 9 or older
+                    // in order to avoid the illegal reflective access operation warning
+                    // ====
+                    // return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol());
+                    // ====
+                    return null;
                 }))
                 .setStreamListener(new H2StreamListener() {
 
@@ -118,13 +107,10 @@
 
                 })
                 .create();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final HttpHost target = new HttpHost("https", "nghttp2.org", 443);
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2RequestConverter.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2RequestConverter.java
index ea734fc..f15078a 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2RequestConverter.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2RequestConverter.java
@@ -45,7 +45,7 @@
 public class TestDefaultH2RequestConverter {
 
     @Rule
-    public ExpectedException thrown = ExpectedException.none();
+    public final ExpectedException thrown = ExpectedException.none();
 
     @Test
     public void testConvertFromFieldsBasic() throws Exception {
diff --git a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2ResponseConverter.java b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2ResponseConverter.java
index 1307f25..b3af5d7 100644
--- a/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2ResponseConverter.java
+++ b/httpcore5-h2/src/test/java/org/apache/hc/core5/http2/impl/TestDefaultH2ResponseConverter.java
@@ -43,7 +43,7 @@
 public class TestDefaultH2ResponseConverter {
 
     @Rule
-    public ExpectedException thrown = ExpectedException.none();
+    public final ExpectedException thrown = ExpectedException.none();
 
     @Test
     public void testConvertFromFieldsBasic() throws Exception {
diff --git a/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveResponseConsumer.java b/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveResponseConsumer.java
index 48a68d3..196f7a1 100644
--- a/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveResponseConsumer.java
+++ b/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveResponseConsumer.java
@@ -60,7 +60,7 @@
 public final class ReactiveResponseConsumer implements AsyncResponseConsumer<Void> {
 
     private final ReactiveDataConsumer reactiveDataConsumer = new ReactiveDataConsumer();
-    private final List<Header> trailers = Collections.synchronizedList(new ArrayList<Header>());
+    private final List<Header> trailers = Collections.synchronizedList(new ArrayList<>());
     private final BasicFuture<Message<HttpResponse, Publisher<ByteBuffer>>> responseFuture;
 
     private volatile BasicFuture<Void> responseCompletion;
@@ -124,7 +124,7 @@
     ) {
         this.entityDetails = entityDetails;
         this.responseCompletion = new BasicFuture<>(resultCallback);
-        this.responseFuture.completed(new Message<HttpResponse, Publisher<ByteBuffer>>(response, reactiveDataConsumer));
+        this.responseFuture.completed(new Message<>(response, reactiveDataConsumer));
         if (entityDetails == null) {
             streamEnd(null);
         }
diff --git a/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveServerExchangeHandler.java b/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveServerExchangeHandler.java
index d7932fe..d2eef61 100644
--- a/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveServerExchangeHandler.java
+++ b/httpcore5-reactive/src/main/java/org/apache/hc/core5/reactive/ReactiveServerExchangeHandler.java
@@ -73,16 +73,13 @@
             final ResponseChannel responseChannel,
             final HttpContext context
     ) throws HttpException, IOException {
-        final Callback<Publisher<ByteBuffer>> callback = new Callback<Publisher<ByteBuffer>>() {
-            @Override
-            public void execute(final Publisher<ByteBuffer> result) {
-                final ReactiveDataProducer producer = new ReactiveDataProducer(result);
-                if (channel != null) {
-                    producer.setChannel(channel);
-                }
-                responseProducer.set(producer);
-                result.subscribe(producer);
+        final Callback<Publisher<ByteBuffer>> callback = result -> {
+            final ReactiveDataProducer producer = new ReactiveDataProducer(result);
+            if (channel != null) {
+                producer.setChannel(channel);
             }
+            responseProducer.set(producer);
+            result.subscribe(producer);
         };
         requestProcessor.processRequest(request, entityDetails, responseChannel, context, requestConsumer, callback);
     }
diff --git a/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/TestReactiveDataConsumer.java b/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/TestReactiveDataConsumer.java
index 47fff1d..2350746 100644
--- a/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/TestReactiveDataConsumer.java
+++ b/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/TestReactiveDataConsumer.java
@@ -46,7 +46,6 @@
 import io.reactivex.Notification;
 import io.reactivex.Observable;
 import io.reactivex.Single;
-import io.reactivex.functions.Consumer;
 
 public class TestReactiveDataConsumer {
 
@@ -54,21 +53,18 @@
     public void testStreamThatEndsNormally() throws Exception {
         final ReactiveDataConsumer consumer = new ReactiveDataConsumer();
 
-        final List<ByteBuffer> output = Collections.synchronizedList(new ArrayList<ByteBuffer>());
+        final List<ByteBuffer> output = Collections.synchronizedList(new ArrayList<>());
 
         final CountDownLatch complete = new CountDownLatch(1);
         Observable.fromPublisher(consumer)
             .materialize()
-            .forEach(new Consumer<Notification<ByteBuffer>>() {
-                @Override
-                public void accept(final Notification<ByteBuffer> byteBufferNotification) throws Exception {
-                    if (byteBufferNotification.isOnComplete()) {
-                        complete.countDown();
-                    } else if (byteBufferNotification.isOnNext()) {
-                        output.add(byteBufferNotification.getValue());
-                    } else {
-                        throw new IllegalArgumentException();
-                    }
+            .forEach(byteBufferNotification -> {
+                if (byteBufferNotification.isOnComplete()) {
+                    complete.countDown();
+                } else if (byteBufferNotification.isOnNext()) {
+                    output.add(byteBufferNotification.getValue());
+                } else {
+                    throw new IllegalArgumentException();
                 }
             });
 
@@ -128,12 +124,7 @@
         final ByteBuffer data = ByteBuffer.wrap(new byte[1024]);
 
         final AtomicInteger lastIncrement = new AtomicInteger(-1);
-        final CapacityChannel channel = new CapacityChannel() {
-            @Override
-            public void update(final int increment) {
-                lastIncrement.set(increment);
-            }
-        };
+        final CapacityChannel channel = lastIncrement::set;
         consumer.updateCapacity(channel);
         Assert.assertEquals("CapacityChannel#update should not have been invoked yet", -1, lastIncrement.get());
 
diff --git a/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexClientExample.java b/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexClientExample.java
index 531d655..f962860 100644
--- a/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexClientExample.java
+++ b/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexClientExample.java
@@ -55,10 +55,7 @@
 import org.reactivestreams.Publisher;
 
 import io.reactivex.Flowable;
-import io.reactivex.Notification;
 import io.reactivex.Observable;
-import io.reactivex.functions.Consumer;
-import io.reactivex.functions.Function;
 
 /**
  * Example of full-duplex HTTP/1.1 message exchanges using reactive streaming. This demo will stream randomly
@@ -100,23 +97,17 @@
             })
             .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final Random random = new Random();
         final Flowable<ByteBuffer> publisher = Flowable.range(1, 100)
-            .map(new Function<Integer, ByteBuffer>() {
-                @Override
-                public ByteBuffer apply(final Integer ignored) {
-                    final String str = random.nextDouble() + "\n";
-                    return ByteBuffer.wrap(str.getBytes(UTF_8));
-                }
+            .map(ignored -> {
+                final String str = random.nextDouble() + "\n";
+                return ByteBuffer.wrap(str.getBytes(UTF_8));
             });
         final AsyncRequestProducer requestProducer = AsyncRequestBuilder.post(new URI(endpoint))
                 .setEntity(new ReactiveEntityProducer(publisher, -1, ContentType.TEXT_PLAIN, null))
@@ -133,21 +124,13 @@
         System.out.println();
 
         Observable.fromPublisher(streamingResponse.getBody())
-            .map(new Function<ByteBuffer, String>() {
-                @Override
-                public String apply(final ByteBuffer byteBuffer) {
-                    final byte[] string = new byte[byteBuffer.remaining()];
-                    byteBuffer.get(string);
-                    return new String(string);
-                }
+            .map(byteBuffer -> {
+                final byte[] string = new byte[byteBuffer.remaining()];
+                byteBuffer.get(string);
+                return new String(string);
             })
             .materialize()
-            .forEach(new Consumer<Notification<String>>() {
-                @Override
-                public void accept(final Notification<String> byteBufferNotification) {
-                    System.out.println(byteBufferNotification);
-                }
-            });
+            .forEach(System.out::println);
 
         responseComplete.get(1, TimeUnit.MINUTES);
         System.out.println("Shutting down I/O reactor");
diff --git a/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexServerExample.java b/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexServerExample.java
index 5a91b6f..67c2056b 100644
--- a/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexServerExample.java
+++ b/httpcore5-reactive/src/test/java/org/apache/hc/core5/reactive/examples/ReactiveFullDuplexServerExample.java
@@ -26,19 +26,13 @@
  */
 package org.apache.hc.core5.reactive.examples;
 
-import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.hc.core5.function.Callback;
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.HeaderElements;
 import org.apache.hc.core5.http.HttpConnection;
-import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.HttpResponse;
@@ -51,16 +45,11 @@
 import org.apache.hc.core5.http.message.BasicHttpResponse;
 import org.apache.hc.core5.http.message.RequestLine;
 import org.apache.hc.core5.http.message.StatusLine;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
-import org.apache.hc.core5.http.nio.ResponseChannel;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.io.CloseMode;
-import org.apache.hc.core5.reactive.ReactiveRequestProcessor;
 import org.apache.hc.core5.reactive.ReactiveServerExchangeHandler;
 import org.apache.hc.core5.reactor.IOReactorConfig;
 import org.apache.hc.core5.reactor.ListenerEndpoint;
 import org.apache.hc.core5.util.TimeValue;
-import org.reactivestreams.Publisher;
 
 /**
  * Example of full-duplex HTTP/1.1 message exchanges using reactive streaming. This demo server works out-of-the-box
@@ -102,44 +91,26 @@
                 }
 
             })
-            .register("/echo", new Supplier<AsyncServerExchangeHandler>() {
-                @Override
-                public AsyncServerExchangeHandler get() {
-                    return new ReactiveServerExchangeHandler(new ReactiveRequestProcessor() {
-                        @Override
-                        public void processRequest(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final ResponseChannel responseChannel,
-                            final HttpContext context,
-                            final Publisher<ByteBuffer> requestBody,
-                            final Callback<Publisher<ByteBuffer>> responseBodyFuture
-                        ) throws HttpException, IOException {
-                            if (new BasicHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE).equals(request.getHeader(HttpHeaders.EXPECT))) {
-                                responseChannel.sendInformation(new BasicHttpResponse(100), context);
-                            }
-
-                            responseChannel.sendResponse(
-                                new BasicHttpResponse(200),
-                                new BasicEntityDetails(-1, ContentType.APPLICATION_OCTET_STREAM),
-                                context);
-
-                            // Simply using the request publisher as the response publisher will
-                            // cause the server to echo the request body.
-                            responseBodyFuture.execute(requestBody);
-                        }
-                    });
+            .register("/echo", () -> new ReactiveServerExchangeHandler((request, entityDetails, responseChannel, context, requestBody, responseBodyFuture) -> {
+                if (new BasicHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE).equals(request.getHeader(HttpHeaders.EXPECT))) {
+                    responseChannel.sendInformation(new BasicHttpResponse(100), context);
                 }
-            })
+
+                responseChannel.sendResponse(
+                        new BasicHttpResponse(200),
+                        new BasicEntityDetails(-1, ContentType.APPLICATION_OCTET_STREAM),
+                        context);
+
+                // Simply using the request publisher as the response publisher will
+                // cause the server to echo the request body.
+                responseBodyFuture.execute(requestBody);
+            }))
             .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
+        }));
 
         server.start();
         final Future<ListenerEndpoint> future = server.listen(new InetSocketAddress(port), URIScheme.HTTP);
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/HttpBenchmark.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/HttpBenchmark.java
index e968468..f4455ac 100644
--- a/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/HttpBenchmark.java
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/benchmark/HttpBenchmark.java
@@ -32,8 +32,6 @@
 import java.net.URI;
 import java.nio.ByteBuffer;
 import java.nio.channels.ByteChannel;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -46,7 +44,6 @@
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.DefaultParser;
 import org.apache.commons.cli.Options;
-import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpConnection;
 import org.apache.hc.core5.http.HttpHost;
@@ -77,7 +74,6 @@
 import org.apache.hc.core5.reactor.IOSession;
 import org.apache.hc.core5.ssl.SSLContextBuilder;
 import org.apache.hc.core5.ssl.SSLContexts;
-import org.apache.hc.core5.ssl.TrustStrategy;
 import org.apache.hc.core5.util.Timeout;
 
 /**
@@ -134,15 +130,7 @@
             final SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
             sslContextBuilder.setProtocol("SSL");
             if (config.isDisableSSLVerification()) {
-                sslContextBuilder.loadTrustMaterial(null, new TrustStrategy() {
-
-                    @Override
-                    public boolean isTrusted(
-                            final X509Certificate[] chain, final String authType) throws CertificateException {
-                        return true;
-                    }
-
-                });
+                sslContextBuilder.loadTrustMaterial(null, (chain, authType) -> true);
             } else if (config.getTrustStorePath() != null) {
                 sslContextBuilder.loadTrustMaterial(
                         new File(config.getTrustStorePath()),
@@ -178,156 +166,149 @@
                 .setH2Config(H2Config.custom()
                         .setPushEnabled(false)
                         .build())
-                .setIOSessionDecorator(new Decorator<IOSession>() {
+                .setIOSessionDecorator(ioSession -> new IOSession() {
 
                     @Override
-                    public IOSession decorate(final IOSession ioSession) {
-                        return new IOSession() {
+                    public String getId() {
+                        return ioSession.getId();
+                    }
 
-                            @Override
-                            public String getId() {
-                                return ioSession.getId();
-                            }
+                    @Override
+                    public Lock getLock() {
+                        return ioSession.getLock();
+                    }
 
-                            @Override
-                            public Lock getLock() {
-                                return ioSession.getLock();
-                            }
+                    @Override
+                    public void enqueue(final Command command, final Command.Priority priority) {
+                        ioSession.enqueue(command, priority);
+                    }
 
-                            @Override
-                            public void enqueue(final Command command, final Command.Priority priority) {
-                                ioSession.enqueue(command, priority);
-                            }
+                    @Override
+                    public boolean hasCommands() {
+                        return ioSession.hasCommands();
+                    }
 
-                            @Override
-                            public boolean hasCommands() {
-                                return ioSession.hasCommands();
-                            }
+                    @Override
+                    public Command poll() {
+                        return ioSession.poll();
+                    }
 
-                            @Override
-                            public Command poll() {
-                                return ioSession.poll();
-                            }
+                    @Override
+                    public ByteChannel channel() {
+                        return ioSession.channel();
+                    }
 
-                            @Override
-                            public ByteChannel channel() {
-                                return ioSession.channel();
-                            }
+                    @Override
+                    public SocketAddress getRemoteAddress() {
+                        return ioSession.getRemoteAddress();
+                    }
 
-                            @Override
-                            public SocketAddress getRemoteAddress() {
-                                return ioSession.getRemoteAddress();
-                            }
+                    @Override
+                    public SocketAddress getLocalAddress() {
+                        return ioSession.getLocalAddress();
+                    }
 
-                            @Override
-                            public SocketAddress getLocalAddress() {
-                                return ioSession.getLocalAddress();
-                            }
+                    @Override
+                    public int getEventMask() {
+                        return ioSession.getEventMask();
+                    }
 
-                            @Override
-                            public int getEventMask() {
-                                return ioSession.getEventMask();
-                            }
+                    @Override
+                    public void setEventMask(final int ops) {
+                        ioSession.setEventMask(ops);
+                    }
 
-                            @Override
-                            public void setEventMask(final int ops) {
-                                ioSession.setEventMask(ops);
-                            }
+                    @Override
+                    public void setEvent(final int op) {
+                        ioSession.setEvent(op);
+                    }
 
-                            @Override
-                            public void setEvent(final int op) {
-                                ioSession.setEvent(op);
-                            }
+                    @Override
+                    public void clearEvent(final int op) {
+                        ioSession.clearEvent(op);
+                    }
 
-                            @Override
-                            public void clearEvent(final int op) {
-                                ioSession.clearEvent(op);
-                            }
+                    @Override
+                    public void close() {
+                        ioSession.close();
+                    }
 
-                            @Override
-                            public void close() {
-                                ioSession.close();
-                            }
+                    @Override
+                    public Status getStatus() {
+                        return ioSession.getStatus();
+                    }
 
-                            @Override
-                            public Status getStatus() {
-                                return ioSession.getStatus();
-                            }
+                    @Override
+                    public int read(final ByteBuffer dst) throws IOException {
+                        final int bytesRead = ioSession.read(dst);
+                        if (bytesRead > 0) {
+                            stats.incTotalBytesRecv(bytesRead);
+                        }
+                        return bytesRead;
+                    }
 
-                            @Override
-                            public int read(final ByteBuffer dst) throws IOException {
-                                final int bytesRead = ioSession.read(dst);
-                                if (bytesRead > 0) {
-                                    stats.incTotalBytesRecv(bytesRead);
-                                }
-                                return bytesRead;
-                            }
+                    @Override
+                    public int write(final ByteBuffer src) throws IOException {
+                        final int bytesWritten = ioSession.write(src);
+                        if (bytesWritten > 0) {
+                            stats.incTotalBytesSent(bytesWritten);
+                        }
+                        return bytesWritten;
+                    }
 
-                            @Override
-                            public int write(final ByteBuffer src) throws IOException {
-                                final int bytesWritten = ioSession.write(src);
-                                if (bytesWritten > 0) {
-                                    stats.incTotalBytesSent(bytesWritten);
-                                }
-                                return bytesWritten;
-                            }
+                    @Override
+                    public boolean isOpen() {
+                        return ioSession.isOpen();
+                    }
 
-                            @Override
-                            public boolean isOpen() {
-                                return ioSession.isOpen();
-                            }
+                    @Override
+                    public Timeout getSocketTimeout() {
+                        return ioSession.getSocketTimeout();
+                    }
 
-                            @Override
-                            public Timeout getSocketTimeout() {
-                                return ioSession.getSocketTimeout();
-                            }
+                    @Override
+                    public void setSocketTimeout(final Timeout timeout) {
+                        ioSession.setSocketTimeout(timeout);
+                    }
 
-                            @Override
-                            public void setSocketTimeout(final Timeout timeout) {
-                                ioSession.setSocketTimeout(timeout);
-                            }
+                    @Override
+                    public long getLastReadTime() {
+                        return ioSession.getLastReadTime();
+                    }
 
-                            @Override
-                            public long getLastReadTime() {
-                                return ioSession.getLastReadTime();
-                            }
+                    @Override
+                    public long getLastWriteTime() {
+                        return ioSession.getLastWriteTime();
+                    }
 
-                            @Override
-                            public long getLastWriteTime() {
-                                return ioSession.getLastWriteTime();
-                            }
+                    @Override
+                    public long getLastEventTime() {
+                        return ioSession.getLastEventTime();
+                    }
 
-                            @Override
-                            public long getLastEventTime() {
-                                return ioSession.getLastEventTime();
-                            }
+                    @Override
+                    public void updateReadTime() {
+                        ioSession.updateReadTime();
+                    }
 
-                            @Override
-                            public void updateReadTime() {
-                                ioSession.updateReadTime();
-                            }
+                    @Override
+                    public void updateWriteTime() {
+                        ioSession.updateWriteTime();
+                    }
 
-                            @Override
-                            public void updateWriteTime() {
-                                ioSession.updateWriteTime();
-                            }
+                    @Override
+                    public void close(final CloseMode closeMode) {
+                        ioSession.close(closeMode);
+                    }
 
-                            @Override
-                            public void close(final CloseMode closeMode) {
-                                ioSession.close(closeMode);
-                            }
+                    @Override
+                    public IOEventHandler getHandler() {
+                        return ioSession.getHandler();
+                    }
 
-                            @Override
-                            public IOEventHandler getHandler() {
-                                return ioSession.getHandler();
-                            }
-
-                            @Override
-                            public void upgrade(final IOEventHandler handler) {
-                                ioSession.upgrade(handler);
-                            }
-
-                        };
+                    @Override
+                    public void upgrade(final IOEventHandler handler) {
+                        ioSession.upgrade(handler);
                     }
 
                 })
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/SocksProxy.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/SocksProxy.java
index 3a200d3..7d8234d 100644
--- a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/SocksProxy.java
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/SocksProxy.java
@@ -166,23 +166,20 @@
                 }
 
                 private Thread pumpStream(final InputStream input, final OutputStream output) {
-                    final Thread t = new Thread(new Runnable() {
-                        @Override
-                        public void run() {
-                            final byte[] buffer = new byte[1024 * 8];
-                            try {
-                                while (true) {
-                                    final int read = input.read(buffer);
-                                    if (read < 0) {
-                                        break;
-                                    }
-                                    output.write(buffer, 0, read);
-                                    output.flush();
+                    final Thread t = new Thread(() -> {
+                        final byte[] buffer = new byte[1024 * 8];
+                        try {
+                            while (true) {
+                                final int read = input.read(buffer);
+                                if (read < 0) {
+                                    break;
                                 }
-                            } catch (final IOException e) {
-                            } finally {
-                                shutdown();
+                                output.write(buffer, 0, read);
+                                output.flush();
                             }
+                        } catch (final IOException e) {
+                        } finally {
+                            shutdown();
                         }
                     });
                     t.start();
@@ -224,23 +221,20 @@
     public synchronized void start() throws IOException {
         if (this.server == null) {
             this.server = new ServerSocket(this.port);
-            this.serverThread = new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        while (true) {
-                            final Socket socket = server.accept();
-                            startSocksProxyHandler(socket);
+            this.serverThread = new Thread(() -> {
+                try {
+                    while (true) {
+                        final Socket socket = server.accept();
+                        startSocksProxyHandler(socket);
+                    }
+                } catch (final IOException e) {
+                } finally {
+                    if (server != null) {
+                        try {
+                            server.close();
+                        } catch (final IOException e) {
                         }
-                    } catch (final IOException e) {
-                    } finally {
-                        if (server != null) {
-                            try {
-                                server.close();
-                            } catch (final IOException e) {
-                            }
-                            server = null;
-                        }
+                        server = null;
                     }
                 }
             });
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/framework/TestingFramework.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/framework/TestingFramework.java
index b9ac33e..a065827 100644
--- a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/framework/TestingFramework.java
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/framework/TestingFramework.java
@@ -52,7 +52,6 @@
 import org.apache.hc.core5.http.ProtocolVersion;
 import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
 import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
-import org.apache.hc.core5.http.io.HttpRequestHandler;
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.protocol.UriPatternMatcher;
 import org.apache.hc.core5.io.CloseMode;
@@ -233,7 +232,7 @@
                                           .build();
 
         final ServerBootstrap serverBootstrap = ServerBootstrap.bootstrap()
-                                          .setLookupRegistry(new UriPatternMatcher<HttpRequestHandler>())
+                                          .setLookupRegistry(new UriPatternMatcher<>())
                                           .setSocketConfig(socketConfig)
                                           .register("/*", requestHandler);
 
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/H2TestServer.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/H2TestServer.java
index 7707bfd..5406f55 100644
--- a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/H2TestServer.java
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/H2TestServer.java
@@ -84,14 +84,7 @@
     public <T> void register(
             final String uriPattern,
             final AsyncServerRequestHandler<T> requestHandler) {
-        register(uriPattern, new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new BasicServerExchangeHandler<>(requestHandler);
-            }
-
-        });
+        register(uriPattern, () -> new BasicServerExchangeHandler<>(requestHandler));
     }
 
     public void start(final IOEventHandlerFactory handlerFactory) throws IOException {
@@ -106,14 +99,7 @@
                 httpProcessor != null ? httpProcessor : H2Processors.server(),
                 new DefaultAsyncResponseExchangeHandlerFactory(
                         registry,
-                        exchangeHandlerDecorator != null ? exchangeHandlerDecorator : new Decorator<AsyncServerExchangeHandler>() {
-
-                            @Override
-                            public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-                                return new BasicAsyncServerExpectationDecorator(handler);
-                            }
-
-                        }),
+                        exchangeHandlerDecorator != null ? exchangeHandlerDecorator : BasicAsyncServerExpectationDecorator::new),
                 HttpVersionPolicy.FORCE_HTTP_2,
                 h2Config,
                 Http1Config.DEFAULT,
@@ -134,14 +120,7 @@
                 httpProcessor != null ? httpProcessor : HttpProcessors.server(),
                 new DefaultAsyncResponseExchangeHandlerFactory(
                         registry,
-                        exchangeHandlerDecorator != null ? exchangeHandlerDecorator : new Decorator<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-                        return new BasicAsyncServerExpectationDecorator(handler);
-                    }
-
-                }),
+                        exchangeHandlerDecorator != null ? exchangeHandlerDecorator : BasicAsyncServerExpectationDecorator::new),
                 HttpVersionPolicy.FORCE_HTTP_1,
                 H2Config.DEFAULT,
                 http1Config,
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/Http1TestServer.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/Http1TestServer.java
index 1bcc2da..bd3cfc6 100644
--- a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/Http1TestServer.java
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/Http1TestServer.java
@@ -82,14 +82,7 @@
     public <T> void register(
             final String uriPattern,
             final AsyncServerRequestHandler<T> requestHandler) {
-        register(uriPattern, new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new BasicServerExchangeHandler<>(requestHandler);
-            }
-
-        });
+        register(uriPattern, () -> new BasicServerExchangeHandler<>(requestHandler));
     }
 
     public InetSocketAddress start(final IOEventHandlerFactory handlerFactory) throws Exception {
@@ -107,14 +100,7 @@
                 httpProcessor != null ? httpProcessor : HttpProcessors.server(),
                 new DefaultAsyncResponseExchangeHandlerFactory(
                         registry,
-                        exchangeHandlerDecorator != null ? exchangeHandlerDecorator : new Decorator<AsyncServerExchangeHandler>() {
-
-                            @Override
-                            public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-                                return new BasicAsyncServerExpectationDecorator(handler);
-                            }
-
-                        }),
+                        exchangeHandlerDecorator != null ? exchangeHandlerDecorator : BasicAsyncServerExpectationDecorator::new),
                 http1Config,
                 CharCodingConfig.DEFAULT,
                 DefaultConnectionReuseStrategy.INSTANCE,
diff --git a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/reactive/ReactiveTestUtils.java b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/reactive/ReactiveTestUtils.java
index 66c0dc8..39fb67d 100644
--- a/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/reactive/ReactiveTestUtils.java
+++ b/httpcore5-testing/src/main/java/org/apache/hc/core5/testing/reactive/ReactiveTestUtils.java
@@ -40,7 +40,6 @@
 import io.reactivex.Emitter;
 import io.reactivex.Flowable;
 import io.reactivex.Single;
-import io.reactivex.functions.BiFunction;
 import io.reactivex.functions.Consumer;
 
 public class ReactiveTestUtils {
@@ -128,13 +127,10 @@
     public static Single<StreamDescription> consumeStream(final Publisher<ByteBuffer> publisher) {
         final StreamDescription seed = new StreamDescription(0, newMessageDigest());
         return Flowable.fromPublisher(publisher)
-                .reduce(seed, new BiFunction<StreamDescription, ByteBuffer, StreamDescription>() {
-                    @Override
-                    public StreamDescription apply(final StreamDescription desc, final ByteBuffer byteBuffer) {
-                        final long length = desc.length + byteBuffer.remaining();
-                        desc.md.update(byteBuffer);
-                        return new StreamDescription(length, desc.md);
-                    }
+                .reduce(seed, (desc, byteBuffer) -> {
+                    final long length = desc.length + byteBuffer.remaining();
+                    desc.md.update(byteBuffer);
+                    return new StreamDescription(length, desc.md);
                 });
     }
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/benchmark/BenchmarkToolTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/benchmark/BenchmarkToolTest.java
index d3195d2..becc3f0 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/benchmark/BenchmarkToolTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/benchmark/BenchmarkToolTest.java
@@ -43,7 +43,7 @@
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
 import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
 import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
-import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
+import org.apache.hc.core5.http.nio.entity.DiscardingEntityConsumer;
 import org.apache.hc.core5.http.nio.support.AsyncResponseBuilder;
 import org.apache.hc.core5.http.nio.support.BasicRequestConsumer;
 import org.apache.hc.core5.http.protocol.HttpContext;
@@ -88,7 +88,7 @@
                             final HttpRequest request,
                             final EntityDetails entityDetails,
                             final HttpContext context) throws HttpException {
-                        return new BasicRequestConsumer<>(entityDetails != null ? new NoopEntityConsumer() : null);
+                        return new BasicRequestConsumer<>(entityDetails != null ? new DiscardingEntityConsumer<>() : null);
                     }
 
                     @Override
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicIntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicIntegrationTest.java
index f843485..0d3a978 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicIntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicIntegrationTest.java
@@ -41,25 +41,19 @@
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.HttpRequest;
-import org.apache.hc.core5.http.HttpRequestInterceptor;
 import org.apache.hc.core5.http.HttpStatus;
 import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.Method;
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.config.Http1Config;
-import org.apache.hc.core5.http.io.HttpRequestHandler;
-import org.apache.hc.core5.http.io.HttpServerRequestHandler;
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.AbstractHttpEntity;
 import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
@@ -175,24 +169,16 @@
         }
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                String s = request.getPath();
-                if (s.startsWith("/?")) {
-                    s = s.substring(2);
-                }
-                final int index = Integer.parseInt(s);
-                final byte[] data = testData.get(index);
-                final ByteArrayEntity entity = new ByteArrayEntity(data, null);
-                response.setEntity(entity);
+            String s = request.getPath();
+            if (s.startsWith("/?")) {
+                s = s.substring(2);
             }
-
+            final int index = Integer.parseInt(s);
+            final byte[] data = testData.get(index);
+            final ByteArrayEntity entity = new ByteArrayEntity(data, null);
+            response.setEntity(entity);
         });
 
         this.server.start();
@@ -236,21 +222,13 @@
         }
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null));
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null));
             }
-
         });
 
         this.server.start();
@@ -297,21 +275,13 @@
         }
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null, true));
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null, true));
             }
-
         });
 
         this.server.start();
@@ -357,24 +327,16 @@
         }
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null));
-                }
-                if (HttpVersion.HTTP_1_0.equals(request.getVersion())) {
-                    response.addHeader("Version", "1.0");
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null));
             }
-
+            if (HttpVersion.HTTP_1_0.equals(request.getVersion())) {
+                response.addHeader("Version", "1.0");
+            }
         });
 
         this.server.start();
@@ -427,21 +389,13 @@
         }
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null, true));
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null, true));
             }
-
         });
 
         this.server.start();
@@ -477,47 +431,29 @@
         final int reqNo = 20;
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> response.setEntity(new StringEntity("No content")));
+
+        this.server.start(null, null, handler -> new BasicHttpServerExpectationDecorator(handler) {
 
             @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                response.setEntity(new StringEntity("No content"));
-            }
-
-        });
-
-        this.server.start(null, null, new Decorator<HttpServerRequestHandler>() {
-
-            @Override
-            public HttpServerRequestHandler decorate(final HttpServerRequestHandler handler) {
-                return new BasicHttpServerExpectationDecorator(handler) {
-
-                    @Override
-                    protected ClassicHttpResponse verify(final ClassicHttpRequest request, final HttpContext context) {
-                        final Header someheader = request.getFirstHeader("Secret");
-                        if (someheader != null) {
-                            final int secretNumber;
-                            try {
-                                secretNumber = Integer.parseInt(someheader.getValue());
-                            } catch (final NumberFormatException ex) {
-                                final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_BAD_REQUEST);
-                                response.setEntity(new StringEntity(ex.toString()));
-                                return response;
-                            }
-                            if (secretNumber >= 2) {
-                                final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_EXPECTATION_FAILED);
-                                response.setEntity(new StringEntity("Wrong secret number", ContentType.TEXT_PLAIN));
-                                return response;
-                            }
-                        }
-                        return null;
+            protected ClassicHttpResponse verify(final ClassicHttpRequest request, final HttpContext context) {
+                final Header someheader = request.getFirstHeader("Secret");
+                if (someheader != null) {
+                    final int secretNumber;
+                    try {
+                        secretNumber = Integer.parseInt(someheader.getValue());
+                    } catch (final NumberFormatException ex) {
+                        final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_BAD_REQUEST);
+                        response.setEntity(new StringEntity(ex.toString()));
+                        return response;
                     }
-
-                };
+                    if (secretNumber >= 2) {
+                        final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_EXPECTATION_FAILED);
+                        response.setEntity(new StringEntity("Wrong secret number", ContentType.TEXT_PLAIN));
+                        return response;
+                    }
+                }
+                return null;
             }
 
         });
@@ -622,42 +558,34 @@
         };
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                int n = 1;
-                String s = request.getPath();
-                if (s.startsWith("/?n=")) {
-                    s = s.substring(4);
-                    try {
-                        n = Integer.parseInt(s);
-                        if (n <= 0) {
-                            throw new HttpException("Invalid request: " +
-                                    "number of repetitions cannot be negative or zero");
-                        }
-                    } catch (final NumberFormatException ex) {
+            int n = 1;
+            String s = request.getPath();
+            if (s.startsWith("/?n=")) {
+                s = s.substring(4);
+                try {
+                    n = Integer.parseInt(s);
+                    if (n <= 0) {
                         throw new HttpException("Invalid request: " +
-                                "number of repetitions is invalid");
+                                "number of repetitions cannot be negative or zero");
                     }
-                }
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final String line = EntityUtils.toString(entity);
-                    final ContentType contentType = ContentType.parse(entity.getContentType());
-                    Charset charset = contentType.getCharset();
-                    if (charset == null) {
-                        charset = StandardCharsets.ISO_8859_1;
-                    }
-                    response.setEntity(new RepeatingEntity(line, charset, n, n % 2 == 0));
+                } catch (final NumberFormatException ex) {
+                    throw new HttpException("Invalid request: " +
+                            "number of repetitions is invalid");
                 }
             }
 
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final String line = EntityUtils.toString(entity);
+                final ContentType contentType = ContentType.parse(entity.getContentType());
+                Charset charset = contentType.getCharset();
+                if (charset == null) {
+                    charset = StandardCharsets.ISO_8859_1;
+                }
+                response.setEntity(new RepeatingEntity(line, charset, n, n % 2 == 0));
+            }
         });
 
         this.server.start();
@@ -698,21 +626,13 @@
 
     @Test
     public void testHttpPostNoEntity() throws Exception {
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null));
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null));
             }
-
         });
 
         this.server.start();
@@ -733,21 +653,13 @@
 
     @Test
     public void testHttpPostNoContentLength() throws Exception {
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null));
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null));
             }
-
         });
 
         this.server.start();
@@ -772,36 +684,18 @@
 
     @Test
     public void testHttpPostIdentity() throws Exception {
-        this.server.registerHandler("*", new HttpRequestHandler() {
+        this.server.registerHandler("*", (request, response, context) -> {
 
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-
-                final HttpEntity entity = request.getEntity();
-                if (entity != null) {
-                    final byte[] data = EntityUtils.toByteArray(entity);
-                    response.setEntity(new ByteArrayEntity(data, null));
-                }
+            final HttpEntity entity = request.getEntity();
+            if (entity != null) {
+                final byte[] data = EntityUtils.toByteArray(entity);
+                response.setEntity(new ByteArrayEntity(data, null));
             }
-
         });
 
         this.server.start();
         this.client.start(new DefaultHttpProcessor(
-                new HttpRequestInterceptor() {
-
-                    @Override
-                    public void process(
-                            final HttpRequest request,
-                            final EntityDetails entity,
-                            final HttpContext context) throws HttpException, IOException {
-                        request.addHeader(HttpHeaders.TRANSFER_ENCODING, "identity");
-                    }
-
-                },
+                (request, entity, context) -> request.addHeader(HttpHeaders.TRANSFER_ENCODING, "identity"),
                 new RequestTargetHost(),
                 new RequestConnControl(),
                 new RequestUserAgent(),
@@ -824,17 +718,7 @@
         final int reqNo = 20;
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-                response.setCode(HttpStatus.SC_NO_CONTENT);
-            }
-
-        });
+        this.server.registerHandler("*", (request, response, context) -> response.setCode(HttpStatus.SC_NO_CONTENT));
 
         this.server.start();
         this.client.start();
@@ -854,17 +738,7 @@
     public void testAbsentHostHeader() throws Exception {
 
         // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-                response.setEntity(new StringEntity("All is well", StandardCharsets.US_ASCII));
-            }
-
-        });
+        this.server.registerHandler("*", (request, response, context) -> response.setEntity(new StringEntity("All is well", StandardCharsets.US_ASCII)));
 
         this.server.start();
         this.client.start(new DefaultHttpProcessor(new RequestContent(), new RequestConnControl()));
@@ -888,17 +762,7 @@
 
     @Test
     public void testHeaderTooLarge() throws Exception {
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-                response.setEntity(new StringEntity("All is well", StandardCharsets.US_ASCII));
-            }
-
-        });
+        this.server.registerHandler("*", (request, response, context) -> response.setEntity(new StringEntity("All is well", StandardCharsets.US_ASCII)));
 
         this.server.start(
                 Http1Config.custom()
@@ -922,17 +786,7 @@
 
     @Test
     public void testHeaderTooLargePost() throws Exception {
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-                response.setEntity(new StringEntity("All is well", StandardCharsets.US_ASCII));
-            }
-
-        });
+        this.server.registerHandler("*", (request, response, context) -> response.setEntity(new StringEntity("All is well", StandardCharsets.US_ASCII)));
 
         this.server.start(
                 Http1Config.custom()
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerAndRequesterTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerAndRequesterTest.java
index 83377b3..1d8b3e0 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerAndRequesterTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerAndRequesterTest.java
@@ -47,12 +47,10 @@
 import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
 import org.apache.hc.core5.http.impl.bootstrap.StandardFilter;
 import org.apache.hc.core5.http.io.HttpFilterChain;
-import org.apache.hc.core5.http.io.HttpFilterHandler;
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.io.entity.StringEntity;
 import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.testing.SSLTestContexts;
@@ -101,35 +99,24 @@
                             .setSoTimeout(TIMEOUT)
                             .build())
                     .register("*", new EchoHandler())
-                    .addFilterBefore(StandardFilter.MAIN_HANDLER.name(), "no-keep-alive", new HttpFilterHandler() {
+                    .addFilterBefore(StandardFilter.MAIN_HANDLER.name(), "no-keep-alive", (request, responseTrigger, context, chain) -> chain.proceed(request, new HttpFilterChain.ResponseTrigger() {
 
                         @Override
-                        public void handle(
-                                final ClassicHttpRequest request,
-                                final HttpFilterChain.ResponseTrigger responseTrigger,
-                                final HttpContext context,
-                                final HttpFilterChain chain) throws HttpException, IOException {
-                            chain.proceed(request, new HttpFilterChain.ResponseTrigger() {
-
-                                @Override
-                                public void sendInformation(
-                                        final ClassicHttpResponse response) throws HttpException, IOException {
-                                    responseTrigger.sendInformation(response);
-                                }
-
-                                @Override
-                                public void submitResponse(
-                                        final ClassicHttpResponse response) throws HttpException, IOException {
-                                    if (request.getPath().startsWith("/no-keep-alive")) {
-                                        response.setHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
-                                    }
-                                    responseTrigger.submitResponse(response);
-                                }
-
-                            }, context);
+                        public void sendInformation(
+                                final ClassicHttpResponse response) throws HttpException, IOException {
+                            responseTrigger.sendInformation(response);
                         }
 
-                    })
+                        @Override
+                        public void submitResponse(
+                                final ClassicHttpResponse response) throws HttpException, IOException {
+                            if (request.getPath().startsWith("/no-keep-alive")) {
+                                response.setHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
+                            }
+                            responseTrigger.submitResponse(response);
+                        }
+
+                    }, context))
                     .setExceptionListener(LoggingExceptionListener.INSTANCE)
                     .setStreamListener(LoggingHttp1StreamListener.INSTANCE)
                     .create();
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerBootstrapFilterTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerBootstrapFilterTest.java
index 8345886..3e50e34 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerBootstrapFilterTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicServerBootstrapFilterTest.java
@@ -42,11 +42,9 @@
 import org.apache.hc.core5.http.impl.bootstrap.RequesterBootstrap;
 import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
 import org.apache.hc.core5.http.io.HttpFilterChain;
-import org.apache.hc.core5.http.io.HttpFilterHandler;
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.StringEntity;
 import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.util.Timeout;
@@ -77,14 +75,7 @@
                             .setSoTimeout(TIMEOUT)
                             .build())
                     .register("*", new EchoHandler())
-                    .addFilterLast("test-filter", new HttpFilterHandler() {
-
-                        @Override
-                        public void handle(
-                                final ClassicHttpRequest request,
-                                final HttpFilterChain.ResponseTrigger responseTrigger,
-                                final HttpContext context,
-                                final HttpFilterChain chain) throws HttpException, IOException {
+                    .addFilterLast("test-filter", (request, responseTrigger, context, chain) ->
                             chain.proceed(request, new HttpFilterChain.ResponseTrigger() {
 
                                 @Override
@@ -100,10 +91,7 @@
                                     responseTrigger.submitResponse(response);
                                 }
 
-                            }, context);
-                        }
-
-                    })
+                            }, context))
                     .setExceptionListener(LoggingExceptionListener.INSTANCE)
                     .setStreamListener(LoggingHttp1StreamListener.INSTANCE)
                     .create();
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicTLSIntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicTLSIntegrationTest.java
index c839f01..0876347 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicTLSIntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/ClassicTLSIntegrationTest.java
@@ -30,12 +30,9 @@
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicReference;
 
-import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLHandshakeException;
-import javax.net.ssl.SSLParameters;
 import javax.net.ssl.SSLSession;
 
-import org.apache.hc.core5.function.Callback;
 import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentType;
@@ -50,7 +47,6 @@
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.io.entity.StringEntity;
-import org.apache.hc.core5.http.io.ssl.SSLSessionVerifier;
 import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
 import org.apache.hc.core5.http.protocol.BasicHttpContext;
 import org.apache.hc.core5.http.protocol.HttpContext;
@@ -121,14 +117,7 @@
 
         requester = RequesterBootstrap.bootstrap()
                 .setSslContext(SSLTestContexts.createClientSSLContext())
-                .setSslSessionVerifier(new SSLSessionVerifier() {
-
-                    @Override
-                    public void verify(final HttpHost endpoint, final SSLSession sslSession) throws SSLException {
-                        sslSessionRef.set(sslSession);
-                    }
-
-                })
+                .setSslSessionVerifier((endpoint, sslSession) -> sslSessionRef.set(sslSession))
                 .setSocketConfig(SocketConfig.custom()
                         .setSoTimeout(TIMEOUT)
                         .build())
@@ -192,14 +181,7 @@
                         .setSoTimeout(TIMEOUT)
                         .build())
                 .setSslContext(SSLTestContexts.createServerSSLContext())
-                .setSslSetupHandler(new Callback<SSLParameters>() {
-
-                    @Override
-                    public void execute(final SSLParameters sslParameters) {
-                        sslParameters.setNeedClientAuth(true);
-                    }
-
-                })
+                .setSslSetupHandler(sslParameters -> sslParameters.setNeedClientAuth(true))
                 .setExceptionListener(LoggingExceptionListener.INSTANCE)
                 .setStreamListener(LoggingHttp1StreamListener.INSTANCE)
                 .register("*", new EchoHandler())
@@ -228,14 +210,7 @@
     public void testSSLDisabledByDefault() throws Exception {
         server = ServerBootstrap.bootstrap()
                 .setSslContext(SSLTestContexts.createServerSSLContext())
-                .setSslSetupHandler(new Callback<SSLParameters>() {
-
-                    @Override
-                    public void execute(final SSLParameters sslParameters) {
-                        sslParameters.setProtocols(new String[]{"SSLv3"});
-                    }
-
-                })
+                .setSslSetupHandler(sslParameters -> sslParameters.setProtocols(new String[]{"SSLv3"}))
                 .create();
         server.start();
 
@@ -290,14 +265,7 @@
         for (final String cipherSuite : weakCiphersSuites) {
             server = ServerBootstrap.bootstrap()
                     .setSslContext(SSLTestContexts.createServerSSLContext())
-                    .setSslSetupHandler(new Callback<SSLParameters>() {
-
-                        @Override
-                        public void execute(final SSLParameters sslParameters) {
-                            sslParameters.setProtocols(new String[]{cipherSuite});
-                        }
-
-                    })
+                    .setSslSetupHandler(sslParameters -> sslParameters.setProtocols(new String[]{cipherSuite}))
                     .create();
             try {
                 server.start();
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/MonitoringResponseOutOfOrderStrategyIntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/MonitoringResponseOutOfOrderStrategyIntegrationTest.java
index fad4491..d8ce77c 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/MonitoringResponseOutOfOrderStrategyIntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/classic/MonitoringResponseOutOfOrderStrategyIntegrationTest.java
@@ -27,6 +27,12 @@
 
 package org.apache.hc.core5.testing.classic;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Collection;
+
 import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentType;
@@ -37,12 +43,10 @@
 import org.apache.hc.core5.http.impl.bootstrap.RequesterBootstrap;
 import org.apache.hc.core5.http.impl.io.DefaultBHttpClientConnectionFactory;
 import org.apache.hc.core5.http.impl.io.MonitoringResponseOutOfOrderStrategy;
-import org.apache.hc.core5.http.io.HttpRequestHandler;
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.AbstractHttpEntity;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.testing.SSLTestContexts;
@@ -54,12 +58,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.Collection;
-
 @RunWith(Parameterized.class)
 public class MonitoringResponseOutOfOrderStrategyIntegrationTest {
 
@@ -147,17 +145,9 @@
 
     @Test(timeout = 5000) // Failures may hang
     public void testResponseOutOfOrderWithDefaultStrategy() throws Exception {
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws IOException {
-                response.setCode(400);
-                response.setEntity(new AllOnesHttpEntity(200000));
-            }
-
+        this.server.registerHandler("*", (request, response, context) -> {
+            response.setCode(400);
+            response.setEntity(new AllOnesHttpEntity(200000));
         });
 
         this.server.start(null, null, null);
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/compatibility/http2/H2CompatibilityTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/compatibility/http2/H2CompatibilityTest.java
index a18c081..b82ad06 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/compatibility/http2/H2CompatibilityTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/compatibility/http2/H2CompatibilityTest.java
@@ -51,15 +51,12 @@
 import org.apache.hc.core5.http.message.BasicHttpRequest;
 import org.apache.hc.core5.http.nio.AsyncClientEndpoint;
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
-import org.apache.hc.core5.http.nio.AsyncPushConsumer;
-import org.apache.hc.core5.http.nio.HandlerFactory;
-import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
+import org.apache.hc.core5.http.nio.entity.DiscardingEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.support.AbstractAsyncPushHandler;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
 import org.apache.hc.core5.http.nio.support.BasicResponseConsumer;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
 import org.apache.hc.core5.http2.config.H2Config;
 import org.apache.hc.core5.http2.impl.nio.bootstrap.H2RequesterBootstrap;
@@ -239,31 +236,25 @@
                 final Future<Message<HttpResponse, String>> future = endpoint.execute(
                         new BasicRequestProducer(httpget, null),
                         new BasicResponseConsumer<>(new StringAsyncEntityConsumer()),
-                        new HandlerFactory<AsyncPushConsumer>() {
+                        (request, context) -> new AbstractAsyncPushHandler<Message<HttpResponse, Void>>(
+                                new BasicResponseConsumer<>(new DiscardingEntityConsumer<>())) {
 
                             @Override
-                            public AsyncPushConsumer create(
-                                    final HttpRequest request, final HttpContext context) throws HttpException {
-                                return new AbstractAsyncPushHandler<Message<HttpResponse, Void>>(new BasicResponseConsumer<>(new NoopEntityConsumer())) {
+                            protected void handleResponse(
+                                    final HttpRequest promise,
+                                    final Message<HttpResponse, Void> responseMessage) throws IOException, HttpException {
+                                final HttpResponse response = responseMessage.getHead();
+                                logResult(TestResult.OK, target, promise, response,
+                                        "pushed / " + response.getFirstHeader("server"));
+                                countDownLatch.countDown();
+                            }
 
-                                    @Override
-                                    protected void handleResponse(
-                                            final HttpRequest promise,
-                                            final Message<HttpResponse, Void> responseMessage) throws IOException, HttpException {
-                                        final HttpResponse response = responseMessage.getHead();
-                                        logResult(TestResult.OK, target, promise, response,
-                                                "pushed / " + response.getFirstHeader("server"));
-                                        countDownLatch.countDown();
-                                    }
-
-                                    @Override
-                                    protected void handleError(
-                                            final HttpRequest promise,
-                                            final Exception cause) {
-                                        logResult(TestResult.NOK, target, promise, null, "(" + cause.getMessage() + ")");
-                                        countDownLatch.countDown();
-                                    }
-                                };
+                            @Override
+                            protected void handleError(
+                                    final HttpRequest promise,
+                                    final Exception cause) {
+                                logResult(TestResult.NOK, target, promise, null, "(" + cause.getMessage() + ")");
+                                countDownLatch.countDown();
                             }
                         },
                         null,
@@ -294,28 +285,28 @@
             System.out.println("*** httpbin.org HTTP/1.1 simple request execution ***");
 
             final List<Message<HttpRequest, AsyncEntityProducer>> requestMessages = Arrays.asList(
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.GET, target, "/headers"),
                             null),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.POST, target, "/anything"),
                             new StringAsyncEntityProducer("some important message", ContentType.TEXT_PLAIN)),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.PUT, target, "/anything"),
                             new StringAsyncEntityProducer("some important message", ContentType.TEXT_PLAIN)),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.GET, target, "/drip"),
                             null),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.GET, target, "/bytes/20000"),
                             null),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.GET, target, "/delay/2"),
                             null),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.POST, target, "/delay/2"),
                             new StringAsyncEntityProducer("some important message", ContentType.TEXT_PLAIN)),
-                    new Message<HttpRequest, AsyncEntityProducer>(
+                    new Message<>(
                             new BasicHttpRequest(Method.PUT, target, "/delay/2"),
                             new StringAsyncEntityProducer("some important message", ContentType.TEXT_PLAIN))
             );
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/AsyncServerBootstrapFilterTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/AsyncServerBootstrapFilterTest.java
index ed60fbd..ea8f3cd 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/AsyncServerBootstrapFilterTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/AsyncServerBootstrapFilterTest.java
@@ -31,9 +31,7 @@
 import java.net.InetSocketAddress;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHost;
@@ -47,18 +45,14 @@
 import org.apache.hc.core5.http.impl.bootstrap.AsyncServerBootstrap;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
-import org.apache.hc.core5.http.nio.AsyncDataConsumer;
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
 import org.apache.hc.core5.http.nio.AsyncFilterChain;
-import org.apache.hc.core5.http.nio.AsyncFilterHandler;
 import org.apache.hc.core5.http.nio.AsyncPushProducer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.ssl.BasicClientTlsStrategy;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
 import org.apache.hc.core5.http.nio.support.BasicResponseConsumer;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.UriPatternMatcher;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.reactor.IOReactorConfig;
@@ -89,29 +83,14 @@
         protected void before() throws Throwable {
             log.debug("Starting up test server");
             server = AsyncServerBootstrap.bootstrap()
-                    .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                    .setLookupRegistry(new UriPatternMatcher<>())
                     .setIOReactorConfig(
                             IOReactorConfig.custom()
                                     .setSoTimeout(TIMEOUT)
                                     .build())
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
-                    .addFilterLast("test-filter", new AsyncFilterHandler() {
-
-                        @Override
-                        public AsyncDataConsumer handle(
-                                final HttpRequest request,
-                                final EntityDetails entityDetails,
-                                final HttpContext context,
-                                final AsyncFilterChain.ResponseTrigger responseTrigger,
-                                final AsyncFilterChain chain) throws HttpException, IOException {
-                            return chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
+                    .register("*", () -> new EchoHandler(2048))
+                    .addFilterLast("test-filter", (request, entityDetails, context, responseTrigger, chain) ->
+                            chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
 
                                 @Override
                                 public void sendInformation(
@@ -134,9 +113,7 @@
                                     responseTrigger.pushPromise(promise, responseProducer);
                                 }
 
-                            });
-                        }
-                    })
+                            }))
                     .setStreamListener(LoggingHttp1StreamListener.INSTANCE_SERVER)
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                     .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2AlpnTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2AlpnTest.java
index b9b7cb6..20d27a0 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2AlpnTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2AlpnTest.java
@@ -36,7 +36,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpResponse;
@@ -45,7 +44,6 @@
 import org.apache.hc.core5.http.Method;
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.ssl.BasicServerTlsStrategy;
@@ -121,14 +119,7 @@
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                     .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                     .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
+                    .register("*", () -> new EchoHandler(2048))
                     .create();
         }
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2IntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2IntegrationTest.java
index 8493256..086d593 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2IntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2IntegrationTest.java
@@ -60,8 +60,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.hc.core5.function.Callback;
-import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.EndpointDetails;
@@ -79,19 +77,17 @@
 import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.message.BasicHttpRequest;
-import org.apache.hc.core5.http.nio.AsyncPushConsumer;
 import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
 import org.apache.hc.core5.http.nio.AsyncResponseProducer;
 import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
 import org.apache.hc.core5.http.nio.CapacityChannel;
 import org.apache.hc.core5.http.nio.DataStreamChannel;
-import org.apache.hc.core5.http.nio.HandlerFactory;
 import org.apache.hc.core5.http.nio.ResponseChannel;
 import org.apache.hc.core5.http.nio.entity.AsyncEntityProducers;
 import org.apache.hc.core5.http.nio.entity.DigestingEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.DigestingEntityProducer;
-import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
+import org.apache.hc.core5.http.nio.entity.DiscardingEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.support.AbstractAsyncPushHandler;
@@ -186,14 +182,7 @@
 
     @Test
     public void testSimpleGet() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -222,14 +211,7 @@
 
     @Test
     public void testSimpleHead() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -252,14 +234,7 @@
 
     @Test
     public void testLargeGet() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcdef", 5000);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcdef", 5000));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -302,14 +277,7 @@
 
     @Test
     public void testBasicPost() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -339,14 +307,7 @@
 
     @Test
     public void testLargePost() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new EchoHandler(2048);
-            }
-
-        });
+        server.register("*", () -> new EchoHandler(2048));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -373,14 +334,7 @@
 
     @Test
     public void testSlowResponseConsumer() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcd", 3);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcd", 3));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start(H2Config.custom().setInitialWindowSize(16).build());
@@ -432,14 +386,7 @@
 
     @Test
     public void testSlowRequestProducer() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new EchoHandler(2048);
-            }
-
-        });
+        server.register("*", () -> new EchoHandler(2048));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -488,62 +435,55 @@
 
     @Test
     public void testSlowResponseProducer() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new AbstractClassicServerExchangeHandler(2048, Executors.newSingleThreadExecutor()) {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AbstractClassicServerExchangeHandler(2048, Executors.newSingleThreadExecutor()) {
+            protected void handle(
+                    final HttpRequest request,
+                    final InputStream requestStream,
+                    final HttpResponse response,
+                    final OutputStream responseStream,
+                    final HttpContext context) throws IOException, HttpException {
 
-                    @Override
-                    protected void handle(
-                            final HttpRequest request,
-                            final InputStream requestStream,
-                            final HttpResponse response,
-                            final OutputStream responseStream,
-                            final HttpContext context) throws IOException, HttpException {
-
-                        if (!"/hello".equals(request.getPath())) {
-                            response.setCode(HttpStatus.SC_NOT_FOUND);
-                            return;
-                        }
-                        if (!Method.POST.name().equalsIgnoreCase(request.getMethod())) {
-                            response.setCode(HttpStatus.SC_NOT_IMPLEMENTED);
-                            return;
-                        }
-                        if (requestStream == null) {
-                            return;
-                        }
-                        final Header h1 = request.getFirstHeader(HttpHeaders.CONTENT_TYPE);
-                        final ContentType contentType = h1 != null ? ContentType.parse(h1.getValue()) : null;
-                        Charset charset = contentType != null ? contentType.getCharset() : null;
-                        if (charset == null) {
-                            charset = StandardCharsets.US_ASCII;
-                        }
-                        response.setCode(HttpStatus.SC_OK);
-                        response.setHeader(h1);
-                        try (final BufferedReader reader = new BufferedReader(new InputStreamReader(requestStream, charset));
-                            final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(responseStream, charset))) {
-                            try {
-                                String l;
-                                int count = 0;
-                                while ((l = reader.readLine()) != null) {
-                                    writer.write(l);
-                                    writer.write("\r\n");
-                                    count++;
-                                    if (count % 500 == 0) {
-                                        Thread.sleep(500);
-                                    }
-                                }
-                                writer.flush();
-                            } catch (final InterruptedException ex) {
-                                Thread.currentThread().interrupt();
-                                throw new InterruptedIOException(ex.getMessage());
+                if (!"/hello".equals(request.getPath())) {
+                    response.setCode(HttpStatus.SC_NOT_FOUND);
+                    return;
+                }
+                if (!Method.POST.name().equalsIgnoreCase(request.getMethod())) {
+                    response.setCode(HttpStatus.SC_NOT_IMPLEMENTED);
+                    return;
+                }
+                if (requestStream == null) {
+                    return;
+                }
+                final Header h1 = request.getFirstHeader(HttpHeaders.CONTENT_TYPE);
+                final ContentType contentType = h1 != null ? ContentType.parse(h1.getValue()) : null;
+                Charset charset = contentType != null ? contentType.getCharset() : null;
+                if (charset == null) {
+                    charset = StandardCharsets.US_ASCII;
+                }
+                response.setCode(HttpStatus.SC_OK);
+                response.setHeader(h1);
+                try (final BufferedReader reader = new BufferedReader(new InputStreamReader(requestStream, charset));
+                    final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(responseStream, charset))) {
+                    try {
+                        String l;
+                        int count = 0;
+                        while ((l = reader.readLine()) != null) {
+                            writer.write(l);
+                            writer.write("\r\n");
+                            count++;
+                            if (count % 500 == 0) {
+                                Thread.sleep(500);
                             }
                         }
+                        writer.flush();
+                    } catch (final InterruptedException ex) {
+                        Thread.currentThread().interrupt();
+                        throw new InterruptedIOException(ex.getMessage());
                     }
-                };
+                }
             }
-
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -575,28 +515,21 @@
     @Test
     public void testPush() throws Exception {
         final InetSocketAddress serverEndpoint = server.start();
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("/hello", () -> new MessageExchangeHandler<Void>(new DiscardingEntityConsumer<>()) {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new MessageExchangeHandler<Void>(new NoopEntityConsumer()) {
-
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, Void> request,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws IOException, HttpException {
-                        responseTrigger.pushPromise(
-                                new BasicHttpRequest(Method.GET, createRequestURI(serverEndpoint, "/stuff")),
-                                context,
-                                new BasicPushProducer(new MultiLineEntityProducer("Pushing lots of stuff", 500)));
-                        responseTrigger.submitResponse(
-                                AsyncResponseBuilder.create(HttpStatus.SC_OK).setEntity("Hi there", ContentType.TEXT_PLAIN).build(),
-                                context);
-                    }
-                };
+            protected void handle(
+                    final Message<HttpRequest, Void> request,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws IOException, HttpException {
+                responseTrigger.pushPromise(
+                        new BasicHttpRequest(Method.GET, createRequestURI(serverEndpoint, "/stuff")),
+                        context,
+                        new BasicPushProducer(new MultiLineEntityProducer("Pushing lots of stuff", 500)));
+                responseTrigger.submitResponse(
+                        AsyncResponseBuilder.create(HttpStatus.SC_OK).setEntity("Hi there", ContentType.TEXT_PLAIN).build(),
+                        context);
             }
-
         });
 
         client.start(H2Config.custom().setPushEnabled(true).build());
@@ -610,27 +543,20 @@
         final Future<Message<HttpResponse, String>> future1 = streamEndpoint.execute(
                 new BasicRequestProducer(Method.GET, createRequestURI(serverEndpoint, "/hello")),
                 new BasicResponseConsumer<>(new StringAsyncEntityConsumer()),
-                new HandlerFactory<AsyncPushConsumer>() {
+                (request, context) -> new AbstractAsyncPushHandler<Message<HttpResponse, String>>(new BasicResponseConsumer<>(new StringAsyncEntityConsumer())) {
 
                     @Override
-                    public AsyncPushConsumer create(
-                            final HttpRequest request, final HttpContext context) throws HttpException {
-                        return new AbstractAsyncPushHandler<Message<HttpResponse, String>>(new BasicResponseConsumer<>(new StringAsyncEntityConsumer())) {
-
-                            @Override
-                            protected void handleResponse(
-                                    final HttpRequest promise,
-                                    final Message<HttpResponse, String> responseMessage) throws IOException, HttpException {
-                                try {
-                                    pushMessageQueue.put(responseMessage);
-                                } catch (final InterruptedException ex) {
-                                    Thread.currentThread().interrupt();
-                                    throw new InterruptedIOException(ex.getMessage());
-                                }
-                            }
-
-                        };
+                    protected void handleResponse(
+                            final HttpRequest promise,
+                            final Message<HttpResponse, String> responseMessage) throws IOException, HttpException {
+                        try {
+                            pushMessageQueue.put(responseMessage);
+                        } catch (final InterruptedException ex) {
+                            Thread.currentThread().interrupt();
+                            throw new InterruptedIOException(ex.getMessage());
+                        }
                     }
+
                 },
                 null,
                 null);
@@ -662,7 +588,7 @@
 
             @Override
             public AsyncServerExchangeHandler get() {
-                return new MessageExchangeHandler<Void>(new NoopEntityConsumer()) {
+                return new MessageExchangeHandler<Void>(new DiscardingEntityConsumer<>()) {
 
                     @Override
                     protected void handle(
@@ -731,14 +657,7 @@
 
     @Test
     public void testExcessOfConcurrentStreams() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcdef", 2000);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcdef", 2000));
         final InetSocketAddress serverEndpoint = server.start(H2Config.custom().setMaxConcurrentStreams(20).build());
 
         client.start(H2Config.custom().setMaxConcurrentStreams(20).build());
@@ -751,7 +670,7 @@
             final HttpRequest request1 = new BasicHttpRequest(Method.GET, createRequestURI(serverEndpoint, "/"));
             final Future<Message<HttpResponse, Void>> future = streamEndpoint.execute(
                     new BasicRequestProducer(request1, null),
-                    new BasicResponseConsumer<>(new NoopEntityConsumer()), null);
+                    new BasicResponseConsumer<>(new DiscardingEntityConsumer<>()), null);
             queue.add(future);
         }
 
@@ -767,42 +686,27 @@
 
     @Test
     public void testExpectationFailed() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
+            protected void handle(
+                    final Message<HttpRequest, String> request,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws IOException, HttpException {
+                responseTrigger.submitResponse(new BasicResponseProducer(HttpStatus.SC_OK, "All is well"), context);
 
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> request,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws IOException, HttpException {
-                        responseTrigger.submitResponse(new BasicResponseProducer(HttpStatus.SC_OK, "All is well"), context);
-
-                    }
-                };
             }
-
         });
-        final InetSocketAddress serverEndpoint = server.start(null, new Decorator<AsyncServerExchangeHandler>() {
+        final InetSocketAddress serverEndpoint = server.start(null, handler -> new BasicAsyncServerExpectationDecorator(handler) {
 
             @Override
-            public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-
-                return new BasicAsyncServerExpectationDecorator(handler) {
-
-                    @Override
-                    protected AsyncResponseProducer verify(final HttpRequest request, final HttpContext context) throws IOException, HttpException {
-                        final Header h = request.getFirstHeader("password");
-                        if (h != null && "secret".equals(h.getValue())) {
-                            return null;
-                        } else {
-                            return new BasicResponseProducer(HttpStatus.SC_UNAUTHORIZED, "You shall not pass");
-                        }
-                    }
-                };
-
+            protected AsyncResponseProducer verify(final HttpRequest request, final HttpContext context) throws IOException, HttpException {
+                final Header h = request.getFirstHeader("password");
+                if (h != null && "secret".equals(h.getValue())) {
+                    return null;
+                } else {
+                    return new BasicResponseProducer(HttpStatus.SC_UNAUTHORIZED, "You shall not pass");
+                }
             }
         }, H2Config.DEFAULT);
 
@@ -919,33 +823,26 @@
 
     @Test
     public void testMessageWithTrailers() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("/hello", () -> new AbstractServerExchangeHandler<Message<HttpRequest, String>>() {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AbstractServerExchangeHandler<Message<HttpRequest, String>>() {
-
-                    @Override
-                    protected AsyncRequestConsumer<Message<HttpRequest, String>> supplyConsumer(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final HttpContext context) throws HttpException {
-                        return new BasicRequestConsumer<>(entityDetails != null ? new StringAsyncEntityConsumer() : null);
-                    }
-
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> requestMessage,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws HttpException, IOException {
-                        responseTrigger.submitResponse(new BasicResponseProducer(
-                                HttpStatus.SC_OK,
-                                new DigestingEntityProducer("MD5",
-                                        new StringAsyncEntityProducer("Hello back with some trailers"))), context);
-                    }
-                };
+            protected AsyncRequestConsumer<Message<HttpRequest, String>> supplyConsumer(
+                    final HttpRequest request,
+                    final EntityDetails entityDetails,
+                    final HttpContext context) throws HttpException {
+                return new BasicRequestConsumer<>(entityDetails != null ? new StringAsyncEntityConsumer() : null);
             }
 
+            @Override
+            protected void handle(
+                    final Message<HttpRequest, String> requestMessage,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws HttpException, IOException {
+                responseTrigger.submitResponse(new BasicResponseProducer(
+                        HttpStatus.SC_OK,
+                        new DigestingEntityProducer("MD5",
+                                new StringAsyncEntityProducer("Hello back with some trailers"))), context);
+            }
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -981,14 +878,7 @@
 
     @Test
     public void testConnectionPing() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -1003,16 +893,11 @@
             streamEndpoint.execute(
                     new BasicRequestProducer(Method.GET, createRequestURI(serverEndpoint, "/hello")),
                     new BasicResponseConsumer<>(new StringAsyncEntityConsumer()), null);
-            streamEndpoint.execute(new PingCommand(new BasicPingHandler(new Callback<Boolean>() {
-
-                @Override
-                public void execute(final Boolean result) {
-                    if (result) {
-                        count.incrementAndGet();
-                    }
-                    latch.countDown();
+            streamEndpoint.execute(new PingCommand(new BasicPingHandler(result -> {
+                if (result) {
+                    count.incrementAndGet();
                 }
-
+                latch.countDown();
             })), Command.Priority.NORMAL);
 
         }
@@ -1022,14 +907,7 @@
 
     @Test
     public void testRequestWithInvalidConnectionHeader() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -1058,14 +936,7 @@
 
     @Test
     public void testHeaderTooLarge() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start(H2Config.custom()
                 .setMaxHeaderListSize(100)
                 .build());
@@ -1091,14 +962,7 @@
 
     @Test
     public void testHeaderTooLargePost() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start(H2Config.custom()
                 .setMaxHeaderListSize(100)
                 .build());
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ProtocolNegotiationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ProtocolNegotiationTest.java
index d97b8f5..624e66f 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ProtocolNegotiationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ProtocolNegotiationTest.java
@@ -32,7 +32,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpResponse;
@@ -44,7 +43,6 @@
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
 import org.apache.hc.core5.http.nio.AsyncClientEndpoint;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
@@ -95,14 +93,7 @@
                                     .setSoTimeout(TIMEOUT)
                                     .build())
                     .setTlsStrategy(new H2ServerTlsStrategy(SSLTestContexts.createServerSSLContext()))
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
+                    .register("*", () -> new EchoHandler(2048))
                     .setStreamListener(LoggingH2StreamListener.INSTANCE)
                     .setStreamListener(LoggingHttp1StreamListener.INSTANCE_SERVER)
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndMultiplexingRequesterTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndMultiplexingRequesterTest.java
index 325e6ea..c048bd0 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndMultiplexingRequesterTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndMultiplexingRequesterTest.java
@@ -38,7 +38,6 @@
 
 import org.apache.hc.core5.concurrent.Cancellable;
 import org.apache.hc.core5.concurrent.FutureCallback;
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpResponse;
@@ -47,7 +46,6 @@
 import org.apache.hc.core5.http.Method;
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.support.BasicClientExchangeHandler;
@@ -118,14 +116,7 @@
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                     .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                     .setStreamListener(LoggingH2StreamListener.INSTANCE)
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
+                    .register("*", () -> new EchoHandler(2048))
                     .create();
         }
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndRequesterTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndRequesterTest.java
index f0e789d..c0e7977 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndRequesterTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerAndRequesterTest.java
@@ -34,7 +34,6 @@
 import java.util.Queue;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpResponse;
@@ -45,7 +44,6 @@
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
 import org.apache.hc.core5.http.nio.AsyncClientEndpoint;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
@@ -105,7 +103,7 @@
         protected void before() throws Throwable {
             log.debug("Starting up test server");
             server = H2ServerBootstrap.bootstrap()
-                    .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                    .setLookupRegistry(new UriPatternMatcher<>())
                     .setVersionPolicy(HttpVersionPolicy.NEGOTIATE)
                     .setIOReactorConfig(
                             IOReactorConfig.custom()
@@ -118,14 +116,7 @@
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                     .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                     .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
+                    .register("*", () -> new EchoHandler(2048))
                     .create();
         }
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerBootstrapFiltersTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerBootstrapFiltersTest.java
index e629fb0..73dc943 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerBootstrapFiltersTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2ServerBootstrapFiltersTest.java
@@ -31,9 +31,7 @@
 import java.net.InetSocketAddress;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHost;
@@ -45,17 +43,13 @@
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
-import org.apache.hc.core5.http.nio.AsyncDataConsumer;
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
 import org.apache.hc.core5.http.nio.AsyncFilterChain;
-import org.apache.hc.core5.http.nio.AsyncFilterHandler;
 import org.apache.hc.core5.http.nio.AsyncPushProducer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
 import org.apache.hc.core5.http.nio.support.BasicResponseConsumer;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.UriPatternMatcher;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
 import org.apache.hc.core5.http2.impl.nio.bootstrap.H2RequesterBootstrap;
@@ -90,7 +84,7 @@
         protected void before() throws Throwable {
             log.debug("Starting up test server");
             server = H2ServerBootstrap.bootstrap()
-                    .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                    .setLookupRegistry(new UriPatternMatcher<>())
                     .setVersionPolicy(HttpVersionPolicy.NEGOTIATE)
                     .setIOReactorConfig(
                             IOReactorConfig.custom()
@@ -101,24 +95,9 @@
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                     .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                     .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
-                    .addFilterLast("test-filter", new AsyncFilterHandler() {
-
-                        @Override
-                        public AsyncDataConsumer handle(
-                                final HttpRequest request,
-                                final EntityDetails entityDetails,
-                                final HttpContext context,
-                                final AsyncFilterChain.ResponseTrigger responseTrigger,
-                                final AsyncFilterChain chain) throws HttpException, IOException {
-                            return chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
+                    .register("*", () -> new EchoHandler(2048))
+                    .addFilterLast("test-filter", (request, entityDetails, context, responseTrigger, chain) ->
+                            chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
 
                                 @Override
                                 public void sendInformation(
@@ -141,9 +120,7 @@
                                     responseTrigger.pushPromise(promise, responseProducer);
                                 }
 
-                            });
-                        }
-                    })
+                            }))
                     .create();
         }
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2TLSIntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2TLSIntegrationTest.java
index e95c460..0d2291c 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2TLSIntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/H2TLSIntegrationTest.java
@@ -33,12 +33,9 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicReference;
 
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLHandshakeException;
 import javax.net.ssl.SSLSession;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpResponse;
@@ -50,7 +47,6 @@
 import org.apache.hc.core5.http.impl.bootstrap.AsyncServerBootstrap;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.ssl.BasicClientTlsStrategy;
@@ -61,12 +57,8 @@
 import org.apache.hc.core5.http.ssl.TLS;
 import org.apache.hc.core5.http2.impl.nio.bootstrap.H2RequesterBootstrap;
 import org.apache.hc.core5.io.CloseMode;
-import org.apache.hc.core5.net.NamedEndpoint;
 import org.apache.hc.core5.reactor.IOReactorConfig;
 import org.apache.hc.core5.reactor.ListenerEndpoint;
-import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
-import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier;
-import org.apache.hc.core5.reactor.ssl.TlsDetails;
 import org.apache.hc.core5.ssl.SSLContexts;
 import org.apache.hc.core5.testing.SSLTestContexts;
 import org.apache.hc.core5.testing.classic.LoggingConnPoolListener;
@@ -119,7 +111,7 @@
     @Test
     public void testTLSSuccess() throws Exception {
         server = AsyncServerBootstrap.bootstrap()
-                .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                .setLookupRegistry(new UriPatternMatcher<>())
                 .setIOReactorConfig(
                         IOReactorConfig.custom()
                                 .setSoTimeout(TIMEOUT)
@@ -129,14 +121,7 @@
                 .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                 .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                 .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new EchoHandler(2048);
-                    }
-
-                })
+                .register("*", () -> new EchoHandler(2048))
                 .create();
         server.start();
 
@@ -148,15 +133,9 @@
                         .build())
                 .setTlsStrategy(new BasicClientTlsStrategy(
                         SSLTestContexts.createClientSSLContext(),
-                        new SSLSessionVerifier() {
-
-                            @Override
-                            public TlsDetails verify(
-                                    final NamedEndpoint endpoint, final SSLEngine sslEngine) throws SSLException {
-                                sslSessionRef.set(sslEngine.getSession());
-                                return null;
-                            }
-
+                        (endpoint, sslEngine) -> {
+                            sslSessionRef.set(sslEngine.getSession());
+                            return null;
                         }))
                 .setStreamListener(LoggingHttp1StreamListener.INSTANCE_CLIENT)
                 .setConnPoolListener(LoggingConnPoolListener.INSTANCE)
@@ -193,7 +172,7 @@
     @Test
     public void testTLSTrustFailure() throws Exception {
         server = AsyncServerBootstrap.bootstrap()
-                .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                .setLookupRegistry(new UriPatternMatcher<>())
                 .setIOReactorConfig(
                         IOReactorConfig.custom()
                                 .setSoTimeout(TIMEOUT)
@@ -203,14 +182,7 @@
                 .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                 .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                 .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new EchoHandler(2048);
-                    }
-
-                })
+                .register("*", () -> new EchoHandler(2048))
                 .create();
         server.start();
 
@@ -249,33 +221,20 @@
     @Test
     public void testTLSClientAuthFailure() throws Exception {
         server = AsyncServerBootstrap.bootstrap()
-                .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                .setLookupRegistry(new UriPatternMatcher<>())
                 .setIOReactorConfig(
                         IOReactorConfig.custom()
                                 .setSoTimeout(TIMEOUT)
                                 .build())
                 .setTlsStrategy(new BasicServerTlsStrategy(
                         SSLTestContexts.createServerSSLContext(),
-                        new SSLSessionInitializer() {
-
-                            @Override
-                            public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                                sslEngine.setNeedClientAuth(true);
-                            }
-                        },
+                        (endpoint, sslEngine) -> sslEngine.setNeedClientAuth(true),
                         null))
                 .setStreamListener(LoggingHttp1StreamListener.INSTANCE_SERVER)
                 .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                 .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                 .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new EchoHandler(2048);
-                    }
-
-                })
+                .register("*", () -> new EchoHandler(2048))
                 .create();
         server.start();
 
@@ -314,33 +273,20 @@
     @Test
     public void testSSLDisabledByDefault() throws Exception {
         server = AsyncServerBootstrap.bootstrap()
-                .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                .setLookupRegistry(new UriPatternMatcher<>())
                 .setIOReactorConfig(
                         IOReactorConfig.custom()
                                 .setSoTimeout(TIMEOUT)
                                 .build())
                 .setTlsStrategy(new BasicServerTlsStrategy(
                         SSLTestContexts.createServerSSLContext(),
-                        new SSLSessionInitializer() {
-
-                            @Override
-                            public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                                sslEngine.setEnabledProtocols(new String[]{"SSLv3"});
-                            }
-                        },
+                        (endpoint, sslEngine) -> sslEngine.setEnabledProtocols(new String[]{"SSLv3"}),
                         null))
                 .setStreamListener(LoggingHttp1StreamListener.INSTANCE_SERVER)
                 .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                 .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                 .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new EchoHandler(2048);
-                    }
-
-                })
+                .register("*", () -> new EchoHandler(2048))
                 .create();
         server.start();
 
@@ -411,33 +357,20 @@
 
         for (final String cipherSuite : weakCiphersSuites) {
             server = AsyncServerBootstrap.bootstrap()
-                    .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                    .setLookupRegistry(new UriPatternMatcher<>())
                     .setIOReactorConfig(
                             IOReactorConfig.custom()
                                     .setSoTimeout(TIMEOUT)
                                     .build())
                     .setTlsStrategy(new BasicServerTlsStrategy(
                             SSLTestContexts.createServerSSLContext(),
-                            new SSLSessionInitializer() {
-
-                                @Override
-                                public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                                    sslEngine.setEnabledCipherSuites(new String[]{cipherSuite});
-                                }
-                            },
+                            (endpoint, sslEngine) -> sslEngine.setEnabledCipherSuites(new String[]{cipherSuite}),
                             null))
                     .setStreamListener(LoggingHttp1StreamListener.INSTANCE_SERVER)
                     .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                     .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                     .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
+                    .register("*", () -> new EchoHandler(2048))
                     .create();
             try {
                 server.start();
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1AuthenticationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1AuthenticationTest.java
index 9b779cc..29e600e 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1AuthenticationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1AuthenticationTest.java
@@ -34,7 +34,6 @@
 import java.util.Random;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
@@ -53,7 +52,6 @@
 import org.apache.hc.core5.http.impl.bootstrap.StandardFilter;
 import org.apache.hc.core5.http.message.BasicHttpRequest;
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.AsyncEntityProducers;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.support.AbstractAsyncServerAuthFilter;
@@ -110,14 +108,7 @@
                             IOReactorConfig.custom()
                                     .setSoTimeout(TIMEOUT)
                                     .build())
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                        @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
-                        }
-
-                    })
+                    .register("*", () -> new EchoHandler(2048))
                     .replaceFilter(StandardFilter.EXPECT_CONTINUE.name(), new AbstractAsyncServerAuthFilter<String>(respondImmediately) {
 
                         @Override
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java
index 8c9a20e..cd0d874 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java
@@ -58,8 +58,6 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.hc.core5.function.Decorator;
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ConnectionReuseStrategy;
 import org.apache.hc.core5.http.ContentLengthStrategy;
 import org.apache.hc.core5.http.ContentType;
@@ -193,14 +191,7 @@
 
     @Test
     public void testSimpleGet() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -224,14 +215,7 @@
 
     @Test
     public void testSimpleGetConnectionClose() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -258,14 +242,7 @@
 
     @Test
     public void testSimpleGetIdentityTransfer() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final HttpProcessor httpProcessor = new DefaultHttpProcessor(new RequestValidateHost());
         final InetSocketAddress serverEndpoint = server.start(httpProcessor, Http1Config.DEFAULT);
 
@@ -287,14 +264,7 @@
 
     @Test
     public void testSimpleGetsPipelined() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -322,14 +292,7 @@
 
     @Test
     public void testLargeGet() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcdef", 5000);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcdef", 5000));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -372,14 +335,7 @@
 
     @Test
     public void testLargeGetsPipelined() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcdef", 2000);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcdef", 2000));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -411,14 +367,7 @@
 
     @Test
     public void testBasicPost() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -443,14 +392,7 @@
 
     @Test
     public void testBasicPostPipelined() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -479,14 +421,7 @@
 
     @Test
     public void testHttp10Post() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -512,14 +447,7 @@
 
     @Test
     public void testNoEntityPost() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -544,14 +472,7 @@
 
     @Test
     public void testLargePost() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new EchoHandler(2048);
-            }
-
-        });
+        server.register("*", () -> new EchoHandler(2048));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -580,14 +501,7 @@
 
     @Test
     public void testPostsPipelinedLargeResponse() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcdef", 2000);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcdef", 2000));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -621,14 +535,7 @@
 
     @Test
     public void testLargePostsPipelined() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new EchoHandler(2048);
-            }
-
-        });
+        server.register("*", () -> new EchoHandler(2048));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -661,14 +568,7 @@
 
     @Test
     public void testSimpleHead() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -691,14 +591,7 @@
 
     @Test
     public void testSimpleHeadConnectionClose() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -724,14 +617,7 @@
 
     @Test
     public void testHeadPipelined() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -758,42 +644,27 @@
 
     @Test
     public void testExpectationFailed() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
+            protected void handle(
+                    final Message<HttpRequest, String> request,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws IOException, HttpException {
+                responseTrigger.submitResponse(new BasicResponseProducer(HttpStatus.SC_OK, "All is well"), context);
 
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> request,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws IOException, HttpException {
-                        responseTrigger.submitResponse(new BasicResponseProducer(HttpStatus.SC_OK, "All is well"), context);
-
-                    }
-                };
             }
-
         });
-        final InetSocketAddress serverEndpoint = server.start(null, new Decorator<AsyncServerExchangeHandler>() {
+        final InetSocketAddress serverEndpoint = server.start(null, handler -> new BasicAsyncServerExpectationDecorator(handler) {
 
             @Override
-            public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-
-                return new BasicAsyncServerExpectationDecorator(handler) {
-
-                    @Override
-                    protected AsyncResponseProducer verify(final HttpRequest request, final HttpContext context) throws IOException, HttpException {
-                        final Header h = request.getFirstHeader("password");
-                        if (h != null && "secret".equals(h.getValue())) {
-                            return null;
-                        } else {
-                            return new BasicResponseProducer(HttpStatus.SC_UNAUTHORIZED, "You shall not pass");
-                        }
-                    }
-                };
-
+            protected AsyncResponseProducer verify(final HttpRequest request, final HttpContext context) throws IOException, HttpException {
+                final Header h = request.getFirstHeader("password");
+                if (h != null && "secret".equals(h.getValue())) {
+                    return null;
+                } else {
+                    return new BasicResponseProducer(HttpStatus.SC_UNAUTHORIZED, "You shall not pass");
+                }
             }
         }, Http1Config.DEFAULT);
 
@@ -860,44 +731,29 @@
 
     @Test
     public void testExpectationFailedCloseConnection() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
+            protected void handle(
+                    final Message<HttpRequest, String> request,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws IOException, HttpException {
+                responseTrigger.submitResponse(new BasicResponseProducer(HttpStatus.SC_OK, "All is well"), context);
 
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> request,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws IOException, HttpException {
-                        responseTrigger.submitResponse(new BasicResponseProducer(HttpStatus.SC_OK, "All is well"), context);
-
-                    }
-                };
             }
-
         });
-        final InetSocketAddress serverEndpoint = server.start(null, new Decorator<AsyncServerExchangeHandler>() {
+        final InetSocketAddress serverEndpoint = server.start(null, handler -> new BasicAsyncServerExpectationDecorator(handler) {
 
             @Override
-            public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-
-                return new BasicAsyncServerExpectationDecorator(handler) {
-
-                    @Override
-                    protected AsyncResponseProducer verify(final HttpRequest request, final HttpContext context) throws IOException, HttpException {
-                        final Header h = request.getFirstHeader("password");
-                        if (h != null && "secret".equals(h.getValue())) {
-                            return null;
-                        } else {
-                            final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_UNAUTHORIZED);
-                            response.addHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
-                            return new BasicResponseProducer(response, "You shall not pass");
-                        }
-                    }
-                };
-
+            protected AsyncResponseProducer verify(final HttpRequest request, final HttpContext context) throws IOException, HttpException {
+                final Header h = request.getFirstHeader("password");
+                if (h != null && "secret".equals(h.getValue())) {
+                    return null;
+                } else {
+                    final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_UNAUTHORIZED);
+                    response.addHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
+                    return new BasicResponseProducer(response, "You shall not pass");
+                }
             }
         }, Http1Config.DEFAULT);
 
@@ -926,84 +782,74 @@
 
     @Test
     public void testDelayedExpectationVerification() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new AsyncServerExchangeHandler() {
+
+            private final Random random = new Random(System.currentTimeMillis());
+            private final AsyncEntityProducer entityProducer = AsyncEntityProducers.create(
+                    "All is well");
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AsyncServerExchangeHandler() {
+            public void handleRequest(
+                    final HttpRequest request,
+                    final EntityDetails entityDetails,
+                    final ResponseChannel responseChannel,
+                    final HttpContext context) throws HttpException, IOException {
 
-                    private final Random random = new Random(System.currentTimeMillis());
-                    private final AsyncEntityProducer entityProducer = AsyncEntityProducers.create(
-                            "All is well");
-
-                    @Override
-                    public void handleRequest(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final ResponseChannel responseChannel,
-                            final HttpContext context) throws HttpException, IOException {
-
-                        Executors.newSingleThreadExecutor().execute(new Runnable() {
-                            @Override
-                            public void run() {
-                                try {
-                                    if (entityDetails != null) {
-                                        final Header h = request.getFirstHeader(HttpHeaders.EXPECT);
-                                        if (h != null && HeaderElements.CONTINUE.equalsIgnoreCase(h.getValue())) {
-                                            Thread.sleep(random.nextInt(1000));
-                                            responseChannel.sendInformation(new BasicHttpResponse(HttpStatus.SC_CONTINUE), context);
-                                        }
-                                        final HttpResponse response = new BasicHttpResponse(200);
-                                        synchronized (entityProducer) {
-                                            responseChannel.sendResponse(response, entityProducer, context);
-                                        }
-                                    }
-                                } catch (final Exception ignore) {
-                                    // ignore
-                                }
+                Executors.newSingleThreadExecutor().execute(() -> {
+                    try {
+                        if (entityDetails != null) {
+                            final Header h = request.getFirstHeader(HttpHeaders.EXPECT);
+                            if (h != null && HeaderElements.CONTINUE.equalsIgnoreCase(h.getValue())) {
+                                Thread.sleep(random.nextInt(1000));
+                                responseChannel.sendInformation(new BasicHttpResponse(HttpStatus.SC_CONTINUE), context);
                             }
-                        });
-
-                    }
-
-                    @Override
-                    public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                        capacityChannel.update(Integer.MAX_VALUE);
-                    }
-
-                    @Override
-                    public void consume(final ByteBuffer src) throws IOException {
-                    }
-
-                    @Override
-                    public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
-                    }
-
-                    @Override
-                    public int available() {
-                        synchronized (entityProducer) {
-                            return entityProducer.available();
+                            final HttpResponse response = new BasicHttpResponse(200);
+                            synchronized (entityProducer) {
+                                responseChannel.sendResponse(response, entityProducer, context);
+                            }
                         }
+                    } catch (final Exception ignore) {
+                        // ignore
                     }
-
-                    @Override
-                    public void produce(final DataStreamChannel channel) throws IOException {
-                        synchronized (entityProducer) {
-                            entityProducer.produce(channel);
-                        }
-                    }
-
-                    @Override
-                    public void failed(final Exception cause) {
-                    }
-
-                    @Override
-                    public void releaseResources() {
-                    }
-
-                };
+                });
 
             }
+
+            @Override
+            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                capacityChannel.update(Integer.MAX_VALUE);
+            }
+
+            @Override
+            public void consume(final ByteBuffer src) throws IOException {
+            }
+
+            @Override
+            public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
+            }
+
+            @Override
+            public int available() {
+                synchronized (entityProducer) {
+                    return entityProducer.available();
+                }
+            }
+
+            @Override
+            public void produce(final DataStreamChannel channel) throws IOException {
+                synchronized (entityProducer) {
+                    entityProducer.produce(channel);
+                }
+            }
+
+            @Override
+            public void failed(final Exception cause) {
+            }
+
+            @Override
+            public void releaseResources() {
+            }
+
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -1032,66 +878,59 @@
 
     @Test
     public void testPrematureResponse() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new AsyncServerExchangeHandler() {
+
+            private final AtomicReference<AsyncResponseProducer> responseProducer = new AtomicReference<>(null);
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AsyncServerExchangeHandler() {
-
-                    private final AtomicReference<AsyncResponseProducer> responseProducer = new AtomicReference<>(null);
-
-                    @Override
-                    public void handleRequest(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final ResponseChannel responseChannel,
-                            final HttpContext context) throws HttpException, IOException {
-                        final AsyncResponseProducer producer;
-                        final Header h = request.getFirstHeader("password");
-                        if (h != null && "secret".equals(h.getValue())) {
-                            producer = new BasicResponseProducer(HttpStatus.SC_OK, "All is well");
-                        } else {
-                            producer = new BasicResponseProducer(HttpStatus.SC_UNAUTHORIZED, "You shall not pass");
-                        }
-                        responseProducer.set(producer);
-                        producer.sendResponse(responseChannel, context);
-                    }
-
-                    @Override
-                    public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                        capacityChannel.update(Integer.MAX_VALUE);
-                    }
-
-                    @Override
-                    public void consume(final ByteBuffer src) throws IOException {
-                    }
-
-                    @Override
-                    public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
-                    }
-
-                    @Override
-                    public int available() {
-                        final AsyncResponseProducer producer = responseProducer.get();
-                        return producer.available();
-                    }
-
-                    @Override
-                    public void produce(final DataStreamChannel channel) throws IOException {
-                        final AsyncResponseProducer producer = responseProducer.get();
-                        producer.produce(channel);
-                    }
-
-                    @Override
-                    public void failed(final Exception cause) {
-                    }
-
-                    @Override
-                    public void releaseResources() {
-                    }
-                };
+            public void handleRequest(
+                    final HttpRequest request,
+                    final EntityDetails entityDetails,
+                    final ResponseChannel responseChannel,
+                    final HttpContext context) throws HttpException, IOException {
+                final AsyncResponseProducer producer;
+                final Header h = request.getFirstHeader("password");
+                if (h != null && "secret".equals(h.getValue())) {
+                    producer = new BasicResponseProducer(HttpStatus.SC_OK, "All is well");
+                } else {
+                    producer = new BasicResponseProducer(HttpStatus.SC_UNAUTHORIZED, "You shall not pass");
+                }
+                responseProducer.set(producer);
+                producer.sendResponse(responseChannel, context);
             }
 
+            @Override
+            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                capacityChannel.update(Integer.MAX_VALUE);
+            }
+
+            @Override
+            public void consume(final ByteBuffer src) throws IOException {
+            }
+
+            @Override
+            public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
+            }
+
+            @Override
+            public int available() {
+                final AsyncResponseProducer producer = responseProducer.get();
+                return producer.available();
+            }
+
+            @Override
+            public void produce(final DataStreamChannel channel) throws IOException {
+                final AsyncResponseProducer producer = responseProducer.get();
+                producer.produce(channel);
+            }
+
+            @Override
+            public void failed(final Exception cause) {
+            }
+
+            @Override
+            public void releaseResources() {
+            }
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -1133,14 +972,7 @@
 
     @Test
     public void testSlowResponseConsumer() throws Exception {
-        server.register("/", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new MultiLineResponseHandler("0123456789abcd", 100);
-            }
-
-        });
+        server.register("/", () -> new MultiLineResponseHandler("0123456789abcd", 100));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start(Http1Config.custom().setBufferSize(256).build());
@@ -1194,14 +1026,7 @@
 
     @Test
     public void testSlowRequestProducer() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new EchoHandler(2048);
-            }
-
-        });
+        server.register("*", () -> new EchoHandler(2048));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -1250,62 +1075,55 @@
 
     @Test
     public void testSlowResponseProducer() throws Exception {
-        server.register("*", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("*", () -> new AbstractClassicServerExchangeHandler(2048, Executors.newSingleThreadExecutor()) {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AbstractClassicServerExchangeHandler(2048, Executors.newSingleThreadExecutor()) {
+            protected void handle(
+                    final HttpRequest request,
+                    final InputStream requestStream,
+                    final HttpResponse response,
+                    final OutputStream responseStream,
+                    final HttpContext context) throws IOException, HttpException {
 
-                    @Override
-                    protected void handle(
-                            final HttpRequest request,
-                            final InputStream requestStream,
-                            final HttpResponse response,
-                            final OutputStream responseStream,
-                            final HttpContext context) throws IOException, HttpException {
-
-                        if (!"/hello".equals(request.getPath())) {
-                            response.setCode(HttpStatus.SC_NOT_FOUND);
-                            return;
-                        }
-                        if (!Method.POST.name().equalsIgnoreCase(request.getMethod())) {
-                            response.setCode(HttpStatus.SC_NOT_IMPLEMENTED);
-                            return;
-                        }
-                        if (requestStream == null) {
-                            return;
-                        }
-                        final Header h1 = request.getFirstHeader(HttpHeaders.CONTENT_TYPE);
-                        final ContentType contentType = h1 != null ? ContentType.parse(h1.getValue()) : null;
-                        Charset charset = contentType != null ? contentType.getCharset() : null;
-                        if (charset == null) {
-                            charset = StandardCharsets.US_ASCII;
-                        }
-                        response.setCode(HttpStatus.SC_OK);
-                        response.setHeader(h1);
-                        try (final BufferedReader reader = new BufferedReader(new InputStreamReader(requestStream, charset));
-                             final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(responseStream, charset))) {
-                            try {
-                                String l;
-                                int count = 0;
-                                while ((l = reader.readLine()) != null) {
-                                    writer.write(l);
-                                    writer.write("\r\n");
-                                    count++;
-                                    if (count % 500 == 0) {
-                                        Thread.sleep(500);
-                                    }
-                                }
-                                writer.flush();
-                            } catch (final InterruptedException ex) {
-                                Thread.currentThread().interrupt();
-                                throw new InterruptedIOException(ex.getMessage());
+                if (!"/hello".equals(request.getPath())) {
+                    response.setCode(HttpStatus.SC_NOT_FOUND);
+                    return;
+                }
+                if (!Method.POST.name().equalsIgnoreCase(request.getMethod())) {
+                    response.setCode(HttpStatus.SC_NOT_IMPLEMENTED);
+                    return;
+                }
+                if (requestStream == null) {
+                    return;
+                }
+                final Header h1 = request.getFirstHeader(HttpHeaders.CONTENT_TYPE);
+                final ContentType contentType = h1 != null ? ContentType.parse(h1.getValue()) : null;
+                Charset charset = contentType != null ? contentType.getCharset() : null;
+                if (charset == null) {
+                    charset = StandardCharsets.US_ASCII;
+                }
+                response.setCode(HttpStatus.SC_OK);
+                response.setHeader(h1);
+                try (final BufferedReader reader = new BufferedReader(new InputStreamReader(requestStream, charset));
+                     final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(responseStream, charset))) {
+                    try {
+                        String l;
+                        int count = 0;
+                        while ((l = reader.readLine()) != null) {
+                            writer.write(l);
+                            writer.write("\r\n");
+                            count++;
+                            if (count % 500 == 0) {
+                                Thread.sleep(500);
                             }
                         }
+                        writer.flush();
+                    } catch (final InterruptedException ex) {
+                        Thread.currentThread().interrupt();
+                        throw new InterruptedIOException(ex.getMessage());
                     }
-                };
+                }
             }
-
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -1334,14 +1152,7 @@
 
     @Test
     public void testPipelinedConnectionClose() throws Exception {
-        server.register("/hello*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello*", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -1401,14 +1212,7 @@
 
     @Test
     public void testPipelinedInvalidRequest() throws Exception {
-        server.register("/hello*", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi back");
-            }
-
-        });
+        server.register("/hello*", () -> new SingleLineResponseHandler("Hi back"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -1503,24 +1307,15 @@
     public void testTruncatedChunk() throws Exception {
         final InetSocketAddress serverEndpoint = server.start(new InternalServerHttp1EventHandlerFactory(
                 HttpProcessors.server(),
-                new HandlerFactory<AsyncServerExchangeHandler>() {
+                (request, context) -> new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
 
                     @Override
-                    public AsyncServerExchangeHandler create(
-                            final HttpRequest request,
-                            final HttpContext context) throws HttpException {
-                        return new MessageExchangeHandler<String>(new StringAsyncEntityConsumer()) {
-
-                            @Override
-                            protected void handle(
-                                    final Message<HttpRequest, String> request,
-                                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                                    final HttpContext context) throws IOException, HttpException {
-                                responseTrigger.submitResponse(
-                                        new BasicResponseProducer(new StringAsyncEntityProducer("useful stuff")), context);
-                            }
-
-                        };
+                    protected void handle(
+                            final Message<HttpRequest, String> request,
+                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                            final HttpContext context) throws IOException, HttpException {
+                        responseTrigger.submitResponse(
+                                new BasicResponseProducer(new StringAsyncEntityProducer("useful stuff")), context);
                     }
 
                 },
@@ -1595,22 +1390,15 @@
 
     @Test
     public void testExceptionInHandler() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there") {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there") {
-
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> request,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws IOException, HttpException {
-                        throw new HttpException("Boom");
-                    }
-                };
+            protected void handle(
+                    final Message<HttpRequest, String> request,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws IOException, HttpException {
+                throw new HttpException("Boom");
             }
-
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -1654,23 +1442,16 @@
 
     @Test
     public void testResponseNoContent() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there") {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there") {
-
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> request,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws IOException, HttpException {
-                        final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_NO_CONTENT);
-                        responseTrigger.submitResponse(new BasicResponseProducer(response), context);
-                    }
-                };
+            protected void handle(
+                    final Message<HttpRequest, String> request,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws IOException, HttpException {
+                final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_NO_CONTENT);
+                responseTrigger.submitResponse(new BasicResponseProducer(response), context);
             }
-
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -1692,14 +1473,7 @@
 
     @Test
     public void testAbsentHostHeader() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start(new DefaultHttpProcessor(new RequestContent(), new RequestConnControl()), Http1Config.DEFAULT);
@@ -1735,33 +1509,26 @@
 
     @Test
     public void testMessageWithTrailers() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("/hello", () -> new AbstractServerExchangeHandler<Message<HttpRequest, String>>() {
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AbstractServerExchangeHandler<Message<HttpRequest, String>>() {
-
-                    @Override
-                    protected AsyncRequestConsumer<Message<HttpRequest, String>> supplyConsumer(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final HttpContext context) throws HttpException {
-                        return new BasicRequestConsumer<>(entityDetails != null ? new StringAsyncEntityConsumer() : null);
-                    }
-
-                    @Override
-                    protected void handle(
-                            final Message<HttpRequest, String> requestMessage,
-                            final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
-                            final HttpContext context) throws HttpException, IOException {
-                        responseTrigger.submitResponse(new BasicResponseProducer(
-                                HttpStatus.SC_OK,
-                                new DigestingEntityProducer("MD5",
-                                        new StringAsyncEntityProducer("Hello back with some trailers"))), context);
-                    }
-                };
+            protected AsyncRequestConsumer<Message<HttpRequest, String>> supplyConsumer(
+                    final HttpRequest request,
+                    final EntityDetails entityDetails,
+                    final HttpContext context) throws HttpException {
+                return new BasicRequestConsumer<>(entityDetails != null ? new StringAsyncEntityConsumer() : null);
             }
 
+            @Override
+            protected void handle(
+                    final Message<HttpRequest, String> requestMessage,
+                    final AsyncServerRequestHandler.ResponseTrigger responseTrigger,
+                    final HttpContext context) throws HttpException, IOException {
+                responseTrigger.submitResponse(new BasicResponseProducer(
+                        HttpStatus.SC_OK,
+                        new DigestingEntityProducer("MD5",
+                                new StringAsyncEntityProducer("Hello back with some trailers"))), context);
+            }
         });
         final InetSocketAddress serverEndpoint = server.start();
 
@@ -1797,62 +1564,55 @@
 
     @Test
     public void testProtocolException() throws Exception {
-        server.register("/boom", new Supplier<AsyncServerExchangeHandler>() {
+        server.register("/boom", () -> new AsyncServerExchangeHandler() {
+
+            private final StringAsyncEntityProducer entityProducer = new StringAsyncEntityProducer("Everyting is OK");
 
             @Override
-            public AsyncServerExchangeHandler get() {
-                return new AsyncServerExchangeHandler() {
+            public void releaseResources() {
+                entityProducer.releaseResources();
+            }
 
-                    private final StringAsyncEntityProducer entityProducer = new StringAsyncEntityProducer("Everyting is OK");
+            @Override
+            public void handleRequest(
+                    final HttpRequest request,
+                    final EntityDetails entityDetails,
+                    final ResponseChannel responseChannel,
+                    final HttpContext context) throws HttpException, IOException {
+                final String requestUri = request.getRequestUri();
+                if (requestUri.endsWith("boom")) {
+                    throw new ProtocolException("Boom!!!");
+                }
+                responseChannel.sendResponse(new BasicHttpResponse(200), entityProducer, context);
+            }
 
-                    @Override
-                    public void releaseResources() {
-                        entityProducer.releaseResources();
-                    }
+            @Override
+            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                capacityChannel.update(Integer.MAX_VALUE);
+            }
 
-                    @Override
-                    public void handleRequest(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final ResponseChannel responseChannel,
-                            final HttpContext context) throws HttpException, IOException {
-                        final String requestUri = request.getRequestUri();
-                        if (requestUri.endsWith("boom")) {
-                            throw new ProtocolException("Boom!!!");
-                        }
-                        responseChannel.sendResponse(new BasicHttpResponse(200), entityProducer, context);
-                    }
+            @Override
+            public void consume(final ByteBuffer src) throws IOException {
+            }
 
-                    @Override
-                    public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                        capacityChannel.update(Integer.MAX_VALUE);
-                    }
+            @Override
+            public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
+                // empty
+            }
 
-                    @Override
-                    public void consume(final ByteBuffer src) throws IOException {
-                    }
+            @Override
+            public int available() {
+                return entityProducer.available();
+            }
 
-                    @Override
-                    public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
-                        // empty
-                    }
+            @Override
+            public void produce(final DataStreamChannel channel) throws IOException {
+                entityProducer.produce(channel);
+            }
 
-                    @Override
-                    public int available() {
-                        return entityProducer.available();
-                    }
-
-                    @Override
-                    public void produce(final DataStreamChannel channel) throws IOException {
-                        entityProducer.produce(channel);
-                    }
-
-                    @Override
-                    public void failed(final Exception cause) {
-                        releaseResources();
-                    }
-
-                };
+            @Override
+            public void failed(final Exception cause) {
+                releaseResources();
             }
 
         });
@@ -1877,14 +1637,7 @@
 
     @Test
     public void testHeaderTooLarge() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start(null, Http1Config.custom()
                 .setMaxLineLength(100)
                 .build());
@@ -1910,14 +1663,7 @@
 
     @Test
     public void testHeaderTooLargePost() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start(null, Http1Config.custom()
                 .setMaxLineLength(100)
                 .build());
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1ServerAndRequesterTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1ServerAndRequesterTest.java
index 4fd8002..8b8f15f 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1ServerAndRequesterTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1ServerAndRequesterTest.java
@@ -35,9 +35,7 @@
 import java.util.Queue;
 import java.util.concurrent.Future;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.HeaderElements;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
@@ -55,19 +53,15 @@
 import org.apache.hc.core5.http.impl.bootstrap.StandardFilter;
 import org.apache.hc.core5.http.message.BasicHttpRequest;
 import org.apache.hc.core5.http.nio.AsyncClientEndpoint;
-import org.apache.hc.core5.http.nio.AsyncDataConsumer;
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
 import org.apache.hc.core5.http.nio.AsyncFilterChain;
-import org.apache.hc.core5.http.nio.AsyncFilterHandler;
 import org.apache.hc.core5.http.nio.AsyncPushProducer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
 import org.apache.hc.core5.http.nio.ssl.BasicClientTlsStrategy;
 import org.apache.hc.core5.http.nio.ssl.BasicServerTlsStrategy;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
 import org.apache.hc.core5.http.nio.support.BasicResponseConsumer;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.UriPatternMatcher;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.reactor.IOReactorConfig;
@@ -114,56 +108,38 @@
         protected void before() throws Throwable {
             log.debug("Starting up test server");
             server = AsyncServerBootstrap.bootstrap()
-                    .setLookupRegistry(new UriPatternMatcher<Supplier<AsyncServerExchangeHandler>>())
+                    .setLookupRegistry(new UriPatternMatcher<>())
                     .setIOReactorConfig(
                             IOReactorConfig.custom()
                                     .setSoTimeout(TIMEOUT)
                                     .build())
-                    .register("*", new Supplier<AsyncServerExchangeHandler>() {
+                    .register("*", () -> new EchoHandler(2048))
+                    .addFilterBefore(StandardFilter.MAIN_HANDLER.name(), "no-keepalive", (request, entityDetails, context, responseTrigger, chain) -> chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
 
                         @Override
-                        public AsyncServerExchangeHandler get() {
-                            return new EchoHandler(2048);
+                        public void sendInformation(
+                                final HttpResponse response) throws HttpException, IOException {
+                            responseTrigger.sendInformation(response);
                         }
 
-                    })
-                    .addFilterBefore(StandardFilter.MAIN_HANDLER.name(), "no-keepalive", new AsyncFilterHandler() {
-
                         @Override
-                        public AsyncDataConsumer handle(
-                                final HttpRequest request,
-                                final EntityDetails entityDetails,
-                                final HttpContext context,
-                                final AsyncFilterChain.ResponseTrigger responseTrigger,
-                                final AsyncFilterChain chain) throws HttpException, IOException {
-                            return chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
-
-                                @Override
-                                public void sendInformation(
-                                        final HttpResponse response) throws HttpException, IOException {
-                                    responseTrigger.sendInformation(response);
-                                }
-
-                                @Override
-                                public void submitResponse(
-                                        final HttpResponse response,
-                                        final AsyncEntityProducer entityProducer) throws HttpException, IOException {
-                                    if (request.getPath().startsWith("/no-keep-alive")) {
-                                        response.setHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
-                                    }
-                                    responseTrigger.submitResponse(response, entityProducer);
-                                }
-
-                                @Override
-                                public void pushPromise(
-                                        final HttpRequest promise,
-                                        final AsyncPushProducer responseProducer) throws HttpException, IOException {
-                                    responseTrigger.pushPromise(promise, responseProducer);
-                                }
-
-                            });
+                        public void submitResponse(
+                                final HttpResponse response,
+                                final AsyncEntityProducer entityProducer) throws HttpException, IOException {
+                            if (request.getPath().startsWith("/no-keep-alive")) {
+                                response.setHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
+                            }
+                            responseTrigger.submitResponse(response, entityProducer);
                         }
-                    })
+
+                        @Override
+                        public void pushPromise(
+                                final HttpRequest promise,
+                                final AsyncPushProducer responseProducer) throws HttpException, IOException {
+                            responseTrigger.pushPromise(promise, responseProducer);
+                        }
+
+                    }))
                     .setTlsStrategy(scheme == URIScheme.HTTPS  ?
                             new BasicServerTlsStrategy(SSLTestContexts.createServerSSLContext()) : null)
                     .setStreamListener(LoggingHttp1StreamListener.INSTANCE_SERVER)
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/JSSEProviderIntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/JSSEProviderIntegrationTest.java
index 5ddd0c1..160352b 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/JSSEProviderIntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/JSSEProviderIntegrationTest.java
@@ -38,15 +38,11 @@
 import java.util.Collection;
 import java.util.concurrent.Future;
 
-import javax.net.ssl.SSLEngine;
-
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.Message;
 import org.apache.hc.core5.http.Method;
 import org.apache.hc.core5.http.config.Http1Config;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
 import org.apache.hc.core5.http.nio.support.AsyncRequestBuilder;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
@@ -54,9 +50,7 @@
 import org.apache.hc.core5.http.protocol.DefaultHttpProcessor;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.apache.hc.core5.http.protocol.RequestValidateHost;
-import org.apache.hc.core5.net.NamedEndpoint;
 import org.apache.hc.core5.reactor.IOReactorConfig;
-import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
 import org.apache.hc.core5.ssl.SSLContextBuilder;
 import org.apache.hc.core5.util.ReflectionUtils;
 import org.apache.hc.core5.util.TimeValue;
@@ -157,15 +151,10 @@
                             .loadKeyMaterial(keyStoreURL, storePassword.toCharArray(), storePassword.toCharArray())
                             .setSecureRandom(new SecureRandom())
                             .build(),
-                    new SSLSessionInitializer() {
-
-                        @Override
-                        public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                            if (protocolVersion != null) {
-                                sslEngine.setEnabledProtocols(new String[]{protocolVersion});
-                            }
+                    (endpoint, sslEngine) -> {
+                        if (protocolVersion != null) {
+                            sslEngine.setEnabledProtocols(new String[]{protocolVersion});
                         }
-
                     },
                     null);
         }
@@ -197,15 +186,10 @@
                             .loadTrustMaterial(keyStoreURL, storePassword.toCharArray())
                             .setSecureRandom(new SecureRandom())
                             .build(),
-                    new SSLSessionInitializer() {
-
-                        @Override
-                        public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                            if (protocolVersion != null) {
-                                sslEngine.setEnabledProtocols(new String[]{protocolVersion});
-                            }
+                    (endpoint, sslEngine) -> {
+                        if (protocolVersion != null) {
+                            sslEngine.setEnabledProtocols(new String[]{protocolVersion});
                         }
-
                     },
                     null);
         }
@@ -230,14 +214,7 @@
 
     @Test
     public void testSimpleGet() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -261,14 +238,7 @@
 
     @Test
     public void testSimpleGetConnectionClose() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final InetSocketAddress serverEndpoint = server.start();
 
         client.start();
@@ -295,14 +265,7 @@
 
     @Test
     public void testSimpleGetIdentityTransfer() throws Exception {
-        server.register("/hello", new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new SingleLineResponseHandler("Hi there");
-            }
-
-        });
+        server.register("/hello", () -> new SingleLineResponseHandler("Hi there"));
         final HttpProcessor httpProcessor = new DefaultHttpProcessor(new RequestValidateHost());
         final InetSocketAddress serverEndpoint = server.start(httpProcessor, Http1Config.DEFAULT);
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/reactive/ReactiveClientTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/reactive/ReactiveClientTest.java
index 20603d8..ac1e7c1 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/reactive/ReactiveClientTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/reactive/ReactiveClientTest.java
@@ -45,7 +45,6 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.HttpStreamResetException;
 import org.apache.hc.core5.http.Message;
@@ -53,7 +52,6 @@
 import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
-import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
 import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
 import org.apache.hc.core5.http2.impl.nio.bootstrap.H2RequesterBootstrap;
@@ -85,8 +83,6 @@
 
 import io.reactivex.Flowable;
 import io.reactivex.Observable;
-import io.reactivex.functions.Action;
-import io.reactivex.functions.Consumer;
 
 @RunWith(Parameterized.class)
 public class ReactiveClientTest {
@@ -130,14 +126,7 @@
                 .setIOSessionDecorator(LoggingIOSessionDecorator.INSTANCE)
                 .setExceptionCallback(LoggingExceptionCallback.INSTANCE)
                 .setIOSessionListener(LoggingIOSessionListener.INSTANCE)
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new ReactiveServerExchangeHandler(new ReactiveEchoProcessor());
-                    }
-
-                })
+                .register("*", () -> new ReactiveServerExchangeHandler(new ReactiveEchoProcessor()))
                 .create();
         }
 
@@ -285,12 +274,7 @@
         final InetSocketAddress address = startClientAndServer();
         final AtomicBoolean requestPublisherWasCancelled = new AtomicBoolean(false);
         final Publisher<ByteBuffer> publisher = Flowable.<ByteBuffer>never()
-            .doOnCancel(new Action() {
-                @Override
-                public void run() {
-                    requestPublisherWasCancelled.set(true);
-                }
-            });
+            .doOnCancel(() -> requestPublisherWasCancelled.set(true));
         final ReactiveEntityProducer producer = new ReactiveEntityProducer(publisher, -1, null, null);
         final BasicRequestProducer request = getRequestProducer(address, producer);
 
@@ -320,18 +304,8 @@
         final AtomicBoolean requestPublisherWasCancelled = new AtomicBoolean(false);
         final AtomicReference<Throwable> requestStreamError = new AtomicReference<>();
         final Publisher<ByteBuffer> stream = ReactiveTestUtils.produceStream(Long.MAX_VALUE, 1024, null)
-            .doOnCancel(new Action() {
-                @Override
-                public void run() throws Exception {
-                    requestPublisherWasCancelled.set(true);
-                }
-            })
-            .doOnError(new Consumer<Throwable>() {
-                @Override
-                public void accept(final Throwable throwable) throws Exception {
-                    requestStreamError.set(throwable);
-                }
-            });
+            .doOnCancel(() -> requestPublisherWasCancelled.set(true))
+            .doOnError(requestStreamError::set);
         final ReactiveEntityProducer producer = new ReactiveEntityProducer(stream, -1, null, null);
         final BasicRequestProducer request = getRequestProducer(address, producer);
 
@@ -342,12 +316,7 @@
 
         final AtomicBoolean responsePublisherWasCancelled = new AtomicBoolean(false);
         final List<ByteBuffer> outputBuffers = Flowable.fromPublisher(response.getBody())
-            .doOnCancel(new Action() {
-                @Override
-                public void run() throws Exception {
-                    responsePublisherWasCancelled.set(true);
-                }
-            })
+            .doOnCancel(() -> responsePublisherWasCancelled.set(true))
             .take(3)
             .toList()
             .blockingGet();
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/concurrent/ComplexFuture.java b/httpcore5/src/main/java/org/apache/hc/core5/concurrent/ComplexFuture.java
index 18fa786..e902e0e 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/concurrent/ComplexFuture.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/concurrent/ComplexFuture.java
@@ -63,14 +63,7 @@
         if (dependency instanceof Cancellable) {
             setDependency((Cancellable) dependency);
         } else {
-            setDependency(new Cancellable() {
-
-                @Override
-                public boolean cancel() {
-                    return dependency.cancel(true);
-                }
-
-            });
+            setDependency(() -> dependency.cancel(true));
         }
     }
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
index 604c9e2..44810d9 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
@@ -218,7 +218,7 @@
                         defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
                         timeToLive,
                         poolReusePolicy,
-                        new DefaultDisposalCallback<IOSession>(),
+                        new DefaultDisposalCallback<>(),
                         connPoolListener);
                 break;
             case STRICT:
@@ -228,7 +228,7 @@
                         maxTotal > 0 ? maxTotal : 50,
                         timeToLive,
                         poolReusePolicy,
-                        new DefaultDisposalCallback<IOSession>(),
+                        new DefaultDisposalCallback<>(),
                         connPoolListener);
                 break;
         }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncServerBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncServerBootstrap.java
index c5041bb..640cab8 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncServerBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncServerBootstrap.java
@@ -246,14 +246,7 @@
     public final <T> AsyncServerBootstrap register(
             final String uriPattern,
             final AsyncServerRequestHandler<T> requestHandler) {
-        register(uriPattern, new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new BasicServerExchangeHandler<>(requestHandler);
-            }
-
-        });
+        register(uriPattern, () -> new BasicServerExchangeHandler<>(requestHandler));
         return this;
     }
 
@@ -269,14 +262,7 @@
             final String hostname,
             final String uriPattern,
             final AsyncServerRequestHandler<T> requestHandler) {
-        registerVirtual(hostname, uriPattern, new Supplier<AsyncServerExchangeHandler>() {
-
-            @Override
-            public AsyncServerExchangeHandler get() {
-                return new BasicServerExchangeHandler<>(requestHandler);
-            }
-
-        });
+        registerVirtual(hostname, uriPattern, () -> new BasicServerExchangeHandler<>(requestHandler));
         return this;
     }
 
@@ -335,15 +321,8 @@
     public HttpAsyncServer create() {
         final RequestHandlerRegistry<Supplier<AsyncServerExchangeHandler>> registry = new RequestHandlerRegistry<>(
                 canonicalHostName != null ? canonicalHostName : InetAddressUtils.getCanonicalLocalHostName(),
-                new Supplier<LookupRegistry<Supplier<AsyncServerExchangeHandler>>>() {
-
-                    @Override
-                    public LookupRegistry<Supplier<AsyncServerExchangeHandler>> get() {
-                        return lookupRegistry != null ? lookupRegistry :
-                                UriPatternType.<Supplier<AsyncServerExchangeHandler>>newMatcher(UriPatternType.URI_PATTERN);
-                    }
-
-                });
+                () -> lookupRegistry != null ? lookupRegistry :
+                        UriPatternType.<Supplier<AsyncServerExchangeHandler>>newMatcher(UriPatternType.URI_PATTERN));
         for (final HandlerEntry<Supplier<AsyncServerExchangeHandler>> entry: handlerList) {
             registry.register(entry.hostname, entry.uriPattern, entry.handler);
         }
@@ -389,14 +368,7 @@
 
             handlerFactory = new AsyncServerFilterChainExchangeHandlerFactory(execChain, exceptionCallback);
         } else {
-            handlerFactory = new DefaultAsyncResponseExchangeHandlerFactory(registry, new Decorator<AsyncServerExchangeHandler>() {
-
-                @Override
-                public AsyncServerExchangeHandler decorate(final AsyncServerExchangeHandler handler) {
-                    return new BasicAsyncServerExpectationDecorator(handler, exceptionCallback);
-                }
-
-            });
+            handlerFactory = new DefaultAsyncResponseExchangeHandlerFactory(registry, handler -> new BasicAsyncServerExpectationDecorator(handler, exceptionCallback));
         }
 
         final ServerHttp1StreamDuplexerFactory streamHandlerFactory = new ServerHttp1StreamDuplexerFactory(
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
index 32f8807..6ebe715 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
@@ -47,7 +47,6 @@
 import org.apache.hc.core5.http.HttpConnection;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http.impl.DefaultAddressResolver;
@@ -255,104 +254,97 @@
         Args.notNull(timeout, "Timeout");
         Args.notNull(executeContext, "Context");
         try {
-            exchangeHandler.produceRequest(new RequestChannel() {
-
-                @Override
-                public void sendRequest(
-                        final HttpRequest request,
-                        final EntityDetails entityDetails, final HttpContext requestContext) throws HttpException, IOException {
-                    final String scheme = request.getScheme();
-                    final URIAuthority authority = request.getAuthority();
-                    if (authority == null) {
-                        throw new ProtocolException("Request authority not specified");
-                    }
-                    final HttpHost target = new HttpHost(scheme, authority);
-                    connect(target, timeout, null, new FutureCallback<AsyncClientEndpoint>() {
-
-                        @Override
-                        public void completed(final AsyncClientEndpoint endpoint) {
-                            endpoint.execute(new AsyncClientExchangeHandler() {
-
-                                @Override
-                                public void releaseResources() {
-                                    endpoint.releaseAndDiscard();
-                                    exchangeHandler.releaseResources();
-                                }
-
-                                @Override
-                                public void failed(final Exception cause) {
-                                    endpoint.releaseAndDiscard();
-                                    exchangeHandler.failed(cause);
-                                }
-
-                                @Override
-                                public void cancel() {
-                                    endpoint.releaseAndDiscard();
-                                    exchangeHandler.cancel();
-                                }
-
-                                @Override
-                                public void produceRequest(final RequestChannel channel, final HttpContext httpContext) throws HttpException, IOException {
-                                    channel.sendRequest(request, entityDetails, httpContext);
-                                }
-
-                                @Override
-                                public int available() {
-                                    return exchangeHandler.available();
-                                }
-
-                                @Override
-                                public void produce(final DataStreamChannel channel) throws IOException {
-                                    exchangeHandler.produce(channel);
-                                }
-
-                                @Override
-                                public void consumeInformation(final HttpResponse response, final HttpContext httpContext) throws HttpException, IOException {
-                                    exchangeHandler.consumeInformation(response, httpContext);
-                                }
-
-                                @Override
-                                public void consumeResponse(
-                                        final HttpResponse response, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
-                                    if (entityDetails == null) {
-                                        endpoint.releaseAndReuse();
-                                    }
-                                    exchangeHandler.consumeResponse(response, entityDetails, httpContext);
-                                }
-
-                                @Override
-                                public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                                    exchangeHandler.updateCapacity(capacityChannel);
-                                }
-
-                                @Override
-                                public void consume(final ByteBuffer src) throws IOException {
-                                    exchangeHandler.consume(src);
-                                }
-
-                                @Override
-                                public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
-                                    endpoint.releaseAndReuse();
-                                    exchangeHandler.streamEnd(trailers);
-                                }
-
-                            }, pushHandlerFactory, executeContext);
-
-                        }
-
-                        @Override
-                        public void failed(final Exception ex) {
-                            exchangeHandler.failed(ex);
-                        }
-
-                        @Override
-                        public void cancelled() {
-                            exchangeHandler.cancel();
-                        }
-
-                    });
-
+            exchangeHandler.produceRequest((request, entityDetails, requestContext) -> {
+                final String scheme = request.getScheme();
+                final URIAuthority authority = request.getAuthority();
+                if (authority == null) {
+                    throw new ProtocolException("Request authority not specified");
                 }
+                final HttpHost target = new HttpHost(scheme, authority);
+                connect(target, timeout, null, new FutureCallback<AsyncClientEndpoint>() {
+
+                    @Override
+                    public void completed(final AsyncClientEndpoint endpoint) {
+                        endpoint.execute(new AsyncClientExchangeHandler() {
+
+                            @Override
+                            public void releaseResources() {
+                                endpoint.releaseAndDiscard();
+                                exchangeHandler.releaseResources();
+                            }
+
+                            @Override
+                            public void failed(final Exception cause) {
+                                endpoint.releaseAndDiscard();
+                                exchangeHandler.failed(cause);
+                            }
+
+                            @Override
+                            public void cancel() {
+                                endpoint.releaseAndDiscard();
+                                exchangeHandler.cancel();
+                            }
+
+                            @Override
+                            public void produceRequest(final RequestChannel channel, final HttpContext httpContext) throws HttpException, IOException {
+                                channel.sendRequest(request, entityDetails, httpContext);
+                            }
+
+                            @Override
+                            public int available() {
+                                return exchangeHandler.available();
+                            }
+
+                            @Override
+                            public void produce(final DataStreamChannel channel) throws IOException {
+                                exchangeHandler.produce(channel);
+                            }
+
+                            @Override
+                            public void consumeInformation(final HttpResponse response, final HttpContext httpContext) throws HttpException, IOException {
+                                exchangeHandler.consumeInformation(response, httpContext);
+                            }
+
+                            @Override
+                            public void consumeResponse(
+                                    final HttpResponse response, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
+                                if (entityDetails == null) {
+                                    endpoint.releaseAndReuse();
+                                }
+                                exchangeHandler.consumeResponse(response, entityDetails, httpContext);
+                            }
+
+                            @Override
+                            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                                exchangeHandler.updateCapacity(capacityChannel);
+                            }
+
+                            @Override
+                            public void consume(final ByteBuffer src) throws IOException {
+                                exchangeHandler.consume(src);
+                            }
+
+                            @Override
+                            public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
+                                endpoint.releaseAndReuse();
+                                exchangeHandler.streamEnd(trailers);
+                            }
+
+                        }, pushHandlerFactory, executeContext);
+
+                    }
+
+                    @Override
+                    public void failed(final Exception ex) {
+                        exchangeHandler.failed(ex);
+                    }
+
+                    @Override
+                    public void cancelled() {
+                        exchangeHandler.cancel();
+                    }
+
+                });
 
             }, executeContext);
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
index f618c4e..957509c 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
@@ -268,12 +268,9 @@
         // Run this under a doPrivileged to support lib users that run under a SecurityManager this allows granting connect permissions
         // only to this library
         try {
-            AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
-                @Override
-                public Object run() throws IOException {
-                    sock.connect(targetAddress, socketConfig.getSoTimeout().toMillisecondsIntBound());
-                    return null;
-                }
+            AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
+                sock.connect(targetAddress, socketConfig.getSoTimeout().toMillisecondsIntBound());
+                return null;
             });
         } catch (final PrivilegedActionException e) {
             Asserts.check(e.getCause() instanceof  IOException,
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpServer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpServer.java
index dbbcc67..0e293b7 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpServer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpServer.java
@@ -106,12 +106,12 @@
         this.exceptionListener = exceptionListener != null ? exceptionListener : ExceptionListener.NO_OP;
         this.listenerExecutorService = new ThreadPoolExecutor(
                 1, 1, 0L, TimeUnit.MILLISECONDS,
-                new SynchronousQueue<Runnable>(),
+                new SynchronousQueue<>(),
                 new DefaultThreadFactory("HTTP-listener-" + this.port));
         this.workerThreads = new ThreadGroup("HTTP-workers");
         this.workerExecutorService = new WorkerPoolExecutor(
                 0, Integer.MAX_VALUE, 1L, TimeUnit.SECONDS,
-                new SynchronousQueue<Runnable>(),
+                new SynchronousQueue<>(),
                 new DefaultThreadFactory("HTTP-worker", this.workerThreads, true));
         this.status = new AtomicReference<>(Status.READY);
     }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
index fd9268b..15791af 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
@@ -189,7 +189,7 @@
                         defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
                         timeToLive,
                         poolReusePolicy,
-                        new DefaultDisposalCallback<HttpClientConnection>(),
+                        new DefaultDisposalCallback<>(),
                         connPoolListener);
                 break;
             case STRICT:
@@ -199,7 +199,7 @@
                         maxTotal > 0 ? maxTotal : 50,
                         timeToLive,
                         poolReusePolicy,
-                        new DefaultDisposalCallback<HttpClientConnection>(),
+                        new DefaultDisposalCallback<>(),
                         connPoolListener);
                 break;
         }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/ServerBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/ServerBootstrap.java
index 8e445c0..9711772 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/ServerBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/ServerBootstrap.java
@@ -36,7 +36,6 @@
 import javax.net.ssl.SSLServerSocketFactory;
 
 import org.apache.hc.core5.function.Callback;
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ConnectionReuseStrategy;
 import org.apache.hc.core5.http.ExceptionListener;
@@ -325,15 +324,8 @@
     public HttpServer create() {
         final RequestHandlerRegistry<HttpRequestHandler> handlerRegistry = new RequestHandlerRegistry<>(
                 canonicalHostName != null ? canonicalHostName : InetAddressUtils.getCanonicalLocalHostName(),
-                new Supplier<LookupRegistry<HttpRequestHandler>>() {
-
-                    @Override
-                    public LookupRegistry<HttpRequestHandler> get() {
-                        return lookupRegistry != null ? lookupRegistry :
-                                UriPatternType.<HttpRequestHandler>newMatcher(UriPatternType.URI_PATTERN);
-                    }
-
-                });
+                () -> lookupRegistry != null ? lookupRegistry :
+                        UriPatternType.<HttpRequestHandler>newMatcher(UriPatternType.URI_PATTERN));
         for (final HandlerEntry<HttpRequestHandler> entry: handlerList) {
             handlerRegistry.register(entry.hostname, entry.uriPattern, entry.handler);
         }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1StreamHandler.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1StreamHandler.java
index 1721b04..0a5a15b 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1StreamHandler.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1StreamHandler.java
@@ -49,9 +49,7 @@
 import org.apache.hc.core5.http.nio.AsyncClientExchangeHandler;
 import org.apache.hc.core5.http.nio.CapacityChannel;
 import org.apache.hc.core5.http.nio.DataStreamChannel;
-import org.apache.hc.core5.http.nio.RequestChannel;
 import org.apache.hc.core5.http.nio.ResourceHolder;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.apache.hc.core5.util.Timeout;
@@ -182,15 +180,7 @@
         switch (requestState) {
             case IDLE:
                 requestState = MessageState.HEADERS;
-                exchangeHandler.produceRequest(new RequestChannel() {
-
-                    @Override
-                    public void sendRequest(
-                            final HttpRequest request, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException {
-                        commitRequest(request, entityDetails);
-                    }
-
-                }, context);
+                exchangeHandler.produceRequest((request, entityDetails, httpContext) -> commitRequest(request, entityDetails), context);
                 break;
             case ACK:
                 outputChannel.suspendOutput();
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/io/entity/HttpEntities.java b/httpcore5/src/main/java/org/apache/hc/core5/http/io/entity/HttpEntities.java
index 6331733..bcdbb98 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/io/entity/HttpEntities.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/io/entity/HttpEntities.java
@@ -174,14 +174,7 @@
 
             @Override
             public Supplier<List<? extends Header>> getTrailers() {
-                return new Supplier<List<? extends Header>>() {
-
-                    @Override
-                    public List<? extends Header> get() {
-                        return Arrays.asList(trailers);
-                    }
-
-                };
+                return () -> Arrays.asList(trailers);
             }
 
             @Override
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/HttpServerFilterChainElement.java b/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/HttpServerFilterChainElement.java
index 939c468..d9e116e 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/HttpServerFilterChainElement.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/HttpServerFilterChainElement.java
@@ -49,16 +49,7 @@
     public HttpServerFilterChainElement(final HttpFilterHandler handler, final HttpServerFilterChainElement next) {
         this.handler = handler;
         this.next = next;
-        this.filterChain = new HttpFilterChain() {
-
-            @Override
-            public void proceed(
-                    final ClassicHttpRequest request,
-                    final ResponseTrigger responseTrigger,
-                    final HttpContext context) throws HttpException, IOException {
-                next.handle(request, responseTrigger, context);
-            }
-        };
+        this.filterChain = next != null ? next::handle : null;
     }
 
     public void handle(
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/command/ShutdownCommand.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/command/ShutdownCommand.java
index 7a3a150..fcbf619 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/command/ShutdownCommand.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/command/ShutdownCommand.java
@@ -48,14 +48,7 @@
     public static final Callback<IOSession> GRACEFUL_NORMAL_CALLBACK = createIOSessionCallback(Priority.NORMAL);
 
     private static Callback<IOSession> createIOSessionCallback(final Priority priority) {
-        return new Callback<IOSession>() {
-
-            @Override
-            public void execute(final IOSession session) {
-                session.enqueue(ShutdownCommand.GRACEFUL, priority);
-            }
-
-        };
+        return session -> session.enqueue(ShutdownCommand.GRACEFUL, priority);
     }
 
     private final CloseMode type;
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/DiscardingEntityConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/DiscardingEntityConsumer.java
new file mode 100644
index 0000000..97746c3
--- /dev/null
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/DiscardingEntityConsumer.java
@@ -0,0 +1,88 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.hc.core5.http.nio.entity;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import org.apache.hc.core5.concurrent.FutureCallback;
+import org.apache.hc.core5.http.EntityDetails;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.nio.AsyncEntityConsumer;
+import org.apache.hc.core5.http.nio.CapacityChannel;
+
+/**
+ * No-op {@link AsyncEntityConsumer} that discards all data from the data stream.
+ *
+ * @since 5.2
+ */
+public final class DiscardingEntityConsumer<T> implements AsyncEntityConsumer<T> {
+
+    private volatile FutureCallback<T> resultCallback;
+
+    @Override
+    public void streamStart(
+            final EntityDetails entityDetails,
+            final FutureCallback<T> resultCallback) throws IOException, HttpException {
+        this.resultCallback = resultCallback;
+    }
+
+    @Override
+    public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+        capacityChannel.update(Integer.MAX_VALUE);
+    }
+
+    @Override
+    public void consume(final ByteBuffer src) throws IOException {
+    }
+
+    @Override
+    public void streamEnd(final List<? extends Header> trailers) throws IOException {
+        if (resultCallback != null) {
+            resultCallback.completed(null);
+        }
+    }
+
+    @Override
+    public void failed(final Exception cause) {
+        if (resultCallback != null) {
+            resultCallback.failed(cause);
+        }
+    }
+
+    @Override
+    public T getContent() {
+        return null;
+    }
+
+    @Override
+    public void releaseResources() {
+    }
+
+}
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/NoopEntityConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/NoopEntityConsumer.java
index d3132f9..554ba5b 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/NoopEntityConsumer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/entity/NoopEntityConsumer.java
@@ -41,7 +41,10 @@
  * No-op {@link AsyncEntityConsumer} that discards all data from the data stream.
  *
  * @since 5.0
+ *
+ * @deprecated Use {@link DiscardingEntityConsumer}
  */
+@Deprecated
 public final class NoopEntityConsumer implements AsyncEntityConsumer<Void> {
 
     private volatile FutureCallback<Void> resultCallback;
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/ssl/TlsSupport.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/ssl/TlsSupport.java
index 89fddf8..779f695 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/ssl/TlsSupport.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/ssl/TlsSupport.java
@@ -27,12 +27,10 @@
 
 package org.apache.hc.core5.http.nio.ssl;
 
-import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
 
 import org.apache.hc.core5.http.ssl.TLS;
 import org.apache.hc.core5.http.ssl.TlsCiphers;
-import org.apache.hc.core5.net.NamedEndpoint;
 import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
 
 /**
@@ -43,19 +41,14 @@
 public final class TlsSupport {
 
     public static SSLSessionInitializer enforceStrongSecurity(final SSLSessionInitializer initializer) {
-        return new SSLSessionInitializer() {
-
-            @Override
-            public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {
-                final SSLParameters sslParameters = sslEngine.getSSLParameters();
-                sslParameters.setProtocols(TLS.excludeWeak(sslParameters.getProtocols()));
-                sslParameters.setCipherSuites(TlsCiphers.excludeWeak(sslParameters.getCipherSuites()));
-                sslEngine.setSSLParameters(sslParameters);
-                if (initializer != null) {
-                    initializer.initialize(endpoint, sslEngine);
-                }
+        return (endpoint, sslEngine) -> {
+            final SSLParameters sslParameters = sslEngine.getSSLParameters();
+            sslParameters.setProtocols(TLS.excludeWeak(sslParameters.getProtocols()));
+            sslParameters.setCipherSuites(TlsCiphers.excludeWeak(sslParameters.getCipherSuites()));
+            sslEngine.setSSLParameters(sslParameters);
+            if (initializer != null) {
+                initializer.initialize(endpoint, sslEngine);
             }
-
         };
     }
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncRequesterConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncRequesterConsumer.java
index 02447ca..c5caa92 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncRequesterConsumer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncRequesterConsumer.java
@@ -66,14 +66,7 @@
     }
 
     public AbstractAsyncRequesterConsumer(final AsyncEntityConsumer<E> dataConsumer) {
-        this(new Supplier<AsyncEntityConsumer<E>>() {
-
-            @Override
-            public AsyncEntityConsumer<E> get() {
-                return dataConsumer;
-            }
-
-        });
+        this(() -> dataConsumer);
     }
 
     /**
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncResponseConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncResponseConsumer.java
index 168620c..c4a0644 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncResponseConsumer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AbstractAsyncResponseConsumer.java
@@ -66,14 +66,7 @@
     }
 
     public AbstractAsyncResponseConsumer(final AsyncEntityConsumer<E> dataConsumer) {
-        this(new Supplier<AsyncEntityConsumer<E>>() {
-
-            @Override
-            public AsyncEntityConsumer<E> get() {
-                return dataConsumer;
-            }
-
-        });
+        this(() -> dataConsumer);
     }
 
     /**
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncServerFilterChainElement.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncServerFilterChainElement.java
index 3e64c5e..5b7d2f2 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncServerFilterChainElement.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncServerFilterChainElement.java
@@ -51,18 +51,7 @@
     public AsyncServerFilterChainElement(final AsyncFilterHandler handler, final AsyncServerFilterChainElement next) {
         this.handler = handler;
         this.next = next;
-        this.filterChain = new AsyncFilterChain() {
-
-            @Override
-            public AsyncDataConsumer proceed(
-                    final HttpRequest request,
-                    final EntityDetails entityDetails,
-                    final HttpContext context,
-                    final ResponseTrigger responseTrigger) throws HttpException, IOException {
-                return next.handle(request, entityDetails, context, responseTrigger);
-            }
-
-        };
+        this.filterChain = next != null ? next::handle : null;
     }
 
     public AsyncDataConsumer handle(
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicRequestConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicRequestConsumer.java
index 6eaf64c..8802b60 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicRequestConsumer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicRequestConsumer.java
@@ -62,14 +62,7 @@
     }
 
     public BasicRequestConsumer(final AsyncEntityConsumer<T> dataConsumer) {
-        this(new Supplier<AsyncEntityConsumer<T>>() {
-
-            @Override
-            public AsyncEntityConsumer<T> get() {
-                return dataConsumer;
-            }
-
-        });
+        this(() -> dataConsumer);
     }
 
     @Override
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicResponseConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicResponseConsumer.java
index c9d48fa..70fc73e 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicResponseConsumer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/BasicResponseConsumer.java
@@ -63,14 +63,7 @@
     }
 
     public BasicResponseConsumer(final AsyncEntityConsumer<T> dataConsumer) {
-        this(new Supplier<AsyncEntityConsumer<T>>() {
-
-            @Override
-            public AsyncEntityConsumer<T> get() {
-                return dataConsumer;
-            }
-
-        });
+        this(() -> dataConsumer);
     }
 
     @Override
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityConsumer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityConsumer.java
index 202293c..4cee5ac 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityConsumer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityConsumer.java
@@ -94,22 +94,17 @@
             throw new UnsupportedEncodingException(ex.getMessage());
         }
         if (state.compareAndSet(State.IDLE, State.ACTIVE)) {
-            executor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    try {
-                        final T result = consumeData(contentType, new ContentInputStream(buffer));
-                        resultRef.set(result);
-                        resultCallback.completed(result);
-                    } catch (final Exception ex) {
-                        buffer.abort();
-                        resultCallback.failed(ex);
-                    } finally {
-                        state.set(State.COMPLETED);
-                    }
+            executor.execute(() -> {
+                try {
+                    final T result = consumeData(contentType, new ContentInputStream(buffer));
+                    resultRef.set(result);
+                    resultCallback.completed(result);
+                } catch (final Exception ex) {
+                    buffer.abort();
+                    resultCallback.failed(ex);
+                } finally {
+                    state.set(State.COMPLETED);
                 }
-
             });
         }
     }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityProducer.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityProducer.java
index f9d320a..28ae2b3 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityProducer.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicEntityProducer.java
@@ -83,20 +83,15 @@
     @Override
     public final void produce(final DataStreamChannel channel) throws IOException {
         if (state.compareAndSet(State.IDLE, State.ACTIVE)) {
-            executor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    try {
-                        produceData(contentType, new ContentOutputStream(buffer));
-                        buffer.writeCompleted();
-                    } catch (final Exception ex) {
-                        buffer.abort();
-                    } finally {
-                        state.set(State.COMPLETED);
-                    }
+            executor.execute(() -> {
+                try {
+                    produceData(contentType, new ContentOutputStream(buffer));
+                    buffer.writeCompleted();
+                } catch (final Exception ex) {
+                    buffer.abort();
+                } finally {
+                    state.set(State.COMPLETED);
                 }
-
             });
         }
         buffer.flush(channel);
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicServerExchangeHandler.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicServerExchangeHandler.java
index 549a110..1b18de0 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicServerExchangeHandler.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/classic/AbstractClassicServerExchangeHandler.java
@@ -232,25 +232,20 @@
         };
 
         if (state.compareAndSet(State.IDLE, State.ACTIVE)) {
-            executor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    try {
-                        handle(request, inputStream, responseWrapper, outputStream, context);
-                        Closer.close(inputStream);
-                        outputStream.close();
-                    } catch (final Exception ex) {
-                        exception.compareAndSet(null, ex);
-                        if (inputBuffer != null) {
-                            inputBuffer.abort();
-                        }
-                        outputBuffer.abort();
-                    } finally {
-                        state.set(State.COMPLETED);
+            executor.execute(() -> {
+                try {
+                    handle(request, inputStream, responseWrapper, outputStream, context);
+                    Closer.close(inputStream);
+                    outputStream.close();
+                } catch (final Exception ex) {
+                    exception.compareAndSet(null, ex);
+                    if (inputBuffer != null) {
+                        inputBuffer.abort();
                     }
+                    outputBuffer.abort();
+                } finally {
+                    state.set(State.COMPLETED);
                 }
-
             });
         }
     }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/protocol/RequestHandlerRegistry.java b/httpcore5/src/main/java/org/apache/hc/core5/http/protocol/RequestHandlerRegistry.java
index 581d87a..8262898 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/protocol/RequestHandlerRegistry.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/protocol/RequestHandlerRegistry.java
@@ -60,27 +60,13 @@
 
     public RequestHandlerRegistry(final String canonicalHostName, final Supplier<LookupRegistry<T>> registrySupplier) {
         this.canonicalHostName = Args.notNull(canonicalHostName, "Canonical hostname").toLowerCase(Locale.ROOT);
-        this.registrySupplier = registrySupplier != null ? registrySupplier : new Supplier<LookupRegistry<T>>() {
-
-            @Override
-            public LookupRegistry<T> get() {
-                return new UriPatternMatcher<>();
-            }
-
-        };
+        this.registrySupplier = registrySupplier != null ? registrySupplier : UriPatternMatcher::new;
         this.primary = this.registrySupplier.get();
         this.virtualMap = new ConcurrentHashMap<>();
     }
 
     public RequestHandlerRegistry(final String canonicalHostName, final UriPatternType patternType) {
-        this(canonicalHostName, new Supplier<LookupRegistry<T>>() {
-
-            @Override
-            public LookupRegistry<T> get() {
-                return UriPatternType.newMatcher(patternType);
-            }
-
-        });
+        this(canonicalHostName, () -> UriPatternType.newMatcher(patternType));
     }
 
     public RequestHandlerRegistry(final UriPatternType patternType) {
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java b/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java
index 929063c..bdb6c23 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java
@@ -36,7 +36,6 @@
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Stack;
@@ -702,12 +701,7 @@
             this.queryParams = new ArrayList<>();
         }
         if (!this.queryParams.isEmpty()) {
-            for (final Iterator<NameValuePair> it = this.queryParams.iterator(); it.hasNext(); ) {
-                final NameValuePair nvp = it.next();
-                if (nvp.getName().equals(param)) {
-                    it.remove();
-                }
-            }
+            this.queryParams.removeIf(nvp -> nvp.getName().equals(param));
         }
         this.queryParams.add(new BasicNameValuePair(param, value));
         this.encodedQuery = null;
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
index 26b56e6..ed735cf 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
@@ -264,30 +264,20 @@
     @Override
     public void closeIdle(final TimeValue idleTime) {
         final long deadline = System.currentTimeMillis() - (TimeValue.isPositive(idleTime) ? idleTime.toMilliseconds() : 0);
-        enumAvailable(new Callback<PoolEntry<T, C>>() {
-
-            @Override
-            public void execute(final PoolEntry<T, C> entry) {
-                if (entry.getUpdated() <= deadline) {
-                    entry.discardConnection(CloseMode.GRACEFUL);
-                }
+        enumAvailable(entry -> {
+            if (entry.getUpdated() <= deadline) {
+                entry.discardConnection(CloseMode.GRACEFUL);
             }
-
         });
     }
 
     @Override
     public void closeExpired() {
         final long now = System.currentTimeMillis();
-        enumAvailable(new Callback<PoolEntry<T, C>>() {
-
-            @Override
-            public void execute(final PoolEntry<T, C> entry) {
-                if (entry.getExpiryDeadline().isBefore(now)) {
-                    entry.discardConnection(CloseMode.GRACEFUL);
-                }
+        enumAvailable(entry -> {
+            if (entry.getExpiryDeadline().isBefore(now)) {
+                entry.discardConnection(CloseMode.GRACEFUL);
             }
-
         });
     }
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java
index a222bd8..23dd415 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java
@@ -604,30 +604,20 @@
     @Override
     public void closeIdle(final TimeValue idleTime) {
         final long deadline = System.currentTimeMillis() - (TimeValue.isPositive(idleTime) ? idleTime.toMilliseconds() : 0);
-        enumAvailable(new Callback<PoolEntry<T, C>>() {
-
-            @Override
-            public void execute(final PoolEntry<T, C> entry) {
-                if (entry.getUpdated() <= deadline) {
-                    entry.discardConnection(CloseMode.GRACEFUL);
-                }
+        enumAvailable(entry -> {
+            if (entry.getUpdated() <= deadline) {
+                entry.discardConnection(CloseMode.GRACEFUL);
             }
-
         });
     }
 
     @Override
     public void closeExpired() {
         final long now = System.currentTimeMillis();
-        enumAvailable(new Callback<PoolEntry<T, C>>() {
-
-            @Override
-            public void execute(final PoolEntry<T, C> entry) {
-                if (entry.getExpiryDeadline().isBefore(now)) {
-                    entry.discardConnection(CloseMode.GRACEFUL);
-                }
+        enumAvailable(entry -> {
+            if (entry.getExpiryDeadline().isBefore(now)) {
+                entry.discardConnection(CloseMode.GRACEFUL);
             }
-
         });
     }
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/AbstractIOSessionPool.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/AbstractIOSessionPool.java
index cce68d3..2bc396a 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/AbstractIOSessionPool.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/AbstractIOSessionPool.java
@@ -133,25 +133,20 @@
 
             @Override
             public void completed(final IOSession ioSession) {
-                validateSession(ioSession, new Callback<Boolean>() {
+                validateSession(ioSession, result -> {
+                    if (result) {
+                        future.completed(ioSession);
+                    } else {
+                        getSessionInternal(poolEntry, true, endpoint, connectTimeout,
+                            new FutureContribution<IOSession>(future) {
 
-                    @Override
-                    public void execute(final Boolean result) {
-                        if (result) {
-                            future.completed(ioSession);
-                        } else {
-                            getSessionInternal(poolEntry, true, endpoint, connectTimeout,
-                                new FutureContribution<IOSession>(future) {
+                            @Override
+                            public void completed(final IOSession ioSession1) {
+                                future.completed(ioSession1);
+                            }
 
-                                @Override
-                                public void completed(final IOSession ioSession) {
-                                    future.completed(ioSession);
-                                }
-
-                            });
-                        }
+                        });
                     }
-
                 });
             }
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/DefaultListeningIOReactor.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/DefaultListeningIOReactor.java
index b317dfd..944f377 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/DefaultListeningIOReactor.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/DefaultListeningIOReactor.java
@@ -97,14 +97,7 @@
         }
         final IOReactor[] ioReactors = new IOReactor[this.workerCount + 1];
         System.arraycopy(this.workers, 0, ioReactors, 1, this.workerCount);
-        this.listener = new SingleCoreListeningIOReactor(exceptionCallback, ioReactorConfig, new Callback<ChannelEntry>() {
-
-            @Override
-            public void execute(final ChannelEntry entry) {
-                enqueueChannel(entry);
-            }
-
-        });
+        this.listener = new SingleCoreListeningIOReactor(exceptionCallback, ioReactorConfig, this::enqueueChannel);
         ioReactors[0] = this.listener;
         threads[0] = (listenerThreadFactory != null ? listenerThreadFactory : LISTENER_THREAD_FACTORY).newThread(new IOReactorWorker(listener));
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
index 8b85962..33ed80d 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
@@ -39,7 +39,6 @@
 
 import javax.net.ssl.SSLContext;
 
-import org.apache.hc.core5.function.Callback;
 import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.net.NamedEndpoint;
@@ -177,7 +176,7 @@
         }
     }
 
-    void onTLSSessionEnd() {
+    void onTLSSessionEnd(final SSLIOSession sslSession) {
         if (closed.compareAndSet(false, true)) {
             closedSessions.add(this);
         }
@@ -210,22 +209,8 @@
                 sslBufferMode,
                 initializer,
                 verifier,
-                new Callback<SSLIOSession>() {
-
-                    @Override
-                    public void execute(final SSLIOSession sslSession) {
-                        onTLSSessionStart(sslSession);
-                    }
-
-                },
-                new Callback<SSLIOSession>() {
-
-                    @Override
-                    public void execute(final SSLIOSession sslSession) {
-                        onTLSSessionEnd();
-                    }
-
-                },
+                this::onTLSSessionStart,
+                this::onTLSSessionEnd,
                 handshakeTimeout);
         if (tlsSessionRef.compareAndSet(null, sslioSession)) {
             currentSessionRef.set(ioSessionDecorator != null ? ioSessionDecorator.decorate(sslioSession) : sslioSession);
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/SingleCoreIOReactor.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/SingleCoreIOReactor.java
index 5d731a3..be273d1 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/SingleCoreIOReactor.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/SingleCoreIOReactor.java
@@ -345,12 +345,7 @@
         final boolean connected;
         try {
             connected = AccessController.doPrivileged(
-                        new PrivilegedExceptionAction<Boolean>() {
-                            @Override
-                            public Boolean run() throws IOException {
-                                return socketChannel.connect(targetAddress);
-                            }
-                        });
+                    (PrivilegedExceptionAction<Boolean>) () -> socketChannel.connect(targetAddress));
         } catch (final PrivilegedActionException e) {
             Asserts.check(e.getCause() instanceof  IOException,
                     "method contract violation only checked exceptions are wrapped: " + e.getCause());
@@ -360,26 +355,17 @@
 
 
         final SelectionKey key = socketChannel.register(this.selector, SelectionKey.OP_CONNECT | SelectionKey.OP_READ);
-        final InternalChannel channel = new InternalConnectChannel(key, socketChannel, sessionRequest, new InternalDataChannelFactory() {
-
-            @Override
-            public InternalDataChannel create(
-                    final SelectionKey key,
-                    final SocketChannel socketChannel,
-                    final NamedEndpoint namedEndpoint,
-                    final Object attachment) {
-                final IOSession ioSession = new IOSessionImpl("c", key, socketChannel);
-                final InternalDataChannel dataChannel = new InternalDataChannel(
-                        ioSession,
-                        namedEndpoint,
-                        ioSessionDecorator,
-                        sessionListener,
-                        closedSessions);
-                dataChannel.upgrade(eventHandlerFactory.createHandler(dataChannel, attachment));
-                dataChannel.setSocketTimeout(reactorConfig.getSoTimeout());
-                return dataChannel;
-            }
-
+        final InternalChannel channel = new InternalConnectChannel(key, socketChannel, sessionRequest, (k, sc, namedEndpoint, attachment) -> {
+            final IOSession ioSession = new IOSessionImpl("c", k, sc);
+            final InternalDataChannel dataChannel = new InternalDataChannel(
+                    ioSession,
+                    namedEndpoint,
+                    ioSessionDecorator,
+                    sessionListener,
+                    closedSessions);
+            dataChannel.upgrade(eventHandlerFactory.createHandler(dataChannel, attachment));
+            dataChannel.setSocketTimeout(reactorConfig.getSoTimeout());
+            return dataChannel;
         });
         if (connected) {
             channel.handleIOEvent(SelectionKey.OP_CONNECT);
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/util/ReflectionUtils.java b/httpcore5/src/main/java/org/apache/hc/core5/util/ReflectionUtils.java
index f6eaf85..2c5f72c 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/util/ReflectionUtils.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/util/ReflectionUtils.java
@@ -58,12 +58,9 @@
     }
 
     private static void setAccessible(final Method method) {
-        AccessController.doPrivileged(new PrivilegedAction<Object>() {
-            @Override
-            public Object run() {
-                method.setAccessible(true);
-                return null;
-            }
+        AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
+            method.setAccessible(true);
+            return null;
         });
     }
 
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/concurrent/TestBasicFuture.java b/httpcore5/src/test/java/org/apache/hc/core5/concurrent/TestBasicFuture.java
index 3d837e7..62037f6 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/concurrent/TestBasicFuture.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/concurrent/TestBasicFuture.java
@@ -134,18 +134,13 @@
         final BasicFuture<Object> future = new BasicFuture<>(null);
         final Object result = new Object();
 
-        final Thread t = new Thread() {
-
-            @Override
-            public void run() {
-                try {
-                    Thread.sleep(100);
-                    future.completed(result);
-                } catch (final InterruptedException boom) {
-                }
+        final Thread t = new Thread(() -> {
+            try {
+                Thread.sleep(100);
+                future.completed(result);
+            } catch (final InterruptedException boom) {
             }
-
-        };
+        });
         t.setDaemon(true);
         t.start();
         Assert.assertSame(result, future.get(60, TimeUnit.SECONDS));
@@ -158,18 +153,13 @@
         final BasicFuture<Object> future = new BasicFuture<>(null);
         final Exception boom = new Exception();
 
-        final Thread t = new Thread() {
-
-            @Override
-            public void run() {
-                try {
-                    Thread.sleep(100);
-                    future.failed(boom);
-                } catch (final InterruptedException ex) {
-                }
+        final Thread t = new Thread(() -> {
+            try {
+                Thread.sleep(100);
+                future.failed(boom);
+            } catch (final InterruptedException ex) {
             }
-
-        };
+        });
         t.setDaemon(true);
         t.start();
         try {
@@ -185,18 +175,13 @@
     public void testAsyncCancelled() throws Exception {
         final BasicFuture<Object> future = new BasicFuture<>(null);
 
-        final Thread t = new Thread() {
-
-            @Override
-            public void run() {
-                try {
-                    Thread.sleep(100);
-                    future.cancel(true);
-                } catch (final InterruptedException ex) {
-                }
+        final Thread t = new Thread(() -> {
+            try {
+                Thread.sleep(100);
+                future.cancel(true);
+            } catch (final InterruptedException ex) {
             }
-
-        };
+        });
         t.setDaemon(true);
         t.start();
         future.get(60, TimeUnit.SECONDS);
@@ -207,18 +192,13 @@
         final BasicFuture<Object> future = new BasicFuture<>(null);
         final Object result = new Object();
 
-        final Thread t = new Thread() {
-
-            @Override
-            public void run() {
-                try {
-                    Thread.sleep(200);
-                    future.completed(result);
-                } catch (final InterruptedException ex) {
-                }
+        final Thread t = new Thread(() -> {
+            try {
+                Thread.sleep(200);
+                future.completed(result);
+            } catch (final InterruptedException ex) {
             }
-
-        };
+        });
         t.setDaemon(true);
         t.start();
         future.get(1, TimeUnit.MILLISECONDS);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFileServerExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFileServerExample.java
index 7b658d1..6ada5ce 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFileServerExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFileServerExample.java
@@ -49,7 +49,7 @@
 import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
 import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
 import org.apache.hc.core5.http.nio.entity.AsyncEntityProducers;
-import org.apache.hc.core5.http.nio.entity.NoopEntityConsumer;
+import org.apache.hc.core5.http.nio.entity.DiscardingEntityConsumer;
 import org.apache.hc.core5.http.nio.support.AsyncResponseBuilder;
 import org.apache.hc.core5.http.nio.support.BasicRequestConsumer;
 import org.apache.hc.core5.http.protocol.HttpContext;
@@ -94,7 +94,7 @@
                             final HttpRequest request,
                             final EntityDetails entityDetails,
                             final HttpContext context) throws HttpException {
-                        return new BasicRequestConsumer<>(entityDetails != null ? new NoopEntityConsumer() : null);
+                        return new BasicRequestConsumer<>(entityDetails != null ? new DiscardingEntityConsumer<>() : null);
                     }
 
                     @Override
@@ -160,13 +160,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
+        }));
 
         server.start();
         final Future<ListenerEndpoint> future = server.listen(new InetSocketAddress(port), URIScheme.HTTP);
@@ -175,7 +172,7 @@
         server.awaitShutdown(TimeValue.MAX_VALUE);
     }
 
-    static final void println(final String msg) {
+    static void println(final String msg) {
         System.out.println(HttpDateGenerator.INSTANCE.getCurrentDate() + " | " + msg);
     }
 
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexClientExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexClientExample.java
index b1aa26b..a47a91a 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexClientExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexClientExample.java
@@ -73,18 +73,10 @@
                 .build();
 
         // Create and start requester
+        // Disable 'Expect: Continue' handshake some servers cannot handle well
         final HttpAsyncRequester requester = AsyncRequesterBootstrap.bootstrap()
                 .setIOReactorConfig(ioReactorConfig)
-                .setHttpProcessor(HttpProcessors.customClient(null).addLast(new HttpRequestInterceptor() {
-
-                    // Disable 'Expect: Continue' handshake some servers cannot handle well
-                    @Override
-                    public void process(
-                            final HttpRequest request, final EntityDetails entity, final HttpContext context) throws HttpException, IOException {
-                        request.removeHeaders(HttpHeaders.EXPECT);
-                    }
-
-                }).build())
+                .setHttpProcessor(HttpProcessors.customClient(null).addLast((HttpRequestInterceptor) (request, entity, context) -> request.removeHeaders(HttpHeaders.EXPECT)).build())
                 .setStreamListener(new Http1StreamListener() {
 
                     @Override
@@ -110,13 +102,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final URI requestUri = new URI("http://httpbin.org/post");
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexServerExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexServerExample.java
index 12dd394..0e3a786 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexServerExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncFullDuplexServerExample.java
@@ -34,7 +34,6 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpConnection;
@@ -99,122 +98,112 @@
                     }
 
                 })
-                .register("/echo", new Supplier<AsyncServerExchangeHandler>() {
+                .register("/echo", () -> new AsyncServerExchangeHandler() {
+
+                    ByteBuffer buffer = ByteBuffer.allocate(2048);
+                    CapacityChannel inputCapacityChannel;
+                    DataStreamChannel outputDataChannel;
+                    boolean endStream;
+
+                    private void ensureCapacity(final int chunk) {
+                        if (buffer.remaining() < chunk) {
+                            final ByteBuffer oldBuffer = buffer;
+                            oldBuffer.flip();
+                            buffer = ByteBuffer.allocate(oldBuffer.remaining() + (chunk > 2048 ? chunk : 2048));
+                            buffer.put(oldBuffer);
+                        }
+                    }
 
                     @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new AsyncServerExchangeHandler() {
+                    public void handleRequest(
+                            final HttpRequest request,
+                            final EntityDetails entityDetails,
+                            final ResponseChannel responseChannel,
+                            final HttpContext context) throws HttpException, IOException {
+                        final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_OK);
+                        responseChannel.sendResponse(response, entityDetails, context);
+                    }
 
-                            ByteBuffer buffer = ByteBuffer.allocate(2048);
-                            CapacityChannel inputCapacityChannel;
-                            DataStreamChannel outputDataChannel;
-                            boolean endStream;
-
-                            private void ensureCapacity(final int chunk) {
-                                if (buffer.remaining() < chunk) {
-                                    final ByteBuffer oldBuffer = buffer;
-                                    oldBuffer.flip();
-                                    buffer = ByteBuffer.allocate(oldBuffer.remaining() + (chunk > 2048 ? chunk : 2048));
-                                    buffer.put(oldBuffer);
-                                }
+                    @Override
+                    public void consume(final ByteBuffer src) throws IOException {
+                        if (buffer.position() == 0) {
+                            if (outputDataChannel != null) {
+                                outputDataChannel.write(src);
                             }
-
-                            @Override
-                            public void handleRequest(
-                                    final HttpRequest request,
-                                    final EntityDetails entityDetails,
-                                    final ResponseChannel responseChannel,
-                                    final HttpContext context) throws HttpException, IOException {
-                                final HttpResponse response = new BasicHttpResponse(HttpStatus.SC_OK);
-                                responseChannel.sendResponse(response, entityDetails, context);
+                        }
+                        if (src.hasRemaining()) {
+                            ensureCapacity(src.remaining());
+                            buffer.put(src);
+                            if (outputDataChannel != null) {
+                                outputDataChannel.requestOutput();
                             }
+                        }
+                    }
 
-                            @Override
-                            public void consume(final ByteBuffer src) throws IOException {
-                                if (buffer.position() == 0) {
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.write(src);
-                                    }
-                                }
-                                if (src.hasRemaining()) {
-                                    ensureCapacity(src.remaining());
-                                    buffer.put(src);
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.requestOutput();
-                                    }
-                                }
+                    @Override
+                    public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
+                        if (buffer.hasRemaining()) {
+                            capacityChannel.update(buffer.remaining());
+                            inputCapacityChannel = null;
+                        } else {
+                            inputCapacityChannel = capacityChannel;
+                        }
+                    }
+
+                    @Override
+                    public void streamEnd(final List<? extends Header> trailers) throws IOException {
+                        endStream = true;
+                        if (buffer.position() == 0) {
+                            if (outputDataChannel != null) {
+                                outputDataChannel.endStream();
                             }
-
-                            @Override
-                            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
-                                if (buffer.hasRemaining()) {
-                                    capacityChannel.update(buffer.remaining());
-                                    inputCapacityChannel = null;
-                                } else {
-                                    inputCapacityChannel = capacityChannel;
-                                }
+                        } else {
+                            if (outputDataChannel != null) {
+                                outputDataChannel.requestOutput();
                             }
+                        }
+                    }
 
-                            @Override
-                            public void streamEnd(final List<? extends Header> trailers) throws IOException {
-                                endStream = true;
-                                if (buffer.position() == 0) {
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.endStream();
-                                    }
-                                } else {
-                                    if (outputDataChannel != null) {
-                                        outputDataChannel.requestOutput();
-                                    }
-                                }
-                            }
+                    @Override
+                    public int available() {
+                        return buffer.position();
+                    }
 
-                            @Override
-                            public int available() {
-                                return buffer.position();
-                            }
+                    @Override
+                    public void produce(final DataStreamChannel channel) throws IOException {
+                        outputDataChannel = channel;
+                        buffer.flip();
+                        if (buffer.hasRemaining()) {
+                            channel.write(buffer);
+                        }
+                        buffer.compact();
+                        if (buffer.position() == 0 && endStream) {
+                            channel.endStream();
+                        }
+                        final CapacityChannel capacityChannel = inputCapacityChannel;
+                        if (capacityChannel != null && buffer.hasRemaining()) {
+                            capacityChannel.update(buffer.remaining());
+                        }
+                    }
 
-                            @Override
-                            public void produce(final DataStreamChannel channel) throws IOException {
-                                outputDataChannel = channel;
-                                buffer.flip();
-                                if (buffer.hasRemaining()) {
-                                    channel.write(buffer);
-                                }
-                                buffer.compact();
-                                if (buffer.position() == 0 && endStream) {
-                                    channel.endStream();
-                                }
-                                final CapacityChannel capacityChannel = inputCapacityChannel;
-                                if (capacityChannel != null && buffer.hasRemaining()) {
-                                    capacityChannel.update(buffer.remaining());
-                                }
-                            }
+                    @Override
+                    public void failed(final Exception cause) {
+                        if (!(cause instanceof SocketException)) {
+                            cause.printStackTrace(System.out);
+                        }
+                    }
 
-                            @Override
-                            public void failed(final Exception cause) {
-                                if (!(cause instanceof SocketException)) {
-                                    cause.printStackTrace(System.out);
-                                }
-                            }
-
-                            @Override
-                            public void releaseResources() {
-                            }
-
-                        };
+                    @Override
+                    public void releaseResources() {
                     }
 
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
+        }));
 
         server.start();
         final Future<ListenerEndpoint> future = server.listen(new InetSocketAddress(port), URIScheme.HTTP);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncPipelinedRequestExecutionExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncPipelinedRequestExecutionExample.java
index 6b84b07..5989e75 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncPipelinedRequestExecutionExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncPipelinedRequestExecutionExample.java
@@ -88,13 +88,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final HttpHost target = new HttpHost("httpbin.org");
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncRequestExecutionExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncRequestExecutionExample.java
index 49f41da..30ff900 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncRequestExecutionExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncRequestExecutionExample.java
@@ -85,13 +85,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP requester shutting down");
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP requester shutting down");
+            requester.close(CloseMode.GRACEFUL);
+        }));
         requester.start();
 
         final HttpHost target = new HttpHost("httpbin.org");
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncReverseProxyExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncReverseProxyExample.java
index 5771d97..b0f3288 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncReverseProxyExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncReverseProxyExample.java
@@ -43,7 +43,6 @@
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.hc.core5.concurrent.FutureCallback;
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ConnectionClosedException;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.EntityDetails;
@@ -184,24 +183,14 @@
                     }
 
                 })
-                .register("*", new Supplier<AsyncServerExchangeHandler>() {
-
-                    @Override
-                    public AsyncServerExchangeHandler get() {
-                        return new IncomingExchangeHandler(targetHost, requester);
-                    }
-
-                })
+                .register("*", () -> new IncomingExchangeHandler(targetHost, requester))
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                println("Reverse proxy shutting down");
-                server.close(CloseMode.GRACEFUL);
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            println("Reverse proxy shutting down");
+            server.close(CloseMode.GRACEFUL);
+            requester.close(CloseMode.GRACEFUL);
+        }));
 
         requester.start();
         server.start();
@@ -690,7 +679,7 @@
 
     }
 
-    static final void println(final String msg) {
+    static void println(final String msg) {
         if (!quiet) {
             System.out.println(HttpDateGenerator.INSTANCE.getCurrentDate() + " | " + msg);
         }
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncServerFilterExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncServerFilterExample.java
index 216bbd9..d13c52d 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncServerFilterExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/AsyncServerFilterExample.java
@@ -42,10 +42,8 @@
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncServer;
 import org.apache.hc.core5.http.impl.bootstrap.StandardFilter;
 import org.apache.hc.core5.http.message.BasicHttpResponse;
-import org.apache.hc.core5.http.nio.AsyncDataConsumer;
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
 import org.apache.hc.core5.http.nio.AsyncFilterChain;
-import org.apache.hc.core5.http.nio.AsyncFilterHandler;
 import org.apache.hc.core5.http.nio.AsyncPushProducer;
 import org.apache.hc.core5.http.nio.AsyncRequestConsumer;
 import org.apache.hc.core5.http.nio.AsyncServerRequestHandler;
@@ -112,45 +110,35 @@
 
                 // Add a custom request filter at the beginning of the processing pipeline
 
-                .addFilterFirst("my-filter", new AsyncFilterHandler() {
-
-                    @Override
-                    public AsyncDataConsumer handle(
-                            final HttpRequest request,
-                            final EntityDetails entityDetails,
-                            final HttpContext context,
-                            final AsyncFilterChain.ResponseTrigger responseTrigger,
-                            final AsyncFilterChain chain) throws HttpException, IOException {
-                        if (request.getRequestUri().equals("/back-door")) {
-                            responseTrigger.submitResponse(
-                                    new BasicHttpResponse(HttpStatus.SC_OK),
-                                    AsyncEntityProducers.create("Welcome"));
-                            return null;
-                        }
-                        return chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
-
-                            @Override
-                            public void sendInformation(
-                                    final HttpResponse response) throws HttpException, IOException {
-                                responseTrigger.sendInformation(response);
-                            }
-
-                            @Override
-                            public void submitResponse(
-                                    final HttpResponse response, final AsyncEntityProducer entityProducer) throws HttpException, IOException {
-                                response.addHeader("X-Filter", "My-Filter");
-                                responseTrigger.submitResponse(response, entityProducer);
-                            }
-
-                            @Override
-                            public void pushPromise(
-                                    final HttpRequest promise, final AsyncPushProducer responseProducer) throws HttpException, IOException {
-                                responseTrigger.pushPromise(promise, responseProducer);
-                            }
-
-                        });
+                .addFilterFirst("my-filter", (request, entityDetails, context, responseTrigger, chain) -> {
+                    if (request.getRequestUri().equals("/back-door")) {
+                        responseTrigger.submitResponse(
+                                new BasicHttpResponse(HttpStatus.SC_OK),
+                                AsyncEntityProducers.create("Welcome"));
+                        return null;
                     }
+                    return chain.proceed(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {
 
+                        @Override
+                        public void sendInformation(
+                                final HttpResponse response) throws HttpException, IOException {
+                            responseTrigger.sendInformation(response);
+                        }
+
+                        @Override
+                        public void submitResponse(
+                                final HttpResponse response, final AsyncEntityProducer entityProducer) throws HttpException, IOException {
+                            response.addHeader("X-Filter", "My-Filter");
+                            responseTrigger.submitResponse(response, entityProducer);
+                        }
+
+                        @Override
+                        public void pushPromise(
+                                final HttpRequest promise, final AsyncPushProducer responseProducer) throws HttpException, IOException {
+                            responseTrigger.pushPromise(promise, responseProducer);
+                        }
+
+                    });
                 })
 
                 // Application request handler
@@ -180,13 +168,10 @@
                 })
                 .create();
 
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                System.out.println("HTTP server shutting down");
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            System.out.println("HTTP server shutting down");
+            server.close(CloseMode.GRACEFUL);
+        }));
 
         server.start();
         final Future<ListenerEndpoint> future = server.listen(new InetSocketAddress(port), URIScheme.HTTP);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicFileServerExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicFileServerExample.java
index a8fc9fd..b8fbfd7 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicFileServerExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicFileServerExample.java
@@ -47,8 +47,8 @@
 import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.MethodNotSupportedException;
 import org.apache.hc.core5.http.Method;
+import org.apache.hc.core5.http.MethodNotSupportedException;
 import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
 import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
 import org.apache.hc.core5.http.io.HttpRequestHandler;
@@ -124,12 +124,7 @@
                 .create();
 
         server.start();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> server.close(CloseMode.GRACEFUL)));
         System.out.println("Listening on port " + port);
 
         server.awaitTermination(TimeValue.MAX_VALUE);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicPostExecutionExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicPostExecutionExample.java
index 78f7358..fa79ae6 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicPostExecutionExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicPostExecutionExample.java
@@ -27,8 +27,6 @@
 
 package org.apache.hc.core5.http.examples;
 
-import java.io.IOException;
-import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.TimeUnit;
 
@@ -51,7 +49,6 @@
 import org.apache.hc.core5.http.message.RequestLine;
 import org.apache.hc.core5.http.message.StatusLine;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
-import org.apache.hc.core5.io.IOCallback;
 import org.apache.hc.core5.util.Timeout;
 
 /**
@@ -98,15 +95,8 @@
                 HttpEntities.create(
                         "This is the second test request".getBytes(StandardCharsets.UTF_8),
                         ContentType.APPLICATION_OCTET_STREAM),
-                HttpEntities.create(new IOCallback<OutputStream>() {
-
-                    @Override
-                    public void execute(final OutputStream outStream) throws IOException {
-                        outStream.write(("This is the third test request " +
-                                "(streaming)").getBytes(StandardCharsets.UTF_8));
-                    }
-
-                }, ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8)),
+                HttpEntities.create(outStream -> outStream.write(("This is the third test request " +
+                        "(streaming)").getBytes(StandardCharsets.UTF_8)), ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8)),
                 HttpEntities.create(
                         "This is the fourth test request " +
                                 "(streaming with trailers)",
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicReverseProxyExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicReverseProxyExample.java
index 94ccf2b..c066aec 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicReverseProxyExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicReverseProxyExample.java
@@ -177,13 +177,10 @@
                 .create();
 
         server.start();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                server.close(CloseMode.GRACEFUL);
-                requester.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            server.close(CloseMode.GRACEFUL);
+            requester.close(CloseMode.GRACEFUL);
+        }));
 
         System.out.println("Listening on port " + port);
         server.awaitTermination(TimeValue.MAX_VALUE);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicServerFilterExample.java b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicServerFilterExample.java
index 2708b8a..252e47c 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicServerFilterExample.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/examples/ClassicServerFilterExample.java
@@ -30,18 +30,15 @@
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
 import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap;
 import org.apache.hc.core5.http.impl.bootstrap.StandardFilter;
 import org.apache.hc.core5.http.io.HttpFilterChain;
-import org.apache.hc.core5.http.io.HttpFilterHandler;
-import org.apache.hc.core5.http.io.HttpRequestHandler;
+import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.io.entity.StringEntity;
 import org.apache.hc.core5.http.io.support.AbstractHttpServerAuthFilter;
 import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
@@ -101,60 +98,40 @@
 
                 // Add a custom request filter at the beginning of the processing pipeline
 
-                .addFilterFirst("my-filter", new HttpFilterHandler() {
+                .addFilterFirst("my-filter", (request, responseTrigger, context, chain) -> {
+                    if (request.getRequestUri().equals("/back-door")) {
+                        final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_OK);
+                        response.setEntity(new StringEntity("Welcome", ContentType.TEXT_PLAIN));
+                        responseTrigger.submitResponse(response);
+                    } else {
+                        chain.proceed(request, new HttpFilterChain.ResponseTrigger() {
 
-                    @Override
-                    public void handle(final ClassicHttpRequest request,
-                                       final HttpFilterChain.ResponseTrigger responseTrigger,
-                                       final HttpContext context, final HttpFilterChain chain) throws HttpException, IOException {
-                        if (request.getRequestUri().equals("/back-door")) {
-                            final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_OK);
-                            response.setEntity(new StringEntity("Welcome", ContentType.TEXT_PLAIN));
-                            responseTrigger.submitResponse(response);
-                        } else {
-                            chain.proceed(request, new HttpFilterChain.ResponseTrigger() {
+                            @Override
+                            public void sendInformation(final ClassicHttpResponse response) throws HttpException, IOException {
+                                responseTrigger.sendInformation(response);
+                            }
 
-                                @Override
-                                public void sendInformation(final ClassicHttpResponse response) throws HttpException, IOException {
-                                    responseTrigger.sendInformation(response);
-                                }
+                            @Override
+                            public void submitResponse(final ClassicHttpResponse response) throws HttpException, IOException {
+                                response.addHeader("X-Filter", "My-Filter");
+                                responseTrigger.submitResponse(response);
+                            }
 
-                                @Override
-                                public void submitResponse(final ClassicHttpResponse response) throws HttpException, IOException {
-                                    response.addHeader("X-Filter", "My-Filter");
-                                    responseTrigger.submitResponse(response);
-                                }
-
-                            }, context);
-                        }
+                        }, context);
                     }
-
                 })
 
                 // Application request handler
 
-                .register("*", new HttpRequestHandler() {
-
-                    @Override
-                    public void handle(
-                            final ClassicHttpRequest request,
-                            final ClassicHttpResponse response,
-                            final HttpContext context) throws HttpException, IOException {
-                        // do something useful
-                        response.setCode(HttpStatus.SC_OK);
-                        response.setEntity(new StringEntity("Hello"));
-                    }
-
+                .register("*", (request, response, context) -> {
+                    // do something useful
+                    response.setCode(HttpStatus.SC_OK);
+                    response.setEntity(new StringEntity("Hello"));
                 })
                 .create();
 
         server.start();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                server.close(CloseMode.GRACEFUL);
-            }
-        });
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> server.close(CloseMode.GRACEFUL)));
         System.out.println("Listening on port " + port);
 
         server.awaitTermination(TimeValue.MAX_VALUE);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestChunkCoding.java b/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestChunkCoding.java
index 448ff1d..313abfa 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestChunkCoding.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestChunkCoding.java
@@ -33,9 +33,7 @@
 import java.io.InterruptedIOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
-import java.util.List;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.ConnectionClosedException;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.MalformedChunkCodingException;
@@ -368,14 +366,9 @@
     public void testChunkedOutputStreamWithTrailers() throws IOException {
         final SessionOutputBuffer outbuffer = new SessionOutputBufferImpl(16);
         final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final ChunkedOutputStream out = new ChunkedOutputStream(outbuffer, outputStream, 2, new Supplier<List<? extends Header>>() {
-            @Override
-            public List<? extends Header> get() {
-                return Arrays.asList(
-                        new BasicHeader("E", ""),
-                        new BasicHeader("Y", "Z"));
-                }
-            }
+        final ChunkedOutputStream out = new ChunkedOutputStream(outbuffer, outputStream, 2, () -> Arrays.asList(
+                new BasicHeader("E", ""),
+                new BasicHeader("Y", "Z"))
         );
         out.write('x');
         out.finish();
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestHttpService.java b/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestHttpService.java
index 889efe7..4b75ae6 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestHttpService.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestHttpService.java
@@ -27,7 +27,6 @@
 
 package org.apache.hc.core5.http.impl.io;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 
@@ -35,14 +34,12 @@
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ConnectionReuseStrategy;
 import org.apache.hc.core5.http.HeaderElements;
-import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.HttpRequestMapper;
-import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.HttpResponseFactory;
 import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.MethodNotSupportedException;
 import org.apache.hc.core5.http.Method;
+import org.apache.hc.core5.http.MethodNotSupportedException;
 import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http.UnsupportedHttpVersionException;
 import org.apache.hc.core5.http.io.HttpRequestHandler;
@@ -50,14 +47,12 @@
 import org.apache.hc.core5.http.io.entity.InputStreamEntity;
 import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
 import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
-import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
 import org.mockito.ArgumentMatchers;
 import org.mockito.Mock;
 import org.mockito.Mockito;
@@ -140,14 +135,7 @@
 
         Mockito.when(conn.receiveRequestHeader()).thenReturn(request);
         Mockito.when(responseFactory.newHttpResponse(200)).thenReturn(response);
-        Mockito.when(connReuseStrategy.keepAlive(ArgumentMatchers.eq(request), ArgumentMatchers.argThat(new ArgumentMatcher<HttpResponse>() {
-
-            @Override
-            public boolean matches(final HttpResponse errorResponse) {
-                return errorResponse.getCode() == HttpStatus.SC_NOT_IMPLEMENTED;
-            }
-
-        }), ArgumentMatchers.eq(context))).thenReturn(Boolean.TRUE);
+        Mockito.when(connReuseStrategy.keepAlive(ArgumentMatchers.eq(request), ArgumentMatchers.argThat(errorResponse -> errorResponse.getCode() == HttpStatus.SC_NOT_IMPLEMENTED), ArgumentMatchers.eq(context))).thenReturn(Boolean.TRUE);
 
         httpservice.handleRequest(conn, context);
         final ArgumentCaptor<ClassicHttpResponse> responseCaptor = ArgumentCaptor.forClass(ClassicHttpResponse.class);
@@ -180,14 +168,7 @@
 
         Mockito.when(conn.receiveRequestHeader()).thenReturn(request);
         Mockito.when(responseFactory.newHttpResponse(200)).thenReturn(response);
-        Mockito.when(connReuseStrategy.keepAlive(ArgumentMatchers.eq(request), ArgumentMatchers.argThat(new ArgumentMatcher<HttpResponse>() {
-
-            @Override
-            public boolean matches(final HttpResponse errorResponse) {
-                return errorResponse.getCode() == HttpStatus.SC_NOT_IMPLEMENTED;
-            }
-
-        }), ArgumentMatchers.eq(context))).thenReturn(Boolean.TRUE);
+        Mockito.when(connReuseStrategy.keepAlive(ArgumentMatchers.eq(request), ArgumentMatchers.argThat(errorResponse -> errorResponse.getCode() == HttpStatus.SC_NOT_IMPLEMENTED), ArgumentMatchers.eq(context))).thenReturn(Boolean.TRUE);
 
         httpservice.handleRequest(conn, context);
         final ArgumentCaptor<ClassicHttpResponse> responseCaptor = ArgumentCaptor.forClass(ClassicHttpResponse.class);
@@ -326,16 +307,7 @@
 
         Mockito.when(conn.receiveRequestHeader()).thenReturn(request);
         Mockito.when(responseFactory.newHttpResponse(200)).thenReturn(response);
-        Mockito.when(handlerResolver.resolve(request, context)).thenReturn(new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final ClassicHttpRequest request,
-                    final ClassicHttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-                response.setCode(HttpStatus.SC_NO_CONTENT);
-            }
-        });
+        Mockito.when(handlerResolver.resolve(request, context)).thenReturn((request1, response, context1) -> response.setCode(HttpStatus.SC_NO_CONTENT));
         Mockito.when(connReuseStrategy.keepAlive(request, response, context)).thenReturn(Boolean.TRUE);
 
         httpservice.handleRequest(conn, context);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/io/entity/TestSerializableEntity.java b/httpcore5/src/test/java/org/apache/hc/core5/http/io/entity/TestSerializableEntity.java
index ac72cb5..0a2069f 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/io/entity/TestSerializableEntity.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/io/entity/TestSerializableEntity.java
@@ -42,9 +42,9 @@
 
         private static final long serialVersionUID = 1833335861188359573L;
 
-        public int intValue = 4;
+        public final int intValue = 4;
 
-        public String stringValue = "Hello";
+        public final String stringValue = "Hello";
 
         public SerializableObject() {}
     }
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedInputBuffer.java b/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedInputBuffer.java
index bbd7b69..bcacbc9 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedInputBuffer.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedInputBuffer.java
@@ -96,24 +96,14 @@
         Mockito.reset(capacityChannel);
 
         final ExecutorService executorService = Executors.newFixedThreadPool(2);
-        final Future<Boolean> task1 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                final Charset charset = StandardCharsets.US_ASCII;
-                inputBuffer.fill(charset.encode("1234567890"));
-                return Boolean.TRUE;
-            }
-
+        final Future<Boolean> task1 = executorService.submit(() -> {
+            final Charset charset = StandardCharsets.US_ASCII;
+            inputBuffer.fill(charset.encode("1234567890"));
+            return Boolean.TRUE;
         });
-        final Future<Integer> task2 = executorService.submit(new Callable<Integer>() {
-
-            @Override
-            public Integer call() throws Exception {
-                final byte[] tmp = new byte[20];
-                return inputBuffer.read(tmp, 0, tmp.length);
-            }
-
+        final Future<Integer> task2 = executorService.submit(() -> {
+            final byte[] tmp = new byte[20];
+            return inputBuffer.read(tmp, 0, tmp.length);
         });
 
         Assert.assertEquals(Boolean.TRUE, task1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
@@ -133,24 +123,12 @@
         Mockito.reset(capacityChannel);
 
         final ExecutorService executorService = Executors.newFixedThreadPool(2);
-        final Future<Boolean> task1 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                final Charset charset = StandardCharsets.US_ASCII;
-                inputBuffer.fill(charset.encode("a"));
-                return Boolean.TRUE;
-            }
-
+        final Future<Boolean> task1 = executorService.submit(() -> {
+            final Charset charset = StandardCharsets.US_ASCII;
+            inputBuffer.fill(charset.encode("a"));
+            return Boolean.TRUE;
         });
-        final Future<Integer> task2 = executorService.submit(new Callable<Integer>() {
-
-            @Override
-            public Integer call() throws Exception {
-                return inputBuffer.read();
-            }
-
-        });
+        final Future<Integer> task2 = executorService.submit((Callable<Integer>) inputBuffer::read);
 
         Assert.assertEquals(Boolean.TRUE, task1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
         Assert.assertEquals(Integer.valueOf('a'), task2.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
@@ -169,35 +147,25 @@
         Mockito.reset(capacityChannel);
 
         final ExecutorService executorService = Executors.newFixedThreadPool(2);
-        final Future<Boolean> task1 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                final Charset charset = StandardCharsets.US_ASCII;
-                final Random rnd = new Random(System.currentTimeMillis());
-                for (int i = 0; i < 5; i++) {
-                    inputBuffer.fill(charset.encode("1234567890"));
-                    Thread.sleep(rnd.nextInt(250));
-                }
-                inputBuffer.markEndStream();
-                return Boolean.TRUE;
+        final Future<Boolean> task1 = executorService.submit(() -> {
+            final Charset charset = StandardCharsets.US_ASCII;
+            final Random rnd = new Random(System.currentTimeMillis());
+            for (int i = 0; i < 5; i++) {
+                inputBuffer.fill(charset.encode("1234567890"));
+                Thread.sleep(rnd.nextInt(250));
             }
-
+            inputBuffer.markEndStream();
+            return Boolean.TRUE;
         });
-        final Future<String> task2 = executorService.submit(new Callable<String>() {
-
-            @Override
-            public String call() throws Exception {
-                final Charset charset = StandardCharsets.US_ASCII;
-                final StringBuilder buf = new StringBuilder();
-                final byte[] tmp = new byte[10];
-                int l;
-                while ((l = inputBuffer.read(tmp, 0, tmp.length)) != -1) {
-                    buf.append(charset.decode(ByteBuffer.wrap(tmp, 0, l)));
-                }
-                return buf.toString();
+        final Future<String> task2 = executorService.submit(() -> {
+            final Charset charset = StandardCharsets.US_ASCII;
+            final StringBuilder buf = new StringBuilder();
+            final byte[] tmp = new byte[10];
+            int l;
+            while ((l = inputBuffer.read(tmp, 0, tmp.length)) != -1) {
+                buf.append(charset.decode(ByteBuffer.wrap(tmp, 0, l)));
             }
-
+            return buf.toString();
         });
 
         Assert.assertEquals(Boolean.TRUE, task1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
@@ -218,24 +186,12 @@
         Mockito.reset(capacityChannel);
 
         final ExecutorService executorService = Executors.newFixedThreadPool(2);
-        final Future<Boolean> task1 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                Thread.sleep(1000);
-                inputBuffer.abort();
-                return Boolean.TRUE;
-            }
-
+        final Future<Boolean> task1 = executorService.submit(() -> {
+            Thread.sleep(1000);
+            inputBuffer.abort();
+            return Boolean.TRUE;
         });
-        final Future<Integer> task2 = executorService.submit(new Callable<Integer>() {
-
-            @Override
-            public Integer call() throws Exception {
-                return inputBuffer.read();
-            }
-
-        });
+        final Future<Integer> task2 = executorService.submit((Callable<Integer>) inputBuffer::read);
 
         Assert.assertEquals(Boolean.TRUE, task1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
         Assert.assertEquals(Integer.valueOf(-1), task2.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedOutputBuffer.java b/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedOutputBuffer.java
index 6858dc2..61af5c9 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedOutputBuffer.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/nio/support/classic/TestSharedOutputBuffer.java
@@ -33,7 +33,6 @@
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -148,40 +147,30 @@
         final DataStreamChannelMock dataStreamChannel = new DataStreamChannelMock(channel);
 
         final ExecutorService executorService = Executors.newFixedThreadPool(2);
-        final Future<Boolean> task1 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                final byte[] tmp = "1234567890".getBytes(charset);
-                outputBuffer.write(tmp, 0, tmp.length);
-                outputBuffer.write(tmp, 0, tmp.length);
-                outputBuffer.write('1');
-                outputBuffer.write('2');
-                outputBuffer.write(tmp, 0, tmp.length);
-                outputBuffer.write(tmp, 0, tmp.length);
-                outputBuffer.write(tmp, 0, tmp.length);
-                outputBuffer.writeCompleted();
-                outputBuffer.writeCompleted();
-                return Boolean.TRUE;
-            }
-
+        final Future<Boolean> task1 = executorService.submit(() -> {
+            final byte[] tmp = "1234567890".getBytes(charset);
+            outputBuffer.write(tmp, 0, tmp.length);
+            outputBuffer.write(tmp, 0, tmp.length);
+            outputBuffer.write('1');
+            outputBuffer.write('2');
+            outputBuffer.write(tmp, 0, tmp.length);
+            outputBuffer.write(tmp, 0, tmp.length);
+            outputBuffer.write(tmp, 0, tmp.length);
+            outputBuffer.writeCompleted();
+            outputBuffer.writeCompleted();
+            return Boolean.TRUE;
         });
-        final Future<Boolean> task2 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                for (;;) {
-                    outputBuffer.flush(dataStreamChannel);
-                    if (outputBuffer.isEndStream()) {
-                        break;
-                    }
-                    if (!outputBuffer.hasData()) {
-                        dataStreamChannel.awaitOutputRequest();
-                    }
+        final Future<Boolean> task2 = executorService.submit(() -> {
+            for (;;) {
+                outputBuffer.flush(dataStreamChannel);
+                if (outputBuffer.isEndStream()) {
+                    break;
                 }
-                return Boolean.TRUE;
+                if (!outputBuffer.hasData()) {
+                    dataStreamChannel.awaitOutputRequest();
+                }
             }
-
+            return Boolean.TRUE;
         });
 
         Assert.assertEquals(Boolean.TRUE, task1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
@@ -197,28 +186,18 @@
         final SharedOutputBuffer outputBuffer = new SharedOutputBuffer(20);
 
         final ExecutorService executorService = Executors.newFixedThreadPool(2);
-        final Future<Boolean> task1 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                final byte[] tmp = "1234567890".getBytes(charset);
-                for (int i = 0; i < 20; i++) {
-                    outputBuffer.write(tmp, 0, tmp.length);
-                }
-                outputBuffer.writeCompleted();
-                return Boolean.TRUE;
+        final Future<Boolean> task1 = executorService.submit(() -> {
+            final byte[] tmp = "1234567890".getBytes(charset);
+            for (int i = 0; i < 20; i++) {
+                outputBuffer.write(tmp, 0, tmp.length);
             }
-
+            outputBuffer.writeCompleted();
+            return Boolean.TRUE;
         });
-        final Future<Boolean> task2 = executorService.submit(new Callable<Boolean>() {
-
-            @Override
-            public Boolean call() throws Exception {
-                Thread.sleep(200);
-                outputBuffer.abort();
-                return Boolean.TRUE;
-            }
-
+        final Future<Boolean> task2 = executorService.submit(() -> {
+            Thread.sleep(200);
+            outputBuffer.abort();
+            return Boolean.TRUE;
         });
 
         Assert.assertEquals(Boolean.TRUE, task2.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit()));
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/protocol/TestRequestHandlerRegistry.java b/httpcore5/src/test/java/org/apache/hc/core5/http/protocol/TestRequestHandlerRegistry.java
index dbbfa71..7b813c2 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/protocol/TestRequestHandlerRegistry.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/protocol/TestRequestHandlerRegistry.java
@@ -27,7 +27,6 @@
 
 package org.apache.hc.core5.http.protocol;
 
-import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.Method;
 import org.apache.hc.core5.http.MisdirectedRequestException;
@@ -43,14 +42,7 @@
 
     @Before
     public void setUp() {
-        handlerRegistry = new RequestHandlerRegistry<>("myhost", new Supplier<LookupRegistry<String>>() {
-
-            @Override
-            public LookupRegistry<String> get() {
-                return new UriPatternMatcher<>();
-            }
-
-        });
+        handlerRegistry = new RequestHandlerRegistry<>("myhost", UriPatternMatcher::new);
         context = new BasicHttpContext();
     }
 
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java
index fcfc750..784c1a0 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java
@@ -317,7 +317,7 @@
     @Test
     public void testSetParametersWithEmptyList() throws Exception {
         final URI uri = new URI("http", null, "localhost", 80, "/test", "param=test", null);
-        final URIBuilder uribuilder = new URIBuilder(uri).setParameters(Arrays.<NameValuePair>asList());
+        final URIBuilder uribuilder = new URIBuilder(uri).setParameters(Collections.<NameValuePair>emptyList());
         final URI result = uribuilder.build();
         Assert.assertEquals(new URI("http://localhost:80/test"), result);
     }
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
index 8547ff2..db64b55 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
@@ -114,7 +114,7 @@
     @Test(expected = IllegalStateException.class)
     public void testReleaseUnknownEntry() throws Exception {
         final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
-        pool.release(new PoolEntry<String, HttpConnection>("somehost"), true);
+        pool.release(new PoolEntry<>("somehost"), true);
     }
 
     @Test
@@ -403,7 +403,7 @@
         } catch (final IllegalStateException expected) {
         }
         // Ignored if shut down
-        pool.release(new PoolEntry<String, HttpConnection>("somehost"), true);
+        pool.release(new PoolEntry<>("somehost"), true);
     }
 
 }
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestPoolEntry.java b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestPoolEntry.java
index 97aafe6..17d887f 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestPoolEntry.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestPoolEntry.java
@@ -47,14 +47,7 @@
     @Before
     public void setup() {
         count = new AtomicLong(1);
-        currentTimeSupplier = new Supplier<Long>() {
-
-            @Override
-            public Long get() {
-                return count.addAndGet(1);
-            }
-
-        };
+        currentTimeSupplier = () -> count.addAndGet(1);
     }
 
     @Test
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestStrictConnPool.java b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestStrictConnPool.java
index a0484d2..687b714 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestStrictConnPool.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestStrictConnPool.java
@@ -33,7 +33,6 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.hc.core5.function.Callback;
 import org.apache.hc.core5.http.HttpConnection;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.util.DeadlineTimeoutException;
@@ -129,7 +128,7 @@
     @Test(expected = IllegalStateException.class)
     public void testReleaseUnknownEntry() throws Exception {
         final StrictConnPool<String, HttpConnection> pool = new StrictConnPool<>(2, 2);
-        pool.release(new PoolEntry<String, HttpConnection>("somehost"), true);
+        pool.release(new PoolEntry<>("somehost"), true);
     }
 
     @Test
@@ -519,21 +518,15 @@
 
     private static class HoldInternalLockThread extends Thread {
         private HoldInternalLockThread(final StrictConnPool<String, HttpConnection> pool, final CountDownLatch lockHeld) {
-            super(new Runnable() {
-                @Override
-                public void run() {
-                    pool.lease("somehost", null); // lease a connection so we have something to enumLeased()
-                    pool.enumLeased(new Callback<PoolEntry<String, HttpConnection>>() {
-                        @Override
-                        public void execute(final PoolEntry<String, HttpConnection> object) {
-                            try {
-                                lockHeld.countDown();
-                                Thread.sleep(Long.MAX_VALUE);
-                            } catch (final InterruptedException ignored) {
-                            }
-                        }
-                    });
-                }
+            super(() -> {
+                pool.lease("somehost", null); // lease a connection so we have something to enumLeased()
+                pool.enumLeased(object -> {
+                    try {
+                        lockHeld.countDown();
+                        Thread.sleep(Long.MAX_VALUE);
+                    } catch (final InterruptedException ignored) {
+                    }
+                });
             });
         }
     }
@@ -651,7 +644,7 @@
         } catch (final IllegalStateException expected) {
         }
         // Ignored if shut down
-        pool.release(new PoolEntry<String, HttpConnection>("somehost"), true);
+        pool.release(new PoolEntry<>("somehost"), true);
     }
 
 }
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/reactor/TestAbstractIOSessionPool.java b/httpcore5/src/test/java/org/apache/hc/core5/reactor/TestAbstractIOSessionPool.java
index 83febce..56550d6 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/reactor/TestAbstractIOSessionPool.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/reactor/TestAbstractIOSessionPool.java
@@ -39,13 +39,10 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
-import org.mockito.ArgumentMatcher;
 import org.mockito.ArgumentMatchers;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.mockito.stubbing.Answer;
 
 @RunWith(MockitoJUnitRunner.class)
 public class TestAbstractIOSessionPool {
@@ -78,15 +75,10 @@
                 ArgumentMatchers.<Timeout>any(),
                 ArgumentMatchers.<FutureCallback<IOSession>>any())).thenReturn(connectFuture);
 
-        Mockito.doAnswer(new Answer() {
-
-            @Override
-            public Object answer(final InvocationOnMock invocation) throws Throwable {
-                final Callback<Boolean> callback = invocation.getArgument(1);
-                callback.execute(true);
-                return null;
-            }
-
+        Mockito.doAnswer(invocation -> {
+            final Callback<Boolean> callback = invocation.getArgument(1);
+            callback.execute(true);
+            return null;
         }).when(impl).validateSession(ArgumentMatchers.<IOSession>any(), ArgumentMatchers.<Callback<Boolean>>any());
 
         Mockito.when(ioSession1.isOpen()).thenReturn(true);
@@ -109,14 +101,9 @@
         Mockito.verify(impl, Mockito.times(1)).connectSession(
                 ArgumentMatchers.eq("somehost"),
                 ArgumentMatchers.<Timeout>any(),
-                ArgumentMatchers.argThat(new ArgumentMatcher<FutureCallback<IOSession>>() {
-
-                    @Override
-                    public boolean matches(final FutureCallback<IOSession> callback) {
-                        callback.completed(ioSession1);
-                        return true;
-                    }
-
+                ArgumentMatchers.argThat(callback -> {
+                    callback.completed(ioSession1);
+                    return true;
                 }));
 
         MatcherAssert.assertThat(future1.isDone(), CoreMatchers.equalTo(true));
@@ -166,14 +153,9 @@
         Mockito.verify(impl, Mockito.times(1)).connectSession(
                 ArgumentMatchers.eq("somehost"),
                 ArgumentMatchers.<Timeout>any(),
-                ArgumentMatchers.argThat(new ArgumentMatcher<FutureCallback<IOSession>>() {
-
-                    @Override
-                    public boolean matches(final FutureCallback<IOSession> callback) {
-                        callback.failed(new Exception("Boom"));
-                        return true;
-                    }
-
+                ArgumentMatchers.argThat(callback -> {
+                    callback.failed(new Exception("Boom"));
+                    return true;
                 }));
 
         MatcherAssert.assertThat(future1.isDone(), CoreMatchers.equalTo(true));
@@ -234,14 +216,7 @@
         MatcherAssert.assertThat(entry2, CoreMatchers.notNullValue());
         entry2.session = ioSession2;
 
-        impl.enumAvailable(new Callback<IOSession>() {
-
-            @Override
-            public void execute(final IOSession ioSession) {
-                ioSession.close(CloseMode.GRACEFUL);
-            }
-
-        });
+        impl.enumAvailable(ioSession -> ioSession.close(CloseMode.GRACEFUL));
         Mockito.verify(ioSession1).close(CloseMode.GRACEFUL);
         Mockito.verify(ioSession2).close(CloseMode.GRACEFUL);
     }
@@ -253,15 +228,10 @@
         entry1.session = ioSession1;
 
         Mockito.when(ioSession1.isOpen()).thenReturn(true);
-        Mockito.doAnswer(new Answer() {
-
-            @Override
-            public Object answer(final InvocationOnMock invocation) throws Throwable {
-                final Callback<Boolean> callback = invocation.getArgument(1);
-                callback.execute(false);
-                return null;
-            }
-
+        Mockito.doAnswer(invocation -> {
+            final Callback<Boolean> callback = invocation.getArgument(1);
+            callback.execute(false);
+            return null;
         }).when(impl).validateSession(ArgumentMatchers.<IOSession>any(), ArgumentMatchers.<Callback<Boolean>>any());
 
         impl.getSession("somehost", Timeout.ofSeconds(123L), null);
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/ssl/TestSSLContextBuilder.java b/httpcore5/src/test/java/org/apache/hc/core5/ssl/TestSSLContextBuilder.java
index bc36248..819fec3 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/ssl/TestSSLContextBuilder.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/ssl/TestSSLContextBuilder.java
@@ -40,13 +40,10 @@
 import java.security.Principal;
 import java.security.Security;
 import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.util.Arrays;
 import java.util.LinkedHashSet;
-import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -57,7 +54,6 @@
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLHandshakeException;
-import javax.net.ssl.SSLParameters;
 import javax.net.ssl.SSLPeerUnverifiedException;
 import javax.net.ssl.SSLServerSocket;
 import javax.net.ssl.SSLSession;
@@ -91,7 +87,7 @@
     }
 
     @Rule
-    public ExpectedException thrown = ExpectedException.none();
+    public final ExpectedException thrown = ExpectedException.none();
 
     private static final Timeout TIMEOUT = Timeout.ofSeconds(5);
     private ExecutorService executorService;
@@ -246,16 +242,13 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        final Future<Boolean> future = this.executorService.submit(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                try (Socket socket = serverSocket.accept()) {
-                    final OutputStream outputStream = socket.getOutputStream();
-                    outputStream.write(new byte[]{'H', 'i'});
-                    outputStream.flush();
-                }
-                return Boolean.TRUE;
+        final Future<Boolean> future = this.executorService.submit(() -> {
+            try (Socket socket = serverSocket.accept()) {
+                final OutputStream outputStream = socket.getOutputStream();
+                outputStream.write(new byte[]{'H', 'i'});
+                outputStream.flush();
             }
+            return Boolean.TRUE;
         });
 
         final int localPort = serverSocket.getLocalPort();
@@ -292,14 +285,11 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        this.executorService.submit(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
-                    socket.getSession();
-                }
-                return Boolean.FALSE;
+        this.executorService.submit(() -> {
+            try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
+                socket.getSession();
             }
+            return Boolean.FALSE;
         });
         final int localPort = serverSocket.getLocalPort();
         try (final SSLSocket clientSocket = (SSLSocket) clientSslContext.getSocketFactory().createSocket()) {
@@ -321,15 +311,9 @@
 
         final AtomicReference<X509Certificate[]> certChainRef = new AtomicReference<>();
 
-        final TrustStrategy trustStrategy = new TrustStrategy() {
-
-            @Override
-            public boolean isTrusted(
-                    final X509Certificate[] chain, final String authType) throws CertificateException {
-                certChainRef.set(chain);
-                return true;
-            }
-
+        final TrustStrategy trustStrategy = (chain, authType) -> {
+            certChainRef.set(chain);
+            return true;
         };
 
         final SSLContext clientSslContext = SSLContextBuilder.create()
@@ -341,16 +325,13 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        final Future<Boolean> future = this.executorService.submit(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                try (Socket socket = serverSocket.accept()) {
-                    final OutputStream outputStream = socket.getOutputStream();
-                    outputStream.write(new byte[]{'H', 'i'});
-                    outputStream.flush();
-                }
-                return Boolean.TRUE;
+        final Future<Boolean> future = this.executorService.submit(() -> {
+            try (Socket socket = serverSocket.accept()) {
+                final OutputStream outputStream = socket.getOutputStream();
+                outputStream.write(new byte[]{'H', 'i'});
+                outputStream.flush();
             }
+            return Boolean.TRUE;
         });
 
         final int localPort = serverSocket.getLocalPort();
@@ -404,25 +385,22 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        final Future<Principal> future = this.executorService.submit(new Callable<Principal>() {
-            @Override
-            public Principal call() throws Exception {
-                final SSLSocket socket = (SSLSocket) serverSocket.accept();
-                Principal clientPrincipal = null;
+        final Future<Principal> future = this.executorService.submit(() -> {
+            final SSLSocket socket = (SSLSocket) serverSocket.accept();
+            Principal clientPrincipal = null;
+            try {
+                final SSLSession session = socket.getSession();
                 try {
-                    final SSLSession session = socket.getSession();
-                    try {
-                        clientPrincipal = session.getPeerPrincipal();
-                    } catch (final SSLPeerUnverifiedException ignore) {
-                    }
-                    final OutputStream outputStream = socket.getOutputStream();
-                    outputStream.write(new byte [] {'H', 'i'});
-                    outputStream.flush();
-                } finally {
-                    socket.close();
+                    clientPrincipal = session.getPeerPrincipal();
+                } catch (final SSLPeerUnverifiedException ignore) {
                 }
-                return clientPrincipal;
+                final OutputStream outputStream = socket.getOutputStream();
+                outputStream.write(new byte [] {'H', 'i'});
+                outputStream.flush();
+            } finally {
+                socket.close();
             }
+            return clientPrincipal;
         });
 
         final int localPort = serverSocket.getLocalPort();
@@ -461,14 +439,11 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        this.executorService.submit(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
-                    socket.getSession();
-                }
-                return Boolean.FALSE;
+        this.executorService.submit(() -> {
+            try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
+                socket.getSession();
             }
+            return Boolean.FALSE;
         });
 
         final int localPort = serverSocket.getLocalPort();
@@ -502,17 +477,14 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        final Future<Principal> future = this.executorService.submit(new Callable<Principal>() {
-            @Override
-            public Principal call() throws Exception {
-                try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
-                    final SSLSession session = socket.getSession();
-                    final Principal clientPrincipal = session.getPeerPrincipal();
-                    final OutputStream outputStream = socket.getOutputStream();
-                    outputStream.write(new byte[]{'H', 'i'});
-                    outputStream.flush();
-                    return clientPrincipal;
-                }
+        final Future<Principal> future = this.executorService.submit(() -> {
+            try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
+                final SSLSession session = socket.getSession();
+                final Principal clientPrincipal = session.getPeerPrincipal();
+                final OutputStream outputStream = socket.getOutputStream();
+                outputStream.write(new byte[]{'H', 'i'});
+                outputStream.flush();
+                return clientPrincipal;
             }
         });
         final int localPort = serverSocket.getLocalPort();
@@ -541,13 +513,7 @@
                 .build();
         Assert.assertNotNull(serverSslContext);
 
-        final PrivateKeyStrategy privateKeyStrategy = new PrivateKeyStrategy() {
-            @Override
-            public String chooseAlias(final Map<String, PrivateKeyDetails> aliases,
-                            final SSLParameters sslParameters) {
-                return aliases.containsKey("client2") ? "client2" : null;
-            }
-        };
+        final PrivateKeyStrategy privateKeyStrategy = (aliases, sslParameters) -> aliases.containsKey("client2") ? "client2" : null;
 
         final URL resource2 = getResource("/test-client.p12");
         final SSLContext clientSslContext = SSLContextBuilder.create()
@@ -560,17 +526,14 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        final Future<Principal> future = this.executorService.submit(new Callable<Principal>() {
-            @Override
-            public Principal call() throws Exception {
-                try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
-                    final SSLSession session = socket.getSession();
-                    final Principal clientPrincipal = session.getPeerPrincipal();
-                    final OutputStream outputStream = socket.getOutputStream();
-                    outputStream.write(new byte[]{'H', 'i'});
-                    outputStream.flush();
-                    return clientPrincipal;
-                }
+        final Future<Principal> future = this.executorService.submit(() -> {
+            try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
+                final SSLSession session = socket.getSession();
+                final Principal clientPrincipal = session.getPeerPrincipal();
+                final OutputStream outputStream = socket.getOutputStream();
+                outputStream.write(new byte[]{'H', 'i'});
+                outputStream.flush();
+                return clientPrincipal;
             }
         });
         final int localPort = serverSocket.getLocalPort();
@@ -617,14 +580,11 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        this.executorService.submit(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
-                    socket.getSession();
-                }
-                return Boolean.FALSE;
+        this.executorService.submit(() -> {
+            try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
+                socket.getSession();
             }
+            return Boolean.FALSE;
         });
 
         final int localPort = serverSocket.getLocalPort();
@@ -665,14 +625,11 @@
         serverSocket.bind(new InetSocketAddress(0));
 
         this.executorService = Executors.newSingleThreadExecutor();
-        this.executorService.submit(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
-                    socket.getSession();
-                }
-                return Boolean.FALSE;
+        this.executorService.submit(() -> {
+            try (SSLSocket socket = (SSLSocket) serverSocket.accept()) {
+                socket.getSession();
             }
+            return Boolean.FALSE;
         });
 
         final int localPort = serverSocket.getLocalPort();
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/util/TestArgs.java b/httpcore5/src/test/java/org/apache/hc/core5/util/TestArgs.java
index f21635f..c7efa11 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/util/TestArgs.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/util/TestArgs.java
@@ -98,7 +98,7 @@
 
     @Test
     public void testArgCollectionNotEmptyPass() {
-        final List<String> list = Arrays.asList("stuff");
+        final List<String> list = Collections.singletonList("stuff");
         Assert.assertSame(list, Args.notEmpty(list, "List"));
     }
 
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/util/TestAsserts.java b/httpcore5/src/test/java/org/apache/hc/core5/util/TestAsserts.java
index 32cb49c..2bbf1e7 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/util/TestAsserts.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/util/TestAsserts.java
@@ -51,7 +51,7 @@
 
     @Test(expected=IllegalStateException.class)
     public void testExpressionNotEmptyFail1() {
-        Asserts.notEmpty((String) null, "Stuff");
+        Asserts.notEmpty(null, "Stuff");
     }
 
     @Test(expected=IllegalStateException.class)
@@ -61,7 +61,7 @@
 
     @Test(expected=IllegalStateException.class)
     public void testExpressionNotEmptyBlank1() {
-        Asserts.notBlank((String) null, "Stuff");
+        Asserts.notBlank(null, "Stuff");
     }
 
     @Test(expected=IllegalStateException.class)
diff --git a/pom.xml b/pom.xml
index 593df4c..0242632 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,8 +68,8 @@
 
   <properties>
     <!-- Override parent 7 setting for deprecation (only - other settings stand)-->
-    <maven.compiler.source>1.7</maven.compiler.source>
-    <maven.compiler.target>1.7</maven.compiler.target>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
     <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>
     <conscrypt.version>2.2.1</conscrypt.version>
     <junit.version>4.13</junit.version>
