diff --git a/patches/gromacs-2016.3.config b/patches/gromacs-2016.4.config
similarity index 100%
rename from patches/gromacs-2016.3.config
rename to patches/gromacs-2016.4.config
diff --git a/patches/gromacs-2016.3.diff/src/gromacs/CMakeLists.txt b/patches/gromacs-2016.4.diff/src/gromacs/CMakeLists.txt
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/gromacs/CMakeLists.txt
rename to patches/gromacs-2016.4.diff/src/gromacs/CMakeLists.txt
diff --git a/patches/gromacs-2016.3.diff/src/gromacs/CMakeLists.txt.preplumed b/patches/gromacs-2016.4.diff/src/gromacs/CMakeLists.txt.preplumed
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/gromacs/CMakeLists.txt.preplumed
rename to patches/gromacs-2016.4.diff/src/gromacs/CMakeLists.txt.preplumed
diff --git a/patches/gromacs-2016.3.diff/src/gromacs/mdlib/force.cpp b/patches/gromacs-2016.4.diff/src/gromacs/mdlib/force.cpp
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/gromacs/mdlib/force.cpp
rename to patches/gromacs-2016.4.diff/src/gromacs/mdlib/force.cpp
diff --git a/patches/gromacs-2016.3.diff/src/gromacs/mdlib/force.cpp.preplumed b/patches/gromacs-2016.4.diff/src/gromacs/mdlib/force.cpp.preplumed
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/gromacs/mdlib/force.cpp.preplumed
rename to patches/gromacs-2016.4.diff/src/gromacs/mdlib/force.cpp.preplumed
diff --git a/patches/gromacs-2016.3.diff/src/gromacs/mdlib/minimize.cpp b/patches/gromacs-2016.4.diff/src/gromacs/mdlib/minimize.cpp
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/gromacs/mdlib/minimize.cpp
rename to patches/gromacs-2016.4.diff/src/gromacs/mdlib/minimize.cpp
diff --git a/patches/gromacs-2016.3.diff/src/gromacs/mdlib/minimize.cpp.preplumed b/patches/gromacs-2016.4.diff/src/gromacs/mdlib/minimize.cpp.preplumed
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/gromacs/mdlib/minimize.cpp.preplumed
rename to patches/gromacs-2016.4.diff/src/gromacs/mdlib/minimize.cpp.preplumed
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/md.cpp b/patches/gromacs-2016.4.diff/src/programs/mdrun/md.cpp
similarity index 98%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/md.cpp
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/md.cpp
index 548037cebfd9a8f057d5fec95f61a7fe1a85e693..f3b5243851f1d5ec8364577677bae9404b270fc7 100644
--- a/patches/gromacs-2016.3.diff/src/programs/mdrun/md.cpp
+++ b/patches/gromacs-2016.4.diff/src/programs/mdrun/md.cpp
@@ -517,11 +517,11 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
                                         repl_ex_nst, repl_ex_nex, repl_ex_seed);
     }
 
-    /* PME tuning is only supported with PME for Coulomb. Is is not supported
-     * with only LJ PME, or for reruns.
-     */
+    /* PME tuning is only supported in the Verlet scheme, with PME for
+     * Coulomb. It is not supported with only LJ PME, or for
+     * reruns. */
     bPMETune = ((Flags & MD_TUNEPME) && EEL_PME(fr->eeltype) && !bRerunMD &&
-                !(Flags & MD_REPRODUCIBLE));
+                !(Flags & MD_REPRODUCIBLE) && ir->cutoff_scheme != ecutsGROUP);
     if (bPMETune)
     {
         pme_loadbal_init(&pme_loadbal, cr, fplog, ir, state->box,
@@ -625,11 +625,6 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
             copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
         }
     }
-    if (ir->eI != eiVV)
-    {
-        enerd->term[F_TEMP] *= 2; /* result of averages being done over previous and current step,
-                                     and there is no previous step */
-    }
 
     /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
        temperature control */
