diff --git a/os/hal/ports/STM32/LLD/TIMv1/stm32_tim9.inc b/os/hal/ports/STM32/LLD/TIMv1/stm32_tim9.inc
new file mode 100644
index 000000000..7aebb4a64
--- /dev/null
+++ b/os/hal/ports/STM32/LLD/TIMv1/stm32_tim9.inc
@@ -0,0 +1,133 @@
+/*
+    ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+    Licensed 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.
+*/
+
+/**
+ * @file    TIMv1/stm32_tim9.inc
+ * @brief   Shared TIM9 handler.
+ *
+ * @addtogroup STM32_TIM9_HANDLER
+ * @{
+ */
+
+/*===========================================================================*/
+/* Driver local definitions.                                                 */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks.                                       */
+/*===========================================================================*/
+
+/* Registry checks for robustness.*/
+#if !defined(STM32_HAS_TIM9)
+#error "STM32_HAS_TIM9 not defined in registry"
+#endif
+
+/* Driver checks for robustness, undefined USE macros are defaulted to
+   FALSE. This makes this module independent from drivers implementation.*/
+#if !defined(STM32_GPT_USE_TIM9)
+#define STM32_GPT_USE_TIM9                  FALSE
+#endif
+#if !defined(STM32_ICU_USE_TIM9)
+#define STM32_ICU_USE_TIM9                  FALSE
+#endif
+#if !defined(STM32_PWM_USE_TIM9)
+#define STM32_PWM_USE_TIM9                  FALSE
+#endif
+#if !defined(STM32_ST_USE_TIM9)
+#define STM32_ST_USE_TIM9                   FALSE
+#endif
+
+#if STM32_HAS_TIM9
+
+/* Priority settings checks.*/
+#if !defined(STM32_IRQ_TIM9_PRIORITY)
+#error "STM32_IRQ_TIM9_PRIORITY not defined in mcuconf.h"
+#endif
+
+#if !OSAL_IRQ_IS_VALID_PRIORITY(STM32_IRQ_TIM9_PRIORITY)
+#error "Invalid IRQ priority assigned to STM32_IRQ_TIM9_PRIORITY"
+#endif
+
+#endif /* STM32_HAS_TIM9 */
+
+/*===========================================================================*/
+/* Driver exported variables.                                                */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local variables.                                                   */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local functions.                                                   */
+/*===========================================================================*/
+
+static inline void tim9_irq_init(void) {
+#if defined(STM32_TIM9_IS_USED)
+  nvicEnableVector(STM32_TIM9_NUMBER, STM32_IRQ_TIM9_PRIORITY);
+#endif
+}
+
+static inline void tim9_irq_deinit(void) {
+#if defined(STM32_TIM9_IS_USED)
+  nvicDisableVector(STM32_TIM9_NUMBER);
+#endif
+}
+
+/*===========================================================================*/
+/* Driver interrupt handlers.                                                */
+/*===========================================================================*/
+
+#if defined(STM32_TIM9_IS_USED) || defined(__DOXYGEN__)
+/**
+ * @brief   TIM9 interrupt handler.
+ *
+ * @isr
+ */
+OSAL_IRQ_HANDLER(STM32_TIM9_HANDLER) {
+
+  OSAL_IRQ_PROLOGUE();
+
+#if HAL_USE_GPT
+#if STM32_GPT_USE_TIM9
+  gpt_lld_serve_interrupt(&GPTD9);
+#endif
+#endif
+#if HAL_USE_ICU
+#if STM32_ICU_USE_TIM9
+  icu_lld_serve_interrupt(&ICUD9);
+#endif
+#endif
+#if HAL_USE_PWM
+#if STM32_PWM_USE_TIM9
+  pwm_lld_serve_interrupt(&PWMD9);
+#endif
+#endif
+#if 1
+#if STM32_ST_USE_TIM9
+  st_lld_serve_interrupt();
+#endif
+#endif
+
+  OSAL_IRQ_EPILOGUE();
+}
+#endif
+
+/*===========================================================================*/
+/* Driver exported functions.                                                */
+/*===========================================================================*/
+
+/** @} */
diff --git a/os/hal/ports/STM32/STM32F4xx/stm32_isr.c b/os/hal/ports/STM32/STM32F4xx/stm32_isr.c
index 08237e1c3..65767f908 100644
--- a/os/hal/ports/STM32/STM32F4xx/stm32_isr.c
+++ b/os/hal/ports/STM32/STM32F4xx/stm32_isr.c
@@ -51,6 +51,8 @@
 /* Driver interrupt handlers.                                                */
 /*===========================================================================*/
 
+#include "stm32_tim9.inc"
+
 #if (HAL_USE_PAL && (PAL_USE_WAIT || PAL_USE_CALLBACKS)) || defined(__DOXYGEN__)
 #if !defined(STM32_DISABLE_EXTI0_HANDLER)
 /**
@@ -223,6 +225,8 @@ OSAL_IRQ_HANDLER(VectorE0) {
  */
 void irqInit(void) {
 
+  tim9_irq_init();
+
 #if HAL_USE_PAL
   nvicEnableVector(EXTI0_IRQn, STM32_IRQ_EXTI0_PRIORITY);
   nvicEnableVector(EXTI1_IRQn, STM32_IRQ_EXTI1_PRIORITY);
@@ -241,6 +245,8 @@ void irqInit(void) {
  */
 void irqDeinit(void) {
 
+  tim9_irq_deinit();
+
 #if HAL_USE_PAL
   nvicDisableVector(EXTI0_IRQn);
   nvicDisableVector(EXTI1_IRQn);
diff --git a/os/hal/ports/STM32/STM32F4xx/stm32_isr.h b/os/hal/ports/STM32/STM32F4xx/stm32_isr.h
index 6a826f6a3..3499794ec 100644
--- a/os/hal/ports/STM32/STM32F4xx/stm32_isr.h
+++ b/os/hal/ports/STM32/STM32F4xx/stm32_isr.h
@@ -29,6 +29,12 @@
 /* Driver constants.                                                         */
 /*===========================================================================*/
 
+/**
+ * @name    ISRs suppressed in standard drivers
+ * @{
+ */
+#define STM32_TIM9_SUPPRESS_ISR
+
 /**
  * @name    ISR names and numbers remapping
  * @{
