diff --git a/patches/gromacs-2018.3.config b/patches/gromacs-2018.4.config
similarity index 100%
rename from patches/gromacs-2018.3.config
rename to patches/gromacs-2018.4.config
diff --git a/patches/gromacs-2018.3.diff/src/gromacs/CMakeLists.txt b/patches/gromacs-2018.4.diff/src/gromacs/CMakeLists.txt
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/gromacs/CMakeLists.txt
rename to patches/gromacs-2018.4.diff/src/gromacs/CMakeLists.txt
diff --git a/patches/gromacs-2018.3.diff/src/gromacs/CMakeLists.txt.preplumed b/patches/gromacs-2018.4.diff/src/gromacs/CMakeLists.txt.preplumed
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/gromacs/CMakeLists.txt.preplumed
rename to patches/gromacs-2018.4.diff/src/gromacs/CMakeLists.txt.preplumed
diff --git a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/force.cpp b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/force.cpp
similarity index 96%
rename from patches/gromacs-2018.3.diff/src/gromacs/mdlib/force.cpp
rename to patches/gromacs-2018.4.diff/src/gromacs/mdlib/force.cpp
index bc1e961f1c77387a4dd7f103c1fc51acbbca9119..07e1337af3e096184aa387b5d6caf66748fca510 100644
--- a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/force.cpp
+++ b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/force.cpp
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -738,7 +738,6 @@ void sum_epot(gmx_grppairener_t *grpp, real *epot)
 void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda *fepvals)
 {
     int    index;
-    double dlam;
 
     enerd->dvdl_lin[efptVDW] += enerd->term[F_DVDL_VDW];  /* include dispersion correction */
     enerd->term[F_DVDL]       = 0.0;
@@ -786,13 +785,6 @@ void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda
         }
     }
 
-    /* Notes on the foreign lambda free energy difference evaluation:
-     * Adding the potential and ekin terms that depend linearly on lambda
-     * as delta lam * dvdl to the energy differences is exact.
-     * For the constraints this is not exact, but we have no other option
-     * without literally changing the lengths and reevaluating the energies at each step.
-     * (try to remedy this post 4.6 - MRS)
-     */
     if (fepvals->separate_dvdl[efptBONDED])
     {
         enerd->term[F_DVDL_BONDED] += enerd->term[F_DVDL_CONSTR];
@@ -801,7 +793,6 @@ void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda
     {
         enerd->term[F_DVDL] += enerd->term[F_DVDL_CONSTR];
     }
-    enerd->term[F_DVDL_CONSTR] = 0;
 
     for (int i = 0; i < fepvals->n_lambda; i++)
     {
@@ -814,20 +805,42 @@ void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda
            current lambda, because the contributions to the current
            lambda are automatically zeroed */
 
+        double &enerpart_lambda = enerd->enerpart_lambda[i + 1];
+
         for (size_t j = 0; j < lambda.size(); j++)
         {
             /* Note that this loop is over all dhdl components, not just the separated ones */
-            dlam = (fepvals->all_lambda[j][i] - lambda[j]);
-            enerd->enerpart_lambda[i+1] += dlam*enerd->dvdl_lin[j];
+            const double dlam  = fepvals->all_lambda[j][i] - lambda[j];
+
+            enerpart_lambda   += dlam*enerd->dvdl_lin[j];
+
+            /* Constraints can not be evaluated at foreign lambdas, so we add
+             * a linear extrapolation. This is an approximation, but usually
+             * quite accurate since constraints change little between lambdas.
+             */
+            if ((j == efptBONDED && fepvals->separate_dvdl[efptBONDED]) ||
+                (j == efptFEP && !fepvals->separate_dvdl[efptBONDED]))
+            {
+                enerpart_lambda += dlam*enerd->term[F_DVDL_CONSTR];
+            }
+
+            if (j == efptMASS)
+            {
+                enerpart_lambda += dlam*enerd->term[F_DKDL];
+            }
+
             if (debug)
             {
                 fprintf(debug, "enerdiff lam %g: (%15s), non-linear %f linear %f*%f\n",
                         fepvals->all_lambda[j][i], efpt_names[j],
-                        (enerd->enerpart_lambda[i+1] - enerd->enerpart_lambda[0]),
+                        enerpart_lambda - enerd->enerpart_lambda[0],
                         dlam, enerd->dvdl_lin[j]);
             }
         }
     }
+
+    /* The constrain contribution is now included in other terms, so clear it */
+    enerd->term[F_DVDL_CONSTR] = 0;
 }
 
 
