diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e3d432076e6d0a7f09d05507059c190f2e2c909a_LmdpdGxhYi1jaS55bWw=..44f9a3849068cac82aa31c9449a7222558c6e502_LmdpdGxhYi1jaS55bWw= 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -164,6 +164,14 @@
   variables:
     ODOO_TYPE: odoo13
 
+import_jsonrpc_odoo14_test:
+  extends: import_jsonrpc_odoo11_test-focal
+  image:
+    name: quay.orus.io/odoo/odoo:14.0
+    entrypoint: [""]
+  variables:
+    ODOO_TYPE: odoo14
+
 import_jsonrpc_odoo15_test:
   extends: import_jsonrpc_odoo11_test-focal
   image:
diff --git a/NEWS.rst b/NEWS.rst
index e3d432076e6d0a7f09d05507059c190f2e2c909a_TkVXUy5yc3Q=..44f9a3849068cac82aa31c9449a7222558c6e502_TkVXUy5yc3Q= 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -2,6 +2,11 @@
 History
 =======
 
+19.1.0
+------
+
+Support Odoo 14.
+
 19.0.2
 ------
 
diff --git a/odoo_scripts/config.py b/odoo_scripts/config.py
index e3d432076e6d0a7f09d05507059c190f2e2c909a_b2Rvb19zY3JpcHRzL2NvbmZpZy5weQ==..44f9a3849068cac82aa31c9449a7222558c6e502_b2Rvb19zY3JpcHRzL2NvbmZpZy5weQ== 100644
--- a/odoo_scripts/config.py
+++ b/odoo_scripts/config.py
@@ -26,7 +26,7 @@
 ODOO_13 = "odoo13"
 """Value for odoo_type representing Odoo 13.0"""
 ODOO_14 = "odoo14"
-""".. warning: This version is not handled"""
+"""Value for odoo_type representing Odoo 14.0"""
 ODOO_15 = "odoo15"
 """Value for odoo_type representing Odoo 15.0"""
 ODOO_16 = "odoo16"
@@ -240,6 +240,7 @@
             ODOO_10,
             ODOO_11,
             ODOO_13,
+            ODOO_14,
             ODOO_15,
             ODOO_16,
         ):
diff --git a/odoo_scripts/docker_build.py b/odoo_scripts/docker_build.py
index e3d432076e6d0a7f09d05507059c190f2e2c909a_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZC5weQ==..44f9a3849068cac82aa31c9449a7222558c6e502_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZC5weQ== 100644
--- a/odoo_scripts/docker_build.py
+++ b/odoo_scripts/docker_build.py
@@ -11,7 +11,7 @@
 from subprocess import call, check_output
 from typing import List, Optional
 
-from .config import ODOO_7, ODOO_8, ODOO_10, ODOO_11, ODOO_13, ODOO_15, Config
+from .config import ODOO_7, ODOO_8, ODOO_10, ODOO_11, ODOO_13, ODOO_14, ODOO_15, Config
 from .docker_build_clean import clean
 from .docker_build_copy import copy
 from .docker_client import DockerClient
@@ -19,5 +19,5 @@
 
 _logger = logging.getLogger(__name__)
 
-__version__ = "1.2.2"
+__version__ = "1.3.0"
 __date__ = "2018-04-04"
@@ -23,5 +23,5 @@
 __date__ = "2018-04-04"
-__updated__ = "2023-01-20"
+__updated__ = "2023-02-27"
 
 
 def add_build_options(parser: argparse.ArgumentParser):
@@ -165,8 +165,16 @@
 
         with open(debug_dockerfile, "a") as myfile:
             myfile.write("\n# Developer helpers\n")
-            if odoo_type in (ODOO_7, ODOO_8, ODOO_10, ODOO_11, ODOO_13, ODOO_15):
+            if odoo_type in (
+                ODOO_7,
+                ODOO_8,
+                ODOO_10,
+                ODOO_11,
+                ODOO_13,
+                ODOO_14,
+                ODOO_15,
+            ):
                 myfile.write("USER root\nRUN apt-get update -qq\n")
                 myfile.write(
                     "RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "
                 )
@@ -169,8 +177,8 @@
                 myfile.write("USER root\nRUN apt-get update -qq\n")
                 myfile.write(
                     "RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "
                 )
-            if odoo_type in (ODOO_11, ODOO_13, ODOO_15):
+            if odoo_type in (ODOO_11, ODOO_13, ODOO_14, ODOO_15):
                 myfile.write(
                     "python3-watchdog python3-ipdb python3-pyinotify python3-wheel\n"
                 )
