You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tw...@apache.org on 2022/10/30 20:58:14 UTC

[mina-sshd] 02/02: Fix some SonarLint findings

This is an automated email from the ASF dual-hosted git repository.

twolf pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git

commit b19a3ed0bfe9b933463307278db5632ab2602b70
Author: Thomas Wolf <tw...@apache.org>
AuthorDate: Sun Oct 30 18:57:08 2022 +0100

    Fix some SonarLint findings
    
    Simple ones:
    
    - Logging statements: use placeholders, not string concatenation
    - Abstract classes: use protected, not public, constructors
    - Some simplified lambdas
    - Some simplified exception catching
    - Use StringBuilder instead of StringBuffer
    - Use BigInteger.valueOf() instead of new BigInteger()
    - Use "byte[] buf" instead of "byte buf[]"
    
    There are still a lot of more findings some of them worrying, such as
    throwing exceptions in finally blocks, or catching Error or Throwable
    in several places, or others.
---
 .../sshd/cli/client/SshClientCliSupport.java       |  10 +-
 .../sshd/cli/server/SshServerCliSupport.java       |   3 +-
 .../server/helper/ServerEventListenerHelper.java   |   2 +-
 .../helper/ServerPortForwardingEventListener.java  |   6 +-
 .../auth/hostbased/HostKeyIdentityProvider.java    |   2 +-
 .../client/config/hosts/KnownHostHashValue.java    |   5 +-
 .../config/keys/ClientIdentitiesWatcher.java       |   2 +-
 .../config/keys/ClientIdentityFileWatcher.java     |   4 +-
 .../client/config/keys/ClientIdentityProvider.java |   6 +-
 .../config/keys/LazyClientIdentityIterator.java    |  23 ++-
 .../org/apache/sshd/common/channel/PtyMode.java    |  13 +-
 .../sshd/common/config/VersionProperties.java      |   4 +-
 .../apache/sshd/common/config/keys/KeyUtils.java   |   2 +-
 .../keys/impl/AbstractPublicKeyEntryDecoder.java   |   2 +-
 .../openssh/OpenSSHDSSPrivateKeyEntryDecoder.java  |  11 +-
 .../OpenSSHECDSAPrivateKeyEntryDecoder.java        |   7 +-
 .../openssh/OpenSSHRSAPrivateKeyDecoder.java       |  14 +-
 .../sshd/common/file/util/BaseFileSystem.java      |   2 +-
 .../org/apache/sshd/common/file/util/BasePath.java |   2 +-
 .../sshd/common/io/AbstractIoWriteFuture.java      |   8 +
 .../AbstractResourceKeyPairProvider.java           |   8 +-
 .../common/keyprovider/KeyIdentityProvider.java    |   2 +-
 .../common/keyprovider/MappedKeyPairProvider.java  |   4 +-
 .../java/org/apache/sshd/common/mac/BaseMac.java   |   2 +-
 .../sshd/common/signature/AbstractSignature.java   |   2 +-
 .../apache/sshd/common/signature/SignatureDSA.java |   2 +-
 .../apache/sshd/common/util/ExceptionUtils.java    |   5 +-
 .../org/apache/sshd/common/util/GenericUtils.java  |   6 +-
 .../org/apache/sshd/common/util/SelectorUtils.java |  14 --
 .../org/apache/sshd/common/util/ValidateUtils.java |  20 +--
 .../common/util/closeable/FuturesCloseable.java    |   4 +-
 .../common/util/closeable/ParallelCloseable.java   |   4 +-
 .../sshd/common/util/io/PathScanningMatcher.java   |   2 +-
 .../sshd/common/util/security/SecurityUtils.java   |   4 +-
 .../security/bouncycastle/BouncyCastleRandom.java  |   2 +-
 .../security/eddsa/EdDSASecurityProviderUtils.java |   8 +-
 .../util/security/eddsa/SignatureEd25519.java      |   2 +-
 .../sshd/common/util/threads/ThreadUtils.java      |   2 +-
 .../AbstractGeneratorHostKeyProvider.java          |   8 +-
 .../keys/BuiltinClientIdentitiesWatcherTest.java   |   2 +-
 .../openssh/OpenSSHKeyPairResourceWriterTest.java  |   4 -
 .../sshd/util/test/CommonTestSupportUtils.java     |   4 +-
 .../throttle/ThrottlingChannelStreamWriter.java    |   2 +-
 .../contrib/common/signature/LegacyDSASigner.java  |   2 +-
 .../sshd/agent/common/AbstractAgentProxy.java      |   2 +-
 .../apache/sshd/agent/local/AgentServerProxy.java  |   6 +-
 .../org/apache/sshd/agent/unix/AgentServer.java    |   2 +-
 .../apache/sshd/agent/unix/AgentServerProxy.java   |   2 +-
 .../org/apache/sshd/agent/unix/AprLibrary.java     |   8 +-
 .../sshd/agent/unix/ChannelAgentForwarding.java    |   2 +-
 .../sshd/client/future/DefaultConnectFuture.java   |   2 +-
 .../sshd/common/channel/AbstractChannel.java       |  22 +--
 .../common/channel/BufferedIoOutputStream.java     |  16 +-
 .../common/channel/ChannelAsyncInputStream.java    |   4 +-
 .../sshd/common/forward/DefaultForwarder.java      | 173 +++++++--------------
 .../io/BuiltinIoServiceFactoryFactories.java       |   8 +-
 .../common/io/DefaultIoServiceFactoryFactory.java  |   3 +-
 .../apache/sshd/common/io/nio2/Nio2Service.java    |   6 +-
 .../sshd/common/kex/dh/AbstractDHKeyExchange.java  |   4 +-
 .../session/helpers/AbstractConnectionService.java |   6 +-
 .../common/session/helpers/AbstractSession.java    |  12 +-
 .../session/helpers/AbstractSessionIoHandler.java  |   6 +-
 .../session/helpers/KeyExchangeMessageHandler.java |   6 +-
 .../java/org/apache/sshd/server/SshServer.java     |   4 +-
 .../sshd/server/auth/AsyncAuthException.java       |   2 +-
 .../apache/sshd/server/auth/gss/UserAuthGSS.java   |   2 +-
 ...AuthorizedKeyEntriesPublickeyAuthenticator.java |   6 +-
 .../auth/pubkey/KeySetPublickeyAuthenticator.java  |   4 +-
 .../sshd/server/channel/PuttyRequestHandler.java   |   6 +-
 .../server/command/AbstractCommandSupport.java     |   6 +-
 .../server/command/AbstractFileSystemCommand.java  |   2 +-
 .../sshd/server/forward/DirectTcpipFactory.java    |   2 +-
 .../sshd/server/forward/ForwardedTcpipFactory.java |   2 +-
 .../forward/StaticDecisionForwardingFilter.java    |   2 +-
 .../sshd/server/forward/TcpipServerChannel.java    |  15 +-
 .../sshd/server/session/ServerUserAuthService.java |   6 +-
 .../channel/ChannelPipedInputStreamTest.java       |   2 +-
 .../org/apache/sshd/git/AbstractGitCommand.java    |   2 -
 .../org/apache/sshd/git/pack/GitPackCommand.java   |   4 +-
 .../org/apache/sshd/git/pgm/GitPgmCommand.java     |   1 -
 .../sshd/openpgp/PGPAuthorizedEntriesTracker.java  |   2 +-
 .../sshd/openpgp/PGPKeyPairResourceParser.java     |   3 -
 .../sshd/scp/client/AbstractScpClientCreator.java  |   2 +-
 .../java/org/apache/sshd/scp/common/ScpHelper.java |   4 +-
 .../helpers/LocalFileScpTargetStreamResolver.java  |  10 +-
 .../apache/sshd/scp/common/helpers/ScpIoUtils.java |  12 +-
 .../apache/sshd/scp/server/InputStreamReader.java  |  22 +--
 .../helpers/AbstractSftpClientExtension.java       |   2 +-
 .../sftp/client/fs/SftpClientDirectoryScanner.java |   2 +-
 .../sftp/client/fs/SftpFileSystemProvider.java     |   4 +-
 .../sftp/client/fs/SftpPathDirectoryScanner.java   |   2 +-
 .../sshd/sftp/client/impl/DefaultSftpClient.java   |   2 +-
 .../sftp/client/impl/SftpDirEntryIterator.java     |   2 +-
 .../sftp/client/impl/SftpInputStreamAsync.java     |   4 +-
 .../sftp/client/impl/SftpOutputStreamAsync.java    |   2 +-
 .../org/apache/sshd/sftp/common/SftpHelper.java    |   8 +-
 .../server/AbstractSftpEventListenerAdapter.java   |  76 ++++-----
 .../sftp/server/AbstractSftpSubsystemHelper.java   |  50 +++---
 .../org/apache/sshd/sftp/server/SftpSubsystem.java |  11 +-
 .../common/SftpUniversalOwnerAndGroupTest.java     |   2 +-
 .../integration/ApacheSshdSftpSessionFactory.java  |  37 ++---
 101 files changed, 334 insertions(+), 526 deletions(-)

diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java b/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
index 82f87d8c4..204e70743 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java
@@ -695,10 +695,10 @@ public abstract class SshClientCliSupport extends CliSupport {
         fh.setLevel(Level.FINEST);
         fh.setFormatter(new Formatter() {
             @Override
-            public String format(LogRecord record) {
-                String message = formatMessage(record);
+            public String format(LogRecord logRecord) {
+                String message = formatMessage(logRecord);
                 String throwable = "";
-                Throwable t = record.getThrown();
+                Throwable t = logRecord.getThrown();
                 if (t != null) {
                     StringWriter sw = new StringWriter();
                     try (PrintWriter pw = new PrintWriter(sw)) {
@@ -708,8 +708,8 @@ public abstract class SshClientCliSupport extends CliSupport {
                     throwable = sw.toString();
                 }
                 return String.format("%1$tY-%1$tm-%1$td: %2$-7.7s: %3$-32.32s: %4$s%5$s%n",
-                        new Date(record.getMillis()), record.getLevel().getName(),
-                        record.getLoggerName(), message, throwable);
+                        new Date(logRecord.getMillis()), logRecord.getLevel().getName(),
+                        logRecord.getLoggerName(), message, throwable);
             }
         });
 
diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java b/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
index d5ec09c33..cbd01e013 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
@@ -225,8 +225,7 @@ public abstract class SshServerCliSupport extends CliSupport {
                 continue;
             }
 
-            factory = registerSubsystemFactoryListeners(
-                    server, level, stdout, stderr, options, factory);
+            registerSubsystemFactoryListeners(server, level, stdout, stderr, options, factory);
             subsystems.add(factory);
         }
 
diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerEventListenerHelper.java b/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerEventListenerHelper.java
index b79bccdff..264bb2b9b 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerEventListenerHelper.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerEventListenerHelper.java
@@ -26,7 +26,7 @@ import org.slf4j.Logger;
 public abstract class ServerEventListenerHelper extends AbstractLoggingBean implements NamedResource {
     private final String name;
 
-    public ServerEventListenerHelper(String name, Logger logger) {
+    protected ServerEventListenerHelper(String name, Logger logger) {
         super(logger);
 
         this.name = name;
diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerPortForwardingEventListener.java b/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerPortForwardingEventListener.java
index cdcd97617..78f5045b3 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerPortForwardingEventListener.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/server/helper/ServerPortForwardingEventListener.java
@@ -72,10 +72,10 @@ public class ServerPortForwardingEventListener extends ServerEventListenerHelper
             throws IOException {
         if (reason == null) {
             if (log.isInfoEnabled()) {
-                log.info("Estalibshed dynamic tunnel for session={}: local={},  bound={}", session, local, boundAddress);
+                log.info("Estalibshed dynamic tunnel for session={}: local={} bound={}", session, local, boundAddress);
             }
         } else {
-            log.error("Failed ({}) to establish dynamic tunnel for session={}, bound={}: {}",
+            log.error("Failed ({}) to establish dynamic tunnel for session={}: local={} bound={}: {}",
                     reason.getClass().getSimpleName(), session, local, boundAddress, reason.getMessage());
         }
     }
@@ -86,7 +86,7 @@ public class ServerPortForwardingEventListener extends ServerEventListenerHelper
             throws IOException {
         if (reason == null) {
             if (log.isInfoEnabled()) {
-                log.info("Torn down dynamic tunnel for session={}: address={}", session);
+                log.info("Torn down dynamic tunnel for session={}: address={}", session, address);
             }
         } else {
             log.error("Failed ({}) to tear down dynamic tunnel for session={}, address={}: {}",
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/auth/hostbased/HostKeyIdentityProvider.java b/sshd-common/src/main/java/org/apache/sshd/client/auth/hostbased/HostKeyIdentityProvider.java
index f08a7b7eb..02b1c3fec 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/auth/hostbased/HostKeyIdentityProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/auth/hostbased/HostKeyIdentityProvider.java
@@ -58,7 +58,7 @@ public interface HostKeyIdentityProvider {
         return wrap(GenericUtils.asList(pairs));
     }
 
-    static HostKeyIdentityProvider wrap(Iterable<? extends KeyPair> pairs) {
+    static HostKeyIdentityProvider wrap(Iterable<KeyPair> pairs) {
         return session -> GenericUtils.wrapIterable(pairs,
                 kp -> new SimpleImmutableEntry<>(kp, Collections.<X509Certificate> emptyList()));
     }
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/KnownHostHashValue.java b/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/KnownHostHashValue.java
index 4831541f2..2e6bb7436 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/KnownHostHashValue.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/KnownHostHashValue.java
@@ -96,10 +96,9 @@ public class KnownHostHashValue {
             byte[] expected = getDigestValue();
             byte[] actual = calculateHashValue(host, port, getDigester(), getSaltValue());
             return Arrays.equals(expected, actual);
+        } catch (RuntimeException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            }
             throw new RuntimeSshException(
                     "Failed (" + t.getClass().getSimpleName() + ")" + " to calculate hash value: " + t.getMessage(), t);
         }
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
index ea21386ca..75c587a16 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
@@ -74,7 +74,7 @@ public class ClientIdentitiesWatcher extends AbstractKeyPairProvider implements
         return loadKeys(session, null);
     }
 
-    protected Iterable<KeyPair> loadKeys(SessionContext session, Predicate<? super KeyPair> filter) {
+    protected Iterable<KeyPair> loadKeys(SessionContext session, Predicate<KeyPair> filter) {
         return ClientIdentityProvider.lazyKeysLoader(providers, p -> doGetKeyPairs(session, p), filter);
     }
 
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
index 7324362eb..784ce2bd3 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
@@ -94,13 +94,13 @@ public class ClientIdentityFileWatcher
             return identitiesHolder.get();
         }
 
-        Iterable<KeyPair> kp = identitiesHolder.getAndSet(null); // start fresh
+        identitiesHolder.set(null); // start fresh
         Path path = getPath();
         if (!exists()) {
             return identitiesHolder.get();
         }
 
-        kp = reloadClientIdentities(session, path);
+        Iterable<KeyPair> kp = reloadClientIdentities(session, path);
         updateReloadAttributes();
         identitiesHolder.set(kp);
         return kp;
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
index 1a8fe6128..51a5ce207 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
@@ -79,8 +79,7 @@ public interface ClientIdentityProvider {
      */
     static Iterable<KeyPair> lazyKeysLoader(
             Iterable<? extends ClientIdentityProvider> providers,
-            Function<? super ClientIdentityProvider, ? extends Iterable<? extends KeyPair>> kpExtractor,
-            Predicate<? super KeyPair> filter) {
+            Function<? super ClientIdentityProvider, ? extends Iterable<KeyPair>> kpExtractor, Predicate<KeyPair> filter) {
         Objects.requireNonNull(kpExtractor, "No key pair extractor provided");
         if (providers == null) {
             return Collections.emptyList();
@@ -114,8 +113,7 @@ public interface ClientIdentityProvider {
      */
     static Iterator<KeyPair> lazyKeysIterator(
             Iterator<? extends ClientIdentityProvider> providers,
-            Function<? super ClientIdentityProvider, ? extends Iterable<? extends KeyPair>> kpExtractor,
-            Predicate<? super KeyPair> filter) {
+            Function<? super ClientIdentityProvider, ? extends Iterable<KeyPair>> kpExtractor, Predicate<KeyPair> filter) {
         Objects.requireNonNull(kpExtractor, "No key pair extractor provided");
         return (providers == null)
                 ? Collections.emptyIterator()
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/LazyClientIdentityIterator.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/LazyClientIdentityIterator.java
index aaa19e2e3..df0e8fe90 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/LazyClientIdentityIterator.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/LazyClientIdentityIterator.java
@@ -37,12 +37,12 @@ import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
  */
 public class LazyClientIdentityIterator implements Iterator<KeyPair> {
     protected boolean finished;
-    protected Iterator<? extends KeyPair> currentIdentities;
+    protected Iterator<KeyPair> currentIdentities;
     protected KeyPair currentPair;
 
     private final Iterator<? extends ClientIdentityProvider> providers;
-    private final Function<? super ClientIdentityProvider, ? extends Iterable<? extends KeyPair>> kpExtractor;
-    private final Predicate<? super KeyPair> filter;
+    private final Function<? super ClientIdentityProvider, ? extends Iterable<KeyPair>> kpExtractor;
+    private final Predicate<KeyPair> filter;
 
     /**
      * @param providers   The providers - ignored if {@code null}
@@ -52,10 +52,9 @@ public class LazyClientIdentityIterator implements Iterator<KeyPair> {
      * @param filter      Any further filter to apply on (non-{@code null}) key pairs before returning it as the
      *                    {@link Iterator#next()} result.
      */
-    public LazyClientIdentityIterator(
-                                      Iterator<? extends ClientIdentityProvider> providers,
-                                      Function<? super ClientIdentityProvider, ? extends Iterable<? extends KeyPair>> kpExtractor,
-                                      Predicate<? super KeyPair> filter) {
+    public LazyClientIdentityIterator(Iterator<? extends ClientIdentityProvider> providers,
+                                      Function<? super ClientIdentityProvider, ? extends Iterable<KeyPair>> kpExtractor,
+                                      Predicate<KeyPair> filter) {
         this.providers = providers;
         this.kpExtractor = Objects.requireNonNull(kpExtractor, "No key pair extractor provided");
         this.filter = filter;
@@ -65,11 +64,11 @@ public class LazyClientIdentityIterator implements Iterator<KeyPair> {
         return providers;
     }
 
-    public Function<? super ClientIdentityProvider, ? extends Iterable<? extends KeyPair>> getIdentitiesExtractor() {
+    public Function<? super ClientIdentityProvider, ? extends Iterable<KeyPair>> getIdentitiesExtractor() {
         return kpExtractor;
     }
 
-    public Predicate<? super KeyPair> getFilter() {
+    public Predicate<KeyPair> getFilter() {
         return filter;
     }
 
@@ -90,15 +89,15 @@ public class LazyClientIdentityIterator implements Iterator<KeyPair> {
             return true;
         }
 
-        Function<? super ClientIdentityProvider, ? extends Iterable<? extends KeyPair>> x = getIdentitiesExtractor();
-        Predicate<? super KeyPair> f = getFilter();
+        Function<? super ClientIdentityProvider, ? extends Iterable<KeyPair>> x = getIdentitiesExtractor();
+        Predicate<KeyPair> f = getFilter();
         while (provs.hasNext()) {
             ClientIdentityProvider p = provs.next();
             if (p == null) {
                 continue;
             }
 
-            Iterable<? extends KeyPair> ids = x.apply(p);
+            Iterable<KeyPair> ids = x.apply(p);
             currentIdentities = (ids == null) ? null : ids.iterator();
             currentPair = KeyIdentityProvider.exhaustCurrentIdentities(currentIdentities);
             if (currentPair == null) {
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/channel/PtyMode.java b/sshd-common/src/main/java/org/apache/sshd/common/channel/PtyMode.java
index 0f0a1a244..17335834d 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/channel/PtyMode.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/channel/PtyMode.java
@@ -301,20 +301,17 @@ public enum PtyMode {
      * A {@code null}-safe {@link ToIntFunction} that returns the {@link PtyMode#toInt()} value and (-1) for
      * {@code null}
      */
-    public static final ToIntFunction<PtyMode> OPCODE_EXTRACTOR = v -> (v == null) ? -1 : v.toInt();
+    public static final ToIntFunction<PtyMode> OPCODE_EXTRACTOR = op -> (op == null) ? -1 : op.toInt();
 
     /**
      * A {@code null}-safe {@link Comparator} of {@link PtyMode} values according to their {@link PtyMode#toInt()} value
      *
      * @see #OPCODE_EXTRACTOR
      */
-    public static final Comparator<PtyMode> BY_OPCODE = new Comparator<PtyMode>() {
-        @Override
-        public int compare(PtyMode o1, PtyMode o2) {
-            int v1 = OPCODE_EXTRACTOR.applyAsInt(o1);
-            int v2 = OPCODE_EXTRACTOR.applyAsInt(o2);
-            return Integer.compare(v1, v2);
-        }
+    public static final Comparator<PtyMode> BY_OPCODE = (o1, o2) -> {
+        int v1 = OPCODE_EXTRACTOR.applyAsInt(o1);
+        int v2 = OPCODE_EXTRACTOR.applyAsInt(o2);
+        return Integer.compare(v1, v2);
     };
 
     private final int v;
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/VersionProperties.java b/sshd-common/src/main/java/org/apache/sshd/common/config/VersionProperties.java
index 916057f83..296e70d74 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/VersionProperties.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/VersionProperties.java
@@ -69,7 +69,7 @@ public final class VersionProperties {
                     log.warn("Failed ({}) to load version properties from {}: {}",
                             e.getClass().getSimpleName(), cl, e.getMessage());
                     if (log.isDebugEnabled()) {
-                        log.debug("Version property failure details for loader=" + cl, e);
+                        log.debug("Version property failure details for loader={}", cl, e);
                     }
                     continue;
                 }
@@ -85,7 +85,7 @@ public final class VersionProperties {
                     String prev = result.put(key, value);
                     if (prev != null) {
                         Logger log = LoggerFactory.getLogger(anchor);
-                        log.warn("Multiple values for key=" + key + ": current=" + value + ", previous=" + prev);
+                        log.warn("Multiple values for key={}: current={}, previous={}", key, value, prev);
                     }
                 }
 
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java
index e9ad39e41..ac8bf3f1f 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java
@@ -103,7 +103,7 @@ public final class KeyUtils {
     /**
      * The most commonly used RSA public key exponent
      */
-    public static final BigInteger DEFAULT_RSA_PUBLIC_EXPONENT = new BigInteger("65537");
+    public static final BigInteger DEFAULT_RSA_PUBLIC_EXPONENT = BigInteger.valueOf(65537);
 
     /**
      * Name of algorithm for DSS keys to be used when calling security provider
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/impl/AbstractPublicKeyEntryDecoder.java b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/impl/AbstractPublicKeyEntryDecoder.java
index f0ebec6dd..71bbe8b3e 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/impl/AbstractPublicKeyEntryDecoder.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/impl/AbstractPublicKeyEntryDecoder.java
@@ -51,7 +51,7 @@ public abstract class AbstractPublicKeyEntryDecoder<PUB extends PublicKey, PRV e
         try {
             boolVal = PropertyResolverUtils.parseBoolean(stringVal);
         } catch (IllegalArgumentException e) {
-            log.warn("Ignoring non-boolean property value for \"" + propertyKey + "\": " + stringVal);
+            log.warn("Ignoring non-boolean property value for \"{}\": {}", propertyKey, stringVal);
             boolVal = null;
         }
         if (boolVal == null) {
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHDSSPrivateKeyEntryDecoder.java b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHDSSPrivateKeyEntryDecoder.java
index 074a52236..32d4c3d58 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHDSSPrivateKeyEntryDecoder.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHDSSPrivateKeyEntryDecoder.java
@@ -70,16 +70,7 @@ public class OpenSSHDSSPrivateKeyEntryDecoder extends AbstractPrivateKeyEntryDec
         Objects.requireNonNull(y, "No public key data"); // TODO run some validation on it
         BigInteger x = KeyEntryResolver.decodeBigInt(keyData);
 
-        try {
-            return generatePrivateKey(new DSAPrivateKeySpec(x, p, q, g));
-        } finally {
-            // get rid of sensitive data a.s.a.p
-            p = null;
-            q = null;
-            g = null;
-            y = null;
-            x = null;
-        }
+        return generatePrivateKey(new DSAPrivateKeySpec(x, p, q, g));
     }
 
     @Override
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHECDSAPrivateKeyEntryDecoder.java b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHECDSAPrivateKeyEntryDecoder.java
index 3535fe76f..0a5669695 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHECDSAPrivateKeyEntryDecoder.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHECDSAPrivateKeyEntryDecoder.java
@@ -81,12 +81,7 @@ public class OpenSSHECDSAPrivateKeyEntryDecoder extends AbstractPrivateKeyEntryD
         Objects.requireNonNull(pubKey, "No public point"); // TODO validate it is a valid ECPoint
         BigInteger s = KeyEntryResolver.decodeBigInt(keyData);
         ECParameterSpec params = curve.getParameters();
-        try {
-            return generatePrivateKey(new ECPrivateKeySpec(s, params));
-        } finally {
-            // get rid of sensitive data a.s.a.p
-            s = null;
-        }
+        return generatePrivateKey(new ECPrivateKeySpec(s, params));
     }
 
     @Override
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHRSAPrivateKeyDecoder.java b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHRSAPrivateKeyDecoder.java
index 1df1d52fb..34ff03e71 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHRSAPrivateKeyDecoder.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/loader/openssh/OpenSSHRSAPrivateKeyDecoder.java
@@ -48,7 +48,7 @@ import org.apache.sshd.common.util.security.SecurityUtils;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public class OpenSSHRSAPrivateKeyDecoder extends AbstractPrivateKeyEntryDecoder<RSAPublicKey, RSAPrivateKey> {
-    public static final BigInteger DEFAULT_PUBLIC_EXPONENT = new BigInteger("65537");
+    public static final BigInteger DEFAULT_PUBLIC_EXPONENT = KeyUtils.DEFAULT_RSA_PUBLIC_EXPONENT;
     public static final OpenSSHRSAPrivateKeyDecoder INSTANCE = new OpenSSHRSAPrivateKeyDecoder();
 
     public OpenSSHRSAPrivateKeyDecoder() {
@@ -79,16 +79,8 @@ public class OpenSSHRSAPrivateKeyDecoder extends AbstractPrivateKeyEntryDecoder<
         if (!Objects.equals(n, modulus)) {
             log.warn("decodePrivateKey({}) mismatched modulus values: encoded={}, calculated={}", keyType, n, modulus);
         }
-        try {
-            return generatePrivateKey(new RSAPrivateCrtKeySpec(
-                    n, e, d, p, q, d.mod(p.subtract(BigInteger.ONE)), d.mod(q.subtract(BigInteger.ONE)), inverseQmodP));
-        } finally {
-            // get rid of sensitive data a.s.a.p
-            d = null;
-            inverseQmodP = null;
-            p = null;
-            q = null;
-        }
+        return generatePrivateKey(new RSAPrivateCrtKeySpec(n, e, d, p, q, d.mod(p.subtract(BigInteger.ONE)),
+                d.mod(q.subtract(BigInteger.ONE)), inverseQmodP));
     }
 
     @Override
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/file/util/BaseFileSystem.java b/sshd-common/src/main/java/org/apache/sshd/common/file/util/BaseFileSystem.java
index 08e2332c3..a5d099e8c 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/file/util/BaseFileSystem.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/file/util/BaseFileSystem.java
@@ -41,7 +41,7 @@ public abstract class BaseFileSystem<T extends Path> extends FileSystem {
     protected final Logger log;
     private final FileSystemProvider fileSystemProvider;
 
-    public BaseFileSystem(FileSystemProvider fileSystemProvider) {
+    protected BaseFileSystem(FileSystemProvider fileSystemProvider) {
         this.log = LoggerFactory.getLogger(getClass());
         this.fileSystemProvider = Objects.requireNonNull(fileSystemProvider, "No file system provider");
     }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/file/util/BasePath.java b/sshd-common/src/main/java/org/apache/sshd/common/file/util/BasePath.java
index 021ffcd45..9fe527172 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/file/util/BasePath.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/file/util/BasePath.java
@@ -47,7 +47,7 @@ public abstract class BasePath<T extends BasePath<T, FS>, FS extends BaseFileSys
     private String strValue;
     private int hashValue;
 
-    public BasePath(FS fileSystem, String root, List<String> names) {
+    protected BasePath(FS fileSystem, String root, List<String> names) {
         this.fileSystem = Objects.requireNonNull(fileSystem, "No file system provided");
         this.root = root;
         this.names = names;
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java b/sshd-common/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
index efd090348..764cfa704 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/io/AbstractIoWriteFuture.java
@@ -20,6 +20,7 @@
 package org.apache.sshd.common.io;
 
 import java.io.IOException;
+import java.util.Objects;
 
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.future.DefaultVerifiableSshFuture;
@@ -62,4 +63,11 @@ public abstract class AbstractIoWriteFuture
             return null;
         }
     }
+
+    public static IoWriteFuture fulfilled(Object id, Object value) {
+        AbstractIoWriteFuture result = new AbstractIoWriteFuture(id, null) {
+        };
+        result.setValue(Objects.requireNonNull(value));
+        return result;
+    }
 }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
index 22f17bc6b..09c863b89 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
@@ -105,7 +105,7 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("resetCacheMap(" + resources + ") removed previous cached keys for " + toDelete);
+            log.debug("resetCacheMap({}) removed previous cached keys for {}", resources, toDelete);
         }
     }
 
@@ -208,10 +208,8 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
 
         @Override
         public KeyPair next() {
-            if (!nextKeyPairSet) {
-                if (!setNextObject()) {
-                    throw new NoSuchElementException("Out of files to try");
-                }
+            if (!nextKeyPairSet && !setNextObject()) {
+                throw new NoSuchElementException("Out of files to try");
             }
             nextKeyPairSet = false;
             return nextKeyPair;
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
index 4e94416ce..4fa3cefa4 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
@@ -192,7 +192,7 @@ public interface KeyIdentityProvider {
      * @return     The first non-{@code null} key pair found in the iterator - {@code null} if all elements exhausted
      *             without such an entry
      */
-    static KeyPair exhaustCurrentIdentities(Iterator<? extends KeyPair> ids) {
+    static KeyPair exhaustCurrentIdentities(Iterator<KeyPair> ids) {
         while ((ids != null) && ids.hasNext()) {
             KeyPair kp = ids.next();
             if (kp != null) {
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
index 8b58c2157..578576bbd 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
@@ -51,7 +51,7 @@ public class MappedKeyPairProvider implements KeyPairProvider {
         this(GenericUtils.isEmpty(pairs) ? Collections.emptyList() : Arrays.asList(pairs));
     }
 
-    public MappedKeyPairProvider(Collection<? extends KeyPair> pairs) {
+    public MappedKeyPairProvider(Collection<KeyPair> pairs) {
         this(mapUniquePairs(pairs));
     }
 
@@ -79,7 +79,7 @@ public class MappedKeyPairProvider implements KeyPairProvider {
         return String.valueOf(pairsMap.keySet());
     }
 
-    public static Map<String, KeyPair> mapUniquePairs(Collection<? extends KeyPair> pairs) {
+    public static Map<String, KeyPair> mapUniquePairs(Collection<KeyPair> pairs) {
         if (GenericUtils.isEmpty(pairs)) {
             return Collections.emptyMap();
         }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/mac/BaseMac.java b/sshd-common/src/main/java/org/apache/sshd/common/mac/BaseMac.java
index 036d46f17..409d7b500 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/mac/BaseMac.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/mac/BaseMac.java
@@ -88,7 +88,7 @@ public class BaseMac implements Mac {
     }
 
     @Override
-    public void update(byte buf[], int offset, int len) {
+    public void update(byte[] buf, int offset, int len) {
         mac.update(buf, offset, len);
     }
 
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java b/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java
index d1677881c..c687dd723 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java
@@ -119,7 +119,7 @@ public abstract class AbstractSignature implements Signature {
      *                       data - {@code null} if not encoded
      */
     protected Map.Entry<String, byte[]> extractEncodedSignature(byte[] sig, Collection<String> expectedTypes) {
-        return GenericUtils.isEmpty(expectedTypes) ? null : extractEncodedSignature(sig, k -> expectedTypes.contains(k));
+        return GenericUtils.isEmpty(expectedTypes) ? null : extractEncodedSignature(sig, expectedTypes::contains);
     }
 
     protected Map.Entry<String, byte[]> extractEncodedSignature(byte[] sig, Predicate<? super String> typeSelector) {
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/signature/SignatureDSA.java b/sshd-common/src/main/java/org/apache/sshd/common/signature/SignatureDSA.java
index cc48088a4..b5620be43 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/signature/SignatureDSA.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/signature/SignatureDSA.java
@@ -101,7 +101,7 @@ public class SignatureDSA extends AbstractSignature {
 
         if (sigLen != DSA_SIGNATURE_LENGTH) {
             // probably some encoded data
-            Map.Entry<String, byte[]> encoding = extractEncodedSignature(sig, k -> KeyPairProvider.SSH_DSS.equalsIgnoreCase(k));
+            Map.Entry<String, byte[]> encoding = extractEncodedSignature(sig, KeyPairProvider.SSH_DSS::equalsIgnoreCase);
             if (encoding != null) {
                 String keyType = encoding.getKey();
                 ValidateUtils.checkTrue(
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/ExceptionUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/ExceptionUtils.java
index 64aae6821..7a1158dcf 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/ExceptionUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/ExceptionUtils.java
@@ -123,10 +123,7 @@ public final class ExceptionUtils {
                 return peelException(target);
             }
         } else if (t instanceof ExecutionException) {
-            Throwable wrapped = resolveExceptionCause(t);
-            if (wrapped != null) {
-                return peelException(wrapped);
-            }
+            return peelException(resolveExceptionCause(t));
         } else if (t instanceof MBeanException) {
             Throwable target = ((MBeanException) t).getTargetException();
             if (target != null) {
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java
index 445bcbe17..8ca104790 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java
@@ -780,13 +780,13 @@ public final class GenericUtils {
             return null;
         } else if (it instanceof Deque<?>) { // check before (!) instanceof List since LinkedList implements List
             Deque<? extends T> l = (Deque<? extends T>) it;
-            return (l.size() > 0) ? l.getFirst() : null;
+            return !l.isEmpty() ? l.getFirst() : null;
         } else if (it instanceof List<?>) {
             List<? extends T> l = (List<? extends T>) it;
-            return (l.size() > 0) ? l.get(0) : null;
+            return !l.isEmpty() ? l.get(0) : null;
         } else if (it instanceof SortedSet<?>) {
             SortedSet<? extends T> s = (SortedSet<? extends T>) it;
-            return (s.size() > 0) ? s.first() : null;
+            return !s.isEmpty() ? s.first() : null;
         } else {
             Iterator<? extends T> iter = it.iterator();
             return ((iter == null) || (!iter.hasNext())) ? null : iter.next();
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/SelectorUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
index 3bf04fdcd..b400b7b40 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
@@ -235,8 +235,6 @@ public final class SelectorUtils {
 
             String subDir = strDirs.get(strIdxStart);
             if (!match(patDir, subDir, isCaseSensitive)) {
-                patDirs = null;
-                strDirs = null;
                 return false;
             }
 
@@ -249,8 +247,6 @@ public final class SelectorUtils {
             for (int i = patIdxStart; i <= patIdxEnd; i++) {
                 String subPat = patDirs.get(i);
                 if (!subPat.equals("**")) {
-                    patDirs = null;
-                    strDirs = null;
                     return false;
                 }
             }
@@ -258,8 +254,6 @@ public final class SelectorUtils {
         } else {
             if (patIdxStart > patIdxEnd) {
                 // String not exhausted, but pattern is. Failure.
-                patDirs = null;
-                strDirs = null;
                 return false;
             }
         }
@@ -273,8 +267,6 @@ public final class SelectorUtils {
 
             String subDir = strDirs.get(strIdxEnd);
             if (!match(patDir, subDir, isCaseSensitive)) {
-                patDirs = null;
-                strDirs = null;
                 return false;
             }
 
@@ -287,8 +279,6 @@ public final class SelectorUtils {
             for (int i = patIdxStart; i <= patIdxEnd; i++) {
                 String subPat = patDirs.get(i);
                 if (!subPat.equals("**")) {
-                    patDirs = null;
-                    strDirs = null;
                     return false;
                 }
             }
@@ -328,8 +318,6 @@ public final class SelectorUtils {
             }
 
             if (foundIdx == -1) {
-                patDirs = null;
-                strDirs = null;
                 return false;
             }
 
@@ -340,8 +328,6 @@ public final class SelectorUtils {
         for (int i = patIdxStart; i <= patIdxEnd; i++) {
             String subPat = patDirs.get(i);
             if (!subPat.equals("**")) {
-                patDirs = null;
-                strDirs = null;
                 return false;
             }
         }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/ValidateUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/ValidateUtils.java
index 5b3cb3899..7fcde1cc4 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/ValidateUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/ValidateUtils.java
@@ -70,61 +70,61 @@ public final class ValidateUtils {
     }
 
     public static <K, V, M extends Map<K, V>> M checkNotNullAndNotEmpty(M t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
+        checkNotNull(t, message, args);
         checkTrue(MapEntryUtils.size(t) > 0, message, args);
         return t;
     }
 
     public static <T, C extends Collection<T>> C checkNotNullAndNotEmpty(C t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
+        checkNotNull(t, message, args);
         checkTrue(GenericUtils.size(t) > 0, message, args);
         return t;
     }
 
     public static <T, C extends Iterable<T>> C checkNotNullAndNotEmpty(C t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
+        checkNotNull(t, message, args);
         checkTrue(GenericUtils.isNotEmpty(t), message, args);
         return t;
     }
 
     public static byte[] checkNotNullAndNotEmpty(byte[] a, String message) {
-        a = checkNotNull(a, message);
+        checkNotNull(a, message);
         checkTrue(NumberUtils.length(a) > 0, message);
         return a;
     }
 
     public static byte[] checkNotNullAndNotEmpty(byte[] a, String message, Object... args) {
-        a = checkNotNull(a, message, args);
+        checkNotNull(a, message, args);
         checkTrue(NumberUtils.length(a) > 0, message, args);
         return a;
     }
 
     public static char[] checkNotNullAndNotEmpty(char[] a, String message) {
-        a = checkNotNull(a, message);
+        checkNotNull(a, message);
         checkTrue(GenericUtils.length(a) > 0, message);
         return a;
     }
 
     public static char[] checkNotNullAndNotEmpty(char[] a, String message, Object... args) {
-        a = checkNotNull(a, message, args);
+        checkNotNull(a, message, args);
         checkTrue(GenericUtils.length(a) > 0, message, args);
         return a;
     }
 
     public static int[] checkNotNullAndNotEmpty(int[] a, String message) {
-        a = checkNotNull(a, message);
+        checkNotNull(a, message);
         checkTrue(NumberUtils.length(a) > 0, message);
         return a;
     }
 
     public static int[] checkNotNullAndNotEmpty(int[] a, String message, Object... args) {
-        a = checkNotNull(a, message, args);
+        checkNotNull(a, message, args);
         checkTrue(NumberUtils.length(a) > 0, message, args);
         return a;
     }
 
     public static <T> T[] checkNotNullAndNotEmpty(T[] t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
+        checkNotNull(t, message, args);
         checkTrue(GenericUtils.length(t) > 0, message, args);
         return t;
     }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java b/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
index 202db611f..dd09e7e69 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
@@ -54,7 +54,7 @@ public class FuturesCloseable<T extends SshFuture> extends SimpleCloseable {
             SshFutureListener<T> listener = f -> {
                 int pendingCount = count.decrementAndGet();
                 if (traceEnabled) {
-                    log.trace("doClose(" + immediately + ") complete pending: " + pendingCount);
+                    log.trace("doClose({}) complete pending: {}", immediately, pendingCount);
                 }
                 if (pendingCount == 0) {
                     future.setClosed();
@@ -65,7 +65,7 @@ public class FuturesCloseable<T extends SshFuture> extends SimpleCloseable {
                 if (f != null) {
                     int pendingCount = count.incrementAndGet();
                     if (traceEnabled) {
-                        log.trace("doClose(" + immediately + ") future pending: " + pendingCount);
+                        log.trace("doClose({}) future pending: {}", immediately, pendingCount);
                     }
                     f.addListener(listener);
                 }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java b/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
index 127ea662a..67a142c9e 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
@@ -46,7 +46,7 @@ public class ParallelCloseable extends SimpleCloseable {
         SshFutureListener<CloseFuture> listener = f -> {
             int pendingCount = count.decrementAndGet();
             if (traceEnabled) {
-                log.trace("doClose(" + immediately + ") completed pending: " + pendingCount);
+                log.trace("doClose({}) completed pending: {}", immediately, pendingCount);
             }
             if (pendingCount == 0) {
                 future.setClosed();
@@ -60,7 +60,7 @@ public class ParallelCloseable extends SimpleCloseable {
 
             int pendingCount = count.incrementAndGet();
             if (traceEnabled) {
-                log.trace("doClose(" + immediately + ") pending closeables: " + pendingCount);
+                log.trace("doClose({}) pending closeables: {}", immediately, pendingCount);
             }
             c.close(immediately).addListener(listener);
         }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/io/PathScanningMatcher.java b/sshd-common/src/main/java/org/apache/sshd/common/util/io/PathScanningMatcher.java
index 9dcaba473..e828daed6 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/io/PathScanningMatcher.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/io/PathScanningMatcher.java
@@ -84,7 +84,7 @@ public abstract class PathScanningMatcher {
                 ? Collections.emptyList()
                 : Collections.unmodifiableList(
                         includes.stream()
-                                .map(v -> normalizePattern(v))
+                                .map(PathScanningMatcher::normalizePattern)
                                 .collect(Collectors.toCollection(() -> new ArrayList<>(includes.size()))));
     }
 
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java
index 7acb34fb7..22fdada54 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java
@@ -243,7 +243,7 @@ public final class SecurityUtils {
                 }
             } else {
                 Logger logger = LoggerFactory.getLogger(SecurityUtils.class);
-                logger.info("Override ECC support value: " + propValue);
+                logger.info("Override ECC support value: {}", propValue);
                 hasEcc = Boolean.valueOf(propValue);
             }
         }
@@ -349,7 +349,7 @@ public final class SecurityUtils {
         ValidateUtils.checkTrue(maxKeySize > Byte.SIZE, "Invalid max. key size: %d", maxKeySize);
 
         try {
-            BigInteger r = new BigInteger("0").setBit(maxKeySize - 1);
+            BigInteger r = BigInteger.ZERO.setBit(maxKeySize - 1);
             DHParameterSpec dhSkipParamSpec = new DHParameterSpec(r, r);
             KeyPairGenerator kpg = getKeyPairGenerator("DH");
             kpg.initialize(dhSkipParamSpec);
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/security/bouncycastle/BouncyCastleRandom.java b/sshd-common/src/main/java/org/apache/sshd/common/util/security/bouncycastle/BouncyCastleRandom.java
index 3e44243ec..12c981156 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/security/bouncycastle/BouncyCastleRandom.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/security/bouncycastle/BouncyCastleRandom.java
@@ -74,7 +74,7 @@ public final class BouncyCastleRandom extends AbstractRandom {
 
     private int next(int numBits) {
         int bytes = (numBits + 7) / 8;
-        byte next[] = new byte[bytes];
+        byte[] next = new byte[bytes];
         int ret = 0;
         random.nextBytes(next);
         for (int i = 0; i < bytes; i++) {
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/EdDSASecurityProviderUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/EdDSASecurityProviderUtils.java
index a142196e4..058472cfd 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/EdDSASecurityProviderUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/EdDSASecurityProviderUtils.java
@@ -76,10 +76,8 @@ public final class EdDSASecurityProviderUtils {
         }
 
         if ((k1 instanceof EdDSAPublicKey) && (k2 instanceof EdDSAPublicKey)) {
-            if (Objects.equals(k1, k2)) {
+            if (k1.equals(k2)) {
                 return true;
-            } else if (k1 == null || k2 == null) {
-                return false; // both null is covered by Objects#equals
             }
 
             EdDSAPublicKey ed1 = (EdDSAPublicKey) k1;
@@ -136,10 +134,8 @@ public final class EdDSASecurityProviderUtils {
         }
 
         if ((k1 instanceof EdDSAPrivateKey) && (k2 instanceof EdDSAPrivateKey)) {
-            if (Objects.equals(k1, k2)) {
+            if (k1.equals(k2)) {
                 return true;
-            } else if (k1 == null || k2 == null) {
-                return false; // both null is covered by Objects#equals
             }
 
             EdDSAPrivateKey ed1 = (EdDSAPrivateKey) k1;
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/SignatureEd25519.java b/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/SignatureEd25519.java
index f5dcba522..bba78751d 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/SignatureEd25519.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/security/eddsa/SignatureEd25519.java
@@ -38,7 +38,7 @@ public class SignatureEd25519 extends AbstractSignature {
     public boolean verify(SessionContext session, byte[] sig) throws Exception {
         byte[] data = sig;
         Map.Entry<String, byte[]> encoding
-                = extractEncodedSignature(data, k -> KeyPairProvider.SSH_ED25519.equalsIgnoreCase(k));
+                = extractEncodedSignature(data, KeyPairProvider.SSH_ED25519::equalsIgnoreCase);
         if (encoding != null) {
             String keyType = encoding.getKey();
             ValidateUtils.checkTrue(
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java
index b93e81ed5..9f2b3be73 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/threads/ThreadUtils.java
@@ -241,7 +241,7 @@ public final class ThreadUtils {
                         Thread thread = Thread.currentThread();
                         return thread.getContextClassLoader();
                     },
-                    () -> effectiveAnchor.getClassLoader(),
+                    effectiveAnchor::getClassLoader,
                     ClassLoader::getSystemClassLoader
             };
 
diff --git a/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java b/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
index 67a2565a9..f8cb53334 100644
--- a/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
@@ -123,7 +123,7 @@ public abstract class AbstractGeneratorHostKeyProvider
             ids = keyPairHolder.getAndSet(null);
         }
 
-        if ((ids != null) & log.isDebugEnabled()) {
+        if ((ids != null) && log.isDebugEnabled()) {
             log.debug("clearLoadedKeys({}) removed keys", getPath());
         }
     }
@@ -287,7 +287,7 @@ public abstract class AbstractGeneratorHostKeyProvider
         KeyPairGenerator generator = SecurityUtils.getKeyPairGenerator(algorithm);
         if (keySpec != null) {
             generator.initialize(keySpec);
-            log.info("generateKeyPair(" + algorithm + ") generating host key - spec=" + keySpec.getClass().getSimpleName());
+            log.info("generateKeyPair({}) generating host key - spec={}", algorithm, keySpec.getClass().getSimpleName());
         } else if (KeyUtils.EC_ALGORITHM.equals(algorithm)) {
             ECCurves curve;
             // If left to our own devices choose the biggest key size possible
@@ -301,10 +301,10 @@ public abstract class AbstractGeneratorHostKeyProvider
                 }
             }
             generator.initialize(curve.getParameters());
-            log.info("generateKeyPair(" + algorithm + ") generating host key=" + curve);
+            log.info("generateKeyPair({}) generating host key={}", algorithm, curve);
         } else if (keySize != 0) {
             generator.initialize(keySize);
-            log.info("generateKeyPair(" + algorithm + ") generating host key - size=" + keySize);
+            log.info("generateKeyPair({}) generating host key - size={}", algorithm, keySize);
         }
 
         return generator.generateKeyPair();
diff --git a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
index ec8d53dce..2a3944c0a 100644
--- a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
@@ -153,7 +153,7 @@ public class BuiltinClientIdentitiesWatcherTest extends JUnitTestSupport {
     }
 
     private static void testMultipleFilesWatch(
-            String phase, KeyIdentityProvider watcher, Collection<? extends KeyPair> expected)
+            String phase, KeyIdentityProvider watcher, Collection<KeyPair> expected)
             throws IOException, GeneralSecurityException {
         Iterable<KeyPair> keys = watcher.loadKeys(null);
         Collection<KeyPair> actual = new ArrayList<>();
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/config/keys/writer/openssh/OpenSSHKeyPairResourceWriterTest.java b/sshd-common/src/test/java/org/apache/sshd/common/config/keys/writer/openssh/OpenSSHKeyPairResourceWriterTest.java
index f042f8d23..e25567d1a 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/config/keys/writer/openssh/OpenSSHKeyPairResourceWriterTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/config/keys/writer/openssh/OpenSSHKeyPairResourceWriterTest.java
@@ -53,10 +53,8 @@ import org.apache.sshd.util.test.JUnitTestSupport;
 import org.apache.sshd.util.test.NoIoTestCase;
 import org.junit.Before;
 import org.junit.FixMethodOrder;
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.MethodSorters;
 import org.junit.runners.Parameterized;
@@ -68,8 +66,6 @@ import org.junit.runners.Parameterized.UseParametersRunnerFactory;
 @UseParametersRunnerFactory(JUnit4ClassRunnerWithParametersFactory.class)
 @Category({ NoIoTestCase.class })
 public class OpenSSHKeyPairResourceWriterTest extends JUnitTestSupport {
-    @Rule
-    public TemporaryFolder folder = new TemporaryFolder();
 
     private final TestData data;
     private KeyPair testKey;
diff --git a/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java b/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
index 6d4758c4a..829f25bcd 100644
--- a/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
+++ b/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
@@ -462,7 +462,7 @@ public final class CommonTestSupportUtils {
 
     public static KeyPair getFirstKeyPair(KeyIdentityProvider provider) {
         Objects.requireNonNull(provider, "No key pair provider");
-        Iterable<? extends KeyPair> pairs;
+        Iterable<KeyPair> pairs;
         try {
             pairs = Objects.requireNonNull(provider.loadKeys(null), "No loaded keys");
         } catch (IOException | GeneralSecurityException e) {
@@ -471,7 +471,7 @@ public final class CommonTestSupportUtils {
                     e);
         }
 
-        Iterator<? extends KeyPair> iter = Objects.requireNonNull(pairs.iterator(), "No keys iterator");
+        Iterator<KeyPair> iter = Objects.requireNonNull(pairs.iterator(), "No keys iterator");
         ValidateUtils.checkTrue(iter.hasNext(), "Empty loaded kyes iterator");
         return Objects.requireNonNull(iter.next(), "No key pair in iterator");
     }
diff --git a/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/channel/throttle/ThrottlingChannelStreamWriter.java b/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/channel/throttle/ThrottlingChannelStreamWriter.java
index addf08860..bf8a654dc 100644
--- a/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/channel/throttle/ThrottlingChannelStreamWriter.java
+++ b/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/channel/throttle/ThrottlingChannelStreamWriter.java
@@ -197,7 +197,7 @@ public class ThrottlingChannelStreamWriter extends AbstractLoggingBean
     public void close() throws IOException {
         if (open.getAndSet(false)) {
             if (log.isDebugEnabled()) {
-                log.debug("close({}) closing");
+                log.debug("close({}) closing", this);
             }
         }
 
diff --git a/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/signature/LegacyDSASigner.java b/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/signature/LegacyDSASigner.java
index 63afc604d..8bb963ecb 100644
--- a/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/signature/LegacyDSASigner.java
+++ b/sshd-contrib/src/main/java/org/apache/sshd/contrib/common/signature/LegacyDSASigner.java
@@ -244,7 +244,7 @@ public class LegacyDSASigner extends java.security.Signature {
             }
 
             BigInteger q = params.getQ();
-            if ((r.compareTo(q) != -1) || (s.compareTo(q) != -1)) {
+            if ((r.compareTo(q) >= 0) || (s.compareTo(q) >= 0)) {
                 throw new IndexOutOfBoundsException("Out of range values in signature");
             }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java
index a0fa391a9..8548cb69a 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/common/AbstractAgentProxy.java
@@ -242,7 +242,7 @@ public abstract class AbstractAgentProxy extends AbstractLoggingBean implements
         if ((service != null) && (!service.isShutdown())) {
             Collection<?> runners = service.shutdownNow();
             if (log.isDebugEnabled()) {
-                log.debug("close() - shutdown runners count=" + GenericUtils.size(runners));
+                log.debug("close() - shutdown runners count={}", GenericUtils.size(runners));
             }
         }
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentServerProxy.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentServerProxy.java
index 66cff0fa8..7cd0b53f0 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentServerProxy.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentServerProxy.java
@@ -54,9 +54,7 @@ public class AgentServerProxy extends AbstractLoggingBean implements SshAgentSer
             return channel.getAgent();
         } catch (Throwable t) {
             if (log.isDebugEnabled()) {
-                log.warn("createClient(" + service.getSession() + ")[" + getId() + ")"
-                         + " failed (" + t.getClass().getSimpleName() + ")"
-                         + " to create client: " + t.getMessage());
+                log.warn("createClient({})[{}] failed to create client: {}", service.getSession(), getId(), t.toString());
             }
 
             if (t instanceof IOException) {
@@ -81,7 +79,7 @@ public class AgentServerProxy extends AbstractLoggingBean implements SshAgentSer
     public void close() throws IOException {
         if (open.getAndSet(false)) {
             if (log.isDebugEnabled()) {
-                log.debug("closed(" + service.getSession() + ")[" + getId() + "]");
+                log.debug("closed({})[{}]", service.getSession(), getId());
             }
         }
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServer.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServer.java
index 59f47ede3..9dac098a6 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServer.java
@@ -125,7 +125,7 @@ public class AgentServer extends AbstractLoggingBean implements Closeable, Execu
         if ((executor != null) && (!executor.isShutdown())) {
             Collection<?> runners = executor.shutdownNow();
             if (log.isDebugEnabled()) {
-                log.debug("Shut down runners count=" + GenericUtils.size(runners));
+                log.debug("Shut down runners count={}", GenericUtils.size(runners));
             }
         }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java
index d88532937..cb49b5d8a 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AgentServerProxy.java
@@ -179,7 +179,7 @@ public class AgentServerProxy extends AbstractLoggingBean implements SshAgentSer
         if ((executor != null) && (!executor.isShutdown())) {
             Collection<?> runners = executor.shutdownNow();
             if (debugEnabled) {
-                log.debug("Shut down runners count=" + GenericUtils.size(runners));
+                log.debug("Shut down runners count={}", GenericUtils.size(runners));
             }
         }
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java
index 43921f4db..505b99298 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/AprLibrary.java
@@ -56,12 +56,10 @@ public final class AprLibrary {
     private AprLibrary() {
         try {
             Library.initialize(null);
+        } catch (RuntimeException e) {
+            throw e;
         } catch (Throwable e) {
-            if (e instanceof RuntimeException) {
-                throw (RuntimeException) e;
-            } else {
-                throw new RuntimeException("Error loading Apache Portable Runtime (APR).", e);
-            }
+            throw new RuntimeException("Error loading Apache Portable Runtime (APR).", e);
         }
         pool = Pool.create(0);
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
index 11091d979..e24274b68 100644
--- a/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
+++ b/sshd-core/src/main/java/org/apache/sshd/agent/unix/ChannelAgentForwarding.java
@@ -132,7 +132,7 @@ public class ChannelAgentForwarding extends AbstractServerChannel {
             if (forwardService != null) {
                 Collection<?> runners = forwardService.shutdownNow();
                 if (log.isDebugEnabled()) {
-                    log.debug("Shut down runners count=" + GenericUtils.size(runners));
+                    log.debug("Shut down runners count={}", GenericUtils.size(runners));
                 }
             }
         } finally {
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
index e74695415..2df1f8619 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java
@@ -43,7 +43,7 @@ public class DefaultConnectFuture extends DefaultVerifiableSshFuture<ConnectFutu
         long endTime = System.nanoTime();
         if (log.isDebugEnabled()) {
             IoSession ioSession = session.getIoSession();
-            log.debug("Connected to " + ioSession.getRemoteAddress() + " after " + (endTime - startTime) + " nanos");
+            log.debug("Connected to {} after {} nanos", ioSession.getRemoteAddress(), endTime - startTime);
         }
         return this;
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
index 014cc46c0..202ef8fd2 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/AbstractChannel.java
@@ -346,11 +346,7 @@ public abstract class AbstractChannel extends AbstractInnerCloseable implements
         }
 
         if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) {
-            return new AbstractIoWriteFuture(req, null) {
-                {
-                    setValue(Boolean.TRUE);
-                }
-            };
+            return AbstractIoWriteFuture.fulfilled(req, Boolean.TRUE);
         }
 
         byte cmd = RequestHandler.Result.ReplySuccess.equals(result)
@@ -412,14 +408,10 @@ public abstract class AbstractChannel extends AbstractInnerCloseable implements
                 signalChannelOpenSuccess(l);
                 return null;
             });
+        } catch (Error | RuntimeException err) {
+            throw err;
         } catch (Throwable err) {
-            if (err instanceof RuntimeException) {
-                throw (RuntimeException) err;
-            } else if (err instanceof Error) {
-                throw (Error) err;
-            } else {
-                throw new RuntimeException(err);
-            }
+            throw new RuntimeException(err);
         }
     }
 
@@ -782,11 +774,7 @@ public abstract class AbstractChannel extends AbstractInnerCloseable implements
         if (log.isDebugEnabled()) {
             log.debug("writePacket({}) Discarding output packet because channel state={}", this, state);
         }
-        return new AbstractIoWriteFuture(toString(), null) {
-            {
-                setValue(new EOFException("Channel is being closed"));
-            }
-        };
+        return AbstractIoWriteFuture.fulfilled(toString(), new EOFException("Channel is being closed"));
     }
 
     protected boolean mayWrite() {
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
index f50f03019..1e3a23c35 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
@@ -31,7 +31,6 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.apache.sshd.common.Closeable;
 import org.apache.sshd.common.PropertyResolver;
 import org.apache.sshd.common.channel.exception.SshChannelBufferedOutputException;
-import org.apache.sshd.common.future.SshFutureListener;
 import org.apache.sshd.common.io.IoOutputStream;
 import org.apache.sshd.common.io.IoWriteFuture;
 import org.apache.sshd.common.util.ValidateUtils;
@@ -187,16 +186,13 @@ public class BufferedIoOutputStream extends AbstractInnerCloseable implements Io
 
         Buffer buffer = future.getBuffer();
         int bufferSize = buffer.available();
-        out.writeBuffer(buffer).addListener(new SshFutureListener<IoWriteFuture>() {
-            @Override
-            public void operationComplete(IoWriteFuture f) {
-                if (f.isWritten()) {
-                    future.setValue(Boolean.TRUE);
-                } else {
-                    future.setValue(f.getException());
-                }
-                finishWrite(future, bufferSize);
+        out.writeBuffer(buffer).addListener(f -> {
+            if (f.isWritten()) {
+                future.setValue(Boolean.TRUE);
+            } else {
+                future.setValue(f.getException());
             }
+            finishWrite(future, bufferSize);
         });
     }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
index 7d8c66bb8..54617109c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelAsyncInputStream.java
@@ -172,7 +172,7 @@ public class ChannelAsyncInputStream extends AbstractCloseable implements IoInpu
             Number result = verifyResult(Number.class, timeoutMillis);
             long endTime = System.nanoTime();
             if (log.isDebugEnabled()) {
-                log.debug("Read " + result + " bytes after " + (endTime - startTime) + " nanos");
+                log.debug("Read {} bytes after {} nanos", result, endTime - startTime);
             }
 
             return this;
@@ -197,7 +197,7 @@ public class ChannelAsyncInputStream extends AbstractCloseable implements IoInpu
                 throw formatExceptionMessage(
                         IllegalStateException::new,
                         "Unknown read value type: %s",
-                        (v == null) ? "null" : v.getClass().getName());
+                        v.getClass().getName());
             }
         }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java
index 2b7176538..eb4aa3875 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/forward/DefaultForwarder.java
@@ -223,7 +223,7 @@ public class DefaultForwarder
 
         try {
             if (log.isDebugEnabled()) {
-                log.debug("startLocalPortForwarding(" + local + " -> " + remote + "): " + result);
+                log.debug("startLocalPortForwarding({} -> {}): {}", local, remote, result);
             }
             signalEstablishedExplicitTunnel(local, remote, true, result, null);
             return result;
@@ -325,7 +325,7 @@ public class DefaultForwarder
         try {
             SshdSocketAddress bound = new SshdSocketAddress(remoteHost, port);
             if (log.isDebugEnabled()) {
-                log.debug("startRemotePortForwarding(" + remote + " -> " + local + "): " + bound);
+                log.debug("startRemotePortForwarding({} -> {}): {}", remote, local, bound);
             }
 
             signalEstablishedExplicitTunnel(local, remote, false, bound, null);
@@ -346,7 +346,7 @@ public class DefaultForwarder
 
         if (bound != null) {
             if (log.isDebugEnabled()) {
-                log.debug("stopRemotePortForwarding(" + remote + ") cancel forwarding to " + bound);
+                log.debug("stopRemotePortForwarding({}) cancel forwarding to {}", remote, bound);
             }
 
             String remoteHost = remote.getHostName();
@@ -368,7 +368,7 @@ public class DefaultForwarder
             signalTornDownExplicitTunnel(bound, false, remote, null);
         } else {
             if (log.isDebugEnabled()) {
-                log.debug("stopRemotePortForwarding(" + remote + ") no binding found");
+                log.debug("stopRemotePortForwarding({}) no binding found", remote);
             }
         }
     }
@@ -381,19 +381,13 @@ public class DefaultForwarder
                 signalTearingDownExplicitTunnel(l, boundAddress, localForwarding, remote);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal tearing down explicit tunnel for local=" + localForwarding
-                                      + " on bound=" + boundAddress,
-                        t);
-            }
+            throw new IOException(
+                    "Failed (" + t.getClass().getSimpleName() + ")" + " to signal tearing down explicit tunnel for local="
+                                  + localForwarding + " on bound=" + boundAddress,
+                    t);
         }
     }
 
@@ -416,19 +410,13 @@ public class DefaultForwarder
                 signalTornDownExplicitTunnel(l, boundAddress, localForwarding, remoteAddress, reason);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal torn down explicit tunnel local=" + localForwarding
-                                      + " on bound=" + boundAddress,
-                        t);
-            }
+            throw new IOException(
+                    "Failed (" + t.getClass().getSimpleName() + ")" + " to signal torn down explicit tunnel local="
+                                  + localForwarding + " on bound=" + boundAddress,
+                    t);
         }
     }
 
@@ -489,7 +477,7 @@ public class DefaultForwarder
         try {
             SshdSocketAddress result = new SshdSocketAddress(bound.getHostString(), port);
             if (log.isDebugEnabled()) {
-                log.debug("startDynamicPortForwarding(" + local + "): " + result);
+                log.debug("startDynamicPortForwarding({}): {}", local, result);
             }
 
             signalEstablishedDynamicTunnel(local, result, null);
@@ -508,19 +496,12 @@ public class DefaultForwarder
                 signalEstablishedDynamicTunnel(l, local, boundAddress, reason);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal establishing dynamic tunnel for local=" + local
-                                      + " on bound=" + boundAddress,
-                        t);
-            }
+            throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
+                                  + " to signal establishing dynamic tunnel for local=" + local + " on bound=" + boundAddress,
+                    t);
         }
     }
 
@@ -541,18 +522,12 @@ public class DefaultForwarder
                 signalEstablishingDynamicTunnel(l, local);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal establishing dynamic tunnel for local=" + local,
-                        t);
-            }
+            throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
+                                  + " to signal establishing dynamic tunnel for local=" + local,
+                    t);
         }
     }
 
@@ -629,18 +604,12 @@ public class DefaultForwarder
                 signalTearingDownDynamicTunnel(l, address);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal tearing down dynamic tunnel for address=" + address,
-                        t);
-            }
+            throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
+                                  + " to signal tearing down dynamic tunnel for address=" + address,
+                    t);
         }
     }
 
@@ -659,18 +628,12 @@ public class DefaultForwarder
                 signalTornDownDynamicTunnel(l, address, reason);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal torn down dynamic tunnel for address=" + address,
-                        t);
-            }
+            throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
+                                  + " to signal torn down dynamic tunnel for address=" + address,
+                    t);
         }
     }
 
@@ -702,8 +665,7 @@ public class DefaultForwarder
         try {
             if ((filter == null) || (!filter.canListen(local, session))) {
                 if (log.isDebugEnabled()) {
-                    log.debug("localPortForwardingRequested(" + session + ")[" + local + "][haveFilter=" + (filter != null)
-                              + "] rejected");
+                    log.debug("localPortForwardingRequested({})[{}][haveFilter={}] rejected", session, local, filter != null);
                 }
                 return null;
             }
@@ -720,7 +682,7 @@ public class DefaultForwarder
             InetSocketAddress bound = doBind(local, getLocalIoAcceptor());
             result = new SshdSocketAddress(bound);
             if (log.isDebugEnabled()) {
-                log.debug("localPortForwardingRequested(" + local + "): " + result);
+                log.debug("localPortForwardingRequested({}): {}", local, result);
             }
 
             boolean added;
@@ -742,12 +704,8 @@ public class DefaultForwarder
             throw e;
         }
 
-        try {
-            signalEstablishedExplicitTunnel(local, null, true, result, null);
-            return result;
-        } catch (IOException | RuntimeException e) {
-            throw e;
-        }
+        signalEstablishedExplicitTunnel(local, null, true, result, null);
+        return result;
     }
 
     @Override
@@ -763,7 +721,7 @@ public class DefaultForwarder
 
         if ((entry != null) && (localAcceptor != null)) {
             if (log.isDebugEnabled()) {
-                log.debug("localPortForwardingCancelled(" + local + ") unbind " + entry);
+                log.debug("localPortForwardingCancelled({}) unbind {}", local, entry);
             }
 
             SshdSocketAddress reportedBoundAddress = entry.getCombinedBoundAddress();
@@ -780,7 +738,7 @@ public class DefaultForwarder
             signalTornDownExplicitTunnel(reportedBoundAddress, true, null, null);
         } else {
             if (log.isDebugEnabled()) {
-                log.debug("localPortForwardingCancelled(" + local + ") no match/acceptor: " + entry);
+                log.debug("localPortForwardingCancelled({}) no match/acceptor: {}", local, entry);
             }
         }
     }
@@ -793,19 +751,13 @@ public class DefaultForwarder
                 signalEstablishingExplicitTunnel(l, local, remote, localForwarding);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal establishing explicit tunnel for local=" + local
-                                      + ", remote=" + remote + ", localForwarding=" + localForwarding,
-                        t);
-            }
+            throw new IOException(
+                    "Failed (" + t.getClass().getSimpleName() + ")" + " to signal establishing explicit tunnel for local="
+                                  + local + ", remote=" + remote + ", localForwarding=" + localForwarding,
+                    t);
         }
     }
 
@@ -828,20 +780,13 @@ public class DefaultForwarder
                 signalEstablishedExplicitTunnel(l, local, remote, localForwarding, boundAddress, reason);
                 return null;
             });
+        } catch (Error | RuntimeException | IOException e) {
+            throw e;
         } catch (Throwable t) {
-            if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof IOException) {
-                throw (IOException) t;
-            } else {
-                throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
-                                      + " to signal established explicit tunnel for local=" + local
-                                      + ", remote=" + remote + ", localForwarding=" + localForwarding
-                                      + ", bound=" + boundAddress,
-                        t);
-            }
+            throw new IOException("Failed (" + t.getClass().getSimpleName() + ")"
+                                  + " to signal established explicit tunnel for local=" + local + ", remote=" + remote
+                                  + ", localForwarding=" + localForwarding + ", bound=" + boundAddress,
+                    t);
         }
     }
 
@@ -1155,13 +1100,7 @@ public class DefaultForwarder
     @Override
     public boolean isLocalPortForwardingStartedForPort(int port) {
         synchronized (localLock) {
-            return localToRemote.isEmpty()
-                    ? false
-                    : localToRemote.keySet()
-                            .stream()
-                            .filter(e -> e.getPort() == port)
-                            .findAny()
-                            .isPresent();
+            return localToRemote.keySet().stream().anyMatch(e -> e.getPort() == port);
         }
     }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java b/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java
index e64baf2c9..58abd27c5 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/BuiltinIoServiceFactoryFactories.java
@@ -88,12 +88,10 @@ public enum BuiltinIoServiceFactoryFactories implements NamedFactory<IoServiceFa
         Class<? extends IoServiceFactoryFactory> clazz = getFactoryClass();
         try {
             return ReflectionUtils.newInstance(clazz, IoServiceFactoryFactory.class);
+        } catch (RuntimeException | Error e) {
+            throw e;
         } catch (Throwable e) {
-            if (e instanceof RuntimeException) {
-                throw (RuntimeException) e;
-            } else {
-                throw new RuntimeException(e);
-            }
+            throw new RuntimeException(e);
         }
     }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactory.java
index 4b29d4255..e84b24d6c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/DefaultIoServiceFactoryFactory.java
@@ -65,8 +65,7 @@ public class DefaultIoServiceFactoryFactory extends AbstractIoServiceFactoryFact
             factory = newInstance(IoServiceFactoryFactory.class);
             if (factory == null) {
                 factory = BuiltinIoServiceFactoryFactories.NIO2.create();
-                log.info("No detected/configured " + IoServiceFactoryFactory.class.getSimpleName()
-                         + " using " + factory.getClass().getSimpleName());
+                log.info("No detected/configured IoServiceFactoryFactory; using {}", factory.getClass().getSimpleName());
             } else {
                 log.info("Using {}", factory.getClass().getSimpleName());
             }
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
index d64dc1e94..82f869fe3 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Service.java
@@ -202,10 +202,8 @@ public abstract class Nio2Service extends AbstractInnerCloseable implements IoSe
             }
             return true;
         } catch (IOException | RuntimeException e) {
-            log.warn("Unable (" + e.getClass().getSimpleName() + ")"
-                     + " to set socket option " + option
-                     + " using property " + property + "=" + val
-                     + ": " + e.getMessage());
+            log.warn("setOption({}): unable to set socket option {} via {}={}: {}", socket, option, property, val,
+                    e.toString());
             return false;
         }
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java
index 3843dc974..746484b67 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java
@@ -112,7 +112,7 @@ public abstract class AbstractDHKeyExchange extends AbstractLoggingBean implemen
         }
     }
 
-    protected void validateEValue(BigInteger pValue) throws Exception {
+    protected void validateEValue(BigInteger pValue) throws SshException {
         BigInteger value = Objects.requireNonNull(getEValue(), "No DH 'e' value set");
         if (!KeyExchange.isValidDHValue(value, pValue)) {
             throw new SshException(SshConstants.SSH2_DISCONNECT_KEY_EXCHANGE_FAILED,
@@ -149,7 +149,7 @@ public abstract class AbstractDHKeyExchange extends AbstractLoggingBean implemen
         }
     }
 
-    protected void validateFValue(BigInteger pValue) throws Exception {
+    protected void validateFValue(BigInteger pValue) throws SshException {
         BigInteger value = Objects.requireNonNull(getFValue(), "No DH 'f' value set");
         if (!KeyExchange.isValidDHValue(value, pValue)) {
             throw new SshException(SshConstants.SSH2_DISCONNECT_KEY_EXCHANGE_FAILED,
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
index d585a6ced..70e9f1279 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractConnectionService.java
@@ -900,11 +900,7 @@ public abstract class AbstractConnectionService
         }
 
         if (RequestHandler.Result.Replied.equals(result) || (!wantReply)) {
-            return new AbstractIoWriteFuture(req, null) {
-                {
-                    setValue(Boolean.TRUE);
-                }
-            };
+            return AbstractIoWriteFuture.fulfilled(req, Boolean.TRUE);
         }
 
         byte cmd = RequestHandler.Result.ReplySuccess.equals(result)
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
index 22e68c656..8b51d8eba 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSession.java
@@ -273,7 +273,7 @@ public abstract class AbstractSession extends SessionHelper {
      * @see {@link #doInvokeUnimplementedMessageHandler(int, Buffer)}
      * @see {@link #preClose()}
      */
-    private final Deque<GlobalRequestFuture> pendingGlobalRequests = new ConcurrentLinkedDeque<GlobalRequestFuture>();
+    private final Deque<GlobalRequestFuture> pendingGlobalRequests = new ConcurrentLinkedDeque<>();
 
     private final Map<Buffer, LongConsumer> globalSequenceNumbers = new ConcurrentHashMap<>();
 
@@ -314,12 +314,10 @@ public abstract class AbstractSession extends SessionHelper {
 
         try {
             signalSessionEstablished(ioSession);
+        } catch (RuntimeException e) {
+            throw e;
         } catch (Exception e) {
-            if (e instanceof RuntimeException) {
-                throw (RuntimeException) e;
-            } else {
-                throw new RuntimeSshException(e);
-            }
+            throw new RuntimeSshException(e);
         }
     }
 
@@ -1723,7 +1721,7 @@ public abstract class AbstractSession extends SessionHelper {
         IoWriteFuture future = (handler == null) ? null : handler.sendKexInitRequest(this, proposal, buffer);
         byte[] data = buffer.getCompactData();
         if (future == null) {
-            future = writePacket(buffer);
+            writePacket(buffer);
         } else {
             if (debugEnabled) {
                 log.debug("sendKexInit({}) KEX handled by reserved messages handler", this);
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSessionIoHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSessionIoHandler.java
index d176a258b..136eb2cf5 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSessionIoHandler.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/AbstractSessionIoHandler.java
@@ -63,8 +63,10 @@ public abstract class AbstractSessionIoHandler extends AbstractLoggingBean imple
         try {
             session.messageReceived(message);
         } catch (Error e) {
-            log.debug("messageReceived({}) failed {} to handle message: {}",
-                    ioSession, e.getClass().getSimpleName(), e.getMessage(), e);
+            if (log.isDebugEnabled()) {
+                log.debug("messageReceived({}) failed {} to handle message: {}", ioSession, e.getClass().getSimpleName(),
+                        e.getMessage(), e);
+            }
             throw new RuntimeSshException(e);
         }
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/KeyExchangeMessageHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/KeyExchangeMessageHandler.java
index 59018d6b8..294935a0a 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/KeyExchangeMessageHandler.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/session/helpers/KeyExchangeMessageHandler.java
@@ -184,7 +184,7 @@ public class KeyExchangeMessageHandler {
             if (numPending == 0) {
                 kexFlushed = true;
             }
-            return new SimpleImmutableEntry<Integer, DefaultKeyExchangeFuture>(Integer.valueOf(numPending), kexFlushedFuture);
+            return new SimpleImmutableEntry<>(Integer.valueOf(numPending), kexFlushedFuture);
         });
     }
 
@@ -518,9 +518,7 @@ public class KeyExchangeMessageHandler {
                 }
                 // Connect all futures of packets that we wrote. We do this at the end instead of one-by-one inside the
                 // loop to minimize the risk that woken up threads waiting on these futures queue up additional packets.
-                pendingFutures.forEach(e -> {
-                    e.getValue().addListener(e.getKey());
-                });
+                pendingFutures.forEach(e -> e.getValue().addListener(e.getKey()));
             }
         });
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
index 1bb2ffa86..8900d2dd0 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
@@ -332,7 +332,7 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
                     if (port == 0) {
                         SocketAddress selectedAddress = GenericUtils.head(acceptor.getBoundAddresses());
                         port = ((InetSocketAddress) selectedAddress).getPort();
-                        log.info("start() listen on auto-allocated port=" + port);
+                        log.info("start() listen on auto-allocated port={}", port);
                     }
                 }
             }
@@ -341,7 +341,7 @@ public class SshServer extends AbstractFactoryManager implements ServerFactoryMa
             if (port == 0) {
                 SocketAddress selectedAddress = GenericUtils.head(acceptor.getBoundAddresses());
                 port = ((InetSocketAddress) selectedAddress).getPort();
-                log.info("start() listen on auto-allocated port=" + port);
+                log.info("start() listen on auto-allocated port={}", port);
             }
         }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/AsyncAuthException.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/AsyncAuthException.java
index ade64d8af..105463bb1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/AsyncAuthException.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/AsyncAuthException.java
@@ -31,7 +31,7 @@ public class AsyncAuthException extends RuntimeSshException {
 
     private static final long serialVersionUID = 6741236101797649869L;
 
-    protected Object listener;
+    protected transient Object listener;
     protected Boolean authed;
 
     public AsyncAuthException() {
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSS.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSS.java
index 72fa92cc1..0c8db6863 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSS.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSS.java
@@ -120,7 +120,7 @@ public class UserAuthGSS extends AbstractUserAuth {
         } else {
             int msg = buffer.getUByte();
             if (!((msg == SshConstants.SSH_MSG_USERAUTH_INFO_RESPONSE)
-                    || ((msg == SshConstants.SSH_MSG_USERAUTH_GSSAPI_MIC)) && context.isEstablished())) {
+                    || ((msg == SshConstants.SSH_MSG_USERAUTH_GSSAPI_MIC) && context.isEstablished()))) {
                 throw new SshException(SshConstants.SSH2_DISCONNECT_PROTOCOL_ERROR,
                         "Packet not supported by user authentication method: " + SshConstants.getCommandMessageName(msg));
             }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/AuthorizedKeyEntriesPublickeyAuthenticator.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/AuthorizedKeyEntriesPublickeyAuthenticator.java
index cb8dc478a..8650aa8f9 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/AuthorizedKeyEntriesPublickeyAuthenticator.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/AuthorizedKeyEntriesPublickeyAuthenticator.java
@@ -79,7 +79,7 @@ public class AuthorizedKeyEntriesPublickeyAuthenticator extends AbstractLoggingB
     public boolean authenticate(String username, PublicKey key, ServerSession session) {
         if (MapEntryUtils.isEmpty(resolvedKeys)) {
             if (log.isDebugEnabled()) {
-                log.debug("authenticate(" + username + ")[" + session + "] no entries");
+                log.debug("authenticate({})[{}] no entries", username, session);
             }
 
             return false;
@@ -88,7 +88,7 @@ public class AuthorizedKeyEntriesPublickeyAuthenticator extends AbstractLoggingB
         for (Map.Entry<AuthorizedKeyEntry, PublicKey> e : resolvedKeys.entrySet()) {
             if (KeyUtils.compareKeys(key, e.getValue())) {
                 if (log.isDebugEnabled()) {
-                    log.debug("authenticate(" + username + ")[" + session + "] match found");
+                    log.debug("authenticate({})[{}] match found", username, session);
                 }
                 if (session != null) {
                     session.setAttribute(AUTHORIZED_KEY, e.getKey());
@@ -98,7 +98,7 @@ public class AuthorizedKeyEntriesPublickeyAuthenticator extends AbstractLoggingB
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("authenticate(" + username + ")[" + session + "] match not found");
+            log.debug("authenticate({})[{}] match not found", username, session);
         }
         return false;
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/KeySetPublickeyAuthenticator.java b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/KeySetPublickeyAuthenticator.java
index a48f5a3bf..3eb87d50c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/KeySetPublickeyAuthenticator.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/KeySetPublickeyAuthenticator.java
@@ -59,7 +59,7 @@ public class KeySetPublickeyAuthenticator extends AbstractLoggingBean implements
     public boolean authenticate(String username, PublicKey key, ServerSession session, Collection<? extends PublicKey> keys) {
         if (GenericUtils.isEmpty(keys)) {
             if (log.isDebugEnabled()) {
-                log.debug("authenticate(" + username + ")[" + session + "] no keys");
+                log.debug("authenticate({})[{}] no keys", username, session);
             }
 
             return false;
@@ -68,7 +68,7 @@ public class KeySetPublickeyAuthenticator extends AbstractLoggingBean implements
         PublicKey matchKey = KeyUtils.findMatchingKey(key, keys);
         boolean matchFound = matchKey != null;
         if (log.isDebugEnabled()) {
-            log.debug("authenticate(" + username + ")[" + session + "] match found=" + matchFound);
+            log.debug("authenticate({})[{}] match found={}", username, session, matchFound);
         }
         return matchFound;
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/PuttyRequestHandler.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/PuttyRequestHandler.java
index 310a8e47c..ff04db301 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/PuttyRequestHandler.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/PuttyRequestHandler.java
@@ -73,10 +73,8 @@ public class PuttyRequestHandler extends AbstractChannelRequestHandler {
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("processPuttyOpcode(" + opcode + ")"
-                      + "[buffer size=" + buffer.available() + "]"
-                      + "[reply=" + wantReply + "]"
-                      + " Unknown request: " + request);
+            log.debug("processPuttyOpcode({})[buffer size={}] [reply={}] Unknown request: {}", opcode, buffer.available(),
+                    wantReply, request);
         }
 
         return Result.ReplyFailure;
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
index 55dc4a7f3..9618d7352 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractCommandSupport.java
@@ -159,11 +159,7 @@ public abstract class AbstractCommandSupport
                 this.run();
             });
         } catch (RuntimeException e) { // e.g., RejectedExecutionException
-            log.error("start(" + channel + ")"
-                      + " Failed (" + e.getClass().getSimpleName() + ")"
-                      + " to start command=" + cmd + ": " + e.getMessage(),
-                    e);
-            throw new IOException(e);
+            throw new IOException("start(" + channel + ") failed to start command " + cmd, e);
         }
     }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
index 970e39d3c..8be966b4e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/command/AbstractFileSystemCommand.java
@@ -35,7 +35,7 @@ public abstract class AbstractFileSystemCommand extends AbstractCommandSupport i
 
     protected FileSystem fileSystem;
 
-    public AbstractFileSystemCommand(String command, CloseableExecutorService executorService) {
+    protected AbstractFileSystemCommand(String command, CloseableExecutorService executorService) {
         super(command, executorService);
     }
 
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
index 4bcd713d2..c66978d2c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/DirectTcpipFactory.java
@@ -28,6 +28,6 @@ public class DirectTcpipFactory extends TcpipFactory {
     public static final DirectTcpipFactory INSTANCE = new DirectTcpipFactory();
 
     public DirectTcpipFactory() {
-        super(ForwardingFilter.Type.Direct);
+        super(TcpForwardingFilter.Type.Direct);
     }
 }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
index 15ef75b49..4975e16dd 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/ForwardedTcpipFactory.java
@@ -28,6 +28,6 @@ public class ForwardedTcpipFactory extends TcpipFactory {
     public static final ForwardedTcpipFactory INSTANCE = new ForwardedTcpipFactory();
 
     public ForwardedTcpipFactory() {
-        super(ForwardingFilter.Type.Forwarded);
+        super(TcpForwardingFilter.Type.Forwarded);
     }
 }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/StaticDecisionForwardingFilter.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/StaticDecisionForwardingFilter.java
index fb8a1cef8..29e7d6542 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/StaticDecisionForwardingFilter.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/StaticDecisionForwardingFilter.java
@@ -68,7 +68,7 @@ public class StaticDecisionForwardingFilter extends AbstractLoggingBean implemen
     protected boolean checkAcceptance(String request, Session session, SshdSocketAddress target) {
         boolean accepted = isAccepted();
         if (log.isDebugEnabled()) {
-            log.debug("checkAcceptance(" + request + ")[" + session + "] acceptance for target=" + target + " is " + accepted);
+            log.debug("checkAcceptance({})[{}] acceptance for target={} is {}", request, session, target, accepted);
         }
         return accepted;
     }
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
index f4faf24a0..f71dba90e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/forward/TcpipServerChannel.java
@@ -65,13 +65,13 @@ public class TcpipServerChannel extends AbstractServerChannel implements Forward
 
     public abstract static class TcpipFactory implements ChannelFactory, ExecutorServiceCarrier {
 
-        private final ForwardingFilter.Type type;
+        private final TcpForwardingFilter.Type type;
 
-        protected TcpipFactory(ForwardingFilter.Type type) {
+        protected TcpipFactory(TcpForwardingFilter.Type type) {
             this.type = type;
         }
 
-        public final ForwardingFilter.Type getType() {
+        public final TcpForwardingFilter.Type getType() {
             return type;
         }
 
@@ -91,7 +91,7 @@ public class TcpipServerChannel extends AbstractServerChannel implements Forward
         }
     }
 
-    private final ForwardingFilter.Type type;
+    private final TcpForwardingFilter.Type type;
     private IoConnector connector;
     private ChannelToPortHandler port;
     private ChannelAsyncOutputStream out;
@@ -100,12 +100,12 @@ public class TcpipServerChannel extends AbstractServerChannel implements Forward
     private SshdSocketAddress originatorAddress;
     private SocketAddress localAddress;
 
-    public TcpipServerChannel(ForwardingFilter.Type type, CloseableExecutorService executor) {
+    public TcpipServerChannel(TcpForwardingFilter.Type type, CloseableExecutorService executor) {
         super("", Collections.emptyList(), executor);
         this.type = Objects.requireNonNull(type, "No channel type specified");
     }
 
-    public ForwardingFilter.Type getTcpipChannelType() {
+    public TcpForwardingFilter.Type getTcpipChannelType() {
         return type;
     }
 
@@ -178,8 +178,7 @@ public class TcpipServerChannel extends AbstractServerChannel implements Forward
         try {
             if ((address == null) || (filter == null) || (!filter.canConnect(channelType, address, session))) {
                 if (debugEnabled) {
-                    log.debug(
-                            "doInit(" + this + ")[" + type + "][haveFilter=" + (filter != null) + "] filtered out " + address);
+                    log.debug("doInit({})[{}][haveFilter={}] filtered out {}", this, type, filter != null, address);
                 }
                 try {
                     f.setException(new SshChannelOpenException(getChannelId(),
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
index d56e231e9..06b44d593 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
@@ -533,11 +533,9 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
             if (CoreModuleProperties.AUTO_WELCOME_BANNER_VALUE.equalsIgnoreCase(message)) {
                 try {
                     return KeyRandomArt.combine(session, ' ', session.getKeyPairProvider());
+                } catch (IOException e) {
+                    throw e;
                 } catch (Exception e) {
-                    if (e instanceof IOException) {
-                        throw (IOException) e;
-                    }
-
                     throw new IOException(e);
                 }
             }
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedInputStreamTest.java b/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedInputStreamTest.java
index 59abec810..1fdd47092 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedInputStreamTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/channel/ChannelPipedInputStreamTest.java
@@ -83,7 +83,7 @@ public class ChannelPipedInputStreamTest extends BaseTestSupport {
         } else {
             assertArrayEquals("Mismatched stream content", expected, Arrays.copyOf(read, expected.length));
             for (int i = expected.length; i < read.length; i++) {
-                assertTrue("Non-zero value at position " + i, read[i] == 0);
+                assertEquals("Non-zero value at position " + i, 0, read[i]);
             }
         }
     }
diff --git a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
index 3e96e3f9e..7aa60b43f 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/AbstractGitCommand.java
@@ -20,7 +20,6 @@
 package org.apache.sshd.git;
 
 import java.io.OutputStream;
-import java.nio.file.FileSystem;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -43,7 +42,6 @@ public abstract class AbstractGitCommand
     public static final int ENDQUOTE = 0x008;
 
     protected final GitLocationResolver rootDirResolver;
-    protected FileSystem fileSystem;
 
     protected AbstractGitCommand(GitLocationResolver rootDirResolver, String command,
                                  CloseableExecutorService executorService) {
diff --git a/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java b/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
index e9f2de8eb..bd102014b 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/pack/GitPackCommand.java
@@ -65,7 +65,6 @@ public class GitPackCommand extends AbstractGitCommand {
                 }
                 if (argVal.startsWith("\"") && argVal.endsWith("\"")) {
                     args[i] = argVal.substring(1, argVal.length() - 1);
-                    argVal = args[i];
                 }
             }
 
@@ -100,8 +99,7 @@ public class GitPackCommand extends AbstractGitCommand {
         int len = GenericUtils.length(pathArg);
         // Strip any leading path separator since we use relative to root
         if ((len > 0) && (pathArg.charAt(0) == '/')) {
-            pathArg = (len > 1) ? pathArg.substring(1) : "";
-            len--;
+            pathArg = pathArg.substring(1);
         }
 
         ValidateUtils.checkNotNullAndNotEmpty(pathArg, "No %s command sub-path specified", args[0]);
diff --git a/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java b/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
index 73349e583..7d13da89a 100644
--- a/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
+++ b/sshd-git/src/main/java/org/apache/sshd/git/pgm/GitPgmCommand.java
@@ -62,7 +62,6 @@ public class GitPgmCommand extends AbstractGitCommand {
 
                 if (argVal.startsWith("\"") && argVal.endsWith("\"")) {
                     args[i] = argVal.substring(1, argVal.length() - 1);
-                    argVal = args[i];
                 }
             }
 
diff --git a/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPAuthorizedEntriesTracker.java b/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPAuthorizedEntriesTracker.java
index 8788b1876..df4c7fec8 100644
--- a/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPAuthorizedEntriesTracker.java
+++ b/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPAuthorizedEntriesTracker.java
@@ -78,7 +78,7 @@ public class PGPAuthorizedEntriesTracker
         this.keyFiles = GenericUtils.isEmpty(keys)
                 ? new ArrayList<>()
                 : keys.stream()
-                        .map(k -> new PGPPublicKeyFileWatcher(k))
+                        .map(PGPPublicKeyFileWatcher::new)
                         .collect(Collectors.toCollection(() -> new ArrayList<>(keys.size())));
     }
 
diff --git a/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPKeyPairResourceParser.java b/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPKeyPairResourceParser.java
index f0d853e21..e8d2eeda7 100644
--- a/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPKeyPairResourceParser.java
+++ b/sshd-openpgp/src/main/java/org/apache/sshd/openpgp/PGPKeyPairResourceParser.java
@@ -117,12 +117,10 @@ public class PGPKeyPairResourceParser
 
                 Key key = PGPKeyLoader.loadPGPKey(stream, password);
                 keys = extractKeyPairs(resourceKey, key.getSubkeys());
-                key = null; // get rid of sensitive data a.s.a.p.
             } catch (IOException | GeneralSecurityException | PGPException | RuntimeException e) {
                 ResourceDecodeResult result = (passwordProvider != null)
                         ? passwordProvider.handleDecodeAttemptResult(session, resourceKey, retryCount, password, e)
                         : ResourceDecodeResult.TERMINATE;
-                password = null; // get rid of sensitive data a.s.a.p.
                 if (result == null) {
                     result = ResourceDecodeResult.TERMINATE;
                 }
@@ -150,7 +148,6 @@ public class PGPKeyPairResourceParser
 
             if (passwordProvider != null) {
                 passwordProvider.handleDecodeAttemptResult(session, resourceKey, retryCount, password, null);
-                password = null; // get rid of sensitive data a.s.a.p.
             }
 
             return keys;
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/client/AbstractScpClientCreator.java b/sshd-scp/src/main/java/org/apache/sshd/scp/client/AbstractScpClientCreator.java
index fa68bbe53..2f0f21a9f 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/client/AbstractScpClientCreator.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/client/AbstractScpClientCreator.java
@@ -37,7 +37,7 @@ public abstract class AbstractScpClientCreator extends AbstractLoggingBean imple
         this("");
     }
 
-    public AbstractScpClientCreator(String discriminator) {
+    protected AbstractScpClientCreator(String discriminator) {
         super(discriminator);
     }
 
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java b/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java
index bcefee69f..0973df780 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java
@@ -668,9 +668,7 @@ public class ScpHelper extends AbstractLoggingBean implements SessionHolder<Sess
 
             ScpAckInfo ackInfo = sendAcknowledgedCommand(cmd);
             if (debugEnabled) {
-                if (debugEnabled) {
-                    log.debug("sendDir({})[{}] command='{}' ACK={}", this, path, cmd, ackInfo);
-                }
+                log.debug("sendDir({})[{}] command='{}' ACK={}", this, path, cmd, ackInfo);
             }
             validateAckReplyCode(cmd, path, ackInfo);
         }
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/LocalFileScpTargetStreamResolver.java b/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/LocalFileScpTargetStreamResolver.java
index c04aa0492..a501a68f9 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/LocalFileScpTargetStreamResolver.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/LocalFileScpTargetStreamResolver.java
@@ -108,7 +108,7 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
         }
 
         if (log.isTraceEnabled()) {
-            log.trace("resolveTargetStream(" + name + "): " + file);
+            log.trace("resolveTargetStream({}): {}", name, file);
         }
 
         return opener.openWrite(session, file, length, perms, options);
@@ -119,7 +119,7 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
             Session session, String name, long length, Set<PosixFilePermission> perms, OutputStream stream)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("closeTargetStream(" + name + "): " + file);
+            log.trace("closeTargetStream({}): {}", name, file);
         }
 
         opener.closeWrite(session, file, length, perms, stream);
@@ -153,7 +153,7 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
             throws IOException {
         boolean traceEnabled = log.isTraceEnabled();
         if (traceEnabled) {
-            log.trace("updateFileProperties(" + name + ")[" + path + "] permissions: " + perms);
+            log.trace("updateFileProperties({})[{}] permissions: {}", name, path, perms);
         }
         IoUtils.setPermissions(path, perms);
 
@@ -162,8 +162,8 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
             FileTime lastModified = FileTime.from(time.getLastModifiedTime(), TimeUnit.MILLISECONDS);
             FileTime lastAccess = FileTime.from(time.getLastAccessTime(), TimeUnit.MILLISECONDS);
             if (traceEnabled) {
-                log.trace("updateFileProperties(" + name + ")[" + path + "] last-modified=" + lastModified + ", last-access="
-                          + lastAccess);
+                log.trace("updateFileProperties({})[{}] last-modified={}, last-access={}", name, path, lastModified,
+                        lastAccess);
             }
 
             view.setTimes(lastModified, lastAccess, null);
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/ScpIoUtils.java b/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/ScpIoUtils.java
index 38552befa..daa48ab9f 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/ScpIoUtils.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/common/helpers/ScpIoUtils.java
@@ -122,9 +122,8 @@ public final class ScpIoUtils {
             long endTime = System.nanoTime();
             long nanosWait = endTime - startTime;
             if ((log != null) && log.isTraceEnabled()) {
-                log.trace("openCommandChannel(" + session + ")[" + cmd + "]"
-                          + " completed after " + nanosWait
-                          + " nanos out of " + waitTimeout.toNanos());
+                log.trace("openCommandChannel({})[{}] completed after {} nanos out of {}", session, cmd, nanosWait,
+                        waitTimeout.toNanos());
             }
 
             return channel;
@@ -132,11 +131,8 @@ public final class ScpIoUtils {
             long endTime = System.nanoTime();
             long nanosWait = endTime - startTime;
             if ((log != null) && log.isTraceEnabled()) {
-                log.trace("openCommandChannel(" + session + ")[" + cmd + "]"
-                          + " failed (" + e.getClass().getSimpleName() + ")"
-                          + " to complete after " + nanosWait
-                          + " nanos out of " + waitTimeout.toNanos()
-                          + ": " + e.getMessage());
+                log.trace("openCommandChannel({})[{}] failed after {} nanos out of {}: {}", session, cmd, nanosWait,
+                        waitTimeout.toNanos(), e.toString());
             }
 
             channel.close(false);
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/server/InputStreamReader.java b/sshd-scp/src/main/java/org/apache/sshd/scp/server/InputStreamReader.java
index c15801806..d50ca7ef3 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/server/InputStreamReader.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/server/InputStreamReader.java
@@ -53,7 +53,7 @@ import java.nio.charset.UnmappableCharacterException;
  * characters by either a default or a provided character converter. The default encoding is taken from the
  * "file.encoding" system property. {@code InputStreamReader} contains a buffer of bytes read from the source stream and
  * converts these into characters as needed. The buffer size is 8K.
- * 
+ *
  * @see OutputStreamWriter
  */
 public class InputStreamReader extends Reader {
@@ -74,7 +74,7 @@ public class InputStreamReader extends Reader {
      * Constructs a new {@code InputStreamReader} on the {@link InputStream} {@code in}. This constructor sets the
      * character converter to the encoding specified in the "file.encoding" property and falls back to ISO 8859_1
      * (ISO-Latin-1) if the property doesn't exist.
-     * 
+     *
      * @param in the input stream from which to read characters.
      */
     public InputStreamReader(InputStream in) {
@@ -90,7 +90,7 @@ public class InputStreamReader extends Reader {
      * Constructs a new InputStreamReader on the InputStream {@code in}. The character converter that is used to decode
      * bytes into characters is identified by name by {@code enc}. If the encoding cannot be found, an
      * UnsupportedEncodingException error is thrown.
-     * 
+     *
      * @param  in                           the InputStream from which to read characters.
      * @param  enc                          identifies the character converter to use.
      * @throws NullPointerException         if {@code enc} is {@code null}.
@@ -115,7 +115,7 @@ public class InputStreamReader extends Reader {
 
     /**
      * Constructs a new InputStreamReader on the InputStream {@code in} and CharsetDecoder {@code dec}.
-     * 
+     *
      * @param in  the source InputStream from which to read characters.
      * @param dec the CharsetDecoder used by the character conversion.
      */
@@ -129,7 +129,7 @@ public class InputStreamReader extends Reader {
 
     /**
      * Constructs a new InputStreamReader on the InputStream {@code in} and Charset {@code charset}.
-     * 
+     *
      * @param in      the source InputStream from which to read characters.
      * @param charset the Charset that defines the character converter
      */
@@ -144,7 +144,7 @@ public class InputStreamReader extends Reader {
 
     /**
      * Closes this reader. This implementation closes the source InputStream and releases all local storage.
-     * 
+     *
      * @throws IOException if an error occurs attempting to close this reader.
      */
     @Override
@@ -161,7 +161,7 @@ public class InputStreamReader extends Reader {
     /**
      * Returns the name of the encoding used to convert bytes into characters. The value {@code null} is returned if
      * this reader has been closed.
-     * 
+     *
      * @return the name of the character converter or {@code null} if this reader is closed.
      */
     public String getEncoding() {
@@ -175,7 +175,7 @@ public class InputStreamReader extends Reader {
      * Reads a single character from this reader and returns it as an integer with the two higher-order bytes set to 0.
      * Returns -1 if the end of the reader has been reached. The byte value is either obtained from converting bytes in
      * this reader's buffer or by first filling the buffer from the source InputStream and then reading from the buffer.
-     * 
+     *
      * @return             the character read or -1 if the end of the reader has been reached.
      * @throws IOException if this reader is closed or some other I/O error occurs.
      */
@@ -191,7 +191,7 @@ public class InputStreamReader extends Reader {
                 pending = (char) -1;
                 return c;
             }
-            char buf[] = new char[2];
+            char[] buf = new char[2];
             int nb = read(buf, 0, 2);
             if (nb == 2) {
                 pending = buf[1];
@@ -209,7 +209,7 @@ public class InputStreamReader extends Reader {
      * character array {@code buf}. Returns the number of characters actually read or -1 if the end of the reader has
      * been reached. The bytes are either obtained from converting bytes in this reader's buffer or by first filling the
      * buffer from the source InputStream and then reading from the buffer.
-     * 
+     *
      * @param  buf                       the array to store the characters read.
      * @param  offset                    the initial position in {@code buf} to store the characters read from this
      *                                   reader.
@@ -308,7 +308,7 @@ public class InputStreamReader extends Reader {
      * {@code read()} will not block. If the result is {@code false} then this reader may or may not block when
      * {@code read()} is called. This implementation returns {@code true} if there are bytes available in the buffer or
      * the source stream has bytes available.
-     * 
+     *
      * @return             {@code true} if the receiver will not block when {@code read()} is called, {@code false} if
      *                     unknown or blocking will occur.
      * @throws IOException if this reader is closed or some other I/O error occurs.
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractSftpClientExtension.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractSftpClientExtension.java
index 5a487ed55..4bff81d54 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractSftpClientExtension.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/helpers/AbstractSftpClientExtension.java
@@ -77,7 +77,7 @@ public abstract class AbstractSftpClientExtension extends AbstractLoggingBean im
     protected void sendAndCheckExtendedCommandStatus(Buffer buffer) throws IOException {
         int reqId = sendExtendedCommand(buffer);
         if (log.isDebugEnabled()) {
-            log.debug("sendAndCheckExtendedCommandStatus(" + getName() + ") id=" + reqId);
+            log.debug("sendAndCheckExtendedCommandStatus({}) id={}", getName(), reqId);
         }
         checkStatus(receive(reqId));
     }
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpClientDirectoryScanner.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpClientDirectoryScanner.java
index cb5287e82..b0fbbf166 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpClientDirectoryScanner.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpClientDirectoryScanner.java
@@ -97,7 +97,7 @@ public class SftpClientDirectoryScanner extends PathScanningMatcher {
                 ? Collections.emptyList()
                 : Collections.unmodifiableList(
                         includes.stream()
-                                .map(v -> SftpPathDirectoryScanner.adjustPattern(v))
+                                .map(SftpPathDirectoryScanner::adjustPattern)
                                 .collect(Collectors.toCollection(() -> new ArrayList<>(includes.size()))));
     }
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystemProvider.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystemProvider.java
index 199664cc2..4ea058e69 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystemProvider.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpFileSystemProvider.java
@@ -794,7 +794,7 @@ public class SftpFileSystemProvider extends FileSystemProvider {
         try (SftpClient client = fsLink.getClient()) {
             String linkPath = client.readLink(l.toString());
             if (log.isDebugEnabled()) {
-                log.debug("readSymbolicLink({})[{}] {} => {}", fsLink, link, linkPath);
+                log.debug("readSymbolicLink({}) {} => {}", fsLink, link, linkPath);
             }
 
             return fsLink.getPath(linkPath);
@@ -1196,7 +1196,7 @@ public class SftpFileSystemProvider extends FileSystemProvider {
                     break;
                 default:
                     if (traceEnabled) {
-                        log.trace("attributesToPermissions(" + path + ") ignored " + p);
+                        log.trace("attributesToPermissions({}) ignored {}", path, p);
                     }
             }
         }
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpPathDirectoryScanner.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpPathDirectoryScanner.java
index 6bc13dee0..ed2a79010 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpPathDirectoryScanner.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/fs/SftpPathDirectoryScanner.java
@@ -79,7 +79,7 @@ public class SftpPathDirectoryScanner extends DirectoryScanner {
                 ? Collections.emptyList()
                 : Collections.unmodifiableList(
                         includes.stream()
-                                .map(v -> adjustPattern(v))
+                                .map(SftpPathDirectoryScanner::adjustPattern)
                                 .collect(Collectors.toCollection(() -> new ArrayList<>(includes.size()))));
     }
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java
index 15a42c9a8..f0c1243db 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/DefaultSftpClient.java
@@ -493,7 +493,7 @@ public class DefaultSftpClient extends AbstractSftpClient {
 
         Map<String, ?> parsed = getParsedServerExtensions();
         Collection<String> extensions = ParserUtils.supportedExtensions(parsed);
-        List<Integer> availableVersions = Collections.emptyList();
+        List<Integer> availableVersions;
         if ((GenericUtils.size(extensions) > 0)
                 && extensions.contains(SftpConstants.EXT_VERSION_SELECT)) {
             Versions vers = MapEntryUtils.isEmpty(parsed)
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpDirEntryIterator.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpDirEntryIterator.java
index a8d2c644b..fea1a4289 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpDirEntryIterator.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpDirEntryIterator.java
@@ -141,7 +141,7 @@ public class SftpDirEntryIterator extends AbstractLoggingBean implements SftpCli
             Handle handle = getHandle();
             if ((handle instanceof Closeable) && isCloseOnFinished()) {
                 if (log.isDebugEnabled()) {
-                    log.debug("close(" + getPath() + ") handle=" + handle);
+                    log.debug("close({}) handle={}", getPath(), handle);
                 }
                 ((Closeable) handle).close();
             }
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java
index d52b005dd..8be006ff8 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpInputStreamAsync.java
@@ -162,9 +162,7 @@ public class SftpInputStreamAsync extends InputStreamWithChannel implements Sftp
             throw new IOException("transferTo(" + getPath() + ") stream closed");
         }
 
-        long numXfered = doRead(Long.MAX_VALUE, buf -> {
-            out.write(buf.array(), buf.rpos(), buf.available());
-        });
+        long numXfered = doRead(Long.MAX_VALUE, buf -> out.write(buf.array(), buf.rpos(), buf.available()));
         if (log.isDebugEnabled()) {
             log.debug("transferTo({}) transferred {} bytes", this, numXfered);
         }
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java
index a9da91724..623f4a3f8 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/impl/SftpOutputStreamAsync.java
@@ -176,7 +176,7 @@ public class SftpOutputStreamAsync extends OutputStreamWithChannel implements Sf
                 log.debug("flush({}) processing ack #{}: {}", this, ackIndex, ack);
             }
 
-            ack = pendingWrites.removeFirst();
+            pendingWrites.removeFirst();
             client.checkResponseStatus(SftpConstants.SSH_FXP_WRITE, response);
         }
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java
index a39415008..e14b9a55a 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/common/SftpHelper.java
@@ -1003,15 +1003,15 @@ public final class SftpHelper {
         return mask;
     }
 
-    public static <B extends Buffer> B writeACLs(B buffer, int version, Collection<? extends AclEntry> acl) {
+    public static <B extends Buffer> B writeACLs(B buffer, int version, Collection<AclEntry> acl) {
         int lenPos = buffer.wpos();
         buffer.putUInt(0L); // length placeholder
-        buffer = encodeACLs(buffer, version, acl);
+        encodeACLs(buffer, version, acl);
         BufferUtils.updateLengthPlaceholder(buffer, lenPos);
         return buffer;
     }
 
-    public static <B extends Buffer> B encodeACLs(B buffer, int version, Collection<? extends AclEntry> acl) {
+    public static <B extends Buffer> B encodeACLs(B buffer, int version, Collection<AclEntry> acl) {
         Objects.requireNonNull(acl, "No ACL");
         if (version >= SftpConstants.SFTP_V6) {
             buffer.putUInt(0L); // TODO handle ACL flags
@@ -1021,7 +1021,7 @@ public final class SftpHelper {
         buffer.putInt(numEntries);
         if (numEntries > 0) {
             for (AclEntry e : acl) {
-                buffer = writeAclEntry(buffer, e);
+                writeAclEntry(buffer, e);
             }
         }
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpEventListenerAdapter.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpEventListenerAdapter.java
index 43f2e0657..565807c5c 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpEventListenerAdapter.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpEventListenerAdapter.java
@@ -51,14 +51,14 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     @Override
     public void initialized(ServerSession session, int version) throws IOException {
         if (log.isDebugEnabled()) {
-            log.debug("initialized(" + session + ") version=" + version);
+            log.debug("initialized({}) version={}", session, version);
         }
     }
 
     @Override
     public void destroying(ServerSession session) throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("destroying(" + session + ")");
+            log.trace("destroying({})", session);
         }
     }
 
@@ -66,8 +66,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void opening(ServerSession session, String remoteHandle, Handle localHandle) throws IOException {
         if (log.isTraceEnabled()) {
             Path path = localHandle.getFile();
-            log.trace("opening(" + session + ")[" + remoteHandle + "] " + (Files.isDirectory(path) ? "directory" : "file") + " "
-                      + path);
+            log.trace("opening({})[{}] {} {}", session, remoteHandle, Files.isDirectory(path) ? "directory" : "file", path);
         }
     }
 
@@ -85,8 +84,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void open(ServerSession session, String remoteHandle, Handle localHandle) throws IOException {
         if (log.isTraceEnabled()) {
             Path path = localHandle.getFile();
-            log.trace("open(" + session + ")[" + remoteHandle + "] " + (Files.isDirectory(path) ? "directory" : "file") + " "
-                      + path);
+            log.trace("open({})[{}] {} {}", session, remoteHandle, Files.isDirectory(path) ? "directory" : "file", path);
         }
     }
 
@@ -103,12 +101,12 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             throws IOException {
         int numEntries = MapEntryUtils.size(entries);
         if (log.isDebugEnabled()) {
-            log.debug("read(" + session + ")[" + localHandle.getFile() + "] " + numEntries + " entries");
+            log.debug("read({})[{}] {} entries", session, localHandle.getFile(), numEntries);
         }
 
         if ((numEntries > 0) && log.isTraceEnabled()) {
             entries.forEach(
-                    (key, value) -> log.trace("read(" + session + ")[" + localHandle.getFile() + "] " + key + " - " + value));
+                    (key, value) -> log.trace("read({})[{}] {} - {}", session, localHandle.getFile(), key, value));
         }
     }
 
@@ -118,7 +116,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             long offset, byte[] data, int dataOffset, int dataLen)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("reading(" + session + ")[" + localHandle.getFile() + "] offset=" + offset + ", requested=" + dataLen);
+            log.trace("reading({})[{}] offset={}, requested={}", session, localHandle.getFile(), offset, dataLen);
         }
     }
 
@@ -129,9 +127,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             long offset, byte[] data, int dataOffset, int dataLen, int readLen, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("read(" + session + ")[" + localHandle.getFile() + "] offset=" + offset
-                      + ", requested=" + dataLen + ", read=" + readLen
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("read({})[{}] offset={}, requested={}, read={}{}", session, localHandle.getFile(), offset, dataLen,
+                    readLen, (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -141,7 +138,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             long offset, byte[] data, int dataOffset, int dataLen)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("write(" + session + ")[" + localHandle.getFile() + "] offset=" + offset + ", requested=" + dataLen);
+            log.trace("writing({})[{}] offset={}, requested={}", session, localHandle.getFile(), offset, dataLen);
         }
     }
 
@@ -151,8 +148,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             long offset, byte[] data, int dataOffset, int dataLen, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("written(" + session + ")[" + localHandle.getFile() + "] offset=" + offset + ", requested=" + dataLen
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("written({})[{}] offset={}, requested={}{}", session, localHandle.getFile(), offset, dataLen,
+                    (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -160,8 +157,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void blocking(ServerSession session, String remoteHandle, FileHandle localHandle, long offset, long length, int mask)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("blocking(" + session + ")[" + localHandle.getFile() + "]"
-                      + " offset=" + offset + ", length=" + length + ", mask=0x" + Integer.toHexString(mask));
+            log.trace("blocking({})[{}] offset={}, length={}, mask=0x{}", session, localHandle.getFile(), offset, length,
+                    Integer.toHexString(mask));
         }
     }
 
@@ -171,9 +168,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("blocked(" + session + ")[" + localHandle.getFile() + "]"
-                      + " offset=" + offset + ", length=" + length + ", mask=0x" + Integer.toHexString(mask)
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("blocked({})[{}] offset={}, length={}, mask=0x{}{}", session, localHandle.getFile(), offset, length,
+                    Integer.toHexString(mask), (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -181,7 +177,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void unblocking(ServerSession session, String remoteHandle, FileHandle localHandle, long offset, long length)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("unblocking(" + session + ")[" + localHandle.getFile() + "] offset=" + offset + ", length=" + length);
+            log.trace("unblocking({})[{}] offset={}, length={}", session, localHandle.getFile(), offset, length);
         }
     }
 
@@ -190,9 +186,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
             ServerSession session, String remoteHandle, FileHandle localHandle, long offset, long length, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("unblocked(" + session + ")[" + localHandle.getFile() + "]"
-                      + " offset=" + offset + ", length=" + length
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("unblocked({})[{}] offset={}, length={}{}", session, localHandle.getFile(), offset, length,
+                    (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -200,8 +195,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void closing(ServerSession session, String remoteHandle, Handle localHandle) throws IOException {
         if (log.isTraceEnabled()) {
             Path path = localHandle.getFile();
-            log.trace("close(" + session + ")[" + remoteHandle + "] " + (Files.isDirectory(path) ? "directory" : "file") + " "
-                      + path);
+            log.trace("close({})[{}] {} {}", session, localHandle.getFile(), (Files.isDirectory(path) ? "directory" : "file"),
+                    path);
         }
     }
 
@@ -209,7 +204,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void closed(ServerSession session, String remoteHandle, Handle localHandle, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("closed({}) handle={}[{}], thrown={}", session, remoteHandle, localHandle.getFile(), thrown);
+            log.trace("closed({}) handle={}[{}]{}", session, remoteHandle, localHandle.getFile(),
+                    (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -217,7 +213,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void creating(ServerSession session, Path path, Map<String, ?> attrs)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("creating(" + session + ") " + (Files.isDirectory(path) ? "directory" : "file") + " " + path);
+            log.trace("creating({}) {} {}", session, (Files.isDirectory(path) ? "directory" : "file"), path);
         }
     }
 
@@ -225,8 +221,8 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void created(ServerSession session, Path path, Map<String, ?> attrs, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("created(" + session + ") " + (Files.isDirectory(path) ? "directory" : "file") + " " + path
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("created({}) {} {}{}", session, (Files.isDirectory(path) ? "directory" : "file"), path,
+                    (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -234,7 +230,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void moving(ServerSession session, Path srcPath, Path dstPath, Collection<CopyOption> opts)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("moving(" + session + ")[" + opts + "]" + srcPath + " => " + dstPath);
+            log.trace("moving({})[{}] {} => {}", session, opts, srcPath, dstPath);
         }
     }
 
@@ -242,8 +238,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void moved(ServerSession session, Path srcPath, Path dstPath, Collection<CopyOption> opts, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("moved(" + session + ")[" + opts + "]" + srcPath + " => " + dstPath
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("moved({})[{}] {} => {}{}", session, opts, srcPath, dstPath, (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -251,7 +246,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void removing(ServerSession session, Path path, boolean isDirectory)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("removing(" + session + ")[dir=" + isDirectory + "] " + path);
+            log.trace("removing({})[dir={}] {}", session, isDirectory, path);
         }
     }
 
@@ -259,8 +254,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void removed(ServerSession session, Path path, boolean isDirectory, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("removed(" + session + ")[dir=" + isDirectory + "] " + path
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("removed({})[dir={}] {}{}", session, isDirectory, path, (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -268,7 +262,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void linking(ServerSession session, Path source, Path target, boolean symLink)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("linking(" + session + ")[" + symLink + "]" + source + " => " + target);
+            log.trace("linking({})[{}] {} => {}", session, symLink, source, target);
         }
     }
 
@@ -276,8 +270,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void linked(ServerSession session, Path source, Path target, boolean symLink, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("linked(" + session + ")[" + symLink + "]" + source + " => " + target
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("linked({})[{}] {} => {}{}", session, symLink, source, target, (thrown == null) ? "" : ": " + thrown);
         }
     }
 
@@ -285,7 +278,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void modifyingAttributes(ServerSession session, Path path, Map<String, ?> attrs)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("modifyingAttributes(" + session + ") " + path + ": " + attrs);
+            log.trace("modifyingAttributes({}) {}: {}", session, path, attrs);
         }
     }
 
@@ -293,8 +286,7 @@ public abstract class AbstractSftpEventListenerAdapter extends AbstractLoggingBe
     public void modifiedAttributes(ServerSession session, Path path, Map<String, ?> attrs, Throwable thrown)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("modifiedAttributes(" + session + ") " + path
-                      + ((thrown == null) ? "" : (": " + thrown.getClass().getSimpleName() + ": " + thrown.getMessage())));
+            log.trace("modifiedAttributes({}) {}{}", session, path, (thrown == null) ? "" : ": " + thrown);
         }
     }
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
index 002ec3eac..425234e96 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java
@@ -2307,13 +2307,11 @@ public abstract class AbstractSftpSubsystemHelper
             accessor.putRemoteFileName(this, f, buffer, longName, false);
 
             if (log.isTraceEnabled()) {
-                log.trace("writeDirEntry(" + session + ") id=" + id + ")[" + index + "] - "
-                          + shortName + " [" + longName + "]: " + attrs);
+                log.trace("writeDirEntry({} id={})[{}] - {} [{}]: {}", session, id, index, shortName, longName, attrs);
             }
         } else {
             if (log.isTraceEnabled()) {
-                log.trace("writeDirEntry(" + session + "(id=" + id + ")[" + index + "] - "
-                          + shortName + ": " + attrs);
+                log.trace("writeDirEntry({} id={})[{}] - {}: {}", session, id, index, shortName, attrs);
             }
         }
 
@@ -2420,20 +2418,18 @@ public abstract class AbstractSftpSubsystemHelper
     protected NavigableMap<String, Object> handleUnknownStatusFileAttributes(
             Path file, int flags, LinkOption... options)
             throws IOException {
-        UnsupportedAttributePolicy unsupportedAttributePolicy = getUnsupportedAttributePolicy();
-        switch (unsupportedAttributePolicy) {
+        UnsupportedAttributePolicy policy = getUnsupportedAttributePolicy();
+        switch (policy) {
             case Ignore:
                 break;
             case ThrowException:
                 throw new AccessDeniedException(file.toString(), file.toString(),
                         "Cannot determine existence for attributes of target");
             case Warn:
-                log.warn("handleUnknownStatusFileAttributes(" + getServerSession() + ")[" + file
-                         + "] cannot determine existence");
+                log.warn("handleUnknownStatusFileAttributes({})[{}] cannot determine existence", getServerSession(), file);
                 break;
             default:
-                log.warn("handleUnknownStatusFileAttributes(" + getServerSession() + ")[" + file + "] unknown policy: "
-                         + unsupportedAttributePolicy);
+                log.warn("handleUnknownStatusFileAttributes({})[{}] unknown policy: {}", getServerSession(), file, policy);
         }
 
         return getAttributes(file, flags, options);
@@ -2599,20 +2595,18 @@ public abstract class AbstractSftpSubsystemHelper
             log.trace("handleReadFileAttributesException(" + file + ")[" + view + "] details", e);
         }
 
-        UnsupportedAttributePolicy unsupportedAttributePolicy = getUnsupportedAttributePolicy();
-        switch (unsupportedAttributePolicy) {
+        UnsupportedAttributePolicy policy = getUnsupportedAttributePolicy();
+        switch (policy) {
             case Ignore:
                 break;
             case Warn:
-                log.warn("handleReadFileAttributesException(" + file + ")[" + view + "] " + e.getClass().getSimpleName() + ": "
-                         + e.getMessage());
+                log.warn("handleReadFileAttributesException({})[{}] {}", file, view, e.toString());
                 break;
             case ThrowException:
                 throw e;
             default:
-                log.warn("handleReadFileAttributesException(" + file + ")[" + view + "]"
-                         + " Unknown policy (" + unsupportedAttributePolicy + ")"
-                         + " for " + e.getClass().getSimpleName() + ": " + e.getMessage());
+                log.warn("handleReadFileAttributesException({})[{}] Unknown policy ({}) for {}", file, view, policy,
+                        e.toString());
         }
 
         return Collections.emptyNavigableMap();
@@ -2867,17 +2861,17 @@ public abstract class AbstractSftpSubsystemHelper
         }
 
         String attrsList = GenericUtils.join(attributes, ',');
-        UnsupportedAttributePolicy unsupportedAttributePolicy = getUnsupportedAttributePolicy();
-        switch (unsupportedAttributePolicy) {
+        UnsupportedAttributePolicy policy = getUnsupportedAttributePolicy();
+        switch (policy) {
             case Ignore:
                 break;
             case Warn:
-                log.warn("Unsupported attributes: " + attrsList);
+                log.warn("Unsupported attributes: {}", attrsList);
                 break;
             case ThrowException:
                 throw new UnsupportedOperationException("Unsupported attributes: " + attrsList);
             default:
-                log.warn("Unknown policy for attributes=" + attrsList + ": " + unsupportedAttributePolicy);
+                log.warn("Unknown policy ''{}'' for attributes={}", policy, attrsList);
         }
     }
 
@@ -2905,8 +2899,7 @@ public abstract class AbstractSftpSubsystemHelper
             Class<? extends Principal> principalType, String name, IOException e)
             throws IOException {
         if (log.isTraceEnabled()) {
-            log.trace("handleUserPrincipalLookupServiceException(" + principalType.getSimpleName() + "[" + name + "]) details",
-                    e);
+            log.trace("handleUserPrincipalLookupServiceException({})[{}] details", principalType.getSimpleName(), name, e);
         }
 
         /*
@@ -2915,19 +2908,18 @@ public abstract class AbstractSftpSubsystemHelper
          * "Where an implementation does not support any notion of group or user then this method always throws
          * UserPrincipalNotFoundException."
          */
-        UnsupportedAttributePolicy unsupportedAttributePolicy = getUnsupportedAttributePolicy();
-        switch (unsupportedAttributePolicy) {
+        UnsupportedAttributePolicy policy = getUnsupportedAttributePolicy();
+        switch (policy) {
             case Ignore:
                 break;
             case Warn:
-                log.warn("handleUserPrincipalLookupServiceException(" + principalType.getSimpleName() + "[" + name + "])"
-                         + " failed (" + e.getClass().getSimpleName() + "): " + e.getMessage());
+                log.warn("handleUserPrincipalLookupServiceException({})[{}] failed: {}", principalType.getSimpleName(), name,
+                        e.toString());
                 break;
             case ThrowException:
                 throw e;
             default:
-                log.warn("Unknown policy for principal=" + principalType.getSimpleName() + "[" + name + "]: "
-                         + unsupportedAttributePolicy);
+                log.warn("Unknown policy ''{}'' for principal={} [{}]", policy, principalType.getSimpleName(), name);
         }
     }
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java
index bbfb8f5aa..f4c12ab36 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/SftpSubsystem.java
@@ -1030,7 +1030,7 @@ public class SftpSubsystem
             boolean result = pendingFuture.cancel(true);
             // TODO consider waiting some reasonable (?) amount of time for cancellation
             if (debugEnabled) {
-                log.debug("destroy(" + session + ") - cancel pending future=" + result);
+                log.debug("destroy({}) - cancel pending future={}", session, result);
             }
         }
 
@@ -1040,7 +1040,7 @@ public class SftpSubsystem
         if ((executors != null) && (!executors.isShutdown())) {
             Collection<Runnable> runners = executors.shutdownNow();
             if (debugEnabled) {
-                log.debug("destroy(" + session + ") - shutdown executor service - runners count=" + runners.size());
+                log.debug("destroy({}) - shutdown executor service - runners count={}", session, runners.size());
             }
         }
         this.executorService = null;
@@ -1049,14 +1049,11 @@ public class SftpSubsystem
             fileSystem.close();
         } catch (UnsupportedOperationException e) {
             if (debugEnabled) {
-                log.debug("destroy(" + session + ") closing the file system is not supported");
+                log.debug("destroy({}) closing the file system is not supported", session);
             }
         } catch (IOException e) {
             if (debugEnabled) {
-                log.warn("destroy(" + session + ")"
-                         + " failed (" + e.getClass().getSimpleName() + ")"
-                         + " to close file system: " + e.getMessage(),
-                        e);
+                log.warn("destroy({}) failed to close the file system", session, e);
             }
         }
     }
diff --git a/sshd-sftp/src/test/java/org/apache/sshd/sftp/common/SftpUniversalOwnerAndGroupTest.java b/sshd-sftp/src/test/java/org/apache/sshd/sftp/common/SftpUniversalOwnerAndGroupTest.java
index dc662c3f4..83458c827 100644
--- a/sshd-sftp/src/test/java/org/apache/sshd/sftp/common/SftpUniversalOwnerAndGroupTest.java
+++ b/sshd-sftp/src/test/java/org/apache/sshd/sftp/common/SftpUniversalOwnerAndGroupTest.java
@@ -42,7 +42,7 @@ public class SftpUniversalOwnerAndGroupTest extends JUnitTestSupport {
         for (SftpUniversalOwnerAndGroup value : SftpUniversalOwnerAndGroup.VALUES) {
             String name = value.getName();
             assertFalse(value.name() + ": empty name", GenericUtils.isEmpty(name));
-            assertTrue(value.name() + ": bad suffix", name.charAt(name.length() - 1) == '@');
+            assertEquals(value.name() + ": bad suffix", '@', name.charAt(name.length() - 1));
 
             for (int index = 0; index < name.length() - 1; index++) {
                 char ch = name.charAt(index);
diff --git a/sshd-spring-sftp/src/main/java/org/apache/sshd/sftp/spring/integration/ApacheSshdSftpSessionFactory.java b/sshd-spring-sftp/src/main/java/org/apache/sshd/sftp/spring/integration/ApacheSshdSftpSessionFactory.java
index f0e1dc73f..d39b17540 100644
--- a/sshd-spring-sftp/src/main/java/org/apache/sshd/sftp/spring/integration/ApacheSshdSftpSessionFactory.java
+++ b/sshd-spring-sftp/src/main/java/org/apache/sshd/sftp/spring/integration/ApacheSshdSftpSessionFactory.java
@@ -398,27 +398,20 @@ public class ApacheSshdSftpSessionFactory
                 SftpVersionSelector selector = getSftpVersionSelector();
                 SftpClientFactory sftpFactory = SftpClientFactory.instance();
                 SftpClient sftpClient = sftpFactory.createSftpClient(session, selector);
-                try {
-                    ClientSession sessionInstance = session;
-                    Session<DirEntry> result = sharedInstance
-                            ? new SpringSftpSession(sftpClient)
-                            : new SpringSftpSession(sftpClient, () -> {
-                                try {
-                                    sessionInstance.close();
-                                    return null;
-                                } catch (Exception e) {
-                                    return e;
-                                }
-                            });
-                    // avoid auto-close at finally clause
-                    sftpClient = null;
-                    session = null;
-                    return result;
-                } finally {
-                    if (sftpClient != null) {
-                        sftpClient.close();
-                    }
-                }
+                ClientSession sessionInstance = session;
+                Session<DirEntry> result = sharedInstance
+                        ? new SpringSftpSession(sftpClient)
+                        : new SpringSftpSession(sftpClient, () -> {
+                            try {
+                                sessionInstance.close();
+                                return null;
+                            } catch (Exception e) {
+                                return e;
+                            }
+                        });
+                // avoid auto-close at finally clause
+                session = null;
+                return result;
             } finally {
                 if (session != null) {
                     try {
@@ -523,7 +516,7 @@ public class ApacheSshdSftpSessionFactory
         }
 
         if (debugEnabled) {
-            log.debug("authenticateClientSession({}) authenticate - timeout=", session, timeout);
+            log.debug("authenticateClientSession({}) authenticate - timeout={}", session, timeout);
         }
         session.auth().verify(timeout);
         return session;