diff --git a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/force.cpp.preplumed b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/force.cpp.preplumed
similarity index 96%
rename from patches/gromacs-2018.3.diff/src/gromacs/mdlib/force.cpp.preplumed
rename to patches/gromacs-2018.4.diff/src/gromacs/mdlib/force.cpp.preplumed
index f01ea4d333a52e51e9f192758e13b44295114843..c939c4e8a7f13553ec52fde621a8812dc35727b7 100644
--- a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/force.cpp.preplumed
+++ b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/force.cpp.preplumed
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -724,7 +724,6 @@ void sum_epot(gmx_grppairener_t *grpp, real *epot)
 void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda *fepvals)
 {
     int    index;
-    double dlam;
 
     enerd->dvdl_lin[efptVDW] += enerd->term[F_DVDL_VDW];  /* include dispersion correction */
     enerd->term[F_DVDL]       = 0.0;
@@ -772,13 +771,6 @@ void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda
         }
     }
 
-    /* Notes on the foreign lambda free energy difference evaluation:
-     * Adding the potential and ekin terms that depend linearly on lambda
-     * as delta lam * dvdl to the energy differences is exact.
-     * For the constraints this is not exact, but we have no other option
-     * without literally changing the lengths and reevaluating the energies at each step.
-     * (try to remedy this post 4.6 - MRS)
-     */
     if (fepvals->separate_dvdl[efptBONDED])
     {
         enerd->term[F_DVDL_BONDED] += enerd->term[F_DVDL_CONSTR];
@@ -787,7 +779,6 @@ void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda
     {
         enerd->term[F_DVDL] += enerd->term[F_DVDL_CONSTR];
     }
-    enerd->term[F_DVDL_CONSTR] = 0;
 
     for (int i = 0; i < fepvals->n_lambda; i++)
     {
@@ -800,20 +791,42 @@ void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef<const real> lambda, t_lambda
            current lambda, because the contributions to the current
            lambda are automatically zeroed */
 
+        double &enerpart_lambda = enerd->enerpart_lambda[i + 1];
+
         for (size_t j = 0; j < lambda.size(); j++)
         {
             /* Note that this loop is over all dhdl components, not just the separated ones */
-            dlam = (fepvals->all_lambda[j][i] - lambda[j]);
-            enerd->enerpart_lambda[i+1] += dlam*enerd->dvdl_lin[j];
+            const double dlam  = fepvals->all_lambda[j][i] - lambda[j];
+
+            enerpart_lambda   += dlam*enerd->dvdl_lin[j];
+
+            /* Constraints can not be evaluated at foreign lambdas, so we add
+             * a linear extrapolation. This is an approximation, but usually
+             * quite accurate since constraints change little between lambdas.
+             */
+            if ((j == efptBONDED && fepvals->separate_dvdl[efptBONDED]) ||
+                (j == efptFEP && !fepvals->separate_dvdl[efptBONDED]))
+            {
+                enerpart_lambda += dlam*enerd->term[F_DVDL_CONSTR];
+            }
+
+            if (j == efptMASS)
+            {
+                enerpart_lambda += dlam*enerd->term[F_DKDL];
+            }
+
             if (debug)
             {
                 fprintf(debug, "enerdiff lam %g: (%15s), non-linear %f linear %f*%f\n",
                         fepvals->all_lambda[j][i], efpt_names[j],
-                        (enerd->enerpart_lambda[i+1] - enerd->enerpart_lambda[0]),
+                        enerpart_lambda - enerd->enerpart_lambda[0],
                         dlam, enerd->dvdl_lin[j]);
             }
         }
     }
+
+    /* The constrain contribution is now included in other terms, so clear it */
+    enerd->term[F_DVDL_CONSTR] = 0;
 }
 
 
diff --git a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/minimize.cpp b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/minimize.cpp
similarity index 99%
rename from patches/gromacs-2018.3.diff/src/gromacs/mdlib/minimize.cpp
rename to patches/gromacs-2018.4.diff/src/gromacs/mdlib/minimize.cpp
index a268949cbb431f2cf68f8215456809c51adfe48a..05cd383814ae44eda5d9cba7de468684c207ccd5 100644
--- a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/minimize.cpp
+++ b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/minimize.cpp
@@ -2983,7 +2983,7 @@ double do_nm(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
                                     top_global, &state_work, top,
                                     inputrec, nrnb, wcycle, gstat,
                                     vsite, constr, fcd, graph, mdAtoms, fr,
-                                    mu_tot, enerd, vir, pres, atom*2+dx, FALSE);
+                                    mu_tot, enerd, vir, pres, aid*2+dx, FALSE);
                 }
 
                 cr->nnodes = nnodes;
