diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt
index 3ad1249ace4112f5641b72868db88b6bf47edcc2..ccb94ff5ca4e2bd23ad1f7067520b2ff77a97352 100644
--- a/doc/src/Section_commands.txt
+++ b/doc/src/Section_commands.txt
@@ -1024,7 +1024,7 @@ KOKKOS, o = USER-OMP, t = OPT.
 "tri/lj"_pair_tri_lj.html,
 "vashishta (ko)"_pair_vashishta.html,
 "vashishta/table (o)"_pair_vashishta.html,
-"yukawa (go)"_pair_yukawa.html,
+"yukawa (gok)"_pair_yukawa.html,
 "yukawa/colloid (go)"_pair_yukawa_colloid.html,
 "zbl (go)"_pair_zbl.html :tb(c=4,ea=c)
 
@@ -1046,6 +1046,7 @@ package"_Section_start.html#start_3.
 "edpd"_pair_meso.html,
 "eff/cut"_pair_eff.html,
 "exp6/rx"_pair_exp6_rx.html,
+"extep"_pair_extep.html,
 "gauss/cut"_pair_gauss.html,
 "kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html,
 "lennard/mdf"_pair_mdf.html,
diff --git a/doc/src/create_atoms.txt b/doc/src/create_atoms.txt
index e14dd8c85e64469642fcc768a962eb5463fe0cd6..ad13879c6dd5b74ab2640135896241d326c04f4b 100644
--- a/doc/src/create_atoms.txt
+++ b/doc/src/create_atoms.txt
@@ -36,9 +36,9 @@ keyword = {mol} or {basis} or {remap} or {var} or {set} or {units} :l
   {set} values = dim name
     dim = {x} or {y} or {z}
     name = name of variable to set with x, y, or z atom position
-  {rotate} values = Rx Ry Rz theta
-    Rx,Ry,Rz = rotation vector for single molecule
+  {rotate} values = theta Rx Ry Rz
     theta = rotation angle for single molecule (degrees)
+    Rx,Ry,Rz = rotation vector for single molecule
   {units} value = {lattice} or {box}
     {lattice} = the geometry is defined in lattice units
     {box} = the geometry is defined in simulation box units :pre
@@ -242,15 +242,15 @@ write_dump      all atom sinusoid.lammpstrj :pre
 
 :c,image(JPG/sinusoid_small.jpg,JPG/sinusoid.jpg)
 
-The {rotate} keyword can be used with the {single} style, when adding
-a single molecule to specify the orientation at which the molecule is
-inserted.  The axis of rotation is determined by the rotation vector
-(Rx,Ry,Rz) that goes through the insertion point.  The specified
-{theta} determines the angle of rotation around that axis.  Note that
-the direction of rotation for the atoms around the rotation axis is
-consistent with the right-hand rule: if your right-hand's thumb points
-along {R}, then your fingers wrap around the axis in the direction of
-rotation.
+The {rotate} keyword can only be used with the {single} style and
+when adding a single molecule. It allows to specify the orientation
+at which the molecule is inserted.  The axis of rotation is
+determined by the rotation vector (Rx,Ry,Rz) that goes through the
+insertion point.  The specified {theta} determines the angle of
+rotation around that axis.  Note that the direction of rotation for
+the atoms around the rotation axis is consistent with the right-hand
+rule: if your right-hand's thumb points along {R}, then your fingers
+wrap around the axis in the direction of rotation.
 
 The {units} keyword determines the meaning of the distance units used
 to specify the coordinates of the one particle created by the {single}
diff --git a/doc/src/create_bonds.txt b/doc/src/create_bonds.txt
index 5a878521693c968f09bbbbefbbca130a91832fa6..6af69214d3c4523318945c3bf70ac0547621dd64 100644
--- a/doc/src/create_bonds.txt
+++ b/doc/src/create_bonds.txt
@@ -18,7 +18,7 @@ style = {many} or {single/bond} or {single/angle} or {single/dihedral} :ule,l
     group2-ID = ID of second group, bonds will be between atoms in the 2 groups
     btype = bond type of created bonds
     rmin = minimum distance between pair of atoms to bond together
-    rmax = minimum distance between pair of atoms to bond together
+    rmax = maximum distance between pair of atoms to bond together
   {single/bond} args = btype batom1 batom2
     btype = bond type of new bond
     batom1,batom2 = atom IDs for two atoms in bond
diff --git a/doc/src/lammps.book b/doc/src/lammps.book
index 30eff08e290c3f3f451c47846c3cd2f93799e314..f271b044b94151d6d9e91c3c4bca02d4326f3e06 100644
--- a/doc/src/lammps.book
+++ b/doc/src/lammps.book
@@ -445,6 +445,7 @@ pair_edip.html
 pair_eff.html
 pair_eim.html
 pair_exp6_rx.html
+pair_extep.html
 pair_gauss.html
 pair_gayberne.html
 pair_gran.html
diff --git a/doc/src/pair_extep.txt b/doc/src/pair_extep.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9a784e2501638ecda41031366b0777346115c94f
--- /dev/null
+++ b/doc/src/pair_extep.txt
@@ -0,0 +1,40 @@
+"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
+
+:link(lws,http://lammps.sandia.gov)
+:link(ld,Manual.html)
+:link(lc,Section_commands.html#comm)
+
+:line
+
+pair_style extep command :h3
+
+[Syntax:]
+
+pair_style extep :pre
+
+[Examples:]
+
+pair_style extep
+pair_coeff * * BN.extep B N :pre
+
+[Description:]
+
+Style {extep} computes the Extended Tersoff Potential (ExTeP)
+interactions as described in "(Los2017)"_#Los2017.
+
+:line
+
+[Restrictions:] none
+
+[Related commands:]
+
+"pair_tersoff" pair_tersoff.html
+
+[Default:] none
+
+:line
+
+:link(Los2017)
+[(Los2017)] J. H. Los et al. "Extended Tersoff potential for boron nitride: 
+Energetics and elastic properties of pristine and defective h-BN", 
+Phys. Rev. B 96 (184108), 2017.
diff --git a/doc/src/pair_yukawa.txt b/doc/src/pair_yukawa.txt
index 61d6bde6a92ab34ea2a42527f59a3227ab27b163..e7c063ded9f41227210e17970dc9fb7cc59ed757 100644
--- a/doc/src/pair_yukawa.txt
+++ b/doc/src/pair_yukawa.txt
@@ -9,6 +9,7 @@
 pair_style yukawa command :h3
 pair_style yukawa/gpu command :h3
 pair_style yukawa/omp command :h3
+pair_style yukawa/kk command :h3
 
 [Syntax:]
 
diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt
index ec21b7a02e429436da14ea8baa3c33ad66b1d8b2..ccd540bf44a6e1f37e374cf4118f7a53655bbbd6 100644
--- a/doc/src/pairs.txt
+++ b/doc/src/pairs.txt
@@ -32,6 +32,7 @@ Pair Styles :h1
    pair_eff
    pair_eim
    pair_exp6_rx
+   pair_extep
    pair_gauss
    pair_gayberne
    pair_gran
diff --git a/examples/USER/misc/extep/BN.data b/examples/USER/misc/extep/BN.data
new file mode 100644
index 0000000000000000000000000000000000000000..3f51bdff6106035ac7f6c98c694e7c948d91ce56
--- /dev/null
+++ b/examples/USER/misc/extep/BN.data
@@ -0,0 +1,116 @@
+info: BN sample with r_BN=1.45
+
+100 atoms
+2 atom types
+
+0.0  21.75000000 xlo xhi
+0.0  12.55736835 ylo yhi
+0.0  50.00000000 zlo zhi
+
+Masses
+
+1 10.811
+2 14.0067
+
+Atoms
+
+  1 1  0.00000000   0.00000000   0.00000000
+  2 2  1.45000000   0.00000000   0.00000000
+  3 1  2.17500000   1.25573684   0.00000000
+  4 2  3.62500000   1.25573684   0.00000000
+  5 1  0.00000000   2.51147367   0.00000000
+  6 2  1.45000000   2.51147367   0.00000000
+  7 1  2.17500000   3.76721051   0.00000000
+  8 2  3.62500000   3.76721051   0.00000000
+  9 1  0.00000000   5.02294734   0.00000000
+ 10 2  1.45000000   5.02294734   0.00000000
+ 11 1  2.17500000   6.27868418   0.00000000
+ 12 2  3.62500000   6.27868418   0.00000000
+ 13 1  0.00000000   7.53442101   0.00000000
+ 14 2  1.45000000   7.53442101   0.00000000
+ 15 1  2.17500000   8.79015785   0.00000000
+ 16 2  3.62500000   8.79015785   0.00000000
+ 17 1  0.00000000  10.04589468   0.00000000
+ 18 2  1.45000000  10.04589468   0.00000000
+ 19 1  2.17500000  11.30163152   0.00000000
+ 20 2  3.62500000  11.30163152   0.00000000
+ 21 1  4.35000000   0.00000000   0.00000000
+ 22 2  5.80000000   0.00000000   0.00000000
+ 23 1  6.52500000   1.25573684   0.00000000
+ 24 2  7.97500000   1.25573684   0.00000000
+ 25 1  4.35000000   2.51147367   0.00000000
+ 26 2  5.80000000   2.51147367   0.00000000
+ 27 1  6.52500000   3.76721051   0.00000000
+ 28 2  7.97500000   3.76721051   0.00000000
+ 29 1  4.35000000   5.02294734   0.00000000
+ 30 2  5.80000000   5.02294734   0.00000000
+ 31 1  6.52500000   6.27868418   0.00000000
+ 32 2  7.97500000   6.27868418   0.00000000
+ 33 1  4.35000000   7.53442101   0.00000000
+ 34 2  5.80000000   7.53442101   0.00000000
+ 35 1  6.52500000   8.79015785   0.00000000
+ 36 2  7.97500000   8.79015785   0.00000000
+ 37 1  4.35000000  10.04589468   0.00000000
+ 38 2  5.80000000  10.04589468   0.00000000
+ 39 1  6.52500000  11.30163152   0.00000000
+ 40 2  7.97500000  11.30163152   0.00000000
+ 41 1  8.70000000   0.00000000   0.00000000
+ 42 2 10.15000000   0.00000000   0.00000000
+ 43 1 10.87500000   1.25573684   0.00000000
+ 44 2 12.32500000   1.25573684   0.00000000
+ 45 1  8.70000000   2.51147367   0.00000000
+ 46 2 10.15000000   2.51147367   0.00000000
+ 47 1 10.87500000   3.76721051   0.00000000
+ 48 2 12.32500000   3.76721051   0.00000000
+ 49 1  8.70000000   5.02294734   0.00000000
+ 50 2 10.15000000   5.02294734   0.00000000
+ 51 1 10.87500000   6.27868418   0.00000000
+ 52 2 12.32500000   6.27868418   0.00000000
+ 53 1  8.70000000   7.53442101   0.00000000
+ 54 2 10.15000000   7.53442101   0.00000000
+ 55 1 10.87500000   8.79015785   0.00000000
+ 56 2 12.32500000   8.79015785   0.00000000
+ 57 1  8.70000000  10.04589468   0.00000000
+ 58 2 10.15000000  10.04589468   0.00000000
+ 59 1 10.87500000  11.30163152   0.00000000
+ 60 2 12.32500000  11.30163152   0.00000000
+ 61 1 13.05000000   0.00000000   0.00000000
+ 62 2 14.50000000   0.00000000   0.00000000
+ 63 1 15.22500000   1.25573684   0.00000000
+ 64 2 16.67500000   1.25573684   0.00000000
+ 65 1 13.05000000   2.51147367   0.00000000
+ 66 2 14.50000000   2.51147367   0.00000000
+ 67 1 15.22500000   3.76721051   0.00000000
+ 68 2 16.67500000   3.76721051   0.00000000
+ 69 1 13.05000000   5.02294734   0.00000000
+ 70 2 14.50000000   5.02294734   0.00000000
+ 71 1 15.22500000   6.27868418   0.00000000
+ 72 2 16.67500000   6.27868418   0.00000000
+ 73 1 13.05000000   7.53442101   0.00000000
+ 74 2 14.50000000   7.53442101   0.00000000
+ 75 1 15.22500000   8.79015785   0.00000000
+ 76 2 16.67500000   8.79015785   0.00000000
+ 77 1 13.05000000  10.04589468   0.00000000
+ 78 2 14.50000000  10.04589468   0.00000000
+ 79 1 15.22500000  11.30163152   0.00000000
+ 80 2 16.67500000  11.30163152   0.00000000
+ 81 1 17.40000000   0.00000000   0.00000000
+ 82 2 18.85000000   0.00000000   0.00000000
+ 83 1 19.57500000   1.25573684   0.00000000
+ 84 2 21.02500000   1.25573684   0.00000000
+ 85 1 17.40000000   2.51147367   0.00000000
+ 86 2 18.85000000   2.51147367   0.00000000
+ 87 1 19.57500000   3.76721051   0.00000000
+ 88 2 21.02500000   3.76721051   0.00000000
+ 89 1 17.40000000   5.02294734   0.00000000
+ 90 2 18.85000000   5.02294734   0.00000000
+ 91 1 19.57500000   6.27868418   0.00000000
+ 92 2 21.02500000   6.27868418   0.00000000
+ 93 1 17.40000000   7.53442101   0.00000000
+ 94 2 18.85000000   7.53442101   0.00000000
+ 95 1 19.57500000   8.79015785   0.00000000
+ 96 2 21.02500000   8.79015785   0.00000000
+ 97 1 17.40000000  10.04589468   0.00000000
+ 98 2 18.85000000  10.04589468   0.00000000
+ 99 1 19.57500000  11.30163152   0.00000000
+100 2 21.02500000  11.30163152   0.00000000
diff --git a/examples/USER/misc/extep/in.extep-bn b/examples/USER/misc/extep/in.extep-bn
new file mode 100644
index 0000000000000000000000000000000000000000..bb7ed0ea281b1242c5b79f9aa2b36fafb8c6368d
--- /dev/null
+++ b/examples/USER/misc/extep/in.extep-bn
@@ -0,0 +1,29 @@
+# Initialization
+units           metal
+boundary        p p p
+atom_style      atomic
+processors      * * 1
+
+# System and atom definition
+read_data       BN.data     # read lammps data file
+
+# Neighbor update settings 
+neighbor        2.0 bin
+neigh_modify    every 1
+neigh_modify    delay 0
+neigh_modify    check yes
+
+# Potential
+pair_style      extep
+pair_coeff      * * ../../../../potentials/BN.extep B N
+
+# Output 
+thermo          10
+thermo_style    custom step time etotal pe temp lx ly lz pxx pyy pzz
+thermo_modify   line one format float %14.8g
+
+# Setup NPT MD run
+timestep        0.0001 # ps
+velocity        all create 300.0 12345
+fix             thermos all npt temp 300 300 1.0 x 0 0 1.0 y 0 0 1.0
+run 1000
diff --git a/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.1 b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.1
new file mode 100644
index 0000000000000000000000000000000000000000..392e5c4f0e38a061fde9e5cafce9db6463f5af74
--- /dev/null
+++ b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.1
@@ -0,0 +1,180 @@
+LAMMPS (23 Oct 2017)
+  using 1 OpenMP thread(s) per MPI task
+# Initialization
+units           metal
+boundary        p p p
+atom_style      atomic
+processors      * * 1
+
+# System and atom definition
+read_data       BN.data     # read lammps data file
+  orthogonal box = (0 0 0) to (21.75 12.5574 50)
+  1 by 1 by 1 MPI processor grid
+  reading atoms ...
+  100 atoms
+
+# Neighbor update settings
+neighbor        2.0 bin
+neigh_modify    every 1
+neigh_modify    delay 0
+neigh_modify    check yes
+
+# Potential
+pair_style      extep
+pair_coeff      * * ../../../../potentials/BN.extep B N
+Reading potential file ../../../../potentials/BN.extep with DATE: 2017-11-28
+
+# Output
+thermo          10
+thermo_style    custom step time etotal pe temp lx ly lz pxx pyy pzz
+thermo_modify   line one format float %14.8g
+
+# Setup NPT MD run
+timestep        0.0001 # ps
+velocity        all create 300.0 12345
+fix             thermos all npt temp 300 300 1.0 x 0 0 1.0 y 0 0 1.0
+run 1000
+Neighbor list info ...
+  update every 1 steps, delay 0 steps, check yes
+  max neighbors/atom: 2000, page size: 100000
+  master list distance cutoff = 4.2
+  ghost atom cutoff = 4.2
+  binsize = 2.1, bins = 11 6 24
+  1 neighbor lists, perpetual/occasional/extra = 1 0 0
+  (1) pair extep, perpetual
+      attributes: full, newton on, ghost
+      pair build: full/bin/ghost
+      stencil: full/ghost/bin/3d
+      bin: standard
+Per MPI rank memory allocation (min/avg/max) = 2.97 | 2.97 | 2.97 Mbytes
+Step Time TotEng PotEng Temp Lx Ly Lz Pxx Pyy Pzz 
+       0              0     -665.11189     -668.95092            300          21.75      12.557368             50     -1638.8315     -1636.7368      321.73163 
+      10          0.001     -665.11194     -668.81065      289.03491      21.749944      12.557333             50     -1391.3771     -1841.1723      316.66669 
+      20          0.002      -665.1121      -668.4273      259.06599      21.749789      12.557222             50     -1137.0171     -1980.5977      301.79466 
+      30          0.003     -665.11237     -667.90117      217.93027      21.749552      12.557029             50     -912.51949      -2055.822      278.00774 
+      40          0.004     -665.11278     -667.36471      175.97662       21.74925      12.556752             50     -755.38643     -2078.0669      246.62816 
+      50          0.005     -665.11333     -666.94254      142.94321      21.748894      12.556389             50     -694.93153     -2062.1349      209.26356 
+      60          0.006     -665.11405     -666.71476      125.08741      21.748487       12.55594             50      -744.6962     -2019.9093      167.70563 
+      70          0.007     -665.11494     -666.69555      123.51632      21.748026      12.555408             50     -898.67863     -1956.2845      123.88845 
+      80          0.008       -665.116     -666.83408      134.25892        21.7475      12.554796             50     -1132.5952      -1868.738       79.87581 
+      90          0.009      -665.1172     -667.03647      149.98053      21.746893      12.554106             50     -1409.6896     -1750.4875      37.821017 
+     100           0.01     -665.11853     -667.20002      162.65705      21.746185      12.553344             50     -1689.1599     -1595.9411    -0.14399002 
+     110          0.011     -665.11997     -667.24752      166.25742      21.745356      12.552516             50     -1934.6334     -1406.3665     -32.091026 
+     120          0.012     -665.12148     -667.15088      158.58671      21.744389       12.55163             50     -2120.4014     -1193.6117      -56.50543 
+     130          0.013     -665.12306     -666.93754       141.7922      21.743271      12.550694             50     -2234.0841     -980.32815      -72.45885 
+     140          0.014      -665.1247     -666.67903       121.4631      21.741993      12.549719             50     -2275.5656     -796.26701     -79.693692 
+     150          0.015      -665.1264     -666.46562      104.65306      21.740553       12.54871             50       -2253.08      -671.5409     -78.603431 
+     160          0.016      -665.1282     -666.37541      97.462619      21.738952      12.547674             50     -2178.0108     -628.83531     -70.130423 
+     170          0.017     -665.13011     -666.44775      102.96665      21.737195      12.546611             50     -2060.2073     -677.02227     -55.623931 
+     180          0.018     -665.13215     -666.67004      120.17784      21.735292       12.54552             50       -1905.36     -808.22824     -36.699042 
+     190          0.019     -665.13431     -666.98201      144.38814      21.733253      12.544396             50     -1715.2526      -999.2481     -15.117617 
+     200           0.02     -665.13656     -667.29591      168.74214      21.731091      12.543231             50     -1490.6934      -1216.735      7.3107732 
+     210          0.021     -665.13885     -667.52511      186.47391      21.728823      12.542015             50     -1235.9283     -1424.4324      28.822782 
+     220          0.022     -665.14112     -667.61153       193.0492      21.726467      12.540741             50     -962.70697     -1590.2885      47.801678 
+     230          0.023     -665.14332     -667.54317      187.53534      21.724043      12.539402             50     -692.12856     -1691.6537      62.881768 
+     240          0.024      -665.1454     -667.35665      172.79772       21.72157      12.537993             50     -453.02755     -1717.6064      73.041858 
+     250          0.025     -665.14735     -667.12424      154.48373      21.719064      12.536514             50     -276.81709     -1668.3598      77.670868 
+     260          0.026     -665.14918     -666.92939      139.11409      21.716539      12.534967             50     -190.03656     -1552.4049       76.59734 
+     270          0.027     -665.15091     -666.83859      131.88391         21.714      12.533357             50     -206.85537     -1382.4915      70.085105 
+     280          0.028     -665.15258     -666.87889      134.90214      21.711446       12.53169             50     -324.01795     -1171.7578      58.801327 
+     290          0.029     -665.15421     -667.02881      146.49028      21.708869      12.529975             50      -520.0146     -931.26466      43.758636 
+     300           0.03      -665.1558     -667.22646      161.81084      21.706255      12.528222             50     -758.87113     -669.74523      26.225956 
+     310          0.031     -665.15734     -667.39183      174.61368      21.703587      12.526442             50     -997.42782     -395.56111       7.601897 
+     320          0.032     -665.15878     -667.45546      179.47345      21.700849      12.524646             50     -1193.9402     -119.86797     -10.744258 
+     330          0.033     -665.16008     -667.38312      173.71901      21.698026      12.522846             50     -1315.6446       140.7451     -27.638433 
+     340          0.034     -665.16118     -667.18792      158.37888      21.695112      12.521051             50     -1343.5396      363.95099     -42.231049 
+     350          0.035     -665.16207     -666.92571      137.81938      21.692103      12.519271             50     -1273.6625      524.73453     -54.046178 
+     360          0.036     -665.16274     -666.67543      118.20885      21.689004      12.517514             50     -1115.1514      601.37143     -62.932702 
+     370          0.037      -665.1632      -666.5115      105.36258      21.685827      12.515781             50     -886.11568      582.42087     -68.942158 
+     380          0.038     -665.16348     -666.47849      102.76116      21.682589      12.514072             50     -608.71321      472.04732     -72.193259 
+     390          0.039      -665.1636     -666.57728      110.47178      21.679308      12.512382             50     -304.85697      291.41908     -72.787214 
+     400           0.04     -665.16356     -666.76741      125.33244      21.676006      12.510704             50      6.3732307      75.407852     -70.806087 
+     410          0.041     -665.16336     -666.98363      142.24457      21.672705       12.50903             50      309.23046     -134.40319     -66.378966 
+     420          0.042     -665.16298     -667.15939      156.00935      21.669426      12.507351             50      590.16982     -298.16702     -59.767469 
+     430          0.043     -665.16239     -667.24843      163.01313       21.66619       12.50566             50      836.19535     -385.22443     -51.420249 
+     440          0.044     -665.16157     -667.23746       162.2204      21.663014      12.503955             50       1033.943      -378.7816     -41.969885 
+     450          0.045      -665.1605     -667.14707      155.24066      21.659911      12.502234             50      1170.3399     -277.11556     -32.175503 
+     460          0.046     -665.15917      -667.0218      145.55489      21.656891      12.500503             50      1234.9026     -91.620499     -22.833423 
+     470          0.047     -665.15761     -666.91366      137.22578       21.65396      12.498768             50      1222.9519      157.31306     -14.680548 
+     480          0.048     -665.15585     -666.86462      133.53159      21.651114      12.497041             50      1138.5551       445.2926     -8.3071781 
+     490          0.049     -665.15393     -666.89359       135.9458       21.64835      12.495333             50      996.00682      748.51842     -4.0872169 
+     500           0.05     -665.15188     -666.99142      143.75058      21.645657      12.493655             50      819.08561      1046.9785     -2.1306918 
+     510          0.051     -665.14975     -667.12519      154.36991      21.643022       12.49202             50      637.99022      1325.7112     -2.2650822 
+     520          0.052     -665.14756        -667.25      164.29491      21.640432       12.49044             50      484.54509      1574.1916     -4.0528391 
+     530          0.053     -665.14531     -667.32459      170.29969      21.637878      12.488923             50      386.77357      1784.4858     -6.8479114 
+     540          0.054       -665.143     -667.32552      170.55254      21.635352       12.48748             50      364.14599      1949.2189     -9.8841824 
+     550          0.055     -665.14064     -667.25527      165.24765      21.632853      12.486117             50       424.6565      2060.4607      -12.37851 
+     560          0.056     -665.13822     -667.14127      156.52756      21.630385      12.484837             50       564.3912      2110.2547      -13.62742 
+     570          0.057     -665.13576      -667.0259      147.70502      21.627958      12.483643             50      769.54354      2092.8157     -13.082914 
+     580          0.058     -665.13327     -666.95107      142.05154      21.625586      12.482535             50      1020.1218      2007.6508     -10.405617 
+     590          0.059     -665.13079     -666.94279      141.59877      21.623287      12.481508             50      1294.1274      1862.3568     -5.5031153 
+     600           0.06     -665.12832     -667.00189      146.40928      21.621079      12.480557             50      1570.9478      1673.8456      1.4410957 
+     610          0.061     -665.12591     -667.10417      154.59072      21.618982      12.479674             50      1833.1388      1467.2639      9.9561573 
+     620          0.062     -665.12355     -667.20973      163.02368      21.617015      12.478851             50      2066.4951      1272.6732      19.310607 
+     630          0.063     -665.12128     -667.27744      168.49239      21.615193       12.47808             50      2259.0193      1120.2758       28.59477 
+     640          0.064     -665.11911     -667.27898       168.7823      21.613531      12.477355             50       2399.792      1035.3525        36.8539 
+     650          0.065     -665.11707     -667.20773      163.37438      21.612037      12.476673             50      2478.6675      1034.0481      43.239368 
+     660          0.066     -665.11518      -667.0802      153.55598      21.610718      12.476033             50      2487.2505      1120.8274      47.131883 
+     670          0.067     -665.11345     -666.93026      141.97434      21.609573      12.475439             50      2420.9786      1288.0136      48.201717 
+     680          0.068     -665.11191     -666.79864      131.80955      21.608598      12.474897             50      2281.6131      1517.4002      46.399066 
+     690          0.069     -665.11056     -666.72065      125.82027      21.607784      12.474418             50      2079.2055      1783.5346      41.895586 
+     700           0.07     -665.10941     -666.71578       125.5291      21.607116      12.474011             50      1832.7039      2057.9076      35.011051 
+     710          0.071     -665.10848     -666.78203      130.77932      21.606577      12.473687             50      1568.7275      2313.0601      26.153491 
+     720          0.072     -665.10776     -666.89681      139.80468      21.606148      12.473458             50      1318.5189      2525.6808      15.783637 
+     730          0.073     -665.10727      -667.0243      149.80574      21.605812       12.47333             50      1113.5537      2678.1859      4.3967762 
+     740          0.074     -665.10701     -667.12698      157.85016      21.605555      12.473311             50        980.633      2758.9123     -7.4930622 
+     750          0.075     -665.10697     -667.17729      161.78497      21.605368      12.473404             50      937.45086      2761.5936     -19.376492 
+     760          0.076     -665.10714      -667.1654      160.84249      21.605247      12.473609             50       989.5724      2684.9256     -30.776106 
+     770          0.077      -665.1075     -667.10061      155.75086      21.605196      12.473922             50      1129.4775      2532.7048     -41.263677 
+     780          0.078     -665.10803     -667.00654      148.35835      21.605226      12.474338             50      1337.8663      2314.4556     -50.455407 
+     790          0.079     -665.10869     -666.91242       140.9515      21.605349      12.474848             50      1586.9099      2045.9808     -57.988114 
+     800           0.08     -665.10946     -666.84375      135.52533      21.605585      12.475441             50      1844.7038      1749.1281     -63.495405 
+     810          0.081     -665.11032     -666.81538      133.24173       21.60595      12.476105             50      2079.9601      1450.3113      -66.60795 
+     820          0.082     -665.11127     -666.82877      134.21424      21.606461      12.476828             50      2266.0059      1177.7937     -66.990929 
+     830          0.083      -665.1123     -666.87353       137.6312      21.607131      12.477599             50      2383.4351      958.19752     -64.411861 
+     840          0.084     -665.11343     -666.93214      142.12323      21.607968      12.478409             50      2421.1969      812.91475     -58.816538 
+     850          0.085     -665.11467     -666.98597       146.2321      21.608975      12.479253             50      2376.3483      755.06052     -50.389393 
+     860          0.086     -665.11603     -667.02075      148.84448      21.610149      12.480128             50      2252.9811      787.43069     -39.585062 
+     870          0.087      -665.1175     -667.03045      149.48743      21.611481      12.481034             50       2060.884      901.76342     -27.129117 
+     880          0.088     -665.11907     -667.01838      148.42091      21.612958      12.481978             50      1814.3354      1079.4855     -13.988401 
+     890          0.089     -665.12073     -666.99552      146.50471      21.614562      12.482966             50      1531.1565      1293.9709      -1.305884 
+     900           0.09     -665.12247     -666.97639      144.87389      21.616275      12.484007             50      1231.9005      1514.0741      9.7083525 
+     910          0.091     -665.12426     -666.97371      144.52455      21.618074      12.485109             50      938.90089       1708.364      17.929974 
+     920          0.092     -665.12609     -666.99389      145.95889       21.61994      12.486281             50      674.90767      1849.2415      22.497207 
+     930          0.093     -665.12794     -667.03498      149.02559      21.621853      12.487528             50      461.18604      1916.1468      22.971745 
+     940          0.094     -665.12977     -667.08777      153.00718        21.6238      12.488852             50      315.19601      1897.3867       19.43758 
+     950          0.095     -665.13156     -667.13925       156.8903       21.62577      12.490254             50      248.20946      1790.5667      12.504818 
+     960          0.096     -665.13326     -667.17668      159.68273      21.627757      12.491728             50      263.35912      1601.9528      3.2123256 
+     970          0.097     -665.13485     -667.19079       160.6611      21.629764      12.493267             50      354.58496      1345.1489     -7.1487162 
+     980          0.098     -665.13628     -667.17758       159.5175      21.631796      12.494862             50       506.7626       1039.346     -17.249179 
+     990          0.099     -665.13753     -667.13942      156.43758      21.633864      12.496499             50      697.06054      707.26671      -25.92737 
+    1000            0.1     -665.13859      -667.0853      152.12472      21.635982      12.498164             50      897.38498      372.94791     -32.344697 
+Loop time of 0.463574 on 1 procs for 1000 steps with 100 atoms
+
+Performance: 18.638 ns/day, 1.288 hours/ns, 2157.152 timesteps/s
+99.0% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section |  min time  |  avg time  |  max time  |%varavg| %total
+---------------------------------------------------------------
+Pair    | 0.44776    | 0.44776    | 0.44776    |   0.0 | 96.59
+Neigh   | 0          | 0          | 0          |   0.0 |  0.00
+Comm    | 0.0023057  | 0.0023057  | 0.0023057  |   0.0 |  0.50
+Output  | 0.0015752  | 0.0015752  | 0.0015752  |   0.0 |  0.34
+Modify  | 0.010602   | 0.010602   | 0.010602   |   0.0 |  2.29
+Other   |            | 0.001331   |            |       |  0.29
+
+Nlocal:    100 ave 100 max 100 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost:    360 ave 360 max 360 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs:    0 ave 0 max 0 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+FullNghs:  1800 ave 1800 max 1800 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 1800
+Ave neighs/atom = 18
+Neighbor list builds = 0
+Dangerous builds = 0
+Total wall time: 0:00:00
diff --git a/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.4 b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.4
new file mode 100644
index 0000000000000000000000000000000000000000..c5c9236649e84972c774ac9772da0062e4b3059f
--- /dev/null
+++ b/examples/USER/misc/extep/log.23Oct17.extep-bn.g++.4
@@ -0,0 +1,180 @@
+LAMMPS (23 Oct 2017)
+  using 1 OpenMP thread(s) per MPI task
+# Initialization
+units           metal
+boundary        p p p
+atom_style      atomic
+processors      * * 1
+
+# System and atom definition
+read_data       BN.data     # read lammps data file
+  orthogonal box = (0 0 0) to (21.75 12.5574 50)
+  2 by 2 by 1 MPI processor grid
+  reading atoms ...
+  100 atoms
+
+# Neighbor update settings
+neighbor        2.0 bin
+neigh_modify    every 1
+neigh_modify    delay 0
+neigh_modify    check yes
+
+# Potential
+pair_style      extep
+pair_coeff      * * ../../../../potentials/BN.extep B N
+Reading potential file ../../../../potentials/BN.extep with DATE: 2017-11-28
+
+# Output
+thermo          10
+thermo_style    custom step time etotal pe temp lx ly lz pxx pyy pzz
+thermo_modify   line one format float %14.8g
+
+# Setup NPT MD run
+timestep        0.0001 # ps
+velocity        all create 300.0 12345
+fix             thermos all npt temp 300 300 1.0 x 0 0 1.0 y 0 0 1.0
+run 1000
+Neighbor list info ...
+  update every 1 steps, delay 0 steps, check yes
+  max neighbors/atom: 2000, page size: 100000
+  master list distance cutoff = 4.2
+  ghost atom cutoff = 4.2
+  binsize = 2.1, bins = 11 6 24
+  1 neighbor lists, perpetual/occasional/extra = 1 0 0
+  (1) pair extep, perpetual
+      attributes: full, newton on, ghost
+      pair build: full/bin/ghost
+      stencil: full/ghost/bin/3d
+      bin: standard
+Per MPI rank memory allocation (min/avg/max) = 2.943 | 2.943 | 2.943 Mbytes
+Step Time TotEng PotEng Temp Lx Ly Lz Pxx Pyy Pzz 
+       0              0     -665.11189     -668.95092            300          21.75      12.557368             50     -1638.8315     -1636.7368      321.73163 
+      10          0.001     -665.11194     -668.81065      289.03491      21.749944      12.557333             50     -1391.3771     -1841.1723      316.66669 
+      20          0.002      -665.1121      -668.4273      259.06599      21.749789      12.557222             50     -1137.0171     -1980.5977      301.79466 
+      30          0.003     -665.11237     -667.90117      217.93027      21.749552      12.557029             50     -912.51949      -2055.822      278.00774 
+      40          0.004     -665.11278     -667.36471      175.97662       21.74925      12.556752             50     -755.38643     -2078.0669      246.62816 
+      50          0.005     -665.11333     -666.94254      142.94321      21.748894      12.556389             50     -694.93153     -2062.1349      209.26356 
+      60          0.006     -665.11405     -666.71476      125.08741      21.748487       12.55594             50      -744.6962     -2019.9093      167.70563 
+      70          0.007     -665.11494     -666.69555      123.51632      21.748026      12.555408             50     -898.67863     -1956.2845      123.88845 
+      80          0.008       -665.116     -666.83408      134.25892        21.7475      12.554796             50     -1132.5952      -1868.738       79.87581 
+      90          0.009      -665.1172     -667.03647      149.98053      21.746893      12.554106             50     -1409.6896     -1750.4875      37.821017 
+     100           0.01     -665.11853     -667.20002      162.65705      21.746185      12.553344             50     -1689.1599     -1595.9411    -0.14399002 
+     110          0.011     -665.11997     -667.24752      166.25742      21.745356      12.552516             50     -1934.6334     -1406.3665     -32.091026 
+     120          0.012     -665.12148     -667.15088      158.58671      21.744389       12.55163             50     -2120.4014     -1193.6117      -56.50543 
+     130          0.013     -665.12306     -666.93754       141.7922      21.743271      12.550694             50     -2234.0841     -980.32815      -72.45885 
+     140          0.014      -665.1247     -666.67903       121.4631      21.741993      12.549719             50     -2275.5656     -796.26701     -79.693692 
+     150          0.015      -665.1264     -666.46562      104.65306      21.740553       12.54871             50       -2253.08      -671.5409     -78.603431 
+     160          0.016      -665.1282     -666.37541      97.462619      21.738952      12.547674             50     -2178.0108     -628.83531     -70.130423 
+     170          0.017     -665.13011     -666.44775      102.96665      21.737195      12.546611             50     -2060.2073     -677.02227     -55.623931 
+     180          0.018     -665.13215     -666.67004      120.17784      21.735292       12.54552             50       -1905.36     -808.22824     -36.699042 
+     190          0.019     -665.13431     -666.98201      144.38814      21.733253      12.544396             50     -1715.2526      -999.2481     -15.117617 
+     200           0.02     -665.13656     -667.29591      168.74214      21.731091      12.543231             50     -1490.6934      -1216.735      7.3107732 
+     210          0.021     -665.13885     -667.52511      186.47391      21.728823      12.542015             50     -1235.9283     -1424.4324      28.822782 
+     220          0.022     -665.14112     -667.61153       193.0492      21.726467      12.540741             50     -962.70697     -1590.2885      47.801678 
+     230          0.023     -665.14332     -667.54317      187.53534      21.724043      12.539402             50     -692.12856     -1691.6537      62.881768 
+     240          0.024      -665.1454     -667.35665      172.79772       21.72157      12.537993             50     -453.02755     -1717.6064      73.041858 
+     250          0.025     -665.14735     -667.12424      154.48373      21.719064      12.536514             50     -276.81709     -1668.3598      77.670868 
+     260          0.026     -665.14918     -666.92939      139.11409      21.716539      12.534967             50     -190.03656     -1552.4049       76.59734 
+     270          0.027     -665.15091     -666.83859      131.88391         21.714      12.533357             50     -206.85537     -1382.4915      70.085105 
+     280          0.028     -665.15258     -666.87889      134.90214      21.711446       12.53169             50     -324.01795     -1171.7578      58.801327 
+     290          0.029     -665.15421     -667.02881      146.49028      21.708869      12.529975             50      -520.0146     -931.26466      43.758636 
+     300           0.03      -665.1558     -667.22646      161.81084      21.706255      12.528222             50     -758.87113     -669.74523      26.225956 
+     310          0.031     -665.15734     -667.39183      174.61368      21.703587      12.526442             50     -997.42782     -395.56111       7.601897 
+     320          0.032     -665.15878     -667.45546      179.47345      21.700849      12.524646             50     -1193.9402     -119.86797     -10.744258 
+     330          0.033     -665.16008     -667.38312      173.71901      21.698026      12.522846             50     -1315.6446       140.7451     -27.638433 
+     340          0.034     -665.16118     -667.18792      158.37888      21.695112      12.521051             50     -1343.5396      363.95099     -42.231049 
+     350          0.035     -665.16207     -666.92571      137.81938      21.692103      12.519271             50     -1273.6625      524.73453     -54.046178 
+     360          0.036     -665.16274     -666.67543      118.20885      21.689004      12.517514             50     -1115.1514      601.37143     -62.932702 
+     370          0.037      -665.1632      -666.5115      105.36258      21.685827      12.515781             50     -886.11568      582.42087     -68.942158 
+     380          0.038     -665.16348     -666.47849      102.76116      21.682589      12.514072             50     -608.71321      472.04732     -72.193259 
+     390          0.039      -665.1636     -666.57728      110.47178      21.679308      12.512382             50     -304.85697      291.41908     -72.787214 
+     400           0.04     -665.16356     -666.76741      125.33244      21.676006      12.510704             50      6.3732307      75.407852     -70.806087 
+     410          0.041     -665.16336     -666.98363      142.24457      21.672705       12.50903             50      309.23046     -134.40319     -66.378966 
+     420          0.042     -665.16298     -667.15939      156.00935      21.669426      12.507351             50      590.16982     -298.16702     -59.767469 
+     430          0.043     -665.16239     -667.24843      163.01313       21.66619       12.50566             50      836.19535     -385.22443     -51.420249 
+     440          0.044     -665.16157     -667.23746       162.2204      21.663014      12.503955             50       1033.943      -378.7816     -41.969885 
+     450          0.045      -665.1605     -667.14707      155.24066      21.659911      12.502234             50      1170.3399     -277.11556     -32.175503 
+     460          0.046     -665.15917      -667.0218      145.55489      21.656891      12.500503             50      1234.9026     -91.620499     -22.833423 
+     470          0.047     -665.15761     -666.91366      137.22578       21.65396      12.498768             50      1222.9519      157.31306     -14.680548 
+     480          0.048     -665.15585     -666.86462      133.53159      21.651114      12.497041             50      1138.5551       445.2926     -8.3071781 
+     490          0.049     -665.15393     -666.89359       135.9458       21.64835      12.495333             50      996.00682      748.51842     -4.0872169 
+     500           0.05     -665.15188     -666.99142      143.75058      21.645657      12.493655             50      819.08561      1046.9785     -2.1306918 
+     510          0.051     -665.14975     -667.12519      154.36991      21.643022       12.49202             50      637.99022      1325.7112     -2.2650822 
+     520          0.052     -665.14756        -667.25      164.29491      21.640432       12.49044             50      484.54509      1574.1916     -4.0528391 
+     530          0.053     -665.14531     -667.32459      170.29969      21.637878      12.488923             50      386.77357      1784.4858     -6.8479114 
+     540          0.054       -665.143     -667.32552      170.55254      21.635352       12.48748             50      364.14599      1949.2189     -9.8841824 
+     550          0.055     -665.14064     -667.25527      165.24765      21.632853      12.486117             50       424.6565      2060.4607      -12.37851 
+     560          0.056     -665.13822     -667.14127      156.52756      21.630385      12.484837             50       564.3912      2110.2547      -13.62742 
+     570          0.057     -665.13576      -667.0259      147.70502      21.627958      12.483643             50      769.54354      2092.8157     -13.082914 
+     580          0.058     -665.13327     -666.95107      142.05154      21.625586      12.482535             50      1020.1218      2007.6508     -10.405617 
+     590          0.059     -665.13079     -666.94279      141.59877      21.623287      12.481508             50      1294.1274      1862.3568     -5.5031153 
+     600           0.06     -665.12832     -667.00189      146.40928      21.621079      12.480557             50      1570.9478      1673.8456      1.4410957 
+     610          0.061     -665.12591     -667.10417      154.59072      21.618982      12.479674             50      1833.1388      1467.2639      9.9561573 
+     620          0.062     -665.12355     -667.20973      163.02368      21.617015      12.478851             50      2066.4951      1272.6732      19.310607 
+     630          0.063     -665.12128     -667.27744      168.49239      21.615193       12.47808             50      2259.0193      1120.2758       28.59477 
+     640          0.064     -665.11911     -667.27898       168.7823      21.613531      12.477355             50       2399.792      1035.3525        36.8539 
+     650          0.065     -665.11707     -667.20773      163.37438      21.612037      12.476673             50      2478.6675      1034.0481      43.239368 
+     660          0.066     -665.11518      -667.0802      153.55598      21.610718      12.476033             50      2487.2505      1120.8274      47.131883 
+     670          0.067     -665.11345     -666.93026      141.97434      21.609573      12.475439             50      2420.9786      1288.0136      48.201717 
+     680          0.068     -665.11191     -666.79864      131.80955      21.608598      12.474897             50      2281.6131      1517.4002      46.399066 
+     690          0.069     -665.11056     -666.72065      125.82027      21.607784      12.474418             50      2079.2055      1783.5346      41.895586 
+     700           0.07     -665.10941     -666.71578       125.5291      21.607116      12.474011             50      1832.7039      2057.9076      35.011051 
+     710          0.071     -665.10848     -666.78203      130.77932      21.606577      12.473687             50      1568.7275      2313.0601      26.153491 
+     720          0.072     -665.10776     -666.89681      139.80468      21.606148      12.473458             50      1318.5189      2525.6808      15.783637 
+     730          0.073     -665.10727      -667.0243      149.80574      21.605812       12.47333             50      1113.5537      2678.1859      4.3967762 
+     740          0.074     -665.10701     -667.12698      157.85016      21.605555      12.473311             50        980.633      2758.9123     -7.4930622 
+     750          0.075     -665.10697     -667.17729      161.78497      21.605368      12.473404             50      937.45086      2761.5936     -19.376492 
+     760          0.076     -665.10714      -667.1654      160.84249      21.605247      12.473609             50       989.5724      2684.9256     -30.776106 
+     770          0.077      -665.1075     -667.10061      155.75086      21.605196      12.473922             50      1129.4775      2532.7048     -41.263677 
+     780          0.078     -665.10803     -667.00654      148.35835      21.605226      12.474338             50      1337.8663      2314.4556     -50.455407 
+     790          0.079     -665.10869     -666.91242       140.9515      21.605349      12.474848             50      1586.9099      2045.9808     -57.988114 
+     800           0.08     -665.10946     -666.84375      135.52533      21.605585      12.475441             50      1844.7038      1749.1281     -63.495405 
+     810          0.081     -665.11032     -666.81538      133.24173       21.60595      12.476105             50      2079.9601      1450.3113      -66.60795 
+     820          0.082     -665.11127     -666.82877      134.21424      21.606461      12.476828             50      2266.0059      1177.7937     -66.990929 
+     830          0.083      -665.1123     -666.87353       137.6312      21.607131      12.477599             50      2383.4351      958.19752     -64.411861 
+     840          0.084     -665.11343     -666.93214      142.12323      21.607968      12.478409             50      2421.1969      812.91475     -58.816538 
+     850          0.085     -665.11467     -666.98597       146.2321      21.608975      12.479253             50      2376.3483      755.06052     -50.389393 
+     860          0.086     -665.11603     -667.02075      148.84448      21.610149      12.480128             50      2252.9811      787.43069     -39.585062 
+     870          0.087      -665.1175     -667.03045      149.48743      21.611481      12.481034             50       2060.884      901.76342     -27.129117 
+     880          0.088     -665.11907     -667.01838      148.42091      21.612958      12.481978             50      1814.3354      1079.4855     -13.988401 
+     890          0.089     -665.12073     -666.99552      146.50471      21.614562      12.482966             50      1531.1565      1293.9709      -1.305884 
+     900           0.09     -665.12247     -666.97639      144.87389      21.616275      12.484007             50      1231.9005      1514.0741      9.7083525 
+     910          0.091     -665.12426     -666.97371      144.52455      21.618074      12.485109             50      938.90089       1708.364      17.929974 
+     920          0.092     -665.12609     -666.99389      145.95889       21.61994      12.486281             50      674.90767      1849.2415      22.497207 
+     930          0.093     -665.12794     -667.03498      149.02559      21.621853      12.487528             50      461.18604      1916.1468      22.971745 
+     940          0.094     -665.12977     -667.08777      153.00718        21.6238      12.488852             50      315.19601      1897.3867       19.43758 
+     950          0.095     -665.13156     -667.13925       156.8903       21.62577      12.490254             50      248.20946      1790.5667      12.504818 
+     960          0.096     -665.13326     -667.17668      159.68273      21.627757      12.491728             50      263.35912      1601.9528      3.2123256 
+     970          0.097     -665.13485     -667.19079       160.6611      21.629764      12.493267             50      354.58496      1345.1489     -7.1487162 
+     980          0.098     -665.13628     -667.17758       159.5175      21.631796      12.494862             50       506.7626       1039.346     -17.249179 
+     990          0.099     -665.13753     -667.13942      156.43758      21.633864      12.496499             50      697.06054      707.26671      -25.92737 
+    1000            0.1     -665.13859      -667.0853      152.12472      21.635982      12.498164             50      897.38498      372.94791     -32.344697 
+Loop time of 0.174508 on 4 procs for 1000 steps with 100 atoms
+
+Performance: 49.511 ns/day, 0.485 hours/ns, 5730.393 timesteps/s
+98.8% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section |  min time  |  avg time  |  max time  |%varavg| %total
+---------------------------------------------------------------
+Pair    | 0.12409    | 0.12834    | 0.13408    |   1.1 | 73.54
+Neigh   | 0          | 0          | 0          |   0.0 |  0.00
+Comm    | 0.016369   | 0.021358   | 0.025324   |   2.7 | 12.24
+Output  | 0.0023892  | 0.0025101  | 0.0028272  |   0.4 |  1.44
+Modify  | 0.01733    | 0.018302   | 0.018958   |   0.5 | 10.49
+Other   |            | 0.003995   |            |       |  2.29
+
+Nlocal:    25 ave 26 max 24 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+Nghost:    179 ave 180 max 178 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+Neighs:    0 ave 0 max 0 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+FullNghs:  450 ave 468 max 432 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+
+Total # of neighbors = 1800
+Ave neighs/atom = 18
+Neighbor list builds = 0
+Dangerous builds = 0
+Total wall time: 0:00:00
diff --git a/examples/gcmc/in.gcmc.co2 b/examples/gcmc/in.gcmc.co2
index d11ef72fddc80a732684b8eba32a14c3356c4f30..128f05b489885885fdb68c9953572d71e6d44f76 100644
--- a/examples/gcmc/in.gcmc.co2
+++ b/examples/gcmc/in.gcmc.co2
@@ -67,6 +67,15 @@ variable        tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans)
 fix             mygcmc all gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol &
                 co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt
 
+# atom counts
+
+variable 	carbon atom "type==1"
+variable        oxygen atom "type==2"
+group 		carbon dynamic all var carbon
+group 	        oxygen dynamic all var oxygen
+variable        nC equal count(carbon)
+variable        nO equal count(oxygen)
+
 # output
 
 variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
@@ -74,7 +83,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
 variable	racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
 compute_modify  thermo_temp dynamic/dof yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO
 thermo          1000
 
 # run
diff --git a/examples/gcmc/in.gcmc.h2o b/examples/gcmc/in.gcmc.h2o
index 7ffaafa9753b22e949efa55ecd482c9ffd2b6fdc..2c03b1ab78cc9dad8626ef76241e2dae1ab37955 100644
--- a/examples/gcmc/in.gcmc.h2o
+++ b/examples/gcmc/in.gcmc.h2o
@@ -72,6 +72,15 @@ variable        tfac equal 5.0/3.0 # (3 trans + 2 rot)/(3 trans)
 fix             mygcmc all gcmc 100 100 0 0 54341 ${temp} ${mu} ${disp} mol &
                 h2omol tfac_insert ${tfac} group h2o shake wshake
 
+# atom counts
+
+variable 	oxygen atom "type==1"
+variable 	hydrogen atom "type==2"
+group 	        oxygen dynamic all var oxygen
+group 		hydrogen dynamic all var hydrogen
+variable        nO equal count(oxygen)
+variable        nH equal count(hydrogen)
+
 # output
 
 variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
@@ -79,7 +88,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
 variable	racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
 compute_modify  thermo_temp dynamic/dof yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH
 thermo          1000
 
 # run
diff --git a/examples/gcmc/in.gcmc.lj b/examples/gcmc/in.gcmc.lj
index fc9afdb7f837d07984516421ff6e4bb8a5cef9ab..3fe78efb252d2274a03b812f0bd972db2666952c 100644
--- a/examples/gcmc/in.gcmc.lj
+++ b/examples/gcmc/in.gcmc.lj
@@ -33,6 +33,12 @@ mass		* 1.0
 
 fix             mygcmc all gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp}
 
+# atom count
+
+variable 	type1 atom "type==1"
+group 		type1 dynamic all var type1
+variable        n1 equal count(type1)
+
 # averaging
 
 variable	rho equal density
@@ -40,10 +46,11 @@ variable	p equal press
 variable	nugget equal 1.0e-8
 variable        lambda equal 1.0
 variable     	muex equal ${mu}-${temp}*ln(density*${lambda}+${nugget})
-fix 		ave all ave/time 10 100 1000 v_rho v_p v_muex ave one file rho_vs_p.dat
+fix 		ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat
 variable	rhoav equal f_ave[1]
 variable	pav equal f_ave[2]
 variable	muexav equal f_ave[3]
+variable	n1av equal f_ave[4]
 
 # output
 
@@ -51,7 +58,7 @@ variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+${nugget})
 variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+${nugget})
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget})
 compute_modify  thermo_temp dynamic yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av
 thermo          1000
 
 # run
diff --git a/examples/gcmc/log.6Jul17.gcmc.co2.g++.1 b/examples/gcmc/log.23Oct17.gcmc.co2.g++.1
similarity index 81%
rename from examples/gcmc/log.6Jul17.gcmc.co2.g++.1
rename to examples/gcmc/log.23Oct17.gcmc.co2.g++.1
index f9e494c43fdcd1ccd557a5366c0a6145daf69be1..e7b7c6afda0f28e4bb4b7c7dd5aaa5b86635d39d 100644
--- a/examples/gcmc/log.6Jul17.gcmc.co2.g++.1
+++ b/examples/gcmc/log.23Oct17.gcmc.co2.g++.1
@@ -1,4 +1,4 @@
-LAMMPS (6 Jul 2017)
+LAMMPS (23 Oct 2017)
   using 1 OpenMP thread(s) per MPI task
 # GCMC for CO2 molecular fluid, rigid/small/nvt dynamics
 # Rigid CO2 TraPPE model
@@ -46,6 +46,7 @@ Read molecule co2mol:
   0 impropers with 0 types
 create_atoms   	0 box mol co2mol 464563 units box
 Created 24 atoms
+  Time spent = 0.00196958 secs
 
 # rigid CO2 TraPPE model
 
@@ -87,6 +88,17 @@ fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 co2mol tfac_insert 1.66666666666667 group co2 rigid myrigidnvt
 
+# atom counts
+
+variable 	carbon atom "type==1"
+variable        oxygen atom "type==2"
+group 		carbon dynamic all var carbon
+dynamic group carbon defined
+group 	        oxygen dynamic all var oxygen
+dynamic group oxygen defined
+variable        nC equal count(carbon)
+variable        nO equal count(oxygen)
+
 # output
 
 variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
@@ -94,7 +106,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
 variable	racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
 compute_modify  thermo_temp dynamic/dof yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO
 thermo          1000
 
 # run
@@ -124,45 +136,45 @@ Neighbor list info ...
       stencil: half/bin/3d/newton
       bin: standard
 Per MPI rank memory allocation (min/avg/max) = 15.62 | 15.62 | 15.62 Mbytes
-Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc 
-       0    364.27579    4238.8631   -9.6809388    13.391989    0.5846359       24            0            0            0            0 
+Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO 
+       0    364.27579    4238.8631   -9.6809388    13.391989    0.5846359       24            0            0            0            0            8           16 
 WARNING: Using kspace solver on system with no charge (../kspace.cpp:289)
-    1000    420.43475    1722.4052   -9.6956123    15.456579    0.5846359       24   0.20879341   0.20713005            0            0 
-    2000    302.29516   -547.83641   -22.017674     14.11699   0.73079488       30    0.1742478    0.1678018            0            0 
-    3000     316.6934   -1080.2672   -8.2218891    10.069364   0.51155641       21   0.13544917   0.13720634            0            0 
-    4000    246.81618   -679.83642   -14.577244     10.29997   0.65771539       27    0.1568939   0.15860229            0            0 
-    5000    260.22849   -896.29914   -16.097593    10.859684   0.65771539       27   0.13138744   0.13547049            0            0 
-    6000    291.70796     -1521.99   -22.303136    13.622574   0.73079488       30   0.12615476   0.12717694            0            0 
-    7000    236.02638   -599.92186   -27.580831    13.367447   0.87695385       36     0.119703   0.12145398            0            0 
-    8000    321.45341    688.10577    -10.09204    11.817696    0.5846359       24   0.10917411   0.11032646            0            0 
-    9000    502.85382   -302.31056  -0.22330142   0.99927447  0.073079488        3    0.1254105   0.12905828            0            0 
-   10000    249.98239    -510.0091   -32.815145    15.399767   0.95003334       39    0.1274504   0.12875623            0            0 
-   11000    247.59424   -1129.0274   -25.320205    12.792544   0.80387436       33   0.11739076   0.11916784            0            0 
-   12000            0    -20.39554  -0.14872889           -0            0        0    0.1254933   0.12920375            0            0 
-   13000    1272.2738   -474.79484  -0.29450485    8.8489483   0.14615898        6   0.13767133   0.14112496            0            0 
-   14000    516.54246   -36.296516   -5.0012009    11.291243   0.36539744       15   0.15632744   0.15955377            0            0 
-   15000    307.09233    1951.9301   -14.820362    12.815375   0.65771539       27   0.15393544   0.15716192            0            0 
-   16000    198.31989   -559.48443   -30.459487    11.231925   0.87695385       36    0.1482565   0.15025652            0            0 
-   17000    246.99311    657.85683   -18.579206     11.53442   0.73079488       30   0.14143958   0.14375423            0            0 
-   18000    467.13468    167.03738   -1.0945268     5.569759   0.21923846        9   0.13847359   0.14098533            0            0 
-   19000    359.54027   -1413.5407   -12.156233    13.217895    0.5846359       24   0.15169146   0.15294205            0            0 
-   20000    227.79597   -1204.5652    -23.24144    10.637925   0.73079488       30   0.14917199   0.15022946            0            0 
-Loop time of 20.153 on 1 procs for 20000 steps with 30 atoms
-
-Performance: 85.744 ns/day, 0.280 hours/ns, 992.408 timesteps/s
-99.3% CPU use with 1 MPI tasks x 1 OpenMP threads
+    1000    420.43475    1722.4052   -9.6956123    15.456579    0.5846359       24   0.20879341   0.20713005            0            0            8           16 
+    2000    302.29516   -547.83641   -22.017674     14.11699   0.73079488       30    0.1742478    0.1678018            0            0           10           20 
+    3000     316.6934   -1080.2672   -8.2218891    10.069364   0.51155641       21   0.13544917   0.13720634            0            0            7           14 
+    4000    246.81618   -679.83642   -14.577244     10.29997   0.65771539       27    0.1568939   0.15860229            0            0            9           18 
+    5000    260.22849   -896.29914   -16.097593    10.859684   0.65771539       27   0.13138744   0.13547049            0            0            9           18 
+    6000    291.70796     -1521.99   -22.303136    13.622574   0.73079488       30   0.12615476   0.12717694            0            0           10           20 
+    7000    236.02638   -599.92186   -27.580831    13.367447   0.87695385       36     0.119703   0.12145398            0            0           12           24 
+    8000    321.45341    688.10577    -10.09204    11.817696    0.5846359       24   0.10917411   0.11032646            0            0            8           16 
+    9000    502.85382   -302.31056  -0.22330142   0.99927447  0.073079488        3    0.1254105   0.12905828            0            0            1            2 
+   10000    249.98239    -510.0091   -32.815145    15.399767   0.95003334       39    0.1274504   0.12875623            0            0           13           26 
+   11000    247.59424   -1129.0274   -25.320205    12.792544   0.80387436       33   0.11739076   0.11916784            0            0           11           22 
+   12000            0    -20.39554  -0.14872889           -0            0        0    0.1254933   0.12920375            0            0            0            0 
+   13000    1272.2738   -474.79484  -0.29450485    8.8489483   0.14615898        6   0.13767133   0.14112496            0            0            2            4 
+   14000    516.54246   -36.296516   -5.0012009    11.291243   0.36539744       15   0.15632744   0.15955377            0            0            5           10 
+   15000    307.09233    1951.9301   -14.820362    12.815375   0.65771539       27   0.15393544   0.15716192            0            0            9           18 
+   16000    198.31989   -559.48443   -30.459487    11.231925   0.87695385       36    0.1482565   0.15025652            0            0           12           24 
+   17000    246.99311    657.85683   -18.579206     11.53442   0.73079488       30   0.14143958   0.14375423            0            0           10           20 
+   18000    467.13468    167.03738   -1.0945268     5.569759   0.21923846        9   0.13847359   0.14098533            0            0            3            6 
+   19000    359.54027   -1413.5407   -12.156233    13.217895    0.5846359       24   0.15169146   0.15294205            0            0            8           16 
+   20000    227.79597   -1204.5652    -23.24144    10.637925   0.73079488       30   0.14917199   0.15022946            0            0           10           20 
+Loop time of 20.6928 on 1 procs for 20000 steps with 30 atoms
+
+Performance: 83.507 ns/day, 0.287 hours/ns, 966.519 timesteps/s
+99.2% CPU use with 1 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 2.5352     | 2.5352     | 2.5352     |   0.0 | 12.58
-Bond    | 0.026112   | 0.026112   | 0.026112   |   0.0 |  0.13
-Kspace  | 0.25       | 0.25       | 0.25       |   0.0 |  1.24
-Neigh   | 0.10364    | 0.10364    | 0.10364    |   0.0 |  0.51
-Comm    | 0.22907    | 0.22907    | 0.22907    |   0.0 |  1.14
-Output  | 0.0013065  | 0.0013065  | 0.0013065  |   0.0 |  0.01
-Modify  | 16.957     | 16.957     | 16.957     |   0.0 | 84.14
-Other   |            | 0.05061    |            |       |  0.25
+Pair    | 2.5462     | 2.5462     | 2.5462     |   0.0 | 12.30
+Bond    | 0.029783   | 0.029783   | 0.029783   |   0.0 |  0.14
+Kspace  | 0.26167    | 0.26167    | 0.26167    |   0.0 |  1.26
+Neigh   | 0.10705    | 0.10705    | 0.10705    |   0.0 |  0.52
+Comm    | 0.23409    | 0.23409    | 0.23409    |   0.0 |  1.13
+Output  | 0.0013416  | 0.0013416  | 0.0013416  |   0.0 |  0.01
+Modify  | 17.458     | 17.458     | 17.458     |   0.0 | 84.37
+Other   |            | 0.05433    |            |       |  0.26
 
 Nlocal:    30 ave 30 max 30 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
diff --git a/examples/gcmc/log.6Jul17.gcmc.co2.g++.4 b/examples/gcmc/log.23Oct17.gcmc.co2.g++.4
similarity index 81%
rename from examples/gcmc/log.6Jul17.gcmc.co2.g++.4
rename to examples/gcmc/log.23Oct17.gcmc.co2.g++.4
index 0df25430d26c07b98085c31a2ac162c90f5bd763..b344c7b0685eb0e19deb26e363e9cc43cd292f24 100644
--- a/examples/gcmc/log.6Jul17.gcmc.co2.g++.4
+++ b/examples/gcmc/log.23Oct17.gcmc.co2.g++.4
@@ -1,4 +1,4 @@
-LAMMPS (6 Jul 2017)
+LAMMPS (23 Oct 2017)
   using 1 OpenMP thread(s) per MPI task
 # GCMC for CO2 molecular fluid, rigid/small/nvt dynamics
 # Rigid CO2 TraPPE model
@@ -46,6 +46,7 @@ Read molecule co2mol:
   0 impropers with 0 types
 create_atoms   	0 box mol co2mol 464563 units box
 Created 24 atoms
+  Time spent = 0.00261331 secs
 
 # rigid CO2 TraPPE model
 
@@ -87,6 +88,17 @@ fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 co2mol tfac_insert ${tfac} group co2 rigid myrigidnvt
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 co2mol tfac_insert 1.66666666666667 group co2 rigid myrigidnvt
 
+# atom counts
+
+variable 	carbon atom "type==1"
+variable        oxygen atom "type==2"
+group 		carbon dynamic all var carbon
+dynamic group carbon defined
+group 	        oxygen dynamic all var oxygen
+dynamic group oxygen defined
+variable        nC equal count(carbon)
+variable        nO equal count(oxygen)
+
 # output
 
 variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
@@ -94,7 +106,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
 variable	racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
 compute_modify  thermo_temp dynamic/dof yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO
 thermo          1000
 
 # run
@@ -124,45 +136,45 @@ Neighbor list info ...
       stencil: half/bin/3d/newton
       bin: standard
 Per MPI rank memory allocation (min/avg/max) = 15.41 | 15.41 | 15.41 Mbytes
-Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc 
-       0    386.52184    23582.465   -3.2433417    14.209828    0.5846359       24            0            0            0            0 
+Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nC v_nO 
+       0    386.52184    23582.465   -3.2433417    14.209828    0.5846359       24            0            0            0            0            8           16 
 WARNING: Using kspace solver on system with no charge (../kspace.cpp:289)
-    1000    335.66829   -3.7743052   -4.6268612    7.3374649   0.36539744       15   0.20601899   0.20787963            0            0 
-    2000    459.73529    238.91592  -0.42937831    5.4815343   0.21923846        9   0.30392058   0.30105616            0            0 
-    3000    255.47773   -479.67802   -36.850434    15.738299   0.95003334       39   0.22220744    0.2197582            0            0 
-    4000    182.70803   -1059.2262   -43.044833    12.163134    1.0231128       42   0.16781689   0.16716177            0            0 
-    5000    234.00907   -1821.0444    -46.04795    15.578317    1.0231128       42   0.13498091   0.13704201            0            0 
-    6000    163.42759   -774.67294   -49.686261    11.691518    1.0961923       45   0.11401677   0.11296973            0            0 
-    7000    171.64616   -355.23516   -49.323434     12.27947    1.0961923       45  0.098302308  0.098552065            0            0 
-    8000    251.29791   -905.47863   -37.841209    15.480807   0.95003334       39  0.086856972   0.08638658            0            0 
-    9000    143.69498   -849.95393   -49.073188    10.279858    1.0961923       45  0.078261061  0.077955243            0            0 
-   10000    239.35727   -1158.1879   -43.562047    15.934355    1.0231128       42  0.070789792  0.070807529            0            0 
-   11000    169.51213   -1574.7885   -51.125228    12.126803    1.0961923       45  0.065008734   0.06498871            0            0 
-   12000    181.39739    160.11631   -46.850937    12.977068    1.0961923       45  0.059648717  0.059514803            0            0 
-   13000    164.14601   -1107.7629   -50.726722    11.742914    1.0961923       45  0.055207333  0.055097701            0            0 
-   14000    287.26285    418.51463   -41.664766    19.123497    1.0231128       42  0.051346789  0.051222285            0            0 
-   15000    256.94593   -532.36615   -41.651618    17.105257    1.0231128       42  0.047870301  0.047861685            0            0 
-   16000    166.92132    151.15933   -39.957018     11.11219    1.0231128       42  0.045205599  0.045042211            0            0 
-   17000    163.22452   -1299.8119   -42.677558    10.866089    1.0231128       42  0.043122086  0.042993687            0            0 
-   18000    158.01154    475.77329   -48.803162    11.304057    1.0961923       45  0.041016683  0.040647229            0            0 
-   19000    138.49297   -1585.1508   -47.517099    9.9077098    1.0961923       45  0.038929287  0.038436764            0            0 
-   20000    173.84439   -1362.6301   -53.002743    12.436731    1.0961923       45  0.036973919  0.036523816            0            0 
-Loop time of 31.8386 on 4 procs for 20000 steps with 45 atoms
-
-Performance: 54.274 ns/day, 0.442 hours/ns, 628.168 timesteps/s
-98.5% CPU use with 4 MPI tasks x 1 OpenMP threads
+    1000    335.66829   -3.7743052   -4.6268612    7.3374649   0.36539744       15   0.20601899   0.20787963            0            0            5           10 
+    2000    459.73529    238.91592  -0.42937831    5.4815343   0.21923846        9   0.30392058   0.30105616            0            0            3            6 
+    3000    255.47773   -479.67802   -36.850434    15.738299   0.95003334       39   0.22220744    0.2197582            0            0           13           26 
+    4000    182.70803   -1059.2262   -43.044833    12.163134    1.0231128       42   0.16781689   0.16716177            0            0           14           28 
+    5000    234.00907   -1821.0444    -46.04795    15.578317    1.0231128       42   0.13498091   0.13704201            0            0           14           28 
+    6000    163.42759   -774.67294   -49.686261    11.691518    1.0961923       45   0.11401677   0.11296973            0            0           15           30 
+    7000    171.64616   -355.23516   -49.323434     12.27947    1.0961923       45  0.098302308  0.098552065            0            0           15           30 
+    8000    251.29791   -905.47863   -37.841209    15.480807   0.95003334       39  0.086856972   0.08638658            0            0           13           26 
+    9000    143.69498   -849.95393   -49.073188    10.279858    1.0961923       45  0.078261061  0.077955243            0            0           15           30 
+   10000    239.35727   -1158.1879   -43.562047    15.934355    1.0231128       42  0.070789792  0.070807529            0            0           14           28 
+   11000    169.51213   -1574.7885   -51.125228    12.126803    1.0961923       45  0.065008734   0.06498871            0            0           15           30 
+   12000    181.39739    160.11631   -46.850937    12.977068    1.0961923       45  0.059648717  0.059514803            0            0           15           30 
+   13000    164.14601   -1107.7629   -50.726722    11.742914    1.0961923       45  0.055207333  0.055097701            0            0           15           30 
+   14000    287.26285    418.51463   -41.664766    19.123497    1.0231128       42  0.051346789  0.051222285            0            0           14           28 
+   15000    256.94593   -532.36615   -41.651618    17.105257    1.0231128       42  0.047870301  0.047861685            0            0           14           28 
+   16000    166.92132    151.15933   -39.957018     11.11219    1.0231128       42  0.045205599  0.045042211            0            0           14           28 
+   17000    163.22452   -1299.8119   -42.677558    10.866089    1.0231128       42  0.043122086  0.042993687            0            0           14           28 
+   18000    158.01154    475.77329   -48.803162    11.304057    1.0961923       45  0.041016683  0.040647229            0            0           15           30 
+   19000    138.49297   -1585.1508   -47.517099    9.9077098    1.0961923       45  0.038929287  0.038436764            0            0           15           30 
+   20000    173.84439   -1362.6301   -53.002743    12.436731    1.0961923       45  0.036973919  0.036523816            0            0           15           30 
+Loop time of 32.4481 on 4 procs for 20000 steps with 45 atoms
+
+Performance: 53.254 ns/day, 0.451 hours/ns, 616.369 timesteps/s
+98.4% CPU use with 4 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 1.1546     | 1.6687     | 2.1338     |  29.5 |  5.24
-Bond    | 0.019769   | 0.020369   | 0.02132    |   0.4 |  0.06
-Kspace  | 0.53392    | 0.99911    | 1.5116     |  37.8 |  3.14
-Neigh   | 0.06737    | 0.067842   | 0.068412   |   0.2 |  0.21
-Comm    | 1.9408     | 1.9582     | 1.9733     |   1.1 |  6.15
-Output  | 0.0019503  | 0.0020472  | 0.0022476  |   0.3 |  0.01
-Modify  | 26.974     | 26.99      | 27.001     |   0.2 | 84.77
-Other   |            | 0.1322     |            |       |  0.42
+Pair    | 1.1687     | 1.6702     | 2.1864     |  30.8 |  5.15
+Bond    | 0.018828   | 0.020035   | 0.020975   |   0.6 |  0.06
+Kspace  | 0.57506    | 1.0931     | 1.5898     |  37.7 |  3.37
+Neigh   | 0.068863   | 0.069524   | 0.070128   |   0.2 |  0.21
+Comm    | 2.0735     | 2.0865     | 2.0979     |   0.7 |  6.43
+Output  | 0.0025017  | 0.0025966  | 0.0027781  |   0.2 |  0.01
+Modify  | 27.335     | 27.344     | 27.363     |   0.2 | 84.27
+Other   |            | 0.1621     |            |       |  0.50
 
 Nlocal:    11.25 ave 14 max 8 min
 Histogram: 1 0 0 0 0 1 1 0 0 1
@@ -177,4 +189,4 @@ Ave special neighs/atom = 2
 Neighbor list builds = 20394
 Dangerous builds = 0
 
-Total wall time: 0:00:31
+Total wall time: 0:00:32
diff --git a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.1 b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.1
similarity index 77%
rename from examples/gcmc/log.6Jul17.gcmc.h2o.g++.1
rename to examples/gcmc/log.23Oct17.gcmc.h2o.g++.1
index 3b1606e65d6979747e5f22a920e516f691e052c2..bc7c3af4541e58dea45b6d917d2645a2fb64683c 100644
--- a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.1
+++ b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.1
@@ -1,4 +1,4 @@
-LAMMPS (6 Jul 2017)
+LAMMPS (23 Oct 2017)
   using 1 OpenMP thread(s) per MPI task
 # fix gcmc example with fix shake
 
@@ -51,6 +51,7 @@ Read molecule h2omol:
   0 impropers with 0 types
 create_atoms   	0 box mol h2omol 464563 units box
 Created 24 atoms
+  Time spent = 0.00201297 secs
 
 # rigid SPC/E water model
 
@@ -100,9 +101,9 @@ Per MPI rank memory allocation (min/avg/max) = 11.88 | 11.88 | 11.88 Mbytes
 Step Temp E_pair E_mol TotEng Press 
        0          338   -4.1890564 9.2628112e-06     18.98377    739.06991 
      100          338   -30.182886   0.85607237   -6.1539961   -2535.3207 
-Loop time of 0.0525794 on 1 procs for 100 steps with 24 atoms
+Loop time of 0.0507543 on 1 procs for 100 steps with 24 atoms
 
-99.4% CPU use with 1 MPI tasks x 1 OpenMP threads
+99.6% CPU use with 1 MPI tasks x 1 OpenMP threads
 
 Minimization stats:
   Stopping criterion = max iterations
@@ -116,14 +117,14 @@ Minimization stats:
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 0.044199   | 0.044199   | 0.044199   |   0.0 | 84.06
-Bond    | 0.00049019 | 0.00049019 | 0.00049019 |   0.0 |  0.93
-Kspace  | 0.0031631  | 0.0031631  | 0.0031631  |   0.0 |  6.02
-Neigh   | 0.00046444 | 0.00046444 | 0.00046444 |   0.0 |  0.88
-Comm    | 0.0034101  | 0.0034101  | 0.0034101  |   0.0 |  6.49
-Output  | 1.9073e-05 | 1.9073e-05 | 1.9073e-05 |   0.0 |  0.04
+Pair    | 0.042597   | 0.042597   | 0.042597   |   0.0 | 83.93
+Bond    | 0.00047708 | 0.00047708 | 0.00047708 |   0.0 |  0.94
+Kspace  | 0.0031135  | 0.0031135  | 0.0031135  |   0.0 |  6.13
+Neigh   | 0.00045919 | 0.00045919 | 0.00045919 |   0.0 |  0.90
+Comm    | 0.0032997  | 0.0032997  | 0.0032997  |   0.0 |  6.50
+Output  | 1.359e-05  | 1.359e-05  | 1.359e-05  |   0.0 |  0.03
 Modify  | 0          | 0          | 0          |   0.0 |  0.00
-Other   |            | 0.0008333  |            |       |  1.58
+Other   |            | 0.0007946  |            |       |  1.57
 
 Nlocal:    24 ave 24 max 24 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -164,22 +165,22 @@ Per MPI rank memory allocation (min/avg/max) = 11.63 | 11.63 | 11.63 Mbytes
 Step Temp E_pair E_mol TotEng Press 
        0    518.26667   -30.182886            0   -7.0100684     993.1985 
     1000     326.9865   -62.258445            0   -47.638175   -5.3440813 
-Loop time of 0.14263 on 1 procs for 1000 steps with 24 atoms
+Loop time of 0.141449 on 1 procs for 1000 steps with 24 atoms
 
-Performance: 605.764 ns/day, 0.040 hours/ns, 7011.155 timesteps/s
-99.5% CPU use with 1 MPI tasks x 1 OpenMP threads
+Performance: 610.819 ns/day, 0.039 hours/ns, 7069.663 timesteps/s
+99.7% CPU use with 1 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 0.10849    | 0.10849    | 0.10849    |   0.0 | 76.07
-Bond    | 0.00015426 | 0.00015426 | 0.00015426 |   0.0 |  0.11
-Kspace  | 0.01205    | 0.01205    | 0.01205    |   0.0 |  8.45
-Neigh   | 0.0046577  | 0.0046577  | 0.0046577  |   0.0 |  3.27
-Comm    | 0.011531   | 0.011531   | 0.011531   |   0.0 |  8.08
-Output  | 1.6212e-05 | 1.6212e-05 | 1.6212e-05 |   0.0 |  0.01
-Modify  | 0.0037699  | 0.0037699  | 0.0037699  |   0.0 |  2.64
-Other   |            | 0.001957   |            |       |  1.37
+Pair    | 0.10788    | 0.10788    | 0.10788    |   0.0 | 76.27
+Bond    | 0.00018954 | 0.00018954 | 0.00018954 |   0.0 |  0.13
+Kspace  | 0.011867   | 0.011867   | 0.011867   |   0.0 |  8.39
+Neigh   | 0.0045254  | 0.0045254  | 0.0045254  |   0.0 |  3.20
+Comm    | 0.011277   | 0.011277   | 0.011277   |   0.0 |  7.97
+Output  | 1.5497e-05 | 1.5497e-05 | 1.5497e-05 |   0.0 |  0.01
+Modify  | 0.00383    | 0.00383    | 0.00383    |   0.0 |  2.71
+Other   |            | 0.001868   |            |       |  1.32
 
 Nlocal:    24 ave 24 max 24 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -201,6 +202,17 @@ fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 h2omol tfac_insert ${tfac} group h2o shake wshake
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 h2omol tfac_insert 1.66666666666667 group h2o shake wshake
 
+# atom counts
+
+variable 	oxygen atom "type==1"
+variable 	hydrogen atom "type==2"
+group 	        oxygen dynamic all var oxygen
+dynamic group oxygen defined
+group 		hydrogen dynamic all var hydrogen
+dynamic group hydrogen defined
+variable        nO equal count(oxygen)
+variable        nH equal count(hydrogen)
+
 # output
 
 variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
@@ -208,7 +220,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
 variable	racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
 compute_modify  thermo_temp dynamic/dof yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH
 thermo          1000
 
 # run
@@ -226,44 +238,44 @@ WARNING: Fix gcmc using full_energy option (../fix_gcmc.cpp:445)
 0 atoms in group FixGCMC:rotation_gas_atoms:mygcmc
 WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (../neighbor.cpp:472)
 Per MPI rank memory allocation (min/avg/max) = 11.63 | 11.63 | 11.63 Mbytes
-Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc 
-    1000     326.9865   -4.3509713   -62.258445     14.62027   0.23910963       24            0            0            0            0 
-    2000    116.99793   -5344.1527   -286.61595    17.088682   0.74721761       75  0.048183096  0.013941446            0            0 
-    3000    106.86746   -3920.4926   -361.60598    18.794545   0.89666113       90  0.035637919  0.012768883            0            0 
-    4000    75.002668    540.46846    -414.8511    14.531966   0.98632724       99  0.025963651 0.0093451705            0            0 
-    5000    79.924788   -2131.1173   -437.21216    15.962121    1.0162159      102  0.019879728 0.0070418993            0            0 
-    6000    95.552773   -3647.0233   -438.24276    19.083253    1.0162159      102  0.015753613 0.0056885133            0            0 
-    7000    79.501736   -2071.5369   -440.77351    15.877631    1.0162159      102   0.01326216 0.0046915318            0            0 
-    8000    62.567091   -3102.9616   -442.21884    12.495541    1.0162159      102  0.011305503 0.0040437885            0            0 
-    9000    68.324047   -3812.7866   -440.46835    13.645287    1.0162159      102 0.0099549538 0.0035157329            0            0 
-   10000    83.857631   -2158.2659    -444.8183    16.747566    1.0162159      102 0.0088200922 0.0031354281            0            0 
-   11000    68.350984   -2084.0789   -440.14081    13.650667    1.0162159      102 0.0081331455 0.0030247424            0            0 
-   12000    76.867315   -1585.6723   -443.36199      15.3515    1.0162159      102 0.0073845932 0.0027532534            0            0 
-   13000     59.74266   -2211.0211   -446.07791    11.931462    1.0162159      102 0.0067756276 0.0025213898            0            0 
-   14000    81.154979    -907.0176   -441.53368    16.207808    1.0162159      102 0.0062527642 0.0023280719            0            0 
-   15000    66.814346   -2804.5134   -455.80704      13.7421    1.0461046      105 0.0059590528 0.0021576214            0            0 
-   16000     71.42983   -3930.4004   -458.43218    14.691394    1.0461046      105 0.0055547473 0.0020163729            0            0 
-   17000    89.624855   -3569.8136   -455.18164    18.433672    1.0461046      105 0.0052173265 0.0018867687            0            0 
-   18000    63.519962   -1882.8157   -456.58939    13.064525    1.0461046      105 0.0049082049 0.0017765986            0            0 
-   19000    71.872698   -2243.5046   -454.93359    14.782481    1.0461046      105 0.0046439115 0.0016748361            0            0 
-   20000    73.660765   -2285.3173   -476.35473    15.589381    1.0759934      108 0.0045124933 0.0015837653            0            0 
-   21000    95.675868    987.92089   -475.46736    20.248603    1.0759934      108  0.004285814 0.0015049513            0            0 
-Loop time of 226.155 on 1 procs for 20000 steps with 108 atoms
-
-Performance: 7.641 ns/day, 3.141 hours/ns, 88.435 timesteps/s
-99.2% CPU use with 1 MPI tasks x 1 OpenMP threads
+Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH 
+    1000     326.9865   -4.3509713   -62.258445     14.62027   0.23910963       24            0            0            0            0            8           16 
+    2000    116.99793   -5344.1527   -286.61595    17.088682   0.74721761       75  0.048183096  0.013941446            0            0           25           50 
+    3000    106.86746   -3920.4926   -361.60598    18.794545   0.89666113       90  0.035637919  0.012768883            0            0           30           60 
+    4000    75.002668    540.46846    -414.8511    14.531966   0.98632724       99  0.025963651 0.0093451705            0            0           33           66 
+    5000    79.924788   -2131.1173   -437.21216    15.962121    1.0162159      102  0.019879728 0.0070418993            0            0           34           68 
+    6000    95.552773   -3647.0233   -438.24276    19.083253    1.0162159      102  0.015753613 0.0056885133            0            0           34           68 
+    7000    79.501736   -2071.5369   -440.77351    15.877631    1.0162159      102   0.01326216 0.0046915318            0            0           34           68 
+    8000    62.567091   -3102.9616   -442.21884    12.495541    1.0162159      102  0.011305503 0.0040437885            0            0           34           68 
+    9000    68.324047   -3812.7866   -440.46835    13.645287    1.0162159      102 0.0099549538 0.0035157329            0            0           34           68 
+   10000    83.857631   -2158.2659    -444.8183    16.747566    1.0162159      102 0.0088200922 0.0031354281            0            0           34           68 
+   11000    68.350984   -2084.0789   -440.14081    13.650667    1.0162159      102 0.0081331455 0.0030247424            0            0           34           68 
+   12000    76.867315   -1585.6723   -443.36199      15.3515    1.0162159      102 0.0073845932 0.0027532534            0            0           34           68 
+   13000     59.74266   -2211.0211   -446.07791    11.931462    1.0162159      102 0.0067756276 0.0025213898            0            0           34           68 
+   14000    81.154979    -907.0176   -441.53368    16.207808    1.0162159      102 0.0062527642 0.0023280719            0            0           34           68 
+   15000    66.814346   -2804.5134   -455.80704      13.7421    1.0461046      105 0.0059590528 0.0021576214            0            0           35           70 
+   16000     71.42983   -3930.4004   -458.43218    14.691394    1.0461046      105 0.0055547473 0.0020163729            0            0           35           70 
+   17000    89.624855   -3569.8136   -455.18164    18.433672    1.0461046      105 0.0052173265 0.0018867687            0            0           35           70 
+   18000    63.519962   -1882.8157   -456.58939    13.064525    1.0461046      105 0.0049082049 0.0017765986            0            0           35           70 
+   19000    71.872698   -2243.5046   -454.93359    14.782481    1.0461046      105 0.0046439115 0.0016748361            0            0           35           70 
+   20000    73.660765   -2285.3173   -476.35473    15.589381    1.0759934      108 0.0045124933 0.0015837653            0            0           36           72 
+   21000    95.675868    987.92089   -475.46736    20.248603    1.0759934      108  0.004285814 0.0015049513            0            0           36           72 
+Loop time of 220.662 on 1 procs for 20000 steps with 108 atoms
+
+Performance: 7.831 ns/day, 3.065 hours/ns, 90.637 timesteps/s
+99.6% CPU use with 1 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 38.053     | 38.053     | 38.053     |   0.0 | 16.83
-Bond    | 0.089673   | 0.089673   | 0.089673   |   0.0 |  0.04
-Kspace  | 0.92778    | 0.92778    | 0.92778    |   0.0 |  0.41
-Neigh   | 1.2619     | 1.2619     | 1.2619     |   0.0 |  0.56
-Comm    | 0.97483    | 0.97483    | 0.97483    |   0.0 |  0.43
-Output  | 0.0013306  | 0.0013306  | 0.0013306  |   0.0 |  0.00
-Modify  | 184.68     | 184.68     | 184.68     |   0.0 | 81.66
-Other   |            | 0.171      |            |       |  0.08
+Pair    | 37.459     | 37.459     | 37.459     |   0.0 | 16.98
+Bond    | 0.087067   | 0.087067   | 0.087067   |   0.0 |  0.04
+Kspace  | 0.90234    | 0.90234    | 0.90234    |   0.0 |  0.41
+Neigh   | 1.2299     | 1.2299     | 1.2299     |   0.0 |  0.56
+Comm    | 0.95437    | 0.95437    | 0.95437    |   0.0 |  0.43
+Output  | 0.0010636  | 0.0010636  | 0.0010636  |   0.0 |  0.00
+Modify  | 179.85     | 179.85     | 179.85     |   0.0 | 81.51
+Other   |            | 0.1754     |            |       |  0.08
 
 Nlocal:    108 ave 108 max 108 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -278,4 +290,4 @@ Ave special neighs/atom = 2
 Neighbor list builds = 20439
 Dangerous builds = 0
 
-Total wall time: 0:03:46
+Total wall time: 0:03:40
diff --git a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.4 b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.4
similarity index 78%
rename from examples/gcmc/log.6Jul17.gcmc.h2o.g++.4
rename to examples/gcmc/log.23Oct17.gcmc.h2o.g++.4
index c04b25f45eaf88e4a82ca9edd8b79a0ec9ac934c..4eeab969ddc8c578baf028394c39064f2b57aace 100644
--- a/examples/gcmc/log.6Jul17.gcmc.h2o.g++.4
+++ b/examples/gcmc/log.23Oct17.gcmc.h2o.g++.4
@@ -1,4 +1,4 @@
-LAMMPS (6 Jul 2017)
+LAMMPS (23 Oct 2017)
   using 1 OpenMP thread(s) per MPI task
 # fix gcmc example with fix shake
 
@@ -51,6 +51,7 @@ Read molecule h2omol:
   0 impropers with 0 types
 create_atoms   	0 box mol h2omol 464563 units box
 Created 24 atoms
+  Time spent = 0.00174451 secs
 
 # rigid SPC/E water model
 
@@ -100,9 +101,9 @@ Per MPI rank memory allocation (min/avg/max) = 11.85 | 11.85 | 11.85 Mbytes
 Step Temp E_pair E_mol TotEng Press 
        0          338   -4.9610706 9.2628112e-06    18.211756    730.90791 
      100          338   -15.742442   0.14954269     7.579918   -637.49568 
-Loop time of 0.0828406 on 4 procs for 100 steps with 24 atoms
+Loop time of 0.0566185 on 4 procs for 100 steps with 24 atoms
 
-98.7% CPU use with 4 MPI tasks x 1 OpenMP threads
+98.8% CPU use with 4 MPI tasks x 1 OpenMP threads
 
 Minimization stats:
   Stopping criterion = max iterations
@@ -116,14 +117,14 @@ Minimization stats:
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 0.012844   | 0.025471   | 0.047008   |   8.1 | 30.75
-Bond    | 0.00038934 | 0.00046468 | 0.00054336 |   0.0 |  0.56
-Kspace  | 0.0061138  | 0.027556   | 0.04014    |   7.8 | 33.26
+Pair    | 0.0085177  | 0.016083   | 0.026787   |   5.3 | 28.41
+Bond    | 0.00022459 | 0.00031394 | 0.00037575 |   0.0 |  0.55
+Kspace  | 0.0049062  | 0.014122   | 0.02044    |   5.0 | 24.94
 Neigh   | 0          | 0          | 0          |   0.0 |  0.00
-Comm    | 0.023276   | 0.023636   | 0.023804   |   0.1 | 28.53
-Output  | 3.171e-05  | 3.3557e-05 | 3.8147e-05 |   0.0 |  0.04
+Comm    | 0.018515   | 0.02086    | 0.023246   |   1.2 | 36.84
+Output  | 2.4796e-05 | 2.6047e-05 | 2.9802e-05 |   0.0 |  0.05
 Modify  | 0          | 0          | 0          |   0.0 |  0.00
-Other   |            | 0.00568    |            |       |  6.86
+Other   |            | 0.005213   |            |       |  9.21
 
 Nlocal:    6 ave 8 max 3 min
 Histogram: 1 0 0 0 1 0 0 0 0 2
@@ -164,22 +165,22 @@ Per MPI rank memory allocation (min/avg/max) = 11.6 | 11.6 | 11.6 Mbytes
 Step Temp E_pair E_mol TotEng Press 
        0    518.26667   -15.742442            0    7.4303753    -613.0781 
     1000    369.81793   -54.202686            0   -37.667331    294.98823 
-Loop time of 0.199641 on 4 procs for 1000 steps with 24 atoms
+Loop time of 0.154891 on 4 procs for 1000 steps with 24 atoms
 
-Performance: 432.777 ns/day, 0.055 hours/ns, 5008.996 timesteps/s
-98.5% CPU use with 4 MPI tasks x 1 OpenMP threads
+Performance: 557.810 ns/day, 0.043 hours/ns, 6456.135 timesteps/s
+98.3% CPU use with 4 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 0.017161   | 0.034988   | 0.05833    |   8.0 | 17.53
-Bond    | 0.00017357 | 0.00021374 | 0.00027347 |   0.0 |  0.11
-Kspace  | 0.018025   | 0.044624   | 0.065613   |   8.4 | 22.35
-Neigh   | 0.0029755  | 0.0033154  | 0.0036366  |   0.6 |  1.66
-Comm    | 0.059933   | 0.06537    | 0.070709   |   1.5 | 32.74
-Output  | 3.4571e-05 | 3.6657e-05 | 4.22e-05   |   0.0 |  0.02
-Modify  | 0.043458   | 0.045628   | 0.04767    |   0.9 | 22.86
-Other   |            | 0.005465   |            |       |  2.74
+Pair    | 0.0154     | 0.028993   | 0.040525   |   5.5 | 18.72
+Bond    | 0.00016999 | 0.0001902  | 0.00023293 |   0.0 |  0.12
+Kspace  | 0.019093   | 0.028112   | 0.038976   |   4.3 | 18.15
+Neigh   | 0.0020263  | 0.0022184  | 0.002408   |   0.4 |  1.43
+Comm    | 0.04947    | 0.053627   | 0.058009   |   1.4 | 34.62
+Output  | 2.5749e-05 | 2.7537e-05 | 3.2187e-05 |   0.0 |  0.02
+Modify  | 0.035275   | 0.036815   | 0.038425   |   0.7 | 23.77
+Other   |            | 0.004909   |            |       |  3.17
 
 Nlocal:    6 ave 8 max 3 min
 Histogram: 1 0 0 0 0 0 1 0 1 1
@@ -201,6 +202,17 @@ fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 ${disp} mol
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 h2omol tfac_insert ${tfac} group h2o shake wshake
 fix             mygcmc all gcmc 100 100 0 0 54341 338.0 -8.1 0.5 mol                 h2omol tfac_insert 1.66666666666667 group h2o shake wshake
 
+# atom counts
+
+variable 	oxygen atom "type==1"
+variable 	hydrogen atom "type==2"
+group 	        oxygen dynamic all var oxygen
+dynamic group oxygen defined
+group 		hydrogen dynamic all var hydrogen
+dynamic group hydrogen defined
+variable        nO equal count(oxygen)
+variable        nH equal count(hydrogen)
+
 # output
 
 variable	tacc equal f_mygcmc[2]/(f_mygcmc[1]+0.1)
@@ -208,7 +220,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+0.1)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+0.1)
 variable	racc equal f_mygcmc[8]/(f_mygcmc[7]+0.1)
 compute_modify  thermo_temp dynamic/dof yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH
 thermo          1000
 
 # run
@@ -226,44 +238,44 @@ WARNING: Fix gcmc using full_energy option (../fix_gcmc.cpp:445)
 0 atoms in group FixGCMC:rotation_gas_atoms:mygcmc
 WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (../neighbor.cpp:472)
 Per MPI rank memory allocation (min/avg/max) = 11.6 | 11.6 | 11.6 Mbytes
-Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc 
-    1000    369.81793    295.32434   -54.202686    16.535355   0.23910963       24            0            0            0            0 
-    2000    84.544466   -2810.9047   -344.81664    14.364627   0.86677242       87  0.052198354 0.0099581757            0            0 
-    3000    75.188527    -3688.256   -425.02228    14.567977   0.98632724       99  0.030546787 0.0049111089            0            0 
-    4000    75.019396   -5669.3063   -427.69454    14.535207   0.98632724       99  0.019972039 0.0033375609            0            0 
-    5000    90.415371   -2141.7596   -434.65925    17.518218   0.98632724       99  0.014909796  0.002514964            0            0 
-    6000    78.212628   -943.75125   -428.80584    15.153904   0.98632724       99   0.01181521 0.0020316119            0            0 
-    7000    71.754139   -2028.5122    -435.2139    13.902555   0.98632724       99 0.0099466198 0.0016755471            0            0 
-    8000    84.446231   -1969.1657   -428.27313    16.361681   0.98632724       99 0.0084791272 0.0014442102            0            0 
-    9000    70.952348   -2476.9812   -446.33824    14.170197    1.0162159      102 0.0077150892 0.0012556189            0            0 
-   10000    71.418543   -1875.7083    -443.7214    14.263302    1.0162159      102 0.0068355714 0.0011197957            0            0 
-   11000    86.094994   -4508.7581   -444.82687    17.194399    1.0162159      102 0.0061494515 0.0010082475            0            0 
-   12000    81.906091   -1547.8105   -442.36719    16.357815    1.0162159      102 0.0055834729 0.00091775114            0            0 
-   13000    57.221548   -4607.6222   -448.30939     11.42796    1.0162159      102 0.0051230355 0.00084046326            0            0 
-   14000    61.288344   -2518.1779   -445.70636    12.240157    1.0162159      102 0.0047276997 0.00077602396            0            0 
-   15000    85.787669   -2407.7111    -443.3834    17.133022    1.0162159      102 0.0043983485 0.00071920715            0            0 
-   16000    74.845939   -3288.3403    -445.8247    14.947802    1.0162159      102 0.0042321884 0.00080654918            0            0 
-   17000    73.835431   -1926.9566   -445.67476    14.745989    1.0162159      102 0.0039751059 0.00075470749            0            0 
-   18000    72.634985    -3997.552    -447.2351    14.506243    1.0162159      102 0.0037395847 0.00071063946            0            0 
-   19000    96.776472   -714.44132   -453.65552    19.904587    1.0461046      105 0.0036487876 0.00066993446            0            0 
-   20000    75.470786    183.16972   -464.04688    15.522521    1.0461046      105 0.0034630763 0.00063350614            0            0 
-   21000    65.658309   -773.41266   -466.27068    13.504331    1.0461046      105  0.003289113 0.00060198052            0            0 
-Loop time of 93.8859 on 4 procs for 20000 steps with 105 atoms
-
-Performance: 18.405 ns/day, 1.304 hours/ns, 213.024 timesteps/s
+Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_racc v_nO v_nH 
+    1000    369.81793    295.32434   -54.202686    16.535355   0.23910963       24            0            0            0            0            8           16 
+    2000    84.544466   -2810.9047   -344.81664    14.364627   0.86677242       87  0.052198354 0.0099581757            0            0           29           58 
+    3000    75.188527    -3688.256   -425.02228    14.567977   0.98632724       99  0.030546787 0.0049111089            0            0           33           66 
+    4000    75.019396   -5669.3063   -427.69454    14.535207   0.98632724       99  0.019972039 0.0033375609            0            0           33           66 
+    5000    90.415371   -2141.7596   -434.65925    17.518218   0.98632724       99  0.014909796  0.002514964            0            0           33           66 
+    6000    78.212628   -943.75125   -428.80584    15.153904   0.98632724       99   0.01181521 0.0020316119            0            0           33           66 
+    7000    71.754139   -2028.5122    -435.2139    13.902555   0.98632724       99 0.0099466198 0.0016755471            0            0           33           66 
+    8000    84.446231   -1969.1657   -428.27313    16.361681   0.98632724       99 0.0084791272 0.0014442102            0            0           33           66 
+    9000    70.952348   -2476.9812   -446.33824    14.170197    1.0162159      102 0.0077150892 0.0012556189            0            0           34           68 
+   10000    71.418543   -1875.7083    -443.7214    14.263302    1.0162159      102 0.0068355714 0.0011197957            0            0           34           68 
+   11000    86.094994   -4508.7581   -444.82687    17.194399    1.0162159      102 0.0061494515 0.0010082475            0            0           34           68 
+   12000    81.906091   -1547.8105   -442.36719    16.357815    1.0162159      102 0.0055834729 0.00091775114            0            0           34           68 
+   13000    57.221548   -4607.6222   -448.30939     11.42796    1.0162159      102 0.0051230355 0.00084046326            0            0           34           68 
+   14000    61.288344   -2518.1779   -445.70636    12.240157    1.0162159      102 0.0047276997 0.00077602396            0            0           34           68 
+   15000    85.787669   -2407.7111    -443.3834    17.133022    1.0162159      102 0.0043983485 0.00071920715            0            0           34           68 
+   16000    74.845939   -3288.3403    -445.8247    14.947802    1.0162159      102 0.0042321884 0.00080654918            0            0           34           68 
+   17000    73.835431   -1926.9566   -445.67476    14.745989    1.0162159      102 0.0039751059 0.00075470749            0            0           34           68 
+   18000    72.634985    -3997.552    -447.2351    14.506243    1.0162159      102 0.0037395847 0.00071063946            0            0           34           68 
+   19000    96.776472   -714.44132   -453.65552    19.904587    1.0461046      105 0.0036487876 0.00066993446            0            0           35           70 
+   20000    75.470786    183.16972   -464.04688    15.522521    1.0461046      105 0.0034630763 0.00063350614            0            0           35           70 
+   21000    65.658309   -773.41266   -466.27068    13.504331    1.0461046      105  0.003289113 0.00060198052            0            0           35           70 
+Loop time of 84.4085 on 4 procs for 20000 steps with 105 atoms
+
+Performance: 20.472 ns/day, 1.172 hours/ns, 236.943 timesteps/s
 98.8% CPU use with 4 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 6.7882     | 10.264     | 14.758     |  93.2 | 10.93
-Bond    | 0.028286   | 0.034218   | 0.039038   |   2.5 |  0.04
-Kspace  | 0.57255    | 5.2227     | 8.8493     | 133.8 |  5.56
-Neigh   | 0.3635     | 0.36915    | 0.37473    |   0.9 |  0.39
-Comm    | 2.9961     | 3.2542     | 3.509      |  11.4 |  3.47
-Output  | 0.0011675  | 0.0012342  | 0.001375   |   0.2 |  0.00
-Modify  | 74.428     | 74.499     | 74.571     |   0.7 | 79.35
-Other   |            | 0.2411     |            |       |  0.26
+Pair    | 6.3571     | 9.7574     | 13.984     |  90.7 | 11.56
+Bond    | 0.026374   | 0.031321   | 0.035482   |   2.1 |  0.04
+Kspace  | 0.57402    | 4.7894     | 8.1754     | 129.0 |  5.67
+Neigh   | 0.34952    | 0.34987    | 0.35021    |   0.1 |  0.41
+Comm    | 2.4028     | 2.4228     | 2.4372     |   0.9 |  2.87
+Output  | 0.0012269  | 0.0012826  | 0.0014355  |   0.2 |  0.00
+Modify  | 66.819     | 66.828     | 66.837     |   0.1 | 79.17
+Other   |            | 0.2281     |            |       |  0.27
 
 Nlocal:    26.25 ave 31 max 22 min
 Histogram: 1 0 1 0 0 0 1 0 0 1
@@ -278,4 +290,4 @@ Ave special neighs/atom = 2
 Neighbor list builds = 20428
 Dangerous builds = 0
 
-Total wall time: 0:01:34
+Total wall time: 0:01:24
diff --git a/examples/gcmc/log.6Jul17.gcmc.lj.g++.1 b/examples/gcmc/log.23Oct17.gcmc.lj.g++.1
similarity index 76%
rename from examples/gcmc/log.6Jul17.gcmc.lj.g++.1
rename to examples/gcmc/log.23Oct17.gcmc.lj.g++.1
index 69fc2ede1cd28681f7b139e8bb2b1a4976d6df89..a38dfeee77897b740bfecfaedd046676a6ad56b3 100644
--- a/examples/gcmc/log.6Jul17.gcmc.lj.g++.1
+++ b/examples/gcmc/log.23Oct17.gcmc.lj.g++.1
@@ -1,4 +1,4 @@
-LAMMPS (6 Jul 2017)
+LAMMPS (23 Oct 2017)
   using 1 OpenMP thread(s) per MPI task
 # GCMC for LJ simple fluid, no dynamics
 # T = 2.0
@@ -43,6 +43,13 @@ fix             mygcmc all gcmc 1 100 100 1 29494 2.0 ${mu} ${disp}
 fix             mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 ${disp}
 fix             mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 1.0
 
+# atom count
+
+variable 	type1 atom "type==1"
+group 		type1 dynamic all var type1
+dynamic group type1 defined
+variable        n1 equal count(type1)
+
 # averaging
 
 variable	rho equal density
@@ -54,10 +61,11 @@ variable     	muex equal -1.25-${temp}*ln(density*${lambda}+${nugget})
 variable     	muex equal -1.25-2.0*ln(density*${lambda}+${nugget})
 variable     	muex equal -1.25-2.0*ln(density*1+${nugget})
 variable     	muex equal -1.25-2.0*ln(density*1+1e-08)
-fix 		ave all ave/time 10 100 1000 v_rho v_p v_muex ave one file rho_vs_p.dat
+fix 		ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat
 variable	rhoav equal f_ave[1]
 variable	pav equal f_ave[2]
 variable	muexav equal f_ave[3]
+variable	n1av equal f_ave[4]
 
 # output
 
@@ -68,7 +76,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+1e-08)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget})
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+1e-08)
 compute_modify  thermo_temp dynamic yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av
 thermo          1000
 
 # run
@@ -87,32 +95,32 @@ Neighbor list info ...
       stencil: half/bin/3d/newton
       bin: standard
 Per MPI rank memory allocation (min/avg/max) = 0.433 | 0.433 | 0.433 Mbytes
-Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav 
-       0            0            0            0           -0            0        0            0            0            0            0            0            0 
-    1000    2.4038954    2.1735585   -2.7041368    3.5476844        0.496       62  0.064790036   0.06313096    0.1081294      0.54304    1.4513524 -0.025479219 
-    2000    2.0461168    1.1913842   -2.9880181    3.0212194        0.512       64  0.067416408  0.066335853   0.11306166      0.52736    1.3274665  0.034690004 
-    3000    1.7930436    1.3788681   -3.2212667    2.6505861        0.552       69  0.067733191  0.066877836    0.1133516       0.5344    1.3834744 0.0070582537 
-    4000     1.981449    1.2541054   -2.8222868    2.9217977        0.472       59  0.068546991  0.067856412   0.11442807      0.52504    1.3815629  0.043309657 
-    5000    2.0946818    1.0701629   -3.5213291    3.0977688        0.568       71   0.06813743  0.067567891   0.11342906      0.53824    1.4049567 -0.0054539777 
-    6000    1.9793484   0.68224187    -3.410211    2.9247088        0.536       67  0.067797628  0.067420108   0.11295333       0.5384     1.401683 -0.0066894359 
-    7000    2.1885798    1.6745012    -3.185499    3.2345922        0.544       68  0.068630201  0.068261832   0.11403705       0.5244     1.449239  0.045987399 
-    8000    2.2175324    1.5897263    -3.078898    3.2759002        0.528       66  0.068180395  0.067899629   0.11332691      0.53928    1.5488388  -0.01075766 
-    9000    1.8610779    1.0396231    -2.923262    2.7465908        0.496       62  0.068346453  0.068028117    0.1134132      0.52912    1.4352871  0.027082544 
-   10000    2.1079271    1.1746643   -2.9112062    3.1091925         0.48       60  0.068352878  0.068054948   0.11335434       0.5316    1.4462327  0.018503094 
-Loop time of 20.6892 on 1 procs for 10000 steps with 60 atoms
-
-Performance: 208804.611 tau/day, 483.344 timesteps/s
-99.4% CPU use with 1 MPI tasks x 1 OpenMP threads
+Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av 
+       0            0            0            0           -0            0        0            0            0            0            0            0            0            0 
+    1000    2.4038954    2.1735585   -2.7041368    3.5476844        0.496       62  0.064790036   0.06313096    0.1081294      0.54304    1.4513524 -0.025479219        64.98 
+    2000    2.0461168    1.1913842   -2.9880181    3.0212194        0.512       64  0.067416408  0.066335853   0.11306166      0.52736    1.3274665  0.034690004        62.97 
+    3000    1.7930436    1.3788681   -3.2212667    2.6505861        0.552       69  0.067733191  0.066877836    0.1133516       0.5344    1.3834744 0.0070582537         63.5 
+    4000     1.981449    1.2541054   -2.8222868    2.9217977        0.472       59  0.068546991  0.067856412   0.11442807      0.52504    1.3815629  0.043309657        62.17 
+    5000    2.0946818    1.0701629   -3.5213291    3.0977688        0.568       71   0.06813743  0.067567891   0.11342906      0.53824    1.4049567 -0.0054539777        64.15 
+    6000    1.9793484   0.68224187    -3.410211    2.9247088        0.536       67  0.067797628  0.067420108   0.11295333       0.5384     1.401683 -0.0066894359        64.37 
+    7000    2.1885798    1.6745012    -3.185499    3.2345922        0.544       68  0.068630201  0.068261832   0.11403705       0.5244     1.449239  0.045987399        62.33 
+    8000    2.2175324    1.5897263    -3.078898    3.2759002        0.528       66  0.068180395  0.067899629   0.11332691      0.53928    1.5488388  -0.01075766        64.29 
+    9000    1.8610779    1.0396231    -2.923262    2.7465908        0.496       62  0.068346453  0.068028117    0.1134132      0.52912    1.4352871  0.027082544        62.87 
+   10000    2.1079271    1.1746643   -2.9112062    3.1091925         0.48       60  0.068352878  0.068054948   0.11335434       0.5316    1.4462327  0.018503094         63.2 
+Loop time of 20.4081 on 1 procs for 10000 steps with 60 atoms
+
+Performance: 211680.375 tau/day, 490.001 timesteps/s
+98.9% CPU use with 1 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 0.47227    | 0.47227    | 0.47227    |   0.0 |  2.28
-Neigh   | 1.1729     | 1.1729     | 1.1729     |   0.0 |  5.67
-Comm    | 0.17133    | 0.17133    | 0.17133    |   0.0 |  0.83
-Output  | 0.00028253 | 0.00028253 | 0.00028253 |   0.0 |  0.00
-Modify  | 18.852     | 18.852     | 18.852     |   0.0 | 91.12
-Other   |            | 0.02063    |            |       |  0.10
+Pair    | 0.46484    | 0.46484    | 0.46484    |   0.0 |  2.28
+Neigh   | 1.1447     | 1.1447     | 1.1447     |   0.0 |  5.61
+Comm    | 0.1696     | 0.1696     | 0.1696     |   0.0 |  0.83
+Output  | 0.000319   | 0.000319   | 0.000319   |   0.0 |  0.00
+Modify  | 18.607     | 18.607     | 18.607     |   0.0 | 91.17
+Other   |            | 0.02194    |            |       |  0.11
 
 Nlocal:    60 ave 60 max 60 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
diff --git a/examples/gcmc/log.6Jul17.gcmc.lj.g++.4 b/examples/gcmc/log.23Oct17.gcmc.lj.g++.4
similarity index 76%
rename from examples/gcmc/log.6Jul17.gcmc.lj.g++.4
rename to examples/gcmc/log.23Oct17.gcmc.lj.g++.4
index 6bd3b3189cfeda01ff29feefff5d861c8d32b888..ea7dc8116febce3c356ca8782599656cf6250986 100644
--- a/examples/gcmc/log.6Jul17.gcmc.lj.g++.4
+++ b/examples/gcmc/log.23Oct17.gcmc.lj.g++.4
@@ -1,4 +1,4 @@
-LAMMPS (6 Jul 2017)
+LAMMPS (23 Oct 2017)
   using 1 OpenMP thread(s) per MPI task
 # GCMC for LJ simple fluid, no dynamics
 # T = 2.0
@@ -43,6 +43,13 @@ fix             mygcmc all gcmc 1 100 100 1 29494 2.0 ${mu} ${disp}
 fix             mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 ${disp}
 fix             mygcmc all gcmc 1 100 100 1 29494 2.0 -1.25 1.0
 
+# atom count
+
+variable 	type1 atom "type==1"
+group 		type1 dynamic all var type1
+dynamic group type1 defined
+variable        n1 equal count(type1)
+
 # averaging
 
 variable	rho equal density
@@ -54,10 +61,11 @@ variable     	muex equal -1.25-${temp}*ln(density*${lambda}+${nugget})
 variable     	muex equal -1.25-2.0*ln(density*${lambda}+${nugget})
 variable     	muex equal -1.25-2.0*ln(density*1+${nugget})
 variable     	muex equal -1.25-2.0*ln(density*1+1e-08)
-fix 		ave all ave/time 10 100 1000 v_rho v_p v_muex ave one file rho_vs_p.dat
+fix 		ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat
 variable	rhoav equal f_ave[1]
 variable	pav equal f_ave[2]
 variable	muexav equal f_ave[3]
+variable	n1av equal f_ave[4]
 
 # output
 
@@ -68,7 +76,7 @@ variable	iacc equal f_mygcmc[4]/(f_mygcmc[3]+1e-08)
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget})
 variable	dacc equal f_mygcmc[6]/(f_mygcmc[5]+1e-08)
 compute_modify  thermo_temp dynamic yes
-thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav
+thermo_style    custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av
 thermo          1000
 
 # run
@@ -87,32 +95,32 @@ Neighbor list info ...
       stencil: half/bin/3d/newton
       bin: standard
 Per MPI rank memory allocation (min/avg/max) = 0.4477 | 0.4477 | 0.4477 Mbytes
-Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav 
-       0            0            0            0           -0            0        0            0            0            0            0            0            0 
-    1000     1.956397    1.7699101   -2.7889468    2.8864874        0.488       61  0.068894746  0.067229075    0.1141726      0.53288    1.3832798  0.013392866 
-    2000     2.040943   0.56060899   -2.8001647    3.0077055        0.456       57  0.069858594  0.068831934   0.11629114       0.5232    1.3587174  0.049995794 
-    3000    2.0004866    1.5736515   -3.3098044    2.9572411        0.552       69  0.069594029  0.068727791   0.11592543      0.53096    1.4129434  0.020022578 
-    4000    2.1127942     2.642809   -2.8865084    3.1211733        0.528       66  0.070268697  0.069533235   0.11693806      0.52424    1.3444615  0.046884078 
-    5000    2.3663648     1.354269   -3.1917346    3.4957662        0.528       66  0.070519633  0.069960064   0.11710321      0.52688    1.3595814  0.036270867 
-    6000    1.9224136   0.82756699      -3.1965     2.839257         0.52       65   0.06985018  0.069474645   0.11628632        0.536      1.47062   0.00141549 
-    7000    2.0266192    1.5593811   -2.9972341    2.9931606         0.52       65  0.070244693  0.069880791   0.11666541      0.52528    1.3246332  0.040754793 
-    8000    1.7790467    1.8680568   -2.8028819    2.6275151         0.52       65  0.070454494  0.070172368   0.11736806        0.524    1.4213649  0.047985191 
-    9000    1.7968847    1.3195587    -3.261001    2.6550983        0.536       67  0.069952011  0.069618327   0.11650087      0.53904    1.4624201  -0.01069837 
-   10000    2.1566109    1.1015729   -3.4999837    3.1880335        0.552       69  0.069603309  0.069284134   0.11625548      0.53128    1.3587249   0.02075238 
-Loop time of 24.9916 on 4 procs for 10000 steps with 69 atoms
-
-Performance: 172857.936 tau/day, 400.134 timesteps/s
-98.2% CPU use with 4 MPI tasks x 1 OpenMP threads
+Step Temp Press PotEng KinEng Density Atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av 
+       0            0            0            0           -0            0        0            0            0            0            0            0            0            0 
+    1000     1.956397    1.7699101   -2.7889468    2.8864874        0.488       61  0.068894746  0.067229075    0.1141726      0.53288    1.3832798  0.013392866        63.44 
+    2000     2.040943   0.56060899   -2.8001647    3.0077055        0.456       57  0.069858594  0.068831934   0.11629114       0.5232    1.3587174  0.049995794        62.19 
+    3000    2.0004866    1.5736515   -3.3098044    2.9572411        0.552       69  0.069594029  0.068727791   0.11592543      0.53096    1.4129434  0.020022578        63.23 
+    4000    2.1127942     2.642809   -2.8865084    3.1211733        0.528       66  0.070268697  0.069533235   0.11693806      0.52424    1.3444615  0.046884078        62.57 
+    5000    2.3663648     1.354269   -3.1917346    3.4957662        0.528       66  0.070519633  0.069960064   0.11710321      0.52688    1.3595814  0.036270867        62.56 
+    6000    1.9224136   0.82756699      -3.1965     2.839257         0.52       65   0.06985018  0.069474645   0.11628632        0.536      1.47062   0.00141549        63.76 
+    7000    2.0266192    1.5593811   -2.9972341    2.9931606         0.52       65  0.070244693  0.069880791   0.11666541      0.52528    1.3246332  0.040754793         62.2 
+    8000    1.7790467    1.8680568   -2.8028819    2.6275151         0.52       65  0.070454494  0.070172368   0.11736806        0.524    1.4213649  0.047985191        62.03 
+    9000    1.7968847    1.3195587    -3.261001    2.6550983        0.536       67  0.069952011  0.069618327   0.11650087      0.53904    1.4624201  -0.01069837        64.36 
+   10000    2.1566109    1.1015729   -3.4999837    3.1880335        0.552       69  0.069603309  0.069284134   0.11625548      0.53128    1.3587249   0.02075238        63.24 
+Loop time of 23.8213 on 4 procs for 10000 steps with 69 atoms
+
+Performance: 181350.388 tau/day, 419.793 timesteps/s
+97.6% CPU use with 4 MPI tasks x 1 OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 0.11696    | 0.12516    | 0.1321     |   1.7 |  0.50
-Neigh   | 0.34874    | 0.35644    | 0.36545    |   1.2 |  1.43
-Comm    | 0.48531    | 0.51366    | 0.54755    |   3.8 |  2.06
-Output  | 0.0005362  | 0.00069767 | 0.00076008 |   0.0 |  0.00
-Modify  | 23.956     | 23.972     | 23.988     |   0.3 | 95.92
-Other   |            | 0.02376    |            |       |  0.10
+Pair    | 0.10935    | 0.11844    | 0.12741    |   2.1 |  0.50
+Neigh   | 0.33       | 0.33945    | 0.35091    |   1.6 |  1.42
+Comm    | 0.49249    | 0.51745    | 0.53856    |   2.7 |  2.17
+Output  | 0.00053334 | 0.0007208  | 0.0007906  |   0.0 |  0.00
+Modify  | 22.82      | 22.822     | 22.825     |   0.0 | 95.81
+Other   |            | 0.02289    |            |       |  0.10
 
 Nlocal:    17.25 ave 23 max 10 min
 Histogram: 1 0 0 0 0 0 2 0 0 1
@@ -125,4 +133,4 @@ Total # of neighbors = 2823
 Ave neighs/atom = 40.913
 Neighbor list builds = 10000
 Dangerous builds = 0
-Total wall time: 0:00:24
+Total wall time: 0:00:23
diff --git a/lib/atc/Matrix.h b/lib/atc/Matrix.h
index e467128fbc7733af1c7aa551e6a718059194bc59..e806ebd0168c1bbc924a42a8d3ee8d229d4d90a9 100644
--- a/lib/atc/Matrix.h
+++ b/lib/atc/Matrix.h
@@ -356,7 +356,7 @@ DenseMatrix<T> Matrix<T>::pow(double n) const
   int sz=this->size(); for(INDEX i=0; i<sz; i++)
   {
     double val = R[i];
-    R[i] = pow(val,n);
+    R[i] = std::pow(val,n);
   }
   return R;
 }
diff --git a/potentials/BN.extep b/potentials/BN.extep
new file mode 100644
index 0000000000000000000000000000000000000000..8732ada84bf95dc6814d0ef839b18b686a4e914d
--- /dev/null
+++ b/potentials/BN.extep
@@ -0,0 +1,109 @@
+# DATE: 2017-11-28 CONTRIBUTOR: J.H. Los, J.M.H. Kroes CITATION: Los et al. Phys. Rev. B 96, 184108 (2017)
+
+# B and N mixture, parameterized for ExTeP potential
+
+# ExTeP parameters for various elements and mixtures
+# multiple entries can be added to this file, LAMMPS reads the ones it needs
+# these entries are in LAMMPS "metal" units:
+#   A,B = eV; lambda1,lambda2,lambda3 = 1/Angstroms; R,D = Angstroms
+#   other quantities are unitless
+
+# format of a single entry (one or more lines):
+#I  J   K   m, gamma*, lambda3, c,         d,         h,      n,         gamma,      lambda2,   B,            R,   D,   lambda1,   A
+B   B   B   3  1.0     0.0      26617.3000 141.2000  -0.1300  1.1422470  0.01498959  2.5211820  2768.7363631  2.0  0.2  2.6857244  3376.3350735
+N   N   N   3  1.0     0.0         23.5000   3.7500  -0.4000  0.6650000  0.01925100  2.6272721  2563.5603417  2.0  0.2  2.8293093  2978.9527928
+B   B   N   3  1.0     0.0      26617.3000 141.2000  -0.1300  1.1422470  0.01498959  2.5211820  2768.7363631  2.0  0.2  2.6857244  3376.3350735
+N   N   B   3  1.0     0.0         23.5000   3.7500  -0.4000  0.6650000  0.01925100  2.6272721  2563.5603417  2.0  0.2  2.8293093  2978.9527928
+B   N   B   3  1.0   0.0d0  306.586555205d0  10.d0  -0.7218d0  0.6576543657d0  0.0027024851d0  2.69335d0  2595.6860833266d0  2.d0  0.2d0  2.95d0  3330.0655849887d0
+B   N   N   3  1.0   0.0d0  306.586555205d0  10.d0  -0.7218d0  0.6576543657d0  0.0027024851d0  2.69335d0  2595.6860833266d0  2.d0  0.2d0  2.95d0  3330.0655849887d0
+N   B   B   3  1.0   0.0d0  306.586555205d0  10.d0  -0.7218d0  0.6576543657d0  0.0027024851d0  2.69335d0  2595.6860833266d0  2.d0  0.2d0  2.95d0  3330.0655849887d0
+N   B   N   3  1.0   0.0d0  306.586555205d0  10.d0  -0.7218d0  0.6576543657d0  0.0027024851d0  2.69335d0  2595.6860833266d0  2.d0  0.2d0  2.95d0  3330.0655849887d0
+#
+#     1.9925	  Bicubic Splines Parameters
+#
+#   F_corr   [ B,  B]
+#
+#t1 t2  i   j           val       dx        dy        dxy
+  B   B     0    0    0.0000    0.0000    0.0000    0.0000
+  B   B     0    1    0.0054    0.0000    0.0000    0.0000
+  B   B     0    2    0.0182    0.0000    0.0000    0.0000
+  B   B     0    3   -0.0034    0.0000    0.0000    0.0000
+  B   B     0    4   -0.0034    0.0000    0.0000    0.0000
+  B   B     1    0    0.0054    0.0000    0.0000    0.0000
+  B   B     1    1    0.0100    0.0000    0.0000    0.0000
+  B   B     1    2    0.0062    0.0000    0.0000    0.0000
+  B   B     1    3    0.0154    0.0000    0.0000    0.0000
+  B   B     1    4    0.0154    0.0000    0.0000    0.0000
+  B   B     2    0    0.0182    0.0000    0.0000    0.0000
+  B   B     2    1    0.0062    0.0000    0.0000    0.0000
+  B   B     2    2    0.0154    0.0000    0.0000    0.0000
+  B   B     2    3   -0.0390    0.0000   -0.0727    0.0000
+  B   B     2    4   -0.0390    0.0000   -0.0727    0.0000
+  B   B     3    0   -0.0034    0.0000    0.0000    0.0000
+  B   B     3    1    0.0154    0.0000    0.0000    0.0000
+  B   B     3    2   -0.0390   -0.0727    0.0000    0.0000
+  B   B     3    3   -0.1300    0.0000    0.0000    0.0000
+  B   B     3    4   -0.1300    0.0000    0.0000    0.0000
+  B   B     4    0   -0.0034    0.0000    0.0000    0.0000
+  B   B     4    1    0.0154    0.0000    0.0000    0.0000
+  B   B     4    2   -0.0390   -0.0727    0.0000    0.0000
+  B   B     4    3   -0.1300    0.0000    0.0000    0.0000
+  B   B     4    4   -0.1300    0.0000    0.0000    0.0000
+#
+#   F_corr   [ B,  N]
+#
+#t1 t2  i   j          val        dx        dy        dxy
+  B   N     0    0    0.0170    0.0000    0.0000    0.0000
+  B   N     0    1    0.0078    0.0000    0.0000    0.0000
+  B   N     0    2    0.0000    0.0000    0.0000    0.0000
+  B   N     0    3   -0.0860    0.0000    0.0000    0.0000
+  B   N     0    4   -0.0860    0.0000    0.0000    0.0000
+  B   N     1    0   -0.0090    0.0000    0.0000    0.0000
+  B   N     1    1    0.0090    0.0000    0.0000    0.0000
+  B   N     1    2   -0.0068    0.0000   -0.0214    0.0000
+  B   N     1    3   -0.0338    0.0000    0.0388    0.0000
+  B   N     1    4   -0.0338    0.0000    0.0388    0.0000
+  B   N     2    0    0.0000    0.0000    0.0000    0.0000
+  B   N     2    1   -0.0198    0.0000    0.0000    0.0000
+  B   N     2    2    0.0000    0.0000    0.0000    0.0000
+  B   N     2    3   -0.0084    0.0000    0.0169    0.0000
+  B   N     2    4   -0.0084    0.0000    0.0169    0.0000
+  B   N     3    0   -0.0750    0.0000    0.0000    0.0000
+  B   N     3    1   -0.0168    0.0306    0.0000    0.0000
+  B   N     3    2   -0.0138    0.0084    0.0000    0.0000
+  B   N     3    3    0.0000    0.0000    0.0000    0.0000
+  B   N     3    4    0.0000    0.0000    0.0000    0.0000
+  B   N     4    0   -0.0750    0.0000    0.0000    0.0000
+  B   N     4    1   -0.0168    0.0306    0.0000    0.0000
+  B   N     4    2   -0.0138    0.0084    0.0000    0.0000
+  B   N     4    3    0.0000    0.0000    0.0000    0.0000
+  B   N     4    4    0.0000    0.0000    0.0000    0.0000
+#
+#   F_corr   [ N,  N]
+#
+#t1 t2  i   j          val        dx        dy        dxy
+  N   N     0    0    0.0000    0.0000    0.0000    0.0000
+  N   N     0    1   -0.0282    0.0000    0.0000    0.0000
+  N   N     0    2   -0.0018    0.0000    0.0000    0.0000
+  N   N     0    3   -0.0004    0.0000    0.0000    0.0000
+  N   N     0    4   -0.0004    0.0000    0.0000    0.0000
+  N   N     1    0   -0.0282    0.0000    0.0000    0.0000
+  N   N     1    1    0.0200    0.0000    0.0000    0.0000
+  N   N     1    2    0.0180    0.0162   -0.0027    0.0000
+  N   N     1    3    0.0146    0.0000    0.0000    0.0000
+  N   N     1    4    0.0146    0.0000    0.0000    0.0000
+  N   N     2    0   -0.0018    0.0000    0.0000    0.0000
+  N   N     2    1    0.0180   -0.0027    0.0162    0.0000
+  N   N     2    2    0.0306    0.0000    0.0000    0.0000
+  N   N     2    3    0.0060    0.0000   -0.0073    0.0000
+  N   N     2    4    0.0060    0.0000   -0.0073    0.0000
+  N   N     3    0   -0.0004    0.0000    0.0000    0.0000
+  N   N     3    1    0.0146    0.0000    0.0000    0.0000
+  N   N     3    2    0.0060   -0.0073    0.0000    0.0000
+  N   N     3    3    0.0000    0.0000    0.0000    0.0000
+  N   N     3    4    0.0000    0.0000    0.0000    0.0000
+  N   N     4    0   -0.0004    0.0000    0.0000    0.0000
+  N   N     4    1    0.0146    0.0000    0.0000    0.0000
+  N   N     4    2    0.0060   -0.0073    0.0000    0.0000
+  N   N     4    3    0.0000    0.0000    0.0000    0.0000
+  N   N     4    4    0.0000    0.0000    0.0000    0.0000
diff --git a/python/lammps.py b/python/lammps.py
index a53bc431be3c4c841f596ccdf4dc0f1998425d54..0492876476ea7d2ce50a709eb498ec819beac0ae 100644
--- a/python/lammps.py
+++ b/python/lammps.py
@@ -619,6 +619,30 @@ class Atom2D(Atom):
             self.lmp.eval("fy[%d]" % self.index))
 
 
+class variable_set:
+    def __init__(self, name, variable_dict):
+        self._name = name
+        array_pattern = re.compile(r"(?P<arr>.+)\[(?P<index>[0-9]+)\]")
+
+        for key, value in variable_dict.items():
+            m = array_pattern.match(key)
+            if m:
+                g = m.groupdict()
+                varname = g['arr']
+                idx = int(g['index'])
+                if varname not in self.__dict__:
+                    self.__dict__[varname] = {}
+                self.__dict__[varname][idx] = value
+            else:
+                self.__dict__[key] = value
+
+    def __str__(self):
+        return "{}({})".format(self._name, ','.join(["{}={}".format(k, self.__dict__[k]) for k in self.__dict__.keys() if not k.startswith('_')]))
+
+    def __repr__(self):
+        return self.__str__()
+
+
 def get_thermo_data(output):
     """ traverse output of runs and extract thermo data columns """
     if isinstance(output, str):
@@ -646,7 +670,7 @@ def get_thermo_data(output):
         elif line.startswith("Loop time of "):
             in_run = False
             columns = None
-            thermo_data = namedtuple('ThermoData', list(current_run.keys()))(*list(current_run.values()))
+            thermo_data = variable_set('ThermoData', current_run)
             r = {'thermo' : thermo_data }
             runs.append(namedtuple('Run', list(r.keys()))(*list(r.values())))
         elif in_run and len(columns) > 0:
diff --git a/src/.gitignore b/src/.gitignore
index 694a43adb2980be485b4e4771797aaca817bf56d..1f95e50fde4cee633d0781fd83e8e521d381089b 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -25,6 +25,7 @@
 /kokkos.h
 /kokkos_type.h
 /kokkos_few.h
+/kokkos_base.h
 
 /manifold*.cpp
 /manifold*.h
@@ -1085,10 +1086,16 @@
 /pair_born_coul_long_cs.h
 /pair_born_coul_dsf_cs.cpp
 /pair_born_coul_dsf_cs.h
+/pair_born_coul_wolf_cs.cpp
+/pair_born_coul_wolf_cs.h
 /pair_buck_coul_long_cs.cpp
 /pair_buck_coul_long_cs.h
 /pair_coul_long_cs.cpp
 /pair_coul_long_cs.h
+/pair_coul_wolf_cs.cpp
+/pair_coul_wolf_cs.h
+/pair_extep.cpp
+/pair_extep.h
 /pair_lj_cut_thole_long.cpp
 /pair_lj_cut_thole_long.h
 /pair_plum_hb.cpp
diff --git a/src/GPU/pair_eam_alloy_gpu.cpp b/src/GPU/pair_eam_alloy_gpu.cpp
index ab0f499a98e6813a875753d63302cfe34bd8fa67..9b42b0a14fab56b44652942973fd122a7fe113da 100644
--- a/src/GPU/pair_eam_alloy_gpu.cpp
+++ b/src/GPU/pair_eam_alloy_gpu.cpp
@@ -28,6 +28,7 @@
 #include "error.h"
 #include "neigh_request.h"
 #include "gpu_extra.h"
+#include "domain.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/GPU/pair_eam_fs_gpu.cpp b/src/GPU/pair_eam_fs_gpu.cpp
index a2b339db9ac6ce197b19ad7705edfb24ea132599..c29b49631ce210121df7479b3fc60867bca31438 100644
--- a/src/GPU/pair_eam_fs_gpu.cpp
+++ b/src/GPU/pair_eam_fs_gpu.cpp
@@ -28,6 +28,7 @@
 #include "error.h"
 #include "neigh_request.h"
 #include "gpu_extra.h"
+#include "domain.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp
index eeec94fdf729a76694188a715119781adfaaefe5..033c35dbacc0e96bb910cd1c3e6b2fa261eb815a 100644
--- a/src/GRANULAR/fix_wall_gran.cpp
+++ b/src/GRANULAR/fix_wall_gran.cpp
@@ -30,6 +30,7 @@
 #include "math_const.h"
 #include "memory.h"
 #include "error.h"
+#include "neighbor.h"
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp
index a09b9dfa421b971df17992722ccc55c1308b1454..d1c5d4c9c771f8a73bd0d95165ee362976f50509 100644
--- a/src/GRANULAR/fix_wall_gran_region.cpp
+++ b/src/GRANULAR/fix_wall_gran_region.cpp
@@ -30,6 +30,8 @@
 #include "math_const.h"
 #include "memory.h"
 #include "error.h"
+#include "comm.h"
+#include "neighbor.h"
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh
index df5fc3e5f1a9d146a94f37435842d6076f4edff2..295e46bcaec54282a9511adb4ff5af91a9b75fff 100644
--- a/src/KOKKOS/Install.sh
+++ b/src/KOKKOS/Install.sh
@@ -28,8 +28,20 @@ action () {
 
 # force rebuild of files with LMP_KOKKOS switch
 
-touch ../accelerator_kokkos.h
-touch ../memory.h
+KOKKOS_INSTALLED=0
+if (test -e ../Makefile.package) then
+  KOKKOS_INSTALLED=`grep DLMP_KOKKOS ../Makefile.package | wc -l`
+fi 
+
+if (test $mode = 1) then
+  if (test $KOKKOS_INSTALLED = 0) then
+    touch ../accelerator_kokkos.h
+  fi
+elif (test $mode = 0) then
+  if (test $KOKKOS_INSTALLED = 1) then
+    touch ../accelerator_kokkos.h
+  fi
+fi
 
 # list of files with optional dependcies
 
@@ -125,8 +137,9 @@ action improper_harmonic_kokkos.cpp improper_harmonic.cpp
 action improper_harmonic_kokkos.h improper_harmonic.h
 action kokkos.cpp
 action kokkos.h
-action kokkos_type.h
+action kokkos_base.h
 action kokkos_few.h
+action kokkos_type.h
 action memory_kokkos.h
 action modify_kokkos.cpp
 action modify_kokkos.h
@@ -229,6 +242,8 @@ action pair_tersoff_mod_kokkos.cpp pair_tersoff_mod.cpp
 action pair_tersoff_mod_kokkos.h pair_tersoff_mod.h
 action pair_tersoff_zbl_kokkos.cpp pair_tersoff_zbl.cpp
 action pair_tersoff_zbl_kokkos.h pair_tersoff_zbl.h
+action pair_yukawa_kokkos.cpp
+action pair_yukawa_kokkos.h
 action pppm_kokkos.cpp pppm.cpp
 action pppm_kokkos.h pppm.h
 action rand_pool_wrap_kokkos.cpp
diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp
index 401a00c856ffcc86543f22024bbb0cec1d9dc2e3..59a20c25df36184d4a23a9bf9f6071c625f5eb38 100644
--- a/src/KOKKOS/angle_charmm_kokkos.cpp
+++ b/src/KOKKOS/angle_charmm_kokkos.cpp
@@ -24,7 +24,7 @@
 #include "comm.h"
 #include "force.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -51,8 +51,8 @@ template<class DeviceType>
 AngleCharmmKokkos<DeviceType>::~AngleCharmmKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -71,15 +71,15 @@ void AngleCharmmKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
   if (eflag_atom) {
     //if(k_eatom.dimension_0()<maxeatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_eatom,eatom);
-      memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
+      memoryKK->destroy_kokkos(k_eatom,eatom);
+      memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
       d_eatom = k_eatom.template view<DeviceType>();
     //}
   }
   if (vflag_atom) {
     //if(k_vatom.dimension_0()<maxvatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_vatom,vatom);
-      memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
+      memoryKK->destroy_kokkos(k_vatom,vatom);
+      memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
       d_vatom = k_vatom.template view<DeviceType>();
     //}
   }
diff --git a/src/KOKKOS/angle_class2_kokkos.cpp b/src/KOKKOS/angle_class2_kokkos.cpp
index e851e9d500b10246571210a6c38daae5d472528a..108b4f48f225827228fe1a5667edbd7a7c8ad6aa 100644
--- a/src/KOKKOS/angle_class2_kokkos.cpp
+++ b/src/KOKKOS/angle_class2_kokkos.cpp
@@ -24,7 +24,7 @@
 #include "comm.h"
 #include "force.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -51,8 +51,8 @@ template<class DeviceType>
 AngleClass2Kokkos<DeviceType>::~AngleClass2Kokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -70,13 +70,13 @@ void AngleClass2Kokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/angle_harmonic_kokkos.cpp b/src/KOKKOS/angle_harmonic_kokkos.cpp
index 9fd237ddb3e90404aa9e9a979be2ccaba3953e6d..dd5a1e26c7c55d135a5e37a0619dace64b49dbb1 100644
--- a/src/KOKKOS/angle_harmonic_kokkos.cpp
+++ b/src/KOKKOS/angle_harmonic_kokkos.cpp
@@ -24,7 +24,7 @@
 #include "comm.h"
 #include "force.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -51,8 +51,8 @@ template<class DeviceType>
 AngleHarmonicKokkos<DeviceType>::~AngleHarmonicKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -70,13 +70,13 @@ void AngleHarmonicKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"angle:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"angle:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp
index 31b33dbdc9a2c406e40e6e36f8898d88d1c50d5b..4ecead5b1d052be975c40069d169a7fad43cbf63 100644
--- a/src/KOKKOS/atom_kokkos.cpp
+++ b/src/KOKKOS/atom_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "update.h"
 #include "domain.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "kokkos.h"
 
@@ -33,59 +33,59 @@ AtomKokkos::AtomKokkos(LAMMPS *lmp) : Atom(lmp) {}
 
 AtomKokkos::~AtomKokkos()
 {
-  memory->destroy_kokkos(k_tag, tag);
-  memory->destroy_kokkos(k_mask, mask);
-  memory->destroy_kokkos(k_type, type);
-  memory->destroy_kokkos(k_image, image);
-  memory->destroy_kokkos(k_molecule, molecule);
-
-  memory->destroy_kokkos(k_x, x);
-  memory->destroy_kokkos(k_v, v);
-  memory->destroy_kokkos(k_f, f);
-
-  memory->destroy_kokkos(k_mass, mass);
-  memory->destroy_kokkos(k_q, q);
-
-  memory->destroy_kokkos(k_radius, radius);
-  memory->destroy_kokkos(k_rmass, rmass);
-  memory->destroy_kokkos(k_omega, omega);
-  memory->destroy_kokkos(k_angmom, angmom);
-  memory->destroy_kokkos(k_torque, torque);
-
-  memory->destroy_kokkos(k_nspecial, nspecial);
-  memory->destroy_kokkos(k_special, special);
-  memory->destroy_kokkos(k_num_bond, num_bond);
-  memory->destroy_kokkos(k_bond_type, bond_type);
-  memory->destroy_kokkos(k_bond_atom, bond_atom);
-  memory->destroy_kokkos(k_num_angle, num_angle);
-  memory->destroy_kokkos(k_angle_type, angle_type);
-  memory->destroy_kokkos(k_angle_atom1, angle_atom1);
-  memory->destroy_kokkos(k_angle_atom2, angle_atom2);
-  memory->destroy_kokkos(k_angle_atom3, angle_atom3);
-  memory->destroy_kokkos(k_num_dihedral, num_dihedral);
-  memory->destroy_kokkos(k_dihedral_type, dihedral_type);
-  memory->destroy_kokkos(k_dihedral_atom1, dihedral_atom1);
-  memory->destroy_kokkos(k_dihedral_atom2, dihedral_atom2);
-  memory->destroy_kokkos(k_dihedral_atom3, dihedral_atom3);
-  memory->destroy_kokkos(k_dihedral_atom4, dihedral_atom4);
-  memory->destroy_kokkos(k_num_improper, num_improper);
-  memory->destroy_kokkos(k_improper_type, improper_type);
-  memory->destroy_kokkos(k_improper_atom1, improper_atom1);
-  memory->destroy_kokkos(k_improper_atom2, improper_atom2);
-  memory->destroy_kokkos(k_improper_atom3, improper_atom3);
-  memory->destroy_kokkos(k_improper_atom4, improper_atom4);
+  memoryKK->destroy_kokkos(k_tag, tag);
+  memoryKK->destroy_kokkos(k_mask, mask);
+  memoryKK->destroy_kokkos(k_type, type);
+  memoryKK->destroy_kokkos(k_image, image);
+  memoryKK->destroy_kokkos(k_molecule, molecule);
+
+  memoryKK->destroy_kokkos(k_x, x);
+  memoryKK->destroy_kokkos(k_v, v);
+  memoryKK->destroy_kokkos(k_f, f);
+
+  memoryKK->destroy_kokkos(k_mass, mass);
+  memoryKK->destroy_kokkos(k_q, q);
+
+  memoryKK->destroy_kokkos(k_radius, radius);
+  memoryKK->destroy_kokkos(k_rmass, rmass);
+  memoryKK->destroy_kokkos(k_omega, omega);
+  memoryKK->destroy_kokkos(k_angmom, angmom);
+  memoryKK->destroy_kokkos(k_torque, torque);
+
+  memoryKK->destroy_kokkos(k_nspecial, nspecial);
+  memoryKK->destroy_kokkos(k_special, special);
+  memoryKK->destroy_kokkos(k_num_bond, num_bond);
+  memoryKK->destroy_kokkos(k_bond_type, bond_type);
+  memoryKK->destroy_kokkos(k_bond_atom, bond_atom);
+  memoryKK->destroy_kokkos(k_num_angle, num_angle);
+  memoryKK->destroy_kokkos(k_angle_type, angle_type);
+  memoryKK->destroy_kokkos(k_angle_atom1, angle_atom1);
+  memoryKK->destroy_kokkos(k_angle_atom2, angle_atom2);
+  memoryKK->destroy_kokkos(k_angle_atom3, angle_atom3);
+  memoryKK->destroy_kokkos(k_num_dihedral, num_dihedral);
+  memoryKK->destroy_kokkos(k_dihedral_type, dihedral_type);
+  memoryKK->destroy_kokkos(k_dihedral_atom1, dihedral_atom1);
+  memoryKK->destroy_kokkos(k_dihedral_atom2, dihedral_atom2);
+  memoryKK->destroy_kokkos(k_dihedral_atom3, dihedral_atom3);
+  memoryKK->destroy_kokkos(k_dihedral_atom4, dihedral_atom4);
+  memoryKK->destroy_kokkos(k_num_improper, num_improper);
+  memoryKK->destroy_kokkos(k_improper_type, improper_type);
+  memoryKK->destroy_kokkos(k_improper_atom1, improper_atom1);
+  memoryKK->destroy_kokkos(k_improper_atom2, improper_atom2);
+  memoryKK->destroy_kokkos(k_improper_atom3, improper_atom3);
+  memoryKK->destroy_kokkos(k_improper_atom4, improper_atom4);
 
   // USER-DPD package
-  memory->destroy_kokkos(k_uCond,uCond);
-  memory->destroy_kokkos(k_uMech,uMech);
-  memory->destroy_kokkos(k_uChem,uChem);
-  memory->destroy_kokkos(k_uCG,uCG);
-  memory->destroy_kokkos(k_uCGnew,uCGnew);
-  memory->destroy_kokkos(k_rho,rho);
-  memory->destroy_kokkos(k_dpdTheta,dpdTheta);
-  memory->destroy_kokkos(k_duChem,duChem);
-
-  memory->destroy_kokkos(k_dvector,dvector);
+  memoryKK->destroy_kokkos(k_uCond,uCond);
+  memoryKK->destroy_kokkos(k_uMech,uMech);
+  memoryKK->destroy_kokkos(k_uChem,uChem);
+  memoryKK->destroy_kokkos(k_uCG,uCG);
+  memoryKK->destroy_kokkos(k_uCGnew,uCGnew);
+  memoryKK->destroy_kokkos(k_rho,rho);
+  memoryKK->destroy_kokkos(k_dpdTheta,dpdTheta);
+  memoryKK->destroy_kokkos(k_duChem,duChem);
+
+  memoryKK->destroy_kokkos(k_dvector,dvector);
   dvector = NULL;
 }
 
@@ -232,10 +232,10 @@ void AtomKokkos::sort()
 void AtomKokkos::grow(unsigned int mask){
 
   if (mask & SPECIAL_MASK){
-    memory->destroy_kokkos(k_special, special);
+    memoryKK->destroy_kokkos(k_special, special);
     sync(Device, mask);
     modified(Device, mask);
-    memory->grow_kokkos(k_special,special,nmax,maxspecial,"atom:special");
+    memoryKK->grow_kokkos(k_special,special,nmax,maxspecial,"atom:special");
     avec->grow_reset();
     sync(Host, mask);
   }
@@ -270,7 +270,7 @@ int AtomKokkos::add_custom(const char *name, int flag)
     int n = strlen(name) + 1;
     dname[index] = new char[n];
     strcpy(dname[index],name);
-    memory->grow_kokkos(k_dvector,dvector,ndvector,nmax,
+    memoryKK->grow_kokkos(k_dvector,dvector,ndvector,nmax,
                         "atom:dvector");
   }
 
@@ -291,7 +291,7 @@ void AtomKokkos::remove_custom(int flag, int index)
     delete [] iname[index];
     iname[index] = NULL;
   } else {
-    //memory->destroy_kokkos(dvector);
+    //memoryKK->destroy_kokkos(dvector);
     dvector[index] = NULL;
     delete [] dname[index];
     dname[index] = NULL;
@@ -302,25 +302,25 @@ void AtomKokkos::remove_custom(int flag, int index)
 
 void AtomKokkos::deallocate_topology()
 {
-  memory->destroy_kokkos(k_bond_type, bond_type);
-  memory->destroy_kokkos(k_bond_atom, bond_atom);
-
-  memory->destroy_kokkos(k_angle_type, angle_type);
-  memory->destroy_kokkos(k_angle_atom1, angle_atom1);
-  memory->destroy_kokkos(k_angle_atom2, angle_atom2);
-  memory->destroy_kokkos(k_angle_atom3, angle_atom3);
-
-  memory->destroy_kokkos(k_dihedral_type, dihedral_type);
-  memory->destroy_kokkos(k_dihedral_atom1, dihedral_atom1);
-  memory->destroy_kokkos(k_dihedral_atom2, dihedral_atom2);
-  memory->destroy_kokkos(k_dihedral_atom3, dihedral_atom3);
-  memory->destroy_kokkos(k_dihedral_atom4, dihedral_atom4);
-
-  memory->destroy_kokkos(k_improper_type, improper_type);
-  memory->destroy_kokkos(k_improper_atom1, improper_atom1);
-  memory->destroy_kokkos(k_improper_atom2, improper_atom2);
-  memory->destroy_kokkos(k_improper_atom3, improper_atom3);
-  memory->destroy_kokkos(k_improper_atom4, improper_atom4);
+  memoryKK->destroy_kokkos(k_bond_type, bond_type);
+  memoryKK->destroy_kokkos(k_bond_atom, bond_atom);
+
+  memoryKK->destroy_kokkos(k_angle_type, angle_type);
+  memoryKK->destroy_kokkos(k_angle_atom1, angle_atom1);
+  memoryKK->destroy_kokkos(k_angle_atom2, angle_atom2);
+  memoryKK->destroy_kokkos(k_angle_atom3, angle_atom3);
+
+  memoryKK->destroy_kokkos(k_dihedral_type, dihedral_type);
+  memoryKK->destroy_kokkos(k_dihedral_atom1, dihedral_atom1);
+  memoryKK->destroy_kokkos(k_dihedral_atom2, dihedral_atom2);
+  memoryKK->destroy_kokkos(k_dihedral_atom3, dihedral_atom3);
+  memoryKK->destroy_kokkos(k_dihedral_atom4, dihedral_atom4);
+
+  memoryKK->destroy_kokkos(k_improper_type, improper_type);
+  memoryKK->destroy_kokkos(k_improper_atom1, improper_atom1);
+  memoryKK->destroy_kokkos(k_improper_atom2, improper_atom2);
+  memoryKK->destroy_kokkos(k_improper_atom3, improper_atom3);
+  memoryKK->destroy_kokkos(k_improper_atom4, improper_atom4);
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/KOKKOS/atom_vec_angle_kokkos.cpp b/src/KOKKOS/atom_vec_angle_kokkos.cpp
index 05414cf2e45cdc92f9750c552cb390d915e151cb..a9e55f530a2c1ab3e93eb606f7375bf674c678aa 100644
--- a/src/KOKKOS/atom_vec_angle_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_angle_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -68,33 +68,33 @@ void AtomVecAngleKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
 
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
 
-  memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
-  memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
-  memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
+  memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
+  memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
+  memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
                       "atom:special");
-  memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
-  memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
+  memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
                       "atom:bond_type");
-  memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
                       "atom:bond_atom");
 
-  memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
-  memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
+  memoryKK->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
                       "atom:angle_type");
-  memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
                       "atom:angle_atom1");
-  memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
                       "atom:angle_atom2");
-  memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
                       "atom:angle_atom3");
 
   grow_reset();
diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.cpp b/src/KOKKOS/atom_vec_atomic_kokkos.cpp
index 6c610c8c111409d8c18201d9be23e44a4fe9195c..f021c45db6feb9c1407115dd1cbeadebf9ddf1d6 100644
--- a/src/KOKKOS/atom_vec_atomic_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_atomic_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -64,14 +64,14 @@ void AtomVecAtomicKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
 
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
 
   grow_reset();
   sync(Host,ALL_MASK);
diff --git a/src/KOKKOS/atom_vec_bond_kokkos.cpp b/src/KOKKOS/atom_vec_bond_kokkos.cpp
index 076144420c1442c5db69008905263313b4757be2..bf682c507fd5c3210db20a1e50b35dc09d16a1c7 100644
--- a/src/KOKKOS/atom_vec_bond_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_bond_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -65,21 +65,21 @@ void AtomVecBondKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
-
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
-
-  memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
-  memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
-  memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,"atom:special");
-  memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
-  memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,"atom:bond_type");
-  memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,"atom:bond_atom");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+
+  memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
+  memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
+  memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,"atom:special");
+  memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
+  memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,"atom:bond_type");
+  memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,"atom:bond_atom");
 
   grow_reset();
   sync(Host,ALL_MASK);
diff --git a/src/KOKKOS/atom_vec_charge_kokkos.cpp b/src/KOKKOS/atom_vec_charge_kokkos.cpp
index 7b8b74b4051b63411f673b537ca4c1b9ce731198..a9ae5cc2d1e999d8dc94964e43a3f0d8be4a2a84 100644
--- a/src/KOKKOS/atom_vec_charge_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_charge_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -67,16 +67,16 @@ void AtomVecChargeKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
 
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
 
-  memory->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q");
+  memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q");
 
   grow_reset();
   sync(Host,ALL_MASK);
diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.cpp b/src/KOKKOS/atom_vec_dpd_kokkos.cpp
index c4e493bd8536dd036931e61c0e0f080fc9d925ad..9c54ffccc50213111d7e47bd39751f474c475438 100644
--- a/src/KOKKOS/atom_vec_dpd_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_dpd_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -67,24 +67,24 @@ void AtomVecDPDKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
 
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
 
 
-  memory->grow_kokkos(atomKK->k_rho,atomKK->rho,nmax,"atom:rho");
-  memory->grow_kokkos(atomKK->k_dpdTheta,atomKK->dpdTheta,nmax,"atom:dpdTheta");
-  memory->grow_kokkos(atomKK->k_uCond,atomKK->uCond,nmax,"atom:uCond");
-  memory->grow_kokkos(atomKK->k_uMech,atomKK->uMech,nmax,"atom:uMech");
-  memory->grow_kokkos(atomKK->k_uChem,atomKK->uChem,nmax,"atom:uChem");
-  memory->grow_kokkos(atomKK->k_uCG,atomKK->uCG,nmax,"atom:uCG");
-  memory->grow_kokkos(atomKK->k_uCGnew,atomKK->uCGnew,nmax,"atom:uCGnew");
-  memory->grow_kokkos(atomKK->k_duChem,atomKK->duChem,nmax,"atom:duChem");
+  memoryKK->grow_kokkos(atomKK->k_rho,atomKK->rho,nmax,"atom:rho");
+  memoryKK->grow_kokkos(atomKK->k_dpdTheta,atomKK->dpdTheta,nmax,"atom:dpdTheta");
+  memoryKK->grow_kokkos(atomKK->k_uCond,atomKK->uCond,nmax,"atom:uCond");
+  memoryKK->grow_kokkos(atomKK->k_uMech,atomKK->uMech,nmax,"atom:uMech");
+  memoryKK->grow_kokkos(atomKK->k_uChem,atomKK->uChem,nmax,"atom:uChem");
+  memoryKK->grow_kokkos(atomKK->k_uCG,atomKK->uCG,nmax,"atom:uCG");
+  memoryKK->grow_kokkos(atomKK->k_uCGnew,atomKK->uCGnew,nmax,"atom:uCGnew");
+  memoryKK->grow_kokkos(atomKK->k_duChem,atomKK->duChem,nmax,"atom:duChem");
 
   if (atom->nextra_grow)
     for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
diff --git a/src/KOKKOS/atom_vec_full_kokkos.cpp b/src/KOKKOS/atom_vec_full_kokkos.cpp
index 8e9abe40675f7816ca969a23c0ab55855f71c5d1..9369d7e84437f184051aed76f129cbb3fe028efb 100644
--- a/src/KOKKOS/atom_vec_full_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_full_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -67,59 +67,59 @@ void AtomVecFullKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
 
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
 
-  memory->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q");
-  memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
+  memoryKK->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q");
+  memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
 
-  memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
-  memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
+  memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
+  memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
 		      "atom:special");
-  memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
-  memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
+  memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
 		      "atom:bond_type");
-  memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
 		      "atom:bond_atom");
 
-  memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
-  memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
+  memoryKK->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
 		      "atom:angle_type");
-  memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
 		      "atom:angle_atom1");
-  memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
 		      "atom:angle_atom2");
-  memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
 		      "atom:angle_atom3");
 
-  memory->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral");
-  memory->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax,
+  memoryKK->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral");
+  memoryKK->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_type");
-  memory->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom1");
-  memory->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom2");
-  memory->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom3");
-  memory->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom4");
 
-  memory->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper");
-  memory->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax,
+  memoryKK->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper");
+  memoryKK->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax,
                       atomKK->improper_per_atom,"atom:improper_type");
-  memory->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom1");
-  memory->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom2");
-  memory->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom3");
-  memory->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom4");
 
   grow_reset();
diff --git a/src/KOKKOS/atom_vec_hybrid_kokkos.cpp b/src/KOKKOS/atom_vec_hybrid_kokkos.cpp
index e5e361e70ab21645b67608f6d4f68ab07fb19900..b5aadb18d612cfbd30a6c3666fd85a3dfe489d82 100644
--- a/src/KOKKOS/atom_vec_hybrid_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_hybrid_kokkos.cpp
@@ -18,7 +18,7 @@
 #include "domain.h"
 #include "modify.h"
 #include "fix.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
diff --git a/src/KOKKOS/atom_vec_molecular_kokkos.cpp b/src/KOKKOS/atom_vec_molecular_kokkos.cpp
index dbf6a857b2521874ba7dca32a4cf374030c546e1..6f232a319b06238c95ff903706ad759228045c82 100644
--- a/src/KOKKOS/atom_vec_molecular_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_molecular_kokkos.cpp
@@ -19,7 +19,7 @@
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 
 using namespace LAMMPS_NS;
@@ -67,57 +67,57 @@ void AtomVecMolecularKokkos::grow(int n)
   sync(Device,ALL_MASK);
   modified(Device,ALL_MASK);
 
-  memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
-  memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
-  memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
-  memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
+  memoryKK->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
+  memoryKK->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
+  memoryKK->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
+  memoryKK->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
 
-  memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
-  memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
-  memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
+  memoryKK->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
+  memoryKK->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
+  memoryKK->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
 
-  memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
-  memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
-  memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
+  memoryKK->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
+  memoryKK->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
+  memoryKK->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
 		      "atom:special");
-  memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
-  memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
+  memoryKK->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
 		      "atom:bond_type");
-  memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
 		      "atom:bond_atom");
 
-  memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
-  memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
+  memoryKK->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
 		      "atom:angle_type");
-  memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
 		      "atom:angle_atom1");
-  memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
 		      "atom:angle_atom2");
-  memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
+  memoryKK->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
 		      "atom:angle_atom3");
 
-  memory->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral");
-  memory->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax,
+  memoryKK->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral");
+  memoryKK->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_type");
-  memory->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom1");
-  memory->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom2");
-  memory->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom3");
-  memory->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax,
+  memoryKK->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax,
                       atomKK->dihedral_per_atom,"atom:dihedral_atom4");
 
-  memory->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper");
-  memory->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax,
+  memoryKK->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper");
+  memoryKK->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax,
                       atomKK->improper_per_atom,"atom:improper_type");
-  memory->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom1");
-  memory->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom2");
-  memory->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom3");
-  memory->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax,
+  memoryKK->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax,
                       atomKK->improper_per_atom,"atom:improper_atom4");
 
   grow_reset();
diff --git a/src/KOKKOS/bond_class2_kokkos.cpp b/src/KOKKOS/bond_class2_kokkos.cpp
index b3c11c9a06c468be08f9ce2b2a29919c949ff475..df2f2c1e9be24a6d807ecf12e67c239735dde7f6 100644
--- a/src/KOKKOS/bond_class2_kokkos.cpp
+++ b/src/KOKKOS/bond_class2_kokkos.cpp
@@ -23,7 +23,7 @@
 #include "domain.h"
 #include "comm.h"
 #include "force.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -47,8 +47,8 @@ template<class DeviceType>
 BondClass2Kokkos<DeviceType>::~BondClass2Kokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -67,15 +67,15 @@ void BondClass2Kokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
   if (eflag_atom) {
     //if(k_eatom.dimension_0()<maxeatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_eatom,eatom);
-      memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
+      memoryKK->destroy_kokkos(k_eatom,eatom);
+      memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
       d_eatom = k_eatom.template view<DeviceType>();
     //}
   }
   if (vflag_atom) {
     //if(k_vatom.dimension_0()<maxvatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_vatom,vatom);
-      memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
+      memoryKK->destroy_kokkos(k_vatom,vatom);
+      memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
       d_vatom = k_vatom.template view<DeviceType>();
     //}
   }
diff --git a/src/KOKKOS/bond_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp
index 8a716a98ef534bfdcc3daf31696d01e1af22b071..20c20542083b35c289d8efdab2f3dce5adc95077 100644
--- a/src/KOKKOS/bond_fene_kokkos.cpp
+++ b/src/KOKKOS/bond_fene_kokkos.cpp
@@ -23,7 +23,7 @@
 #include "domain.h"
 #include "comm.h"
 #include "force.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -56,8 +56,8 @@ template<class DeviceType>
 BondFENEKokkos<DeviceType>::~BondFENEKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -75,13 +75,13 @@ void BondFENEKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"bond:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"bond:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"bond:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"bond:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/bond_harmonic_kokkos.cpp b/src/KOKKOS/bond_harmonic_kokkos.cpp
index da45c70d6c7739f08ad0fb559e6d9d7f768437c4..c4e0c3a81763e765ee593ba13b84c4b0fcec3616 100644
--- a/src/KOKKOS/bond_harmonic_kokkos.cpp
+++ b/src/KOKKOS/bond_harmonic_kokkos.cpp
@@ -23,7 +23,7 @@
 #include "domain.h"
 #include "comm.h"
 #include "force.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -48,8 +48,8 @@ template<class DeviceType>
 BondHarmonicKokkos<DeviceType>::~BondHarmonicKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -68,15 +68,15 @@ void BondHarmonicKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
   if (eflag_atom) {
     //if(k_eatom.dimension_0()<maxeatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_eatom,eatom);
-      memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
+      memoryKK->destroy_kokkos(k_eatom,eatom);
+      memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
       d_eatom = k_eatom.template view<DeviceType>();
     //}
   }
   if (vflag_atom) {
     //if(k_vatom.dimension_0()<maxvatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_vatom,vatom);
-      memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
+      memoryKK->destroy_kokkos(k_vatom,vatom);
+      memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
       d_vatom = k_vatom.template view<DeviceType>();
     //}
   }
diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp
index 5534341342d5017378169609dce1a0c5964d8338..e506fa1ad42c849d0b31b0e564a45842d6aa1cfe 100644
--- a/src/KOKKOS/comm_kokkos.cpp
+++ b/src/KOKKOS/comm_kokkos.cpp
@@ -20,7 +20,7 @@
 #include "domain.h"
 #include "atom_masks.h"
 #include "error.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "force.h"
 #include "pair.h"
 #include "fix.h"
@@ -28,6 +28,7 @@
 #include "dump.h"
 #include "output.h"
 #include "modify.h"
+#include "kokkos_base.h"
 
 using namespace LAMMPS_NS;
 
@@ -71,7 +72,7 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp)
   for (int i = 0; i < maxswap; i++) {
     maxsendlist[i] = BUFMIN;
   }
-  memory->create_kokkos(k_sendlist,sendlist,maxswap,BUFMIN,"comm:sendlist");
+  memoryKK->create_kokkos(k_sendlist,sendlist,maxswap,BUFMIN,"comm:sendlist");
 
   max_buf_pair = 0;
   k_buf_send_pair = DAT::tdual_xfloat_1d("comm:k_buf_send_pair",1);
@@ -82,11 +83,11 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp)
 
 CommKokkos::~CommKokkos()
 {
-  memory->destroy_kokkos(k_sendlist,sendlist);
+  memoryKK->destroy_kokkos(k_sendlist,sendlist);
   sendlist = NULL;
-  memory->destroy_kokkos(k_buf_send,buf_send);
+  memoryKK->destroy_kokkos(k_buf_send,buf_send);
   buf_send = NULL;
-  memory->destroy_kokkos(k_buf_recv,buf_recv);
+  memoryKK->destroy_kokkos(k_buf_recv,buf_recv);
   buf_recv = NULL;
 }
 
@@ -379,6 +380,7 @@ void CommKokkos::forward_comm_pair_device(Pair *pair)
   MPI_Request request;
 
   int nsize = pair->comm_forward;
+  KokkosBase* pairKKBase = dynamic_cast<KokkosBase*>(pair);
 
   for (iswap = 0; iswap < nswap; iswap++) {
     int n = MAX(max_buf_pair,nsize*sendnum[iswap]);
@@ -391,7 +393,7 @@ void CommKokkos::forward_comm_pair_device(Pair *pair)
 
     // pack buffer
 
-    n = pair->pack_forward_comm_kokkos(sendnum[iswap],k_sendlist,
+    n = pairKKBase->pack_forward_comm_kokkos(sendnum[iswap],k_sendlist,
                                        iswap,k_buf_send_pair,pbc_flag[iswap],pbc[iswap]);
 
     // exchange with another proc
@@ -408,7 +410,7 @@ void CommKokkos::forward_comm_pair_device(Pair *pair)
 
     // unpack buffer
 
-    pair->unpack_forward_comm_kokkos(recvnum[iswap],firstrecv[iswap],k_buf_recv_pair);
+    pairKKBase->unpack_forward_comm_kokkos(recvnum[iswap],firstrecv[iswap],k_buf_recv_pair);
   }
 }
 
@@ -1067,7 +1069,7 @@ void CommKokkos::grow_list(int iswap, int n)
     k_sendlist.modify<LMPHostType>();
   }
 
-  memory->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist");
+  memoryKK->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist");
 
   for(int i=0;i<maxswap;i++) {
     maxsendlist[i]=size; sendlist[i]=&k_sendlist.view<LMPHostType>()(i,0);
@@ -1095,7 +1097,7 @@ void CommKokkos::grow_swap(int n)
     k_sendlist.modify<LMPHostType>();
   }
 
-  memory->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist");
+  memoryKK->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist");
 
   memory->grow(maxsendlist,n,"comm:maxsendlist");
   for (int i=0;i<maxswap;i++) maxsendlist[i]=size;
diff --git a/src/KOKKOS/comm_tiled_kokkos.cpp b/src/KOKKOS/comm_tiled_kokkos.cpp
index adcc634aa1d766858c62e85a9ec6f7557d37da6c..33cd8eaa6e9eabc518a163d1ffbe68bbe0cffc30 100644
--- a/src/KOKKOS/comm_tiled_kokkos.cpp
+++ b/src/KOKKOS/comm_tiled_kokkos.cpp
@@ -25,7 +25,7 @@
 #include "compute.h"
 #include "output.h"
 #include "dump.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
diff --git a/src/KOKKOS/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp
index 7f2117c97f545021ca35172c62f9299adb9e8275..71635ec76c48d5642e7eccccef8d360c2077fc60 100644
--- a/src/KOKKOS/dihedral_charmm_kokkos.cpp
+++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp
@@ -25,7 +25,7 @@
 #include "force.h"
 #include "pair.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -56,8 +56,8 @@ template<class DeviceType>
 DihedralCharmmKokkos<DeviceType>::~DihedralCharmmKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -81,8 +81,8 @@ void DihedralCharmmKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
   if (eflag_atom) {
     //if(k_eatom.dimension_0()<maxeatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_eatom,eatom);
-      memory->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
+      memoryKK->destroy_kokkos(k_eatom,eatom);
+      memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
       d_eatom = k_eatom.template view<DeviceType>();
       k_eatom_pair = Kokkos::DualView<E_FLOAT*,Kokkos::LayoutRight,DeviceType>("dihedral:eatom_pair",maxeatom);
       d_eatom_pair = k_eatom.template view<DeviceType>();
@@ -90,8 +90,8 @@ void DihedralCharmmKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   }
   if (vflag_atom) {
     //if(k_vatom.dimension_0()<maxvatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_vatom,vatom);
-      memory->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom");
+      memoryKK->destroy_kokkos(k_vatom,vatom);
+      memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom");
       d_vatom = k_vatom.template view<DeviceType>();
       k_vatom_pair = Kokkos::DualView<F_FLOAT*[6],Kokkos::LayoutRight,DeviceType>("dihedral:vatom_pair",maxvatom);
       d_vatom_pair = k_vatom.template view<DeviceType>();
diff --git a/src/KOKKOS/dihedral_class2_kokkos.cpp b/src/KOKKOS/dihedral_class2_kokkos.cpp
index 89e42c6f836a1f3fa9e502875332bffb8bb4cd08..d32ea4a4611089808f31faf7756967f6572e0f94 100644
--- a/src/KOKKOS/dihedral_class2_kokkos.cpp
+++ b/src/KOKKOS/dihedral_class2_kokkos.cpp
@@ -24,7 +24,7 @@
 #include "domain.h"
 #include "force.h"
 #include "update.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -56,8 +56,8 @@ template<class DeviceType>
 DihedralClass2Kokkos<DeviceType>::~DihedralClass2Kokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -75,13 +75,13 @@ void DihedralClass2Kokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/dihedral_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp
index 0ee00ca8db438c2c47eba7443e93039295ab2f93..4349aff48df93848f097bd1130c758ec6be91951 100644
--- a/src/KOKKOS/dihedral_opls_kokkos.cpp
+++ b/src/KOKKOS/dihedral_opls_kokkos.cpp
@@ -24,7 +24,7 @@
 #include "domain.h"
 #include "force.h"
 #include "update.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -56,8 +56,8 @@ template<class DeviceType>
 DihedralOPLSKokkos<DeviceType>::~DihedralOPLSKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -75,13 +75,13 @@ void DihedralOPLSKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"dihedral:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/fix_eos_table_rx_kokkos.cpp b/src/KOKKOS/fix_eos_table_rx_kokkos.cpp
index 552141ced24f50d68108d372405c5cb82da03360..5c106c19f3432edcc5a432d96031b12270bb39bb 100644
--- a/src/KOKKOS/fix_eos_table_rx_kokkos.cpp
+++ b/src/KOKKOS/fix_eos_table_rx_kokkos.cpp
@@ -21,7 +21,7 @@
 #include "atom_kokkos.h"
 #include "error.h"
 #include "force.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "comm.h"
 #include <math.h>
 #include "modify.h"
@@ -517,14 +517,14 @@ void FixEOStableRXKokkos<DeviceType>::create_kokkos_tables()
 {
   const int tlm1 = tablength-1;
 
-  memory->create_kokkos(d_table->lo,h_table->lo,ntables,"Table::lo");
-  memory->create_kokkos(d_table->hi,h_table->hi,ntables,"Table::hi");
-  memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
+  memoryKK->create_kokkos(d_table->lo,h_table->lo,ntables,"Table::lo");
+  memoryKK->create_kokkos(d_table->hi,h_table->hi,ntables,"Table::hi");
+  memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
 
   if(tabstyle == LINEAR) {
-    memory->create_kokkos(d_table->r,h_table->r,ntables,tablength,"Table::r");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
-    memory->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
+    memoryKK->create_kokkos(d_table->r,h_table->r,ntables,tablength,"Table::r");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
+    memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
   }
 
   for(int i=0; i < ntables; i++) {
diff --git a/src/KOKKOS/fix_langevin_kokkos.cpp b/src/KOKKOS/fix_langevin_kokkos.cpp
index fb0f329a91bb398bad243493e9d834ac3ab1aa8d..108c3b692ad7f4fcb176a407a558c5dca3685ca8 100644
--- a/src/KOKKOS/fix_langevin_kokkos.cpp
+++ b/src/KOKKOS/fix_langevin_kokkos.cpp
@@ -21,7 +21,7 @@
 #include "update.h"
 #include "respa.h"
 #include "error.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "group.h"
 #include "random_mars.h"
 #include "compute.h"
@@ -49,9 +49,9 @@ FixLangevinKokkos<DeviceType>::FixLangevinKokkos(LAMMPS *lmp, int narg, char **a
   int ntypes = atomKK->ntypes;
 
   // allocate per-type arrays for force prefactors
-  memory->create_kokkos(k_gfactor1,gfactor1,ntypes+1,"langevin:gfactor1");
-  memory->create_kokkos(k_gfactor2,gfactor2,ntypes+1,"langevin:gfactor2");
-  memory->create_kokkos(k_ratio,ratio,ntypes+1,"langevin:ratio");
+  memoryKK->create_kokkos(k_gfactor1,gfactor1,ntypes+1,"langevin:gfactor1");
+  memoryKK->create_kokkos(k_gfactor2,gfactor2,ntypes+1,"langevin:gfactor2");
+  memoryKK->create_kokkos(k_ratio,ratio,ntypes+1,"langevin:ratio");
   d_gfactor1 = k_gfactor1.template view<DeviceType>();
   h_gfactor1 = k_gfactor1.template view<LMPHostType>();
   d_gfactor2 = k_gfactor2.template view<DeviceType>();
@@ -92,12 +92,12 @@ FixLangevinKokkos<DeviceType>::FixLangevinKokkos(LAMMPS *lmp, int narg, char **a
 template<class DeviceType>
 FixLangevinKokkos<DeviceType>::~FixLangevinKokkos()
 {
-  memory->destroy_kokkos(k_gfactor1,gfactor1);
-  memory->destroy_kokkos(k_gfactor2,gfactor2);
-  memory->destroy_kokkos(k_ratio,ratio);
-  memory->destroy_kokkos(k_flangevin,flangevin);
-  if(gjfflag) memory->destroy_kokkos(k_franprev,franprev);
-  memory->destroy_kokkos(k_tforce,tforce);
+  memoryKK->destroy_kokkos(k_gfactor1,gfactor1);
+  memoryKK->destroy_kokkos(k_gfactor2,gfactor2);
+  memoryKK->destroy_kokkos(k_ratio,ratio);
+  memoryKK->destroy_kokkos(k_flangevin,flangevin);
+  if(gjfflag) memoryKK->destroy_kokkos(k_franprev,franprev);
+  memoryKK->destroy_kokkos(k_tforce,tforce);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -121,7 +121,7 @@ void FixLangevinKokkos<DeviceType>::init()
 template<class DeviceType>
 void FixLangevinKokkos<DeviceType>::grow_arrays(int nmax)
 {
-  memory->grow_kokkos(k_franprev,franprev,nmax,3,"langevin:franprev");
+  memoryKK->grow_kokkos(k_franprev,franprev,nmax,3,"langevin:franprev");
   d_franprev = k_franprev.template view<DeviceType>();
   h_franprev = k_franprev.template view<LMPHostType>();
 }
@@ -167,9 +167,9 @@ void FixLangevinKokkos<DeviceType>::post_force(int vflag)
   // reallocate flangevin if necessary
   if (tallyflag) {
     if (nlocal > maxatom1) {
-      memory->destroy_kokkos(k_flangevin,flangevin);
+      memoryKK->destroy_kokkos(k_flangevin,flangevin);
       maxatom1 = atomKK->nmax;
-      memory->create_kokkos(k_flangevin,flangevin,maxatom1,3,"langevin:flangevin");
+      memoryKK->create_kokkos(k_flangevin,flangevin,maxatom1,3,"langevin:flangevin");
       d_flangevin = k_flangevin.template view<DeviceType>();
       h_flangevin = k_flangevin.template view<LMPHostType>();
     }
@@ -671,8 +671,8 @@ void FixLangevinKokkos<DeviceType>::compute_target()
     } else {
       if (atom->nmax > maxatom2) {
         maxatom2 = atom->nmax;
-        memory->destroy_kokkos(k_tforce,tforce);
-        memory->create_kokkos(k_tforce,tforce,maxatom2,"langevin:tforce");
+        memoryKK->destroy_kokkos(k_tforce,tforce);
+        memoryKK->create_kokkos(k_tforce,tforce,maxatom2,"langevin:tforce");
         d_tforce = k_tforce.template view<DeviceType>();
         h_tforce = k_tforce.template view<LMPHostType>();
       }
diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp
index 7136c776a1de7e39d670fa53c69945f8f1d15b3f..345259e35519b24a6b6b669c175fc9e5bdeaf746 100644
--- a/src/KOKKOS/fix_nh_kokkos.cpp
+++ b/src/KOKKOS/fix_nh_kokkos.cpp
@@ -33,7 +33,7 @@
 #include "update.h"
 #include "respa.h"
 #include "domain_kokkos.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 #include "atom_kokkos.h"
diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp
index cb52988c318fcbd147a534ac16d2ea5494f5f63d..fe2f101e561f1dca37852084d6be56a6896f8b2d 100644
--- a/src/KOKKOS/fix_property_atom_kokkos.cpp
+++ b/src/KOKKOS/fix_property_atom_kokkos.cpp
@@ -16,7 +16,7 @@
 #include "fix_property_atom_kokkos.h"
 #include "atom_kokkos.h"
 #include "comm.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "update.h"
 
@@ -60,7 +60,7 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax)
       size_t nbytes = (nmax-nmax_old) * sizeof(int);
       memset(&atom->ivector[index[m]][nmax_old],0,nbytes);
     } else if (style[m] == DOUBLE) {
-      memory->grow_kokkos(atomKK->k_dvector,atomKK->dvector,atomKK->k_dvector.dimension_0(),nmax,
+      memoryKK->grow_kokkos(atomKK->k_dvector,atomKK->dvector,atomKK->k_dvector.dimension_0(),nmax,
                           "atom:dvector");
       //memory->grow(atom->dvector[index[m]],nmax,"atom:dvector");
       //size_t nbytes = (nmax-nmax_old) * sizeof(double);
diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp
index 5d2f6a0438a400302785c70975beee07d4d4f32b..91a22361fc91b4371eb7c7638e4fdb1b9c229d46 100644
--- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp
+++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp
@@ -35,7 +35,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "pair_reaxc_kokkos.h"
 
diff --git a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp b/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp
index 0d74a49ed304498a5f11d55133898a4565e56002..586daadd55e64c3922f52ee16faa454f7b723da5 100644
--- a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp
+++ b/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "compute.h"
 #include "input.h"
 #include "variable.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "reaxc_list.h"
 #include "reaxc_types.h"
@@ -95,7 +95,7 @@ void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint ntimestep, FILE *fp)
   MPI_Allreduce(&nlocal,&nlocal_max,1,MPI_INT,MPI_MAX,world);
 
   nbuf = 1+(numbonds_max*2+10)*nlocal_max;
-  memory->create_kokkos(k_buf,buf,nbuf,"reax/c/bonds:buf");
+  memoryKK->create_kokkos(k_buf,buf,nbuf,"reax/c/bonds:buf");
 
   // Pass information to buffer
   if (reaxc->execution_space == Device)
@@ -107,7 +107,7 @@ void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint ntimestep, FILE *fp)
   // Receive information from buffer for output
   RecvBuffer(buf, nbuf, nbuf_local, nlocal_tot, numbonds_max);
 
-  memory->destroy_kokkos(k_buf,buf);
+  memoryKK->destroy_kokkos(k_buf,buf);
 }
 
 /* ---------------------------------------------------------------------- */
diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.cpp b/src/KOKKOS/fix_reaxc_species_kokkos.cpp
index f2719f9f0e7048a6db47bf49dfd09979a6f5074b..a676c7ef27ae81cf7ec39e8467e7ecdceb816e06 100644
--- a/src/KOKKOS/fix_reaxc_species_kokkos.cpp
+++ b/src/KOKKOS/fix_reaxc_species_kokkos.cpp
@@ -33,7 +33,7 @@
 #include "compute.h"
 #include "input.h"
 #include "variable.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "reaxc_list.h"
 #include "atom_masks.h"
diff --git a/src/KOKKOS/fix_rx_kokkos.cpp b/src/KOKKOS/fix_rx_kokkos.cpp
index b1cfd20be23f57a25981e151a5098c0b43b13ae6..61290ece33dfb72c50dc787542e4cea50fe5a077 100644
--- a/src/KOKKOS/fix_rx_kokkos.cpp
+++ b/src/KOKKOS/fix_rx_kokkos.cpp
@@ -17,7 +17,7 @@
 #include "atom_masks.h"
 #include "atom_kokkos.h"
 #include "force.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "update.h"
 #include "respa.h"
 #include "modify.h"
@@ -26,6 +26,9 @@
 #include "neigh_request.h"
 #include "error.h"
 #include "math_special_kokkos.h"
+#include "comm.h"
+#include "domain.h"
+#include "kokkos.h"
 
 #include <float.h> // DBL_EPSILON
 
@@ -81,15 +84,15 @@ FixRxKokkos<DeviceType>::~FixRxKokkos()
   if (copymode) return;
 
   if (localTempFlag)
-    memory->destroy_kokkos(k_dpdThetaLocal, dpdThetaLocal);
+    memoryKK->destroy_kokkos(k_dpdThetaLocal, dpdThetaLocal);
 
-  memory->destroy_kokkos(k_sumWeights, sumWeights);
-  //memory->destroy_kokkos(k_sumWeights);
+  memoryKK->destroy_kokkos(k_sumWeights, sumWeights);
+  //memoryKK->destroy_kokkos(k_sumWeights);
 
   //delete [] scratchSpace;
-  memory->destroy_kokkos(d_scratchSpace);
+  memoryKK->destroy_kokkos(d_scratchSpace);
 
-  memory->destroy_kokkos(k_cutsq);
+  memoryKK->destroy_kokkos(k_cutsq);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -1233,9 +1236,9 @@ void FixRxKokkos<DeviceType>::create_kinetics_data(void)
 {
   //printf("Inside FixRxKokkos::create_kinetics_data\n");
 
-  memory->create_kokkos( d_kineticsData.Arr, h_kineticsData.Arr, nreactions, "KineticsType::Arr");
-  memory->create_kokkos( d_kineticsData.nArr, h_kineticsData.nArr, nreactions, "KineticsType::nArr");
-  memory->create_kokkos( d_kineticsData.Ea, h_kineticsData.Ea, nreactions, "KineticsType::Ea");
+  memoryKK->create_kokkos( d_kineticsData.Arr, h_kineticsData.Arr, nreactions, "KineticsType::Arr");
+  memoryKK->create_kokkos( d_kineticsData.nArr, h_kineticsData.nArr, nreactions, "KineticsType::nArr");
+  memoryKK->create_kokkos( d_kineticsData.Ea, h_kineticsData.Ea, nreactions, "KineticsType::Ea");
 
   for (int i = 0; i < nreactions; ++i)
   {
@@ -1251,8 +1254,8 @@ void FixRxKokkos<DeviceType>::create_kinetics_data(void)
   if (useSparseKinetics)
   {
 
-    memory->create_kokkos( d_kineticsData.nu , h_kineticsData.nu , nreactions, sparseKinetics_maxSpecies, "KineticsType::nu");
-    memory->create_kokkos( d_kineticsData.nuk, h_kineticsData.nuk, nreactions, sparseKinetics_maxSpecies, "KineticsType::nuk");
+    memoryKK->create_kokkos( d_kineticsData.nu , h_kineticsData.nu , nreactions, sparseKinetics_maxSpecies, "KineticsType::nu");
+    memoryKK->create_kokkos( d_kineticsData.nuk, h_kineticsData.nuk, nreactions, sparseKinetics_maxSpecies, "KineticsType::nuk");
 
     for (int i = 0; i < nreactions; ++i)
       for (int k = 0; k < sparseKinetics_maxSpecies; ++k)
@@ -1266,8 +1269,8 @@ void FixRxKokkos<DeviceType>::create_kinetics_data(void)
 
     if (SparseKinetics_enableIntegralReactions)
     {
-      memory->create_kokkos( d_kineticsData.inu, h_kineticsData.inu, nreactions, sparseKinetics_maxSpecies, "KineticsType::inu");
-      memory->create_kokkos( d_kineticsData.isIntegral, h_kineticsData.isIntegral, nreactions, "KineticsType::isIntegral");
+      memoryKK->create_kokkos( d_kineticsData.inu, h_kineticsData.inu, nreactions, sparseKinetics_maxSpecies, "KineticsType::inu");
+      memoryKK->create_kokkos( d_kineticsData.isIntegral, h_kineticsData.isIntegral, nreactions, "KineticsType::isIntegral");
 
       for (int i = 0; i < nreactions; ++i)
       {
@@ -1286,9 +1289,9 @@ void FixRxKokkos<DeviceType>::create_kinetics_data(void)
   //{
 
     // Dense option
-    memory->create_kokkos( d_kineticsData.stoich, h_kineticsData.stoich, nreactions, nspecies, "KineticsType::stoich");
-    memory->create_kokkos( d_kineticsData.stoichReactants, h_kineticsData.stoichReactants, nreactions, nspecies, "KineticsType::stoichReactants");
-    memory->create_kokkos( d_kineticsData.stoichProducts, h_kineticsData.stoichProducts, nreactions, nspecies, "KineticsType::stoichProducts");
+    memoryKK->create_kokkos( d_kineticsData.stoich, h_kineticsData.stoich, nreactions, nspecies, "KineticsType::stoich");
+    memoryKK->create_kokkos( d_kineticsData.stoichReactants, h_kineticsData.stoichReactants, nreactions, nspecies, "KineticsType::stoichReactants");
+    memoryKK->create_kokkos( d_kineticsData.stoichProducts, h_kineticsData.stoichProducts, nreactions, nspecies, "KineticsType::stoichProducts");
 
     for (int i = 0; i < nreactions; ++i)
       for (int k = 0; k < nspecies; ++k)
@@ -1445,8 +1448,8 @@ void FixRxKokkos<DeviceType>::solve_reactions(const int vflag, const bool isPreF
     const int count = nlocal + (newton_pair ? nghost : 0);
 
     if (count > k_dpdThetaLocal.template view<DeviceType>().dimension_0()) {
-      memory->destroy_kokkos (k_dpdThetaLocal, dpdThetaLocal);
-      memory->create_kokkos (k_dpdThetaLocal, dpdThetaLocal, count, "FixRxKokkos::dpdThetaLocal");
+      memoryKK->destroy_kokkos (k_dpdThetaLocal, dpdThetaLocal);
+      memoryKK->create_kokkos (k_dpdThetaLocal, dpdThetaLocal, count, "FixRxKokkos::dpdThetaLocal");
       this->d_dpdThetaLocal = k_dpdThetaLocal.template view<DeviceType>();
       this->h_dpdThetaLocal = k_dpdThetaLocal.h_view;
     }
@@ -1511,8 +1514,8 @@ void FixRxKokkos<DeviceType>::solve_reactions(const int vflag, const bool isPreF
 
   if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency == 1)
   {
-    memory->create_kokkos (k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps, nlocal, "FixRxKokkos::diagnosticCounterPerODEnSteps");
-    memory->create_kokkos (k_diagnosticCounterPerODEnFuncs, diagnosticCounterPerODEnFuncs, nlocal, "FixRxKokkos::diagnosticCounterPerODEnFuncs");
+    memoryKK->create_kokkos (k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps, nlocal, "FixRxKokkos::diagnosticCounterPerODEnSteps");
+    memoryKK->create_kokkos (k_diagnosticCounterPerODEnFuncs, diagnosticCounterPerODEnFuncs, nlocal, "FixRxKokkos::diagnosticCounterPerODEnFuncs");
 
     d_diagnosticCounterPerODEnSteps = k_diagnosticCounterPerODEnSteps.template view<DeviceType>();
     d_diagnosticCounterPerODEnFuncs = k_diagnosticCounterPerODEnFuncs.template view<DeviceType>();
@@ -1542,8 +1545,8 @@ void FixRxKokkos<DeviceType>::solve_reactions(const int vflag, const bool isPreF
 
   //typename ArrayTypes<DeviceType>::t_double_1d d_scratchSpace("d_scratchSpace", scratchSpaceSize * nlocal);
   if (nlocal*scratchSpaceSize > d_scratchSpace.dimension_0()) {
-    memory->destroy_kokkos (d_scratchSpace);
-    memory->create_kokkos (d_scratchSpace, nlocal*scratchSpaceSize, "FixRxKokkos::d_scratchSpace");
+    memoryKK->destroy_kokkos (d_scratchSpace);
+    memoryKK->create_kokkos (d_scratchSpace, nlocal*scratchSpaceSize, "FixRxKokkos::d_scratchSpace");
   }
 
 #if 0
@@ -1811,8 +1814,8 @@ void FixRxKokkos<DeviceType>::odeDiagnostics(void)
         my_min[FuncSum] = std::min( my_min[FuncSum], (double)nFuncs );
       }
 
-    memory->destroy_kokkos( k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps );
-    memory->destroy_kokkos( k_diagnosticCounterPerODEnFuncs, diagnosticCounterPerODEnFuncs );
+    memoryKK->destroy_kokkos( k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps );
+    memoryKK->destroy_kokkos( k_diagnosticCounterPerODEnFuncs, diagnosticCounterPerODEnFuncs );
 
     MPI_Reduce (my_sum_sq, sum_sq, 2*numCounters, MPI_DOUBLE, MPI_SUM, 0, world);
 
@@ -2022,10 +2025,10 @@ void FixRxKokkos<DeviceType>::computeLocalTemperature()
   {
     const int ntypes = atom->ntypes;
 
-    //memory->create_kokkos (k_cutsq, h_cutsq, ntypes+1, ntypes+1, "pair:cutsq");
+    //memoryKK->create_kokkos (k_cutsq, h_cutsq, ntypes+1, ntypes+1, "pair:cutsq");
     if (ntypes+1 > k_cutsq.dimension_0()) {
-      memory->destroy_kokkos (k_cutsq);
-      memory->create_kokkos (k_cutsq, ntypes+1, ntypes+1, "FixRxKokkos::k_cutsq");
+      memoryKK->destroy_kokkos (k_cutsq);
+      memoryKK->create_kokkos (k_cutsq, ntypes+1, ntypes+1, "FixRxKokkos::k_cutsq");
       d_cutsq = k_cutsq.template view<DeviceType>();
     }
 
@@ -2043,10 +2046,10 @@ void FixRxKokkos<DeviceType>::computeLocalTemperature()
   // Initialize the local temperature weight array
   int sumWeightsCt = nlocal + (NEWTON_PAIR ? nghost : 0);
 
-  //memory->create_kokkos (k_sumWeights, sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights");
+  //memoryKK->create_kokkos (k_sumWeights, sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights");
   if (sumWeightsCt > k_sumWeights.template view<DeviceType>().dimension_0()) {
-    memory->destroy_kokkos(k_sumWeights, sumWeights);
-    memory->create_kokkos (k_sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights");
+    memoryKK->destroy_kokkos(k_sumWeights, sumWeights);
+    memoryKK->create_kokkos (k_sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights");
     d_sumWeights = k_sumWeights.template view<DeviceType>();
     h_sumWeights = k_sumWeights.h_view;
   }
diff --git a/src/KOKKOS/fix_setforce_kokkos.cpp b/src/KOKKOS/fix_setforce_kokkos.cpp
index 2ef04ad6ee3285534ab1f36a26842641fcf5802c..e99160989497381ef63985fad512ec3e2d3af664 100644
--- a/src/KOKKOS/fix_setforce_kokkos.cpp
+++ b/src/KOKKOS/fix_setforce_kokkos.cpp
@@ -22,10 +22,11 @@
 #include "respa.h"
 #include "input.h"
 #include "variable.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "force.h"
 #include "atom_masks.h"
+#include "kokkos_base.h"
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
@@ -45,7 +46,7 @@ FixSetForceKokkos<DeviceType>::FixSetForceKokkos(LAMMPS *lmp, int narg, char **a
   datamask_modify = EMPTY_MASK;
 
   memory->destroy(sforce);
-  memory->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce");
+  memoryKK->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce");
 }
 
 /* ---------------------------------------------------------------------- */
@@ -55,7 +56,7 @@ FixSetForceKokkos<DeviceType>::~FixSetForceKokkos()
 {
   if (copymode) return;
 
-  memory->destroy_kokkos(k_sforce,sforce);
+  memoryKK->destroy_kokkos(k_sforce,sforce);
   sforce = NULL;
 }
 
@@ -90,7 +91,8 @@ void FixSetForceKokkos<DeviceType>::post_force(int vflag)
     region = domain->regions[iregion];
     region->prematch();
     DAT::tdual_int_1d k_match = DAT::tdual_int_1d("setforce:k_match",nlocal);
-    region->match_all_kokkos(groupbit,k_match);
+    KokkosBase* regionKKBase = dynamic_cast<KokkosBase*>(region);
+    regionKKBase->match_all_kokkos(groupbit,k_match);
     k_match.template sync<DeviceType>();
     d_match = k_match.template view<DeviceType>();
   }
@@ -99,8 +101,8 @@ void FixSetForceKokkos<DeviceType>::post_force(int vflag)
 
   if (varflag == ATOM && atom->nmax > maxatom) {
     maxatom = atom->nmax;
-    memory->destroy_kokkos(k_sforce,sforce);
-    memory->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce");
+    memoryKK->destroy_kokkos(k_sforce,sforce);
+    memoryKK->create_kokkos(k_sforce,sforce,maxatom,3,"setforce:sforce");
   }
 
   foriginal[0] = foriginal[1] = foriginal[2] = 0.0;
diff --git a/src/KOKKOS/fix_shardlow_kokkos.cpp b/src/KOKKOS/fix_shardlow_kokkos.cpp
index 98bbb02714ca454b01e4ac3b65351b3d029ac06e..cc1bd6bede9fabe94f270464cd1ead9558ecad8e 100644
--- a/src/KOKKOS/fix_shardlow_kokkos.cpp
+++ b/src/KOKKOS/fix_shardlow_kokkos.cpp
@@ -50,7 +50,7 @@
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "domain.h"
 #include "modify.h"
 // #include "pair_dpd_fdt.h"
diff --git a/src/KOKKOS/gridcomm_kokkos.cpp b/src/KOKKOS/gridcomm_kokkos.cpp
index 6871ef67aee6464b442e67e21dc0776e486d5a43..fdfaf296ef335f30654c1aea300db1102dfca772 100644
--- a/src/KOKKOS/gridcomm_kokkos.cpp
+++ b/src/KOKKOS/gridcomm_kokkos.cpp
@@ -15,8 +15,9 @@
 #include "gridcomm_kokkos.h"
 #include "comm.h"
 #include "kspace.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
+#include "kokkos_base.h"
 
 using namespace LAMMPS_NS;
 
@@ -126,8 +127,8 @@ template<class DeviceType>
 GridCommKokkos<DeviceType>::~GridCommKokkos()
 {
   for (int i = 0; i < nswap; i++) {
-    //memory->destroy_kokkos(swap[i].k_packlist,swap[i].packlist);
-    //memory->destroy_kokkos(swap[i].k_unpacklist,swap[i].unpacklist);
+    //memoryKK->destroy_kokkos(swap[i].k_packlist,swap[i].packlist);
+    //memoryKK->destroy_kokkos(swap[i].k_unpacklist,swap[i].unpacklist);
   }
   memory->sfree(swap);
 
@@ -515,11 +516,13 @@ void GridCommKokkos<DeviceType>::forward_comm(KSpace *kspace, int which)
   k_packlist.sync<DeviceType>();
   k_unpacklist.sync<DeviceType>();
 
+  KokkosBase* kspaceKKBase = dynamic_cast<KokkosBase*>(kspace);
+
   for (int m = 0; m < nswap; m++) {
     if (swap[m].sendproc == me)
-      kspace->pack_forward_kokkos(which,k_buf2,swap[m].npack,k_packlist,m);
+      kspaceKKBase->pack_forward_kspace_kokkos(which,k_buf2,swap[m].npack,k_packlist,m);
     else
-      kspace->pack_forward_kokkos(which,k_buf1,swap[m].npack,k_packlist,m);
+      kspaceKKBase->pack_forward_kspace_kokkos(which,k_buf1,swap[m].npack,k_packlist,m);
 
     if (swap[m].sendproc != me) {
       MPI_Irecv(k_buf2.view<DeviceType>().ptr_on_device(),nforward*swap[m].nunpack,MPI_FFT_SCALAR,
@@ -529,7 +532,7 @@ void GridCommKokkos<DeviceType>::forward_comm(KSpace *kspace, int which)
       MPI_Wait(&request,MPI_STATUS_IGNORE);
     }
 
-    kspace->unpack_forward_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m);
+    kspaceKKBase->unpack_forward_kspace_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m);
   }
 }
 
@@ -544,11 +547,13 @@ void GridCommKokkos<DeviceType>::reverse_comm(KSpace *kspace, int which)
   k_packlist.sync<DeviceType>();
   k_unpacklist.sync<DeviceType>();
 
+  KokkosBase* kspaceKKBase = dynamic_cast<KokkosBase*>(kspace);
+
   for (int m = nswap-1; m >= 0; m--) {
     if (swap[m].recvproc == me)
-      kspace->pack_reverse_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m);
+      kspaceKKBase->pack_reverse_kspace_kokkos(which,k_buf2,swap[m].nunpack,k_unpacklist,m);
     else
-      kspace->pack_reverse_kokkos(which,k_buf1,swap[m].nunpack,k_unpacklist,m);
+      kspaceKKBase->pack_reverse_kspace_kokkos(which,k_buf1,swap[m].nunpack,k_unpacklist,m);
 
     if (swap[m].recvproc != me) {
       MPI_Irecv(k_buf2.view<DeviceType>().ptr_on_device(),nreverse*swap[m].npack,MPI_FFT_SCALAR,
@@ -558,7 +563,7 @@ void GridCommKokkos<DeviceType>::reverse_comm(KSpace *kspace, int which)
       MPI_Wait(&request,MPI_STATUS_IGNORE);
     }
 
-    kspace->unpack_reverse_kokkos(which,k_buf2,swap[m].npack,k_packlist,m);
+    kspaceKKBase->unpack_reverse_kspace_kokkos(which,k_buf2,swap[m].npack,k_packlist,m);
   }
 }
 
diff --git a/src/KOKKOS/improper_class2_kokkos.cpp b/src/KOKKOS/improper_class2_kokkos.cpp
index c2cb7dfe2bf55df1f64988abe60a152d42984654..d2d465a250f1ff97bfd4668fe26eec489f62f850 100644
--- a/src/KOKKOS/improper_class2_kokkos.cpp
+++ b/src/KOKKOS/improper_class2_kokkos.cpp
@@ -26,7 +26,7 @@
 #include "force.h"
 #include "update.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -58,8 +58,8 @@ template<class DeviceType>
 ImproperClass2Kokkos<DeviceType>::~ImproperClass2Kokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -78,15 +78,15 @@ void ImproperClass2Kokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
   if (eflag_atom) {
     //if(k_eatom.dimension_0()<maxeatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_eatom,eatom);
-      memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
+      memoryKK->destroy_kokkos(k_eatom,eatom);
+      memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
       d_eatom = k_eatom.template view<DeviceType>();
     //}
   }
   if (vflag_atom) {
     //if(k_vatom.dimension_0()<maxvatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_vatom,vatom);
-      memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
+      memoryKK->destroy_kokkos(k_vatom,vatom);
+      memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
       d_vatom = k_vatom.template view<DeviceType>();
     //}
   }
diff --git a/src/KOKKOS/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp
index 73e105864f630b0516ac90ba41058cf101878bea..49dd36ed194da6ea94df99144f75602ed11af5ea 100644
--- a/src/KOKKOS/improper_harmonic_kokkos.cpp
+++ b/src/KOKKOS/improper_harmonic_kokkos.cpp
@@ -26,7 +26,7 @@
 #include "force.h"
 #include "update.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -58,8 +58,8 @@ template<class DeviceType>
 ImproperHarmonicKokkos<DeviceType>::~ImproperHarmonicKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -78,15 +78,15 @@ void ImproperHarmonicKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
   if (eflag_atom) {
     //if(k_eatom.dimension_0()<maxeatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_eatom,eatom);
-      memory->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
+      memoryKK->destroy_kokkos(k_eatom,eatom);
+      memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"improper:eatom");
       d_eatom = k_eatom.template view<DeviceType>();
     //}
   }
   if (vflag_atom) {
     //if(k_vatom.dimension_0()<maxvatom) { // won't work without adding zero functor
-      memory->destroy_kokkos(k_vatom,vatom);
-      memory->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
+      memoryKK->destroy_kokkos(k_vatom,vatom);
+      memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"improper:vatom");
       d_vatom = k_vatom.template view<DeviceType>();
     //}
   }
diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp
index 2b02624dcef30f29947183cb4f2a5acb68916779..5a742233534403a48b99ca12eae8f8873583401f 100644
--- a/src/KOKKOS/kokkos.cpp
+++ b/src/KOKKOS/kokkos.cpp
@@ -23,6 +23,7 @@
 #include "neighbor_kokkos.h"
 #include "neigh_list_kokkos.h"
 #include "error.h"
+#include "memory_kokkos.h"
 
 using namespace LAMMPS_NS;
 
@@ -33,6 +34,10 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
   kokkos_exists = 1;
   lmp->kokkos = this;
 
+  delete memory;
+  memory = new MemoryKokkos(lmp);
+  memoryKK = (MemoryKokkos*) memory;
+
   auto_sync = 1;
 
   int me = 0;
diff --git a/src/KOKKOS/kokkos_base.h b/src/KOKKOS/kokkos_base.h
new file mode 100644
index 0000000000000000000000000000000000000000..3279cb2947272022704036cbd51ddcb10ff788ef
--- /dev/null
+++ b/src/KOKKOS/kokkos_base.h
@@ -0,0 +1,47 @@
+/* ----------------------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+#ifndef KOKKOS_BASE_H
+#define KOKKOS_BASE_H
+
+#include "kokkos_type.h"
+
+namespace LAMMPS_NS {
+
+class KokkosBase {
+ public:
+  KokkosBase() {}
+
+  //Kspace
+  virtual void pack_forward_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
+  virtual void unpack_forward_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
+  virtual void pack_reverse_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
+  virtual void unpack_reverse_kspace_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
+
+  // Pair
+  virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, 
+                                       int, DAT::tdual_xfloat_1d &, 
+                                       int, int *) {return 0;};
+  virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d &) {}
+
+  // Region
+  virtual void match_all_kokkos(int, DAT::tdual_int_1d) {}
+};
+
+}
+
+#endif
+
+/* ERROR/WARNING messages:
+
+*/
diff --git a/src/KOKKOS/memory_kokkos.h b/src/KOKKOS/memory_kokkos.h
index 8ade198c4056727f78b620300b72783f15375431..9f930faae2e4f973a0849064a585888e29a8483f 100644
--- a/src/KOKKOS/memory_kokkos.h
+++ b/src/KOKKOS/memory_kokkos.h
@@ -11,6 +11,18 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#ifndef LMP_MEMORY_KOKKOS_H
+#define LMP_MEMORY_KOKKOS_H
+
+#include "memory.h"
+#include "kokkos_type.h"
+
+namespace LAMMPS_NS {
+
+class MemoryKokkos : public Memory {
+ public:
+  MemoryKokkos(class LAMMPS *lmp) : Memory(lmp) {}
+
 /* ----------------------------------------------------------------------
    Kokkos versions of create/grow/destroy multi-dimensional arrays
 ------------------------------------------------------------------------- */
@@ -279,3 +291,10 @@ void destroy_kokkos(TYPE data, typename TYPE::value_type** &array)
   sfree(array);
   array = NULL;
 }
+
+};
+
+}
+
+#endif
+
diff --git a/src/KOKKOS/nbin_ssa_kokkos.cpp b/src/KOKKOS/nbin_ssa_kokkos.cpp
index ab97cb584805b6328df67cfe954d02ba44fc3907..1a881658567524b181bbeb52af3b97a17246fc12 100644
--- a/src/KOKKOS/nbin_ssa_kokkos.cpp
+++ b/src/KOKKOS/nbin_ssa_kokkos.cpp
@@ -26,7 +26,7 @@
 #include "error.h"
 #include "atom_masks.h"
 
-// #include "memory.h"
+// #include "memory_kokkos.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/KOKKOS/neigh_bond_kokkos.cpp b/src/KOKKOS/neigh_bond_kokkos.cpp
index a674e7cec48a0e16ff9aa91f36ec85c53b23c0a5..3ecc8b5e516c8243a36a668fcdceb7b434e7145c 100644
--- a/src/KOKKOS/neigh_bond_kokkos.cpp
+++ b/src/KOKKOS/neigh_bond_kokkos.cpp
@@ -24,7 +24,7 @@
 #include "domain_kokkos.h"
 #include "output.h"
 #include "thermo.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "modify.h"
 #include "fix.h"
@@ -80,27 +80,27 @@ void NeighBondKokkos<DeviceType>::init_topology_kk() {
   if (atom->molecular && atom->nbonds && maxbond == 0) {
     if (nprocs == 1) maxbond = atom->nbonds;
     else maxbond = static_cast<int> (LB_FACTOR * atom->nbonds / nprocs);
-    memory->create_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neigh:neighbor->bondlist");
+    memoryKK->create_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neigh:neighbor->bondlist");
   }
 
   if (atom->molecular && atom->nangles && maxangle == 0) {
     if (nprocs == 1) maxangle = atom->nangles;
     else maxangle = static_cast<int> (LB_FACTOR * atom->nangles / nprocs);
-    memory->create_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neigh:neighbor->anglelist");
+    memoryKK->create_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neigh:neighbor->anglelist");
   }
 
   if (atom->molecular && atom->ndihedrals && maxdihedral == 0) {
     if (nprocs == 1) maxdihedral = atom->ndihedrals;
     else maxdihedral = static_cast<int>
            (LB_FACTOR * atom->ndihedrals / nprocs);
-    memory->create_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neigh:neighbor->dihedrallist");
+    memoryKK->create_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neigh:neighbor->dihedrallist");
   }
 
   if (atom->molecular && atom->nimpropers && maximproper == 0) {
     if (nprocs == 1) maximproper = atom->nimpropers;
     else maximproper = static_cast<int>
            (LB_FACTOR * atom->nimpropers / nprocs);
-    memory->create_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neigh:neighbor->improperlist");
+    memoryKK->create_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neigh:neighbor->improperlist");
   }
 
   // set flags that determine which topology neighboring routines to use
@@ -283,7 +283,7 @@ void NeighBondKokkos<DeviceType>::bond_all()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maxbond = neighbor->nbondlist + BONDDELTA;
-      memory->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist");
+      memoryKK->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist");
       v_bondlist = k_bondlist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -378,7 +378,7 @@ void NeighBondKokkos<DeviceType>::bond_partial()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maxbond = neighbor->nbondlist + BONDDELTA;
-      memory->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist");
+      memoryKK->grow_kokkos(k_bondlist,neighbor->bondlist,maxbond,3,"neighbor:neighbor->bondlist");
       v_bondlist = k_bondlist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -500,7 +500,7 @@ void NeighBondKokkos<DeviceType>::angle_all()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maxangle = neighbor->nanglelist + BONDDELTA;
-      memory->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist");
+      memoryKK->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist");
       v_anglelist = k_anglelist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -602,7 +602,7 @@ void NeighBondKokkos<DeviceType>::angle_partial()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maxangle = neighbor->nanglelist + BONDDELTA;
-      memory->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist");
+      memoryKK->grow_kokkos(k_anglelist,neighbor->anglelist,maxangle,4,"neighbor:neighbor->anglelist");
       v_anglelist = k_anglelist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -744,7 +744,7 @@ void NeighBondKokkos<DeviceType>::dihedral_all()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maxdihedral = neighbor->ndihedrallist + BONDDELTA;
-      memory->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist");
+      memoryKK->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist");
       v_dihedrallist = k_dihedrallist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -851,7 +851,7 @@ void NeighBondKokkos<DeviceType>::dihedral_partial()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maxdihedral = neighbor->ndihedrallist + BONDDELTA;
-      memory->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist");
+      memoryKK->grow_kokkos(k_dihedrallist,neighbor->dihedrallist,maxdihedral,5,"neighbor:neighbor->dihedrallist");
       v_dihedrallist = k_dihedrallist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -1015,7 +1015,7 @@ void NeighBondKokkos<DeviceType>::improper_all()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maximproper = neighbor->nimproperlist + BONDDELTA;
-      memory->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist");
+      memoryKK->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist");
       v_improperlist = k_improperlist.view<DeviceType>();
     }
   } while (h_fail_flag());
@@ -1122,7 +1122,7 @@ void NeighBondKokkos<DeviceType>::improper_partial()
     k_fail_flag.template sync<LMPHostType>();
     if (h_fail_flag()) {
       maximproper = neighbor->nimproperlist + BONDDELTA;
-      memory->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist");
+      memoryKK->grow_kokkos(k_improperlist,neighbor->improperlist,maximproper,5,"neighbor:neighbor->improperlist");
       v_improperlist = k_improperlist.view<DeviceType>();
     }
   } while (h_fail_flag());
diff --git a/src/KOKKOS/neigh_list_kokkos.cpp b/src/KOKKOS/neigh_list_kokkos.cpp
index 04454e53cb302e2ad696809c034e1925a8aaa83d..98294a802aaa88e16a2c1ca8269cf235d149ff3a 100644
--- a/src/KOKKOS/neigh_list_kokkos.cpp
+++ b/src/KOKKOS/neigh_list_kokkos.cpp
@@ -13,7 +13,7 @@
 
 #include "neigh_list_kokkos.h"
 #include "atom.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp
index f34b149864d1c24179fdf2f41be36143ed5f9807..8d36add10bd6a10d8d861cd0cff5a27cef5fd1f3 100644
--- a/src/KOKKOS/neighbor_kokkos.cpp
+++ b/src/KOKKOS/neighbor_kokkos.cpp
@@ -12,11 +12,11 @@
 ------------------------------------------------------------------------- */
 
 #include "neighbor_kokkos.h"
-#include "atom.h"
+#include "atom_kokkos.h"
 #include "pair.h"
 #include "fix.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "update.h"
 #include "atom_masks.h"
 #include "error.h"
@@ -52,24 +52,24 @@ NeighborKokkos::NeighborKokkos(LAMMPS *lmp) : Neighbor(lmp),
 NeighborKokkos::~NeighborKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_cutneighsq,cutneighsq);
+    memoryKK->destroy_kokkos(k_cutneighsq,cutneighsq);
     cutneighsq = NULL;
 
-    memory->destroy_kokkos(k_ex_type,ex_type);
-    memory->destroy_kokkos(k_ex1_type,ex1_type);
-    memory->destroy_kokkos(k_ex2_type,ex2_type);
-    memory->destroy_kokkos(k_ex1_group,ex1_group);
-    memory->destroy_kokkos(k_ex2_group,ex2_group);
-    memory->destroy_kokkos(k_ex_mol_group,ex_mol_group);
-    memory->destroy_kokkos(k_ex1_bit,ex1_bit);
-    memory->destroy_kokkos(k_ex2_bit,ex2_bit);
-    memory->destroy_kokkos(k_ex_mol_bit,ex_mol_bit);
-    memory->destroy_kokkos(k_ex_mol_intra,ex_mol_intra);
-
-    memory->destroy_kokkos(k_bondlist,bondlist);
-    memory->destroy_kokkos(k_anglelist,anglelist);
-    memory->destroy_kokkos(k_dihedrallist,dihedrallist);
-    memory->destroy_kokkos(k_improperlist,improperlist);
+    memoryKK->destroy_kokkos(k_ex_type,ex_type);
+    memoryKK->destroy_kokkos(k_ex1_type,ex1_type);
+    memoryKK->destroy_kokkos(k_ex2_type,ex2_type);
+    memoryKK->destroy_kokkos(k_ex1_group,ex1_group);
+    memoryKK->destroy_kokkos(k_ex2_group,ex2_group);
+    memoryKK->destroy_kokkos(k_ex_mol_group,ex_mol_group);
+    memoryKK->destroy_kokkos(k_ex1_bit,ex1_bit);
+    memoryKK->destroy_kokkos(k_ex2_bit,ex2_bit);
+    memoryKK->destroy_kokkos(k_ex_mol_bit,ex_mol_bit);
+    memoryKK->destroy_kokkos(k_ex_mol_intra,ex_mol_intra);
+
+    memoryKK->destroy_kokkos(k_bondlist,bondlist);
+    memoryKK->destroy_kokkos(k_anglelist,anglelist);
+    memoryKK->destroy_kokkos(k_dihedrallist,dihedrallist);
+    memoryKK->destroy_kokkos(k_improperlist,improperlist);
   }
 }
 
@@ -90,7 +90,7 @@ void NeighborKokkos::init()
 
 void NeighborKokkos::init_cutneighsq_kokkos(int n)
 {
-  memory->create_kokkos(k_cutneighsq,cutneighsq,n+1,n+1,"neigh:cutneighsq");
+  memoryKK->create_kokkos(k_cutneighsq,cutneighsq,n+1,n+1,"neigh:cutneighsq");
   k_cutneighsq.modify<LMPHostType>();
 }
 
@@ -112,7 +112,7 @@ void NeighborKokkos::create_kokkos_list(int i)
 
 void NeighborKokkos::init_ex_type_kokkos(int n)
 {
-  memory->create_kokkos(k_ex_type,ex_type,n+1,n+1,"neigh:ex_type");
+  memoryKK->create_kokkos(k_ex_type,ex_type,n+1,n+1,"neigh:ex_type");
   k_ex_type.modify<LMPHostType>();
 }
 
@@ -120,9 +120,9 @@ void NeighborKokkos::init_ex_type_kokkos(int n)
 
 void NeighborKokkos::init_ex_bit_kokkos()
 {
-  memory->create_kokkos(k_ex1_bit, ex1_bit, nex_group, "neigh:ex1_bit");
+  memoryKK->create_kokkos(k_ex1_bit, ex1_bit, nex_group, "neigh:ex1_bit");
   k_ex1_bit.modify<LMPHostType>();
-  memory->create_kokkos(k_ex2_bit, ex2_bit, nex_group, "neigh:ex2_bit");
+  memoryKK->create_kokkos(k_ex2_bit, ex2_bit, nex_group, "neigh:ex2_bit");
   k_ex2_bit.modify<LMPHostType>();
 }
 
@@ -130,7 +130,7 @@ void NeighborKokkos::init_ex_bit_kokkos()
 
 void NeighborKokkos::init_ex_mol_bit_kokkos()
 {
-  memory->create_kokkos(k_ex_mol_bit, ex_mol_bit, nex_mol, "neigh:ex_mol_bit");
+  memoryKK->create_kokkos(k_ex_mol_bit, ex_mol_bit, nex_mol, "neigh:ex_mol_bit");
   k_ex_mol_bit.modify<LMPHostType>();
 }
 
@@ -138,7 +138,7 @@ void NeighborKokkos::init_ex_mol_bit_kokkos()
 
 void NeighborKokkos::grow_ex_mol_intra_kokkos()
 {
-  memory->grow_kokkos(k_ex_mol_intra, ex_mol_intra, maxex_mol, "neigh:ex_mol_intra");
+  memoryKK->grow_kokkos(k_ex_mol_intra, ex_mol_intra, maxex_mol, "neigh:ex_mol_intra");
   k_ex_mol_intra.modify<LMPHostType>();
 }
 
@@ -335,29 +335,29 @@ void NeighborKokkos::operator()(TagNeighborXhold<DeviceType>, const int &i) cons
 /* ---------------------------------------------------------------------- */
 
 void NeighborKokkos::modify_ex_type_grow_kokkos(){
-  memory->grow_kokkos(k_ex1_type,ex1_type,maxex_type,"neigh:ex1_type");
+  memoryKK->grow_kokkos(k_ex1_type,ex1_type,maxex_type,"neigh:ex1_type");
   k_ex1_type.modify<LMPHostType>();
-  memory->grow_kokkos(k_ex2_type,ex2_type,maxex_type,"neigh:ex2_type");
+  memoryKK->grow_kokkos(k_ex2_type,ex2_type,maxex_type,"neigh:ex2_type");
   k_ex2_type.modify<LMPHostType>();
 }
 
 /* ---------------------------------------------------------------------- */
 void NeighborKokkos::modify_ex_group_grow_kokkos(){
-  memory->grow_kokkos(k_ex1_group,ex1_group,maxex_group,"neigh:ex1_group");
+  memoryKK->grow_kokkos(k_ex1_group,ex1_group,maxex_group,"neigh:ex1_group");
   k_ex1_group.modify<LMPHostType>();
-  memory->grow_kokkos(k_ex2_group,ex2_group,maxex_group,"neigh:ex2_group");
+  memoryKK->grow_kokkos(k_ex2_group,ex2_group,maxex_group,"neigh:ex2_group");
   k_ex2_group.modify<LMPHostType>();
 }
 
 /* ---------------------------------------------------------------------- */
 void NeighborKokkos::modify_mol_group_grow_kokkos(){
-  memory->grow_kokkos(k_ex_mol_group,ex_mol_group,maxex_mol,"neigh:ex_mol_group");
+  memoryKK->grow_kokkos(k_ex_mol_group,ex_mol_group,maxex_mol,"neigh:ex_mol_group");
   k_ex_mol_group.modify<LMPHostType>();
 }
 
 /* ---------------------------------------------------------------------- */
 void NeighborKokkos::modify_mol_intra_grow_kokkos(){
-  memory->grow_kokkos(k_ex_mol_intra,ex_mol_intra,maxex_mol,"neigh:ex_mol_intra");
+  memoryKK->grow_kokkos(k_ex_mol_intra,ex_mol_intra,maxex_mol,"neigh:ex_mol_intra");
   k_ex_mol_intra.modify<LMPHostType>();
 }
 
diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp
index 0da8a0a3d6a9267bc6e45a74aa4b52f2f2471c47..ba3eda64ddee4e389b771f5e47168c98c5a6fa08 100644
--- a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -65,8 +65,8 @@ PairBuckCoulCutKokkos<DeviceType>::~PairBuckCoulCutKokkos()
 {
 
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_ljsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
@@ -98,13 +98,13 @@ void PairBuckCoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -252,13 +252,13 @@ void PairBuckCoulCutKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
   memory->destroy(cut_coulsq);
-  memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_buck_coul**,Kokkos::LayoutRight,DeviceType>("PairBuckCoulCut::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp
index 3a5cbd868f725c54a95c6c6cb0fc9a2335137ea5..19af349a63588a464f4e1785be291510fd91acfa 100644
--- a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -73,8 +73,8 @@ template<class DeviceType>
 PairBuckCoulLongKokkos<DeviceType>::~PairBuckCoulLongKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_ljsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
@@ -117,13 +117,13 @@ void PairBuckCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -308,14 +308,14 @@ void PairBuckCoulLongKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_buck_coul**,Kokkos::LayoutRight,DeviceType>("PairBuckCoulLong::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_buck_kokkos.cpp b/src/KOKKOS/pair_buck_kokkos.cpp
index e7640471d501bc8be6778c4acb32395e18cf950a..fcf14533dc991d469ad1c0e65951ca80d515b0b2 100644
--- a/src/KOKKOS/pair_buck_kokkos.cpp
+++ b/src/KOKKOS/pair_buck_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -61,8 +61,8 @@ template<class DeviceType>
 PairBuckKokkos<DeviceType>::~PairBuckKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     memory->sfree(cutsq);
     eatom = NULL;
@@ -87,13 +87,13 @@ void PairBuckKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -194,7 +194,7 @@ void PairBuckKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_buck**,Kokkos::LayoutRight,DeviceType>("PairBuck::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_coul_cut_kokkos.cpp b/src/KOKKOS/pair_coul_cut_kokkos.cpp
index 8edf093e2e118a4315b899aa6c304a9e78f670f9..e20e243c09aefb7313cbe13ce50a498356ea405d 100644
--- a/src/KOKKOS/pair_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_cut_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -55,7 +55,7 @@ template<class DeviceType>
 PairCoulCutKokkos<DeviceType>::~PairCoulCutKokkos()
 {
   if (allocated)
-    memory->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -86,13 +86,13 @@ void PairCoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -190,7 +190,7 @@ void PairCoulCutKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   k_cut_ljsq = typename ArrayTypes<DeviceType>::tdual_ffloat_2d("pair:cut_ljsq",n+1,n+1);
diff --git a/src/KOKKOS/pair_coul_debye_kokkos.cpp b/src/KOKKOS/pair_coul_debye_kokkos.cpp
index c331ab8da8f5881441985a0bfdf69d7f9da8bc8d..4cac18cacfcaf2ba3274a3feeb6e6f3d3a65c4bf 100644
--- a/src/KOKKOS/pair_coul_debye_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -62,7 +62,7 @@ template<class DeviceType>
 PairCoulDebyeKokkos<DeviceType>::~PairCoulDebyeKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
   }
 }
 
@@ -93,13 +93,13 @@ void PairCoulDebyeKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -218,7 +218,7 @@ void PairCoulDebyeKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_coul**,Kokkos::LayoutRight,DeviceType>("PairCoulDebye::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_coul_dsf_kokkos.cpp
index e6f5407f2d16990085495915562a4c564861aa81..f77e63bbf0551b0412b21e0b7631c098ff082f78 100644
--- a/src/KOKKOS/pair_coul_dsf_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_dsf_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "update.h"
 #include "integrate.h"
 #include "respa.h"
@@ -65,8 +65,8 @@ template<class DeviceType>
 PairCoulDSFKokkos<DeviceType>::~PairCoulDSFKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -86,13 +86,13 @@ void PairCoulDSFKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_coul_long_kokkos.cpp b/src/KOKKOS/pair_coul_long_kokkos.cpp
index 721e140e3374794dad4016fce79888cb60a07145..f2ade3f367c0e01b8118d454a3d0259618cffddf 100644
--- a/src/KOKKOS/pair_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_long_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -72,8 +72,8 @@ template<class DeviceType>
 PairCoulLongKokkos<DeviceType>::~PairCoulLongKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
     memory->sfree(cutsq);
@@ -110,13 +110,13 @@ void PairCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -272,10 +272,10 @@ void PairCoulLongKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_coul**,Kokkos::LayoutRight,DeviceType>("PairCoulLong::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.cpp b/src/KOKKOS/pair_coul_wolf_kokkos.cpp
index 75177e2d81e7a3a9a70ccc754db14651a8d29e56..0f3e9b94290918dd78cb8940cc762d5e82494977 100644
--- a/src/KOKKOS/pair_coul_wolf_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_wolf_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -60,8 +60,8 @@ template<class DeviceType>
 PairCoulWolfKokkos<DeviceType>::~PairCoulWolfKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -81,13 +81,13 @@ void PairCoulWolfKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp
index c559ab412f355c1dc10a51adb4308fbf031003d4..7d71719e0a115d99cf25a3a89a91487f9042edc2 100644
--- a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp
+++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp
@@ -28,11 +28,12 @@
 #include "neighbor.h"
 #include "neigh_list.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "modify.h"
 #include "pair_dpd_fdt_energy_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
+#include "kokkos.h"
 
 using namespace LAMMPS_NS;
 
@@ -62,15 +63,15 @@ PairDPDfdtEnergyKokkos<DeviceType>::~PairDPDfdtEnergyKokkos()
 {
   if (copymode) return;
 
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
 
   if (allocated) {
-    memory->destroy_kokkos(k_duCond,duCond);
-    memory->destroy_kokkos(k_duMech,duMech);
+    memoryKK->destroy_kokkos(k_duCond,duCond);
+    memoryKK->destroy_kokkos(k_duMech,duMech);
   }
 
-  memory->destroy_kokkos(k_cutsq,cutsq);
+  memoryKK->destroy_kokkos(k_cutsq,cutsq);
 
 #ifdef DPD_USE_RAN_MARS
   rand_pool.destroy();
@@ -167,13 +168,13 @@ void PairDPDfdtEnergyKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
@@ -274,11 +275,11 @@ void PairDPDfdtEnergyKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
 
     // Allocate memory for duCond and duMech
     if (allocated) {
-      memory->destroy_kokkos(k_duCond,duCond);
-      memory->destroy_kokkos(k_duMech,duMech);
+      memoryKK->destroy_kokkos(k_duCond,duCond);
+      memoryKK->destroy_kokkos(k_duMech,duMech);
     }
-    memory->create_kokkos(k_duCond,duCond,nlocal+nghost,"pair:duCond");
-    memory->create_kokkos(k_duMech,duMech,nlocal+nghost,"pair:duMech");
+    memoryKK->create_kokkos(k_duCond,duCond,nlocal+nghost,"pair:duCond");
+    memoryKK->create_kokkos(k_duMech,duMech,nlocal+nghost,"pair:duMech");
     d_duCond = k_duCond.view<DeviceType>();
     d_duMech = k_duMech.view<DeviceType>();
     h_duCond = k_duCond.h_view;
@@ -641,7 +642,7 @@ void PairDPDfdtEnergyKokkos<DeviceType>::allocate()
   int nghost = atom->nghost;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_dpd**,Kokkos::LayoutRight,DeviceType>("PairDPDfdtEnergy::params",n+1,n+1);
@@ -650,8 +651,8 @@ void PairDPDfdtEnergyKokkos<DeviceType>::allocate()
   if (!splitFDT_flag) {
     memory->destroy(duCond);
     memory->destroy(duMech);
-    memory->create_kokkos(k_duCond,duCond,nlocal+nghost+1,"pair:duCond");
-    memory->create_kokkos(k_duMech,duMech,nlocal+nghost+1,"pair:duMech");
+    memoryKK->create_kokkos(k_duCond,duCond,nlocal+nghost+1,"pair:duCond");
+    memoryKK->create_kokkos(k_duMech,duMech,nlocal+nghost+1,"pair:duMech");
     d_duCond = k_duCond.view<DeviceType>();
     d_duMech = k_duMech.view<DeviceType>();
     h_duCond = k_duCond.h_view;
diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp
index aa68d0a05438ad2db1256e62cbb979861be47c47..f263cbb6d90be1cd34d5f0f9abab2b4e04174794 100644
--- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp
+++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp
@@ -28,7 +28,7 @@
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -59,8 +59,8 @@ template<class DeviceType>
 PairEAMAlloyKokkos<DeviceType>::~PairEAMAlloyKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -80,13 +80,13 @@ void PairEAMAlloyKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.h b/src/KOKKOS/pair_eam_alloy_kokkos.h
index fb07eec32b1253c61d309f60f1010fb31d4441a6..a962f559085d767f10c1b347a83b9d006c68a548 100644
--- a/src/KOKKOS/pair_eam_alloy_kokkos.h
+++ b/src/KOKKOS/pair_eam_alloy_kokkos.h
@@ -24,6 +24,7 @@ PairStyle(eam/alloy/kk/host,PairEAMAlloyKokkos<LMPHostType>)
 #define LMP_PAIR_EAM_ALLOY_KOKKOS_H
 
 #include <stdio.h>
+#include "kokkos_base.h"
 #include "pair_kokkos.h"
 #include "pair_eam.h"
 #include "neigh_list_kokkos.h"
@@ -49,7 +50,7 @@ struct TagPairEAMAlloyKernelC{};
 // Cannot use virtual inheritance on the GPU
 
 template<class DeviceType>
-class PairEAMAlloyKokkos : public PairEAM {
+class PairEAMAlloyKokkos : public PairEAM, public KokkosBase {
  public:
   enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF};
   enum {COUL_FLAG=0};
@@ -59,7 +60,7 @@ class PairEAMAlloyKokkos : public PairEAM {
 
   PairEAMAlloyKokkos(class LAMMPS *);
   virtual ~PairEAMAlloyKokkos();
-  virtual void compute(int, int);
+  void compute(int, int);
   void init_style();
   void *extract(const char *, int &) { return NULL; }
   void coeff(int, char **);
@@ -107,11 +108,11 @@ class PairEAMAlloyKokkos : public PairEAM {
       const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx,
                   const F_FLOAT &dely, const F_FLOAT &delz) const;
 
-  virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&,
-                               int, int *);
-  virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&);
-  virtual int pack_forward_comm(int, int *, double *, int, int *);
-  virtual void unpack_forward_comm(int, int, double *);
+  int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&,
+                       int, int *);
+  void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&);
+  int pack_forward_comm(int, int *, double *, int, int *);
+  void unpack_forward_comm(int, int, double *);
   int pack_reverse_comm(int, int, double *);
   void unpack_reverse_comm(int, int *, double *);
 
@@ -148,7 +149,7 @@ class PairEAMAlloyKokkos : public PairEAM {
   t_ffloat_2d_n7_randomread d_rhor_spline;
   t_ffloat_2d_n7_randomread d_z2r_spline;
 
-  virtual void file2array();
+  void file2array();
   void file2array_alloy();
   void array2spline();
   void interpolate(int, double, double *, t_host_ffloat_2d_n7, int);
diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp
index a982f94ec4d607ae2e83d1773ed38a98a082ad09..05ec1a644b829cc587ca30a4f99148d78dbeeb11 100644
--- a/src/KOKKOS/pair_eam_fs_kokkos.cpp
+++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp
@@ -28,7 +28,7 @@
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -59,8 +59,8 @@ template<class DeviceType>
 PairEAMFSKokkos<DeviceType>::~PairEAMFSKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -80,13 +80,13 @@ void PairEAMFSKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_eam_fs_kokkos.h b/src/KOKKOS/pair_eam_fs_kokkos.h
index d71ec2b8870f103ae1f839d5a90ff791c367afaf..ec87e44ece248f93f0193684311f3587be8ec5d3 100644
--- a/src/KOKKOS/pair_eam_fs_kokkos.h
+++ b/src/KOKKOS/pair_eam_fs_kokkos.h
@@ -24,6 +24,7 @@ PairStyle(eam/fs/kk/host,PairEAMFSKokkos<LMPHostType>)
 #define LMP_PAIR_EAM_FS_KOKKOS_H
 
 #include <stdio.h>
+#include "kokkos_base.h"
 #include "pair_kokkos.h"
 #include "pair_eam.h"
 #include "neigh_list_kokkos.h"
@@ -49,7 +50,7 @@ struct TagPairEAMFSKernelC{};
 // Cannot use virtual inheritance on the GPU
 
 template<class DeviceType>
-class PairEAMFSKokkos : public PairEAM {
+class PairEAMFSKokkos : public PairEAM, public KokkosBase {
  public:
   enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF};
   enum {COUL_FLAG=0};
@@ -59,7 +60,7 @@ class PairEAMFSKokkos : public PairEAM {
 
   PairEAMFSKokkos(class LAMMPS *);
   virtual ~PairEAMFSKokkos();
-  virtual void compute(int, int);
+  void compute(int, int);
   void init_style();
   void *extract(const char *, int &) { return NULL; }
   void coeff(int, char **);
@@ -107,11 +108,11 @@ class PairEAMFSKokkos : public PairEAM {
       const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx,
                   const F_FLOAT &dely, const F_FLOAT &delz) const;
 
-  virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&,
-                               int, int *);
-  virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&);
-  virtual int pack_forward_comm(int, int *, double *, int, int *);
-  virtual void unpack_forward_comm(int, int, double *);
+  int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&,
+                       int, int *);
+  void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&);
+  int pack_forward_comm(int, int *, double *, int, int *);
+  void unpack_forward_comm(int, int, double *);
   int pack_reverse_comm(int, int, double *);
   void unpack_reverse_comm(int, int *, double *);
 
@@ -148,7 +149,7 @@ class PairEAMFSKokkos : public PairEAM {
   t_ffloat_2d_n7_randomread d_rhor_spline;
   t_ffloat_2d_n7_randomread d_z2r_spline;
 
-  virtual void file2array();
+  void file2array();
   void file2array_fs();
   void array2spline();
   void interpolate(int, double, double *, t_host_ffloat_2d_n7, int);
diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp
index 8ac92a1766c62eedbaf37663d5ba1092bbab4599..0aa43b26b2112f6970bae5562b506b4cabe6718d 100644
--- a/src/KOKKOS/pair_eam_kokkos.cpp
+++ b/src/KOKKOS/pair_eam_kokkos.cpp
@@ -28,7 +28,7 @@
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -54,8 +54,8 @@ template<class DeviceType>
 PairEAMKokkos<DeviceType>::~PairEAMKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -75,13 +75,13 @@ void PairEAMKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_eam_kokkos.h b/src/KOKKOS/pair_eam_kokkos.h
index 856cc51f7709f24cec67df5d0e8de930f4796c69..34a4795ec54e97986b9cd39e0e79e7932d5d6bd4 100644
--- a/src/KOKKOS/pair_eam_kokkos.h
+++ b/src/KOKKOS/pair_eam_kokkos.h
@@ -24,6 +24,7 @@ PairStyle(eam/kk/host,PairEAMKokkos<LMPHostType>)
 #define LMP_PAIR_EAM_KOKKOS_H
 
 #include <stdio.h>
+#include "kokkos_base.h"
 #include "pair_kokkos.h"
 #include "pair_eam.h"
 #include "neigh_list_kokkos.h"
@@ -47,7 +48,7 @@ template<int NEIGHFLAG, int NEWTON_PAIR, int EVFLAG>
 struct TagPairEAMKernelC{};
 
 template<class DeviceType>
-class PairEAMKokkos : public PairEAM {
+class PairEAMKokkos : public PairEAM, public KokkosBase {
  public:
   enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF};
   enum {COUL_FLAG=0};
@@ -57,7 +58,7 @@ class PairEAMKokkos : public PairEAM {
 
   PairEAMKokkos(class LAMMPS *);
   virtual ~PairEAMKokkos();
-  virtual void compute(int, int);
+  void compute(int, int);
   void init_style();
   void *extract(const char *, int &) { return NULL; }
 
@@ -104,11 +105,11 @@ class PairEAMKokkos : public PairEAM {
       const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx,
                   const F_FLOAT &dely, const F_FLOAT &delz) const;
 
-  virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&,
-                               int, int *);
-  virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&);
-  virtual int pack_forward_comm(int, int *, double *, int, int *);
-  virtual void unpack_forward_comm(int, int, double *);
+  int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, int, DAT::tdual_xfloat_1d&,
+                       int, int *);
+  void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d&);
+  int pack_forward_comm(int, int *, double *, int, int *);
+  void unpack_forward_comm(int, int, double *);
   int pack_reverse_comm(int, int, double *);
   void unpack_reverse_comm(int, int *, double *);
 
@@ -146,7 +147,7 @@ class PairEAMKokkos : public PairEAM {
   t_ffloat_2d_n7_randomread d_z2r_spline;
   void interpolate(int, double, double *, t_host_ffloat_2d_n7, int);
 
-  virtual void file2array();
+  void file2array();
   void array2spline();
 
   typename AT::t_neighbors_2d d_neighbors;
diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp
index 8d65be23af00e7c37e4ce2ad0f1f781a822fc6c4..a09a1d27e34c544c15c79de45ff28ee6a2650e54 100644
--- a/src/KOKKOS/pair_exp6_rx_kokkos.cpp
+++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp
@@ -26,13 +26,15 @@
 #include "neigh_list.h"
 #include "math_const.h"
 #include "math_special_kokkos.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "modify.h"
 #include "fix.h"
 #include <float.h>
 #include "atom_masks.h"
 #include "neigh_request.h"
+#include "atom_kokkos.h"
+#include "kokkos.h"
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
@@ -89,18 +91,18 @@ PairExp6rxKokkos<DeviceType>::~PairExp6rxKokkos()
 {
   if (copymode) return;
 
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
 
-  memory->destroy_kokkos(k_cutsq,cutsq);
+  memoryKK->destroy_kokkos(k_cutsq,cutsq);
 
   for (int i=0; i < nparams; ++i) {
     delete[] params[i].name;
     delete[] params[i].potential;
   }
-  memory->destroy_kokkos(k_params,params);
+  memoryKK->destroy_kokkos(k_params,params);
 
-  memory->destroy_kokkos(k_mol2param,mol2param);
+  memoryKK->destroy_kokkos(k_mol2param,mol2param);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -151,13 +153,13 @@ void PairExp6rxKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
@@ -1660,7 +1662,7 @@ void PairExp6rxKokkos<DeviceType>::allocate()
     for (int j = i; j <= ntypes; j++)
       setflag[i][j] = 0;
 
-  memory->create_kokkos(k_cutsq,cutsq,ntypes+1,ntypes+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,ntypes+1,ntypes+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_cutsq.template modify<LMPHostType>();
 
@@ -1697,7 +1699,7 @@ void PairExp6rxKokkos<DeviceType>::read_file(char *file)
   int params_per_line = 5;
   char **words = new char*[params_per_line+1];
 
-  memory->destroy_kokkos(k_params,params);
+  memoryKK->destroy_kokkos(k_params,params);
   params = NULL;
   nparams = maxparam = 0;
 
@@ -1777,7 +1779,7 @@ void PairExp6rxKokkos<DeviceType>::read_file(char *file)
     if (nparams == maxparam) {
       k_params.template modify<LMPHostType>();
       maxparam += DELTA;
-      memory->grow_kokkos(k_params,params,maxparam,
+      memoryKK->grow_kokkos(k_params,params,maxparam,
                           "pair:params");
     }
 
@@ -1816,8 +1818,8 @@ void PairExp6rxKokkos<DeviceType>::setup()
   // set mol2param for all combinations
   // must be a single exact match to lines read from file
 
-  memory->destroy_kokkos(k_mol2param,mol2param);
-  memory->create_kokkos(k_mol2param,mol2param,nspecies,"pair:mol2param");
+  memoryKK->destroy_kokkos(k_mol2param,mol2param);
+  memoryKK->create_kokkos(k_mol2param,mol2param,nspecies,"pair:mol2param");
 
   for (i = 0; i < nspecies; i++) {
     n = -1;
diff --git a/src/KOKKOS/pair_hybrid_kokkos.cpp b/src/KOKKOS/pair_hybrid_kokkos.cpp
index 337b56c6cee7e11e3a03dcd810bd62e161bb6813..db757f6ce1847806d266de13037d99b6489732a3 100644
--- a/src/KOKKOS/pair_hybrid_kokkos.cpp
+++ b/src/KOKKOS/pair_hybrid_kokkos.cpp
@@ -23,10 +23,11 @@
 #include "neigh_request.h"
 #include "update.h"
 #include "comm.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "respa.h"
 #include "atom_masks.h"
+#include "kokkos.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h
index f0e357270c1d5b8340c570f4a1d5be4f26d36a27..4c215ed16287d54ed3237aa678612c74c5faabf0 100644
--- a/src/KOKKOS/pair_kokkos.h
+++ b/src/KOKKOS/pair_kokkos.h
@@ -20,6 +20,7 @@
 
 #include "Kokkos_Macros.hpp"
 #include "pair.h"
+#include "neighbor_kokkos.h"
 #include "neigh_list_kokkos.h"
 #include "Kokkos_Vectorization.hpp"
 
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp
index e7cf7ba42ad80ba7166322a2dd1999c3e3c19f3c..7d395cb3b464746f7efeb9e52232f122dcfb8b4d 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -73,8 +73,8 @@ template<class DeviceType>
 PairLJCharmmCoulCharmmImplicitKokkos<DeviceType>::~PairLJCharmmCoulCharmmImplicitKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_ljsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
@@ -118,13 +118,13 @@ void PairLJCharmmCoulCharmmImplicitKokkos<DeviceType>::compute(int eflag_in, int
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -315,14 +315,14 @@ void PairLJCharmmCoulCharmmImplicitKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   //memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCharmmCoulCharmmImplicit::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
index a456d6e27600c36911da43be21f8151a91943148..2663d71a1febe0aced1bacec03b1c80ff6136715 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -73,8 +73,8 @@ template<class DeviceType>
 PairLJCharmmCoulCharmmKokkos<DeviceType>::~PairLJCharmmCoulCharmmKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_ljsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
@@ -118,13 +118,13 @@ void PairLJCharmmCoulCharmmKokkos<DeviceType>::compute(int eflag_in, int vflag_i
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -316,14 +316,14 @@ void PairLJCharmmCoulCharmmKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   //memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCharmmCoulCharmm::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp
index dffbbb638ff0d1f25819d99b504e58d2d9eae300..81271c7d8ab7b7341601d1141e51c3f5edb5351b 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -73,8 +73,8 @@ template<class DeviceType>
 PairLJCharmmCoulLongKokkos<DeviceType>::~PairLJCharmmCoulLongKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_ljsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
@@ -118,13 +118,13 @@ void PairLJCharmmCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -336,14 +336,14 @@ void PairLJCharmmCoulLongKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   //memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCharmmCoulLong::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp
index 0081aca4f15ddf196ceb6d104ce75798fa55c736..3f355b1b160bf34df464b833cf1c938e76f5a17e 100644
--- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -60,9 +60,9 @@ template<class DeviceType>
 PairLJClass2CoulCutKokkos<DeviceType>::~PairLJClass2CoulCutKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_cutsq, cutsq);
-    memory->destroy_kokkos(k_cut_ljsq, cut_ljsq);
-    memory->destroy_kokkos(k_cut_coulsq, cut_coulsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq);
+    memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq);
   }
 }
 
@@ -95,13 +95,13 @@ void PairLJClass2CoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -255,13 +255,13 @@ void PairLJClass2CoulCutKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
   memory->destroy(cut_coulsq);
-  memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJClass2CoulCut::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp
index b5dc358feb3fed379c7236e164a0f15d0104e60b..47976ec610aecdef5d6c41bd9d612533e6bc16aa 100644
--- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -69,8 +69,8 @@ template<class DeviceType>
 PairLJClass2CoulLongKokkos<DeviceType>::~PairLJClass2CoulLongKokkos()
 {
   if (!copymode){
-    memory->destroy_kokkos(k_cutsq, cutsq);
-    memory->destroy_kokkos(k_cut_ljsq, cut_ljsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq);
   }
 }
 
@@ -103,13 +103,13 @@ void PairLJClass2CoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -307,13 +307,13 @@ void PairLJClass2CoulLongKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJClass2CoulLong::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_class2_kokkos.cpp b/src/KOKKOS/pair_lj_class2_kokkos.cpp
index 34cc15279b4d7a2708fc5c537d14ea44fe4e0dca..5beb520c00feb1971f5248e4ab31a7442133faa7 100644
--- a/src/KOKKOS/pair_lj_class2_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_class2_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -95,13 +95,13 @@ void PairLJClass2Kokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -200,7 +200,7 @@ void PairLJClass2Kokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj**,Kokkos::LayoutRight,DeviceType>("PairLJClass2::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp
index c3fda01ce63244bfa591deb80c23e4327288c68a..86e37bea77a6ffadf9ab082a36005ebca6da8aba 100644
--- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -60,9 +60,9 @@ template<class DeviceType>
 PairLJCutCoulCutKokkos<DeviceType>::~PairLJCutCoulCutKokkos()
 {
   if (allocated){
-    memory->destroy_kokkos(k_cutsq, cutsq);
-    memory->destroy_kokkos(k_cut_ljsq, cut_ljsq);
-    memory->destroy_kokkos(k_cut_coulsq, cut_coulsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq);
+    memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq);
   }
 }
 
@@ -95,13 +95,13 @@ void PairLJCutCoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -247,13 +247,13 @@ void PairLJCutCoulCutKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
   memory->destroy(cut_coulsq);
-  memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCutCoulCut::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp
index b7a71cb99ac3d7f22ace36d5537a1dcb920dd60b..76e488c68667e4ac7b19150ba70e876ebc81fe7e 100644
--- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -64,9 +64,9 @@ template<class DeviceType>
 PairLJCutCoulDebyeKokkos<DeviceType>::~PairLJCutCoulDebyeKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_cutsq, cutsq);
-    memory->destroy_kokkos(k_cut_ljsq, cut_ljsq);
-    memory->destroy_kokkos(k_cut_coulsq, cut_coulsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq);
+    memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq);
   }
 }
 
@@ -99,13 +99,13 @@ void PairLJCutCoulDebyeKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -261,13 +261,13 @@ void PairLJCutCoulDebyeKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
   memory->destroy(cut_coulsq);
-  memory->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCutCoulDebye::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp
index 9df59636769a25dc3d512f36d4912486cb43be66..0da5e7f5f511432e5b8e81036caed9ec779dc992 100644
--- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -72,9 +72,9 @@ template<class DeviceType>
 PairLJCutCoulDSFKokkos<DeviceType>::~PairLJCutCoulDSFKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_cutsq, cutsq);
-    memory->destroy_kokkos(k_cut_ljsq, cut_ljsq);
-    //memory->destroy_kokkos(k_cut_coulsq, cut_coulsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq);
+    //memoryKK->destroy_kokkos(k_cut_coulsq, cut_coulsq);
   }
 }
 
@@ -107,13 +107,13 @@ void PairLJCutCoulDSFKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -279,13 +279,13 @@ void PairLJCutCoulDSFKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
   //memory->destroy(cut_coulsq);
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCutCoulDSF::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp
index 9bd79c7341a7116d74eb789ace8f5a984564278c..77a604534e2ae907a16db82ed013c26af2ec1042 100644
--- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -68,13 +68,13 @@ PairLJCutCoulLongKokkos<DeviceType>::PairLJCutCoulLongKokkos(LAMMPS *lmp):PairLJ
 template<class DeviceType>
 PairLJCutCoulLongKokkos<DeviceType>::~PairLJCutCoulLongKokkos()
 {
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
   eatom = NULL;
   vatom = NULL;
   if (allocated){
-    memory->destroy_kokkos(k_cutsq, cutsq);
-    memory->destroy_kokkos(k_cut_ljsq, cut_ljsq);
+    memoryKK->destroy_kokkos(k_cutsq, cutsq);
+    memoryKK->destroy_kokkos(k_cut_ljsq, cut_ljsq);
   }
 }
 
@@ -108,13 +108,13 @@ void PairLJCutCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -304,13 +304,13 @@ void PairLJCutCoulLongKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCutCoulLong::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_kokkos.cpp
index c90d5ad11c5295083eaaa4516c6f108665280def..2a228fb168be97184fda12d80b012745b286fa80 100644
--- a/src/KOKKOS/pair_lj_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -57,8 +57,8 @@ template<class DeviceType>
 PairLJCutKokkos<DeviceType>::~PairLJCutKokkos()
 {
   if (allocated) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     memory->sfree(cutsq);
     eatom = NULL;
@@ -95,13 +95,13 @@ void PairLJCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -195,7 +195,7 @@ void PairLJCutKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj**,Kokkos::LayoutRight,DeviceType>("PairLJCut::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_expand_kokkos.cpp b/src/KOKKOS/pair_lj_expand_kokkos.cpp
index 95ec252ad5fdebf3d4829abc524927d17ffa6eef..aca7202b78be66a04ce7443e7eb4f34c34a6a6e0 100644
--- a/src/KOKKOS/pair_lj_expand_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_expand_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -94,13 +94,13 @@ void PairLJExpandKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -202,7 +202,7 @@ void PairLJExpandKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj**,Kokkos::LayoutRight,DeviceType>("PairLJExpand::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp
index 4b21b08eb352ad95c8806bff4ae3175204eaf767..bf269288e076b3c69edf2cbff706426740a5e9f6 100644
--- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -64,8 +64,8 @@ template<class DeviceType>
 PairLJGromacsCoulGromacsKokkos<DeviceType>::~PairLJGromacsCoulGromacsKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_ljsq = DAT::tdual_ffloat_2d();
     k_cut_coulsq = DAT::tdual_ffloat_2d();
@@ -109,13 +109,13 @@ void PairLJGromacsCoulGromacsKokkos<DeviceType>::compute(int eflag_in, int vflag
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -299,14 +299,14 @@ void PairLJGromacsCoulGromacsKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   //memory->destroy(cut_ljsq);
-  memory->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
+  memoryKK->create_kokkos(k_cut_ljsq,n+1,n+1,"pair:cut_ljsq");
   d_cut_ljsq = k_cut_ljsq.template view<DeviceType>();
 
-  memory->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
+  memoryKK->create_kokkos(k_cut_coulsq,n+1,n+1,"pair:cut_coulsq");
   d_cut_coulsq = k_cut_coulsq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_lj_coul_gromacs**,Kokkos::LayoutRight,DeviceType>("PairLJGromacsCoulGromacs::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp
index 73a17d7b22f577fc31e4d6f3271ff4bab1b7694a..f24ff718c1042992bf47e18a6ce12e54ec7c169f 100644
--- a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -64,8 +64,8 @@ template<class DeviceType>
 PairLJGromacsKokkos<DeviceType>::~PairLJGromacsKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     k_cut_inner_sq = DAT::tdual_ffloat_2d();
     memory->sfree(cutsq);
@@ -106,13 +106,13 @@ void PairLJGromacsKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -240,15 +240,15 @@ void PairLJGromacsKokkos<DeviceType>::allocate()
   int n = atom->ntypes;
 
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
 
   memory->destroy(cut_inner);
-  memory->create_kokkos(k_cut_inner,cut_inner,n+1,n+1,"pair:cut_inner");
+  memoryKK->create_kokkos(k_cut_inner,cut_inner,n+1,n+1,"pair:cut_inner");
   d_cut_inner = k_cut_inner.template view<DeviceType>();
 
   memory->destroy(cut_inner_sq);
-  memory->create_kokkos(k_cut_inner_sq,cut_inner_sq,n+1,n+1,"pair:cut_inner_sq");
+  memoryKK->create_kokkos(k_cut_inner_sq,cut_inner_sq,n+1,n+1,"pair:cut_inner_sq");
   d_cut_inner_sq = k_cut_inner_sq.template view<DeviceType>();
 
   k_params = Kokkos::DualView<params_lj**,Kokkos::LayoutRight,DeviceType>("PairLJGromacs::params",n+1,n+1);
diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.cpp b/src/KOKKOS/pair_lj_sdk_kokkos.cpp
index 2063f62b203546f4dfa18fd505b8e64ed7148968..aa579d5dc12995475731589da686ee4271867db9 100644
--- a/src/KOKKOS/pair_lj_sdk_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_sdk_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -94,13 +94,13 @@ void PairLJSDKKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -231,7 +231,7 @@ void PairLJSDKKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_lj**,Kokkos::LayoutRight,DeviceType>("PairLJSDK::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_morse_kokkos.cpp b/src/KOKKOS/pair_morse_kokkos.cpp
index 08a9b82640b4ea439c67457210d6baf31cb34027..5768d7e42cedba7cbdfb16bec74a765af657b837 100644
--- a/src/KOKKOS/pair_morse_kokkos.cpp
+++ b/src/KOKKOS/pair_morse_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -61,8 +61,8 @@ template<class DeviceType>
 PairMorseKokkos<DeviceType>::~PairMorseKokkos()
 {
   if (allocated) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     k_cutsq = DAT::tdual_ffloat_2d();
     memory->sfree(cutsq);
     eatom = NULL;
@@ -99,13 +99,13 @@ void PairMorseKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -209,7 +209,7 @@ void PairMorseKokkos<DeviceType>::allocate()
 
   int n = atom->ntypes;
   memory->destroy(cutsq);
-  memory->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_params = Kokkos::DualView<params_morse**,Kokkos::LayoutRight,DeviceType>("PairMorse::params",n+1,n+1);
   params = k_params.template view<DeviceType>();
diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp
index d9a4f1ab83643ebd27f692c6290e436079c91522..0961cf44eb09ea1211ab7898c9c6532cbd518a14 100644
--- a/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp
+++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp
@@ -31,13 +31,14 @@
 #include "force.h"
 #include "comm.h"
 #include "neigh_list.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "citeme.h"
 #include "modify.h"
 #include "fix.h"
 #include "atom_masks.h"
 #include "neigh_request.h"
+#include "kokkos.h"
 
 using namespace LAMMPS_NS;
 
@@ -80,10 +81,10 @@ PairMultiLucyRXKokkos<DeviceType>::~PairMultiLucyRXKokkos()
 {
   if (copymode) return;
 
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
 
-  memory->destroy_kokkos(k_cutsq,cutsq);
+  memoryKK->destroy_kokkos(k_cutsq,cutsq);
 
   delete h_table;
   delete d_table;
@@ -153,13 +154,13 @@ void PairMultiLucyRXKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
@@ -864,20 +865,20 @@ void PairMultiLucyRXKokkos<DeviceType>::create_kokkos_tables()
 {
   const int tlm1 = tablength-1;
 
-  memory->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq");
-  memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
+  memoryKK->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq");
+  memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
 
   if(tabstyle == LOOKUP) {
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f");
   }
 
   if(tabstyle == LINEAR) {
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
-    memory->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
-    memory->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
+    memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
+    memoryKK->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df");
   }
 
   for(int i=0; i < ntables; i++) {
@@ -931,11 +932,11 @@ void PairMultiLucyRXKokkos<DeviceType>::allocate()
 
   memory->create(setflag,nt,nt,"pair:setflag");
 
-  memory->create_kokkos(k_cutsq,cutsq,nt,nt,"pair:cutsq");
+  memoryKK->create_kokkos(k_cutsq,cutsq,nt,nt,"pair:cutsq");
   d_cutsq = k_cutsq.template view<DeviceType>();
   k_cutsq.template modify<LMPHostType>();
 
-  memory->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex");
+  memoryKK->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex");
   d_table_const.tabindex = d_table->tabindex;
 
   memset(&setflag[0][0],0,nt*nt*sizeof(int));
diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
index b8ced4c847f6088efe98c09f50ea706626531883..aee1763b06e25c019a996c8b1c0c2b5df399188a 100644
--- a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
+++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
@@ -25,6 +25,7 @@ PairStyle(multi/lucy/rx/kk/host,PairMultiLucyRXKokkos<LMPHostType>)
 
 #include "pair_multi_lucy_rx.h"
 #include "pair_kokkos.h"
+#include "kokkos_base.h"
 #include "kokkos_type.h"
 
 namespace LAMMPS_NS {
@@ -43,7 +44,7 @@ template<int NEIGHFLAG, int NEWTON_PAIR, bool ONE_TYPE>
 struct TagPairMultiLucyRXComputeLocalDensity{};
 
 template<class DeviceType>
-class PairMultiLucyRXKokkos : public PairMultiLucyRX {
+class PairMultiLucyRXKokkos : public PairMultiLucyRX, public KokkosBase {
  public:
   typedef DeviceType device_type;
   typedef ArrayTypes<DeviceType> AT;
diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp
index d5f83f45373d9e4d32d6032f0fe343489077e885..1f596377679fcac252660addc37109675da0260e 100644
--- a/src/KOKKOS/pair_reaxc_kokkos.cpp
+++ b/src/KOKKOS/pair_reaxc_kokkos.cpp
@@ -32,12 +32,13 @@
 #include "respa.h"
 #include "math_const.h"
 #include "math_special.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 #include "reaxc_defs.h"
 #include "reaxc_lookup.h"
 #include "reaxc_tool_box.h"
+#include "modify.h"
 
 
 #define TEAMSIZE 128
@@ -81,12 +82,12 @@ PairReaxCKokkos<DeviceType>::~PairReaxCKokkos()
 {
   if (copymode) return;
 
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
 
-  memory->destroy_kokkos(k_tmpid,tmpid);
+  memoryKK->destroy_kokkos(k_tmpid,tmpid);
   tmpid = NULL;
-  memory->destroy_kokkos(k_tmpbo,tmpbo);
+  memoryKK->destroy_kokkos(k_tmpbo,tmpbo);
   tmpbo = NULL;
 }
 
@@ -1339,10 +1340,10 @@ void PairReaxCKokkos<DeviceType>::allocate_array()
 
   // FixReaxCSpecies
   if (fixspecies_flag) {
-    memory->destroy_kokkos(k_tmpid,tmpid);
-    memory->destroy_kokkos(k_tmpbo,tmpbo);
-    memory->create_kokkos(k_tmpid,tmpid,nmax,MAXSPECBOND,"pair:tmpid");
-    memory->create_kokkos(k_tmpbo,tmpbo,nmax,MAXSPECBOND,"pair:tmpbo");
+    memoryKK->destroy_kokkos(k_tmpid,tmpid);
+    memoryKK->destroy_kokkos(k_tmpbo,tmpbo);
+    memoryKK->create_kokkos(k_tmpid,tmpid,nmax,MAXSPECBOND,"pair:tmpid");
+    memoryKK->create_kokkos(k_tmpbo,tmpbo,nmax,MAXSPECBOND,"pair:tmpbo");
   }
 
   // FixReaxCBonds
@@ -1448,6 +1449,8 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxBuildListsFull, const int &
       }
     }
 
+    if (rsq > cut_bosq) continue;
+
     // bond_list
     const F_FLOAT rij = sqrt(rsq);
     const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1;
@@ -1635,6 +1638,8 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxBuildListsHalf<NEIGHFLAG>,
       }
     }
 
+    if (rsq > cut_bosq) continue;
+
     // bond_list
     const F_FLOAT rij = sqrt(rsq);
     const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1;
@@ -1856,6 +1861,8 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxBuildListsHalf_LessAtomics<
       }
     }
 
+    if (rsq > cut_bosq) continue;
+
     // bond_list
     const F_FLOAT rij = sqrt(rsq);
     const F_FLOAT p_bo1 = paramstwbp(itype,jtype).p_bo1;
@@ -3905,14 +3912,14 @@ void PairReaxCKokkos<DeviceType>::ev_setup(int eflag, int vflag)
 
   if (eflag_atom && atom->nmax > maxeatom) {
     maxeatom = atom->nmax;
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     v_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom && atom->nmax > maxvatom) {
     maxvatom = atom->nmax;
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     v_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp
index 3440f7c63923da0467c61b702c1184ab3cb1856c..63b4c19ae1d7c40d4e3234562b6b7eb8c54e9470 100644
--- a/src/KOKKOS/pair_sw_kokkos.cpp
+++ b/src/KOKKOS/pair_sw_kokkos.cpp
@@ -27,10 +27,10 @@
 #include "neigh_request.h"
 #include "force.h"
 #include "comm.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 #include "math_const.h"
@@ -63,8 +63,8 @@ template<class DeviceType>
 PairSWKokkos<DeviceType>::~PairSWKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     eatom = NULL;
     vatom = NULL;
   }
@@ -86,13 +86,13 @@ void PairSWKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp
index 7f763baae6fe7b40eb4830d243c0b714a6bcf2b1..b3e80d1f664e012555a826834df2d6b78ec7bba4 100644
--- a/src/KOKKOS/pair_table_kokkos.cpp
+++ b/src/KOKKOS/pair_table_kokkos.cpp
@@ -27,7 +27,7 @@
 #include "neighbor.h"
 #include "neigh_list.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -92,13 +92,13 @@ void PairTableKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -265,41 +265,41 @@ void PairTableKokkos<DeviceType>::create_kokkos_tables()
 {
   const int tlm1 = tablength-1;
 
-  memory->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits");
-  memory->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask");
-  memory->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq");
-  memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
-  memory->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6");
+  memoryKK->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits");
+  memoryKK->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask");
+  memoryKK->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq");
+  memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
+  memoryKK->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6");
 
   if(tabstyle == LOOKUP) {
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f");
   }
 
   if(tabstyle == LINEAR) {
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
-    memory->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
-    memory->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
+    memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
+    memoryKK->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df");
   }
 
   if(tabstyle == SPLINE) {
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
-    memory->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2");
-    memory->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
+    memoryKK->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2");
+    memoryKK->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2");
   }
 
   if(tabstyle == BITMAP) {
     int ntable = 1 << tablength;
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f");
-    memory->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de");
-    memory->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df");
-    memory->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f");
+    memoryKK->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de");
+    memoryKK->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df");
+    memoryKK->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq");
   }
 
 
@@ -410,8 +410,8 @@ void PairTableKokkos<DeviceType>::allocate()
   const int nt = atom->ntypes + 1;
 
   memory->create(setflag,nt,nt,"pair:setflag");
-  memory->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq");
-  memory->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex");
+  memoryKK->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq");
+  memoryKK->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex");
   d_table_const.cutsq = d_table->cutsq;
   d_table_const.tabindex = d_table->tabindex;
 
diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp
index 2f5a670537ce05f528d1c789c3070292cacd8c80..7bc5198d8cef6e8bbfcf40ba24e4d0bb575b9cec 100644
--- a/src/KOKKOS/pair_table_rx_kokkos.cpp
+++ b/src/KOKKOS/pair_table_rx_kokkos.cpp
@@ -27,11 +27,13 @@
 #include "neighbor.h"
 #include "neigh_list.h"
 #include "neigh_request.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 #include "fix.h"
 #include "kokkos_few.h"
+#include "kokkos.h"
+#include "modify.h"
 #include <cassert>
 
 using namespace LAMMPS_NS;
@@ -162,12 +164,12 @@ PairTableRXKokkos<DeviceType>::~PairTableRXKokkos()
   delete [] site1;
   delete [] site2;
 
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
 
   if (allocated) {
-    memory->destroy_kokkos(d_table->cutsq, cutsq);
-    memory->destroy_kokkos(d_table->tabindex, tabindex);
+    memoryKK->destroy_kokkos(d_table->cutsq, cutsq);
+    memoryKK->destroy_kokkos(d_table->tabindex, tabindex);
   }
 
   delete h_table;
@@ -621,13 +623,13 @@ void PairTableRXKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
   else evflag = vflag_fdotr = 0;
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.template view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.template view<DeviceType>();
   }
 
@@ -798,41 +800,41 @@ void PairTableRXKokkos<DeviceType>::create_kokkos_tables()
 {
   const int tlm1 = tablength-1;
 
-  memory->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits");
-  memory->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask");
-  memory->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq");
-  memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
-  memory->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6");
+  memoryKK->create_kokkos(d_table->nshiftbits,h_table->nshiftbits,ntables,"Table::nshiftbits");
+  memoryKK->create_kokkos(d_table->nmask,h_table->nmask,ntables,"Table::nmask");
+  memoryKK->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq");
+  memoryKK->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta");
+  memoryKK->create_kokkos(d_table->deltasq6,h_table->deltasq6,ntables,"Table::deltasq6");
 
   if(tabstyle == LOOKUP) {
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tlm1,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tlm1,"Table::f");
   }
 
   if(tabstyle == LINEAR) {
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
-    memory->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
-    memory->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
+    memoryKK->create_kokkos(d_table->de,h_table->de,ntables,tlm1,"Table::de");
+    memoryKK->create_kokkos(d_table->df,h_table->df,ntables,tlm1,"Table::df");
   }
 
   if(tabstyle == SPLINE) {
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
-    memory->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2");
-    memory->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,tablength,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,tablength,"Table::f");
+    memoryKK->create_kokkos(d_table->e2,h_table->e2,ntables,tablength,"Table::e2");
+    memoryKK->create_kokkos(d_table->f2,h_table->f2,ntables,tablength,"Table::f2");
   }
 
   if(tabstyle == BITMAP) {
     int ntable = 1 << tablength;
-    memory->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq");
-    memory->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e");
-    memory->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f");
-    memory->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de");
-    memory->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df");
-    memory->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq");
+    memoryKK->create_kokkos(d_table->rsq,h_table->rsq,ntables,ntable,"Table::rsq");
+    memoryKK->create_kokkos(d_table->e,h_table->e,ntables,ntable,"Table::e");
+    memoryKK->create_kokkos(d_table->f,h_table->f,ntables,ntable,"Table::f");
+    memoryKK->create_kokkos(d_table->de,h_table->de,ntables,ntable,"Table::de");
+    memoryKK->create_kokkos(d_table->df,h_table->df,ntables,ntable,"Table::df");
+    memoryKK->create_kokkos(d_table->drsq,h_table->drsq,ntables,ntable,"Table::drsq");
   }
 
 
@@ -943,8 +945,8 @@ void PairTableRXKokkos<DeviceType>::allocate()
   const int nt = atom->ntypes + 1;
 
   memory->create(setflag,nt,nt,"pair:setflag");
-  memory->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq");
-  memory->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex");
+  memoryKK->create_kokkos(d_table->cutsq,h_table->cutsq,cutsq,nt,nt,"pair:cutsq");
+  memoryKK->create_kokkos(d_table->tabindex,h_table->tabindex,tabindex,nt,nt,"pair:tabindex");
   d_table_const.cutsq = d_table->cutsq;
   d_table_const.tabindex = d_table->tabindex;
 
diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp
index 3a5c2227efe1b9f71e9b1277096882e86027336e..c585da60297b4a852b50ab19d00a060edaaf6f83 100644
--- a/src/KOKKOS/pair_tersoff_kokkos.cpp
+++ b/src/KOKKOS/pair_tersoff_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -60,8 +60,8 @@ template<class DeviceType>
 PairTersoffKokkos<DeviceType>::~PairTersoffKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -170,13 +170,13 @@ void PairTersoffKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp
index 9a59979f4c9d4d0279f5b830d0e66bcb1af39148..8e718fbf6f16df5017468b116c1b140a82eb0b4c 100644
--- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp
+++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -60,8 +60,8 @@ template<class DeviceType>
 PairTersoffMODKokkos<DeviceType>::~PairTersoffMODKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -170,13 +170,13 @@ void PairTersoffMODKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp
index 8468bb01f5fc545d177ad637de70ae8514087693..11a5ff100753ec02dafa657dd481222bfaf7875c 100644
--- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp
+++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp
@@ -31,7 +31,7 @@
 #include "integrate.h"
 #include "respa.h"
 #include "math_const.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 
@@ -71,8 +71,8 @@ template<class DeviceType>
 PairTersoffZBLKokkos<DeviceType>::~PairTersoffZBLKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
   }
 }
 
@@ -184,13 +184,13 @@ void PairTersoffZBLKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_vashishta_kokkos.cpp b/src/KOKKOS/pair_vashishta_kokkos.cpp
index fe2394ae84a9fea6847c5f22eef598c25719b95a..e7dd01bfe4b48e903149db04ab8bb3b7af6cd3b6 100644
--- a/src/KOKKOS/pair_vashishta_kokkos.cpp
+++ b/src/KOKKOS/pair_vashishta_kokkos.cpp
@@ -27,10 +27,10 @@
 #include "neigh_request.h"
 #include "force.h"
 #include "comm.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "neighbor.h"
 #include "neigh_list_kokkos.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
 #include "math_const.h"
@@ -62,8 +62,8 @@ template<class DeviceType>
 PairVashishtaKokkos<DeviceType>::~PairVashishtaKokkos()
 {
   if (!copymode) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->destroy_kokkos(k_vatom,vatom);
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
     eatom = NULL;
     vatom = NULL;
   }
@@ -85,13 +85,13 @@ void PairVashishtaKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
diff --git a/src/KOKKOS/pair_yukawa_kokkos.cpp b/src/KOKKOS/pair_yukawa_kokkos.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6560ec9684b3f88abb0143aeb39ca791de02affb
--- /dev/null
+++ b/src/KOKKOS/pair_yukawa_kokkos.cpp
@@ -0,0 +1,301 @@
+/* ----------------------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+/* ----------------------------------------------------------------------
+   Contributing authors: Stefan Paquay (Brandeis University)
+------------------------------------------------------------------------- */
+#include <math.h>
+#include <stdlib.h>
+#include "pair_yukawa_kokkos.h"
+#include "kokkos.h"
+#include "atom_kokkos.h"
+#include "comm.h"
+#include "force.h"
+#include "neighbor.h"
+#include "neigh_list.h"
+#include "neigh_request.h"
+#include "update.h"
+#include "integrate.h"
+#include "respa.h"
+#include "math_const.h"
+#include "memory_kokkos.h"
+#include "error.h"
+#include "atom_masks.h"
+
+using namespace LAMMPS_NS;
+using namespace MathConst;
+
+#define KOKKOS_CUDA_MAX_THREADS 256
+#define KOKKOS_CUDA_MIN_BLOCKS 8
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+PairYukawaKokkos<DeviceType>::PairYukawaKokkos(LAMMPS *lmp) : PairYukawa(lmp)
+{
+  respa_enable = 0;
+
+  atomKK = (AtomKokkos *) atom;
+  execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
+  datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK;
+  datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK;
+  cutsq = NULL;
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+PairYukawaKokkos<DeviceType>::~PairYukawaKokkos()
+{
+  if (allocated) {
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    k_cutsq = DAT::tdual_ffloat_2d();
+    memory->sfree(cutsq);
+    eatom = NULL;
+    vatom = NULL;
+    cutsq = NULL;
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+void PairYukawaKokkos<DeviceType>::cleanup_copy() {
+  // WHY needed: this prevents parent copy from deallocating any arrays
+  allocated = 0;
+  cutsq = NULL;
+  eatom = NULL;
+  vatom = NULL;
+}
+
+/* ----------------------------------------------------------------------
+   allocate all arrays
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void PairYukawaKokkos<DeviceType>::allocate()
+{
+  PairYukawa::allocate();
+
+  int n = atom->ntypes;
+  memory->destroy(cutsq);
+  memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
+  d_cutsq = k_cutsq.template view<DeviceType>();
+  k_params = Kokkos::DualView<params_yukawa**,
+                              Kokkos::LayoutRight,DeviceType>(
+                              "PairYukawa::params",n+1,n+1);
+
+  params = k_params.template view<DeviceType>();
+}
+
+/* ----------------------------------------------------------------------
+   init specific to this pair style
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void PairYukawaKokkos<DeviceType>::init_style()
+{
+  PairYukawa::init_style();
+
+  // error if rRESPA with inner levels
+
+  if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) {
+    int respa = 0;
+    if (((Respa *) update->integrate)->level_inner >= 0) respa = 1;
+    if (((Respa *) update->integrate)->level_middle >= 0) respa = 2;
+    if (respa)
+      error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle");
+  }
+
+  // irequest = neigh request made by parent class
+
+  neighflag = lmp->kokkos->neighflag;
+  int irequest = neighbor->nrequest - 1;
+
+  neighbor->requests[irequest]->
+    kokkos_host = Kokkos::Impl::is_same<DeviceType,LMPHostType>::value &&
+    !Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value;
+  neighbor->requests[irequest]->
+    kokkos_device = Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value;
+
+  if (neighflag == FULL) {
+    neighbor->requests[irequest]->full = 1;
+    neighbor->requests[irequest]->half = 0;
+  } else if (neighflag == HALF || neighflag == HALFTHREAD) {
+    neighbor->requests[irequest]->full = 0;
+    neighbor->requests[irequest]->half = 1;
+  } else {
+    error->all(FLERR,"Cannot use chosen neighbor list style with yukawa/kk");
+  }
+}
+
+/* ----------------------------------------------------------------------
+   init for one type pair i,j and corresponding j,i
+------------------------------------------------------------------------- */
+// Rewrite this.
+template<class DeviceType>
+double PairYukawaKokkos<DeviceType>::init_one(int i, int j)
+{
+  double cutone = PairYukawa::init_one(i,j);
+
+  k_params.h_view(i,j).a      = a[i][j];
+  k_params.h_view(i,j).offset = offset[i][j];
+  k_params.h_view(i,j).cutsq  = cutone*cutone;
+  k_params.h_view(j,i)        = k_params.h_view(i,j);
+
+  if(i<MAX_TYPES_STACKPARAMS+1 && j<MAX_TYPES_STACKPARAMS+1) {
+    m_params[i][j] = m_params[j][i] = k_params.h_view(i,j);
+    m_cutsq[j][i] = m_cutsq[i][j] = cutone*cutone;
+  }
+
+  k_cutsq.h_view(i,j) = k_cutsq.h_view(j,i) = cutone*cutone;
+  k_cutsq.template modify<LMPHostType>();
+  k_params.template modify<LMPHostType>();
+
+  return cutone;
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+void PairYukawaKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
+{
+  eflag = eflag_in;
+  vflag = vflag_in;
+
+
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
+
+  if (eflag || vflag) ev_setup(eflag,vflag,0);
+  else evflag = vflag_fdotr = 0;
+
+  // reallocate per-atom arrays if necessary
+
+  if (eflag_atom) {
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    d_eatom = k_eatom.view<DeviceType>();
+  }
+  if (vflag_atom) {
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    d_vatom = k_vatom.view<DeviceType>();
+  }
+
+  atomKK->sync(execution_space,datamask_read);
+  k_cutsq.template sync<DeviceType>();
+  k_params.template sync<DeviceType>();
+  if (eflag || vflag) atomKK->modified(execution_space,datamask_modify);
+  else atomKK->modified(execution_space,F_MASK);
+
+  x = atomKK->k_x.view<DeviceType>();
+  c_x = atomKK->k_x.view<DeviceType>();
+  f = atomKK->k_f.view<DeviceType>();
+  type = atomKK->k_type.view<DeviceType>();
+  tag = atomKK->k_tag.view<DeviceType>();
+  nlocal = atom->nlocal;
+  nall = atom->nlocal + atom->nghost;
+  newton_pair = force->newton_pair;
+  special_lj[0] = force->special_lj[0];
+  special_lj[1] = force->special_lj[1];
+  special_lj[2] = force->special_lj[2];
+  special_lj[3] = force->special_lj[3];
+
+  // loop over neighbors of my atoms
+
+  EV_FLOAT ev = pair_compute<PairYukawaKokkos<DeviceType>,void >(
+    this,(NeighListKokkos<DeviceType>*)list);
+
+  if (eflag_global) eng_vdwl += ev.evdwl;
+  if (vflag_global) {
+    virial[0] += ev.v[0];
+    virial[1] += ev.v[1];
+    virial[2] += ev.v[2];
+    virial[3] += ev.v[3];
+    virial[4] += ev.v[4];
+    virial[5] += ev.v[5];
+  }
+
+  if (vflag_fdotr) pair_virial_fdotr_compute(this);
+
+  if (eflag_atom) {
+    k_eatom.template modify<DeviceType>();
+    k_eatom.template sync<LMPHostType>();
+  }
+
+  if (vflag_atom) {
+    k_vatom.template modify<DeviceType>();
+    k_vatom.template sync<LMPHostType>();
+  }
+}
+
+
+
+template<class DeviceType>
+template<bool STACKPARAMS, class Specialisation>
+KOKKOS_INLINE_FUNCTION
+F_FLOAT PairYukawaKokkos<DeviceType>::
+compute_fpair(const F_FLOAT& rsq, const int& i, const int&j,
+              const int& itype, const int& jtype) const {
+  (void) i;
+  (void) j;
+  const F_FLOAT rr     = sqrt(rsq);
+  // Fetch the params either off the stack or from some mapped memory?
+  const F_FLOAT aa     = STACKPARAMS ? m_params[itype][jtype].a
+                                     : params(itype,jtype).a;
+
+  // U   = a * exp(-kappa*r) / r
+  // f   = (kappa * a * exp(-kappa*r) / r + a*exp(-kappa*r)/r^2)*grad(r)
+  //     = (kappa + 1/r) * (a * exp(-kappa*r) / r)
+  // f/r = (kappa + 1/r) * (a * exp(-kappa*r) / r^2)
+  const F_FLOAT rinv = 1.0 / rr;
+  const F_FLOAT rinv2 = rinv*rinv;
+  const F_FLOAT screening = exp(-kappa*rr);
+  const F_FLOAT forceyukawa = aa * screening * (kappa + rinv);
+  const F_FLOAT fpair = forceyukawa * rinv2;
+
+  return fpair;
+}
+
+template<class DeviceType>
+template<bool STACKPARAMS, class Specialisation>
+KOKKOS_INLINE_FUNCTION
+F_FLOAT PairYukawaKokkos<DeviceType>::
+compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j,
+              const int& itype, const int& jtype) const {
+  (void) i;
+  (void) j;
+  const F_FLOAT rr     = sqrt(rsq);
+  const F_FLOAT aa     = STACKPARAMS ? m_params[itype][jtype].a
+                                     : params(itype,jtype).a;
+  const F_FLOAT offset = STACKPARAMS ? m_params[itype][jtype].offset
+                                     : params(itype,jtype).offset;
+
+  // U   = a * exp(-kappa*r) / r
+  // f   = (kappa * a * exp(-kappa*r) / r + a*exp(-kappa*r)/r^2)*grad(r)
+  //     = (kappa + 1/r) * (a * exp(-kappa*r) / r)
+  // f/r = (kappa + 1/r) * (a * exp(-kappa*r) / r^2)
+  const F_FLOAT rinv = 1.0 / rr;
+  const F_FLOAT screening = exp(-kappa*rr);
+
+  return aa * screening * rinv - offset;
+}
+
+
+namespace LAMMPS_NS {
+template class PairYukawaKokkos<LMPDeviceType>;
+#ifdef KOKKOS_HAVE_CUDA
+template class PairYukawaKokkos<LMPHostType>;
+#endif
+}
diff --git a/src/KOKKOS/pair_yukawa_kokkos.h b/src/KOKKOS/pair_yukawa_kokkos.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4c8cf05b781ddbfd7ad65c53eb900aba7e4a9a0
--- /dev/null
+++ b/src/KOKKOS/pair_yukawa_kokkos.h
@@ -0,0 +1,146 @@
+/* -*- c++ -*- ----------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+#ifdef PAIR_CLASS
+
+PairStyle(yukawa/kk,PairYukawaKokkos<LMPDeviceType>)
+PairStyle(yukawa/kk/device,PairYukawaKokkos<LMPDeviceType>)
+PairStyle(yukawa/kk/host,PairYukawaKokkos<LMPHostType>)
+
+#else
+
+#ifndef LMP_PAIR_YUKAWA_KOKKOS_H
+#define LMP_PAIR_YUKAWA_KOKKOS_H
+
+#include "pair_kokkos.h"
+#include "pair_yukawa.h"
+#include "neigh_list_kokkos.h"
+
+namespace LAMMPS_NS {
+
+template<class DeviceType>
+class PairYukawaKokkos : public PairYukawa {
+ public:
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF};
+  enum {COUL_FLAG=0};
+  typedef DeviceType device_type;
+  typedef ArrayTypes<DeviceType> AT;
+
+  PairYukawaKokkos(class LAMMPS *);
+  virtual ~PairYukawaKokkos();
+
+  void compute(int, int);
+  void init_style();
+  double init_one(int,int);
+
+  struct params_yukawa {
+    KOKKOS_INLINE_FUNCTION
+    params_yukawa(){ cutsq=0, a = 0; offset = 0; }
+    KOKKOS_INLINE_FUNCTION
+    params_yukawa(int i){ cutsq=0, a = 0; offset = 0; }
+    F_FLOAT cutsq, a, offset;
+  };
+
+
+ protected:
+  void cleanup_copy();
+
+  template<bool STACKPARAMS, class Specialisation>
+  KOKKOS_INLINE_FUNCTION
+  F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j,
+                        const int& itype, const int& jtype) const;
+
+  template<bool STACKPARAMS, class Specialisation>
+  KOKKOS_INLINE_FUNCTION
+  F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j,
+                        const int& itype, const int& jtype) const;
+
+  template<bool STACKPARAMS, class Specialisation>
+  KOKKOS_INLINE_FUNCTION
+  F_FLOAT compute_ecoul(const F_FLOAT& rsq, const int& i, const int&j,
+                        const int& itype, const int& jtype) const
+  {
+    return 0;
+  }
+
+
+  Kokkos::DualView<params_yukawa**,Kokkos::LayoutRight,DeviceType> k_params;
+  typename Kokkos::DualView<params_yukawa**,Kokkos::LayoutRight,DeviceType>::t_dev_const_um params;
+  params_yukawa m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
+  F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
+  typename AT::t_x_array_randomread x;
+  typename AT::t_x_array c_x;
+  typename AT::t_f_array f;
+  typename AT::t_int_1d_randomread type;
+
+  DAT::tdual_efloat_1d k_eatom;
+  DAT::tdual_virial_array k_vatom;
+  typename AT::t_efloat_1d d_eatom;
+  typename AT::t_virial_array d_vatom;
+  typename AT::t_tagint_1d tag;
+
+  int newton_pair;
+  double special_lj[4];
+
+  typename AT::tdual_ffloat_2d k_cutsq;
+  typename AT::t_ffloat_2d d_cutsq;
+
+
+  int neighflag;
+  int nlocal,nall,eflag,vflag;
+
+  void allocate();
+  friend class PairComputeFunctor<PairYukawaKokkos,FULL,true>;
+  friend class PairComputeFunctor<PairYukawaKokkos,HALF,true>;
+  friend class PairComputeFunctor<PairYukawaKokkos,HALFTHREAD,true>;
+  friend class PairComputeFunctor<PairYukawaKokkos,N2,true>;
+  friend class PairComputeFunctor<PairYukawaKokkos,FULL,false>;
+  friend class PairComputeFunctor<PairYukawaKokkos,HALF,false>;
+  friend class PairComputeFunctor<PairYukawaKokkos,HALFTHREAD,false>;
+  friend class PairComputeFunctor<PairYukawaKokkos,N2,false>;
+  friend EV_FLOAT pair_compute_neighlist<PairYukawaKokkos,FULL,void>(
+    PairYukawaKokkos*,NeighListKokkos<DeviceType>*);
+  friend EV_FLOAT pair_compute_neighlist<PairYukawaKokkos,HALF,void>(
+    PairYukawaKokkos*,NeighListKokkos<DeviceType>*);
+  friend EV_FLOAT pair_compute_neighlist<PairYukawaKokkos,HALFTHREAD,void>(
+    PairYukawaKokkos*,NeighListKokkos<DeviceType>*);
+  friend EV_FLOAT pair_compute_neighlist<PairYukawaKokkos,N2,void>(
+    PairYukawaKokkos*,NeighListKokkos<DeviceType>*);
+  friend EV_FLOAT pair_compute<PairYukawaKokkos,void>(
+    PairYukawaKokkos*,NeighListKokkos<DeviceType>*);
+  friend void pair_virial_fdotr_compute<PairYukawaKokkos>(PairYukawaKokkos*);
+
+};
+
+}
+
+#endif
+#endif
+
+/* ERROR/WARNING messages:
+
+E: Illegal ... command
+
+Self-explanatory.  Check the input script syntax and compare to the
+documentation for the command.  You can use -echo screen as a
+command-line option when running LAMMPS to see the offending line.
+
+E: Incorrect args for pair coefficients
+
+Self-explanatory.  Check the input script or data file.
+
+E: Cannot use chosen neighbor list style with yukawa/kk
+
+That style is not supported by Kokkos.
+
+*/
diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp
index bd3ed3644f53373305a995382144a6d5c27a5432..cf6e2814c0e0bb56f5a19b2a2481ea019259e114 100644
--- a/src/KOKKOS/pppm_kokkos.cpp
+++ b/src/KOKKOS/pppm_kokkos.cpp
@@ -32,9 +32,10 @@
 #include "domain.h"
 #include "fft3d_wrap.h"
 #include "remap_wrap.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
 #include "atom_masks.h"
+#include "kokkos.h"
 
 #include "math_const.h"
 #include "math_special_kokkos.h"
@@ -162,8 +163,8 @@ PPPMKokkos<DeviceType>::~PPPMKokkos()
   //memory->destroy(part2grid);
   //memory->destroy(acons);
   
-  memory->destroy_kokkos(k_eatom,eatom);
-  memory->destroy_kokkos(k_vatom,vatom);
+  memoryKK->destroy_kokkos(k_eatom,eatom);
+  memoryKK->destroy_kokkos(k_vatom,vatom);
   eatom = NULL;
   vatom = NULL;
 }
@@ -618,13 +619,13 @@ void PPPMKokkos<DeviceType>::compute(int eflag, int vflag)
   // reallocate per-atom arrays if necessary
 
   if (eflag_atom) {
-    memory->destroy_kokkos(k_eatom,eatom);
-    memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
+    memoryKK->destroy_kokkos(k_eatom,eatom);
+    memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
     d_eatom = k_eatom.view<DeviceType>();
   }
   if (vflag_atom) {
-    memory->destroy_kokkos(k_vatom,vatom);
-    memory->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
+    memoryKK->destroy_kokkos(k_vatom,vatom);
+    memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
     d_vatom = k_vatom.view<DeviceType>();
   }
 
@@ -805,12 +806,12 @@ void PPPMKokkos<DeviceType>::allocate()
 {
   d_density_brick = typename AT::t_FFT_SCALAR_3d("pppm:density_brick",nzhi_out-nzlo_out+1,nyhi_out-nylo_out+1,nxhi_out-nxlo_out+1);
 
-  memory->create_kokkos(k_density_fft,density_fft,nfft_both,"pppm:d_density_fft");
+  memoryKK->create_kokkos(k_density_fft,density_fft,nfft_both,"pppm:d_density_fft");
   d_density_fft = k_density_fft.view<DeviceType>();
 
   d_greensfn = typename AT::t_float_1d("pppm:greensfn",nfft_both);
-  memory->create_kokkos(k_work1,work1,2*nfft_both,"pppm:work1");
-  memory->create_kokkos(k_work2,work2,2*nfft_both,"pppm:work2");
+  memoryKK->create_kokkos(k_work1,work1,2*nfft_both,"pppm:work1");
+  memoryKK->create_kokkos(k_work2,work2,2*nfft_both,"pppm:work2");
   d_work1 = k_work1.view<DeviceType>();
   d_work2 = k_work2.view<DeviceType>();
   d_vg = typename AT::t_virial_array("pppm:vg",nfft_both);
@@ -878,13 +879,13 @@ void PPPMKokkos<DeviceType>::allocate()
 template<class DeviceType>
 void PPPMKokkos<DeviceType>::deallocate()
 {
-  memory->destroy_kokkos(d_density_fft,density_fft);
+  memoryKK->destroy_kokkos(d_density_fft,density_fft);
   density_fft = NULL;
-  memory->destroy_kokkos(d_greensfn,greensfn);
+  memoryKK->destroy_kokkos(d_greensfn,greensfn);
   greensfn = NULL;
-  memory->destroy_kokkos(d_work1,work1);
+  memoryKK->destroy_kokkos(d_work1,work1);
   work1 = NULL;
-  memory->destroy_kokkos(d_work2,work2);
+  memoryKK->destroy_kokkos(d_work2,work2);
   work2 = NULL;
 
   delete fft1;
@@ -2631,7 +2632,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_fieldforce_peratom, const int &i
 ------------------------------------------------------------------------- */
 
 template<class DeviceType>
-void PPPMKokkos<DeviceType>::pack_forward_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
+void PPPMKokkos<DeviceType>::pack_forward_kspace_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
 {
   typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
   d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
@@ -2687,7 +2688,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_pack_forward2, const int &i) con
 ------------------------------------------------------------------------- */
 
 template<class DeviceType>
-void PPPMKokkos<DeviceType>::unpack_forward_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
+void PPPMKokkos<DeviceType>::unpack_forward_kspace_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
 {
   typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
   d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
@@ -2744,7 +2745,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_unpack_forward2, const int &i) c
 ------------------------------------------------------------------------- */
 
 template<class DeviceType>
-void PPPMKokkos<DeviceType>::pack_reverse_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
+void PPPMKokkos<DeviceType>::pack_reverse_kspace_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
 {
   typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
   d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
@@ -2774,7 +2775,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_pack_reverse, const int &i) cons
 ------------------------------------------------------------------------- */
 
 template<class DeviceType>
-void PPPMKokkos<DeviceType>::unpack_reverse_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
+void PPPMKokkos<DeviceType>::unpack_reverse_kspace_kokkos(int flag, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
 {
   typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
   d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h
index 4e6bb1d74c293a74397b94dcc355b2972216186b..c328b488d0260e5e4c45993f6b83ee4846a392e9 100644
--- a/src/KOKKOS/pppm_kokkos.h
+++ b/src/KOKKOS/pppm_kokkos.h
@@ -24,6 +24,7 @@ KSpaceStyle(pppm/kk/host,PPPMKokkos<LMPHostType>)
 
 #include "pppm.h"
 #include "gridcomm_kokkos.h"
+#include "kokkos_base.h"
 #include "kokkos_type.h"
 
 namespace LAMMPS_NS {
@@ -86,7 +87,7 @@ struct TagPPPM_slabcorr4{};
 struct TagPPPM_timing_zero{};
 
 template<class DeviceType>
-class PPPMKokkos : public PPPM {
+class PPPMKokkos : public PPPM, public KokkosBase {
  public:
   typedef DeviceType device_type;
   typedef ArrayTypes<DeviceType> AT;
@@ -379,10 +380,10 @@ class PPPMKokkos : public PPPM {
 
   // grid communication
 
-  virtual void pack_forward_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
-  virtual void unpack_forward_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
-  virtual void pack_reverse_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
-  virtual void unpack_reverse_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
+  void pack_forward_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
+  void unpack_forward_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
+  void pack_reverse_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
+  void unpack_reverse_kspace_kokkos(int, Kokkos::DualView<FFT_SCALAR*,Kokkos::LayoutRight,LMPDeviceType> &, int, DAT::tdual_int_2d &, int);
 
   // triclinic
 
diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h
index e14ac4d0c0db75fe98f3e7525f43d8505ab30d7e..532bc588e29746f16a427d44264c39d8f48b0608 100644
--- a/src/KOKKOS/region_block_kokkos.h
+++ b/src/KOKKOS/region_block_kokkos.h
@@ -23,6 +23,7 @@ RegionStyle(block/kk/host,RegBlockKokkos<LMPHostType>)
 #define LMP_REGION_BLOCK_KOKKOS_H
 
 #include "region_block.h"
+#include "kokkos_base.h"
 #include "kokkos_type.h"
 
 namespace LAMMPS_NS {
@@ -30,7 +31,7 @@ namespace LAMMPS_NS {
 struct TagRegBlockMatchAll{};
 
 template<class DeviceType>
-class RegBlockKokkos : public RegBlock {
+class RegBlockKokkos : public RegBlock, public KokkosBase {
   friend class FixPour;
 
  public:
diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp
index adec5ff1bd9d7520c2c469638d497759375c362a..5fa03a098925430d50f5dd09bc59612398a9d759 100644
--- a/src/KOKKOS/verlet_kokkos.cpp
+++ b/src/KOKKOS/verlet_kokkos.cpp
@@ -32,8 +32,9 @@
 #include "compute.h"
 #include "fix.h"
 #include "timer.h"
-#include "memory.h"
+#include "memory_kokkos.h"
 #include "error.h"
+#include "kokkos.h"
 
 #include <ctime>
 
diff --git a/src/Makefile b/src/Makefile
index e0f0db77fe3d5eea0ed95b04541047344919ee45..c3c84b366575930279960c624dec871a42869342 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -17,12 +17,12 @@ SHLINK = liblammps.so
 OBJDIR =   Obj_$@
 OBJSHDIR = Obj_shared_$@
 
-SRC =	$(wildcard *.cpp)
-INC =	$(wildcard *.h)
+SRC =	$(filter-out library.cpp,$(wildcard *.cpp))
+INC =	$(filter-out library.h,$(wildcard *.h))
 OBJ = 	$(SRC:.cpp=.o)
 
-SRCLIB = $(filter-out main.cpp,$(SRC))
-OBJLIB = $(filter-out main.o,$(OBJ))
+SRCLIB = $(filter-out main.cpp,$(SRC)) library.cpp
+OBJLIB = $(filter-out main.o,$(OBJ)) library.o
 
 # Command-line options for mode: exe (default), shexe, lib, shlib
 
@@ -176,7 +176,7 @@ help:
 	  then cp Makefile.package.settings.empty Makefile.package.settings; fi
 	@cp Makefile.package Makefile.package.settings $(objdir)
 	@cd $(objdir); rm -f .depend; \
-	$(MAKE) $(MFLAGS) "SRC = $(SRC)" "INC = $(INC)" depend || :
+	$(MAKE) $(MFLAGS) "SRC = $(SRC) library.cpp" "INC = $(INC) library.h" depend || :
 ifeq ($(mode),exe)
 	@cd $(objdir); \
 	$(MAKE) $(MFLAGS) "OBJ = $(OBJ)" "INC = $(INC)" "SHFLAGS =" \
diff --git a/src/Purge.list b/src/Purge.list
index e4a9e46309188b75307d1bfe43fe25a95ef0d5f6..d4a824b36c1317d477ec0813847f92cb4dfa3cff 100644
--- a/src/Purge.list
+++ b/src/Purge.list
@@ -19,6 +19,9 @@ style_neigh_stencil.h
 # deleted on 15 December 2017
 fix_python.cpp
 fix_python.h
+# deleted on 1 December 2017
+npair_half_bin_newtoff_intel.cpp
+npair_half_bin_newtoff_intel.h
 # deleted on 11 October 2017
 fix_shear_history_omp.cpp
 fix_shear_history_omp.h
diff --git a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp
index 4163a816ac9bcd8662fd25facb1200019071cd76..f78ced3d8bd96caaa35798db21f1bce5f19a05e2 100644
--- a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp
+++ b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp
@@ -32,6 +32,8 @@
 #include "math_const.h"
 #include "memory.h"
 #include "error.h"
+#include "modify.h"
+#include "domain.h"
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
diff --git a/src/USER-DRUDE/pair_thole.cpp b/src/USER-DRUDE/pair_thole.cpp
index abb37b82b766581aafadb5519f76169ca8289491..ace119ce523892b0ad7a8d52c0288f0bc0f725b4 100644
--- a/src/USER-DRUDE/pair_thole.cpp
+++ b/src/USER-DRUDE/pair_thole.cpp
@@ -25,6 +25,8 @@
 #include "error.h"
 #include "fix.h"
 #include "fix_store.h"
+#include "domain.h"
+#include "modify.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/USER-INTEL/angle_charmm_intel.cpp b/src/USER-INTEL/angle_charmm_intel.cpp
index 031c9642000c22a6aa7f4156db319de5409fce6e..bcaecb4696fa1d93e277d473e931b268298c5153 100644
--- a/src/USER-INTEL/angle_charmm_intel.cpp
+++ b/src/USER-INTEL/angle_charmm_intel.cpp
@@ -23,6 +23,7 @@
 #include "domain.h"
 #include "comm.h"
 #include "force.h"
+#include "modify.h"
 #include "math_const.h"
 #include "memory.h"
 #include "suffix.h"
diff --git a/src/USER-INTEL/angle_harmonic_intel.cpp b/src/USER-INTEL/angle_harmonic_intel.cpp
index 84220277d7a736131c30fa37d79fd93364e0c4ca..ffc81c496d77c654f35d6f0e1ad71a39a06844ee 100644
--- a/src/USER-INTEL/angle_harmonic_intel.cpp
+++ b/src/USER-INTEL/angle_harmonic_intel.cpp
@@ -23,6 +23,7 @@
 #include "domain.h"
 #include "comm.h"
 #include "force.h"
+#include "modify.h"
 #include "math_const.h"
 #include "memory.h"
 #include "suffix.h"
diff --git a/src/USER-INTEL/bond_fene_intel.cpp b/src/USER-INTEL/bond_fene_intel.cpp
index 93d64ed631f5466baec735c52a2770160b2eb8fb..004a2e5413d6d566cb536b9d4290e80540315e81 100644
--- a/src/USER-INTEL/bond_fene_intel.cpp
+++ b/src/USER-INTEL/bond_fene_intel.cpp
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 #include "bond_fene_intel.h"
 #include "atom.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "domain.h"
 #include "comm.h"
diff --git a/src/USER-INTEL/bond_harmonic_intel.cpp b/src/USER-INTEL/bond_harmonic_intel.cpp
index 0ac466f11386c99bef29b95a33e086349389239c..0c714edc0959519621b624d19dd6e79b5b081977 100644
--- a/src/USER-INTEL/bond_harmonic_intel.cpp
+++ b/src/USER-INTEL/bond_harmonic_intel.cpp
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 #include "bond_harmonic_intel.h"
 #include "atom.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "domain.h"
 #include "comm.h"
diff --git a/src/USER-INTEL/dihedral_charmm_intel.cpp b/src/USER-INTEL/dihedral_charmm_intel.cpp
index 0e13e92251594d04348d98f2200c3501a5b29fd5..c8429dc8ff7079930f00459c33ad85674ebaf222 100644
--- a/src/USER-INTEL/dihedral_charmm_intel.cpp
+++ b/src/USER-INTEL/dihedral_charmm_intel.cpp
@@ -21,6 +21,7 @@
 #include "atom.h"
 #include "comm.h"
 #include "memory.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "domain.h"
 #include "force.h"
diff --git a/src/USER-INTEL/dihedral_fourier_intel.cpp b/src/USER-INTEL/dihedral_fourier_intel.cpp
index 805ffc0e256177f294bc8f2b118e778c4cd7054e..772ea5b02fdf4a84838bd7a59a90def0b8a3d107 100644
--- a/src/USER-INTEL/dihedral_fourier_intel.cpp
+++ b/src/USER-INTEL/dihedral_fourier_intel.cpp
@@ -21,6 +21,7 @@
 #include "atom.h"
 #include "comm.h"
 #include "memory.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "domain.h"
 #include "force.h"
diff --git a/src/USER-INTEL/dihedral_harmonic_intel.cpp b/src/USER-INTEL/dihedral_harmonic_intel.cpp
index 5d16b0da745425abd66617ab50043ef796d78db3..b35ea4e03a9b67a3b619028c0c559b304cbbaf07 100644
--- a/src/USER-INTEL/dihedral_harmonic_intel.cpp
+++ b/src/USER-INTEL/dihedral_harmonic_intel.cpp
@@ -21,6 +21,7 @@
 #include "atom.h"
 #include "comm.h"
 #include "memory.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "domain.h"
 #include "force.h"
diff --git a/src/USER-INTEL/dihedral_opls_intel.cpp b/src/USER-INTEL/dihedral_opls_intel.cpp
index e290ab90616b94df0135264dcbbf66fe8546a36a..6b7b2c81ebd75bace530cbde5dd9bee1f0981c57 100644
--- a/src/USER-INTEL/dihedral_opls_intel.cpp
+++ b/src/USER-INTEL/dihedral_opls_intel.cpp
@@ -21,6 +21,7 @@
 #include "atom.h"
 #include "comm.h"
 #include "memory.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "domain.h"
 #include "force.h"
diff --git a/src/USER-INTEL/fix_intel.cpp b/src/USER-INTEL/fix_intel.cpp
index eac48b8510b4aa67a5e93f689ae1381510e02b57..3e36c8f7a937b0e254389c4099897a62aa9ac236 100644
--- a/src/USER-INTEL/fix_intel.cpp
+++ b/src/USER-INTEL/fix_intel.cpp
@@ -32,6 +32,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <math.h>
 
 #ifdef _LMP_INTEL_OFFLOAD
 #ifndef INTEL_OFFLOAD_NOAFFINITY
diff --git a/src/USER-INTEL/nbin_intel.cpp b/src/USER-INTEL/nbin_intel.cpp
index 3a36ead499ebe34a1dfcce5350abbd1f13fb8d6b..9a1dae36ca465b08d8cbbf63407597306b810553 100644
--- a/src/USER-INTEL/nbin_intel.cpp
+++ b/src/USER-INTEL/nbin_intel.cpp
@@ -18,8 +18,9 @@
 #include "nbin_intel.h"
 #include "atom.h"
 #include "group.h"
-#include "domain.h"
 #include "comm.h"
+#include "domain.h"
+#include "modify.h"
 #include "update.h"
 #include "error.h"
 
diff --git a/src/USER-INTEL/npair_full_bin_ghost_intel.cpp b/src/USER-INTEL/npair_full_bin_ghost_intel.cpp
index e6d45d7b2c6941fa87c24cd089ee46863b4828ee..a814891f2599ad73fcac0d8db7064e56ce173168 100644
--- a/src/USER-INTEL/npair_full_bin_ghost_intel.cpp
+++ b/src/USER-INTEL/npair_full_bin_ghost_intel.cpp
@@ -21,6 +21,8 @@
 #include "neigh_list.h"
 #include "atom.h"
 #include "atom_vec.h"
+#include "comm.h"
+#include "domain.h"
 #include "molecule.h"
 #include "error.h"
 
diff --git a/src/USER-INTEL/npair_full_bin_intel.cpp b/src/USER-INTEL/npair_full_bin_intel.cpp
index 06c10c080fd9e506760c0d1e66c93ff76233ee7c..60b912d796146d2c9a7f7a15d116afdc430c20ff 100644
--- a/src/USER-INTEL/npair_full_bin_intel.cpp
+++ b/src/USER-INTEL/npair_full_bin_intel.cpp
@@ -20,6 +20,7 @@
 #include "neigh_list.h"
 #include "atom.h"
 #include "comm.h"
+#include "domain.h"
 #include "group.h"
 
 using namespace LAMMPS_NS;
diff --git a/src/USER-INTEL/npair_half_bin_newton_intel.cpp b/src/USER-INTEL/npair_half_bin_newton_intel.cpp
index c761557097cf96b677dc20a355a94e186ac5d8c5..8c024a46046827985db3f8047446ad06df61eba1 100644
--- a/src/USER-INTEL/npair_half_bin_newton_intel.cpp
+++ b/src/USER-INTEL/npair_half_bin_newton_intel.cpp
@@ -20,6 +20,7 @@
 #include "neigh_list.h"
 #include "atom.h"
 #include "comm.h"
+#include "domain.h"
 #include "group.h"
 
 using namespace LAMMPS_NS;
diff --git a/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp b/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp
index d70f1ec5897a0d7b1e8a7b5b9633f9882ce2c54f..653a95139498dbe1d34b5c8d77ca706664e02c56 100644
--- a/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp
+++ b/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp
@@ -20,6 +20,7 @@
 #include "neigh_list.h"
 #include "atom.h"
 #include "comm.h"
+#include "domain.h"
 #include "group.h"
 
 using namespace LAMMPS_NS;
diff --git a/src/USER-INTEL/npair_intel.cpp b/src/USER-INTEL/npair_intel.cpp
index 0068e02635c7d6d7bd145fe45a35bade50f64f0c..234557c941c1ce7d765e745fb918d6a42297c033 100644
--- a/src/USER-INTEL/npair_intel.cpp
+++ b/src/USER-INTEL/npair_intel.cpp
@@ -15,6 +15,10 @@
    Contributing author: W. Michael Brown (Intel)
 ------------------------------------------------------------------------- */
 
+#include "comm.h"
+#include "domain.h"
+#include "timer.h"
+#include "modify.h"
 #include "npair_intel.h"
 #include "nstencil.h"
 
diff --git a/src/USER-INTEL/pair_eam_intel.cpp b/src/USER-INTEL/pair_eam_intel.cpp
index b97128bf9ff434fbc71c02d204c25128e9583a20..ea4ee30d52602440b06b81603a3d93897b72cba3 100644
--- a/src/USER-INTEL/pair_eam_intel.cpp
+++ b/src/USER-INTEL/pair_eam_intel.cpp
@@ -23,6 +23,7 @@
 #include "atom.h"
 #include "force.h"
 #include "comm.h"
+#include "modify.h"
 #include "neighbor.h"
 #include "neigh_list.h"
 #include "neigh_request.h"
diff --git a/src/USER-INTEL/pppm_disp_intel.cpp b/src/USER-INTEL/pppm_disp_intel.cpp
index 1269579ff4f26addaa08d00c19ff433626d5a089..bd41f8b531cc18be1e6cf79376de773a52c9d7c3 100644
--- a/src/USER-INTEL/pppm_disp_intel.cpp
+++ b/src/USER-INTEL/pppm_disp_intel.cpp
@@ -20,7 +20,10 @@
 #include <math.h>
 #include "pppm_disp_intel.h"
 #include "atom.h"
+#include "comm.h"
+#include "domain.h"
 #include "error.h"
+#include "modify.h"
 #include "fft3d_wrap.h"
 #include "gridcomm.h"
 #include "math_const.h"
diff --git a/src/USER-INTEL/pppm_intel.cpp b/src/USER-INTEL/pppm_intel.cpp
index db855b75ef8f877303ae6186e12fc59314729397..30f8f4c5c0677890115a5f5668a557f2053bb054 100644
--- a/src/USER-INTEL/pppm_intel.cpp
+++ b/src/USER-INTEL/pppm_intel.cpp
@@ -23,7 +23,10 @@
 #include <math.h>
 #include "pppm_intel.h"
 #include "atom.h"
+#include "comm.h"
+#include "domain.h"
 #include "error.h"
+#include "modify.h"
 #include "fft3d_wrap.h"
 #include "gridcomm.h"
 #include "math_const.h"
diff --git a/src/USER-MISC/README b/src/USER-MISC/README
index 5af5b22eb7889609834a4449bb5a118e75789c86..a8c33fa38056454194ff2346c9bd2d4822019200 100644
--- a/src/USER-MISC/README
+++ b/src/USER-MISC/README
@@ -63,6 +63,7 @@ pair_style coul/diel, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11
 pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11
 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11
 pair_style eam/cd, Alexander Stukowski, stukowski at mm.tu-darmstadt.de, 7 Nov 09
+pair_style extep, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Nov 17
 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11
 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15
 pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13
diff --git a/src/USER-MISC/pair_extep.cpp b/src/USER-MISC/pair_extep.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cf859a28f8380fbfb65dd2b72092486f7d5941f3
--- /dev/null
+++ b/src/USER-MISC/pair_extep.cpp
@@ -0,0 +1,1189 @@
+/* ----------------------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+/* ----------------------------------------------------------------------
+   Contributing author: Jan Los
+------------------------------------------------------------------------- */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "pair_extep.h"
+#include "atom.h"
+#include "neighbor.h"
+#include "neigh_list.h"
+#include "neigh_request.h"
+#include "my_page.h"
+#include "force.h"
+#include "comm.h"
+#include "memory.h"
+#include "error.h"
+
+#include "math_const.h"
+
+using namespace LAMMPS_NS;
+using namespace MathConst;
+
+#define MAXLINE 1024
+#define DELTA 4
+#define PGDELTA 1
+
+/* ---------------------------------------------------------------------- */
+
+PairExTeP::PairExTeP(LAMMPS *lmp) : Pair(lmp)
+{
+  single_enable = 0;
+  restartinfo = 0;
+  one_coeff = 1;
+  manybody_flag = 1;
+  ghostneigh = 1;
+
+  nelements = 0;
+  elements = NULL;
+  nparams = maxparam = 0;
+  params = NULL;
+  elem2param = NULL;
+
+  maxlocal = 0;
+  SR_numneigh = NULL;
+  SR_firstneigh = NULL;
+  ipage = NULL;
+  pgsize = oneatom = 0;
+  map = NULL;
+
+  Nt = NULL;
+  Nd = NULL;
+}
+
+/* ----------------------------------------------------------------------
+   check if allocated, since class can be destructed when incomplete
+------------------------------------------------------------------------- */
+
+PairExTeP::~PairExTeP()
+{
+  if (elements)
+    for (int i = 0; i < nelements; i++) delete [] elements[i];
+  delete [] elements;
+  memory->destroy(params);
+  memory->destroy(elem2param);
+
+  memory->destroy(SR_numneigh);
+  memory->sfree(SR_firstneigh);
+  delete [] ipage;
+  memory->destroy(Nt);
+  memory->destroy(Nd);
+
+  if (allocated) {
+    memory->destroy(setflag);
+    memory->destroy(cutsq);
+    memory->destroy(cutghost);
+    delete [] map;
+  }
+}
+
+/* ----------------------------------------------------------------------
+   create SR neighbor list from main neighbor list
+   SR neighbor list stores neighbors of ghost atoms
+------------------------------------------------------------------------- */
+
+void PairExTeP::SR_neigh()
+{
+  int i,j,ii,jj,n,allnum,jnum,itype,jtype,iparam_ij;
+  double xtmp,ytmp,ztmp,delx,dely,delz,rsq;
+  int *ilist,*jlist,*numneigh,**firstneigh;
+  int *neighptr;
+
+  double **x = atom->x;
+  int *type = atom->type;
+
+  if (atom->nmax > maxlocal) {  // ensure there is enough space
+    maxlocal = atom->nmax;      // for atoms and ghosts allocated
+    memory->destroy(SR_numneigh);
+    memory->sfree(SR_firstneigh);
+    memory->destroy(Nt);
+    memory->destroy(Nd);
+    memory->create(SR_numneigh,maxlocal,"ExTeP:numneigh");
+    SR_firstneigh = (int **) memory->smalloc(maxlocal*sizeof(int *),
+                           "ExTeP:firstneigh");
+    memory->create(Nt,maxlocal,"ExTeP:Nt");
+    memory->create(Nd,maxlocal,"ExTeP:Nd");
+  }
+
+  allnum = list->inum + list->gnum;
+  ilist = list->ilist;
+  numneigh = list->numneigh;
+  firstneigh = list->firstneigh;
+
+  // store all SR neighs of owned and ghost atoms
+  // scan full neighbor list of I
+
+  ipage->reset();
+
+  for (ii = 0; ii < allnum; ii++) {
+    i = ilist[ii];
+    itype=map[type[i]];
+
+    n = 0;
+    neighptr = ipage->vget();
+
+    xtmp = x[i][0];
+    ytmp = x[i][1];
+    ztmp = x[i][2];
+
+    Nt[i] = 0.0;
+    Nd[i] = 0.0;
+
+    jlist = firstneigh[i];
+    jnum = numneigh[i];
+
+    for (jj = 0; jj < jnum; jj++) {
+      j = jlist[jj];
+      j &= NEIGHMASK;
+      delx = xtmp - x[j][0];
+      dely = ytmp - x[j][1];
+      delz = ztmp - x[j][2];
+      rsq = delx*delx + dely*dely + delz*delz;
+
+      jtype=map[type[j]];
+      iparam_ij = elem2param[itype][jtype][jtype];
+
+      if (rsq < params[iparam_ij].cutsq) {
+        neighptr[n++] = j;
+        double tmp_fc = ters_fc(sqrt(rsq),&params[iparam_ij]);
+        Nt[i] += tmp_fc;
+        if (itype!=jtype) {
+          Nd[i] += tmp_fc;
+        }
+      }
+    }
+  //printf("SR_neigh : N[%d] = %f\n",i,N[i]);
+
+    ipage->vgot(n);
+    if (ipage->status())
+      error->one(FLERR,"Neighbor list overflow, boost neigh_modify one");
+  }
+}
+
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::compute(int eflag, int vflag)
+{
+  int i,j,k,ii,jj,kk,inum,jnum;
+  int itype,jtype,ktype,iparam_ij,iparam_ijk;
+  tagint itag,jtag;
+  double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair;
+  double rsq,rsq1,rsq2,r2;
+  double delr1[3],delr2[3],fi[3],fj[3],fk[3];
+  double zeta_ij,prefactor;
+  int *ilist,*jlist,*numneigh,**firstneigh;
+
+  evdwl = 0.0;
+  if (eflag || vflag) ev_setup(eflag,vflag);
+  else evflag = vflag_fdotr = vflag_atom = 0;
+
+  SR_neigh();
+
+  double **x = atom->x;
+  double **f = atom->f;
+  tagint *tag = atom->tag;
+  int *type = atom->type;
+  int nlocal = atom->nlocal;
+  int newton_pair = force->newton_pair;
+
+  inum = list->inum;
+  ilist = list->ilist;
+  numneigh = list->numneigh;
+  firstneigh = list->firstneigh;
+
+  // loop over full neighbor list of my atoms
+
+  for (ii = 0; ii < inum; ii++) {
+    i = ilist[ii];
+    itag = tag[i];
+    itype = map[type[i]];
+    xtmp = x[i][0];
+    ytmp = x[i][1];
+    ztmp = x[i][2];
+
+    // two-body interactions, skip half of them
+
+    jlist = firstneigh[i];
+    jnum = numneigh[i];
+
+    for (jj = 0; jj < jnum; jj++) {
+      j = jlist[jj];
+      j &= NEIGHMASK;
+      jtag = tag[j];
+
+      if (itag > jtag) {
+        if ((itag+jtag) % 2 == 0) continue;
+      } else if (itag < jtag) {
+        if ((itag+jtag) % 2 == 1) continue;
+      } else {
+        if (x[j][2] < x[i][2]) continue;
+        if (x[j][2] == ztmp && x[j][1] < ytmp) continue;
+        if (x[j][2] == ztmp && x[j][1] == ytmp && x[j][0] < xtmp) continue;
+      }
+
+      jtype = map[type[j]];
+
+      delx = xtmp - x[j][0];
+      dely = ytmp - x[j][1];
+      delz = ztmp - x[j][2];
+      rsq = delx*delx + dely*dely + delz*delz;
+
+      iparam_ij = elem2param[itype][jtype][jtype];
+      if (rsq > params[iparam_ij].cutsq) continue;
+
+      repulsive(&params[iparam_ij],rsq,fpair,eflag,evdwl);
+
+      f[i][0] += delx*fpair;
+      f[i][1] += dely*fpair;
+      f[i][2] += delz*fpair;
+      f[j][0] -= delx*fpair;
+      f[j][1] -= dely*fpair;
+      f[j][2] -= delz*fpair;
+
+      if (evflag) ev_tally(i,j,nlocal,newton_pair,
+                           evdwl,0.0,fpair,delx,dely,delz);
+    }
+
+    // three-body interactions      -(bij + Fcorrection) * fA
+    // skip immediately if I-J is not within cutoff
+
+    for (jj = 0; jj < jnum; jj++) {
+      j = jlist[jj];
+      j &= NEIGHMASK;
+      jtag = tag[j];
+      jtype = map[type[j]];
+      iparam_ij = elem2param[itype][jtype][jtype];
+
+      delr1[0] = x[j][0] - xtmp;
+      delr1[1] = x[j][1] - ytmp;
+      delr1[2] = x[j][2] - ztmp;
+      rsq1 = delr1[0]*delr1[0] + delr1[1]*delr1[1] + delr1[2]*delr1[2];
+      if (rsq1 > params[iparam_ij].cutsq) continue;
+
+      // accumulate bondorder zeta for each i-j interaction via loop over k
+
+      zeta_ij = 0.0;
+
+      /* F_IJ (1) */
+      // compute correction to energy and forces
+      // dE/dr = -Fij(Zi,Zj) dV/dr
+      //         - dFij/dZi dZi/dr V
+      //         (conjugate term is computed when j is a central atom)
+
+      double FXY, dFXY_dNdij, dFXY_dNdji, fa, fa_d, deng, fpair;
+      double Ntij = Nt[i];
+      double Ndij = Nd[i];
+      double Ntji = Nt[j];
+      double Ndji = Nd[j];
+      double r = sqrt(rsq1);
+      double fc_ij = ters_fc(r,&params[iparam_ij]);
+
+      Ntij -= fc_ij;
+      Ntji -= fc_ij;
+      if (jtype!=itype) {
+        Ndij -= fc_ij;
+        Ndji -= fc_ij;
+      }
+      if (Ntij<0) { Ntij=0.; }
+      if (Ndij<0) { Ndij=0.; }
+      if (Ntji<0) { Ntji=0.; }
+      if (Ndji<0) { Ndji=0.; }
+      FXY = F_corr(itype, jtype, Ndij, Ndji, &dFXY_dNdij, &dFXY_dNdji);
+
+      // envelop functions
+      double fenv, dfenv_ij;
+      fenv = envelop_function(Ntij, Ntji, &dfenv_ij);
+      //
+      double Fc = fenv * FXY;
+      double dFc_dNtij = dfenv_ij * FXY;
+      double dFc_dNdij = fenv * dFXY_dNdij;
+
+      fa = ters_fa(r,&params[iparam_ij]);
+      fa_d = ters_fa_d(r,&params[iparam_ij]);
+      deng = 0.5 * fa * Fc;
+      fpair = 0.5 * fa_d * Fc / r;
+
+      f[i][0] += delr1[0]*fpair;
+      f[i][1] += delr1[1]*fpair;
+      f[i][2] += delr1[2]*fpair;
+      f[j][0] -= delr1[0]*fpair;
+      f[j][1] -= delr1[1]*fpair;
+      f[j][2] -= delr1[2]*fpair;
+
+      if (evflag) ev_tally(i,j,nlocal,newton_pair,
+                           deng,0.0,-fpair,-delr1[0],-delr1[1],-delr1[2]);
+      /* END F_IJ (1) */
+
+      for (kk = 0; kk < jnum; kk++) {
+        if (jj == kk) continue;
+        k = jlist[kk];
+        k &= NEIGHMASK;
+        ktype = map[type[k]];
+        iparam_ijk = elem2param[itype][jtype][ktype];
+
+        delr2[0] = x[k][0] - xtmp;
+        delr2[1] = x[k][1] - ytmp;
+        delr2[2] = x[k][2] - ztmp;
+        rsq2 = delr2[0]*delr2[0] + delr2[1]*delr2[1] + delr2[2]*delr2[2];
+        if (rsq2 > params[iparam_ijk].cutsq) continue;
+
+        r2 = sqrt(rsq2);
+
+        zeta_ij += zeta(&params[iparam_ijk],r,r2,delr1,delr2);
+
+        /* F_IJ (2) */
+        // compute force components due to spline derivatives
+        // uses only the part with FXY_x (FXY_y is done when i and j are inversed)
+        int iparam_ik = elem2param[itype][ktype][0];
+        double fc_ik_d = ters_fc_d(r2,&params[iparam_ik]);
+        double fc_prefac_ik_0 = 1.0 * fc_ik_d * fa / r2;
+        double fc_prefac_ik = dFc_dNtij * fc_prefac_ik_0;
+        f[i][0] += fc_prefac_ik * delr2[0];
+        f[i][1] += fc_prefac_ik * delr2[1];
+        f[i][2] += fc_prefac_ik * delr2[2];
+        f[k][0] -= fc_prefac_ik * delr2[0];
+        f[k][1] -= fc_prefac_ik * delr2[1];
+        f[k][2] -= fc_prefac_ik * delr2[2];
+        if ( itype != ktype ) {
+          fc_prefac_ik = dFc_dNdij * fc_prefac_ik_0;
+          f[i][0] += fc_prefac_ik * delr2[0];
+          f[i][1] += fc_prefac_ik * delr2[1];
+          f[i][2] += fc_prefac_ik * delr2[2];
+          f[k][0] -= fc_prefac_ik * delr2[0];
+          f[k][1] -= fc_prefac_ik * delr2[1];
+          f[k][2] -= fc_prefac_ik * delr2[2];
+        }
+        /* END F_IJ (2) */
+
+      }
+
+      // pairwise force due to zeta
+
+      force_zeta(&params[iparam_ij],r,zeta_ij,fpair,prefactor,eflag,evdwl);
+
+      f[i][0] += delr1[0]*fpair;
+      f[i][1] += delr1[1]*fpair;
+      f[i][2] += delr1[2]*fpair;
+      f[j][0] -= delr1[0]*fpair;
+      f[j][1] -= delr1[1]*fpair;
+      f[j][2] -= delr1[2]*fpair;
+
+      if (evflag) ev_tally(i,j,nlocal,newton_pair,
+                           evdwl,0.0,-fpair,-delr1[0],-delr1[1],-delr1[2]);
+
+      // attractive term via loop over k
+
+      for (kk = 0; kk < jnum; kk++) {
+        if (jj == kk) continue;
+        k = jlist[kk];
+        k &= NEIGHMASK;
+        ktype = map[type[k]];
+        iparam_ijk = elem2param[itype][jtype][ktype];
+
+        delr2[0] = x[k][0] - xtmp;
+        delr2[1] = x[k][1] - ytmp;
+        delr2[2] = x[k][2] - ztmp;
+        rsq2 = delr2[0]*delr2[0] + delr2[1]*delr2[1] + delr2[2]*delr2[2];
+        if (rsq2 > params[iparam_ijk].cutsq) continue;
+
+        attractive(&params[iparam_ijk],prefactor,
+                   rsq1,rsq2,delr1,delr2,fi,fj,fk);
+
+
+        f[i][0] += fi[0];
+        f[i][1] += fi[1];
+        f[i][2] += fi[2];
+        f[j][0] += fj[0];
+        f[j][1] += fj[1];
+        f[j][2] += fj[2];
+        f[k][0] += fk[0];
+        f[k][1] += fk[1];
+        f[k][2] += fk[2];
+
+        if (vflag_atom) v_tally3(i,j,k,fj,fk,delr1,delr2);
+      }
+    }
+  }
+
+  if (vflag_fdotr) virial_fdotr_compute();
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::allocate()
+{
+  allocated = 1;
+  int n = atom->ntypes;
+
+  memory->create(setflag,n+1,n+1,"pair:setflag");
+  memory->create(cutsq,n+1,n+1,"pair:cutsq");
+  memory->create(cutghost,n+1,n+1,"pair:cutghost");
+
+  map = new int[n+1];
+}
+
+/* ----------------------------------------------------------------------
+   global settings
+------------------------------------------------------------------------- */
+
+void PairExTeP::settings(int narg, char **arg)
+{
+  if (narg != 0) error->all(FLERR,"Illegal pair_style command");
+}
+
+/* ----------------------------------------------------------------------
+   set coeffs for one or more type pairs
+------------------------------------------------------------------------- */
+
+void PairExTeP::coeff(int narg, char **arg)
+{
+  int i,j,n;
+
+  if (!allocated) allocate();
+
+  if (narg != 3 + atom->ntypes)
+    error->all(FLERR,"Incorrect args for pair coefficients");
+
+  // insure I,J args are * *
+
+  if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0)
+    error->all(FLERR,"Incorrect args for pair coefficients");
+
+  // read args that map atom types to elements in potential file
+  // map[i] = which element the Ith atom type is, -1 if NULL
+  // nelements = # of unique elements
+  // elements = list of element names
+
+  if (elements) {
+    for (i = 0; i < nelements; i++) delete [] elements[i];
+    delete [] elements;
+  }
+  elements = new char*[atom->ntypes];
+  for (i = 0; i < atom->ntypes; i++) elements[i] = NULL;
+
+  nelements = 0;
+  for (i = 3; i < narg; i++) {
+    if (strcmp(arg[i],"NULL") == 0) {
+      map[i-2] = -1;
+      continue;
+    }
+    for (j = 0; j < nelements; j++)
+      if (strcmp(arg[i],elements[j]) == 0) break;
+    map[i-2] = j;
+    if (j == nelements) {
+      n = strlen(arg[i]) + 1;
+      elements[j] = new char[n];
+      strcpy(elements[j],arg[i]);
+      nelements++;
+    }
+  }
+
+  // read potential file and initialize potential parameters
+
+  read_file(arg[2]);
+  spline_init();
+  setup();
+
+  // clear setflag since coeff() called once with I,J = * *
+
+  n = atom->ntypes;
+  for (int i = 1; i <= n; i++)
+    for (int j = i; j <= n; j++)
+      setflag[i][j] = 0;
+
+  // set setflag i,j for type pairs where both are mapped to elements
+
+  int count = 0;
+  for (int i = 1; i <= n; i++)
+    for (int j = i; j <= n; j++)
+      if (map[i] >= 0 && map[j] >= 0) {
+        setflag[i][j] = 1;
+        count++;
+      }
+
+  if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
+}
+
+/* ----------------------------------------------------------------------
+   init specific to this pair style
+------------------------------------------------------------------------- */
+
+void PairExTeP::init_style()
+{
+  if (atom->tag_enable == 0)
+    error->all(FLERR,"Pair style ExTeP requires atom IDs");
+  if (force->newton_pair == 0)
+    error->all(FLERR,"Pair style ExTeP requires newton pair on");
+
+  // need a full neighbor list
+
+  int irequest = neighbor->request(this);
+  neighbor->requests[irequest]->half = 0;
+  neighbor->requests[irequest]->full = 1;
+
+  // including neighbors of ghosts
+  neighbor->requests[irequest]->ghost = 1;
+
+  // create pages if first time or if neighbor pgsize/oneatom has changed
+
+  int create = 0;
+  if (ipage == NULL) create = 1;
+  if (pgsize != neighbor->pgsize) create = 1;
+  if (oneatom != neighbor->oneatom) create = 1;
+
+  if (create) {
+    delete [] ipage;
+    pgsize = neighbor->pgsize;
+    oneatom = neighbor->oneatom;
+
+    int nmypage= comm->nthreads;
+    ipage = new MyPage<int>[nmypage];
+    for (int i = 0; i < nmypage; i++)
+      ipage[i].init(oneatom,pgsize,PGDELTA);
+  }
+}
+
+/* ----------------------------------------------------------------------
+   init for one type pair i,j and corresponding j,i
+------------------------------------------------------------------------- */
+
+double PairExTeP::init_one(int i, int j)
+{
+  if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set");
+
+  cutghost[i][j] = cutmax ;
+  cutghost[j][i] = cutghost[i][j];
+
+  return cutmax;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::read_file(char *file)
+{
+  int params_per_line = 17;
+  char **words = new char*[params_per_line+1];
+
+  memory->sfree(params);
+  params = NULL;
+  nparams = maxparam = 0;
+
+  // open file on proc 0
+
+  FILE *fp;
+  if (comm->me == 0) {
+    fp = force->open_potential(file);
+    if (fp == NULL) {
+      char str[128];
+      sprintf(str,"Cannot open ExTeP potential file %s",file);
+      error->one(FLERR,str);
+    }
+  }
+
+  // read each line out of file, skipping blank lines or leading '#'
+  // store line of params if all 3 element tags are in element list
+
+  int n,nwords,ielement,jelement,kelement;
+  char line[MAXLINE],*ptr;
+  int eof = 0;
+
+  while (1) {
+    if (comm->me == 0) {
+      ptr = fgets(line,MAXLINE,fp);
+      if (ptr == NULL) {
+        eof = 1;
+        fclose(fp);
+      } else n = strlen(line) + 1;
+    }
+    MPI_Bcast(&eof,1,MPI_INT,0,world);
+    if (eof) break;
+    MPI_Bcast(&n,1,MPI_INT,0,world);
+    MPI_Bcast(line,n,MPI_CHAR,0,world);
+
+    // strip comment, skip line if blank
+
+    if ((ptr = strchr(line,'#'))) *ptr = '\0';
+    nwords = atom->count_words(line);
+    if (nwords == 0) continue;
+
+    // concatenate additional lines until have params_per_line words
+
+    while (nwords < params_per_line) {
+      n = strlen(line);
+      if (comm->me == 0) {
+        ptr = fgets(&line[n],MAXLINE-n,fp);
+        if (ptr == NULL) {
+          eof = 1;
+          fclose(fp);
+        } else n = strlen(line) + 1;
+      }
+      MPI_Bcast(&eof,1,MPI_INT,0,world);
+      if (eof) break;
+      MPI_Bcast(&n,1,MPI_INT,0,world);
+      MPI_Bcast(line,n,MPI_CHAR,0,world);
+      if ((ptr = strchr(line,'#'))) *ptr = '\0';
+      nwords = atom->count_words(line);
+    }
+
+    if (nwords != params_per_line)
+      error->all(FLERR,"Insufficient spline parameters in potential file");
+
+    // words = ptrs to all words in line
+
+    nwords = 0;
+    words[nwords++] = strtok(line," \t\n\r\f");
+    while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue;
+
+    // ielement,jelement,kelement = 1st args
+    // if all 3 args are in element list, then parse this line
+    // else skip to next line
+
+    for (ielement = 0; ielement < nelements; ielement++)
+      if (strcmp(words[0],elements[ielement]) == 0) break;
+    if (ielement == nelements) continue;
+    for (jelement = 0; jelement < nelements; jelement++)
+      if (strcmp(words[1],elements[jelement]) == 0) break;
+    if (jelement == nelements) continue;
+    for (kelement = 0; kelement < nelements; kelement++)
+      if (strcmp(words[2],elements[kelement]) == 0) break;
+    if (kelement == nelements) continue;
+
+    // load up parameter settings and error check their values
+
+    if (nparams == maxparam) {
+      maxparam += DELTA;
+      params = (Param *) memory->srealloc(params,maxparam*sizeof(Param),
+                                          "pair:params");
+    }
+
+    params[nparams].ielement = ielement;
+    params[nparams].jelement = jelement;
+    params[nparams].kelement = kelement;
+    params[nparams].powerm = atof(words[3]);
+    params[nparams].gamma = atof(words[4]);
+    params[nparams].lam3 = atof(words[5]);
+    params[nparams].c = atof(words[6]);
+    params[nparams].d = atof(words[7]);
+    params[nparams].h = atof(words[8]);
+    params[nparams].powern = atof(words[9]);
+    params[nparams].beta = atof(words[10]);
+    params[nparams].lam2 = atof(words[11]);
+    params[nparams].bigb = atof(words[12]);
+    params[nparams].bigr = atof(words[13]);
+    params[nparams].bigd = atof(words[14]);
+    params[nparams].lam1 = atof(words[15]);
+    params[nparams].biga = atof(words[16]);
+
+    // currently only allow m exponent of 1 or 3
+
+    params[nparams].powermint = int(params[nparams].powerm);
+
+    if (params[nparams].c < 0.0 || params[nparams].d < 0.0 ||
+        params[nparams].powern < 0.0 || params[nparams].beta < 0.0 ||
+        params[nparams].lam2 < 0.0 || params[nparams].bigb < 0.0 ||
+        params[nparams].bigr < 0.0 ||params[nparams].bigd < 0.0 ||
+        params[nparams].bigd > params[nparams].bigr ||
+        params[nparams].lam1 < 0.0 || params[nparams].biga < 0.0 ||
+        params[nparams].powerm - params[nparams].powermint != 0.0 ||
+        (params[nparams].powermint != 3 && params[nparams].powermint != 1) ||
+        params[nparams].gamma < 0.0)
+      error->all(FLERR,"Illegal ExTeP parameter");
+
+    nparams++;
+    if (nparams >= pow(atom->ntypes,3)) break;
+  }
+
+  // deallocate words array
+  delete [] words;
+
+  /* F_IJ (3) */
+  // read the spline coefficients
+  params_per_line = 8;
+  // reallocate with new size
+  words = new char*[params_per_line+1];
+
+  // intialize F_corr_data to all zeros
+  for (int iel=0;iel<atom->ntypes;iel++)
+    for (int jel=0;jel<atom->ntypes;jel++)
+      for (int in=0;in<4;in++)
+        for (int jn=0;jn<4;jn++)
+          for (int ivar=0;ivar<3;ivar++)
+            F_corr_data[iel][jel][in][jn][ivar]=0;
+
+  // loop until EOF
+  while (1) {
+    if (comm->me == 0) {
+      ptr = fgets(line,MAXLINE,fp);
+      //fputs(line,stdout);
+      if (ptr == NULL) {
+        eof = 1;
+        fclose(fp);
+      } else n = strlen(line) + 1;
+    }
+    MPI_Bcast(&eof,1,MPI_INT,0,world);
+    if (eof) break;
+    MPI_Bcast(&n,1,MPI_INT,0,world);
+    MPI_Bcast(line,n,MPI_CHAR,0,world);
+
+    // strip comment, skip line if blank
+
+    if ((ptr = strchr(line,'#'))) *ptr = '\0';
+    nwords = atom->count_words(line);
+    if (nwords == 0) continue;
+
+    if (nwords != params_per_line)
+      error->all(FLERR,"Incorrect format in ExTeP potential file");
+
+    // words = ptrs to all words in line
+
+    nwords = 0;
+    words[nwords++] = strtok(line," \t\n\r\f");
+    while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue;
+
+    // ielement,jelement = 1st args
+    // if all 3 args are in element list, then parse this line
+    // else skip to next line
+    // these lines set ielement and jelement to the
+    // integers matching the strings from the input
+
+    for (ielement = 0; ielement < nelements; ielement++)
+      if (strcmp(words[0],elements[ielement]) == 0) break;
+    if (ielement == nelements) continue;
+    for (jelement = 0; jelement < nelements; jelement++)
+      if (strcmp(words[1],elements[jelement]) == 0) break;
+    if (jelement == nelements) continue;
+
+    int Ni  = atoi(words[2]);
+    int Nj  = atoi(words[3]);
+    double spline_val = atof(words[4]);
+    double spline_derx = atof(words[5]);
+    double spline_dery = atof(words[6]);
+
+    // Set value for all pairs of ielement,jelement  (any kelement)
+    for (int iparam = 0; iparam < nparams; iparam++) {
+      if ( ielement == params[iparam].ielement
+           && jelement == params[iparam].jelement) {
+        F_corr_data[ielement][jelement][Ni][Nj][0] = spline_val;
+        F_corr_data[ielement][jelement][Ni][Nj][1] = spline_derx;
+        F_corr_data[ielement][jelement][Ni][Nj][2] = spline_dery;
+
+        F_corr_data[jelement][ielement][Nj][Ni][0] = spline_val;
+        F_corr_data[jelement][ielement][Nj][Ni][1] = spline_dery;
+        F_corr_data[jelement][ielement][Nj][Ni][2] = spline_derx;
+      }
+    }
+  }
+
+  delete [] words;
+  /* END F_IJ (3) */
+
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::setup()
+{
+  int i,j,k,m,n;
+
+  // set elem2param for all element triplet combinations
+  // must be a single exact match to lines read from file
+  // do not allow for ACB in place of ABC
+
+  memory->destroy(elem2param);
+  memory->create(elem2param,nelements,nelements,nelements,"pair:elem2param");
+
+  for (i = 0; i < nelements; i++)
+    for (j = 0; j < nelements; j++)
+      for (k = 0; k < nelements; k++) {
+        n = -1;
+        for (m = 0; m < nparams; m++) {
+          if (i == params[m].ielement && j == params[m].jelement &&
+              k == params[m].kelement) {
+            if (n >= 0) error->all(FLERR,"Potential file has duplicate entry");
+            n = m;
+          }
+        }
+        if (n < 0) error->all(FLERR,"Potential file is missing an entry");
+        elem2param[i][j][k] = n;
+      }
+
+  // compute parameter values derived from inputs
+
+  for (m = 0; m < nparams; m++) {
+    params[m].cut = params[m].bigr + params[m].bigd;
+    params[m].cutsq = params[m].cut*params[m].cut;
+
+    params[m].c1 = pow(2.0*params[m].powern*1.0e-16,-1.0/params[m].powern);
+    params[m].c2 = pow(2.0*params[m].powern*1.0e-8,-1.0/params[m].powern);
+    params[m].c3 = 1.0/params[m].c2;
+    params[m].c4 = 1.0/params[m].c1;
+  }
+
+  // set cutmax to max of all params
+
+  cutmax = 0.0;
+  for (m = 0; m < nparams; m++)
+    if (params[m].cut > cutmax) cutmax = params[m].cut;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::repulsive(Param *param, double rsq, double &fforce,
+                            int eflag, double &eng)
+{
+  double r,tmp_fc,tmp_fc_d,tmp_exp;
+
+  r = sqrt(rsq);
+  tmp_fc = ters_fc(r,param);
+  tmp_fc_d = ters_fc_d(r,param);
+  tmp_exp = exp(-param->lam1 * r);
+  fforce = -param->biga * tmp_exp * (tmp_fc_d - tmp_fc*param->lam1) / r;
+  if (eflag) eng = tmp_fc * param->biga * tmp_exp;
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::zeta(Param *param, double rij, double rik,
+                         double *delrij, double *delrik)
+{
+  double costheta,arg,ex_delr;
+
+  costheta = (delrij[0]*delrik[0] + delrij[1]*delrik[1] +
+              delrij[2]*delrik[2]) / (rij*rik);
+
+  if (param->powermint == 3) arg = pow(param->lam3 * (rij-rik),3.0);
+  else arg = param->lam3 * (rij-rik);
+
+  if (arg > 69.0776) ex_delr = 1.e30;
+  else if (arg < -69.0776) ex_delr = 0.0;
+  else ex_delr = exp(arg);
+
+  return ters_fc(rik,param) * ters_gijk(costheta,param) * ex_delr;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::force_zeta(Param *param, double r, double zeta_ij,
+                             double &fforce, double &prefactor,
+                             int eflag, double &eng)
+{
+  double fa,fa_d,bij;
+
+  fa = ters_fa(r,param);
+  fa_d = ters_fa_d(r,param);
+  bij = ters_bij(zeta_ij,param);
+  fforce = 0.5*bij*fa_d / r;
+  prefactor = -0.5*fa * ( ters_bij_d(zeta_ij,param) );
+  if (eflag) eng = 0.5*bij*fa;
+}
+
+/* ----------------------------------------------------------------------
+   attractive term
+   use param_ij cutoff for rij test
+   use param_ijk cutoff for rik test
+------------------------------------------------------------------------- */
+
+void PairExTeP::attractive(Param *param, double prefactor,
+                             double rsqij, double rsqik,
+                             double *delrij, double *delrik,
+                             double *fi, double *fj, double *fk)
+{
+  double rij_hat[3],rik_hat[3];
+  double rij,rijinv,rik,rikinv;
+
+  rij = sqrt(rsqij);
+  rijinv = 1.0/rij;
+  vec3_scale(rijinv,delrij,rij_hat);
+
+  rik = sqrt(rsqik);
+  rikinv = 1.0/rik;
+  vec3_scale(rikinv,delrik,rik_hat);
+
+  ters_zetaterm_d(prefactor,rij_hat,rij,rik_hat,rik,fi,fj,fk,param);
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::ters_fc(double r, Param *param)
+{
+  double ters_R = param->bigr;
+  double ters_D = param->bigd;
+
+  if (r < ters_R-ters_D) return 1.0;
+  if (r > ters_R+ters_D) return 0.0;
+  return 0.5*(1.0 - sin(MY_PI2*(r - ters_R)/ters_D));
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::ters_fc_d(double r, Param *param)
+{
+  double ters_R = param->bigr;
+  double ters_D = param->bigd;
+
+  if (r < ters_R-ters_D) return 0.0;
+  if (r > ters_R+ters_D) return 0.0;
+  return -(MY_PI4/ters_D) * cos(MY_PI2*(r - ters_R)/ters_D);
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::ters_fa(double r, Param *param)
+{
+  if (r > param->bigr + param->bigd) return 0.0;
+  return -param->bigb * exp(-param->lam2 * r) * ters_fc(r,param);
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::ters_fa_d(double r, Param *param)
+{
+  if (r > param->bigr + param->bigd) return 0.0;
+  return param->bigb * exp(-param->lam2 * r) *
+    (param->lam2 * ters_fc(r,param) - ters_fc_d(r,param));
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::ters_bij(double zeta, Param *param)
+{
+  double tmp = param->beta * zeta;
+  if (tmp > param->c1) return 1.0/sqrt(tmp);
+  if (tmp > param->c2)
+    return (1.0 - pow(tmp,-param->powern) / (2.0*param->powern))/sqrt(tmp);
+  if (tmp < param->c4) return 1.0;
+  if (tmp < param->c3)
+    return 1.0 - pow(tmp,param->powern)/(2.0*param->powern);
+  return pow(1.0 + pow(tmp,param->powern), -1.0/(2.0*param->powern));
+}
+
+/* ---------------------------------------------------------------------- */
+
+double PairExTeP::ters_bij_d(double zeta, Param *param)
+{
+  double tmp = param->beta * zeta;
+  if (tmp > param->c1) return param->beta * -0.5*pow(tmp,-1.5);
+  if (tmp > param->c2)
+    return param->beta * (-0.5*pow(tmp,-1.5) *
+                          (1.0 - 0.5*(1.0 +  1.0/(2.0*param->powern)) *
+                           pow(tmp,-param->powern)));
+  if (tmp < param->c4) return 0.0;
+  if (tmp < param->c3)
+    return -0.5*param->beta * pow(tmp,param->powern-1.0);
+
+  double tmp_n = pow(tmp,param->powern);
+  return -0.5 * pow(1.0+tmp_n, -1.0-(1.0/(2.0*param->powern)))*tmp_n / zeta;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::ters_zetaterm_d(double prefactor,
+                                double *rij_hat, double rij,
+                                double *rik_hat, double rik,
+                                double *dri, double *drj, double *drk,
+                                Param *param)
+{
+  double gijk,gijk_d,ex_delr,ex_delr_d,fc,dfc,cos_theta,tmp;
+  double dcosdri[3],dcosdrj[3],dcosdrk[3];
+
+  fc = ters_fc(rik,param);
+  dfc = ters_fc_d(rik,param);
+  if (param->powermint == 3) tmp = pow(param->lam3 * (rij-rik),3.0);
+  else tmp = param->lam3 * (rij-rik);
+
+  if (tmp > 69.0776) ex_delr = 1.e30;
+  else if (tmp < -69.0776) ex_delr = 0.0;
+  else ex_delr = exp(tmp);
+
+  if (param->powermint == 3)
+    ex_delr_d = 3.0*pow(param->lam3,3.0) * pow(rij-rik,2.0)*ex_delr;
+  else ex_delr_d = param->lam3 * ex_delr;
+
+  cos_theta = vec3_dot(rij_hat,rik_hat);
+  gijk = ters_gijk(cos_theta,param);
+  gijk_d = ters_gijk_d(cos_theta,param);
+  costheta_d(rij_hat,rij,rik_hat,rik,dcosdri,dcosdrj,dcosdrk);
+
+  // compute the derivative wrt Ri
+  // dri = -dfc*gijk*ex_delr*rik_hat;
+  // dri += fc*gijk_d*ex_delr*dcosdri;
+  // dri += fc*gijk*ex_delr_d*(rik_hat - rij_hat);
+
+  vec3_scale(-dfc*gijk*ex_delr,rik_hat,dri);
+  vec3_scaleadd(fc*gijk_d*ex_delr,dcosdri,dri,dri);
+  vec3_scaleadd(fc*gijk*ex_delr_d,rik_hat,dri,dri);
+  vec3_scaleadd(-fc*gijk*ex_delr_d,rij_hat,dri,dri);
+  vec3_scale(prefactor,dri,dri);
+
+  // compute the derivative wrt Rj
+  // drj = fc*gijk_d*ex_delr*dcosdrj;
+  // drj += fc*gijk*ex_delr_d*rij_hat;
+
+  vec3_scale(fc*gijk_d*ex_delr,dcosdrj,drj);
+  vec3_scaleadd(fc*gijk*ex_delr_d,rij_hat,drj,drj);
+  vec3_scale(prefactor,drj,drj);
+
+  // compute the derivative wrt Rk
+  // drk = dfc*gijk*ex_delr*rik_hat;
+  // drk += fc*gijk_d*ex_delr*dcosdrk;
+  // drk += -fc*gijk*ex_delr_d*rik_hat;
+
+  vec3_scale(dfc*gijk*ex_delr,rik_hat,drk);
+  vec3_scaleadd(fc*gijk_d*ex_delr,dcosdrk,drk,drk);
+  vec3_scaleadd(-fc*gijk*ex_delr_d,rik_hat,drk,drk);
+  vec3_scale(prefactor,drk,drk);
+}
+
+/* ---------------------------------------------------------------------- */
+
+void PairExTeP::costheta_d(double *rij_hat, double rij,
+                           double *rik_hat, double rik,
+                           double *dri, double *drj, double *drk)
+{
+  // first element is devative wrt Ri, second wrt Rj, third wrt Rk
+
+  double cos_theta = vec3_dot(rij_hat,rik_hat);
+
+  vec3_scaleadd(-cos_theta,rij_hat,rik_hat,drj);
+  vec3_scale(1.0/rij,drj,drj);
+  vec3_scaleadd(-cos_theta,rik_hat,rij_hat,drk);
+  vec3_scale(1.0/rik,drk,drk);
+  vec3_add(drj,drk,dri);
+  vec3_scale(-1.0,dri,dri);
+}
+
+
+/* ---------------------------------------------------------------------- */
+
+/* F_IJ (4) */
+// initialize spline for F_corr (based on PairLCBOP::F_conj)
+
+void PairExTeP::spline_init() {
+  for ( size_t iel=0; iel<atom->ntypes; iel++) {
+    for ( size_t jel=0; jel<atom->ntypes; jel++) {
+      for ( size_t N_ij=0; N_ij<4; N_ij++ ) {
+        for ( size_t N_ji=0; N_ji<4; N_ji++ ) {
+          TF_corr_param &f = F_corr_param[iel][jel][N_ij][N_ji];
+
+          // corner points for each spline function
+          f.f_00 = F_corr_data[iel][jel][N_ij  ][N_ji  ][0];
+          f.f_01 = F_corr_data[iel][jel][N_ij  ][N_ji+1][0];
+          f.f_10 = F_corr_data[iel][jel][N_ij+1][N_ji  ][0];
+          f.f_11 = F_corr_data[iel][jel][N_ij+1][N_ji+1][0];
+
+          // compute f tilde according to [Los & Fasolino, PRB 68, 024107 2003]
+          f.f_x_00 =   F_corr_data[iel][jel][N_ij  ][N_ji  ][1] - f.f_10 + f.f_00;
+          f.f_x_01 =   F_corr_data[iel][jel][N_ij  ][N_ji+1][1] - f.f_11 + f.f_01;
+          f.f_x_10 = -(F_corr_data[iel][jel][N_ij+1][N_ji  ][1] - f.f_10 + f.f_00);
+          f.f_x_11 = -(F_corr_data[iel][jel][N_ij+1][N_ji+1][1] - f.f_11 + f.f_01);
+
+          f.f_y_00 =   F_corr_data[iel][jel][N_ij  ][N_ji  ][2] - f.f_01 + f.f_00;
+          f.f_y_01 = -(F_corr_data[iel][jel][N_ij  ][N_ji+1][2] - f.f_01 + f.f_00);
+          f.f_y_10 =   F_corr_data[iel][jel][N_ij+1][N_ji  ][2] - f.f_11 + f.f_10;
+          f.f_y_11 = -(F_corr_data[iel][jel][N_ij+1][N_ji+1][2] - f.f_11 + f.f_10);
+        }
+      }
+    }
+  }
+}
+
+double PairExTeP::envelop_function(double x, double y, double *func_der) {
+  double fx,fy,fxy,dfx,dfxydx;
+  double del, delsq;
+
+  fxy = 1.0;
+  dfxydx = 0.0;
+
+  if (x <= 3.0) {
+    fx = 1.0;
+    dfx = 0.0;
+    if (x < 1.0 && y < 1.0) {
+      double gx=(1.0-x);
+      double gy=(1.0-y);
+      double gxsq=gx*gx;
+      double gysq=gy*gy;
+      fxy = 1.0 - gxsq*gysq;
+      dfxydx = 2.0*gx*gysq;
+    }
+  } else if (x < 4.0) {
+    del = 4.0-x;
+    delsq = del*del;
+    fx = (3.0-2.0*del)*delsq;
+    dfx = - 6.0*del*(1.0-del);
+  } else {
+    fx = 0.0;
+    dfx = 0.0;
+  }
+  if (y <= 3.0) {
+    fy = 1.0;
+  } else if (y < 4.0) {
+    del = 4.0-y;
+    delsq = del*del;
+    fy = (3.0-2.0*del)*delsq;
+  } else {
+    fy = 0.0;
+  }
+
+  double func_val = fxy*fx*fy;
+  *func_der = dfxydx*fx*fy+fxy*dfx*fy;
+
+  return func_val;
+}
+
+double PairExTeP::F_corr(int iel, int jel, double Ndij, double Ndji, double *dFN_x, double *dFN_y ) {
+
+  // compute F_XY
+
+  size_t Ndij_int         = static_cast<size_t>( floor( Ndij ) );
+  size_t Ndji_int         = static_cast<size_t>( floor( Ndji ) );
+  double x                = Ndij - Ndij_int;
+  double y                = Ndji - Ndji_int;
+  TF_corr_param &f  = F_corr_param[iel][jel][Ndij_int][Ndji_int];
+  double F   = 0;
+  double dF_dx = 0, dF_dy = 0;
+  double l, r;
+  if (Ndij_int < 4 && Ndji_int < 4) {
+    l = (1-y)* (1-x);
+    r = ( f.f_00 + x*x* f.f_x_10 + y*y* f.f_y_01 );
+    F += l*r;
+    dF_dx += -(1-y)*r +l*2*x* f.f_x_10;
+    dF_dy += -(1-x)*r +l*2*y* f.f_y_01;
+    l = (1-y)*x;
+    r = ( f.f_10 + (1-x)*(1-x)*f.f_x_00 + y*  y* f.f_y_11 );
+    F += l*r;
+    dF_dx += (1-y)*r -l*2*(1-x)*f.f_x_00;
+    dF_dy += -x*r +l*2*y* f.f_y_11;
+    l = y*  (1-x);
+    r = ( f.f_01 + x*x* f.f_x_11 + (1-y)*(1-y)*f.f_y_00 );
+    F += l*r;
+    dF_dx += -y*r +l*2*x* f.f_x_11;
+    dF_dy += (1-x)*r -l*2*(1-y)*f.f_y_00;
+    l = y*  x;
+    r = ( f.f_11 + (1-x)*(1-x)*f.f_x_01 + (1-y)*(1-y)*f.f_y_10 );
+    F += l*r;
+    dF_dx += y*r -l*2*(1-x)*f.f_x_01;
+    dF_dy += x*r -l*2*(1-y)*f.f_y_10;
+  }
+  double result = F;
+  *dFN_x = dF_dx;
+  *dFN_y = dF_dy;
+
+  return result;
+}
+/* F_IJ (4) */
diff --git a/src/USER-MISC/pair_extep.h b/src/USER-MISC/pair_extep.h
new file mode 100644
index 0000000000000000000000000000000000000000..bad433455ed58e75c71fb92ff1c3bdbc1b5cc0fb
--- /dev/null
+++ b/src/USER-MISC/pair_extep.h
@@ -0,0 +1,225 @@
+/* -*- c++ -*- ----------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+#ifdef PAIR_CLASS
+
+PairStyle(extep,PairExTeP)
+
+#else
+
+#ifndef LMP_PAIR_EXTEP_H
+#define LMP_PAIR_EXTEP_H
+
+#include "pair.h"
+#include "my_page.h"
+
+#define MAXTYPES 8
+#define NSPLINE 5
+
+namespace LAMMPS_NS {
+
+class PairExTeP : public Pair {
+ public:
+  PairExTeP(class LAMMPS *);
+  virtual ~PairExTeP();
+  virtual void compute(int, int);
+  void settings(int, char **);
+  void coeff(int, char **);
+  void init_style();
+  double init_one(int, int);
+
+ protected:
+  struct Param {
+    double lam1,lam2,lam3;
+    double c,d,h;
+    double gamma,powerm;
+    double powern,beta;
+    double biga,bigb,bigd,bigr;
+    double cut,cutsq;
+    double c1,c2,c3,c4;
+    int ielement,jelement,kelement;
+    int powermint;
+    double Z_i,Z_j;              // added for ExTePZBL
+    double ZBLcut,ZBLexpscale;
+    double c5,ca1,ca4;           // added for ExTePMOD
+    double powern_del;
+  };
+
+  Param *params;                // parameter set for an I-J-K interaction
+  char **elements;              // names of unique elements
+  int ***elem2param;            // mapping from element triplets to parameters
+  int *map;                     // mapping from atom types to elements
+  double cutmax;                // max cutoff for all elements
+  int nelements;                // # of unique elements
+  int nparams;                  // # of stored parameter sets
+  int maxparam;                 // max # of parameter sets
+
+  int maxlocal;                    // size of numneigh, firstneigh arrays
+  int maxpage;                     // # of pages currently allocated
+  int pgsize;                      // size of neighbor page
+  int oneatom;                     // max # of neighbors for one atom
+  MyPage<int> *ipage;              // neighbor list pages
+  int *SR_numneigh;                // # of pair neighbors for each atom
+  int **SR_firstneigh;             // ptr to 1st neighbor of each atom
+
+  double *Nt, *Nd;               // sum of cutoff fns ( f_C ) with SR neighs
+
+  void allocate();
+  void spline_init();
+  virtual void read_file(char *);
+  virtual void setup();
+  virtual void repulsive(Param *, double, double &, int, double &);
+  virtual double zeta(Param *, double, double, double *, double *);
+  virtual void force_zeta(Param *, double, double, double &,
+                          double &, int, double &);
+  void attractive(Param *, double, double, double, double *, double *,
+                  double *, double *, double *);
+
+  virtual double ters_fc(double, Param *);
+  virtual double ters_fc_d(double, Param *);
+  virtual double ters_fa(double, Param *);
+  virtual double ters_fa_d(double, Param *);
+  virtual double ters_bij(double, Param *);
+  virtual double ters_bij_d(double, Param *);
+
+  virtual void ters_zetaterm_d(double, double *, double, double *, double,
+                               double *, double *, double *, Param *);
+  void costheta_d(double *, double, double *, double,
+                  double *, double *, double *);
+
+  // inlined functions for efficiency
+
+  inline double ters_gijk(const double costheta,
+                          const Param * const param) const {
+    const double ters_c = param->c * param->c;
+    const double ters_d = param->d * param->d;
+    const double hcth = param->h - costheta;
+
+    return param->gamma*(1.0 + ters_c/ters_d - ters_c / (ters_d + hcth*hcth));
+  }
+
+  inline double ters_gijk_d(const double costheta,
+                            const Param * const param) const {
+    const double ters_c = param->c * param->c;
+    const double ters_d = param->d * param->d;
+    const double hcth = param->h - costheta;
+    const double numerator = -2.0 * ters_c * hcth;
+    const double denominator = 1.0/(ters_d + hcth*hcth);
+    return param->gamma*numerator*denominator*denominator;
+  }
+
+  inline double vec3_dot(const double x[3], const double y[3]) const {
+    return x[0]*y[0] + x[1]*y[1] + x[2]*y[2];
+  }
+
+  inline void vec3_add(const double x[3], const double y[3],
+                       double * const z) const {
+    z[0] = x[0]+y[0];  z[1] = x[1]+y[1];  z[2] = x[2]+y[2];
+  }
+
+  inline void vec3_scale(const double k, const double x[3],
+                         double y[3]) const {
+    y[0] = k*x[0];  y[1] = k*x[1];  y[2] = k*x[2];
+  }
+
+  inline void vec3_scaleadd(const double k, const double x[3],
+                            const double y[3], double * const z) const {
+    z[0] = k*x[0]+y[0];
+    z[1] = k*x[1]+y[1];
+    z[2] = k*x[2]+y[2];
+  }
+
+  // splines parameters
+  // F[Ni=0-1, 1-2, 2-3, 
+  //   Nj=..., 
+  struct TF_corr_param {
+    double
+        f_00,
+        f_01,
+        f_10,
+        f_11,
+        f_x_00,
+        f_x_01,
+        f_x_10,
+        f_x_11,
+        f_y_00,
+        f_y_01,
+        f_y_10,
+        f_y_11;
+  } F_corr_param[MAXTYPES][MAXTYPES][NSPLINE][NSPLINE]; 
+
+  double F_corr_data[MAXTYPES][MAXTYPES][NSPLINE][NSPLINE][3];
+
+  double F_corr( int, int, double, double, double*, double* );
+  void SR_neigh();
+
+  double envelop_function(double, double, double*);
+
+};
+
+}
+
+#endif
+#endif
+
+/* ERROR/WARNING messages:
+
+E: Illegal ... command
+
+Self-explanatory.  Check the input script syntax and compare to the
+documentation for the command.  You can use -echo screen as a
+command-line option when running LAMMPS to see the offending line.
+
+E: Incorrect args for pair coefficients
+
+Self-explanatory.  Check the input script or data file.
+
+E: Pair style ExTeP requires atom IDs
+
+This is a requirement to use the ExTeP potential.
+
+E: Pair style ExTeP requires newton pair on
+
+See the newton command.  This is a restriction to use the ExTeP
+potential.
+
+E: All pair coeffs are not set
+
+All pair coefficients must be set in the data file or by the
+pair_coeff command before running a simulation.
+
+E: Cannot open ExTeP potential file %s
+
+The specified potential file cannot be opened.  Check that the path
+and name are correct.
+
+E: Incorrect format in ExTeP potential file
+
+Incorrect number of words per line in the potential file.
+
+E: Illegal ExTeP parameter
+
+One or more of the coefficients defined in the potential file is
+invalid.
+
+E: Potential file has duplicate entry
+
+The potential file for a SW or ExTeP potential has more than
+one entry for the same 3 ordered elements.
+
+E: Potential file is missing an entry
+
+The potential file for a SW or ExTeP potential does not have a
+needed entry.
+
+*/
diff --git a/src/USER-OMP/fix_neigh_history_omp.cpp b/src/USER-OMP/fix_neigh_history_omp.cpp
index ecc3147ed5d0515dfb13d743531ed28599e11b40..1b212732de66a2928cc9c5dbf2d28bb71e12485b 100644
--- a/src/USER-OMP/fix_neigh_history_omp.cpp
+++ b/src/USER-OMP/fix_neigh_history_omp.cpp
@@ -356,7 +356,7 @@ void FixNeighHistoryOMP::pre_exchange_newton()
 #endif
     {
       maxpartner = MAX(m,maxpartner);
-      comm->maxexchange_fix = MAX(comm->maxexchange_fix,4*maxpartner+1);
+      comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1);
     }
   }
 
diff --git a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp
index 85c7e44f8c8654d4eb9e7128c93f8a5e964c309c..110b8917cf07366b02aa0eeda1b99daeaffbe99a 100644
--- a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp
+++ b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp
@@ -29,6 +29,7 @@
 #include "math_const.h"
 #include "error.h"
 #include "suffix.h"
+#include "domain.h"
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp
index 6fec7a7e4d614a1c50306d528bce63af8255df13..321d104b00921e9af51f691191fad4402aea0213 100644
--- a/src/USER-OMP/reaxc_forces_omp.cpp
+++ b/src/USER-OMP/reaxc_forces_omp.cpp
@@ -601,44 +601,17 @@ void Compute_ForcesOMP( reax_system *system, control_params *control,
   MPI_Comm comm = mpi_data->world;
 
   // Init Forces
-#if defined(LOG_PERFORMANCE)
-  double t_start = 0;
-  if( system->my_rank == MASTER_NODE )
-    t_start = Get_Time( );
-#endif
-
   Init_Forces_noQEq_OMP( system, control, data, workspace,
-			 lists, out_control, comm );
-
-#if defined(LOG_PERFORMANCE)
-  //MPI_Barrier( comm );
-  if( system->my_rank == MASTER_NODE )
-    Update_Timing_Info( &t_start, &(data->timing.init_forces) );
-#endif
+                      lists, out_control, comm );
 
   // Bonded Interactions
   Compute_Bonded_ForcesOMP( system, control, data, workspace,
                          lists, out_control, mpi_data->world );
 
-#if defined(LOG_PERFORMANCE)
-  if( system->my_rank == MASTER_NODE )
-    Update_Timing_Info( &t_start, &(data->timing.bonded) );
-#endif
-
   // Nonbonded Interactions
   Compute_NonBonded_ForcesOMP( system, control, data, workspace,
                             lists, out_control, mpi_data->world );
 
-#if defined(LOG_PERFORMANCE)
-  if( system->my_rank == MASTER_NODE )
-    Update_Timing_Info( &t_start, &(data->timing.nonb) );
-#endif
-
   // Total Force
   Compute_Total_ForceOMP( system, control, data, workspace, lists, mpi_data );
-
-#if defined(LOG_PERFORMANCE)
-  if( system->my_rank == MASTER_NODE )
-    Update_Timing_Info( &t_start, &(data->timing.bonded) );
-#endif
 }
diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp
index 0f4bd49cc855c7e78cc4cd69b3c66b69964b572f..7c135463add0c68cc3a7fb2a036a601bf75c7928 100644
--- a/src/USER-REAXC/pair_reaxc.cpp
+++ b/src/USER-REAXC/pair_reaxc.cpp
@@ -697,7 +697,7 @@ int PairReaxC::write_reax_lists()
   int itr_i, itr_j, i, j;
   int num_nbrs;
   int *ilist, *jlist, *numneigh, **firstneigh;
-  double d_sqr;
+  double d_sqr, cutoff_sqr;
   rvec dvec;
   double *dist, **x;
   reax_list *far_nbrs;
@@ -712,6 +712,7 @@ int PairReaxC::write_reax_lists()
   far_list = far_nbrs->select.far_nbr_list;
 
   num_nbrs = 0;
+  int inum = list->inum;
   dist = (double*) calloc( system->N, sizeof(double) );
 
   int numall = list->inum + list->gnum;
@@ -721,12 +722,17 @@ int PairReaxC::write_reax_lists()
     jlist = firstneigh[i];
     Set_Start_Index( i, num_nbrs, far_nbrs );
 
+    if (i < inum)
+      cutoff_sqr = control->nonb_cut*control->nonb_cut;
+    else
+      cutoff_sqr = control->bond_cut*control->bond_cut;
+
     for( itr_j = 0; itr_j < numneigh[i]; ++itr_j ){
       j = jlist[itr_j];
       j &= NEIGHMASK;
       get_distance( x[j], x[i], &d_sqr, &dvec );
 
-      if( d_sqr <= (control->nonb_cut*control->nonb_cut) ){
+      if( d_sqr <= (cutoff_sqr) ){
         dist[j] = sqrt( d_sqr );
         set_far_nbr( &far_list[num_nbrs], j, dist[j], dvec );
         ++num_nbrs;
diff --git a/src/USER-TALLY/compute_force_tally.cpp b/src/USER-TALLY/compute_force_tally.cpp
index 5f29aea5b22cd3b892596ec4f3356e9184a85602..3ec6c188fc385026ce3fd93383fa87e38559b15f 100644
--- a/src/USER-TALLY/compute_force_tally.cpp
+++ b/src/USER-TALLY/compute_force_tally.cpp
@@ -12,6 +12,7 @@
 ------------------------------------------------------------------------- */
 
 #include <string.h>
+#include <math.h>
 #include "compute_force_tally.h"
 #include "atom.h"
 #include "group.h"
@@ -20,6 +21,7 @@
 #include "memory.h"
 #include "error.h"
 #include "force.h"
+#include "comm.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/USER-TALLY/compute_heat_flux_tally.cpp b/src/USER-TALLY/compute_heat_flux_tally.cpp
index c090050b1540925d3ca76cb3e4f23fcaf7471c4e..43b663b27a580495943b5d4835650ae01811b0cd 100644
--- a/src/USER-TALLY/compute_heat_flux_tally.cpp
+++ b/src/USER-TALLY/compute_heat_flux_tally.cpp
@@ -20,6 +20,7 @@
 #include "memory.h"
 #include "error.h"
 #include "force.h"
+#include "comm.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/USER-TALLY/compute_pe_mol_tally.cpp b/src/USER-TALLY/compute_pe_mol_tally.cpp
index 25a172b7f81eb6cd68a75fcb520c401bb89ec1de..0328740e0395bc6ca7914ee8d7b7b88e212e0000 100644
--- a/src/USER-TALLY/compute_pe_mol_tally.cpp
+++ b/src/USER-TALLY/compute_pe_mol_tally.cpp
@@ -20,6 +20,7 @@
 #include "memory.h"
 #include "error.h"
 #include "force.h"
+#include "comm.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/USER-TALLY/compute_pe_tally.cpp b/src/USER-TALLY/compute_pe_tally.cpp
index 5b4644d4e16833f8177a0d22aa29de9802877bc1..caa4cf134a89dd10d73169eae5ba02510a8bf2dd 100644
--- a/src/USER-TALLY/compute_pe_tally.cpp
+++ b/src/USER-TALLY/compute_pe_tally.cpp
@@ -20,6 +20,7 @@
 #include "memory.h"
 #include "error.h"
 #include "force.h"
+#include "comm.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/USER-TALLY/compute_stress_tally.cpp b/src/USER-TALLY/compute_stress_tally.cpp
index 32253d2cad78857a31c52753f85b856e7b84cec2..e44313d695c46959b87ddb89bbf50ec99078bd7c 100644
--- a/src/USER-TALLY/compute_stress_tally.cpp
+++ b/src/USER-TALLY/compute_stress_tally.cpp
@@ -20,6 +20,8 @@
 #include "memory.h"
 #include "error.h"
 #include "force.h"
+#include "comm.h"
+#include "domain.h"
 
 using namespace LAMMPS_NS;
 
diff --git a/src/accelerator_kokkos.h b/src/accelerator_kokkos.h
index 8ea5b9d4d2dd93dd4f85147035bfc5be1633024a..708592a25eb000cf3bdc5bb38add4b413809a94b 100644
--- a/src/accelerator_kokkos.h
+++ b/src/accelerator_kokkos.h
@@ -25,6 +25,7 @@
 #include "comm_tiled_kokkos.h"
 #include "domain_kokkos.h"
 #include "neighbor_kokkos.h"
+#include "memory_kokkos.h"
 #include "modify_kokkos.h"
 
 #else
@@ -37,6 +38,7 @@
 #include "comm_tiled.h"
 #include "domain.h"
 #include "neighbor.h"
+#include "memory.h"
 #include "modify.h"
 
 namespace LAMMPS_NS {
@@ -89,6 +91,13 @@ class NeighborKokkos : public Neighbor {
   ~NeighborKokkos() {}
 };
 
+class MemoryKokkos : public Memory {
+ public:
+  MemoryKokkos(class LAMMPS *lmp) : Memory(lmp) {}
+  ~MemoryKokkos() {}
+  void grow_kokkos(tagint **, tagint **, int, int, const char*) {}
+};
+
 class ModifyKokkos : public Modify {
  public:
   ModifyKokkos(class LAMMPS *lmp) : Modify(lmp) {}
diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp
index 1155ac437adfb439cda2813ea0b8d4f4a850afed..1e91327e54639be94bf89810058c7d9e1df5e2a9 100644
--- a/src/compute_aggregate_atom.cpp
+++ b/src/compute_aggregate_atom.cpp
@@ -16,6 +16,7 @@
 ------------------------------------------------------------------------- */
 
 #include <string.h>
+#include <math.h>
 #include "compute_aggregate_atom.h"
 #include "atom.h"
 #include "atom_vec.h"
diff --git a/src/compute_msd_chunk.cpp b/src/compute_msd_chunk.cpp
index bc5a374fadb8c53f713c1d176f1998a0ebe93437..69cd87f96b6b62d800eb0a7e54587525bc779cfd 100644
--- a/src/compute_msd_chunk.cpp
+++ b/src/compute_msd_chunk.cpp
@@ -126,7 +126,7 @@ void ComputeMSDChunk::setup()
 
   if (fix->nrow == nchunk && fix->ncol == 3) return;
   fix->reset_global(nchunk,3);
-    
+
   double **cominit = fix->astore;
   for (int i = 0; i < nchunk; i++) {
     cominit[i][0] = comall[i][0];
diff --git a/src/compute_orientorder_atom.cpp b/src/compute_orientorder_atom.cpp
index 90e2830e39e55881884bb6cb57f137ec387f62bf..b443d56bf82b3fd7a8d4f50b58181ecb49e922e4 100644
--- a/src/compute_orientorder_atom.cpp
+++ b/src/compute_orientorder_atom.cpp
@@ -18,6 +18,7 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include <math.h>
 #include "compute_orientorder_atom.h"
 #include "atom.h"
 #include "update.h"
diff --git a/src/compute_rdf.cpp b/src/compute_rdf.cpp
index 167de4576dfcbe7c24d8db5c1049c84806c29ecb..bcb620f3b36c59dd842669dd626baebcda760f31 100644
--- a/src/compute_rdf.cpp
+++ b/src/compute_rdf.cpp
@@ -32,6 +32,7 @@
 #include "math_const.h"
 #include "memory.h"
 #include "error.h"
+#include "comm.h"
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp
index 825426b2b6759734da67a39fea0342c0305ab70b..489c5bf5d5f4ce5837d42ee64d8fcd04be3103f3 100644
--- a/src/delete_atoms.cpp
+++ b/src/delete_atoms.cpp
@@ -28,6 +28,7 @@
 #include "random_mars.h"
 #include "memory.h"
 #include "error.h"
+#include "modify.h"
 
 #include <map>
 
diff --git a/src/fix_addforce.cpp b/src/fix_addforce.cpp
index 5c677a43385a071a99d1e89489b6cb2a6ace6e8c..6b1e89227985acb0dc12336520962ff7599ffee3 100644
--- a/src/fix_addforce.cpp
+++ b/src/fix_addforce.cpp
@@ -16,7 +16,6 @@
 #include "fix_addforce.h"
 #include "atom.h"
 #include "atom_masks.h"
-#include "accelerator_kokkos.h"
 #include "update.h"
 #include "modify.h"
 #include "domain.h"
diff --git a/src/fix_ave_chunk.cpp b/src/fix_ave_chunk.cpp
index 1060acd7bb8c6ac289e6ef7606de8de515cbdd35..73df50c66cfa08c10ab2e6e93cf94fa4fabf0322 100644
--- a/src/fix_ave_chunk.cpp
+++ b/src/fix_ave_chunk.cpp
@@ -63,6 +63,7 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) :
   strcpy(idchunk,arg[6]);
 
   global_freq = nfreq;
+  peratom_freq = nfreq;
   no_change_box = 1;
 
   // expand args if any have wildcard character "*"
diff --git a/src/fix_neigh_history.cpp b/src/fix_neigh_history.cpp
index 322c8d55619abd0ef17b0a7788523f978261e53b..623fbff756e5be8f4cb215767533e6d9bc88979e 100644
--- a/src/fix_neigh_history.cpp
+++ b/src/fix_neigh_history.cpp
@@ -35,7 +35,7 @@ enum{DEFAULT,NPARTNER,PERPARTNER}; // also set in fix neigh/history/omp
 
 FixNeighHistory::FixNeighHistory(LAMMPS *lmp, int narg, char **arg) :
   Fix(lmp, narg, arg),
-  npartner(NULL), partner(NULL), valuepartner(NULL), pair(NULL), 
+  npartner(NULL), partner(NULL), valuepartner(NULL), pair(NULL),
   ipage_atom(NULL), dpage_atom(NULL), ipage_neigh(NULL), dpage_neigh(NULL)
 {
   if (narg != 4) error->all(FLERR,"Illegal fix NEIGH_HISTORY command");
@@ -295,7 +295,7 @@ void FixNeighHistory::pre_exchange_onesided()
 
   // set maxpartner = max # of partners of any owned atom
   // bump up comm->maxexchange_fix if necessary
-  
+
   maxpartner = 0;
   for (i = 0; i < nlocal_neigh; i++) maxpartner = MAX(maxpartner,npartner[i]);
   comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1);
@@ -318,7 +318,7 @@ void FixNeighHistory::pre_exchange_newton()
   int *allflags;
   double *allvalues,*onevalues,*jvalues;
 
-  // NOTE: all operations until very end are with 
+  // NOTE: all operations until very end are with
   //   nlocal_neigh  <= current nlocal and nall_neigh
   // b/c previous neigh list was built with nlocal_neigh & nghost_neigh
   // nlocal can be larger if other fixes added atoms at this pre_exchange()
@@ -424,7 +424,7 @@ void FixNeighHistory::pre_exchange_newton()
 
   maxpartner = 0;
   for (i = 0; i < nlocal_neigh; i++) maxpartner = MAX(maxpartner,npartner[i]);
-  comm->maxexchange_fix = MAX(comm->maxexchange_fix,4*maxpartner+1);
+  comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1);
 
   // zero npartner values from previous nlocal_neigh to current nlocal
 
@@ -526,7 +526,7 @@ void FixNeighHistory::pre_exchange_no_newton()
 
   // set maxpartner = max # of partners of any owned atom
   // bump up comm->maxexchange_fix if necessary
-  
+
   maxpartner = 0;
   for (i = 0; i < nlocal_neigh; i++) maxpartner = MAX(maxpartner,npartner[i]);
   comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxpartner+1);
@@ -571,9 +571,9 @@ void FixNeighHistory::post_neighbor()
     memory->sfree(firstflag);
     memory->sfree(firstvalue);
     maxatom = nall;
-    firstflag = (int **) 
+    firstflag = (int **)
       memory->smalloc(maxatom*sizeof(int *),"neighbor_history:firstflag");
-    firstvalue = (double **) 
+    firstvalue = (double **)
       memory->smalloc(maxatom*sizeof(double *),"neighbor_history:firstvalue");
   }
 
@@ -720,7 +720,7 @@ int FixNeighHistory::pack_reverse_comm_size(int n, int first)
   last = first + n;
 
   for (i = first; i < last; i++)
-    m += 1 + 4*npartner[i];
+    m += 1 + (dnum+1)*npartner[i];
 
   return m;
 }
diff --git a/src/fix_store.cpp b/src/fix_store.cpp
index c856bb2db29e6de5b21a9adaa70e0fc03eb64927..84e94fc2b7807c3fc3c1a8938e8d6ce370885d30 100644
--- a/src/fix_store.cpp
+++ b/src/fix_store.cpp
@@ -155,8 +155,7 @@ void FixStore::reset_global(int nrow_caller, int ncol_caller)
   else memory->create(astore,nrow,ncol,"fix/store:astore");
   memory->create(rbuf,nrow*ncol+2,"fix/store:rbuf");
 
-
-  printf("AAA HOW GET HERE\n");
+ // printf("AAA HOW GET HERE\n");
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/input.cpp b/src/input.cpp
index d18be498fd50d062866cf5ec2f50f14cb1341a9c..06403276824a471aaafdc3453706ca951624c657 100644
--- a/src/input.cpp
+++ b/src/input.cpp
@@ -27,7 +27,6 @@
 #include "comm.h"
 #include "comm_brick.h"
 #include "comm_tiled.h"
-#include "accelerator_kokkos.h"
 #include "group.h"
 #include "domain.h"
 #include "output.h"
diff --git a/src/kspace.h b/src/kspace.h
index ad29c214728f56eb0eec5739aeac18b076c752b9..5a2e5b78840456b2b4b555ef9f7f8eb47d70b66c 100644
--- a/src/kspace.h
+++ b/src/kspace.h
@@ -15,7 +15,6 @@
 #define LMP_KSPACE_H
 
 #include "pointers.h"
-#include "accelerator_kokkos.h"
 
 #ifdef FFT_SINGLE
 typedef float FFT_SCALAR;
@@ -124,11 +123,6 @@ class KSpace : protected Pointers {
   virtual void pack_reverse(int, FFT_SCALAR *, int, int *) {};
   virtual void unpack_reverse(int, FFT_SCALAR *, int, int *) {};
 
-  virtual void pack_forward_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
-  virtual void unpack_forward_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
-  virtual void pack_reverse_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
-  virtual void unpack_reverse_kokkos(int, DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
-
   virtual int timing(int, double &, double &) {return 0;}
   virtual int timing_1d(int, double &) {return 0;}
   virtual int timing_3d(int, double &) {return 0;}
diff --git a/src/lammps.h b/src/lammps.h
index c432784a0b14c92f571dc032040f22e35ec30f96..e3b815e6237a7ad660b90b97ee7c65b64db858db 100644
--- a/src/lammps.h
+++ b/src/lammps.h
@@ -53,6 +53,7 @@ class LAMMPS {
 
   class KokkosLMP *kokkos;       // KOKKOS accelerator class
   class AtomKokkos *atomKK;      // KOKKOS version of Atom class
+  class MemoryKokkos *memoryKK;  // KOKKOS version of Memory class
 
   class Python * python;         // Python interface
 
diff --git a/src/memory.h b/src/memory.h
index b83482e4c2b69c9d11259e7c5d1ea73ba7ba077b..f2faecf6e177587e4aaf9dfc14991c6ef4f94f58 100644
--- a/src/memory.h
+++ b/src/memory.h
@@ -16,9 +16,6 @@
 
 #include "lmptype.h"
 #include "pointers.h"
-#ifdef LMP_KOKKOS
-#include "kokkos_type.h"
-#endif
 
 namespace LAMMPS_NS {
 
@@ -31,16 +28,6 @@ class Memory : protected Pointers {
   void sfree(void *);
   void fail(const char *);
 
-  // Kokkos memory allocation functions
-  // provide a dummy prototpye for any Kokkos memory function
-  //   called in main LAMMPS even when not built with KOKKOS package
-
-#ifdef LMP_KOKKOS
-#include "memory_kokkos.h"
-#else
-  void grow_kokkos(tagint **, tagint **, int, int, const char*) {}
-#endif
-
 /* ----------------------------------------------------------------------
    create/grow/destroy vecs and multidim arrays with contiguous memory blocks
    only use with primitive data types, e.g. 1d vec of ints, 2d array of doubles
diff --git a/src/pair.h b/src/pair.h
index eb71e8822474aed87e024988e27b669196385cd9..cfb6576653c3aca4d21dfa99a0a6feda78a4977a 100644
--- a/src/pair.h
+++ b/src/pair.h
@@ -15,7 +15,6 @@
 #define LMP_PAIR_H
 
 #include "pointers.h"
-#include "accelerator_kokkos.h"
 
 namespace LAMMPS_NS {
 
@@ -165,10 +164,6 @@ class Pair : protected Pointers {
 
   virtual int pack_forward_comm(int, int *, double *, int, int *) {return 0;}
   virtual void unpack_forward_comm(int, int, double *) {}
-  virtual int pack_forward_comm_kokkos(int, DAT::tdual_int_2d, 
-                                       int, DAT::tdual_xfloat_1d &, 
-                                       int, int *) {return 0;};
-  virtual void unpack_forward_comm_kokkos(int, int, DAT::tdual_xfloat_1d &) {}
   virtual int pack_reverse_comm(int, int, double *) {return 0;}
   virtual void unpack_reverse_comm(int, int *, double *) {}
   virtual double memory_usage();
diff --git a/src/pair_yukawa.cpp b/src/pair_yukawa.cpp
index 2ba6633d9e21719f8c06beccf263c88ac438110e..9be9237734343588dda84aceb4d650c067c8f525 100644
--- a/src/pair_yukawa.cpp
+++ b/src/pair_yukawa.cpp
@@ -139,7 +139,6 @@ void PairYukawa::allocate()
       setflag[i][j] = 0;
 
   memory->create(cutsq,n+1,n+1,"pair:cutsq");
-
   memory->create(rad,n+1,"pair:rad");
   memory->create(cut,n+1,n+1,"pair:cut");
   memory->create(a,n+1,n+1,"pair:a");
diff --git a/src/pair_yukawa.h b/src/pair_yukawa.h
index 3859d163af5dd7a6843c7b5a178a53722691abf6..3222019a0ae94d4b4a9ccb4ca95fdcf3519ef59b 100644
--- a/src/pair_yukawa.h
+++ b/src/pair_yukawa.h
@@ -46,7 +46,7 @@ class PairYukawa : public Pair {
   double *rad;
   double **cut,**a,**offset;
 
-  void allocate();
+  virtual void allocate();
 };
 
 }
diff --git a/src/pointers.h b/src/pointers.h
index 82b49c1dad05e6988ec02bd1b5646ee2078b6442..44967f51359a28067fee329362a65c8b3a8920dd 100644
--- a/src/pointers.h
+++ b/src/pointers.h
@@ -57,6 +57,7 @@ class Pointers {
     screen(ptr->screen),
     logfile(ptr->logfile),
     atomKK(ptr->atomKK),
+    memoryKK(ptr->memoryKK),
     python(ptr->python) {}
   virtual ~Pointers() {}
 
@@ -84,6 +85,7 @@ class Pointers {
   FILE *&logfile;
 
   class AtomKokkos *&atomKK;
+  class MemoryKokkos *&memoryKK;
   class Python *&python;
 };
 
diff --git a/src/region.cpp b/src/region.cpp
index d2ef481cb79595ec51d22380cff51b95f12c4d77..da814746ad24ef686a7224e9df7ecad8570a0bd0 100644
--- a/src/region.cpp
+++ b/src/region.cpp
@@ -142,15 +142,6 @@ int Region::match(double x, double y, double z)
   return !(inside(x,y,z) ^ interior);
 }
 
-/* ----------------------------------------------------------------------
-   generate error if Kokkos function defaults to base class
-------------------------------------------------------------------------- */
-
-void Region::match_all_kokkos(int, DAT::tdual_int_1d)
-{
-  error->all(FLERR,"Can only use Kokkos supported regions with Kokkos package");
-}
-
 /* ----------------------------------------------------------------------
    generate list of contact points for interior or exterior regions
    if region has variable shape, invoke shape_update() once per timestep
diff --git a/src/region.h b/src/region.h
index 5b4238acb4b071e10de309f04c6d3af2083a4e0e..7e8c45cb2ea91360ceffdf3dfe0b735a61b0684c 100644
--- a/src/region.h
+++ b/src/region.h
@@ -15,7 +15,6 @@
 #define LMP_REGION_H
 
 #include "pointers.h"
-#include "accelerator_kokkos.h"
 
 namespace LAMMPS_NS {
 
@@ -97,10 +96,6 @@ class Region : protected Pointers {
   virtual void set_velocity_shape() {}
   virtual void velocity_contact_shape(double*, double*) {}
 
-  // Kokkos function, implemented by each Kokkos region
-
-  virtual void match_all_kokkos(int, DAT::tdual_int_1d);
-
  protected:
   void add_contact(int, double *, double, double, double);
   void options(int, char **);
diff --git a/src/set.cpp b/src/set.cpp
index 2b1c0edee2da90faaf506c9ce6976ab3f49a325f..11b91df4c4b8f76000b8d59ed5267dd0b2242610 100644
--- a/src/set.cpp
+++ b/src/set.cpp
@@ -36,6 +36,7 @@
 #include "math_const.h"
 #include "memory.h"
 #include "error.h"
+#include "modify.h"
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
diff --git a/src/special.cpp b/src/special.cpp
index 381a763dd29ad9cec5254e8556763f0967d826ac..56529e748b8d52e070696543627bfba255b87e0a 100644
--- a/src/special.cpp
+++ b/src/special.cpp
@@ -591,7 +591,8 @@ void Special::combine()
     AtomKokkos* atomKK = (AtomKokkos*) atom;
     atomKK->modified(Host,SPECIAL_MASK);
     atomKK->sync(Device,SPECIAL_MASK);
-    memory->grow_kokkos(atomKK->k_special,atom->special,
+    MemoryKokkos* memoryKK = (MemoryKokkos*) memory;
+    memoryKK->grow_kokkos(atomKK->k_special,atom->special,
                         atom->nmax,atom->maxspecial,"atom:special");
     atomKK->modified(Device,SPECIAL_MASK);
     atomKK->sync(Host,SPECIAL_MASK);
diff --git a/src/write_coeff.cpp b/src/write_coeff.cpp
index d4d4f99bf388c597f9ef5b674b06ec07a933871d..0556d647cf36d1046f4864002f2e6fa5e5d656f5 100644
--- a/src/write_coeff.cpp
+++ b/src/write_coeff.cpp
@@ -23,6 +23,7 @@
 #include "force.h"
 #include "universe.h"
 #include "error.h"
+#include "domain.h"
 
 using namespace LAMMPS_NS;