diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp
index 704b43e642..5dc739d5e8 100644
--- a/src/REAXFF/fix_qeq_reaxff.cpp
+++ b/src/REAXFF/fix_qeq_reaxff.cpp
@@ -404,8 +404,6 @@ void FixQEqReaxFF::init()
     efield->init();
     if (strcmp(update->unit_style,"real") != 0)
       error->all(FLERR,"Must use unit_style real with fix {} and external fields", style);
-    if (efield->varflag != FixEfield::CONSTANT)
-      error->all(FLERR,"Cannot (yet) use fix {} with variable efield", style);
 
     if (((fabs(efield->ex) > SMALL) && domain->xperiodic) ||
          ((fabs(efield->ey) > SMALL) && domain->yperiodic) ||
@@ -1101,26 +1099,45 @@ void FixQEqReaxFF::get_chi_field()
 
   // efield energy is in real units of kcal/mol/angstrom, need to convert to eV
 
-  const double factor = -1.0/force->qe2f;
+  const double qe2f = force->qe2f;
+  const double factor = -1.0/qe2f;
+
+
+  if (efield->varflag != FixEfield::CONSTANT) {
+    efield->update_efield_variables();
+  }
 
-  // currently we only support constant efield
   // atom selection is for the group of fix efield
 
-  if (efield->varflag == FixEfield::CONSTANT) {
-    double unwrap[3];
-    const double fx = efield->ex;
-    const double fy = efield->ey;
-    const double fz = efield->ez;
-    const int efgroupbit = efield->groupbit;
+  double unwrap[3];
+  const double ex = efield->ex;
+  const double ey = efield->ey;
+  const double ez = efield->ez;
+  const int efgroupbit = efield->groupbit;
 
     // charge interactions
     // force = qE, potential energy = F dot x in unwrapped coords
-
+  if (efield->varflag != FixEfield::ATOM) {
+    for (int i = 0; i < nlocal; i++) {
+      if (mask[i] & efgroupbit) {
+        if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue;
+        domain->unmap(x[i],image[i],unwrap);
+        chi_field[i] = factor*(ex*unwrap[0] + ey*unwrap[1] + ez*unwrap[2]);
+      }
+    }
+  } else {
     for (int i = 0; i < nlocal; i++) {
       if (mask[i] & efgroupbit) {
         if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue;
         domain->unmap(x[i],image[i],unwrap);
-        chi_field[i] = factor*(fx*unwrap[0] + fy*unwrap[1] + fz*unwrap[2]);
+        double edisp = 0; // accumulate E dot displacement
+        edisp += unwrap[0]*(
+            (efield->xstyle == FixEfield::ATOM) ? qe2f*efield->efield[i][0] : ex);
+        edisp += unwrap[1]*(
+            (efield->ystyle == FixEfield::ATOM) ? qe2f*efield->efield[i][1] : ey);
+        edisp += unwrap[2]*(
+            (efield->zstyle == FixEfield::ATOM) ? qe2f*efield->efield[i][2] : ez);
+        chi_field[i] = factor*edisp;
       }
     }
   }
diff --git a/src/fix_efield.cpp b/src/fix_efield.cpp
index d1765ed536..a7c48eeacc 100644
--- a/src/fix_efield.cpp
+++ b/src/fix_efield.cpp
@@ -346,26 +346,7 @@ void FixEfield::post_force(int vflag)
 
   } else {
 
-    modify->clearstep_compute();
-
-    if (xstyle == EQUAL) {
-      ex = qe2f * input->variable->compute_equal(xvar);
-    } else if (xstyle == ATOM) {
-      input->variable->compute_atom(xvar, igroup, &efield[0][0], 4, 0);
-    }
-    if (ystyle == EQUAL) {
-      ey = qe2f * input->variable->compute_equal(yvar);
-    } else if (ystyle == ATOM) {
-      input->variable->compute_atom(yvar, igroup, &efield[0][1], 4, 0);
-    }
-    if (zstyle == EQUAL) {
-      ez = qe2f * input->variable->compute_equal(zvar);
-    } else if (zstyle == ATOM) {
-      input->variable->compute_atom(zvar, igroup, &efield[0][2], 4, 0);
-    }
-    if (estyle == ATOM) input->variable->compute_atom(evar, igroup, &efield[0][3], 4, 0);
-
-    modify->addstep_compute(update->ntimestep + 1);
+    update_efield_variables();
 
     // charge interactions
     // force = qE
@@ -470,3 +451,32 @@ double FixEfield::compute_vector(int n)
   }
   return fsum_all[n + 1];
 }
+
+/* ----------------------------------------------------------------------
+   update efield variables without doing anything else
+   called by fix_qeq_reaxff
+------------------------------------------------------------------------- */
+
+void FixEfield::update_efield_variables()
+{
+  modify->clearstep_compute();
+
+  if (xstyle == EQUAL) {
+    ex = qe2f * input->variable->compute_equal(xvar);
+  } else if (xstyle == ATOM) {
+    input->variable->compute_atom(xvar, igroup, &efield[0][0], 4, 0);
+  }
+  if (ystyle == EQUAL) {
+    ey = qe2f * input->variable->compute_equal(yvar);
+  } else if (ystyle == ATOM) {
+    input->variable->compute_atom(yvar, igroup, &efield[0][1], 4, 0);
+  }
+  if (zstyle == EQUAL) {
+    ez = qe2f * input->variable->compute_equal(zvar);
+  } else if (zstyle == ATOM) {
+    input->variable->compute_atom(zvar, igroup, &efield[0][2], 4, 0);
+  }
+  if (estyle == ATOM) input->variable->compute_atom(evar, igroup, &efield[0][3], 4, 0);
+
+  modify->addstep_compute(update->ntimestep + 1);
+}
diff --git a/src/fix_efield.h b/src/fix_efield.h
index 52c827bb50..2bab26e140 100644
--- a/src/fix_efield.h
+++ b/src/fix_efield.h
@@ -59,6 +59,7 @@ class FixEfield : public Fix {
 
   int force_flag;
   double fsum[4], fsum_all[4];
+  void update_efield_variables();
 };
 }    // namespace LAMMPS_NS
 #endif