@@ -3019,7 +3019,7 @@ double do_nm(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
             }
             else
             {
-                for (node = 0; (node < nnodes && atom+node < atom_index.size()); node++)
+                for (node = 0; (node < nnodes && aid+node < atom_index.size()); node++)
                 {
                     if (node > 0)
                     {
@@ -3031,7 +3031,7 @@ double do_nm(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
 #endif
                     }
 
-                    row = (atom + node)*DIM + d;
+                    row = (aid + node)*DIM + d;
 
                     for (size_t j = 0; j < atom_index.size(); j++)
                     {
diff --git a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/minimize.cpp.preplumed b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/minimize.cpp.preplumed
similarity index 99%
rename from patches/gromacs-2018.3.diff/src/gromacs/mdlib/minimize.cpp.preplumed
rename to patches/gromacs-2018.4.diff/src/gromacs/mdlib/minimize.cpp.preplumed
index d06da48c44742dfcca9f46349a0d2480914bca2f..2c385df11ce31a2f1790093540ff1793f2a02f68 100644
--- a/patches/gromacs-2018.3.diff/src/gromacs/mdlib/minimize.cpp.preplumed
+++ b/patches/gromacs-2018.4.diff/src/gromacs/mdlib/minimize.cpp.preplumed
@@ -2909,7 +2909,7 @@ double do_nm(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
                                     top_global, &state_work, top,
                                     inputrec, nrnb, wcycle, gstat,
                                     vsite, constr, fcd, graph, mdAtoms, fr,
-                                    mu_tot, enerd, vir, pres, atom*2+dx, FALSE);
+                                    mu_tot, enerd, vir, pres, aid*2+dx, FALSE);
                 }
 
                 cr->nnodes = nnodes;
@@ -2945,7 +2945,7 @@ double do_nm(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
             }
             else
             {
-                for (node = 0; (node < nnodes && atom+node < atom_index.size()); node++)
+                for (node = 0; (node < nnodes && aid+node < atom_index.size()); node++)
                 {
                     if (node > 0)
                     {
@@ -2957,7 +2957,7 @@ double do_nm(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
 #endif
                     }
 
-                    row = (atom + node)*DIM + d;
+                    row = (aid + node)*DIM + d;
 
                     for (size_t j = 0; j < atom_index.size(); j++)
                     {
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/md.cpp b/patches/gromacs-2018.4.diff/src/programs/mdrun/md.cpp
similarity index 99%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/md.cpp
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/md.cpp
index 132d93d0dc1fed0bd8406176da9b8dc31eb9dbea..31f271a63de7822c7e4931635ef4361c8bbef70c 100644
--- a/patches/gromacs-2018.3.diff/src/programs/mdrun/md.cpp
+++ b/patches/gromacs-2018.4.diff/src/programs/mdrun/md.cpp
@@ -126,6 +126,7 @@
 #include "gromacs/utility/logger.h"
 #include "gromacs/utility/real.h"
 #include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/stringutil.h"
 
 #include "deform.h"
 #include "membed.h"
@@ -326,6 +327,19 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
                   gmx_membed_t *membed,
                   gmx_walltime_accounting_t walltime_accounting)
 {
+    /* Workaround for 2 bugs in release-2018.
+     * NOTE: Proper fix is in release-2019, do not merge this change there.
+     */
+    if (ir->bExpanded && (EI_VV(ir->eI) ||
+                          ir->expandedvals->nstexpanded % ir->nstcalcenergy != 0))
+    {
+        ir->nstcalcenergy = 1;
+        std::string note =
+            gmx::formatString("NOTE: There are issues with expanded ensemble and certain combination of nstexpanded and nstcalcenergy, setting nstcalcenergy to %d",
+                              ir->nstcalcenergy);
+        GMX_LOG(mdlog.warning).asParagraph().appendText(note);
+    }
+
     gmx_mdoutf_t    outf = nullptr;
     gmx_int64_t     step, step_rel;
     double          elapsed_time;
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/md.cpp.preplumed b/patches/gromacs-2018.4.diff/src/programs/mdrun/md.cpp.preplumed
similarity index 99%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/md.cpp.preplumed
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/md.cpp.preplumed
index 1695e0b72d53729f4ece973596131895d9a122b8..de5a7031ff1093334ca547c574fdf64d5596c6ac 100644
--- a/patches/gromacs-2018.3.diff/src/programs/mdrun/md.cpp.preplumed
+++ b/patches/gromacs-2018.4.diff/src/programs/mdrun/md.cpp.preplumed
@@ -125,6 +125,7 @@
 #include "gromacs/utility/logger.h"
 #include "gromacs/utility/real.h"
 #include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/stringutil.h"
 
 #include "deform.h"
 #include "membed.h"
@@ -315,6 +316,19 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, const gmx::MDLogger &mdlog,
                   gmx_membed_t *membed,
                   gmx_walltime_accounting_t walltime_accounting)
 {
+    /* Workaround for 2 bugs in release-2018.
+     * NOTE: Proper fix is in release-2019, do not merge this change there.
+     */
+    if (ir->bExpanded && (EI_VV(ir->eI) ||
+                          ir->expandedvals->nstexpanded % ir->nstcalcenergy != 0))
+    {
+        ir->nstcalcenergy = 1;
+        std::string note =
+            gmx::formatString("NOTE: There are issues with expanded ensemble and certain combination of nstexpanded and nstcalcenergy, setting nstcalcenergy to %d",
+                              ir->nstcalcenergy);
+        GMX_LOG(mdlog.warning).asParagraph().appendText(note);
+    }
+
     gmx_mdoutf_t    outf = nullptr;
     gmx_int64_t     step, step_rel;
     double          elapsed_time;
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/mdrun.cpp b/patches/gromacs-2018.4.diff/src/programs/mdrun/mdrun.cpp
similarity index 97%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/mdrun.cpp
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/mdrun.cpp
index 31ce2bc9c914be0f812a121b538c5ae74137d95c..2fa4b51dfbca01b83f35e26a1e930f879a2354a5 100644
--- a/patches/gromacs-2018.3.diff/src/programs/mdrun/mdrun.cpp
+++ b/patches/gromacs-2018.4.diff/src/programs/mdrun/mdrun.cpp
@@ -512,6 +512,22 @@ int Mdrunner::mainFunction(int argc, char *argv[])
     handleRestart(cr, bTryToAppendFiles, nfile, fnm, &continuationOptions.appendFiles, &continuationOptions.startedFromCheckpoint);
 
     mdrunOptions.rerun            = opt2bSet("-rerun", nfile, fnm);
+
+    if (mdrunOptions.rerun)
+    {
+        /* Rerun can't work if an output file name is the same as the input file name.
+         * If this is the case, the user will get an error telling them what the issue is.
+         */
+        if (strcmp(opt2fn("-rerun", nfile, fnm), opt2fn("-o", nfile, fnm)) == 0 ||
+            strcmp(opt2fn("-rerun", nfile, fnm), opt2fn("-x", nfile, fnm)) == 0)
+        {
+            gmx_fatal(FARGS, "When using mdrun -rerun, the name of the input trajectory file "
+                      "%s cannot be identical to the name of an output file (whether "
+                      "given explicitly with -o or -x, or by default)",
+                      opt2fn("-rerun", nfile, fnm));
+        }
+    }
+
     mdrunOptions.ntompOptionIsSet = opt2parg_bSet("-ntomp", asize(pa), pa);
 
     /* We postpone opening the log file if we are appending, so we can
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/mdrun.cpp.preplumed b/patches/gromacs-2018.4.diff/src/programs/mdrun/mdrun.cpp.preplumed
similarity index 97%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/mdrun.cpp.preplumed
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/mdrun.cpp.preplumed
index 772aabda3833f87e24f6b67a76891308ec3c7ac9..a3ec5ac437710f1b2ebd8b629a0368969d668756 100644
--- a/patches/gromacs-2018.3.diff/src/programs/mdrun/mdrun.cpp.preplumed
+++ b/patches/gromacs-2018.4.diff/src/programs/mdrun/mdrun.cpp.preplumed
@@ -499,6 +499,22 @@ int Mdrunner::mainFunction(int argc, char *argv[])
     handleRestart(cr, bTryToAppendFiles, nfile, fnm, &continuationOptions.appendFiles, &continuationOptions.startedFromCheckpoint);
 
     mdrunOptions.rerun            = opt2bSet("-rerun", nfile, fnm);
+
+    if (mdrunOptions.rerun)
+    {
+        /* Rerun can't work if an output file name is the same as the input file name.
+         * If this is the case, the user will get an error telling them what the issue is.
+         */
+        if (strcmp(opt2fn("-rerun", nfile, fnm), opt2fn("-o", nfile, fnm)) == 0 ||
+            strcmp(opt2fn("-rerun", nfile, fnm), opt2fn("-x", nfile, fnm)) == 0)
+        {
+            gmx_fatal(FARGS, "When using mdrun -rerun, the name of the input trajectory file "
+                      "%s cannot be identical to the name of an output file (whether "
+                      "given explicitly with -o or -x, or by default)",
+                      opt2fn("-rerun", nfile, fnm));
+        }
+    }
+
     mdrunOptions.ntompOptionIsSet = opt2parg_bSet("-ntomp", asize(pa), pa);
 
     /* We postpone opening the log file if we are appending, so we can
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.cpp b/patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.cpp
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.cpp
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.cpp
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.cpp.preplumed b/patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.cpp.preplumed
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.cpp.preplumed
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.cpp.preplumed
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.h b/patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.h
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.h
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.h
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.h.preplumed b/patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.h.preplumed
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/repl_ex.h.preplumed
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/repl_ex.h.preplumed
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/runner.cpp b/patches/gromacs-2018.4.diff/src/programs/mdrun/runner.cpp
similarity index 99%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/runner.cpp
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/runner.cpp
index 4dfff857a4a909a452711244ebd64c30a617deea..16653a0ca85223a99770e0349c21ab35c4ddfd52 100644
--- a/patches/gromacs-2018.3.diff/src/programs/mdrun/runner.cpp
+++ b/patches/gromacs-2018.4.diff/src/programs/mdrun/runner.cpp
@@ -958,13 +958,17 @@ int Mdrunner::mdrunner()
                           !thisRankHasDuty(cr, DUTY_PP),
                           inputrec->cutoff_scheme == ecutsVERLET);
 
-#ifndef NDEBUG
-    if (EI_TPI(inputrec->eI) &&
+    // Disabled for the rest of the lifetime of release-2018 branch
+    // to prevent false positives.
+    /*
+       #ifndef NDEBUG
+       if (EI_TPI(inputrec->eI) &&
         inputrec->cutoff_scheme == ecutsVERLET)
-    {
+       {
         gmx_feenableexcept();
-    }
-#endif
+       }
+       #endif
+     */
 
     // Build a data structure that expresses which kinds of non-bonded
     // task are handled by this rank.
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/runner.cpp.preplumed b/patches/gromacs-2018.4.diff/src/programs/mdrun/runner.cpp.preplumed
similarity index 99%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/runner.cpp.preplumed
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/runner.cpp.preplumed
index 917ada5687fa1e0c3a0f62fdf3df240ba1f7b113..813be6f3ead3deb828530c431430cfdf34d8364b 100644
--- a/patches/gromacs-2018.3.diff/src/programs/mdrun/runner.cpp.preplumed
+++ b/patches/gromacs-2018.4.diff/src/programs/mdrun/runner.cpp.preplumed
@@ -952,13 +952,17 @@ int Mdrunner::mdrunner()
                           !thisRankHasDuty(cr, DUTY_PP),
                           inputrec->cutoff_scheme == ecutsVERLET);
 
-#ifndef NDEBUG
-    if (EI_TPI(inputrec->eI) &&
+    // Disabled for the rest of the lifetime of release-2018 branch
+    // to prevent false positives.
+    /*
+       #ifndef NDEBUG
+       if (EI_TPI(inputrec->eI) &&
         inputrec->cutoff_scheme == ecutsVERLET)
-    {
+       {
         gmx_feenableexcept();
-    }
-#endif
+       }
+       #endif
+     */
 
     // Build a data structure that expresses which kinds of non-bonded
     // task are handled by this rank.
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/runner.h b/patches/gromacs-2018.4.diff/src/programs/mdrun/runner.h
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/runner.h
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/runner.h
diff --git a/patches/gromacs-2018.3.diff/src/programs/mdrun/runner.h.preplumed b/patches/gromacs-2018.4.diff/src/programs/mdrun/runner.h.preplumed
similarity index 100%
rename from patches/gromacs-2018.3.diff/src/programs/mdrun/runner.h.preplumed
rename to patches/gromacs-2018.4.diff/src/programs/mdrun/runner.h.preplumed