diff --git a/src/CLASS2/angle_class2.h b/src/CLASS2/angle_class2.h
index d18f71e1eb74b9a8c852cebc8895b05195e9c90a..8444ada057bedffafa495a2382a5b4236685e943 100644
--- a/src/CLASS2/angle_class2.h
+++ b/src/CLASS2/angle_class2.h
@@ -30,9 +30,9 @@ class AngleClass2 : public Angle {
   AngleClass2(class LAMMPS *);
   virtual ~AngleClass2();
   virtual void compute(int, int);
-  void coeff(int, char **);
+  virtual void coeff(int, char **);
   double equilibrium_angle(int);
-  void write_restart(FILE *);
+  virtual void write_restart(FILE *);
   void read_restart(FILE *);
   void write_data(FILE *);
   double single(int, int, int, int);
diff --git a/src/CLASS2/bond_class2.h b/src/CLASS2/bond_class2.h
index f8e294e2b0dae71441151db5aa820db19e441c89..89d930b54883243fd531d9b429829c4d1e791179 100644
--- a/src/CLASS2/bond_class2.h
+++ b/src/CLASS2/bond_class2.h
@@ -30,10 +30,10 @@ class BondClass2 : public Bond {
   BondClass2(class LAMMPS *);
   virtual ~BondClass2();
   virtual void compute(int, int);
-  void coeff(int, char **);
+  virtual void coeff(int, char **);
   double equilibrium_distance(int);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
   double single(int, double, int, int, double &);
 
diff --git a/src/CLASS2/dihedral_class2.h b/src/CLASS2/dihedral_class2.h
index 9ccf6623a06533c40f823d9cbbdf04b6eda576d0..a4ea9e4bd9ccb8c464c5435bedeb0771d4a06bb1 100644
--- a/src/CLASS2/dihedral_class2.h
+++ b/src/CLASS2/dihedral_class2.h
@@ -30,9 +30,9 @@ class DihedralClass2 : public Dihedral {
   DihedralClass2(class LAMMPS *);
   virtual ~DihedralClass2();
   virtual void compute(int, int);
-  void coeff(int, char **);
+  virtual void coeff(int, char **);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
 
  protected:
diff --git a/src/CLASS2/improper_class2.h b/src/CLASS2/improper_class2.h
index f155f67c5c8169fa4125c3f6a19700a3e2ef2129..1cc3417731eeb51d5311d6fac19e7462830d5536 100644
--- a/src/CLASS2/improper_class2.h
+++ b/src/CLASS2/improper_class2.h
@@ -30,9 +30,9 @@ class ImproperClass2 : public Improper {
   ImproperClass2(class LAMMPS *);
   virtual ~ImproperClass2();
   virtual void compute(int, int);
-  void coeff(int, char **);
+  virtual void coeff(int, char **);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
 
  protected:
diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp
index 4a81f4f49436817027af36c6be411749d6a57a75..7a83e0d654932a9612bc599aa7ea1f7f60315ff4 100644
--- a/src/KOKKOS/angle_charmm_kokkos.cpp
+++ b/src/KOKKOS/angle_charmm_kokkos.cpp
@@ -292,7 +292,44 @@ void AngleCharmmKokkos<DeviceType>::coeff(int narg, char **arg)
   k_theta0.template sync<DeviceType>();
   k_k_ub.template sync<DeviceType>();
   k_r_ub.template sync<DeviceType>();
+}
+
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void AngleCharmmKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  AngleCharmm::read_restart(fp);
+
+  int n = atom->nangletypes;
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k("AngleCharmm::k",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_theta0("AngleCharmm::theta0",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k_ub("AngleCharmm::k_ub",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_r_ub("AngleCharmm::r_ub",n+1);
+
+  d_k = k_k.template view<DeviceType>();
+  d_theta0 = k_theta0.template view<DeviceType>();
+  d_k_ub = k_k_ub.template view<DeviceType>();
+  d_r_ub = k_r_ub.template view<DeviceType>();
 
+  for (int i = 1; i <= n; i++) {
+    k_k.h_view[i] = k[i];
+    k_theta0.h_view[i] = theta0[i];
+    k_k_ub.h_view[i] = k_ub[i];
+    k_r_ub.h_view[i] = r_ub[i];
+  }
+
+  k_k.template modify<LMPHostType>();
+  k_theta0.template modify<LMPHostType>();
+  k_k_ub.template modify<LMPHostType>();
+  k_r_ub.template modify<LMPHostType>();
+
+  k_k.template sync<DeviceType>();
+  k_theta0.template sync<DeviceType>();
+  k_k_ub.template sync<DeviceType>();
+  k_r_ub.template sync<DeviceType>();
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/KOKKOS/angle_charmm_kokkos.h b/src/KOKKOS/angle_charmm_kokkos.h
index 18eeda74b58f7b106e5d8769038e4b449f1d40b5..e1681605627dbc86e0903bc2aca523c9cbb73f74 100644
--- a/src/KOKKOS/angle_charmm_kokkos.h
+++ b/src/KOKKOS/angle_charmm_kokkos.h
@@ -38,8 +38,9 @@ class AngleCharmmKokkos : public AngleCharmm {
 
   AngleCharmmKokkos(class LAMMPS *);
   virtual ~AngleCharmmKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -78,7 +79,7 @@ class AngleCharmmKokkos : public AngleCharmm {
   typename AT::t_ffloat_1d d_k_ub;
   typename AT::t_ffloat_1d d_r_ub;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/angle_class2_kokkos.cpp b/src/KOKKOS/angle_class2_kokkos.cpp
index 870603791bd657d5d6e7157ae77bdd1002705c79..289753a3ee85d1a1ed66dcb9e7855e1578f35d4d 100644
--- a/src/KOKKOS/angle_class2_kokkos.cpp
+++ b/src/KOKKOS/angle_class2_kokkos.cpp
@@ -400,6 +400,85 @@ void AngleClass2Kokkos<DeviceType>::coeff(int narg, char **arg)
   k_theta0.template modify<LMPHostType>();
 }
 
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void AngleClass2Kokkos<DeviceType>::read_restart(FILE *fp)
+{
+  AngleClass2::read_restart(fp);
+
+  int n = atom->nangletypes;
+  k_k2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::k2",n+1);
+  k_k3 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::k3",n+1);
+  k_k4 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::k4",n+1);
+  k_bb_k = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::bb_k",n+1);
+  k_bb_r1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::bb_r1",n+1);
+  k_bb_r2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::bb_r2",n+1);
+  k_ba_k1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::ba_k1",n+1);
+  k_ba_k2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::ba_k2",n+1);
+  k_ba_r1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::ba_r1",n+1);
+  k_ba_r2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::ba_r2",n+1);
+  k_setflag = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag",n+1);
+  k_setflag_a = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_a",n+1);
+  k_setflag_bb = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_bb",n+1);
+  k_setflag_ba = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_ba",n+1);
+  k_theta0 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::theta0",n+1);
+
+  d_k2 = k_k2.template view<DeviceType>();
+  d_k3 = k_k3.template view<DeviceType>();
+  d_k4 = k_k4.template view<DeviceType>();
+  d_bb_k = k_bb_k.template view<DeviceType>();
+  d_bb_r1 = k_bb_r1.template view<DeviceType>();
+  d_bb_r2 = k_bb_r2.template view<DeviceType>();
+  d_ba_k1 = k_ba_k1.template view<DeviceType>();
+  d_ba_k2 = k_ba_k2.template view<DeviceType>();
+  d_ba_r1 = k_ba_r1.template view<DeviceType>();
+  d_ba_r2 = k_ba_r2.template view<DeviceType>();
+  d_ba_r2 = k_ba_r2.template view<DeviceType>();
+  d_setflag = k_setflag.template view<DeviceType>();
+  d_setflag_a = k_setflag_a.template view<DeviceType>();
+  d_setflag_bb = k_setflag_bb.template view<DeviceType>();
+  d_setflag_ba = k_setflag_ba.template view<DeviceType>();
+  d_theta0 = k_theta0.template view<DeviceType>();
+
+  //int n = atom->nangletypes;
+  for (int i = 1; i <= n; i++) {
+    k_k2.h_view[i] = k2[i];
+    k_k3.h_view[i] = k3[i];
+    k_k4.h_view[i] = k4[i];
+    k_bb_k.h_view[i] = bb_k[i];
+    k_bb_r1.h_view[i] = bb_r1[i];
+    k_bb_r2.h_view[i] = bb_r2[i];
+    k_ba_k1.h_view[i] = ba_k1[i];
+    k_ba_k2.h_view[i] = ba_k2[i];
+    k_ba_r1.h_view[i] = ba_r1[i];
+    k_ba_r2.h_view[i] = ba_r2[i];
+    k_setflag.h_view[i] = setflag[i];
+    k_setflag_a.h_view[i] = setflag_a[i];
+    k_setflag_bb.h_view[i] = setflag_bb[i];
+    k_setflag_ba.h_view[i] = setflag_ba[i];
+    k_theta0.h_view[i] = theta0[i];
+  }
+
+  k_k2.template modify<LMPHostType>();
+  k_k3.template modify<LMPHostType>();
+  k_k4.template modify<LMPHostType>();
+  k_bb_k.template modify<LMPHostType>();
+  k_bb_r1.template modify<LMPHostType>();
+  k_bb_r2.template modify<LMPHostType>();
+  k_ba_k1.template modify<LMPHostType>();
+  k_ba_k2.template modify<LMPHostType>();
+  k_ba_r1.template modify<LMPHostType>();
+  k_ba_r2.template modify<LMPHostType>();
+  k_setflag.template modify<LMPHostType>();
+  k_setflag_a.template modify<LMPHostType>();
+  k_setflag_bb.template modify<LMPHostType>();
+  k_setflag_ba.template modify<LMPHostType>();
+  k_theta0.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
    virial = r1F1 + r2F2 + r3F3 = (r1-r2) F1 + (r3-r2) F3 = del1*f1 + del2*f3
diff --git a/src/KOKKOS/angle_class2_kokkos.h b/src/KOKKOS/angle_class2_kokkos.h
index b65609b4153533fa6f86c1472d5813a909681b3d..399ef3c47a2d721f8deb616206e7fd5cccbf69a9 100644
--- a/src/KOKKOS/angle_class2_kokkos.h
+++ b/src/KOKKOS/angle_class2_kokkos.h
@@ -40,8 +40,9 @@ class AngleClass2Kokkos : public AngleClass2 {
 
   AngleClass2Kokkos(class LAMMPS *);
   virtual ~AngleClass2Kokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -86,7 +87,7 @@ class AngleClass2Kokkos : public AngleClass2 {
   typename AT::t_ffloat_1d d_ba_k1, d_ba_k2, d_ba_r1, d_ba_r2;
   typename AT::t_ffloat_1d d_setflag, d_setflag_a, d_setflag_bb, d_setflag_ba;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/angle_harmonic_kokkos.cpp b/src/KOKKOS/angle_harmonic_kokkos.cpp
index d8e5659e1efd9103c512163d9cd3c88868c84238..250397c8e3c6c6ddd1aa25939204ad9905d2dc7f 100644
--- a/src/KOKKOS/angle_harmonic_kokkos.cpp
+++ b/src/KOKKOS/angle_harmonic_kokkos.cpp
@@ -267,6 +267,25 @@ void AngleHarmonicKokkos<DeviceType>::coeff(int narg, char **arg)
   k_theta0.template modify<LMPHostType>();
 }
 
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void AngleHarmonicKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  AngleHarmonic::read_restart(fp);
+
+  int n = atom->nangletypes;
+  for (int i = 1; i <= n; i++) {
+    k_k.h_view[i] = k[i];
+    k_theta0.h_view[i] = theta0[i];
+  }
+
+  k_k.template modify<LMPHostType>();
+  k_theta0.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
    virial = r1F1 + r2F2 + r3F3 = (r1-r2) F1 + (r3-r2) F3 = del1*f1 + del2*f3
diff --git a/src/KOKKOS/angle_harmonic_kokkos.h b/src/KOKKOS/angle_harmonic_kokkos.h
index 8e98cd6b7464d411a0f0d768b15ae392e2faa452..7fac9029075f2228253faae7bb95acf0a339ea1b 100644
--- a/src/KOKKOS/angle_harmonic_kokkos.h
+++ b/src/KOKKOS/angle_harmonic_kokkos.h
@@ -39,8 +39,9 @@ class AngleHarmonicKokkos : public AngleHarmonic {
 
   AngleHarmonicKokkos(class LAMMPS *);
   virtual ~AngleHarmonicKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -79,7 +80,7 @@ class AngleHarmonicKokkos : public AngleHarmonic {
   typename ArrayTypes<DeviceType>::t_ffloat_1d d_k;
   typename ArrayTypes<DeviceType>::t_ffloat_1d d_theta0;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/bond_class2_kokkos.cpp b/src/KOKKOS/bond_class2_kokkos.cpp
index f5af93a22aaa666ae8ac03ec4c09d3f3a6530d92..cb625f06c161ca1ef897f600458db3586064c43a 100644
--- a/src/KOKKOS/bond_class2_kokkos.cpp
+++ b/src/KOKKOS/bond_class2_kokkos.cpp
@@ -236,7 +236,43 @@ void BondClass2Kokkos<DeviceType>::coeff(int narg, char **arg)
   k_k4.template sync<DeviceType>();
   k_r0.template modify<LMPHostType>();
   k_r0.template sync<DeviceType>();
+}
 
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void BondClass2Kokkos<DeviceType>::read_restart(FILE *fp)
+{
+  BondClass2::read_restart(fp);
+
+  int n = atom->nbondtypes;
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k2("BondClass2::k2",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k3("BondClass2::k3",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k4("BondClass2::k4",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_r0("BondClass2::r0",n+1);
+
+  d_k2 = k_k2.template view<DeviceType>();
+  d_k3 = k_k3.template view<DeviceType>();
+  d_k4 = k_k4.template view<DeviceType>();
+  d_r0 = k_r0.template view<DeviceType>();
+
+  for (int i = 1; i <= n; i++) {
+    k_k2.h_view[i] = k2[i];
+    k_k3.h_view[i] = k3[i];
+    k_k4.h_view[i] = k4[i];
+    k_r0.h_view[i] = r0[i];
+  }
+
+  k_k2.template modify<LMPHostType>();
+  k_k2.template sync<DeviceType>();
+  k_k3.template modify<LMPHostType>();
+  k_k3.template sync<DeviceType>();
+  k_k4.template modify<LMPHostType>();
+  k_k4.template sync<DeviceType>();
+  k_r0.template modify<LMPHostType>();
+  k_r0.template sync<DeviceType>();
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/KOKKOS/bond_class2_kokkos.h b/src/KOKKOS/bond_class2_kokkos.h
index accb9ffe4e703a441ac745e73a43a2d1552754eb..a31ae4b8ae3712896d91e4e35b581d008d88376d 100644
--- a/src/KOKKOS/bond_class2_kokkos.h
+++ b/src/KOKKOS/bond_class2_kokkos.h
@@ -40,8 +40,9 @@ class BondClass2Kokkos : public BondClass2 {
 
   BondClass2Kokkos(class LAMMPS *);
   virtual ~BondClass2Kokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -76,7 +77,7 @@ class BondClass2Kokkos : public BondClass2 {
   typename AT::t_ffloat_1d d_k2, d_k3, d_k4;
   typename AT::t_ffloat_1d d_r0;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/bond_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp
index 30faf4cee03589161158e3bc9a58a09a6ea2d574..4342223f7ee448bc0e01d25ac1cd876a412db1b4 100644
--- a/src/KOKKOS/bond_fene_kokkos.cpp
+++ b/src/KOKKOS/bond_fene_kokkos.cpp
@@ -282,6 +282,30 @@ void BondFENEKokkos<DeviceType>::coeff(int narg, char **arg)
   k_sigma.template modify<LMPHostType>();
 }
 
+
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void BondFENEKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  BondFENE::read_restart(fp);
+
+  int n = atom->nbondtypes;
+  for (int i = 1; i <= n; i++) {
+    k_k.h_view[i] = k[i];
+    k_r0.h_view[i] = r0[i];
+    k_epsilon.h_view[i] = epsilon[i];
+    k_sigma.h_view[i] = sigma[i];
+  }
+
+  k_k.template modify<LMPHostType>();
+  k_r0.template modify<LMPHostType>();
+  k_epsilon.template modify<LMPHostType>();
+  k_sigma.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
 ------------------------------------------------------------------------- */
diff --git a/src/KOKKOS/bond_fene_kokkos.h b/src/KOKKOS/bond_fene_kokkos.h
index 094685d0cfcd859436474d7ed073d03d1bebc3a8..83f21c5934beea46eafb7524fa6957b764401aa6 100644
--- a/src/KOKKOS/bond_fene_kokkos.h
+++ b/src/KOKKOS/bond_fene_kokkos.h
@@ -39,8 +39,9 @@ class BondFENEKokkos : public BondFENE {
 
   BondFENEKokkos(class LAMMPS *);
   virtual ~BondFENEKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -90,7 +91,7 @@ class BondFENEKokkos : public BondFENE {
   typename AT::t_ffloat_1d d_epsilon;
   typename AT::t_ffloat_1d d_sigma;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/bond_harmonic_kokkos.cpp b/src/KOKKOS/bond_harmonic_kokkos.cpp
index 8aa71b9eb3ec2491ef6c710be6a6763fc776f218..35b957ffd34c72deacef9a1ed41cf9c1fd65908e 100644
--- a/src/KOKKOS/bond_harmonic_kokkos.cpp
+++ b/src/KOKKOS/bond_harmonic_kokkos.cpp
@@ -220,7 +220,33 @@ void BondHarmonicKokkos<DeviceType>::coeff(int narg, char **arg)
   k_r0.template modify<LMPHostType>();
   k_k.template sync<DeviceType>();
   k_r0.template sync<DeviceType>();
+}
+
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void BondHarmonicKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  BondHarmonic::read_restart(fp);
+
+  int n = atom->nbondtypes;
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k("BondHarmonic::k",n+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_r0("BondHarmonic::r0",n+1);
 
+  d_k = k_k.template view<DeviceType>();
+  d_r0 = k_r0.template view<DeviceType>();
+
+  for (int i = 1; i <= n; i++) {
+    k_k.h_view[i] = k[i];
+    k_r0.h_view[i] = r0[i];
+  }
+
+  k_k.template modify<LMPHostType>();
+  k_r0.template modify<LMPHostType>();
+  k_k.template sync<DeviceType>();
+  k_r0.template sync<DeviceType>();
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/KOKKOS/bond_harmonic_kokkos.h b/src/KOKKOS/bond_harmonic_kokkos.h
index dc42fbcd5c509623f892213efd493dad62055c14..2bf12f3766681064740314ff73117ac0b5226ec4 100644
--- a/src/KOKKOS/bond_harmonic_kokkos.h
+++ b/src/KOKKOS/bond_harmonic_kokkos.h
@@ -39,8 +39,9 @@ class BondHarmonicKokkos : public BondHarmonic {
 
   BondHarmonicKokkos(class LAMMPS *);
   virtual ~BondHarmonicKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -76,7 +77,7 @@ class BondHarmonicKokkos : public BondHarmonic {
   typename AT::t_ffloat_1d d_k;
   typename AT::t_ffloat_1d d_r0;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp
index 41593ffbda6bebe72e4bf7d68bc250760c757d0c..9e25dda894f19180553ecf06e23d29cb21bc9e79 100644
--- a/src/KOKKOS/dihedral_charmm_kokkos.cpp
+++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp
@@ -506,7 +506,55 @@ void DihedralCharmmKokkos<DeviceType>::init_style()
   k_lj14_2.template sync<DeviceType>();
   k_lj14_3.template sync<DeviceType>();
   k_lj14_4.template sync<DeviceType>();
+}
+
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void DihedralCharmmKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  DihedralCharmm::read_restart(fp);
 
+  int nd = atom->ndihedraltypes;
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_k("DihedralCharmm::k",nd+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_multiplicity("DihedralCharmm::multiplicity",nd+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_shift("DihedralCharmm::shift",nd+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_cos_shift("DihedralCharmm::cos_shift",nd+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_sin_shift("DihedralCharmm::sin_shift",nd+1);
+  Kokkos::DualView<F_FLOAT*,DeviceType> k_weight("DihedralCharmm::weight",nd+1);
+
+  d_k = k_k.template view<DeviceType>();
+  d_multiplicity = k_multiplicity.template view<DeviceType>();
+  d_shift = k_shift.template view<DeviceType>();
+  d_cos_shift = k_cos_shift.template view<DeviceType>();
+  d_sin_shift = k_sin_shift.template view<DeviceType>();
+  d_weight = k_weight.template view<DeviceType>();
+
+  int n = atom->ndihedraltypes;
+  for (int i = 1; i <= n; i++) {
+    k_k.h_view[i] = k[i];
+    k_multiplicity.h_view[i] = multiplicity[i];
+    k_shift.h_view[i] = shift[i];
+    k_cos_shift.h_view[i] = cos_shift[i];
+    k_sin_shift.h_view[i] = sin_shift[i];
+    k_weight.h_view[i] = weight[i];
+  }
+
+  k_k.template modify<LMPHostType>();
+  k_multiplicity.template modify<LMPHostType>();
+  k_shift.template modify<LMPHostType>();
+  k_cos_shift.template modify<LMPHostType>();
+  k_sin_shift.template modify<LMPHostType>();
+  k_weight.template modify<LMPHostType>();
+
+  k_k.template sync<DeviceType>();
+  k_multiplicity.template sync<DeviceType>();
+  k_shift.template sync<DeviceType>();
+  k_cos_shift.template sync<DeviceType>();
+  k_sin_shift.template sync<DeviceType>();
+  k_weight.template sync<DeviceType>();
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/KOKKOS/dihedral_charmm_kokkos.h b/src/KOKKOS/dihedral_charmm_kokkos.h
index 613886d21cb7497e612116fb33f2736dc9046dad..449f934533c1d07c84a83c8eab29fcc6f2134055 100644
--- a/src/KOKKOS/dihedral_charmm_kokkos.h
+++ b/src/KOKKOS/dihedral_charmm_kokkos.h
@@ -96,9 +96,10 @@ class DihedralCharmmKokkos : public DihedralCharmm {
 
   DihedralCharmmKokkos(class LAMMPS *);
   virtual ~DihedralCharmmKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
-  virtual void init_style();
+  void compute(int, int);
+  void coeff(int, char **);
+  void init_style();
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -161,7 +162,7 @@ class DihedralCharmmKokkos : public DihedralCharmm {
   typename AT::t_ffloat_1d d_cos_shift;
   typename AT::t_ffloat_1d d_weight;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/dihedral_class2_kokkos.cpp b/src/KOKKOS/dihedral_class2_kokkos.cpp
index f656fcf756ad5611985fb0739ff31136ef681971..de1d9c54586f3f17916140777dcbdd80e20ca703 100644
--- a/src/KOKKOS/dihedral_class2_kokkos.cpp
+++ b/src/KOKKOS/dihedral_class2_kokkos.cpp
@@ -821,6 +821,176 @@ void DihedralClass2Kokkos<DeviceType>::coeff(int narg, char **arg)
   k_setflag_bb13t.template modify<LMPHostType>();
 }
 
+
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void DihedralClass2Kokkos<DeviceType>::read_restart(FILE *fp)
+{
+  DihedralClass2::read_restart(fp);
+
+  int n = atom->ndihedraltypes;
+  k_k1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::k1",n+1);
+  k_k2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::k2",n+1);
+  k_k3 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::k3",n+1);
+  k_phi1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::phi1",n+1);
+  k_phi2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::phi2",n+1);
+  k_phi3 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::phi3",n+1);
+  k_mbt_f1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::mbt_f1",n+1);
+  k_mbt_f2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::mbt_f2",n+1);
+  k_mbt_f3 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::mbt_f3",n+1);
+  k_mbt_r0 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::mbt_r0",n+1);
+  k_ebt_f1_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_f1_1",n+1);
+  k_ebt_f2_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_f2_1",n+1);
+  k_ebt_f3_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_f3_1",n+1);
+  k_ebt_r0_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_r0_1",n+1);
+  k_ebt_f1_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_f1_2",n+1);
+  k_ebt_f2_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_f2_2",n+1);
+  k_ebt_f3_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_f3_2",n+1);
+  k_ebt_r0_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::ebt_r0_2",n+1);
+  k_at_f1_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_f1_1",n+1);
+  k_at_f2_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_f2_1",n+1);
+  k_at_f3_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_f3_1",n+1);
+  k_at_f1_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_f1_2",n+1);
+  k_at_f2_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_f2_2",n+1);
+  k_at_f3_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_f3_2",n+1);
+  k_at_theta0_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_theta0_1",n+1);
+  k_at_theta0_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::at_theta0_2",n+1);
+  k_aat_k = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::aat_k",n+1);
+  k_aat_theta0_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::aat_theta0_1",n+1);
+  k_aat_theta0_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::aat_theta0_2",n+1);
+  k_bb13t_k = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::bb13t_k",n+1);
+  k_bb13t_r10 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::bb13t_r10",n+1);
+  k_bb13t_r30 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("DihedralClass2::bb13t_r30",n+1);
+  k_setflag_d = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_d",n+1);
+  k_setflag_mbt = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_mbt",n+1);
+  k_setflag_ebt = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_ebt",n+1);
+  k_setflag_at = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_at",n+1);
+  k_setflag_aat = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_aat",n+1);
+  k_setflag_bb13t = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("AngleClass2::setflag_bb13t",n+1);
+
+  d_k1 = k_k1.template view<DeviceType>();
+  d_k2 = k_k2.template view<DeviceType>();
+  d_k3 = k_k3.template view<DeviceType>();
+  d_phi1 = k_phi1.template view<DeviceType>();
+  d_phi2 = k_phi2.template view<DeviceType>();
+  d_phi3 = k_phi3.template view<DeviceType>();
+  d_mbt_f1 = k_mbt_f1.template view<DeviceType>();
+  d_mbt_f2 = k_mbt_f2.template view<DeviceType>();
+  d_mbt_f3 = k_mbt_f3.template view<DeviceType>();
+  d_mbt_r0 = k_mbt_r0.template view<DeviceType>();
+  d_ebt_f1_1 = k_ebt_f1_1.template view<DeviceType>();
+  d_ebt_f2_1 = k_ebt_f2_1.template view<DeviceType>();
+  d_ebt_f3_1 = k_ebt_f3_1.template view<DeviceType>();
+  d_ebt_r0_1 = k_ebt_r0_1.template view<DeviceType>();
+  d_ebt_f1_2 = k_ebt_f1_2.template view<DeviceType>();
+  d_ebt_f2_2 = k_ebt_f2_2.template view<DeviceType>();
+  d_ebt_f3_2 = k_ebt_f3_2.template view<DeviceType>();
+  d_ebt_r0_2 = k_ebt_r0_2.template view<DeviceType>();
+  d_at_f1_1 = k_at_f1_1.template view<DeviceType>();
+  d_at_f2_1 = k_at_f2_1.template view<DeviceType>();
+  d_at_f3_1 = k_at_f3_1.template view<DeviceType>();
+  d_at_f1_2 = k_at_f1_2.template view<DeviceType>();
+  d_at_f2_2 = k_at_f2_2.template view<DeviceType>();
+  d_at_f3_2 = k_at_f3_2.template view<DeviceType>();
+  d_at_theta0_1 = k_at_theta0_1.template view<DeviceType>();
+  d_at_theta0_2 = k_at_theta0_2.template view<DeviceType>();
+  d_aat_k = k_aat_k.template view<DeviceType>();
+  d_aat_theta0_1 = k_aat_theta0_1.template view<DeviceType>();
+  d_aat_theta0_2 = k_aat_theta0_2.template view<DeviceType>();
+  d_bb13t_k = k_bb13t_k.template view<DeviceType>();
+  d_bb13t_r10 = k_bb13t_r10.template view<DeviceType>();
+  d_bb13t_r30 = k_bb13t_r30.template view<DeviceType>();
+  d_setflag_d = k_setflag_d.template view<DeviceType>();
+  d_setflag_mbt = k_setflag_mbt.template view<DeviceType>();
+  d_setflag_ebt = k_setflag_ebt.template view<DeviceType>();
+  d_setflag_at = k_setflag_at.template view<DeviceType>();
+  d_setflag_aat = k_setflag_aat.template view<DeviceType>();
+  d_setflag_bb13t = k_setflag_bb13t.template view<DeviceType>();
+
+  for (int i = 1; i <= n; i++) {
+    k_k1.h_view[i] = k1[i];
+    k_k2.h_view[i] = k2[i];
+    k_k3.h_view[i] = k3[i];
+    k_phi1.h_view[i] = phi1[i];
+    k_phi2.h_view[i] = phi2[i];
+    k_phi3.h_view[i] = phi3[i];
+    k_mbt_f1.h_view[i] = mbt_f1[i];
+    k_mbt_f2.h_view[i] = mbt_f2[i];
+    k_mbt_f3.h_view[i] = mbt_f3[i];
+    k_mbt_r0.h_view[i] = mbt_r0[i];
+    k_ebt_f1_1.h_view[i] = ebt_f1_1[i];
+    k_ebt_f2_1.h_view[i] = ebt_f2_1[i];
+    k_ebt_f3_1.h_view[i] = ebt_f3_1[i];
+    k_ebt_r0_1.h_view[i] = ebt_r0_1[i];
+    k_ebt_f1_2.h_view[i] = ebt_f1_2[i];
+    k_ebt_f2_2.h_view[i] = ebt_f2_2[i];
+    k_ebt_f3_2.h_view[i] = ebt_f3_2[i];
+    k_ebt_r0_2.h_view[i] = ebt_r0_2[i];
+    k_at_f1_1.h_view[i] = at_f1_1[i];
+    k_at_f2_1.h_view[i] = at_f2_1[i];
+    k_at_f3_1.h_view[i] = at_f3_1[i];
+    k_at_f1_2.h_view[i] = at_f1_2[i];
+    k_at_f2_2.h_view[i] = at_f2_2[i];
+    k_at_f3_2.h_view[i] = at_f3_2[i];
+    k_at_theta0_1.h_view[i] = at_theta0_1[i];
+    k_at_theta0_2.h_view[i] = at_theta0_2[i];
+    k_aat_k.h_view[i] = aat_k[i];
+    k_aat_theta0_1.h_view[i] = aat_theta0_1[i];
+    k_aat_theta0_2.h_view[i] = aat_theta0_2[i];
+    k_bb13t_k.h_view[i] = bb13t_k[i];
+    k_bb13t_r10.h_view[i] = bb13t_r10[i];
+    k_bb13t_r30.h_view[i] = bb13t_r30[i];
+    k_setflag_d.h_view[i] = setflag_d[i];
+    k_setflag_mbt.h_view[i] = setflag_mbt[i];
+    k_setflag_ebt.h_view[i] = setflag_ebt[i];
+    k_setflag_at.h_view[i] = setflag_at[i];
+    k_setflag_aat.h_view[i] = setflag_aat[i];
+    k_setflag_bb13t.h_view[i] = setflag_bb13t[i];
+  }
+
+  k_k1.template modify<LMPHostType>();
+  k_k2.template modify<LMPHostType>();
+  k_k3.template modify<LMPHostType>();
+  k_phi1.template modify<LMPHostType>();
+  k_phi2.template modify<LMPHostType>();
+  k_phi3.template modify<LMPHostType>();
+  k_mbt_f1.template modify<LMPHostType>();
+  k_mbt_f2.template modify<LMPHostType>();
+  k_mbt_f3.template modify<LMPHostType>();
+  k_mbt_r0.template modify<LMPHostType>();
+  k_ebt_f1_1.template modify<LMPHostType>();
+  k_ebt_f2_1.template modify<LMPHostType>();
+  k_ebt_f3_1.template modify<LMPHostType>();
+  k_ebt_r0_1.template modify<LMPHostType>();
+  k_ebt_f1_2.template modify<LMPHostType>();
+  k_ebt_f2_2.template modify<LMPHostType>();
+  k_ebt_f3_2.template modify<LMPHostType>();
+  k_ebt_r0_2.template modify<LMPHostType>();
+  k_at_f1_1.template modify<LMPHostType>();
+  k_at_f2_1.template modify<LMPHostType>();
+  k_at_f3_1.template modify<LMPHostType>();
+  k_at_f1_2.template modify<LMPHostType>();
+  k_at_f2_2.template modify<LMPHostType>();
+  k_at_f3_2.template modify<LMPHostType>();
+  k_at_theta0_1.template modify<LMPHostType>();
+  k_at_theta0_2.template modify<LMPHostType>();
+  k_aat_k.template modify<LMPHostType>();
+  k_aat_theta0_1.template modify<LMPHostType>();
+  k_aat_theta0_2.template modify<LMPHostType>();
+  k_bb13t_k.template modify<LMPHostType>();
+  k_bb13t_r10.template modify<LMPHostType>();
+  k_bb13t_r30.template modify<LMPHostType>();
+  k_setflag_d.template modify<LMPHostType>();
+  k_setflag_mbt.template modify<LMPHostType>();
+  k_setflag_ebt.template modify<LMPHostType>();
+  k_setflag_at.template modify<LMPHostType>();
+  k_setflag_aat.template modify<LMPHostType>();
+  k_setflag_bb13t.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
    virial = r1F1 + r2F2 + r3F3 + r4F4 = (r1-r2) F1 + (r3-r2) F3 + (r4-r2) F4
diff --git a/src/KOKKOS/dihedral_class2_kokkos.h b/src/KOKKOS/dihedral_class2_kokkos.h
index 4c9b0970570bcf1c87ec002b5764bcc045fb88db..0d0309928d84561d3393bc2512278195056b00fa 100644
--- a/src/KOKKOS/dihedral_class2_kokkos.h
+++ b/src/KOKKOS/dihedral_class2_kokkos.h
@@ -39,8 +39,9 @@ class DihedralClass2Kokkos : public DihedralClass2 {
 
   DihedralClass2Kokkos(class LAMMPS *);
   virtual ~DihedralClass2Kokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -102,7 +103,7 @@ class DihedralClass2Kokkos : public DihedralClass2 {
   typename AT::t_ffloat_1d d_setflag_d, d_setflag_mbt, d_setflag_ebt;
   typename AT::t_ffloat_1d d_setflag_at, d_setflag_aat, d_setflag_bb13t;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/dihedral_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp
index 62c481fa9c3ee17ac92fbc17ec70fa6c1e833079..3f34c2f5f3332f73f7f6754c6a4c195d32ac970a 100644
--- a/src/KOKKOS/dihedral_opls_kokkos.cpp
+++ b/src/KOKKOS/dihedral_opls_kokkos.cpp
@@ -377,6 +377,29 @@ void DihedralOPLSKokkos<DeviceType>::coeff(int narg, char **arg)
   k_k4.template modify<LMPHostType>();
 }
 
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void DihedralOPLSKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  DihedralOPLS::read_restart(fp);
+
+  int n = atom->ndihedraltypes;
+  for (int i = 1; i <= n; i++) {
+    k_k1.h_view[i] = k1[i];
+    k_k2.h_view[i] = k2[i];
+    k_k3.h_view[i] = k3[i];
+    k_k4.h_view[i] = k4[i];
+  }
+
+  k_k1.template modify<LMPHostType>();
+  k_k2.template modify<LMPHostType>();
+  k_k3.template modify<LMPHostType>();
+  k_k4.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
    virial = r1F1 + r2F2 + r3F3 + r4F4 = (r1-r2) F1 + (r3-r2) F3 + (r4-r2) F4
diff --git a/src/KOKKOS/dihedral_opls_kokkos.h b/src/KOKKOS/dihedral_opls_kokkos.h
index 2594f5e74d7c3c6c01ccce1be0cdee1fa577f0b0..b841193064ef1c3e3dfb0a0b5f94d42c4f9d89a3 100644
--- a/src/KOKKOS/dihedral_opls_kokkos.h
+++ b/src/KOKKOS/dihedral_opls_kokkos.h
@@ -39,8 +39,9 @@ class DihedralOPLSKokkos : public DihedralOPLS {
 
   DihedralOPLSKokkos(class LAMMPS *);
   virtual ~DihedralOPLSKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -88,7 +89,7 @@ class DihedralOPLSKokkos : public DihedralOPLS {
   typename AT::t_ffloat_1d d_k3;
   typename AT::t_ffloat_1d d_k4;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/improper_class2_kokkos.cpp b/src/KOKKOS/improper_class2_kokkos.cpp
index fdb890be5481969c48b885b3f99f0b54d97e4f38..2a7e8076d4be08d8f9c4a9a68d45dc92393db8ed 100644
--- a/src/KOKKOS/improper_class2_kokkos.cpp
+++ b/src/KOKKOS/improper_class2_kokkos.cpp
@@ -937,6 +937,67 @@ void ImproperClass2Kokkos<DeviceType>::coeff(int narg, char **arg)
   k_setflag_aa.template modify<LMPHostType>();
 }
 
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void ImproperClass2Kokkos<DeviceType>::read_restart(FILE *fp)
+{
+  ImproperClass2::read_restart(fp);
+
+  int n = atom->nimpropertypes;
+  k_k0 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::k0",n+1);
+  k_chi0 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::chi0",n+1);
+  k_aa_k1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::aa_k1",n+1);
+  k_aa_k2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::aa_k2",n+1);
+  k_aa_k3 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::aa_k3",n+1);
+  k_aa_theta0_1 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::aa_theta0_1",n+1);
+  k_aa_theta0_2 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::aa_theta0_2",n+1);
+  k_aa_theta0_3 = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::aa_theta0_3",n+1);
+  k_setflag = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::setflag",n+1);
+  k_setflag_i = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::setflag_i",n+1);
+  k_setflag_aa = typename ArrayTypes<DeviceType>::tdual_ffloat_1d("ImproperClass2::setflag_aa",n+1);
+
+  d_k0 = k_k0.template view<DeviceType>();
+  d_chi0 = k_chi0.template view<DeviceType>();
+  d_aa_k1 = k_aa_k1.template view<DeviceType>();
+  d_aa_k2 = k_aa_k2.template view<DeviceType>();
+  d_aa_k3 = k_aa_k3.template view<DeviceType>();
+  d_aa_theta0_1 = k_aa_theta0_1.template view<DeviceType>();
+  d_aa_theta0_2 = k_aa_theta0_2.template view<DeviceType>();
+  d_aa_theta0_3 = k_aa_theta0_3.template view<DeviceType>();
+  d_setflag = k_setflag.template view<DeviceType>();
+  d_setflag_i = k_setflag_i.template view<DeviceType>();
+  d_setflag_aa = k_setflag_aa.template view<DeviceType>();
+
+  for (int i = 1; i <= n; i++) {
+    k_k0.h_view[i] = k0[i];
+    k_chi0.h_view[i] = chi0[i];
+    k_aa_k1.h_view[i] = aa_k1[i];
+    k_aa_k2.h_view[i] = aa_k2[i];
+    k_aa_k3.h_view[i] = aa_k3[i];
+    k_aa_theta0_1.h_view[i] = aa_theta0_1[i];
+    k_aa_theta0_2.h_view[i] = aa_theta0_2[i];
+    k_aa_theta0_3.h_view[i] = aa_theta0_3[i];
+    k_setflag.h_view[i] = setflag[i];
+    k_setflag_i.h_view[i] = setflag_i[i];
+    k_setflag_aa.h_view[i] = setflag_aa[i];
+  }
+
+  k_k0.template modify<LMPHostType>();
+  k_chi0.template modify<LMPHostType>();
+  k_aa_k1.template modify<LMPHostType>();
+  k_aa_k2.template modify<LMPHostType>();
+  k_aa_k3.template modify<LMPHostType>();
+  k_aa_theta0_1.template modify<LMPHostType>();
+  k_aa_theta0_2.template modify<LMPHostType>();
+  k_aa_theta0_3 .template modify<LMPHostType>();
+  k_setflag.template modify<LMPHostType>();
+  k_setflag_i.template modify<LMPHostType>();
+  k_setflag_aa.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
    virial = r1F1 + r2F2 + r3F3 + r4F4 = (r1-r2) F1 + (r3-r2) F3 + (r4-r2) F4
diff --git a/src/KOKKOS/improper_class2_kokkos.h b/src/KOKKOS/improper_class2_kokkos.h
index 769ebc655fb551a34a74fb6486a5f5b8b3603c2c..0fbfab2beb954f29c7320e53511e9136d8f19501 100644
--- a/src/KOKKOS/improper_class2_kokkos.h
+++ b/src/KOKKOS/improper_class2_kokkos.h
@@ -42,8 +42,9 @@ class ImproperClass2Kokkos : public ImproperClass2 {
 
   ImproperClass2Kokkos(class LAMMPS *);
   virtual ~ImproperClass2Kokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -97,7 +98,7 @@ class ImproperClass2Kokkos : public ImproperClass2 {
   typename AT::t_ffloat_1d d_aa_k1,d_aa_k2,d_aa_k3,d_aa_theta0_1,d_aa_theta0_2,d_aa_theta0_3;
   typename AT::t_ffloat_1d d_setflag_i,d_setflag_aa,d_setflag;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/KOKKOS/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp
index 9f4e8b9440f52cbfa10262623544ac25bce78c4b..b364d0b0c78a873527483ff768a5ab800d0ddea1 100644
--- a/src/KOKKOS/improper_harmonic_kokkos.cpp
+++ b/src/KOKKOS/improper_harmonic_kokkos.cpp
@@ -332,6 +332,25 @@ void ImproperHarmonicKokkos<DeviceType>::coeff(int narg, char **arg)
   k_chi.template modify<LMPHostType>();
 }
 
+/* ----------------------------------------------------------------------
+   proc 0 reads coeffs from restart file, bcasts them
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void ImproperHarmonicKokkos<DeviceType>::read_restart(FILE *fp)
+{
+  ImproperHarmonic::read_restart(fp);
+
+  int n = atom->nimpropertypes;
+  for (int i = 1; i <= n; i++) {
+    k_k.h_view[i] = k[i];
+    k_chi.h_view[i] = chi[i];
+  }
+
+  k_k.template modify<LMPHostType>();
+  k_chi.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
    virial = r1F1 + r2F2 + r3F3 + r4F4 = (r1-r2) F1 + (r3-r2) F3 + (r4-r2) F4
diff --git a/src/KOKKOS/improper_harmonic_kokkos.h b/src/KOKKOS/improper_harmonic_kokkos.h
index c83df68d5e54b91322b3a0f363a39cbaac809f2c..23ae0c71103b406f10c09a9b25f1be8d15f22a5b 100644
--- a/src/KOKKOS/improper_harmonic_kokkos.h
+++ b/src/KOKKOS/improper_harmonic_kokkos.h
@@ -39,8 +39,9 @@ class ImproperHarmonicKokkos : public ImproperHarmonic {
 
   ImproperHarmonicKokkos(class LAMMPS *);
   virtual ~ImproperHarmonicKokkos();
-  virtual void compute(int, int);
-  virtual void coeff(int, char **);
+  void compute(int, int);
+  void coeff(int, char **);
+  void read_restart(FILE *);
 
   template<int NEWTON_BOND, int EVFLAG>
   KOKKOS_INLINE_FUNCTION
@@ -84,7 +85,7 @@ class ImproperHarmonicKokkos : public ImproperHarmonic {
   typename Kokkos::DualView<F_FLOAT*,DeviceType>::t_dev d_k;
   typename Kokkos::DualView<F_FLOAT*,DeviceType>::t_dev d_chi;
 
-  virtual void allocate();
+  void allocate();
 };
 
 }
diff --git a/src/MOLECULE/angle_charmm.h b/src/MOLECULE/angle_charmm.h
index 82c9e42fbabc92f6a1a4be186aeccfa095e5bcc2..2228ad8732d06fa47d65f7b3264467b0a0dad3df 100644
--- a/src/MOLECULE/angle_charmm.h
+++ b/src/MOLECULE/angle_charmm.h
@@ -33,7 +33,7 @@ class AngleCharmm : public Angle {
   virtual void coeff(int, char **);
   double equilibrium_angle(int);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
   double single(int, int, int, int);
 
diff --git a/src/MOLECULE/angle_harmonic.h b/src/MOLECULE/angle_harmonic.h
index ff8bd55fc00f217009ae3e606de45c18873cb796..e0c067653bfec47c0e1ed4fb0455d191ea747cb7 100644
--- a/src/MOLECULE/angle_harmonic.h
+++ b/src/MOLECULE/angle_harmonic.h
@@ -33,7 +33,7 @@ class AngleHarmonic : public Angle {
   virtual void coeff(int, char **);
   double equilibrium_angle(int);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
   double single(int, int, int, int);
 
diff --git a/src/MOLECULE/bond_fene.h b/src/MOLECULE/bond_fene.h
index 678ae165d66ffd59347e8451d8f95fd8f1465e39..58cd6ce2894855ec390424f0ee8a9681833effcd 100644
--- a/src/MOLECULE/bond_fene.h
+++ b/src/MOLECULE/bond_fene.h
@@ -33,7 +33,7 @@ class BondFENE : public Bond {
   virtual void coeff(int, char **);
   void init_style();
   double equilibrium_distance(int);
-  void write_restart(FILE *);
+  virtual void write_restart(FILE *);
   void read_restart(FILE *);
   void write_data(FILE *);
   double single(int, double, int, int, double &);
diff --git a/src/MOLECULE/bond_harmonic.h b/src/MOLECULE/bond_harmonic.h
index 73f6a9f774cbb373fa9161701cf6680822b23c29..5c692b2a8e1add8419d7394649aa4021afd11985 100644
--- a/src/MOLECULE/bond_harmonic.h
+++ b/src/MOLECULE/bond_harmonic.h
@@ -30,10 +30,10 @@ class BondHarmonic : public Bond {
   BondHarmonic(class LAMMPS *);
   virtual ~BondHarmonic();
   virtual void compute(int, int);
-  void coeff(int, char **);
+  virtual void coeff(int, char **);
   double equilibrium_distance(int);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
   double single(int, double, int, int, double &);
   virtual void *extract(char *, int &);
diff --git a/src/MOLECULE/dihedral_charmm.h b/src/MOLECULE/dihedral_charmm.h
index 349bee73d8ae938f70a31ad13ff327ab25c95928..8f51b398dbfb57e5bf57788180dbc9cfab21bf9a 100644
--- a/src/MOLECULE/dihedral_charmm.h
+++ b/src/MOLECULE/dihedral_charmm.h
@@ -33,7 +33,7 @@ class DihedralCharmm : public Dihedral {
   virtual void coeff(int, char **);
   virtual void init_style();
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
 
  protected:
diff --git a/src/MOLECULE/dihedral_opls.h b/src/MOLECULE/dihedral_opls.h
index 378dec1a6a930db5733fe20ee444f318fba81dfe..c1e64ada1ee2bbc83e756ad6384605f6d6ea098d 100644
--- a/src/MOLECULE/dihedral_opls.h
+++ b/src/MOLECULE/dihedral_opls.h
@@ -30,9 +30,9 @@ class DihedralOPLS : public Dihedral {
   DihedralOPLS(class LAMMPS *);
   virtual ~DihedralOPLS();
   virtual void compute(int, int);
-  void coeff(int, char **);
+  virtual void coeff(int, char **);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
 
  protected:
diff --git a/src/MOLECULE/improper_harmonic.h b/src/MOLECULE/improper_harmonic.h
index be9b25f3b6929ced0877a647a2d561f9e864453c..fbbb8d33d6362ff934251ef1c90d665c669f7363 100644
--- a/src/MOLECULE/improper_harmonic.h
+++ b/src/MOLECULE/improper_harmonic.h
@@ -32,7 +32,7 @@ class ImproperHarmonic : public Improper {
   virtual void compute(int, int);
   virtual void coeff(int, char **);
   void write_restart(FILE *);
-  void read_restart(FILE *);
+  virtual void read_restart(FILE *);
   void write_data(FILE *);
 
  protected:
diff --git a/src/atom_map.cpp b/src/atom_map.cpp
index 46593432cfe07cd6806a0fcfca4f1ab282f7cc03..e9cd590624c2ded25b55bdbb15af6a9cfb4d4e39 100644
--- a/src/atom_map.cpp
+++ b/src/atom_map.cpp
@@ -304,7 +304,7 @@ int Atom::map_style_set()
 
   int map_style_old = map_style;
   if (map_user == 1 || map_user == 2) map_style = map_user;
-  else if (map_tag_max > 1000000) map_style = 2;
+  else if (map_tag_max > 1000000 && !lmp->kokkos) map_style = 2;
   else map_style = 1;
 
   // recreate = 1 if must create new map b/c map_style changed