diff --git a/odoo_scripts/docker_dev_start.py b/odoo_scripts/docker_dev_start.py
index e3d432076e6d0a7f09d05507059c190f2e2c909a_b2Rvb19zY3JpcHRzL2RvY2tlcl9kZXZfc3RhcnQucHk=..44f9a3849068cac82aa31c9449a7222558c6e502_b2Rvb19zY3JpcHRzL2RvY2tlcl9kZXZfc3RhcnQucHk= 100755
--- a/odoo_scripts/docker_dev_start.py
+++ b/odoo_scripts/docker_dev_start.py
@@ -29,6 +29,7 @@
     ODOO_11,
     ODOO_12,
     ODOO_13,
+    ODOO_14,
     ODOO_15,
     ODOO_16,
     Config,
@@ -52,5 +53,5 @@
 
 _logger = logging.getLogger(__name__)
 
-__version__ = "3.9.0"
+__version__ = "3.10.0"
 __date__ = "2017-08-11"
@@ -56,5 +57,5 @@
 __date__ = "2017-08-11"
-__updated__ = "2023-01-20"
+__updated__ = "2023-02-27"
 
 
 def __parser(project_name: str) -> ArgumentParser:
@@ -1118,7 +1119,7 @@
 
     # developer mode options
     if dev:
-        if odoo_type in (ODOO_10, ODOO_11, ODOO_13, ODOO_15, ODOO_16):
+        if odoo_type in (ODOO_10, ODOO_11, ODOO_13, ODOO_14, ODOO_15, ODOO_16):
             # automatically add reload if not already asks for
             if not any(opt in dev_opts for opt in ("all", "reload")):
                 dev_opts.append("reload")
diff --git a/odoo_scripts/docker_flake8.py b/odoo_scripts/docker_flake8.py
index e3d432076e6d0a7f09d05507059c190f2e2c909a_b2Rvb19zY3JpcHRzL2RvY2tlcl9mbGFrZTgucHk=..44f9a3849068cac82aa31c9449a7222558c6e502_b2Rvb19zY3JpcHRzL2RvY2tlcl9mbGFrZTgucHk= 100644
--- a/odoo_scripts/docker_flake8.py
+++ b/odoo_scripts/docker_flake8.py
@@ -7,7 +7,7 @@
 import sys
 from typing import List, Optional
 
-from .config import ODOO_15, ODOO_16, Config
+from .config import ODOO_14, ODOO_15, ODOO_16, Config
 from .docker_client import DockerClient
 from .parsing import apply, basic_parser
 
@@ -11,5 +11,5 @@
 from .docker_client import DockerClient
 from .parsing import apply, basic_parser
 
-__version__ = "1.3.0"
+__version__ = "1.4.0"
 __date__ = "2020-09-10"
@@ -15,5 +15,5 @@
 __date__ = "2020-09-10"
-__updated__ = "2023-01-20"
+__updated__ = "2023-02-27"
 
 _logger = logging.getLogger(__name__)
 
@@ -80,6 +80,8 @@
     if odoo_type in ("odoo7", "odoo8", "odoo9", "odoo10"):
         repository = "xcgd/flake8"
         tag = "2"
+    elif odoo_type == ODOO_14:
+        tag = "14.0"
     elif odoo_type == ODOO_15:
         tag = "15.0"
     # TODO vérifier ce qu’il faut faire en v11 et 13
diff --git a/run_tests b/run_tests
index e3d432076e6d0a7f09d05507059c190f2e2c909a_cnVuX3Rlc3Rz..44f9a3849068cac82aa31c9449a7222558c6e502_cnVuX3Rlc3Rz 100755
--- a/run_tests
+++ b/run_tests
@@ -60,6 +60,6 @@
 # Catch both stdout & stderr here as Odoo 10 uses stderr, unlike previous Odoo versions.
 $here/start $update -d $dbname $db_user_param  --test-enable $loglevel --max-cron=0 --workers=0 --stop-after-init $* 2>&1 | tee $logfile | colorize
 start_status=$pipestatus[1]
-# Odoo 15 detection
+# Odoo >= 14 detection
 if [ $(grep -P 'odoo\.tests\.runner: ([[:digit:]]+) failed, [[:digit:]]+ error\(s\) of [[:digit:]]+ tests when loading database' $logfile --count) -gt 0 ];
 then
@@ -64,6 +64,6 @@
 if [ $(grep -P 'odoo\.tests\.runner: ([[:digit:]]+) failed, [[:digit:]]+ error\(s\) of [[:digit:]]+ tests when loading database' $logfile --count) -gt 0 ];
 then
-  # Valid with odoo 15
+  # Valid with odoo 14, 15, 16
   tests_ran=$(grep -P 'odoo\.tests\.runner: ([[:digit:]]+) failed, [[:digit:]]+ error\(s\) of \K[[:digit:]]+' $logfile -o)
   tests_failures=$(grep -P 'odoo\.tests\.runner: \K([[:digit:]]+)' $logfile -o)
   tests_errors=$(grep -P 'odoo\.tests\.runner: ([[:digit:]]+) failed, \K[[:digit:]]+' $logfile -o)