diff --git a/dotnet/src/webdriver/Chrome/ChromeDriver.cs b/dotnet/src/webdriver/Chrome/ChromeDriver.cs
index 005572f2f8d07..2841470636536 100644
--- a/dotnet/src/webdriver/Chrome/ChromeDriver.cs
+++ b/dotnet/src/webdriver/Chrome/ChromeDriver.cs
@@ -23,6 +23,8 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 
+#nullable enable
+
 namespace OpenQA.Selenium.Chrome
 {
     /// 
@@ -60,7 +62,7 @@ namespace OpenQA.Selenium.Chrome
     /// 
     public class ChromeDriver : ChromiumDriver
     {
-        private static Dictionary chromeCustomCommands = new Dictionary()
+        private static readonly Dictionary chromeCustomCommands = new Dictionary()
         {
             { ExecuteCdp, new HttpCommandInfo(HttpCommandInfo.PostCommand, "/session/{sessionId}/goog/cdp/execute") },
             { GetCastSinksCommand, new HttpCommandInfo(HttpCommandInfo.GetCommand, "/session/{sessionId}/goog/cast/get_sinks") },
@@ -83,6 +85,7 @@ public ChromeDriver()
         /// Initializes a new instance of the  class using the specified options.
         /// 
         /// The  to be used with the Chrome driver.
+        /// If  is .
         public ChromeDriver(ChromeOptions options)
             : this(ChromeDriverService.CreateDefaultService(), options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -92,6 +95,7 @@ public ChromeDriver(ChromeOptions options)
         /// Initializes a new instance of the  class using the specified driver service.
         /// 
         /// The  used to initialize the driver.
+        /// If  is .
         public ChromeDriver(ChromeDriverService service)
             : this(service, new ChromeOptions())
         {
@@ -113,6 +117,7 @@ public ChromeDriver(string chromeDriverDirectory)
         /// 
         /// The full path to the directory containing ChromeDriver.exe.
         /// The  to be used with the Chrome driver.
+        /// If  is .
         public ChromeDriver(string chromeDriverDirectory, ChromeOptions options)
             : this(chromeDriverDirectory, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -125,6 +130,7 @@ public ChromeDriver(string chromeDriverDirectory, ChromeOptions options)
         /// The full path to the directory containing ChromeDriver.exe.
         /// The  to be used with the Chrome driver.
         /// The maximum amount of time to wait for each command.
+        /// If  is .
         public ChromeDriver(string chromeDriverDirectory, ChromeOptions options, TimeSpan commandTimeout)
             : this(ChromeDriverService.CreateDefaultService(chromeDriverDirectory), options, commandTimeout)
         {
@@ -136,6 +142,7 @@ public ChromeDriver(string chromeDriverDirectory, ChromeOptions options, TimeSpa
         /// 
         /// The  to use.
         /// The  used to initialize the driver.
+        /// If  or  are .
         public ChromeDriver(ChromeDriverService service, ChromeOptions options)
             : this(service, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -147,6 +154,7 @@ public ChromeDriver(ChromeDriverService service, ChromeOptions options)
         /// The  to use.
         /// The  to be used with the Chrome driver.
         /// The maximum amount of time to wait for each command.
+        /// If  or  are .
         public ChromeDriver(ChromeDriverService service, ChromeOptions options, TimeSpan commandTimeout)
             : base(service, options, commandTimeout)
         {
diff --git a/dotnet/src/webdriver/Chromium/ChromiumDriver.cs b/dotnet/src/webdriver/Chromium/ChromiumDriver.cs
index 489109d34f2d4..f683bec9c2eab 100644
--- a/dotnet/src/webdriver/Chromium/ChromiumDriver.cs
+++ b/dotnet/src/webdriver/Chromium/ChromiumDriver.cs
@@ -22,9 +22,12 @@
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
+using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using System.Threading.Tasks;
 
+#nullable enable
+
 namespace OpenQA.Selenium.Chromium
 {
     /// 
@@ -108,9 +111,9 @@ public class ChromiumDriver : WebDriver, ISupportsLogs, IDevTools
         public static readonly string SetPermissionCommand = "setPermission";
 
         private readonly string optionsCapabilityName;
-        private DevToolsSession devToolsSession;
+        private DevToolsSession? devToolsSession;
 
-        private static Dictionary chromiumCustomCommands = new Dictionary()
+        private static readonly Dictionary chromiumCustomCommands = new Dictionary()
         {
             { GetNetworkConditionsCommand, new HttpCommandInfo(HttpCommandInfo.GetCommand, "/session/{sessionId}/chromium/network_conditions") },
             { SetNetworkConditionsCommand, new HttpCommandInfo(HttpCommandInfo.PostCommand, "/session/{sessionId}/chromium/network_conditions") },
@@ -127,19 +130,18 @@ public class ChromiumDriver : WebDriver, ISupportsLogs, IDevTools
         /// The  to use.
         /// The  to be used with the ChromiumDriver.
         /// The maximum amount of time to wait for each command.
+        /// If  or  are .
+        /// If the Chromium options capability name is .
         protected ChromiumDriver(ChromiumDriverService service, ChromiumOptions options, TimeSpan commandTimeout)
             : base(GenerateDriverServiceCommandExecutor(service, options, commandTimeout), ConvertOptionsToCapabilities(options))
         {
-            this.optionsCapabilityName = options.CapabilityName;
+            this.optionsCapabilityName = options.CapabilityName ?? throw new ArgumentException("No chromium options capability name specified", nameof(options));
         }
 
         /// 
         /// Gets the dictionary of custom Chromium commands registered with the driver.
         /// 
-        protected static IReadOnlyDictionary ChromiumCustomCommands
-        {
-            get { return new ReadOnlyDictionary(chromiumCustomCommands); }
-        }
+        protected static IReadOnlyDictionary ChromiumCustomCommands => new ReadOnlyDictionary(chromiumCustomCommands);
 
         /// 
         /// Uses DriverFinder to set Service attributes if necessary when creating the command executor
@@ -150,6 +152,16 @@ protected static IReadOnlyDictionary ChromiumCustomCommands
         /// 
         private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverService service, DriverOptions options, TimeSpan commandTimeout)
         {
+            if (service is null)
+            {
+                throw new ArgumentNullException(nameof(service));
+            }
+
+            if (options is null)
+            {
+                throw new ArgumentNullException(nameof(options));
+            }
+
             if (service.DriverServicePath == null)
             {
                 DriverFinder finder = new DriverFinder(options);
@@ -177,27 +189,31 @@ private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverServi
         /// in conjunction with a standalone WebDriver server.
         public override IFileDetector FileDetector
         {
-            get { return base.FileDetector; }
+            get => base.FileDetector;
             set { }
         }
 
         /// 
         /// Gets a value indicating whether a DevTools session is active.
         /// 
-        public bool HasActiveDevToolsSession
-        {
-            get { return this.devToolsSession != null; }
-        }
+        [MemberNotNullWhen(true, nameof(devToolsSession))]
+        public bool HasActiveDevToolsSession => this.devToolsSession != null;
 
         /// 
         /// Gets or sets the network condition emulation for Chromium.
         /// 
+        /// If the value is set to .
         public ChromiumNetworkConditions NetworkConditions
         {
             get
             {
                 Response response = this.Execute(GetNetworkConditionsCommand, null);
-                return ChromiumNetworkConditions.FromDictionary(response.Value as Dictionary);
+                if (response.Value is not Dictionary responseDictionary)
+                {
+                    throw new WebDriverException($"GetNetworkConditions command returned successfully, but data was not an object: {response.Value}");
+                }
+
+                return ChromiumNetworkConditions.FromDictionary(responseDictionary);
             }
 
             set
@@ -209,6 +225,7 @@ public ChromiumNetworkConditions NetworkConditions
 
                 Dictionary parameters = new Dictionary();
                 parameters["network_conditions"] = value;
+
                 this.Execute(SetNetworkConditionsCommand, parameters);
             }
         }
@@ -217,6 +234,7 @@ public ChromiumNetworkConditions NetworkConditions
         /// Launches a Chromium based application.
         /// 
         /// ID of the chromium app to launch.
+        /// If  is .
         public void LaunchApp(string id)
         {
             if (id == null)
@@ -226,6 +244,7 @@ public void LaunchApp(string id)
 
             Dictionary parameters = new Dictionary();
             parameters["id"] = id;
+
             this.Execute(LaunchAppCommand, parameters);
         }
 
@@ -234,6 +253,7 @@ public void LaunchApp(string id)
         /// 
         /// Name of item to set the permission on.
         /// Value to set the permission to.
+        /// If  or  are .
         public void SetPermission(string permissionName, string permissionValue)
         {
             if (permissionName == null)
@@ -260,7 +280,8 @@ public void SetPermission(string permissionName, string permissionValue)
         /// Name of the command to execute.
         /// Parameters of the command to execute.
         /// An object representing the result of the command, if applicable.
-        public object ExecuteCdpCommand(string commandName, Dictionary commandParameters)
+        /// If  is .
+        public object? ExecuteCdpCommand(string commandName, Dictionary commandParameters)
         {
             if (commandName == null)
             {
@@ -296,21 +317,20 @@ public DevToolsSession GetDevToolsSession(DevToolsOptions options)
                     throw new WebDriverException("Cannot find " + this.optionsCapabilityName + " capability for driver");
                 }
 
-                Dictionary optionsCapability = this.Capabilities.GetCapability(this.optionsCapabilityName) as Dictionary;
-                if (optionsCapability == null)
+                object? optionsCapabilityObject = this.Capabilities.GetCapability(this.optionsCapabilityName);
+                if (optionsCapabilityObject is not Dictionary optionsCapability)
                 {
-                    throw new WebDriverException("Found " + this.optionsCapabilityName + " capability, but is not an object");
+                    throw new WebDriverException($"Found {this.optionsCapabilityName} capability, but is not an object: {optionsCapabilityObject}");
                 }
 
-                if (!optionsCapability.ContainsKey("debuggerAddress"))
+                if (!optionsCapability.TryGetValue("debuggerAddress", out object? debuggerAddress))
                 {
                     throw new WebDriverException("Did not find debuggerAddress capability in " + this.optionsCapabilityName);
                 }
 
-                string debuggerAddress = optionsCapability["debuggerAddress"].ToString();
                 try
                 {
-                    DevToolsSession session = new DevToolsSession(debuggerAddress, options);
+                    DevToolsSession session = new DevToolsSession(debuggerAddress?.ToString(), options);
                     Task.Run(async () => await session.StartSession()).GetAwaiter().GetResult();
                     this.devToolsSession = session;
                 }
@@ -341,7 +361,7 @@ public void CloseDevToolsSession()
         {
             if (this.devToolsSession != null)
             {
-                Task.Run(async () => await this.devToolsSession.StopSession(true)).GetAwaiter().GetResult();
+                Task.Run(async () => await this.devToolsSession.StopSession(manualDetach: true)).GetAwaiter().GetResult();
             }
         }
 
@@ -361,18 +381,16 @@ public List> GetCastSinks()
         {
             List> returnValue = new List>();
             Response response = this.Execute(GetCastSinksCommand, null);
-            object[] responseValue = response.Value as object[];
-            if (responseValue != null)
+            if (response.Value is object?[] responseValue)
             {
-                foreach (object entry in responseValue)
+                foreach (object? entry in responseValue)
                 {
-                    Dictionary entryValue = entry as Dictionary;
-                    if (entryValue != null)
+                    if (entry is Dictionary entryValue)
                     {
                         Dictionary sink = new Dictionary();
-                        foreach (KeyValuePair pair in entryValue)
+                        foreach (KeyValuePair pair in entryValue)
                         {
-                            sink[pair.Key] = pair.Value.ToString();
+                            sink[pair.Key] = pair.Value!.ToString()!;
                         }
 
                         returnValue.Add(sink);
@@ -434,10 +452,10 @@ public void StartDesktopMirroring(string deviceName)
         /// Returns the error message if there is any issue in a Cast session.
         /// 
         /// An error message.
-        public String GetCastIssueMessage()
+        public string? GetCastIssueMessage()
         {
             Response response = this.Execute(GetCastIssueMessageCommand, null);
-            return (string)response.Value;
+            return (string?)response.Value;
         }
 
         /// 
diff --git a/dotnet/src/webdriver/Chromium/ChromiumNetworkConditions.cs b/dotnet/src/webdriver/Chromium/ChromiumNetworkConditions.cs
index 78329f1722edb..6150bacaef766 100644
--- a/dotnet/src/webdriver/Chromium/ChromiumNetworkConditions.cs
+++ b/dotnet/src/webdriver/Chromium/ChromiumNetworkConditions.cs
@@ -91,12 +91,12 @@ public long UploadThroughput
         /// 
         /// The dictionary to use to create the object.
         /// The ChromiumNetworkConditions object created from the dictionary.
-        public static ChromiumNetworkConditions FromDictionary(Dictionary dictionary)
+        public static ChromiumNetworkConditions FromDictionary(Dictionary dictionary)
         {
             ChromiumNetworkConditions conditions = new ChromiumNetworkConditions();
             if (dictionary.TryGetValue("offline", out object? offline))
             {
-                conditions.IsOffline = (bool)offline;
+                conditions.IsOffline = (bool)offline!;
             }
 
             if (dictionary.TryGetValue("latency", out object? latency))
@@ -106,12 +106,12 @@ public static ChromiumNetworkConditions FromDictionary(Dictionary
@@ -30,7 +32,7 @@ namespace OpenQA.Selenium.Edge
     /// 
     public class EdgeDriver : ChromiumDriver
     {
-        private static Dictionary edgeCustomCommands = new Dictionary()
+        private static readonly Dictionary edgeCustomCommands = new Dictionary()
         {
             { ExecuteCdp, new HttpCommandInfo(HttpCommandInfo.PostCommand, "/session/{sessionId}/ms/cdp/execute") },
             { GetCastSinksCommand, new HttpCommandInfo(HttpCommandInfo.GetCommand, "/session/{sessionId}/ms/cast/get_sinks") },
@@ -53,6 +55,7 @@ public EdgeDriver()
         /// Initializes a new instance of the  class using the specified options.
         /// 
         /// The  to be used with the Edge driver.
+        /// If  is .
         public EdgeDriver(EdgeOptions options)
             : this(EdgeDriverService.CreateDefaultService(), options)
         {
@@ -62,6 +65,7 @@ public EdgeDriver(EdgeOptions options)
         /// Initializes a new instance of the  class using the specified driver service.
         /// 
         /// The  used to initialize the driver.
+        /// If  is .
         public EdgeDriver(EdgeDriverService service)
             : this(service, new EdgeOptions())
         {
@@ -83,6 +87,7 @@ public EdgeDriver(string edgeDriverDirectory)
         /// 
         /// The full path to the directory containing the WebDriver executable.
         /// The  to be used with the Edge driver.
+        /// If  is .
         public EdgeDriver(string edgeDriverDirectory, EdgeOptions options)
             : this(edgeDriverDirectory, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -95,6 +100,7 @@ public EdgeDriver(string edgeDriverDirectory, EdgeOptions options)
         /// The full path to the directory containing the WebDriver executable.
         /// The  to be used with the Edge driver.
         /// The maximum amount of time to wait for each command.
+        /// If  is .
         public EdgeDriver(string edgeDriverDirectory, EdgeOptions options, TimeSpan commandTimeout)
             : this(EdgeDriverService.CreateDefaultService(edgeDriverDirectory), options, commandTimeout)
         {
@@ -106,6 +112,7 @@ public EdgeDriver(string edgeDriverDirectory, EdgeOptions options, TimeSpan comm
         /// 
         /// The  to use.
         /// The  used to initialize the driver.
+        /// If  or  are .
         public EdgeDriver(EdgeDriverService service, EdgeOptions options)
             : this(service, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -117,6 +124,7 @@ public EdgeDriver(EdgeDriverService service, EdgeOptions options)
         /// The  to use.
         /// The  to be used with the Edge driver.
         /// The maximum amount of time to wait for each command.
+        /// If  or  are .
         public EdgeDriver(EdgeDriverService service, EdgeOptions options, TimeSpan commandTimeout)
             : base(service, options, commandTimeout)
         {
diff --git a/dotnet/src/webdriver/Firefox/FirefoxDriver.cs b/dotnet/src/webdriver/Firefox/FirefoxDriver.cs
index 256d6f2dac55b..e2b809791a835 100644
--- a/dotnet/src/webdriver/Firefox/FirefoxDriver.cs
+++ b/dotnet/src/webdriver/Firefox/FirefoxDriver.cs
@@ -24,7 +24,8 @@
 using System.Globalization;
 using System.IO;
 using System.IO.Compression;
-using System.Threading.Tasks;
+
+#nullable enable
 
 namespace OpenQA.Selenium.Firefox
 {
@@ -97,7 +98,7 @@ public class FirefoxDriver : WebDriver
         /// 
         public static readonly string GetFullPageScreenshotCommand = "fullPageScreenshot";
 
-        private static Dictionary firefoxCustomCommands = new Dictionary()
+        private static readonly Dictionary firefoxCustomCommands = new Dictionary()
         {
             { SetContextCommand, new HttpCommandInfo(HttpCommandInfo.PostCommand, "/session/{sessionId}/moz/context") },
             { GetContextCommand, new HttpCommandInfo(HttpCommandInfo.GetCommand, "/session/{sessionId}/moz/context") },
@@ -118,6 +119,7 @@ public FirefoxDriver()
         /// Initializes a new instance of the  class using the specified options. Uses the Mozilla-provided Marionette driver implementation.
         /// 
         /// The  to be used with the Firefox driver.
+        /// If  is .
         public FirefoxDriver(FirefoxOptions options)
             : this(FirefoxDriverService.CreateDefaultService(), options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -127,6 +129,7 @@ public FirefoxDriver(FirefoxOptions options)
         /// Initializes a new instance of the  class using the specified driver service. Uses the Mozilla-provided Marionette driver implementation.
         /// 
         /// The  used to initialize the driver.
+        /// If  is .
         public FirefoxDriver(FirefoxDriverService service)
             : this(service, new FirefoxOptions(), RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -134,9 +137,9 @@ public FirefoxDriver(FirefoxDriverService service)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing geckodriver.exe.
+        /// to the directory containing geckodriver.exe.
         /// 
-        /// The full path to the directory containing geckodriver.exe.
+        /// The full path to the directory containing geckodriver.exe.
         public FirefoxDriver(string geckoDriverDirectory)
             : this(geckoDriverDirectory, new FirefoxOptions())
         {
@@ -144,10 +147,11 @@ public FirefoxDriver(string geckoDriverDirectory)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing geckodriver.exe and options.
+        /// to the directory containing geckodriver.exe and options.
         /// 
-        /// The full path to the directory containing geckodriver.exe.
+        /// The full path to the directory containing geckodriver.exe.
         /// The  to be used with the Firefox driver.
+        /// If  is .
         public FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options)
             : this(geckoDriverDirectory, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -155,11 +159,12 @@ public FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing geckodriver.exe, options, and command timeout.
+        /// to the directory containing geckodriver.exe, options, and command timeout.
         /// 
-        /// The full path to the directory containing geckodriver.exe.
+        /// The full path to the directory containing geckodriver.exe.
         /// The  to be used with the Firefox driver.
         /// The maximum amount of time to wait for each command.
+        /// If  is .
         public FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSpan commandTimeout)
             : this(FirefoxDriverService.CreateDefaultService(geckoDriverDirectory), options, commandTimeout)
         {
@@ -170,6 +175,7 @@ public FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSp
         /// 
         /// The  to use.
         /// The  to be used with the Firefox driver.
+        /// If  or  are .
         public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options)
             : this(service, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -181,6 +187,7 @@ public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options)
         /// The  to use.
         /// The  to be used with the Firefox driver.
         /// The maximum amount of time to wait for each command.
+        /// If  or  are .
         public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options, TimeSpan commandTimeout)
             : base(GenerateDriverServiceCommandExecutor(service, options, commandTimeout), ConvertOptionsToCapabilities(options))
         {
@@ -195,8 +202,19 @@ public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options, TimeS
         /// 
         /// 
         /// 
+        /// If  is .
         private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverService service, DriverOptions options, TimeSpan commandTimeout)
         {
+            if (options is null)
+            {
+                throw new ArgumentNullException(nameof(options));
+            }
+
+            if (service is null)
+            {
+                throw new ArgumentNullException(nameof(service));
+            }
+
             if (service.DriverServicePath == null)
             {
                 DriverFinder finder = new DriverFinder(options);
@@ -217,10 +235,7 @@ private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverServi
         /// The keys of the dictionary are the names assigned to the command; the values are the
         ///  objects describing the command behavior.
         /// 
-        public static IReadOnlyDictionary CustomCommandDefinitions
-        {
-            get { return new ReadOnlyDictionary(firefoxCustomCommands); }
-        }
+        public static IReadOnlyDictionary CustomCommandDefinitions => new ReadOnlyDictionary(firefoxCustomCommands);
 
         /// 
         /// Gets or sets the  responsible for detecting
@@ -234,31 +249,30 @@ public static IReadOnlyDictionary CustomCommandDefinitions
         /// conjunction with a standalone WebDriver server.
         public override IFileDetector FileDetector
         {
-            get { return base.FileDetector; }
+            get => base.FileDetector;
             set { }
         }
 
         /// 
-        /// Sets the command context used when issuing commands to geckodriver.
+        /// Sets the command context used when issuing commands to geckodriver.
         /// 
         /// If response is not recognized
         /// The context of commands.
         public FirefoxCommandContext GetContext()
         {
-            FirefoxCommandContext output;
-            string response = this.Execute(GetContextCommand, null).Value.ToString();
+            Response commandResponse = this.Execute(GetContextCommand, null);
 
-            bool success = Enum.TryParse(response, true, out output);
-            if (!success)
+            if (commandResponse.Value is not string response
+                || !Enum.TryParse(response, ignoreCase: true, out FirefoxCommandContext output))
             {
-                throw new WebDriverException(string.Format(CultureInfo.InvariantCulture, "Do not recognize response: {0}; expected Context or Chrome"));
+                throw new WebDriverException(string.Format(CultureInfo.InvariantCulture, "Do not recognize response: {0}; expected Context or Chrome", commandResponse.Value));
             }
 
             return output;
         }
 
         /// 
-        /// Sets the command context used when issuing commands to geckodriver.
+        /// Sets the command context used when issuing commands to geckodriver.
         /// 
         /// The  value to which to set the context.
         public void SetContext(FirefoxCommandContext context)
@@ -313,12 +327,16 @@ public string InstallAddOnFromFile(string addOnFileToInstall, bool temporary = f
                 throw new ArgumentNullException(nameof(addOnFileToInstall), "Add-on file name must not be null or the empty string");
             }
 
-            if (!File.Exists(addOnFileToInstall))
+            byte[] addOnBytes;
+            try
+            {
+                addOnBytes = File.ReadAllBytes(addOnFileToInstall);
+            }
+            catch (Exception ex)
             {
-                throw new ArgumentException("File " + addOnFileToInstall + " does not exist", nameof(addOnFileToInstall));
+                throw new ArgumentException($"Failed to read from file {addOnFileToInstall}", nameof(addOnFileToInstall), ex);
             }
 
-            byte[] addOnBytes = File.ReadAllBytes(addOnFileToInstall);
             string base64EncodedAddOn = Convert.ToBase64String(addOnBytes);
 
             return this.InstallAddOn(base64EncodedAddOn, temporary);
@@ -344,7 +362,8 @@ public string InstallAddOn(string base64EncodedAddOn, bool temporary = false)
                 ["temporary"] = temporary
             };
             Response response = this.Execute(InstallAddOnCommand, parameters);
-            return (string)response.Value;
+
+            return (string)response.Value!;
         }
 
         /// 
@@ -371,7 +390,9 @@ public void UninstallAddOn(string addOnId)
         public Screenshot GetFullPageScreenshot()
         {
             Response screenshotResponse = this.Execute(GetFullPageScreenshotCommand, null);
-            string base64 = screenshotResponse.Value.ToString();
+
+            screenshotResponse.EnsureValueIsNotNull();
+            string base64 = screenshotResponse.Value.ToString()!;
             return new Screenshot(base64);
         }
 
diff --git a/dotnet/src/webdriver/IE/InternetExplorerDriver.cs b/dotnet/src/webdriver/IE/InternetExplorerDriver.cs
index f129ef28e2769..dcc02890c7065 100644
--- a/dotnet/src/webdriver/IE/InternetExplorerDriver.cs
+++ b/dotnet/src/webdriver/IE/InternetExplorerDriver.cs
@@ -21,6 +21,8 @@
 using System;
 using System.IO;
 
+#nullable enable
+
 namespace OpenQA.Selenium.IE
 {
     /// 
@@ -76,6 +78,7 @@ public InternetExplorerDriver()
         /// options.
         /// 
         /// The  used to initialize the driver.
+        /// If  is .
         public InternetExplorerDriver(InternetExplorerOptions options)
             : this(InternetExplorerDriverService.CreateDefaultService(), options)
         {
@@ -85,6 +88,7 @@ public InternetExplorerDriver(InternetExplorerOptions options)
         /// Initializes a new instance of the  class using the specified driver service.
         /// 
         /// The  used to initialize the driver.
+        /// If  is .
         public InternetExplorerDriver(InternetExplorerDriverService service)
             : this(service, new InternetExplorerOptions())
         {
@@ -92,9 +96,9 @@ public InternetExplorerDriver(InternetExplorerDriverService service)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing IEDriverServer.exe.
+        /// to the directory containing IEDriverServer.exe.
         /// 
-        /// The full path to the directory containing IEDriverServer.exe.
+        /// The full path to the directory containing IEDriverServer.exe.
         public InternetExplorerDriver(string internetExplorerDriverServerDirectory)
             : this(internetExplorerDriverServerDirectory, new InternetExplorerOptions())
         {
@@ -102,10 +106,11 @@ public InternetExplorerDriver(string internetExplorerDriverServerDirectory)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing IEDriverServer.exe and options.
+        /// to the directory containing IEDriverServer.exe and options.
         /// 
-        /// The full path to the directory containing IEDriverServer.exe.
+        /// The full path to the directory containing IEDriverServer.exe.
         /// The  used to initialize the driver.
+        /// If  is .
         public InternetExplorerDriver(string internetExplorerDriverServerDirectory, InternetExplorerOptions options)
             : this(internetExplorerDriverServerDirectory, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -113,11 +118,12 @@ public InternetExplorerDriver(string internetExplorerDriverServerDirectory, Inte
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing IEDriverServer.exe, options, and command timeout.
+        /// to the directory containing IEDriverServer.exe, options, and command timeout.
         /// 
-        /// The full path to the directory containing IEDriverServer.exe.
+        /// The full path to the directory containing IEDriverServer.exe.
         /// The  used to initialize the driver.
         /// The maximum amount of time to wait for each command.
+        /// If  is .
         public InternetExplorerDriver(string internetExplorerDriverServerDirectory, InternetExplorerOptions options, TimeSpan commandTimeout)
             : this(InternetExplorerDriverService.CreateDefaultService(internetExplorerDriverServerDirectory), options, commandTimeout)
         {
@@ -129,6 +135,7 @@ public InternetExplorerDriver(string internetExplorerDriverServerDirectory, Inte
         /// 
         /// The  to use.
         /// The  used to initialize the driver.
+        /// If  or  are .
         public InternetExplorerDriver(InternetExplorerDriverService service, InternetExplorerOptions options)
             : this(service, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -141,6 +148,7 @@ public InternetExplorerDriver(InternetExplorerDriverService service, InternetExp
         /// The  to use.
         /// The  used to initialize the driver.
         /// The maximum amount of time to wait for each command.
+        /// If  or  are .
         public InternetExplorerDriver(InternetExplorerDriverService service, InternetExplorerOptions options, TimeSpan commandTimeout)
             : base(GenerateDriverServiceCommandExecutor(service, options, commandTimeout), ConvertOptionsToCapabilities(options))
         {
@@ -155,6 +163,16 @@ public InternetExplorerDriver(InternetExplorerDriverService service, InternetExp
         /// 
         private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverService service, DriverOptions options, TimeSpan commandTimeout)
         {
+            if (service is null)
+            {
+                throw new ArgumentNullException(nameof(service));
+            }
+
+            if (options is null)
+            {
+                throw new ArgumentNullException(nameof(options));
+            }
+
             if (service.DriverServicePath == null)
             {
                 DriverFinder finder = new DriverFinder(options);
@@ -170,14 +188,14 @@ private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverServi
         /// sequences of keystrokes representing file paths and names.
         /// 
         /// The IE driver does not allow a file detector to be set,
-        /// as the server component of the IE driver (IEDriverServer.exe) only
+        /// as the server component of the IE driver (IEDriverServer.exe) only
         /// allows uploads from the local computer environment. Attempting to set
         /// this property has no effect, but does not throw an exception. If you
         /// are attempting to run the IE driver remotely, use 
         /// in conjunction with a standalone WebDriver server.
         public override IFileDetector FileDetector
         {
-            get { return base.FileDetector; }
+            get => base.FileDetector;
             set { }
         }
 
diff --git a/dotnet/src/webdriver/Safari/SafariDriver.cs b/dotnet/src/webdriver/Safari/SafariDriver.cs
index b8d81c22ed56d..0f0526633bfb4 100644
--- a/dotnet/src/webdriver/Safari/SafariDriver.cs
+++ b/dotnet/src/webdriver/Safari/SafariDriver.cs
@@ -22,6 +22,8 @@
 using System.Collections.Generic;
 using System.IO;
 
+#nullable enable
+
 namespace OpenQA.Selenium.Safari
 {
     /// 
@@ -80,6 +82,7 @@ public SafariDriver()
         /// Initializes a new instance of the  class using the specified .
         /// 
         /// The  to use for this  instance.
+        /// If  is .
         public SafariDriver(SafariOptions options)
             : this(SafariDriverService.CreateDefaultService(), options)
         {
@@ -89,6 +92,7 @@ public SafariDriver(SafariOptions options)
         /// Initializes a new instance of the  class using the specified driver service.
         /// 
         /// The  used to initialize the driver.
+        /// If  is .
         public SafariDriver(SafariDriverService service)
             : this(service, new SafariOptions())
         {
@@ -96,7 +100,7 @@ public SafariDriver(SafariDriverService service)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing safaridriver.
+        /// to the directory containing safaridriver.
         /// 
         /// The full path to the directory containing SafariDriver executable.
         public SafariDriver(string safariDriverDirectory)
@@ -106,10 +110,11 @@ public SafariDriver(string safariDriverDirectory)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing safaridriver and options.
+        /// to the directory containing safaridriver and options.
         /// 
         /// The full path to the directory containing SafariDriver executable.
         /// The  to be used with the Safari driver.
+        /// If  is .
         public SafariDriver(string safariDriverDirectory, SafariOptions options)
             : this(safariDriverDirectory, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -117,11 +122,12 @@ public SafariDriver(string safariDriverDirectory, SafariOptions options)
 
         /// 
         /// Initializes a new instance of the  class using the specified path
-        /// to the directory containing safaridriver, options, and command timeout.
+        /// to the directory containing safaridriver, options, and command timeout.
         /// 
         /// The full path to the directory containing SafariDriver executable.
         /// The  to be used with the Safari driver.
         /// The maximum amount of time to wait for each command.
+        /// If  is .
         public SafariDriver(string safariDriverDirectory, SafariOptions options, TimeSpan commandTimeout)
             : this(SafariDriverService.CreateDefaultService(safariDriverDirectory), options, commandTimeout)
         {
@@ -133,6 +139,7 @@ public SafariDriver(string safariDriverDirectory, SafariOptions options, TimeSpa
         /// 
         /// The  to use.
         /// The  used to initialize the driver.
+        /// If  or  are .
         public SafariDriver(SafariDriverService service, SafariOptions options)
             : this(service, options, RemoteWebDriver.DefaultCommandTimeout)
         {
@@ -144,6 +151,7 @@ public SafariDriver(SafariDriverService service, SafariOptions options)
         /// The  to use.
         /// The  to be used with the Safari driver.
         /// The maximum amount of time to wait for each command.
+        /// If  or  are .
         public SafariDriver(SafariDriverService service, SafariOptions options, TimeSpan commandTimeout)
             : base(GenerateDriverServiceCommandExecutor(service, options, commandTimeout), ConvertOptionsToCapabilities(options))
         {
@@ -161,6 +169,16 @@ public SafariDriver(SafariDriverService service, SafariOptions options, TimeSpan
         /// 
         private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverService service, DriverOptions options, TimeSpan commandTimeout)
         {
+            if (service is null)
+            {
+                throw new ArgumentNullException(nameof(service));
+            }
+
+            if (options is null)
+            {
+                throw new ArgumentNullException(nameof(options));
+            }
+
             if (service.DriverServicePath == null)
             {
                 DriverFinder finder = new DriverFinder(options);
@@ -178,7 +196,7 @@ private static ICommandExecutor GenerateDriverServiceCommandExecutor(DriverServi
         /// 
         public void AttachDebugger()
         {
-            Dictionary parameters = new Dictionary();
+            Dictionary parameters = new Dictionary();
             parameters["attachDebugger"] = null;
             this.Execute(AttachDebuggerCommand, parameters);
         }
@@ -188,6 +206,7 @@ public void AttachDebugger()
         /// 
         /// The name of the item to set permission on.
         /// Whether the permission has been granted.
+        /// If  is  or .
         public void SetPermission(string permissionName, bool permissionValue)
         {
             if (string.IsNullOrEmpty(permissionName))
@@ -206,7 +225,7 @@ public void SetPermission(string permissionName, bool permissionValue)
         /// Returns Each available permission item and whether it is allowed or not.
         /// 
         /// whether the item is allowed or not.
-        public Object GetPermissions()
+        public object? GetPermissions()
         {
             Response response = this.Execute(GetPermissionsCommand, null);
             return response.Value;
@@ -224,7 +243,7 @@ public Object GetPermissions()
         /// in conjunction with a standalone WebDriver server.
         public override IFileDetector FileDetector
         {
-            get { return base.FileDetector; }
+            get => base.FileDetector;
             set { }
         }