diff --git a/src/trees-common.h b/src/trees-common.h
index 821883b545e1afa2090c27005e13d841f83fc2b8..97b8cb560fa65c2916d734706dc5f8f4a2d8601a 100644
--- a/src/trees-common.h
+++ b/src/trees-common.h
@@ -49,6 +49,29 @@
        __typeof__ (b) _b = (b); \
      _a > _b ? _a : _b; })
 
+/* Fix dovecot's broken DOVECOT_PREREQ version detection macro */
+#if !defined(DOVECOT_VERSION_MAJOR) || !defined(DOVECOT_PREREQ)
+/* Version detection didn't exist before 2.1.16 */
+#  error "This plugin doesn't work with dovecot version below 2.1.16"
+#else
+/* DOVECOT_VERSION_MICRO got added in 2.3.18 */
+/* In 2.3.18, the macro got broken too, so we use that for detection */
+/* see https://github.com/dovecot/core/commit/31c2413 */
+#  if defined(DOVECOT_VERSION_MICRO)
+/* re-define the macro to the old signature */
+#    undef DOVECOT_PREREQ
+#    define DOVECOT_PREREQ(maj, min) \
+            ((DOVECOT_VERSION_MAJOR << 16) + \
+              DOVECOT_VERSION_MINOR >= ((maj) << 16) + (min))
+/* if you want to detect micro version too, use this instead */
+#    define DOVECOT_PREREQ_MICRO(maj, min, micro) \
+            ((DOVECOT_VERSION_MAJOR << 24) + \
+	         (DOVECOT_VERSION_MINOR << 16) + \
+	         DOVECOT_VERSION_MICRO >= \
+	         ((maj) << 24) + ((min) << 16) + (micro))
+#  endif /* defined(DOVECOT_VERSION_MICRO) */
+#endif /* !defined(DOVECOT_VERSION_MAJOR) || !defined(DOVECOT_PREREQ) */
+
 extern const unsigned char trees_header[3];
 
 int trees_initialize(void);