Simpler backward compatibility.
diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/FileSystemConfigBuilder.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/FileSystemConfigBuilder.java
index 9b9ea7c..ad7dcb4 100644
--- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/FileSystemConfigBuilder.java
+++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/FileSystemConfigBuilder.java
@@ -20,6 +20,8 @@
 import java.util.Objects;
 import java.util.function.Function;
 
+import org.apache.commons.vfs2.util.DurationUtils;
+
 /**
  * Abstract class which has the right to fill FileSystemOptions.
  */
@@ -279,6 +281,35 @@
     }
 
     /**
+     * Gets a named option as a Duration bound to the integer range.
+     *
+     * @param fileSystemOptions file system options to query, may be null.
+     * @param name the option name
+     * @return the option in {@code opts} or system properties, otherwise null
+     * @see #getLong(FileSystemOptions, String, Long)
+     *
+     * @since 2.8.0
+     */
+    protected Integer getDurationInteger(final FileSystemOptions fileSystemOptions, final String name) {
+        return getDurationInteger(fileSystemOptions, name, null);
+    }
+
+    /**
+     * Gets a named option as a Duration bound to the integer range.
+     *
+     * @param fileSystemOptions file system options to query, may be null.
+     * @param name the option name
+     * @param defaultValue value to return if option is not present
+     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
+     *
+     * @since 2.8.0
+     */
+    protected Integer getDurationInteger(final FileSystemOptions fileSystemOptions, final String name,
+        final Duration defaultValue) {
+        return DurationUtils.toMillisInt(getParam(fileSystemOptions, name, defaultValue, Duration::parse));
+    }
+
+    /**
      *Gets a named option as a Double.
      *
      * @param <E> enumeration type
@@ -489,7 +520,7 @@
      * @since 2.8.0
      */
     private <T> T getParam(final FileSystemOptions fileSystemOptions, final String name, final T defaultValue,
-        Function<String, T> function) {
+        final Function<String, T> function) {
         T value = getParam(fileSystemOptions, name);
         if (value == null) {
             final String str = getProperty(name);
diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
index 341a076..6d75340 100644
--- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
+++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
@@ -32,6 +32,7 @@
 import org.apache.commons.net.ftp.parser.FTPFileEntryParserFactory;
 import org.apache.commons.vfs2.FileSystemException;
 import org.apache.commons.vfs2.FileSystemOptions;
+import org.apache.commons.vfs2.util.DurationUtils;
 import org.apache.commons.vfs2.util.UserAuthenticatorUtils;
 
 /**
@@ -142,7 +143,7 @@
                 try {
                     final Duration connectTimeout = builder.getConnectTimeoutDuration(fileSystemOptions);
                     if (connectTimeout != null) {
-                        client.setDefaultTimeout(toIntMillisTimeout(connectTimeout));
+                        client.setDefaultTimeout(DurationUtils.toMillisInt(connectTimeout));
                     }
 
                     final String controlEncoding = builder.getControlEncoding(fileSystemOptions);
@@ -186,12 +187,12 @@
                     // Set dataTimeout value
                     final Duration dataTimeout = builder.getDataTimeoutDuration(fileSystemOptions);
                     if (dataTimeout != null) {
-                        client.setDataTimeout(toIntMillisTimeout(dataTimeout));
+                        client.setDataTimeout(DurationUtils.toMillisInt(dataTimeout));
                     }
 
                     final Duration socketTimeout = builder.getSoTimeoutDuration(fileSystemOptions);
                     if (socketTimeout != null) {
-                        client.setSoTimeout(toIntMillisTimeout(socketTimeout));
+                        client.setSoTimeout(DurationUtils.toMillisInt(socketTimeout));
                     }
 
                     final Duration controlKeepAliveTimeout = builder.getControlKeepAliveTimeout(fileSystemOptions);
@@ -234,10 +235,6 @@
         }
 
         protected abstract void setupOpenConnection(C client, FileSystemOptions fileSystemOptions) throws IOException;
-
-        private int toIntMillisTimeout(final Duration duration) {
-            return (int) Math.min(duration.toMillis(), Integer.MAX_VALUE);
-        }
     }
 
     /** Connection Factory, used to configure the FTPClient. */
diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileSystemConfigBuilder.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileSystemConfigBuilder.java
index 05862ac..295b0df 100644
--- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileSystemConfigBuilder.java
+++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpFileSystemConfigBuilder.java
@@ -113,7 +113,7 @@
      */
     @Deprecated
     public Integer getConnectTimeout(final FileSystemOptions options) {
-        return (int) getConnectTimeoutDuration(options).toMillis();
+        return getDurationInteger(options, CONNECT_TIMEOUT);
     }
 
     /**
@@ -141,7 +141,7 @@
      * @return The controlKeepAliveReplyTimeout value.
      * @since 2.8.0
      */
-    public Duration getControlKeepAliveReplyTimeout(FileSystemOptions options) {
+    public Duration getControlKeepAliveReplyTimeout(final FileSystemOptions options) {
         return getDuration(options, CONTROL_KEEP_ALIVE_REPLY_TIMEOUT);
     }
 
@@ -150,7 +150,7 @@
      * @return The controlKeepAliveTimeout value.
      * @since 2.8.0
      */
-    public Duration getControlKeepAliveTimeout(FileSystemOptions options) {
+    public Duration getControlKeepAliveTimeout(final FileSystemOptions options) {
         return getDuration(options, CONTROL_KEEP_ALIVE_TIMEOUT);
     }
 
@@ -162,7 +162,7 @@
      */
     @Deprecated
     public Integer getDataTimeout(final FileSystemOptions options) {
-        return (int) getDataTimeoutDuration(options).toMillis();
+        return getDurationInteger(options, DATA_TIMEOUT);
     }
 
     /**
@@ -310,7 +310,7 @@
      */
     @Deprecated
     public Integer getSoTimeout(final FileSystemOptions options) {
-        return (int) getSoTimeoutDuration(options).toMillis();
+        return getDurationInteger(options, SO_TIMEOUT);
     }
 
     /**
@@ -407,7 +407,7 @@
      * @param duration timeout duration.
      * @since 2.8.0
      */
-    public void setControlKeepAliveReplyTimeout(FileSystemOptions options, final Duration duration) {
+    public void setControlKeepAliveReplyTimeout(final FileSystemOptions options, final Duration duration) {
         setParam(options, CONTROL_KEEP_ALIVE_REPLY_TIMEOUT, duration);
     }
 
@@ -421,7 +421,7 @@
      * @param duration The timeout duration.
      * @since 2.8.0
      */
-    public void setControlKeepAliveTimeout(FileSystemOptions options, final Duration duration) {
+    public void setControlKeepAliveTimeout(final FileSystemOptions options, final Duration duration) {
         setParam(options, CONTROL_KEEP_ALIVE_TIMEOUT, duration);
     }
 
diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/util/DurationUtils.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/util/DurationUtils.java
new file mode 100644
index 0000000..eba9c02
--- /dev/null
+++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/util/DurationUtils.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.vfs2.util;
+
+import java.time.Duration;
+
+/** Temporary until Commons Lang 3.12.0. */
+public class DurationUtils {
+
+    /** Temporary until Commons Lang 3.12.0. */
+    public static int toMillisInt(final Duration duration) {
+        final long millis = duration.toMillis();
+        return millis > 0 ? (int) Math.min(millis, Integer.MAX_VALUE) : (int) Math.max(millis, Integer.MIN_VALUE);
+    }
+
+}