@@ -637,16 +632,28 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
 
     if (MASTER(cr))
     {
-        if (constr && !ir->bContinuation && ir->eConstrAlg == econtLINCS)
+        if (!ir->bContinuation)
         {
-            fprintf(fplog,
-                    "RMS relative constraint deviation after constraining: %.2e\n",
-                    constr_rmsd(constr));
-        }
-        if (EI_STATE_VELOCITY(ir->eI))
-        {
-            fprintf(fplog, "Initial temperature: %g K\n", enerd->term[F_TEMP]);
+            if (constr && ir->eConstrAlg == econtLINCS)
+            {
+                fprintf(fplog,
+                        "RMS relative constraint deviation after constraining: %.2e\n",
+                        constr_rmsd(constr));
+            }
+            if (EI_STATE_VELOCITY(ir->eI))
+            {
+                real temp = enerd->term[F_TEMP];
+                if (ir->eI != eiVV)
+                {
+                    /* Result of Ekin averaged over velocities of -half
+                     * and +half step, while we only have -half step here.
+                     */
+                    temp *= 2;
+                }
+                fprintf(fplog, "Initial temperature: %g K\n", temp);
+            }
         }
+
         if (bRerunMD)
         {
             fprintf(stderr, "starting md rerun '%s', reading coordinates from"
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/md.cpp.preplumed b/patches/gromacs-2016.4.diff/src/programs/mdrun/md.cpp.preplumed
similarity index 98%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/md.cpp.preplumed
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/md.cpp.preplumed
index 8cf13863611a9927aea73f5f5e7d6303901a20da..bbb8e59754577e05b1f2fe1c3b6c5f253d1eaeaa 100644
--- a/patches/gromacs-2016.3.diff/src/programs/mdrun/md.cpp.preplumed
+++ b/patches/gromacs-2016.4.diff/src/programs/mdrun/md.cpp.preplumed
@@ -504,11 +504,11 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
                                         repl_ex_nst, repl_ex_nex, repl_ex_seed);
     }
 
-    /* PME tuning is only supported with PME for Coulomb. Is is not supported
-     * with only LJ PME, or for reruns.
-     */
+    /* PME tuning is only supported in the Verlet scheme, with PME for
+     * Coulomb. It is not supported with only LJ PME, or for
+     * reruns. */
     bPMETune = ((Flags & MD_TUNEPME) && EEL_PME(fr->eeltype) && !bRerunMD &&
-                !(Flags & MD_REPRODUCIBLE));
+                !(Flags & MD_REPRODUCIBLE) && ir->cutoff_scheme != ecutsGROUP);
     if (bPMETune)
     {
         pme_loadbal_init(&pme_loadbal, cr, fplog, ir, state->box,
@@ -612,11 +612,6 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
             copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
         }
     }
-    if (ir->eI != eiVV)
-    {
-        enerd->term[F_TEMP] *= 2; /* result of averages being done over previous and current step,
-                                     and there is no previous step */
-    }
 
     /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
        temperature control */
