diff --git a/Pipfile b/Pipfile
index 17f15897..5af79be7 100644
--- a/Pipfile
+++ b/Pipfile
@@ -8,6 +8,7 @@ pre-commit = "~=2.6"
 
 [packages]
 selenium = "~=3.141"
+selenium = "4.0.0.a7"
 
 autopep8 = "~=1.5"
 
diff --git a/README.md b/README.md
index 5a196a9c..ad19f26c 100644
--- a/README.md
+++ b/README.md
@@ -127,6 +127,25 @@ desired_caps = dict(
 self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps, direct_connection=True)
 ```
 
+## Relax SSL validation
+
+`strict_ssl` option allows you to send commands to an invalid certificate host like self-certificated SSL.
+
+```python
+import unittest
+from appium import webdriver
+
+desired_caps = dict(
+    platformName='iOS',
+    platformVersion='13.4',
+    automationName='xcuitest',
+    deviceName='iPhone Simulator',
+    app=PATH('../../apps/UICatalog.app.zip')
+)
+
+self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps, strict_ssl=False)
+```
+
 ## Documentation
 
 https://appium.github.io/python-client-sphinx/ is detailed documentation
diff --git a/appium/webdriver/appium_connection.py b/appium/webdriver/appium_connection.py
index f643a168..bfe6197b 100644
--- a/appium/webdriver/appium_connection.py
+++ b/appium/webdriver/appium_connection.py
@@ -13,6 +13,7 @@
 # limitations under the License.
 
 import uuid
+import urllib3
 from typing import TYPE_CHECKING, Any, Dict
 
 from selenium.webdriver.remote.remote_connection import RemoteConnection
@@ -25,6 +26,21 @@
 
 class AppiumConnection(RemoteConnection):
 
+    def _get_connection_manager(self):
+        # https://github.com/SeleniumHQ/selenium/blob/0e0194b0e52a34e7df4b841f1ed74506beea5c3e/py/selenium/webdriver/remote/remote_connection.py#L134
+        pool_manager_init_args = {
+            'timeout': self._timeout
+        }
+        if self._ca_certs:
+            pool_manager_init_args['cert_reqs'] = 'CERT_REQUIRED'
+            pool_manager_init_args['ca_certs'] = self._ca_certs
+        else:
+            # This line is necessary to disable certificate verification
+            pool_manager_init_args['cert_reqs'] = 'CERT_NONE'
+
+        return urllib3.PoolManager(**pool_manager_init_args) if self._proxy_url is None else \
+            urllib3.ProxyManager(self._proxy_url, **pool_manager_init_args)
+
     @classmethod
     def get_remote_connection_headers(cls, parsed_url: 'ParseResult', keep_alive: bool = True) -> Dict[str, Any]:
         """Override get_remote_connection_headers in RemoteConnection"""
diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py
index 72d0dafe..c37a4766 100644
--- a/appium/webdriver/webdriver.py
+++ b/appium/webdriver/webdriver.py
@@ -146,7 +146,17 @@ class WebDriver(
 ):
 
     def __init__(self, command_executor: str = 'http://127.0.0.1:4444/wd/hub',
-                 desired_capabilities: Optional[Dict] = None, browser_profile: str = None, proxy: str = None, keep_alive: bool = True, direct_connection: bool = False):
+                 desired_capabilities: Optional[Dict] = None,
+                 browser_profile: str = None,
+                 proxy: str = None,
+                 keep_alive: bool = True,
+                 direct_connection: bool = True,
+                 strict_ssl: bool = True):
+
+        if strict_ssl is False:
+            import urllib3
+            AppiumConnection.set_certificate_bundle_path(None)
+            urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
 
         super().__init__(
             AppiumConnection(command_executor, keep_alive=keep_alive),
@@ -182,17 +192,17 @@ def _update_command_executor(self, keep_alive: bool) -> None:
         direct_port = 'directConnectPort'
         direct_path = 'directConnectPath'
 
-        if (not {direct_protocol, direct_host, direct_port, direct_path}.issubset(set(self.capabilities))):
+        if (not {direct_protocol, direct_host, direct_port, direct_path}.issubset(set(self.caps))):
             message = 'Direct connect capabilities from server were:\n'
             for key in [direct_protocol, direct_host, direct_port, direct_path]:
-                message += '{}: \'{}\'\n'.format(key, self.capabilities.get(key, ''))
+                message += '{}: \'{}\'\n'.format(key, self.caps.get(key, ''))
             logger.warning(message)
             return
 
-        protocol = self.capabilities[direct_protocol]
-        hostname = self.capabilities[direct_host]
-        port = self.capabilities[direct_port]
-        path = self.capabilities[direct_path]
+        protocol = self.caps[direct_protocol]
+        hostname = self.caps[direct_host]
+        port = self.caps[direct_port]
+        path = self.caps[direct_path]
         executor = f'{protocol}://{hostname}:{port}{path}'
 
         logger.info('Updated request endpoint to %s', executor)
@@ -200,6 +210,7 @@ def _update_command_executor(self, keep_alive: bool) -> None:
         self.command_executor = RemoteConnection(executor, keep_alive=keep_alive)
         self._addCommands()
 
+    # https://github.com/SeleniumHQ/selenium/blob/06fdf2966df6bca47c0ae45e8201cd30db9b9a49/py/selenium/webdriver/remote/webdriver.py#L277
     def start_session(self, capabilities: Dict, browser_profile: Optional[str] = None) -> None:
         """Creates a new session with the desired capabilities.
 
@@ -226,12 +237,12 @@ def start_session(self, capabilities: Dict, browser_profile: Optional[str] = Non
         if 'sessionId' not in response:
             response = response['value']
         self.session_id = response['sessionId']
-        self.capabilities = response.get('value')
+        self.caps = response.get('value')
 
         # if capabilities is none we are probably speaking to
         # a W3C endpoint
-        if self.capabilities is None:
-            self.capabilities = response.get('capabilities')
+        if self.caps is None:
+            self.caps = response.get('capabilities')
 
         # Double check to see if we have a W3C Compliant browser
         self.w3c = response.get('status') is None
@@ -240,13 +251,6 @@ def start_session(self, capabilities: Dict, browser_profile: Optional[str] = Non
     def _merge_capabilities(self, capabilities: Dict) -> Dict[str, Any]:
         """Manage capabilities whether W3C format or MJSONWP format
         """
-        if _FORCE_MJSONWP in capabilities:
-            force_mjsonwp = capabilities[_FORCE_MJSONWP]
-            del capabilities[_FORCE_MJSONWP]
-
-            if force_mjsonwp != False:
-                return {'desiredCapabilities': capabilities}
-
         w3c_caps = _make_w3c_caps(capabilities)
         return {'capabilities': w3c_caps, 'desiredCapabilities': capabilities}
 
@@ -263,7 +267,6 @@ def find_element(self, by: str = By.ID, value: Union[str, Dict] = None) -> Mobil
 
         """
         # TODO: If we need, we should enable below converter for Web context
-        # if self.w3c:
         #     if by == By.ID:
         #         by = By.CSS_SELECTOR
         #         value = '[id="%s"]' % value
@@ -293,7 +296,6 @@ def find_elements(self, by: str = By.ID, value: Union[str, Dict]
             :obj:`list` of :obj:`appium.webdriver.webelement.WebElement`: The found elements
         """
         # TODO: If we need, we should enable below converter for Web context
-        # if self.w3c:
         #     if by == By.ID:
         #         by = By.CSS_SELECTOR
         #         value = '[id="%s"]' % value
@@ -313,7 +315,7 @@ def find_elements(self, by: str = By.ID, value: Union[str, Dict]
             'using': by,
             'value': value})['value'] or []
 
-    def create_web_element(self, element_id: Union[int, str], w3c: bool = False) -> MobileWebElement:
+    def create_web_element(self, element_id: Union[int, str], w3c: bool = True) -> MobileWebElement:
         """Creates a web element with the specified element_id.
 
         Overrides method in Selenium WebDriver in order to always give them
diff --git a/setup.py b/setup.py
index d3b6f507..f18eea32 100644
--- a/setup.py
+++ b/setup.py
@@ -53,5 +53,5 @@
         'Topic :: Software Development :: Quality Assurance',
         'Topic :: Software Development :: Testing'
     ],
-    install_requires=['selenium >= 3.14.1, < 4']
+    install_requires=['selenium == 4.0.0.a7']
 )
diff --git a/test/functional/ios/safari_tests.py b/test/functional/ios/safari_tests.py
index 23d907fc..8dadb20b 100644
--- a/test/functional/ios/safari_tests.py
+++ b/test/functional/ios/safari_tests.py
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import time
+
 from appium import webdriver
 
 from .helper.desired_capabilities import get_desired_capabilities
@@ -38,4 +40,11 @@ def test_context(self) -> None:
 
     def test_get(self) -> None:
         self.driver.get("http://google.com")
-        assert 'Google' == self.driver.title
+        for _ in range(5):
+            time.sleep(0.5)
+            try:
+                assert 'Google' == self.driver.title
+                return
+            except Exception as e:
+
+        assert False, 'The title was wrong'