@@ -624,16 +619,28 @@ double gmx::do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
 
     if (MASTER(cr))
     {
-        if (constr && !ir->bContinuation && ir->eConstrAlg == econtLINCS)
+        if (!ir->bContinuation)
         {
-            fprintf(fplog,
-                    "RMS relative constraint deviation after constraining: %.2e\n",
-                    constr_rmsd(constr));
-        }
-        if (EI_STATE_VELOCITY(ir->eI))
-        {
-            fprintf(fplog, "Initial temperature: %g K\n", enerd->term[F_TEMP]);
+            if (constr && ir->eConstrAlg == econtLINCS)
+            {
+                fprintf(fplog,
+                        "RMS relative constraint deviation after constraining: %.2e\n",
+                        constr_rmsd(constr));
+            }
+            if (EI_STATE_VELOCITY(ir->eI))
+            {
+                real temp = enerd->term[F_TEMP];
+                if (ir->eI != eiVV)
+                {
+                    /* Result of Ekin averaged over velocities of -half
+                     * and +half step, while we only have -half step here.
+                     */
+                    temp *= 2;
+                }
+                fprintf(fplog, "Initial temperature: %g K\n", temp);
+            }
         }
+
         if (bRerunMD)
         {
             fprintf(stderr, "starting md rerun '%s', reading coordinates from"
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/mdrun.cpp b/patches/gromacs-2016.4.diff/src/programs/mdrun/mdrun.cpp
similarity index 99%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/mdrun.cpp
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/mdrun.cpp
index 2c3906175a44650bd2aa77c2909be32ef3e6806d..cf0f72cf87e0d872581031f270cc4facc600212d 100644
--- a/patches/gromacs-2016.3.diff/src/programs/mdrun/mdrun.cpp
+++ b/patches/gromacs-2016.4.diff/src/programs/mdrun/mdrun.cpp
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017, 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.
@@ -378,7 +378,7 @@ int gmx_mdrun(int argc, char *argv[])
         { "-nstlist", FALSE, etINT, {&nstlist},
           "Set nstlist when using a Verlet buffer tolerance (0 is guess)" },
         { "-tunepme", FALSE, etBOOL, {&bTunePME},
-          "Optimize PME load between PP/PME ranks or GPU/CPU" },
+          "Optimize PME load between PP/PME ranks or GPU/CPU (only with the Verlet cut-off scheme)" },
         { "-v",       FALSE, etBOOL, {&bVerbose},
           "Be loud and noisy" },
         { "-pforce",  FALSE, etREAL, {&pforce},
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/mdrun.cpp.preplumed b/patches/gromacs-2016.4.diff/src/programs/mdrun/mdrun.cpp.preplumed
similarity index 99%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/mdrun.cpp.preplumed
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/mdrun.cpp.preplumed
index 7829a823a444275ed73b151559277993c710e31e..798f7682742304554848fcc85b505101ffa6cad9 100644
--- a/patches/gromacs-2016.3.diff/src/programs/mdrun/mdrun.cpp.preplumed
+++ b/patches/gromacs-2016.4.diff/src/programs/mdrun/mdrun.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) 2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017, 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.
@@ -370,7 +370,7 @@ int gmx_mdrun(int argc, char *argv[])
         { "-nstlist", FALSE, etINT, {&nstlist},
           "Set nstlist when using a Verlet buffer tolerance (0 is guess)" },
         { "-tunepme", FALSE, etBOOL, {&bTunePME},
-          "Optimize PME load between PP/PME ranks or GPU/CPU" },
+          "Optimize PME load between PP/PME ranks or GPU/CPU (only with the Verlet cut-off scheme)" },
         { "-v",       FALSE, etBOOL, {&bVerbose},
           "Be loud and noisy" },
         { "-pforce",  FALSE, etREAL, {&pforce},
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/repl_ex.cpp b/patches/gromacs-2016.4.diff/src/programs/mdrun/repl_ex.cpp
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/repl_ex.cpp
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/repl_ex.cpp
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/repl_ex.cpp.preplumed b/patches/gromacs-2016.4.diff/src/programs/mdrun/repl_ex.cpp.preplumed
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/repl_ex.cpp.preplumed
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/repl_ex.cpp.preplumed
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/runner.cpp b/patches/gromacs-2016.4.diff/src/programs/mdrun/runner.cpp
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/runner.cpp
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/runner.cpp
diff --git a/patches/gromacs-2016.3.diff/src/programs/mdrun/runner.cpp.preplumed b/patches/gromacs-2016.4.diff/src/programs/mdrun/runner.cpp.preplumed
similarity index 100%
rename from patches/gromacs-2016.3.diff/src/programs/mdrun/runner.cpp.preplumed
rename to patches/gromacs-2016.4.diff/src/programs/mdrun/runner.cpp.preplumed