diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh
index 93adf58ef5c2aa8ca3a561e28f3be715fb426c4a..ebafb87466060dfc6a10fca33c23b580b754c184 100644
--- a/src/KOKKOS/Install.sh
+++ b/src/KOKKOS/Install.sh
@@ -105,11 +105,14 @@ action modify_kokkos.cpp
 action modify_kokkos.h
 action neigh_bond_kokkos.cpp
 action neigh_bond_kokkos.h
-action neigh_full_kokkos.h
 action neigh_list_kokkos.cpp
 action neigh_list_kokkos.h
 action neighbor_kokkos.cpp
 action neighbor_kokkos.h
+action npair_kokkos.cpp
+action npair_kokkos.h
+action nbin_kokkos.cpp
+action nbin_kokkos.h
 action math_special_kokkos.cpp
 action math_special_kokkos.h
 action pair_buck_coul_cut_kokkos.cpp
@@ -169,8 +172,6 @@ action pair_reax_c_kokkos.cpp pair_reax_c.cpp
 action pair_reax_c_kokkos.h pair_reax_c.h
 action pair_sw_kokkos.cpp pair_sw.cpp
 action pair_sw_kokkos.h pair_sw.h
-action pair_vashishta_kokkos.cpp pair_vashishta.cpp
-action pair_vashishta_kokkos.h pair_vashishta.h
 action pair_table_kokkos.cpp
 action pair_table_kokkos.h
 action pair_tersoff_kokkos.cpp pair_tersoff.cpp
diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h
index 7ac66f162696e4d4814676134b7ff8ffc626d4ae..fbeeaf96be3a6415e62901a2edbfb3231c331952 100644
--- a/src/KOKKOS/atom_vec_kokkos.h
+++ b/src/KOKKOS/atom_vec_kokkos.h
@@ -83,13 +83,8 @@ class AtomVecKokkos : public AtomVec {
                    std::is_same<typename ViewType::execution_space,LMPDeviceType>::value,
                    Kokkos::CudaHostPinnedSpace,typename ViewType::memory_space>::type,
                  Kokkos::MemoryTraits<Kokkos::Unmanaged> > mirror_type;
-    if (buffer_size == 0) {
-       buffer = Kokkos::kokkos_malloc<Kokkos::CudaHostPinnedSpace>(src.capacity());
-       buffer_size = src.capacity();
-    } else if (buffer_size < src.capacity()) {
+    if(buffer_size < src.capacity())
        buffer = Kokkos::kokkos_realloc<Kokkos::CudaHostPinnedSpace>(buffer,src.capacity());
-       buffer_size = src.capacity();
-    }
     return mirror_type( buffer ,
                              src.dimension_0() ,
                              src.dimension_1() ,
@@ -109,13 +104,8 @@ class AtomVecKokkos : public AtomVec {
                    std::is_same<typename ViewType::execution_space,LMPDeviceType>::value,
                    Kokkos::CudaHostPinnedSpace,typename ViewType::memory_space>::type,
                  Kokkos::MemoryTraits<Kokkos::Unmanaged> > mirror_type;
-    if (buffer_size == 0) {
-       buffer = Kokkos::kokkos_malloc<Kokkos::CudaHostPinnedSpace>(src.capacity()*sizeof(typename ViewType::value_type));
-       buffer_size = src.capacity();
-    } else if (buffer_size < src.capacity()) {
+    if(buffer_size < src.capacity())
        buffer = Kokkos::kokkos_realloc<Kokkos::CudaHostPinnedSpace>(buffer,src.capacity()*sizeof(typename ViewType::value_type));
-       buffer_size = src.capacity();
-    }
     mirror_type tmp_view( (typename ViewType::value_type*)buffer ,
                              src.dimension_0() ,
                              src.dimension_1() ,
diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp
index 0c0039a18a5c35988ec94df44beaf668e3fcc354..844d48dae075856b794ddb95a85f6a0428af67c5 100644
--- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp
+++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp
@@ -125,12 +125,10 @@ void FixQEqReaxKokkos<DeviceType>::init()
       neighbor->requests[irequest]->pair = 0;
       neighbor->requests[irequest]->full = 1;
       neighbor->requests[irequest]->half = 0;
-      neighbor->requests[irequest]->full_cluster = 0;
     } else { //if (neighflag == HALF || neighflag == HALFTHREAD)
       neighbor->requests[irequest]->fix = 1;
       neighbor->requests[irequest]->full = 0;
       neighbor->requests[irequest]->half = 1;
-      neighbor->requests[irequest]->full_cluster = 0;
       neighbor->requests[irequest]->ghost = 1;
     }
   }
diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp
index 72bf094e4b94334d15e8940584a871c8e4791837..763c97d69b407ac329842d3732619205d0de7fda 100644
--- a/src/KOKKOS/kokkos.cpp
+++ b/src/KOKKOS/kokkos.cpp
@@ -168,7 +168,6 @@ void KokkosLMP::accelerator(int narg, char **arg)
         else 
           neighflag = HALF;
       } else if (strcmp(arg[iarg+1],"n2") == 0) neighflag = N2;
-      else if (strcmp(arg[iarg+1],"full/cluster") == 0) neighflag = FULLCLUSTER;
       else error->all(FLERR,"Illegal package kokkos command");
       iarg += 2;
     } else if (strcmp(arg[iarg],"binsize") == 0) {
@@ -232,20 +231,6 @@ void KokkosLMP::accelerator(int narg, char **arg)
    called by Finish
 ------------------------------------------------------------------------- */
 
-int KokkosLMP::neigh_list_kokkos(int m)
-{
-  NeighborKokkos *nk = (NeighborKokkos *) neighbor;
-  if (nk->lists_host[m] && nk->lists_host[m]->d_numneigh.dimension_0())
-    return 1;
-  if (nk->lists_device[m] && nk->lists_device[m]->d_numneigh.dimension_0())
-    return 1;
-  return 0;
-}
-
-/* ----------------------------------------------------------------------
-   called by Finish
-------------------------------------------------------------------------- */
-
 int KokkosLMP::neigh_count(int m)
 {
   int inum;
@@ -255,28 +240,30 @@ int KokkosLMP::neigh_count(int m)
   ArrayTypes<LMPHostType>::t_int_1d h_numneigh;
 
   NeighborKokkos *nk = (NeighborKokkos *) neighbor;
-  if (nk->lists_host[m]) {
-    inum = nk->lists_host[m]->inum;
+  if (nk->lists[m]->execution_space == Host) {
+    NeighListKokkos<LMPHostType>* nlistKK = (NeighListKokkos<LMPHostType>*) nk->lists[m];
+    inum = nlistKK->inum;
 #ifndef KOKKOS_USE_CUDA_UVM
-    h_ilist = Kokkos::create_mirror_view(nk->lists_host[m]->d_ilist);
-    h_numneigh = Kokkos::create_mirror_view(nk->lists_host[m]->d_numneigh);
+    h_ilist = Kokkos::create_mirror_view(nlistKK->d_ilist);
+    h_numneigh = Kokkos::create_mirror_view(nlistKK->d_numneigh);
 #else
-    h_ilist = nk->lists_host[m]->d_ilist;
-    h_numneigh = nk->lists_host[m]->d_numneigh;
+    h_ilist = nlistKK->d_ilist;
+    h_numneigh = nlistKK->d_numneigh;
 #endif
-    Kokkos::deep_copy(h_ilist,nk->lists_host[m]->d_ilist);
-    Kokkos::deep_copy(h_numneigh,nk->lists_host[m]->d_numneigh);
-  } else if (nk->lists_device[m]) {
-    inum = nk->lists_device[m]->inum;
+    Kokkos::deep_copy(h_ilist,nlistKK->d_ilist);
+    Kokkos::deep_copy(h_numneigh,nlistKK->d_numneigh);
+  } else if (nk->lists[m]->execution_space == Device) {
+    NeighListKokkos<LMPDeviceType>* nlistKK = (NeighListKokkos<LMPDeviceType>*) nk->lists[m];
+    inum = nlistKK->inum;
 #ifndef KOKKOS_USE_CUDA_UVM
-    h_ilist = Kokkos::create_mirror_view(nk->lists_device[m]->d_ilist);
-    h_numneigh = Kokkos::create_mirror_view(nk->lists_device[m]->d_numneigh);
+    h_ilist = Kokkos::create_mirror_view(nlistKK->d_ilist);
+    h_numneigh = Kokkos::create_mirror_view(nlistKK->d_numneigh);
 #else
-    h_ilist = nk->lists_device[m]->d_ilist;
-    h_numneigh = nk->lists_device[m]->d_numneigh;
+    h_ilist = nlistKK->d_ilist;
+    h_numneigh = nlistKK->d_numneigh;
 #endif
-    Kokkos::deep_copy(h_ilist,nk->lists_device[m]->d_ilist);
-    Kokkos::deep_copy(h_numneigh,nk->lists_device[m]->d_numneigh);
+    Kokkos::deep_copy(h_ilist,nlistKK->d_ilist);
+    Kokkos::deep_copy(h_numneigh,nlistKK->d_numneigh);
   }
 
   for (int i = 0; i < inum; i++) nneigh += h_numneigh[h_ilist[i]];
diff --git a/src/KOKKOS/kokkos.h b/src/KOKKOS/kokkos.h
index 1058affcfc838e3d316ca5247f0102a8cb521fec..3b91a56ea7e18a2534316fa69fffd32373099ce9 100644
--- a/src/KOKKOS/kokkos.h
+++ b/src/KOKKOS/kokkos.h
@@ -34,7 +34,6 @@ class KokkosLMP : protected Pointers {
   KokkosLMP(class LAMMPS *, int, char **);
   ~KokkosLMP();
   void accelerator(int, char **);
-  int neigh_list_kokkos(int);
   int neigh_count(int);
  private:
   static void my_signal_handler(int);
diff --git a/src/KOKKOS/nbin_kokkos.cpp b/src/KOKKOS/nbin_kokkos.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..feec72f45acaaca8c42c44735aba6dda0f424b79
--- /dev/null
+++ b/src/KOKKOS/nbin_kokkos.cpp
@@ -0,0 +1,144 @@
+/* ----------------------------------------------------------------------
+   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.
+------------------------------------------------------------------------- */
+
+#include "nbin_kokkos.h"
+#include "neighbor.h"
+#include "atom_kokkos.h"
+#include "group.h"
+#include "domain.h"
+#include "comm.h"
+#include "update.h"
+#include "error.h"
+#include "atom_masks.h"
+
+using namespace LAMMPS_NS;
+
+enum{NSQ,BIN,MULTI};       // also in Neighbor
+
+#define SMALL 1.0e-6
+#define CUT2BIN_RATIO 100
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+NBinKokkos<DeviceType>::NBinKokkos(LAMMPS *lmp) : NBinStandard(lmp) {
+  atoms_per_bin = 16;
+
+  d_resize = typename AT::t_int_scalar("NeighborKokkosFunctor::resize");
+#ifndef KOKKOS_USE_CUDA_UVM
+  h_resize = Kokkos::create_mirror_view(d_resize);
+#else
+  h_resize = d_resize;
+#endif
+  h_resize() = 1;
+
+}
+
+/* ----------------------------------------------------------------------
+   setup neighbor binning geometry
+   bin numbering in each dimension is global:
+     0 = 0.0 to binsize, 1 = binsize to 2*binsize, etc
+     nbin-1,nbin,etc = bbox-binsize to bbox, bbox to bbox+binsize, etc
+     -1,-2,etc = -binsize to 0.0, -2*binsize to -binsize, etc
+   code will work for any binsize
+     since next(xyz) and stencil extend as far as necessary
+     binsize = 1/2 of cutoff is roughly optimal
+   for orthogonal boxes:
+     a dim must be filled exactly by integer # of bins
+     in periodic, procs on both sides of PBC must see same bin boundary
+     in non-periodic, coord2bin() still assumes this by use of nbin xyz
+   for triclinic boxes:
+     tilted simulation box cannot contain integer # of bins
+     stencil & neigh list built differently to account for this
+   mbinlo = lowest global bin any of my ghost atoms could fall into
+   mbinhi = highest global bin any of my ghost atoms could fall into
+   mbin = number of bins I need in a dimension
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void NBinKokkos<DeviceType>::bin_atoms_setup(int nall)
+{
+  if (mbins > k_bins.d_view.dimension_0()) {
+    k_bins = DAT::tdual_int_2d("Neighbor::d_bins",mbins,atoms_per_bin);
+    bins = k_bins.view<DeviceType>();
+
+    k_bincount = DAT::tdual_int_1d("Neighbor::d_bincount",mbins);
+    bincount = k_bincount.view<DeviceType>();
+    last_bin_memory = update->ntimestep;
+  }
+
+  last_bin = update->ntimestep;
+}
+
+/* ----------------------------------------------------------------------
+   bin owned and ghost atoms
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+void NBinKokkos<DeviceType>::bin_atoms()
+{
+  h_resize() = 1;
+
+  while(h_resize() > 0) {
+    h_resize() = 0;
+    deep_copy(d_resize, h_resize);
+
+    MemsetZeroFunctor<DeviceType> f_zero;
+    f_zero.ptr = (void*) k_bincount.view<DeviceType>().ptr_on_device();
+    Kokkos::parallel_for(mbins, f_zero);
+    DeviceType::fence();
+
+    atomKK->sync(ExecutionSpaceFromDevice<DeviceType>::space,X_MASK);
+    x = atomKK->k_x.view<DeviceType>();
+
+    bboxlo_[0] = bboxlo[0]; bboxlo_[1] = bboxlo[1]; bboxlo_[2] = bboxlo[2];
+    bboxhi_[0] = bboxhi[0]; bboxhi_[1] = bboxhi[1]; bboxhi_[2] = bboxhi[2];
+
+    NPairKokkosBinAtomsFunctor<DeviceType> f(*this);
+
+    Kokkos::parallel_for(atom->nlocal+atom->nghost, f);
+    DeviceType::fence();
+
+    deep_copy(h_resize, d_resize);
+    if(h_resize()) {
+
+      atoms_per_bin += 16;
+      k_bins = DAT::tdual_int_2d("bins", mbins, atoms_per_bin);
+      bins = k_bins.view<DeviceType>();
+      c_bins = bins;
+    }
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+KOKKOS_INLINE_FUNCTION
+void NBinKokkos<DeviceType>::binatomsItem(const int &i) const
+{
+  const int ibin = coord2bin(x(i, 0), x(i, 1), x(i, 2));
+
+  const int ac = Kokkos::atomic_fetch_add(&bincount[ibin], (int)1);
+  if(ac < bins.dimension_1()) {
+    bins(ibin, ac) = i;
+  } else {
+    d_resize() = 1;
+  }
+}
+
+namespace LAMMPS_NS {
+template class NBinKokkos<LMPDeviceType>;
+#ifdef KOKKOS_HAVE_CUDA
+template class NBinKokkos<LMPHostType>;
+#endif
+}
diff --git a/src/KOKKOS/nbin_kokkos.h b/src/KOKKOS/nbin_kokkos.h
new file mode 100644
index 0000000000000000000000000000000000000000..de3cf41d19c816952c6e4b1540b536d1baa42a77
--- /dev/null
+++ b/src/KOKKOS/nbin_kokkos.h
@@ -0,0 +1,153 @@
+/* -*- 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 NBIN_CLASS
+
+NBinStyle(kk/host,
+          NBinKokkos<LMPHostType>,
+          NB_KOKKOS_HOST)
+
+NBinStyle(kk/device,
+          NBinKokkos<LMPDeviceType>,
+          NB_KOKKOS_DEVICE)
+
+#else
+
+#ifndef LMP_NBIN_KOKKOS_H
+#define LMP_NBIN_KOKKOS_H
+
+#include "nbin_standard.h"
+#include "kokkos_type.h"
+
+namespace LAMMPS_NS {
+
+template<class DeviceType>
+class NBinKokkos : public NBinStandard {
+ public:
+  typedef ArrayTypes<DeviceType> AT;
+
+  NBinKokkos(class LAMMPS *);
+  ~NBinKokkos() {}
+  void bin_atoms_setup(int);
+  void bin_atoms();
+
+  int atoms_per_bin;
+  DAT::tdual_int_1d k_bincount;
+  DAT::tdual_int_2d k_bins;
+
+  typename AT::t_int_1d bincount;
+  const typename AT::t_int_1d_const c_bincount;
+  typename AT::t_int_2d bins;
+  typename AT::t_int_2d_const c_bins;
+  typename AT::t_int_scalar d_resize;
+  typename ArrayTypes<LMPHostType>::t_int_scalar h_resize;
+  typename AT::t_x_array_randomread x;
+
+  KOKKOS_INLINE_FUNCTION
+  void binatomsItem(const int &i) const;
+
+  KOKKOS_INLINE_FUNCTION
+  int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z) const
+  {
+    int ix,iy,iz;
+
+    if (x >= bboxhi_[0])
+      ix = static_cast<int> ((x-bboxhi_[0])*bininvx) + nbinx;
+    else if (x >= bboxlo_[0]) {
+      ix = static_cast<int> ((x-bboxlo_[0])*bininvx);
+      ix = MIN(ix,nbinx-1);
+    } else
+      ix = static_cast<int> ((x-bboxlo_[0])*bininvx) - 1;
+
+    if (y >= bboxhi_[1])
+      iy = static_cast<int> ((y-bboxhi_[1])*bininvy) + nbiny;
+    else if (y >= bboxlo_[1]) {
+      iy = static_cast<int> ((y-bboxlo_[1])*bininvy);
+      iy = MIN(iy,nbiny-1);
+    } else
+      iy = static_cast<int> ((y-bboxlo_[1])*bininvy) - 1;
+
+    if (z >= bboxhi_[2])
+      iz = static_cast<int> ((z-bboxhi_[2])*bininvz) + nbinz;
+    else if (z >= bboxlo_[2]) {
+      iz = static_cast<int> ((z-bboxlo_[2])*bininvz);
+      iz = MIN(iz,nbinz-1);
+    } else
+      iz = static_cast<int> ((z-bboxlo_[2])*bininvz) - 1;
+
+    return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const
+  {
+    int ix,iy,iz;
+
+    if (x >= bboxhi_[0])
+      ix = static_cast<int> ((x-bboxhi_[0])*bininvx) + nbinx;
+    else if (x >= bboxlo_[0]) {
+      ix = static_cast<int> ((x-bboxlo_[0])*bininvx);
+      ix = MIN(ix,nbinx-1);
+    } else
+      ix = static_cast<int> ((x-bboxlo_[0])*bininvx) - 1;
+
+    if (y >= bboxhi_[1])
+      iy = static_cast<int> ((y-bboxhi_[1])*bininvy) + nbiny;
+    else if (y >= bboxlo_[1]) {
+      iy = static_cast<int> ((y-bboxlo_[1])*bininvy);
+      iy = MIN(iy,nbiny-1);
+    } else
+      iy = static_cast<int> ((y-bboxlo_[1])*bininvy) - 1;
+
+    if (z >= bboxhi_[2])
+      iz = static_cast<int> ((z-bboxhi_[2])*bininvz) + nbinz;
+    else if (z >= bboxlo_[2]) {
+      iz = static_cast<int> ((z-bboxlo_[2])*bininvz);
+      iz = MIN(iz,nbinz-1);
+    } else
+      iz = static_cast<int> ((z-bboxlo_[2])*bininvz) - 1;
+
+    i[0] = ix - mbinxlo;
+    i[1] = iy - mbinylo;
+    i[2] = iz - mbinzlo;
+
+    return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
+  }
+
+ private:
+  double bboxlo_[3],bboxhi_[3];
+};
+
+template<class DeviceType>
+struct NPairKokkosBinAtomsFunctor {
+  typedef DeviceType device_type;
+
+  const NBinKokkos<DeviceType> c;
+
+  NPairKokkosBinAtomsFunctor(const NBinKokkos<DeviceType> &_c):
+    c(_c) {};
+  ~NPairKokkosBinAtomsFunctor() {}
+  KOKKOS_INLINE_FUNCTION
+  void operator() (const int & i) const {
+    c.binatomsItem(i);
+  }
+};
+
+}
+
+#endif
+#endif
+
+/* ERROR/WARNING messages:
+
+*/
diff --git a/src/KOKKOS/neigh_list_kokkos.cpp b/src/KOKKOS/neigh_list_kokkos.cpp
index cbba2120bdae3a1eb0b2b3a2888ee3be0963addc..b1b4e4467a5658beb387ed7f2bad20fe946c4342 100644
--- a/src/KOKKOS/neigh_list_kokkos.cpp
+++ b/src/KOKKOS/neigh_list_kokkos.cpp
@@ -34,9 +34,8 @@ void NeighListKokkos<Device>::clean_copy()
 
   ipage = NULL;
   dpage = NULL;
-  maxstencil = 0;
-  ghostflag = 0;
-  maxstencil_multi = 0;
+
+  maxatoms = 0;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -70,49 +69,6 @@ void NeighListKokkos<Device>::grow(int nmax)
 
 /* ---------------------------------------------------------------------- */
 
-template<class Device>
-void NeighListKokkos<Device>::stencil_allocate(int smax, int style)
-{
-  int i;
-
-  if (style == BIN) {
-    if (smax > maxstencil) {
-      maxstencil = smax;
-      d_stencil =
-        memory->create_kokkos(d_stencil,h_stencil,stencil,maxstencil,
-                              "neighlist:stencil");
-      if (ghostflag) {
-        memory->create_kokkos(d_stencilxyz,h_stencilxyz,stencilxyz,maxstencil,
-                              3,"neighlist:stencilxyz");
-      }
-    }
-
-  } else {
-    int n = atom->ntypes;
-    if (maxstencil_multi == 0) {
-      nstencil_multi = new int[n+1];
-      stencil_multi = new int*[n+1];
-      distsq_multi = new double*[n+1];
-      for (i = 1; i <= n; i++) {
-        nstencil_multi[i] = 0;
-        stencil_multi[i] = NULL;
-        distsq_multi[i] = NULL;
-      }
-    }
-    if (smax > maxstencil_multi) {
-      maxstencil_multi = smax;
-      for (i = 1; i <= n; i++) {
-        memory->destroy(stencil_multi[i]);
-        memory->destroy(distsq_multi[i]);
-        memory->create(stencil_multi[i],maxstencil_multi,
-                       "neighlist:stencil_multi");
-        memory->create(distsq_multi[i],maxstencil_multi,
-                       "neighlist:distsq_multi");
-      }
-    }
-  }
-}
-
 namespace LAMMPS_NS {
 template class NeighListKokkos<LMPDeviceType>;
 #ifdef KOKKOS_HAVE_CUDA
diff --git a/src/KOKKOS/neigh_list_kokkos.h b/src/KOKKOS/neigh_list_kokkos.h
index 85f0f38d2cfca9b7fd0150220553442342139114..393fa478a18bcf102d97fef0d413df0da8cc4b3b 100644
--- a/src/KOKKOS/neigh_list_kokkos.h
+++ b/src/KOKKOS/neigh_list_kokkos.h
@@ -20,7 +20,7 @@
 
 namespace LAMMPS_NS {
 
-enum{FULL=1u,HALFTHREAD=2u,HALF=4u,N2=8u,FULLCLUSTER=16u};
+enum{FULL=1u,HALFTHREAD=2u,HALF=4u,N2=8u};
 
 class AtomNeighbors
 {
@@ -74,14 +74,12 @@ public:
   typename DAT::tdual_int_1d k_ilist;   // local indices of I atoms
   typename ArrayTypes<Device>::t_int_1d d_ilist;
   typename ArrayTypes<Device>::t_int_1d d_numneigh; // # of J neighs for each I
-  typename ArrayTypes<Device>::t_int_1d d_stencil;  // # of J neighs for each I
-  typename ArrayTypes<LMPHostType>::t_int_1d h_stencil; // # of J neighs per I
-  typename ArrayTypes<Device>::t_int_1d_3 d_stencilxyz;
-  typename ArrayTypes<LMPHostType>::t_int_1d_3 h_stencilxyz;
 
   NeighListKokkos(class LAMMPS *lmp):
-  NeighList(lmp) {_stride = 1; maxneighs = 16;};
-  ~NeighListKokkos() {stencil = NULL; numneigh = NULL; ilist = NULL;};
+  NeighList(lmp) {_stride = 1; maxneighs = 16; kokkos = 1;
+                  execution_space = ExecutionSpaceFromDevice<Device>::space;
+  };
+  ~NeighListKokkos() {numneigh = NULL; ilist = NULL;};
 
   KOKKOS_INLINE_FUNCTION
   AtomNeighbors get_neighbors(const int &i) const {
@@ -99,7 +97,8 @@ public:
   int& num_neighs(const int & i) const {
     return d_numneigh(i);
   }
-  void stencil_allocate(int smax, int style);
+ private:
+  int maxatoms;
 };
 
 }
diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp
index 31fa1859f94b34d7d21eec2a1f3063e08136573a..ff154c9919991c10b4e79f0db104b9af9f09809e 100644
--- a/src/KOKKOS/neighbor_kokkos.cpp
+++ b/src/KOKKOS/neighbor_kokkos.cpp
@@ -21,11 +21,10 @@
 #include "atom_masks.h"
 #include "error.h"
 #include "kokkos.h"
-#include "force.h"
-#include "bond.h"
-#include "angle.h"
-#include "dihedral.h"
-#include "improper.h"
+#include "style_nbin.h"
+#include "style_nstencil.h"
+#include "style_npair.h"
+#include "style_ntopo.h"
 
 using namespace LAMMPS_NS;
 
@@ -36,18 +35,11 @@ enum{NSQ,BIN,MULTI};     // also in neigh_list.cpp
 NeighborKokkos::NeighborKokkos(LAMMPS *lmp) : Neighbor(lmp),
   neighbond_host(lmp),neighbond_device(lmp)
 {
-  atoms_per_bin = 16;
-
-  nlist_host = 0;
-  lists_host = NULL;
-  pair_build_host = NULL;
-  stencil_create_host = NULL;
-  nlist_device = 0;
-  lists_device = NULL;
-  pair_build_device = NULL;
-  stencil_create_device = NULL;
-
   device_flag = 0;
+  bondlist = NULL;
+  anglelist = NULL;
+  dihedrallist = NULL;
+  improperlist = NULL;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -58,14 +50,6 @@ NeighborKokkos::~NeighborKokkos()
     memory->destroy_kokkos(k_cutneighsq,cutneighsq);
     cutneighsq = NULL;
 
-    for (int i = 0; i < nlist_host; i++) delete lists_host[i];
-    delete [] lists_host;
-    for (int i = 0; i < nlist_device; i++) delete lists_device[i];
-    delete [] lists_device;
-
-    delete [] pair_build_device;
-    delete [] pair_build_host;
-
     memory->destroy_kokkos(k_ex_type,ex_type);
     memory->destroy_kokkos(k_ex1_type,ex1_type);
     memory->destroy_kokkos(k_ex2_type,ex2_type);
@@ -89,170 +73,30 @@ void NeighborKokkos::init()
 {
   atomKK = (AtomKokkos *) atom;
   Neighbor::init();
-}
-
-/* ---------------------------------------------------------------------- */
-
-void NeighborKokkos::init_cutneighsq_kokkos(int n)
-{
-  memory->create_kokkos(k_cutneighsq,cutneighsq,n+1,n+1,"neigh:cutneighsq");
-  k_cutneighsq.modify<LMPHostType>();
-}
-
-/* ---------------------------------------------------------------------- */
-
-int NeighborKokkos::init_lists_kokkos()
-{
-  int i;
-
-  for (i = 0; i < nlist_host; i++) delete lists_host[i];
-  delete [] lists_host;
-  delete [] pair_build_host;
-  delete [] stencil_create_host;
-  nlist_host = 0;
-
-  for (i = 0; i < nlist_device; i++) delete lists_device[i];
-  delete [] lists_device;
-  delete [] pair_build_device;
-  delete [] stencil_create_device;
-  nlist_device = 0;
-
-  nlist = 0;
-  for (i = 0; i < nrequest; i++) {
-    if (requests[i]->kokkos_device) nlist_device++;
-    else if (requests[i]->kokkos_host) nlist_host++;
-    else nlist++;
-  }
-
-  lists_host = new NeighListKokkos<LMPHostType>*[nrequest];
-  pair_build_host = new PairPtrHost[nrequest];
-  stencil_create_host = new StencilPtrHost[nrequest];
-  for (i = 0; i < nrequest; i++) {
-    lists_host[i] = NULL;
-    pair_build_host[i] = NULL;
-    stencil_create_host[i] = NULL;
-  }
-
-  for (i = 0; i < nrequest; i++) {
-    if (!requests[i]->kokkos_host) continue;
-    lists_host[i] = new NeighListKokkos<LMPHostType>(lmp);
-    lists_host[i]->index = i;
-    lists_host[i]->dnum = requests[i]->dnum;
-    if (requests[i]->pair) {
-      Pair *pair = (Pair *) requests[i]->requestor;
-      pair->init_list(requests[i]->id,lists_host[i]);
-    }
-    if (requests[i]->fix) {
-      Fix *fix = (Fix *) requests[i]->requestor;
-      fix->init_list(requests[i]->id,lists_host[i]);
-    }
-  }
-
-  lists_device = new NeighListKokkos<LMPDeviceType>*[nrequest];
-  pair_build_device = new PairPtrDevice[nrequest];
-  stencil_create_device = new StencilPtrDevice[nrequest];
-  for (i = 0; i < nrequest; i++) {
-    lists_device[i] = NULL;
-    pair_build_device[i] = NULL;
-    stencil_create_device[i] = NULL;
-  }
-
-  for (i = 0; i < nrequest; i++) {
-    if (!requests[i]->kokkos_device) continue;
-    lists_device[i] = new NeighListKokkos<LMPDeviceType>(lmp);
-    lists_device[i]->index = i;
-    lists_device[i]->dnum = requests[i]->dnum;
-    if (requests[i]->pair) {
-      Pair *pair = (Pair *) requests[i]->requestor;
-      pair->init_list(requests[i]->id,lists_device[i]);
-    }
-    if (requests[i]->fix) {
-      Fix *fix = (Fix *) requests[i]->requestor;
-      fix->init_list(requests[i]->id,lists_device[i]);
-    }
-  }
 
   // 1st time allocation of xhold
 
   if (dist_check)
       xhold = DAT::tdual_x_array("neigh:xhold",maxhold);
-
-  // return # of non-Kokkos lists
-
-  return nlist;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void NeighborKokkos::init_list_flags1_kokkos(int i)
-{
-  if (style != BIN)
-    error->all(FLERR,"KOKKOS package only supports 'bin' neighbor lists");
-
-  if (lists_host[i]) {
-    lists_host[i]->buildflag = 1;
-    if (pair_build_host[i] == NULL) lists_host[i]->buildflag = 0;
-    if (requests[i]->occasional) lists_host[i]->buildflag = 0;
-
-    lists_host[i]->growflag = 1;
-    if (requests[i]->copy) lists_host[i]->growflag = 0;
-
-    lists_host[i]->stencilflag = 1;
-    if (style == NSQ) lists_host[i]->stencilflag = 0;
-    if (stencil_create[i] == NULL) lists_host[i]->stencilflag = 0;
-
-    lists_host[i]->ghostflag = 0;
-    if (requests[i]->ghost) lists_host[i]->ghostflag = 1;
-    if (requests[i]->ghost && !requests[i]->occasional) anyghostlist = 1;
-  }
-
-  if (lists_device[i]) {
-    lists_device[i]->buildflag = 1;
-    if (pair_build_device[i] == NULL) lists_device[i]->buildflag = 0;
-    if (requests[i]->occasional) lists_device[i]->buildflag = 0;
-
-    lists_device[i]->growflag = 1;
-    if (requests[i]->copy) lists_device[i]->growflag = 0;
-
-    lists_device[i]->stencilflag = 1;
-    if (style == NSQ) lists_device[i]->stencilflag = 0;
-    if (stencil_create[i] == NULL) lists_device[i]->stencilflag = 0;
-
-    lists_device[i]->ghostflag = 0;
-    if (requests[i]->ghost) lists_device[i]->ghostflag = 1;
-    if (requests[i]->ghost && !requests[i]->occasional) anyghostlist = 1;
-  }
 }
 
 /* ---------------------------------------------------------------------- */
 
-void NeighborKokkos::init_list_flags2_kokkos(int i)
+void NeighborKokkos::init_cutneighsq_kokkos(int n)
 {
-  if (lists_host[i]) {
-    if (lists_host[i]->buildflag) blist[nblist++] = i;
-    if (lists_host[i]->growflag && requests[i]->occasional == 0)
-      glist[nglist++] = i;
-    if (lists_host[i]->stencilflag && requests[i]->occasional == 0)
-      slist[nslist++] = i;
-  }
-
-  if (lists_device[i]) {
-    if (lists_device[i]->buildflag) blist[nblist++] = i;
-    if (lists_device[i]->growflag && requests[i]->occasional == 0)
-      glist[nglist++] = i;
-    if (lists_device[i]->stencilflag && requests[i]->occasional == 0)
-      slist[nslist++] = i;
-  }
+  memory->create_kokkos(k_cutneighsq,cutneighsq,n+1,n+1,"neigh:cutneighsq");
+  k_cutneighsq.modify<LMPHostType>();
 }
 
 /* ---------------------------------------------------------------------- */
 
-void NeighborKokkos::init_list_grow_kokkos(int i)
+void NeighborKokkos::create_kokkos_list(int i)
 {
-  if (lists_host[i]!=NULL && lists_host[i]->growflag)
-    lists_host[i]->grow(maxatom);
-  if (lists_device[i]!=NULL && lists_device[i]->growflag)
-    lists_device[i]->grow(maxatom);
+  if (requests[i]->kokkos_device) {
+    lists[i] = new NeighListKokkos<LMPDeviceType>(lmp);
+    device_flag = 1;
+  } else if (requests[i]->kokkos_host)
+    lists[i] = new NeighListKokkos<LMPHostType>(lmp);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -281,49 +125,6 @@ void NeighborKokkos::init_ex_mol_bit_kokkos()
   k_ex_mol_bit.modify<LMPHostType>();
 }
 
-/* ---------------------------------------------------------------------- */
-
-void NeighborKokkos::choose_build(int index, NeighRequest *rq)
-{
-  if (rq->kokkos_host != 0) {
-    PairPtrHost pb = NULL;
-    if (rq->ghost) {
-      if (rq->full) {
-        if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPHostType>;
-        else pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,0,1>;
-      }
-      else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,1,1>;
-    } else {
-      if (rq->full) {
-        if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPHostType>;
-        else pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,0,0>;
-      }
-      else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,1,0>;
-    }
-    pair_build_host[index] = pb;
-  }
-  if (rq->kokkos_device != 0) {
-    PairPtrDevice pb = NULL;
-    if (rq->ghost) {
-      if (rq->full) {
-        if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPDeviceType>;
-        else pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,0,1>;
-      }
-      else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,1,1>;
-    } else {
-      if (rq->full) {
-        if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPDeviceType>;
-        else pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,0,0>;
-      }
-      else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,1,0>;
-    }
-    pair_build_device[index] = pb;
-    return;
-  }
-
-  Neighbor::choose_build(index,rq);
-}
-
 /* ----------------------------------------------------------------------
    if any atom moved trigger distance (half of neighbor skin) return 1
    shrink trigger distance if box size has changed
@@ -337,7 +138,7 @@ void NeighborKokkos::choose_build(int index, NeighRequest *rq)
 
 int NeighborKokkos::check_distance()
 {
-  if (nlist_device)
+  if (device_flag)
     check_distance_kokkos<LMPDeviceType>();
   else
     check_distance_kokkos<LMPHostType>();
@@ -417,7 +218,7 @@ void NeighborKokkos::operator()(TagNeighborCheckDistance<DeviceType>, const int
 
 void NeighborKokkos::build(int topoflag)
 {
-  if (nlist_device)
+  if (device_flag)
     build_kokkos<LMPDeviceType>(topoflag);
   else
     build_kokkos<LMPHostType>(topoflag);
@@ -426,20 +227,30 @@ void NeighborKokkos::build(int topoflag)
 template<class DeviceType>
 void NeighborKokkos::build_kokkos(int topoflag)
 {
+  if (style != BIN)
+    error->all(FLERR,"KOKKOS package only supports 'bin' neighbor lists");
+
   typedef DeviceType device_type;
 
-  int i;
+  int i,m;
 
   ago = 0;
   ncalls++;
   lastcall = update->ntimestep;
 
+  int nlocal = atom->nlocal;
+  int nall = nlocal + atom->nghost;
+
+  // check that using special bond flags will not overflow neigh lists
+
+  if (nall > NEIGHMASK)
+    error->one(FLERR,"Too many local+ghost atoms for neighbor list");
+
   // store current atom positions and box size if needed
 
   if (dist_check) {
     atomKK->sync(ExecutionSpaceFromDevice<DeviceType>::space,X_MASK);
     x = atomKK->k_x;
-    int nlocal = atom->nlocal;
     if (includegroup) nlocal = atom->nfirst;
     int maxhold_kokkos = xhold.view<DeviceType>().dimension_0();
     if (atom->nmax > maxhold || maxhold_kokkos < maxhold) {
@@ -471,54 +282,33 @@ void NeighborKokkos::build_kokkos(int topoflag)
     }
   }
 
-  // if any lists store neighbors of ghosts:
-  //   invoke grow() if nlocal+nghost exceeds previous list size
-  // else only invoke grow() if nlocal exceeds previous list size
-  // only for lists with growflag set and which are perpetual (glist)
-
-  if (anyghostlist && atom->nmax > maxatom) {
-    maxatom = atom->nmax;
-    for (i = 0; i < nglist; i++)
-      if (lists[glist[i]]) lists[glist[i]]->grow(maxatom);
-      else init_list_grow_kokkos(glist[i]);
-  } else if (atom->nmax > maxatom) {
-    maxatom = atom->nmax;
-    for (i = 0; i < nglist; i++)
-      if (lists[glist[i]]) lists[glist[i]]->grow(maxatom);
-      else init_list_grow_kokkos(glist[i]);
-  }
-
-  // extend atom bin list if necessary
+  // bin atoms for all NBin instances
+  // not just NBin associated with perpetual lists
+  // b/c cannot wait to bin occasional lists in build_one() call
+  // if bin then, atoms may have moved outside of proc domain & bin extent,
+  //   leading to errors or even a crash
 
-  if (style != NSQ && atom->nmax > maxbin) {
-    maxbin = atom->nmax;
-    memory->destroy(bins);
-    memory->create(bins,maxbin,"bins");
+  if (style != NSQ) {
+    for (int i = 0; i < nbin; i++) {
+      neigh_bin[i]->bin_atoms_setup(nall);
+      neigh_bin[i]->bin_atoms();
+    }
   }
 
-  // check that using special bond flags will not overflow neigh lists
-
-  if (atom->nlocal+atom->nghost > NEIGHMASK)
-    error->one(FLERR,"Too many local+ghost atoms for neighbor list");
-
-  // invoke building of pair and molecular topology neighbor lists
-  // only for pairwise lists with buildflag set
-  // blist is for standard neigh lists, otherwise is a Kokkos list
+  // build pairwise lists for all perpetual NPair/NeighList
+  // grow() with nlocal/nall args so that only realloc if have to
 
-  for (i = 0; i < nblist; i++) {
-    if (lists[blist[i]]) {
-      atomKK->sync(Host,ALL_MASK);
-      (this->*pair_build[blist[i]])(lists[blist[i]]);
-    } else {
-      if (lists_host[blist[i]])
-        (this->*pair_build_host[blist[i]])(lists_host[blist[i]]);
-      else if (lists_device[blist[i]])
-        (this->*pair_build_device[blist[i]])(lists_device[blist[i]]);
-    }
+  atomKK->sync(Host,ALL_MASK);
+  for (i = 0; i < npair_perpetual; i++) {
+    m = plist[i];
+    lists[m]->grow(nlocal,nall);
+    neigh_pair[m]->build_setup();
+    neigh_pair[m]->build(lists[m]);
   }
 
-  if (atom->molecular && topoflag)
-    build_topology_kokkos();
+  // build topology lists for bonds/angles/etc
+
+  if (atom->molecular && topoflag) build_topology();
 }
 
 template<class DeviceType>
@@ -532,26 +322,6 @@ void NeighborKokkos::operator()(TagNeighborXhold<DeviceType>, const int &i) cons
 
 /* ---------------------------------------------------------------------- */
 
-void NeighborKokkos::setup_bins_kokkos(int i)
-{
-  if (lists_host[slist[i]]) {
-    lists_host[slist[i]]->stencil_allocate(smax,style);
-    (this->*stencil_create[slist[i]])(lists_host[slist[i]],sx,sy,sz);
-  } else if (lists_device[slist[i]]) {
-    lists_device[slist[i]]->stencil_allocate(smax,style);
-    (this->*stencil_create[slist[i]])(lists_device[slist[i]],sx,sy,sz);
-  }
-
-  //if (i < nslist-1) return; // this won't work if a non-kokkos neighbor list is last
-
-  if (maxhead > k_bins.d_view.dimension_0()) {
-    k_bins = DAT::tdual_int_2d("Neighbor::d_bins",maxhead,atoms_per_bin);
-    k_bincount = DAT::tdual_int_1d("Neighbor::d_bincount",maxhead);
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
 void NeighborKokkos::modify_ex_type_grow_kokkos(){
   memory->grow_kokkos(k_ex1_type,ex1_type,maxex_type,"neigh:ex1_type");
   k_ex1_type.modify<LMPHostType>();
@@ -575,8 +345,8 @@ void NeighborKokkos::modify_mol_group_grow_kokkos(){
 
 /* ---------------------------------------------------------------------- */
 
-void NeighborKokkos::init_topology_kokkos() {
-  if (nlist_device) {
+void NeighborKokkos::init_topology() {
+  if (device_flag) {
     neighbond_device.init_topology_kk();
   } else {
     neighbond_host.init_topology_kk();
@@ -588,8 +358,8 @@ void NeighborKokkos::init_topology_kokkos() {
    normally built with pair lists, but USER-CUDA separates them
 ------------------------------------------------------------------------- */
 
-void NeighborKokkos::build_topology_kokkos() {
-  if (nlist_device) {
+void NeighborKokkos::build_topology() {
+  if (device_flag) {
     neighbond_device.build_topology_kk();
 
     k_bondlist = neighbond_device.k_bondlist;
@@ -606,38 +376,22 @@ void NeighborKokkos::build_topology_kokkos() {
     k_anglelist.modify<LMPDeviceType>();
     k_dihedrallist.modify<LMPDeviceType>();
     k_improperlist.modify<LMPDeviceType>();
-
-    // Transfer topology neighbor lists to Host for non-Kokkos styles
- 
-    if (force->bond && force->bond->execution_space == Host)
-      k_bondlist.sync<LMPHostType>();
-    if (force->angle && force->angle->execution_space == Host)
-      k_anglelist.sync<LMPHostType>();
-    if (force->dihedral && force->dihedral->execution_space == Host)
-      k_dihedrallist.sync<LMPHostType>();
-    if (force->improper && force->improper->execution_space == Host)
-      k_improperlist.sync<LMPHostType>();
-
-   } else {
+  } else {
     neighbond_host.build_topology_kk();
-
+  
     k_bondlist = neighbond_host.k_bondlist;
     k_anglelist = neighbond_host.k_anglelist;
     k_dihedrallist = neighbond_host.k_dihedrallist;
     k_improperlist = neighbond_host.k_improperlist;
-
+  
     k_bondlist.sync<LMPHostType>();
     k_anglelist.sync<LMPHostType>();
     k_dihedrallist.sync<LMPHostType>();
     k_improperlist.sync<LMPHostType>();
-
+  
     k_bondlist.modify<LMPHostType>();
     k_anglelist.modify<LMPHostType>();
     k_dihedrallist.modify<LMPHostType>();
     k_improperlist.modify<LMPHostType>();
   }
 }
-
-// include to trigger instantiation of templated functions
-
-#include "neigh_full_kokkos.h"
diff --git a/src/KOKKOS/neighbor_kokkos.h b/src/KOKKOS/neighbor_kokkos.h
index 8c097139a76afa1d9164ff7aaba40aa1601610ef..244de19dcecbfe9415c1ffb6dfd97b5a1f66b118 100644
--- a/src/KOKKOS/neighbor_kokkos.h
+++ b/src/KOKKOS/neighbor_kokkos.h
@@ -22,316 +22,6 @@
 
 namespace LAMMPS_NS {
 
-template<class Device>
-class NeighborKokkosExecute
-{
-  typedef ArrayTypes<Device> AT;
-
- public:
-  NeighListKokkos<Device> neigh_list;
-  const typename AT::t_xfloat_2d_randomread cutneighsq;
-  const typename AT::t_int_1d bincount;
-  const typename AT::t_int_1d_const c_bincount;
-  typename AT::t_int_2d bins;
-  typename AT::t_int_2d_const c_bins;
-  const typename AT::t_x_array_randomread x;
-  const typename AT::t_int_1d_const type,mask,molecule;
-
-  const typename AT::t_tagint_1d_const tag;
-  const typename AT::t_tagint_2d_const special;
-  const typename AT::t_int_2d_const nspecial;
-  const int molecular;
-  int moltemplate;
-
-  int special_flag[4];
-
-  const int nbinx,nbiny,nbinz;
-  const int mbinx,mbiny,mbinz;
-  const int mbinxlo,mbinylo,mbinzlo;
-  const X_FLOAT bininvx,bininvy,bininvz;
-  X_FLOAT bboxhi[3],bboxlo[3];
-
-  const int nlocal;
-
-  const int exclude;
-
-  const int nex_type;
-  const int maxex_type;
-  const typename AT::t_int_1d_const ex1_type,ex2_type;
-  const typename AT::t_int_2d_const ex_type;
-
-  const int nex_group;
-  const int maxex_group;
-  const typename AT::t_int_1d_const ex1_group,ex2_group;
-  const typename AT::t_int_1d_const ex1_bit,ex2_bit;
-
-  const int nex_mol;
-  const int maxex_mol;
-  const typename AT::t_int_1d_const ex_mol_group;
-  const typename AT::t_int_1d_const ex_mol_bit;
-
-  typename AT::t_int_scalar resize;
-  typename AT::t_int_scalar new_maxneighs;
-  typename ArrayTypes<LMPHostType>::t_int_scalar h_resize;
-  typename ArrayTypes<LMPHostType>::t_int_scalar h_new_maxneighs;
-
-  const int xperiodic, yperiodic, zperiodic;
-  const int xprd_half, yprd_half, zprd_half;
-
-  NeighborKokkosExecute(
-                        const NeighListKokkos<Device> &_neigh_list,
-                        const typename AT::t_xfloat_2d_randomread &_cutneighsq,
-                        const typename AT::t_int_1d &_bincount,
-                        const typename AT::t_int_2d &_bins,
-                        const int _nlocal,
-                        const typename AT::t_x_array_randomread &_x,
-                        const typename AT::t_int_1d_const &_type,
-                        const typename AT::t_int_1d_const &_mask,
-                        const typename AT::t_int_1d_const &_molecule,
-                        const typename AT::t_tagint_1d_const &_tag,
-                        const typename AT::t_tagint_2d_const &_special,
-                        const typename AT::t_int_2d_const &_nspecial,
-                        const int &_molecular,
-                        const int & _nbinx,const int & _nbiny,const int & _nbinz,
-                        const int & _mbinx,const int & _mbiny,const int & _mbinz,
-                        const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo,
-                        const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz,
-                        const int & _exclude,const int & _nex_type,const int & _maxex_type,
-                        const typename AT::t_int_1d_const & _ex1_type,
-                        const typename AT::t_int_1d_const & _ex2_type,
-                        const typename AT::t_int_2d_const & _ex_type,
-                        const int & _nex_group,const int & _maxex_group,
-                        const typename AT::t_int_1d_const & _ex1_group,
-                        const typename AT::t_int_1d_const & _ex2_group,
-                        const typename AT::t_int_1d_const & _ex1_bit,
-                        const typename AT::t_int_1d_const & _ex2_bit,
-                        const int & _nex_mol,const int & _maxex_mol,
-                        const typename AT::t_int_1d_const & _ex_mol_group,
-                        const typename AT::t_int_1d_const & _ex_mol_bit,
-                        const X_FLOAT *_bboxhi, const X_FLOAT* _bboxlo,
-                        const int & _xperiodic, const int & _yperiodic, const int & _zperiodic,
-                        const int & _xprd_half, const int & _yprd_half, const int & _zprd_half):
-    neigh_list(_neigh_list), cutneighsq(_cutneighsq),
-    bincount(_bincount),c_bincount(_bincount),bins(_bins),c_bins(_bins),
-    nlocal(_nlocal),
-    x(_x),type(_type),mask(_mask),molecule(_molecule),
-    tag(_tag),special(_special),nspecial(_nspecial),molecular(_molecular),
-    nbinx(_nbinx),nbiny(_nbiny),nbinz(_nbinz),
-    mbinx(_mbinx),mbiny(_mbiny),mbinz(_mbinz),
-    mbinxlo(_mbinxlo),mbinylo(_mbinylo),mbinzlo(_mbinzlo),
-    bininvx(_bininvx),bininvy(_bininvy),bininvz(_bininvz),
-    exclude(_exclude),nex_type(_nex_type),maxex_type(_maxex_type),
-    ex1_type(_ex1_type),ex2_type(_ex2_type),ex_type(_ex_type),
-    nex_group(_nex_group),maxex_group(_maxex_group),
-    ex1_group(_ex1_group),ex2_group(_ex2_group),
-    ex1_bit(_ex1_bit),ex2_bit(_ex2_bit),nex_mol(_nex_mol),maxex_mol(_maxex_mol),
-    ex_mol_group(_ex_mol_group),ex_mol_bit(_ex_mol_bit),
-    xperiodic(_xperiodic),yperiodic(_yperiodic),zperiodic(_zperiodic),
-    xprd_half(_xprd_half),yprd_half(_yprd_half),zprd_half(_zprd_half){
-
-    if (molecular == 2) moltemplate = 1;
-    else moltemplate = 0;
-
-    bboxlo[0] = _bboxlo[0]; bboxlo[1] = _bboxlo[1]; bboxlo[2] = _bboxlo[2];
-    bboxhi[0] = _bboxhi[0]; bboxhi[1] = _bboxhi[1]; bboxhi[2] = _bboxhi[2];
-
-    resize = typename AT::t_int_scalar("NeighborKokkosFunctor::resize");
-#ifndef KOKKOS_USE_CUDA_UVM
-    h_resize = Kokkos::create_mirror_view(resize);
-#else
-    h_resize = resize;
-#endif
-    h_resize() = 1;
-    new_maxneighs = typename AT::
-      t_int_scalar("NeighborKokkosFunctor::new_maxneighs");
-#ifndef KOKKOS_USE_CUDA_UVM
-    h_new_maxneighs = Kokkos::create_mirror_view(new_maxneighs);
-#else
-    h_new_maxneighs = new_maxneighs;
-#endif
-    h_new_maxneighs() = neigh_list.maxneighs;
-  };
-
-  ~NeighborKokkosExecute() {neigh_list.clean_copy();};
-
-  template<int HalfNeigh, int GhostNewton>
-  KOKKOS_FUNCTION
-  void build_Item(const int &i) const;
-
-  template<int HalfNeigh>
-  KOKKOS_FUNCTION
-  void build_Item_Ghost(const int &i) const;
-
-  template<int ClusterSize>
-  KOKKOS_FUNCTION
-  void build_cluster_Item(const int &i) const;
-
-#ifdef KOKKOS_HAVE_CUDA
-  template<int HalfNeigh, int GhostNewton>
-  __device__ inline
-  void build_ItemCuda(typename Kokkos::TeamPolicy<Device>::member_type dev) const;
-#endif
-
-  KOKKOS_INLINE_FUNCTION
-  void binatomsItem(const int &i) const;
-
-  KOKKOS_INLINE_FUNCTION
-  int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z) const
-  {
-    int ix,iy,iz;
-
-    if (x >= bboxhi[0])
-      ix = static_cast<int> ((x-bboxhi[0])*bininvx) + nbinx;
-    else if (x >= bboxlo[0]) {
-      ix = static_cast<int> ((x-bboxlo[0])*bininvx);
-      ix = MIN(ix,nbinx-1);
-    } else
-      ix = static_cast<int> ((x-bboxlo[0])*bininvx) - 1;
-
-    if (y >= bboxhi[1])
-      iy = static_cast<int> ((y-bboxhi[1])*bininvy) + nbiny;
-    else if (y >= bboxlo[1]) {
-      iy = static_cast<int> ((y-bboxlo[1])*bininvy);
-      iy = MIN(iy,nbiny-1);
-    } else
-      iy = static_cast<int> ((y-bboxlo[1])*bininvy) - 1;
-
-    if (z >= bboxhi[2])
-      iz = static_cast<int> ((z-bboxhi[2])*bininvz) + nbinz;
-    else if (z >= bboxlo[2]) {
-      iz = static_cast<int> ((z-bboxlo[2])*bininvz);
-      iz = MIN(iz,nbinz-1);
-    } else
-      iz = static_cast<int> ((z-bboxlo[2])*bininvz) - 1;
-
-    return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
-  }
-
-  KOKKOS_INLINE_FUNCTION
-  int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const
-  {
-    int ix,iy,iz;
-
-    if (x >= bboxhi[0])
-      ix = static_cast<int> ((x-bboxhi[0])*bininvx) + nbinx;
-    else if (x >= bboxlo[0]) {
-      ix = static_cast<int> ((x-bboxlo[0])*bininvx);
-      ix = MIN(ix,nbinx-1);
-    } else
-      ix = static_cast<int> ((x-bboxlo[0])*bininvx) - 1;
-
-    if (y >= bboxhi[1])
-      iy = static_cast<int> ((y-bboxhi[1])*bininvy) + nbiny;
-    else if (y >= bboxlo[1]) {
-      iy = static_cast<int> ((y-bboxlo[1])*bininvy);
-      iy = MIN(iy,nbiny-1);
-    } else
-      iy = static_cast<int> ((y-bboxlo[1])*bininvy) - 1;
-
-    if (z >= bboxhi[2])
-      iz = static_cast<int> ((z-bboxhi[2])*bininvz) + nbinz;
-    else if (z >= bboxlo[2]) {
-      iz = static_cast<int> ((z-bboxlo[2])*bininvz);
-      iz = MIN(iz,nbinz-1);
-    } else
-      iz = static_cast<int> ((z-bboxlo[2])*bininvz) - 1;
-
-    i[0] = ix - mbinxlo;
-    i[1] = iy - mbinylo;
-    i[2] = iz - mbinzlo;
-
-    return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
-  }
-
-  KOKKOS_INLINE_FUNCTION
-  int exclusion(const int &i,const int &j, const int &itype,const int &jtype) const;
-
-  KOKKOS_INLINE_FUNCTION
-  int find_special(const int &i, const int &j) const;
-
-  KOKKOS_INLINE_FUNCTION
-  int minimum_image_check(double dx, double dy, double dz) const {
-    if (xperiodic && fabs(dx) > xprd_half) return 1;
-    if (yperiodic && fabs(dy) > yprd_half) return 1;
-    if (zperiodic && fabs(dz) > zprd_half) return 1;
-    return 0;
-  }
-
-};
-
-template<class Device>
-struct NeighborKokkosBinAtomsFunctor {
-  typedef Device device_type;
-
-  const NeighborKokkosExecute<Device> c;
-
-  NeighborKokkosBinAtomsFunctor(const NeighborKokkosExecute<Device> &_c):
-    c(_c) {};
-  ~NeighborKokkosBinAtomsFunctor() {}
-  KOKKOS_INLINE_FUNCTION
-  void operator() (const int & i) const {
-    c.binatomsItem(i);
-  }
-};
-
-template<class Device,int HALF_NEIGH,int GHOST_NEWTON>
-struct NeighborKokkosBuildFunctor {
-  typedef Device device_type;
-
-  const NeighborKokkosExecute<Device> c;
-  const size_t sharedsize;
-
-  NeighborKokkosBuildFunctor(const NeighborKokkosExecute<Device> &_c,
-                             const size_t _sharedsize):c(_c),
-                             sharedsize(_sharedsize) {};
-
-  KOKKOS_INLINE_FUNCTION
-  void operator() (const int & i) const {
-    c.template build_Item<HALF_NEIGH,GHOST_NEWTON>(i);
-  }
-#ifdef KOKKOS_HAVE_CUDA
-  KOKKOS_INLINE_FUNCTION
-  void operator() (typename Kokkos::TeamPolicy<Device>::member_type dev) const {
-    c.template build_ItemCuda<HALF_NEIGH,GHOST_NEWTON>(dev);
-  }
-  size_t shmem_size(const int team_size) const { (void) team_size; return sharedsize; }
-#endif
-};
-
-template<class Device,int HALF_NEIGH>
-struct NeighborKokkosBuildFunctorGhost {
-  typedef Device device_type;
-
-  const NeighborKokkosExecute<Device> c;
-  const size_t sharedsize;
-
-  NeighborKokkosBuildFunctorGhost(const NeighborKokkosExecute<Device> &_c,
-                             const size_t _sharedsize):c(_c),
-                             sharedsize(_sharedsize) {};
-
-  KOKKOS_INLINE_FUNCTION
-  void operator() (const int & i) const {
-    c.template build_Item_Ghost<HALF_NEIGH>(i);
-  }
-};
-
-template<class Device,int ClusterSize>
-struct NeighborClusterKokkosBuildFunctor {
-  typedef Device device_type;
-
-  const NeighborKokkosExecute<Device> c;
-  const size_t sharedsize;
-
-  NeighborClusterKokkosBuildFunctor(const NeighborKokkosExecute<Device> &_c,
-                             const size_t _sharedsize):c(_c),
-                             sharedsize(_sharedsize) {};
-
-  KOKKOS_INLINE_FUNCTION
-  void operator() (const int & i) const {
-    c.template build_cluster_Item<ClusterSize>(i);
-  }
-};
-
 template<class DeviceType>
 struct TagNeighborCheckDistance{};
 
@@ -342,24 +32,11 @@ class NeighborKokkos : public Neighbor {
  public:
   typedef int value_type;
 
-
-
-  int nlist_host;                       // pairwise neighbor lists on Host
-  NeighListKokkos<LMPHostType> **lists_host;
-  int nlist_device;                     // pairwise neighbor lists on Device
-  NeighListKokkos<LMPDeviceType> **lists_device;
-
-  NeighBondKokkos<LMPHostType> neighbond_host;
-  NeighBondKokkos<LMPDeviceType> neighbond_device;
-
-  DAT::tdual_int_2d k_bondlist;
-  DAT::tdual_int_2d k_anglelist;
-  DAT::tdual_int_2d k_dihedrallist;
-  DAT::tdual_int_2d k_improperlist;
-
   NeighborKokkos(class LAMMPS *);
   ~NeighborKokkos();
   void init();
+  void init_topology();
+  void build_topology();
 
   template<class DeviceType>
   KOKKOS_INLINE_FUNCTION
@@ -369,11 +46,7 @@ class NeighborKokkos : public Neighbor {
   KOKKOS_INLINE_FUNCTION
   void operator()(TagNeighborXhold<DeviceType>, const int&) const;
 
- private:
-  int atoms_per_bin;
   DAT::tdual_xfloat_2d k_cutneighsq;
-  DAT::tdual_int_1d k_bincount;
-  DAT::tdual_int_2d k_bins;
 
   DAT::tdual_int_1d k_ex1_type,k_ex2_type;
   DAT::tdual_int_2d k_ex_type;
@@ -382,6 +55,16 @@ class NeighborKokkos : public Neighbor {
   DAT::tdual_int_1d k_ex_mol_group;
   DAT::tdual_int_1d k_ex_mol_bit;
 
+  NeighBondKokkos<LMPHostType> neighbond_host;
+  NeighBondKokkos<LMPDeviceType> neighbond_device;
+
+  DAT::tdual_int_2d k_bondlist;
+  DAT::tdual_int_2d k_anglelist;
+  DAT::tdual_int_2d k_dihedrallist;
+  DAT::tdual_int_2d k_improperlist;
+
+ private:
+
   DAT::tdual_x_array x;
   DAT::tdual_x_array xhold;
 
@@ -389,14 +72,10 @@ class NeighborKokkos : public Neighbor {
   int device_flag;
 
   void init_cutneighsq_kokkos(int);
-  int init_lists_kokkos();
-  void init_list_flags1_kokkos(int);
-  void init_list_flags2_kokkos(int);
-  void init_list_grow_kokkos(int);
+  void create_kokkos_list(int);
   void init_ex_type_kokkos(int);
   void init_ex_bit_kokkos();
   void init_ex_mol_bit_kokkos();
-  void choose_build(int, NeighRequest *);
   virtual int check_distance();
   template<class DeviceType> int check_distance_kokkos();
   virtual void build(int);
@@ -405,27 +84,6 @@ class NeighborKokkos : public Neighbor {
   void modify_ex_type_grow_kokkos();
   void modify_ex_group_grow_kokkos();
   void modify_mol_group_grow_kokkos();
-  void init_topology_kokkos();
-  void build_topology_kokkos();
-
-  typedef void (NeighborKokkos::*PairPtrHost)
-    (class NeighListKokkos<LMPHostType> *);
-  PairPtrHost *pair_build_host;
-  typedef void (NeighborKokkos::*PairPtrDevice)
-    (class NeighListKokkos<LMPDeviceType> *);
-  PairPtrDevice *pair_build_device;
-
-  template<class DeviceType,int HALF_NEIGH, int GHOST>
-  void full_bin_kokkos(NeighListKokkos<DeviceType> *list);
-  template<class DeviceType>
-  void full_bin_cluster_kokkos(NeighListKokkos<DeviceType> *list);
-
-  typedef void (NeighborKokkos::*StencilPtrHost)
-    (class NeighListKokkos<LMPHostType> *, int, int, int);
-  StencilPtrHost *stencil_create_host;
-  typedef void (NeighborKokkos::*StencilPtrDevice)
-    (class NeighListKokkos<LMPDeviceType> *, int, int, int);
-  StencilPtrDevice *stencil_create_device;
 };
 
 }
diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f9873044520e00627d177bbe05ae1fe59c1bc3c4
--- /dev/null
+++ b/src/KOKKOS/npair_kokkos.cpp
@@ -0,0 +1,746 @@
+/* -*- 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.
+------------------------------------------------------------------------- */
+
+#include "npair_kokkos.h"
+#include "atom_kokkos.h"
+#include "atom_masks.h"
+#include "domain_kokkos.h"
+#include "neighbor_kokkos.h"
+#include "nbin_kokkos.h"
+#include "nstencil.h"
+#include "force.h"
+
+namespace LAMMPS_NS {
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType, int HALF_NEIGH, int GHOST>
+NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::NPairKokkos(LAMMPS *lmp) : NPair(lmp) {
+
+}
+
+/* ----------------------------------------------------------------------
+   copy needed info from Neighbor class to this build class
+   ------------------------------------------------------------------------- */
+
+template<class DeviceType, int HALF_NEIGH, int GHOST>
+void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::copy_neighbor_info()
+{
+  NPair::copy_neighbor_info();
+
+  NeighborKokkos* neighborKK = (NeighborKokkos*) neighbor;
+
+  // general params
+
+  newton_pair = force->newton_pair;
+  k_cutneighsq = neighborKK->k_cutneighsq;
+
+  // exclusion info
+
+  k_ex1_type = neighborKK->k_ex1_type;
+  k_ex2_type = neighborKK->k_ex2_type;
+  k_ex_type = neighborKK->k_ex_type;
+  k_ex1_group = neighborKK->k_ex1_group;
+  k_ex2_group = neighborKK->k_ex1_group;
+  k_ex1_bit = neighborKK->k_ex1_group;
+  k_ex2_bit = neighborKK->k_ex1_group;
+  k_ex_mol_group = neighborKK->k_ex_mol_group;
+  k_ex_mol_bit = neighborKK->k_ex_mol_bit;
+}
+
+/* ----------------------------------------------------------------------
+ copy per-atom and per-bin vectors from NBin class to this build class
+ ------------------------------------------------------------------------- */
+
+template<class DeviceType, int HALF_NEIGH, int GHOST>
+void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::copy_bin_info()
+{
+  NPair::copy_bin_info();
+
+  NBinKokkos<DeviceType>* nbKK = (NBinKokkos<DeviceType>*) nb;
+
+  atoms_per_bin = nbKK->atoms_per_bin;
+  k_bincount = nbKK->k_bincount;
+  k_bins = nbKK->k_bins;
+}
+
+/* ----------------------------------------------------------------------
+ copy needed info from NStencil class to this build class
+ ------------------------------------------------------------------------- */
+
+template<class DeviceType, int HALF_NEIGH, int GHOST>
+void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::copy_stencil_info()
+{
+  NPair::copy_stencil_info();
+
+  nstencil = ns->nstencil;
+
+  int maxstencil = ns->get_maxstencil();
+
+  k_stencil = DAT::tdual_int_1d("neighlist:stencil",maxstencil);
+  for (int k = 0; k < maxstencil; k++)
+    k_stencil.h_view(k) = ns->stencil[k];
+    k_stencil.modify<LMPHostType>();
+    k_stencil.sync<DeviceType>();
+  if (GHOST) {
+    k_stencilxyz = DAT::tdual_int_1d_3("neighlist:stencilxyz",maxstencil);
+    for (int k = 0; k < maxstencil; k++) {
+      k_stencilxyz.h_view(k,0) = ns->stencilxyz[k][0];
+      k_stencilxyz.h_view(k,1) = ns->stencilxyz[k][1];
+      k_stencilxyz.h_view(k,2) = ns->stencilxyz[k][2];
+    }
+    k_stencilxyz.modify<LMPHostType>();
+    k_stencilxyz.sync<DeviceType>();
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType, int HALF_NEIGH, int GHOST>
+void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::build(NeighList *list_)
+{
+  NeighListKokkos<DeviceType>* list = (NeighListKokkos<DeviceType>*) list_;
+  const int nlocal = includegroup?atom->nfirst:atom->nlocal;
+  int nall = nlocal;
+  if (GHOST)
+    nall += atom->nghost;
+  list->grow(nall);
+
+  NeighborKokkosExecute<DeviceType>
+    data(*list,
+         k_cutneighsq.view<DeviceType>(),
+         k_bincount.view<DeviceType>(),
+         k_bins.view<DeviceType>(),
+         nstencil,
+         k_stencil.view<DeviceType>(),
+         k_stencilxyz.view<DeviceType>(),
+         nlocal,
+         atomKK->k_x.view<DeviceType>(),
+         atomKK->k_type.view<DeviceType>(),
+         atomKK->k_mask.view<DeviceType>(),
+         atomKK->k_molecule.view<DeviceType>(),
+         atomKK->k_tag.view<DeviceType>(),
+         atomKK->k_special.view<DeviceType>(),
+         atomKK->k_nspecial.view<DeviceType>(),
+         atomKK->molecular,
+         nbinx,nbiny,nbinz,mbinx,mbiny,mbinz,mbinxlo,mbinylo,mbinzlo,
+         bininvx,bininvy,bininvz,
+         exclude, nex_type,maxex_type,
+         k_ex1_type.view<DeviceType>(),
+         k_ex2_type.view<DeviceType>(),
+         k_ex_type.view<DeviceType>(),
+         nex_group,maxex_group,
+         k_ex1_group.view<DeviceType>(),
+         k_ex2_group.view<DeviceType>(),
+         k_ex1_bit.view<DeviceType>(),
+         k_ex2_bit.view<DeviceType>(),
+         nex_mol, maxex_mol,
+         k_ex_mol_group.view<DeviceType>(),
+         k_ex_mol_bit.view<DeviceType>(),
+         bboxhi,bboxlo,
+         domain->xperiodic,domain->yperiodic,domain->zperiodic,
+         domain->xprd_half,domain->yprd_half,domain->zprd_half);
+
+  k_cutneighsq.sync<DeviceType>();
+  k_ex1_type.sync<DeviceType>();
+  k_ex2_type.sync<DeviceType>();
+  k_ex_type.sync<DeviceType>();
+  k_ex1_group.sync<DeviceType>();
+  k_ex2_group.sync<DeviceType>();
+  k_ex1_bit.sync<DeviceType>();
+  k_ex2_bit.sync<DeviceType>();
+  k_ex_mol_group.sync<DeviceType>();
+  k_ex_mol_bit.sync<DeviceType>();
+  atomKK->sync(Device,X_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK);
+
+  data.special_flag[0] = special_flag[0];
+  data.special_flag[1] = special_flag[1];
+  data.special_flag[2] = special_flag[2];
+  data.special_flag[3] = special_flag[3];
+
+  if(list->d_neighbors.dimension_0()<nall) {
+    list->d_neighbors = typename ArrayTypes<DeviceType>::t_neighbors_2d("neighbors", nall*1.1, list->maxneighs);
+    list->d_numneigh = typename ArrayTypes<DeviceType>::t_int_1d("numneigh", nall*1.1);
+    data.neigh_list.d_neighbors = list->d_neighbors;
+    data.neigh_list.d_numneigh = list->d_numneigh;
+  }
+  data.h_resize()=1;
+  while(data.h_resize()) {
+    data.h_new_maxneighs() = list->maxneighs;
+  data.h_resize() = 0;
+
+  Kokkos::deep_copy(data.resize, data.h_resize);
+  Kokkos::deep_copy(data.new_maxneighs, data.h_new_maxneighs);
+#ifdef KOKKOS_HAVE_CUDA
+    #define BINS_PER_BLOCK 2
+    const int factor = atoms_per_bin<64?2:1;
+    Kokkos::TeamPolicy<DeviceType> config((mbins+factor-1)/factor,atoms_per_bin*factor);
+#else
+    const int factor = 1;
+#endif
+
+if (GHOST) {
+  NPairKokkosBuildFunctorGhost<DeviceType,HALF_NEIGH> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
+  Kokkos::parallel_for(nall, f);
+} else {
+  if (newton_pair) {
+    NPairKokkosBuildFunctor<DeviceType,HALF_NEIGH,1> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
+#ifdef KOKKOS_HAVE_CUDA
+    Kokkos::parallel_for(config, f);
+#else
+    Kokkos::parallel_for(nall, f);
+#endif
+  } else {
+    NPairKokkosBuildFunctor<DeviceType,HALF_NEIGH,0> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
+#ifdef KOKKOS_HAVE_CUDA
+    Kokkos::parallel_for(config, f);
+#else
+    Kokkos::parallel_for(nall, f);
+#endif
+  }
+}
+  DeviceType::fence();
+    deep_copy(data.h_resize, data.resize);
+
+    if(data.h_resize()) {
+      deep_copy(data.h_new_maxneighs, data.new_maxneighs);
+      list->maxneighs = data.h_new_maxneighs() * 1.2;
+      list->d_neighbors = typename ArrayTypes<DeviceType>::t_neighbors_2d("neighbors", list->d_neighbors.dimension_0(), list->maxneighs);
+      data.neigh_list.d_neighbors = list->d_neighbors;
+      data.neigh_list.maxneighs = list->maxneighs;
+    }
+  }
+
+  if (GHOST) {
+    list->inum = atom->nlocal;
+    list->gnum = nall - atom->nlocal;
+  } else {
+    list->inum = nall;
+    list->gnum = 0;
+  }
+
+  list->k_ilist.template modify<DeviceType>();
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+KOKKOS_INLINE_FUNCTION
+int NeighborKokkosExecute<DeviceType>::find_special(const int &i, const int &j) const
+{
+  const int n1 = nspecial(i,0);
+  const int n2 = nspecial(i,1);
+  const int n3 = nspecial(i,2);
+
+  for (int k = 0; k < n3; k++) {
+    if (special(i,k) == tag(j)) {
+      if (k < n1) {
+        if (special_flag[1] == 0) return -1;
+        else if (special_flag[1] == 1) return 0;
+        else return 1;
+      } else if (k < n2) {
+        if (special_flag[2] == 0) return -1;
+        else if (special_flag[2] == 1) return 0;
+        else return 2;
+      } else {
+        if (special_flag[3] == 0) return -1;
+        else if (special_flag[3] == 1) return 0;
+        else return 3;
+      }
+    }
+  }
+  return 0;
+};
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>
+KOKKOS_INLINE_FUNCTION
+int NeighborKokkosExecute<DeviceType>::exclusion(const int &i,const int &j,
+                                             const int &itype,const int &jtype) const
+{
+  int m;
+
+  if (nex_type && ex_type(itype,jtype)) return 1;
+
+  if (nex_group) {
+    for (m = 0; m < nex_group; m++) {
+      if (mask(i) & ex1_bit(m) && mask(j) & ex2_bit(m)) return 1;
+      if (mask(i) & ex2_bit(m) && mask(j) & ex1_bit(m)) return 1;
+    }
+  }
+
+  if (nex_mol) {
+    for (m = 0; m < nex_mol; m++)
+      if (mask(i) & ex_mol_bit(m) && mask(j) & ex_mol_bit(m) &&
+          molecule(i) == molecule(j)) return 1;
+  }
+
+  return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType> template<int HalfNeigh,int Newton>
+void NeighborKokkosExecute<DeviceType>::
+   build_Item(const int &i) const
+{
+  /* if necessary, goto next page and add pages */
+  int n = 0;
+  int which = 0;
+  int moltemplate;
+  if (molecular == 2) moltemplate = 1;
+  else moltemplate = 0;
+  // get subview of neighbors of i
+
+  const AtomNeighbors neighbors_i = neigh_list.get_neighbors(i);
+  const X_FLOAT xtmp = x(i, 0);
+  const X_FLOAT ytmp = x(i, 1);
+  const X_FLOAT ztmp = x(i, 2);
+  const int itype = type(i);
+
+  const int ibin = coord2bin(xtmp, ytmp, ztmp);
+
+  const typename ArrayTypes<DeviceType>::t_int_1d_const_um stencil
+    = d_stencil;
+
+  // loop over all bins in neighborhood (includes ibin)
+  if(HalfNeigh)
+  for(int m = 0; m < c_bincount(ibin); m++) {
+    const int j = c_bins(ibin,m);
+    const int jtype = type(j);
+
+    //for same bin as atom i skip j if i==j and skip atoms "below and to the left" if using HalfNeighborlists
+    if((j == i) || (HalfNeigh && !Newton && (j < i))  ||
+        (HalfNeigh && Newton && ((j < i) || ((j >= nlocal) &&
+                                       ((x(j, 2) < ztmp) || (x(j, 2) == ztmp && x(j, 1) < ytmp) ||
+                                        (x(j, 2) == ztmp && x(j, 1)  == ytmp && x(j, 0) < xtmp)))))
+      ) continue;
+    if(exclude && exclusion(i,j,itype,jtype)) continue;
+
+    const X_FLOAT delx = xtmp - x(j, 0);
+    const X_FLOAT dely = ytmp - x(j, 1);
+    const X_FLOAT delz = ztmp - x(j, 2);
+    const X_FLOAT rsq = delx * delx + dely * dely + delz * delz;
+    if(rsq <= cutneighsq(itype,jtype)) {
+      if (molecular) {
+        if (!moltemplate)
+          which = find_special(i,j);
+            /* else if (imol >= 0) */
+            /*   which = find_special(onemols[imol]->special[iatom], */
+            /*                        onemols[imol]->nspecial[iatom], */
+            /*                        tag[j]-tagprev); */
+            /* else which = 0; */
+        if (which == 0){
+          if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+          else n++;
+        }else if (minimum_image_check(delx,dely,delz)){
+          if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+          else n++;
+        }
+        else if (which > 0) {
+          if(n<neigh_list.maxneighs) neighbors_i(n++) = j ^ (which << SBBITS);
+          else n++;
+        }
+      } else {
+        if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+        else n++;
+      }
+    }
+  }
+
+  for(int k = 0; k < nstencil; k++) {
+    const int jbin = ibin + stencil[k];
+
+    // get subview of jbin
+    if(HalfNeigh&&(ibin==jbin)) continue;
+    //const ArrayTypes<DeviceType>::t_int_1d_const_um =Kokkos::subview<t_int_1d_const_um>(bins,jbin,ALL);
+      for(int m = 0; m < c_bincount(jbin); m++) {
+
+        const int j = c_bins(jbin,m);
+        const int jtype = type(j);
+
+        if(HalfNeigh && !Newton && (j < i)) continue;
+        if(!HalfNeigh && j==i) continue;
+        if(exclude && exclusion(i,j,itype,jtype)) continue;
+
+        const X_FLOAT delx = xtmp - x(j, 0);
+        const X_FLOAT dely = ytmp - x(j, 1);
+        const X_FLOAT delz = ztmp - x(j, 2);
+        const X_FLOAT rsq = delx * delx + dely * dely + delz * delz;
+
+        if(rsq <= cutneighsq(itype,jtype)) {
+          if (molecular) {
+            if (!moltemplate)
+              which = NeighborKokkosExecute<DeviceType>::find_special(i,j);
+            /* else if (imol >= 0) */
+            /*   which = find_special(onemols[imol]->special[iatom], */
+            /*                        onemols[imol]->nspecial[iatom], */
+            /*                        tag[j]-tagprev); */
+            /* else which = 0; */
+            if (which == 0){
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+              else n++;
+            }else if (minimum_image_check(delx,dely,delz)){
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+              else n++;
+            }
+            else if (which > 0) {
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j ^ (which << SBBITS);
+              else n++;
+            }
+          } else {
+            if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+            else n++;
+          }
+        }
+
+      }
+  }
+
+  neigh_list.d_numneigh(i) = n;
+
+  if(n >= neigh_list.maxneighs) {
+    resize() = 1;
+
+    if(n >= new_maxneighs()) new_maxneighs() = n;
+  }
+  neigh_list.d_ilist(i) = i;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef KOKKOS_HAVE_CUDA
+extern __shared__ X_FLOAT sharedmem[];
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType> template<int HalfNeigh,int Newton>
+__device__ inline
+void NeighborKokkosExecute<DeviceType>::build_ItemCuda(typename Kokkos::TeamPolicy<DeviceType>::member_type dev) const
+{
+  /* loop over atoms in i's bin,
+  */
+  const int atoms_per_bin = c_bins.dimension_1();
+  const int BINS_PER_TEAM = dev.team_size()/atoms_per_bin<1?1:dev.team_size()/atoms_per_bin;
+  const int TEAMS_PER_BIN = atoms_per_bin/dev.team_size()<1?1:atoms_per_bin/dev.team_size();
+  const int MY_BIN = dev.team_rank()/atoms_per_bin;
+
+  const int ibin = dev.league_rank()*BINS_PER_TEAM+MY_BIN;
+
+  if(ibin >=c_bincount.dimension_0()) return;
+  X_FLOAT* other_x = sharedmem;
+  other_x = other_x + 5*atoms_per_bin*MY_BIN;
+
+  int* other_id = (int*) &other_x[4 * atoms_per_bin];
+
+  int bincount_current = c_bincount[ibin];
+
+  for(int kk = 0; kk < TEAMS_PER_BIN; kk++) {
+    const int MY_II = dev.team_rank()%atoms_per_bin+kk*dev.team_size();
+  const int i = MY_II < bincount_current ? c_bins(ibin, MY_II) : -1;
+  /* if necessary, goto next page and add pages */
+
+  int n = 0;
+
+  X_FLOAT xtmp;
+  X_FLOAT ytmp;
+  X_FLOAT ztmp;
+  int itype;
+  const AtomNeighbors neighbors_i = neigh_list.get_neighbors((i>=0&&i<nlocal)?i:0);
+
+  if(i >= 0) {
+    xtmp = x(i, 0);
+    ytmp = x(i, 1);
+    ztmp = x(i, 2);
+    itype = type(i);
+    other_x[MY_II] = xtmp;
+    other_x[MY_II + atoms_per_bin] = ytmp;
+    other_x[MY_II + 2 * atoms_per_bin] = ztmp;
+    other_x[MY_II + 3 * atoms_per_bin] = itype;
+  }
+  other_id[MY_II] = i;
+  int test = (__syncthreads_count(i >= 0 && i <= nlocal) == 0);
+
+  if(test) return;
+
+  if(i >= 0 && i < nlocal) {
+    #pragma unroll 4
+    for(int m = 0; m < bincount_current; m++) {
+      int j = other_id[m];
+      const int jtype = other_x[m + 3 * atoms_per_bin];
+
+      //for same bin as atom i skip j if i==j and skip atoms "below and to the left" if using halfneighborlists
+      if((j == i) ||
+         (HalfNeigh && !Newton && (j < i))  ||
+         (HalfNeigh && Newton &&
+            ((j < i) ||
+            ((j >= nlocal) && ((x(j, 2) < ztmp) || (x(j, 2) == ztmp && x(j, 1) < ytmp) ||
+              (x(j, 2) == ztmp && x(j, 1)  == ytmp && x(j, 0) < xtmp)))))
+        ) continue;
+      if(exclude && exclusion(i,j,itype,jtype)) continue;
+      const X_FLOAT delx = xtmp - other_x[m];
+      const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin];
+      const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin];
+      const X_FLOAT rsq = delx * delx + dely * dely + delz * delz;
+
+      if(rsq <= cutneighsq(itype,jtype)) {
+        if (molecular) {
+          int which = 0;
+          if (!moltemplate)
+            which = NeighborKokkosExecute<DeviceType>::find_special(i,j);
+          /* else if (imol >= 0) */
+          /*   which = find_special(onemols[imol]->special[iatom], */
+          /*                        onemols[imol]->nspecial[iatom], */
+          /*                        tag[j]-tagprev); */
+          /* else which = 0; */
+          if (which == 0){
+            if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+            else n++;
+          }else if (minimum_image_check(delx,dely,delz)){
+            if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+            else n++;
+          }
+          else if (which > 0) {
+            if(n<neigh_list.maxneighs) neighbors_i(n++) = j ^ (which << SBBITS);
+            else n++;
+          }
+        } else {
+          if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+          else n++;
+        }
+      }
+
+    }
+  }
+  __syncthreads();
+
+  const typename ArrayTypes<DeviceType>::t_int_1d_const_um stencil
+    = d_stencil;
+  for(int k = 0; k < nstencil; k++) {
+    const int jbin = ibin + stencil[k];
+
+    if(ibin == jbin) continue;
+
+    bincount_current = c_bincount[jbin];
+    int j = MY_II < bincount_current ? c_bins(jbin, MY_II) : -1;
+
+    if(j >= 0) {
+      other_x[MY_II] = x(j, 0);
+      other_x[MY_II + atoms_per_bin] = x(j, 1);
+      other_x[MY_II + 2 * atoms_per_bin] = x(j, 2);
+      other_x[MY_II + 3 * atoms_per_bin] = type(j);
+     }
+
+    other_id[MY_II] = j;
+
+    __syncthreads();
+
+    if(i >= 0 && i < nlocal) {
+      #pragma unroll 8
+      for(int m = 0; m < bincount_current; m++) {
+        const int j = other_id[m];
+        const int jtype = other_x[m + 3 * atoms_per_bin];
+
+        //if(HalfNeigh && (j < i))  continue;
+        if(HalfNeigh && !Newton && (j < i)) continue;
+        if(!HalfNeigh && j==i) continue;
+        if(exclude && exclusion(i,j,itype,jtype)) continue;
+
+        const X_FLOAT delx = xtmp - other_x[m];
+        const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin];
+        const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin];
+        const X_FLOAT rsq = delx * delx + dely * dely + delz * delz;
+
+        if(rsq <= cutneighsq(itype,jtype)) {
+          if (molecular) {
+            int which = 0;
+            if (!moltemplate)
+              which = NeighborKokkosExecute<DeviceType>::find_special(i,j);
+            /* else if (imol >= 0) */
+            /*   which = find_special(onemols[imol]->special[iatom], */
+            /*                        onemols[imol]->nspecial[iatom], */
+            /*                        tag[j]-tagprev); */
+            /* else which = 0; */
+            if (which == 0){
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+              else n++;
+            }else if (minimum_image_check(delx,dely,delz)){
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+              else n++;
+            }
+            else if (which > 0) {
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j ^ (which << SBBITS);
+              else n++;
+            }
+          } else {
+            if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+            else n++;
+          }
+        }
+
+      }
+    }
+    __syncthreads();
+  }
+
+  if(i >= 0 && i < nlocal) {
+    neigh_list.d_numneigh(i) = n;
+    neigh_list.d_ilist(i) = i;
+  }
+
+  if(n >= neigh_list.maxneighs) {
+    resize() = 1;
+
+    if(n >= new_maxneighs()) new_maxneighs() = n;
+  }
+  }
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+template<class DeviceType>  template<int HalfNeigh>
+void NeighborKokkosExecute<DeviceType>::
+   build_Item_Ghost(const int &i) const
+{
+  /* if necessary, goto next page and add pages */
+  int n = 0;
+  int which = 0;
+  int moltemplate;
+  if (molecular == 2) moltemplate = 1;
+  else moltemplate = 0;
+  // get subview of neighbors of i
+
+  const AtomNeighbors neighbors_i = neigh_list.get_neighbors(i);
+  const X_FLOAT xtmp = x(i, 0);
+  const X_FLOAT ytmp = x(i, 1);
+  const X_FLOAT ztmp = x(i, 2);
+  const int itype = type(i);
+
+  const typename ArrayTypes<DeviceType>::t_int_1d_const_um stencil
+    = d_stencil;
+  const typename ArrayTypes<DeviceType>::t_int_1d_3_const_um stencilxyz
+    = d_stencilxyz;
+
+  // loop over all atoms in surrounding bins in stencil including self
+  // when i is a ghost atom, must check if stencil bin is out of bounds
+  // skip i = j
+  // no molecular test when i = ghost atom
+
+  if (i < nlocal) {
+    const int ibin = coord2bin(xtmp, ytmp, ztmp);
+    for (int k = 0; k < nstencil; k++) {
+      const int jbin = ibin + stencil[k];
+      for(int m = 0; m < c_bincount(jbin); m++) {
+        const int j = c_bins(jbin,m);
+
+        if (HalfNeigh && j <= i) continue;
+        else if (j == i) continue;
+
+        const int jtype = type[j];
+        if(exclude && exclusion(i,j,itype,jtype)) continue;
+
+        const X_FLOAT delx = xtmp - x(j,0);
+        const X_FLOAT dely = ytmp - x(j,1);
+        const X_FLOAT delz = ztmp - x(j,2);
+        const X_FLOAT rsq = delx*delx + dely*dely + delz*delz;
+
+        if (rsq <= cutneighsq(itype,jtype)) {
+          if (molecular) {
+            if (!moltemplate)
+              which = find_special(i,j);
+            /* else if (imol >= 0) */
+            /*   which = find_special(onemols[imol]->special[iatom], */
+            /*                        onemols[imol]->nspecial[iatom], */
+            /*                        tag[j]-tagprev); */
+            /* else which = 0; */
+            if (which == 0){
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+              else n++;
+            }else if (minimum_image_check(delx,dely,delz)){
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+              else n++;
+            }
+            else if (which > 0) {
+              if(n<neigh_list.maxneighs) neighbors_i(n++) = j ^ (which << SBBITS);
+              else n++;
+            }
+          } else {
+            if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+            else n++;
+          }
+        }
+      }
+    }
+
+  } else {
+    int binxyz[3];
+    const int ibin = coord2bin(xtmp, ytmp, ztmp, binxyz);
+    const int xbin = binxyz[0];
+    const int ybin = binxyz[1];
+    const int zbin = binxyz[2];
+    for (int k = 0; k < nstencil; k++) {
+      const X_FLOAT xbin2 = xbin + stencilxyz(k,0);
+      const X_FLOAT ybin2 = ybin + stencilxyz(k,1);
+      const X_FLOAT zbin2 = zbin + stencilxyz(k,2);
+      if (xbin2 < 0 || xbin2 >= mbinx ||
+          ybin2 < 0 || ybin2 >= mbiny ||
+          zbin2 < 0 || zbin2 >= mbinz) continue;
+      const int jbin = ibin + stencil[k];
+      for(int m = 0; m < c_bincount(jbin); m++) {
+        const int j = c_bins(jbin,m);
+
+        if (HalfNeigh && j <= i) continue;
+        else if (j == i) continue;
+
+        const int jtype = type[j];
+        if(exclude && exclusion(i,j,itype,jtype)) continue;
+
+        const X_FLOAT delx = xtmp - x(j,0);
+        const X_FLOAT dely = ytmp - x(j,1);
+        const X_FLOAT delz = ztmp - x(j,2);
+        const X_FLOAT rsq = delx*delx + dely*dely + delz*delz;
+
+        if (rsq <= cutneighsq(itype,jtype)) {
+          if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
+          else n++;
+        }
+      }
+    }
+  }
+
+  neigh_list.d_numneigh(i) = n;
+
+  if(n >= neigh_list.maxneighs) {
+    resize() = 1;
+
+    if(n >= new_maxneighs()) new_maxneighs() = n;
+  }
+  neigh_list.d_ilist(i) = i;
+}
+
+}
+
+namespace LAMMPS_NS {
+template class NPairKokkos<LMPDeviceType,0,0>;
+template class NPairKokkos<LMPDeviceType,0,1>;
+template class NPairKokkos<LMPDeviceType,1,0>;
+template class NPairKokkos<LMPDeviceType,1,1>;
+#ifdef KOKKOS_HAVE_CUDA
+template class NPairKokkos<LMPHostType,0,0>;
+template class NPairKokkos<LMPHostType,0,1>;
+template class NPairKokkos<LMPHostType,1,0>;
+template class NPairKokkos<LMPHostType,1,1>;
+#endif
+}
diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h
new file mode 100644
index 0000000000000000000000000000000000000000..666508a22de083a5f76204c7a93ee962e4dcc51f
--- /dev/null
+++ b/src/KOKKOS/npair_kokkos.h
@@ -0,0 +1,435 @@
+/* -*- 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 NPAIR_CLASS
+
+typedef NPairKokkos<LMPHostType,0,0> NPairKokkosFullBinHost;
+NPairStyle(full/bin/kk/host,
+           NPairKokkosFullBinHost,
+           NP_FULL | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPDeviceType,0,0> NPairKokkosFullBinDevice;
+NPairStyle(full/bin/kk/device,
+           NPairKokkosFullBinDevice,
+           NP_FULL | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPHostType,0,1> NPairKokkosFullBinGhostHost;
+NPairStyle(full/bin/ghost/kk/host,
+           NPairKokkosFullBinGhostHost,
+           NP_FULL | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPDeviceType,0,1> NPairKokkosFullBinGhostDevice;
+NPairStyle(full/bin/ghost/kk/device,
+           NPairKokkosFullBinGhostDevice,
+           NP_FULL | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPHostType,1,0> NPairKokkosHalfBinHost;
+NPairStyle(half/bin/kk/host,
+           NPairKokkosHalfBinHost,
+           NP_HALF | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPDeviceType,1,0> NPairKokkosHalfBinDevice;
+NPairStyle(half/bin/kk/device,
+           NPairKokkosHalfBinDevice,
+           NP_HALF | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPHostType,1,1> NPairKokkosHalfBinGhostHost;
+NPairStyle(half/bin/ghost/kk/host,
+           NPairKokkosHalfBinGhostHost,
+           NP_HALF | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI)
+
+typedef NPairKokkos<LMPDeviceType,1,1> NPairKokkosHalfBinGhostDevice;
+NPairStyle(half/bin/ghost/kk/device,
+           NPairKokkosHalfBinGhostDevice,
+           NP_HALF | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI)
+
+#else
+
+#ifndef LMP_NPAIR_KOKKOS_H
+#define LMP_NPAIR_KOKKOS_H
+
+#include "npair.h"
+#include "neigh_list_kokkos.h"
+
+namespace LAMMPS_NS {
+
+template<class DeviceType, int HALF_NEIGH, int GHOST>
+class NPairKokkos : public NPair {
+ public:
+  NPairKokkos(class LAMMPS *);
+  ~NPairKokkos() {}
+  void copy_neighbor_info();
+  void copy_bin_info();
+  void copy_stencil_info();
+  void build(class NeighList *);
+
+ private:
+  int newton_pair;
+  int nex_type;
+  int maxex_type;
+
+  int nex_group;
+  int maxex_group;
+
+  int nex_mol;
+  int maxex_mol;
+
+  // data from Neighbor class
+
+  DAT::tdual_xfloat_2d k_cutneighsq;
+
+  // exclusion data from Neighbor class
+
+  DAT::tdual_int_1d k_ex1_type,k_ex2_type;
+  DAT::tdual_int_2d k_ex_type;
+  DAT::tdual_int_1d k_ex1_group,k_ex2_group;
+  DAT::tdual_int_1d k_ex1_bit,k_ex2_bit;
+  DAT::tdual_int_1d k_ex_mol_group;
+  DAT::tdual_int_1d k_ex_mol_bit;
+
+  // data from NBin class
+
+  int atoms_per_bin;
+  DAT::tdual_int_1d k_bincount;
+  DAT::tdual_int_2d k_bins;
+
+  // data from NStencil class
+
+  int nstencil;
+  DAT::tdual_int_1d k_stencil;  // # of J neighs for each I
+  DAT::tdual_int_1d_3 k_stencilxyz;
+};
+
+template<class DeviceType>
+class NeighborKokkosExecute
+{
+  typedef ArrayTypes<DeviceType> AT;
+
+ public:
+  NeighListKokkos<DeviceType> neigh_list;
+
+  // data from Neighbor class
+
+  const typename AT::t_xfloat_2d_randomread cutneighsq;
+
+  // exclusion data from Neighbor class
+
+  const int exclude;
+
+  const int nex_type;
+  const int maxex_type;
+  const typename AT::t_int_1d_const ex1_type,ex2_type;
+  const typename AT::t_int_2d_const ex_type;
+
+  const int nex_group;
+  const int maxex_group;
+  const typename AT::t_int_1d_const ex1_group,ex2_group;
+  const typename AT::t_int_1d_const ex1_bit,ex2_bit;
+
+  const int nex_mol;
+  const int maxex_mol;
+  const typename AT::t_int_1d_const ex_mol_group;
+  const typename AT::t_int_1d_const ex_mol_bit;
+
+  // data from NBin class
+
+  const typename AT::t_int_1d bincount;
+  const typename AT::t_int_1d_const c_bincount;
+  typename AT::t_int_2d bins;
+  typename AT::t_int_2d_const c_bins;
+
+
+  // data from NStencil class
+
+  int nstencil;
+  typename AT::t_int_1d d_stencil;  // # of J neighs for each I
+  typename AT::t_int_1d_3 d_stencilxyz;
+
+  // data from Atom class
+
+  const typename AT::t_x_array_randomread x;
+  const typename AT::t_int_1d_const type,mask,molecule;
+  const typename AT::t_tagint_1d_const tag;
+  const typename AT::t_tagint_2d_const special;
+  const typename AT::t_int_2d_const nspecial;
+  const int molecular;
+  int moltemplate;
+
+  int special_flag[4];
+
+  const int nbinx,nbiny,nbinz;
+  const int mbinx,mbiny,mbinz;
+  const int mbinxlo,mbinylo,mbinzlo;
+  const X_FLOAT bininvx,bininvy,bininvz;
+  X_FLOAT bboxhi[3],bboxlo[3];
+
+  const int nlocal;
+
+  typename AT::t_int_scalar resize;
+  typename AT::t_int_scalar new_maxneighs;
+  typename ArrayTypes<LMPHostType>::t_int_scalar h_resize;
+  typename ArrayTypes<LMPHostType>::t_int_scalar h_new_maxneighs;
+
+  const int xperiodic, yperiodic, zperiodic;
+  const int xprd_half, yprd_half, zprd_half;
+
+  NeighborKokkosExecute(
+                        const NeighListKokkos<DeviceType> &_neigh_list,
+                        const typename AT::t_xfloat_2d_randomread &_cutneighsq,
+                        const typename AT::t_int_1d &_bincount,
+                        const typename AT::t_int_2d &_bins,
+                        const int _nstencil,
+                        const typename AT::t_int_1d &_d_stencil,
+                        const typename AT::t_int_1d_3 &_d_stencilxyz,
+                        const int _nlocal,
+                        const typename AT::t_x_array_randomread &_x,
+                        const typename AT::t_int_1d_const &_type,
+                        const typename AT::t_int_1d_const &_mask,
+                        const typename AT::t_int_1d_const &_molecule,
+                        const typename AT::t_tagint_1d_const &_tag,
+                        const typename AT::t_tagint_2d_const &_special,
+                        const typename AT::t_int_2d_const &_nspecial,
+                        const int &_molecular,
+                        const int & _nbinx,const int & _nbiny,const int & _nbinz,
+                        const int & _mbinx,const int & _mbiny,const int & _mbinz,
+                        const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo,
+                        const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz,
+                        const int & _exclude,const int & _nex_type,const int & _maxex_type,
+                        const typename AT::t_int_1d_const & _ex1_type,
+                        const typename AT::t_int_1d_const & _ex2_type,
+                        const typename AT::t_int_2d_const & _ex_type,
+                        const int & _nex_group,const int & _maxex_group,
+                        const typename AT::t_int_1d_const & _ex1_group,
+                        const typename AT::t_int_1d_const & _ex2_group,
+                        const typename AT::t_int_1d_const & _ex1_bit,
+                        const typename AT::t_int_1d_const & _ex2_bit,
+                        const int & _nex_mol,const int & _maxex_mol,
+                        const typename AT::t_int_1d_const & _ex_mol_group,
+                        const typename AT::t_int_1d_const & _ex_mol_bit,
+                        const X_FLOAT *_bboxhi, const X_FLOAT* _bboxlo,
+                        const int & _xperiodic, const int & _yperiodic, const int & _zperiodic,
+                        const int & _xprd_half, const int & _yprd_half, const int & _zprd_half):
+    neigh_list(_neigh_list), cutneighsq(_cutneighsq),
+    bincount(_bincount),c_bincount(_bincount),bins(_bins),c_bins(_bins),
+    nstencil(_nstencil),d_stencil(_d_stencil),d_stencilxyz(_d_stencilxyz),
+    nlocal(_nlocal),
+    x(_x),type(_type),mask(_mask),molecule(_molecule),
+    tag(_tag),special(_special),nspecial(_nspecial),molecular(_molecular),
+    nbinx(_nbinx),nbiny(_nbiny),nbinz(_nbinz),
+    mbinx(_mbinx),mbiny(_mbiny),mbinz(_mbinz),
+    mbinxlo(_mbinxlo),mbinylo(_mbinylo),mbinzlo(_mbinzlo),
+    bininvx(_bininvx),bininvy(_bininvy),bininvz(_bininvz),
+    exclude(_exclude),nex_type(_nex_type),maxex_type(_maxex_type),
+    ex1_type(_ex1_type),ex2_type(_ex2_type),ex_type(_ex_type),
+    nex_group(_nex_group),maxex_group(_maxex_group),
+    ex1_group(_ex1_group),ex2_group(_ex2_group),
+    ex1_bit(_ex1_bit),ex2_bit(_ex2_bit),nex_mol(_nex_mol),maxex_mol(_maxex_mol),
+    ex_mol_group(_ex_mol_group),ex_mol_bit(_ex_mol_bit),
+    xperiodic(_xperiodic),yperiodic(_yperiodic),zperiodic(_zperiodic),
+    xprd_half(_xprd_half),yprd_half(_yprd_half),zprd_half(_zprd_half) {
+
+    if (molecular == 2) moltemplate = 1;
+    else moltemplate = 0;
+
+    bboxlo[0] = _bboxlo[0]; bboxlo[1] = _bboxlo[1]; bboxlo[2] = _bboxlo[2];
+    bboxhi[0] = _bboxhi[0]; bboxhi[1] = _bboxhi[1]; bboxhi[2] = _bboxhi[2];
+
+    resize = typename AT::t_int_scalar("NeighborKokkosFunctor::resize");
+#ifndef KOKKOS_USE_CUDA_UVM
+    h_resize = Kokkos::create_mirror_view(resize);
+#else
+    h_resize = resize;
+#endif
+    h_resize() = 1;
+    new_maxneighs = typename AT::
+      t_int_scalar("NeighborKokkosFunctor::new_maxneighs");
+#ifndef KOKKOS_USE_CUDA_UVM
+    h_new_maxneighs = Kokkos::create_mirror_view(new_maxneighs);
+#else
+    h_new_maxneighs = new_maxneighs;
+#endif
+    h_new_maxneighs() = neigh_list.maxneighs;
+  };
+
+  ~NeighborKokkosExecute() {neigh_list.clean_copy();};
+
+  template<int HalfNeigh, int Newton>
+  KOKKOS_FUNCTION
+  void build_Item(const int &i) const;
+
+  template<int HalfNeigh>
+  KOKKOS_FUNCTION
+  void build_Item_Ghost(const int &i) const;
+
+#ifdef KOKKOS_HAVE_CUDA
+  template<int HalfNeigh, int Newton>
+  __device__ inline
+  void build_ItemCuda(typename Kokkos::TeamPolicy<DeviceType>::member_type dev) const;
+#endif
+
+  KOKKOS_INLINE_FUNCTION
+  void binatomsItem(const int &i) const;
+
+  KOKKOS_INLINE_FUNCTION
+  int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z) const
+  {
+    int ix,iy,iz;
+
+    if (x >= bboxhi[0])
+      ix = static_cast<int> ((x-bboxhi[0])*bininvx) + nbinx;
+    else if (x >= bboxlo[0]) {
+      ix = static_cast<int> ((x-bboxlo[0])*bininvx);
+      ix = MIN(ix,nbinx-1);
+    } else
+      ix = static_cast<int> ((x-bboxlo[0])*bininvx) - 1;
+
+    if (y >= bboxhi[1])
+      iy = static_cast<int> ((y-bboxhi[1])*bininvy) + nbiny;
+    else if (y >= bboxlo[1]) {
+      iy = static_cast<int> ((y-bboxlo[1])*bininvy);
+      iy = MIN(iy,nbiny-1);
+    } else
+      iy = static_cast<int> ((y-bboxlo[1])*bininvy) - 1;
+
+    if (z >= bboxhi[2])
+      iz = static_cast<int> ((z-bboxhi[2])*bininvz) + nbinz;
+    else if (z >= bboxlo[2]) {
+      iz = static_cast<int> ((z-bboxlo[2])*bininvz);
+      iz = MIN(iz,nbinz-1);
+    } else
+      iz = static_cast<int> ((z-bboxlo[2])*bininvz) - 1;
+
+    return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const
+  {
+    int ix,iy,iz;
+
+    if (x >= bboxhi[0])
+      ix = static_cast<int> ((x-bboxhi[0])*bininvx) + nbinx;
+    else if (x >= bboxlo[0]) {
+      ix = static_cast<int> ((x-bboxlo[0])*bininvx);
+      ix = MIN(ix,nbinx-1);
+    } else
+      ix = static_cast<int> ((x-bboxlo[0])*bininvx) - 1;
+
+    if (y >= bboxhi[1])
+      iy = static_cast<int> ((y-bboxhi[1])*bininvy) + nbiny;
+    else if (y >= bboxlo[1]) {
+      iy = static_cast<int> ((y-bboxlo[1])*bininvy);
+      iy = MIN(iy,nbiny-1);
+    } else
+      iy = static_cast<int> ((y-bboxlo[1])*bininvy) - 1;
+
+    if (z >= bboxhi[2])
+      iz = static_cast<int> ((z-bboxhi[2])*bininvz) + nbinz;
+    else if (z >= bboxlo[2]) {
+      iz = static_cast<int> ((z-bboxlo[2])*bininvz);
+      iz = MIN(iz,nbinz-1);
+    } else
+      iz = static_cast<int> ((z-bboxlo[2])*bininvz) - 1;
+
+    i[0] = ix - mbinxlo;
+    i[1] = iy - mbinylo;
+    i[2] = iz - mbinzlo;
+
+    return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  int exclusion(const int &i,const int &j, const int &itype,const int &jtype) const;
+
+  KOKKOS_INLINE_FUNCTION
+  int find_special(const int &i, const int &j) const;
+
+  KOKKOS_INLINE_FUNCTION
+  int minimum_image_check(double dx, double dy, double dz) const {
+    if (xperiodic && fabs(dx) > xprd_half) return 1;
+    if (yperiodic && fabs(dy) > yprd_half) return 1;
+    if (zperiodic && fabs(dz) > zprd_half) return 1;
+    return 0;
+  }
+
+};
+
+template<class DeviceType,int HALF_NEIGH,int GHOST_NEWTON>
+struct NPairKokkosBuildFunctor {
+  typedef DeviceType device_type;
+
+  const NeighborKokkosExecute<DeviceType> c;
+  const size_t sharedsize;
+
+  NPairKokkosBuildFunctor(const NeighborKokkosExecute<DeviceType> &_c,
+                             const size_t _sharedsize):c(_c),
+                             sharedsize(_sharedsize) {};
+
+  KOKKOS_INLINE_FUNCTION
+  void operator() (const int & i) const {
+    c.template build_Item<HALF_NEIGH,GHOST_NEWTON>(i);
+  }
+#ifdef KOKKOS_HAVE_CUDA
+  __device__ inline
+  
+  void operator() (typename Kokkos::TeamPolicy<DeviceType>::member_type dev) const {
+    c.template build_ItemCuda<HALF_NEIGH,GHOST_NEWTON>(dev);
+  }
+  size_t shmem_size(const int team_size) const { (void) team_size; return sharedsize; }
+#endif
+};
+
+template<int HALF_NEIGH,int GHOST_NEWTON>
+struct NPairKokkosBuildFunctor<LMPHostType,HALF_NEIGH,GHOST_NEWTON> {
+  typedef LMPHostType device_type;
+
+  const NeighborKokkosExecute<LMPHostType> c;
+  const size_t sharedsize;
+
+  NPairKokkosBuildFunctor(const NeighborKokkosExecute<LMPHostType> &_c,
+                             const size_t _sharedsize):c(_c),
+                             sharedsize(_sharedsize) {};
+
+  KOKKOS_INLINE_FUNCTION
+  void operator() (const int & i) const {
+    c.template build_Item<HALF_NEIGH,GHOST_NEWTON>(i);
+  }
+
+  void operator() (typename Kokkos::TeamPolicy<LMPHostType>::member_type dev) const {}
+};
+
+template<class DeviceType,int HALF_NEIGH>
+struct NPairKokkosBuildFunctorGhost {
+  typedef DeviceType device_type;
+
+  const NeighborKokkosExecute<DeviceType> c;
+  const size_t sharedsize;
+
+  NPairKokkosBuildFunctorGhost(const NeighborKokkosExecute<DeviceType> &_c,
+                             const size_t _sharedsize):c(_c),
+                             sharedsize(_sharedsize) {};
+
+  KOKKOS_INLINE_FUNCTION
+  void operator() (const int & i) const {
+    c.template build_Item_Ghost<HALF_NEIGH>(i);
+  }
+};
+
+}
+
+#endif
+#endif
+
+/* ERROR/WARNING messages:
+
+*/
diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp
index 4c431bb42761e46b49d3e62dc6a5b8d98046f918..a176ca2be417608f9da36a2ad6c983f7e2ee0394 100644
--- a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp
@@ -90,7 +90,7 @@ void PairBuckCoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -309,19 +309,12 @@ void PairBuckCoulCutKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
-    neighbor->requests[irequest]->full_cluster = 0;
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 1;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with buck/coul/cut/kk");
   }
diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp
index a7e6deb43f3860e0f7399bd9f6a66c09edb05c16..413f38370da93e18f99615f4e7f14c34a5f1e0ac 100644
--- a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp
@@ -109,7 +109,7 @@ void PairBuckCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -458,11 +458,9 @@ void PairBuckCoulLongKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with buck/coul/long/kk");
   }
diff --git a/src/KOKKOS/pair_buck_kokkos.cpp b/src/KOKKOS/pair_buck_kokkos.cpp
index 50d65b4b6deea9085bfb51d1af760aafb6fd9e20..02f767fa03baeca2e33a32b9bf1615627ea0cfe4 100644
--- a/src/KOKKOS/pair_buck_kokkos.cpp
+++ b/src/KOKKOS/pair_buck_kokkos.cpp
@@ -79,7 +79,7 @@ void PairBuckKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -233,19 +233,12 @@ void PairBuckKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with buck/kk");
   }
diff --git a/src/KOKKOS/pair_buck_kokkos.h b/src/KOKKOS/pair_buck_kokkos.h
index 23ba049f9dac8088c4890caa6aa208cdd16dab4d..e95fa903fe31e2443f4ea5102c816146c26dc3d6 100644
--- a/src/KOKKOS/pair_buck_kokkos.h
+++ b/src/KOKKOS/pair_buck_kokkos.h
@@ -31,7 +31,7 @@ namespace LAMMPS_NS {
 template<class DeviceType>
 class PairBuckKokkos : public PairBuck {
  public:
-  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2|FULLCLUSTER};
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2};
   enum {COUL_FLAG=0};
   typedef DeviceType device_type;
   PairBuckKokkos(class LAMMPS *);
@@ -96,17 +96,14 @@ class PairBuckKokkos : public PairBuck {
   friend class PairComputeFunctor<PairBuckKokkos,HALF,true>;
   friend class PairComputeFunctor<PairBuckKokkos,HALFTHREAD,true>;
   friend class PairComputeFunctor<PairBuckKokkos,N2,true>;
-  friend class PairComputeFunctor<PairBuckKokkos,FULLCLUSTER,true >;
   friend class PairComputeFunctor<PairBuckKokkos,FULL,false>;
   friend class PairComputeFunctor<PairBuckKokkos,HALF,false>;
   friend class PairComputeFunctor<PairBuckKokkos,HALFTHREAD,false>;
   friend class PairComputeFunctor<PairBuckKokkos,N2,false>;
-  friend class PairComputeFunctor<PairBuckKokkos,FULLCLUSTER,false >;
   friend EV_FLOAT pair_compute_neighlist<PairBuckKokkos,FULL,void>(PairBuckKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairBuckKokkos,HALF,void>(PairBuckKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairBuckKokkos,HALFTHREAD,void>(PairBuckKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairBuckKokkos,N2,void>(PairBuckKokkos*,NeighListKokkos<DeviceType>*);
-  friend EV_FLOAT pair_compute_fullcluster<PairBuckKokkos,void>(PairBuckKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute<PairBuckKokkos,void>(PairBuckKokkos*,NeighListKokkos<DeviceType>*);
   friend void pair_virial_fdotr_compute<PairBuckKokkos>(PairBuckKokkos*);
 };
diff --git a/src/KOKKOS/pair_coul_cut_kokkos.cpp b/src/KOKKOS/pair_coul_cut_kokkos.cpp
index 7b0fbad7e5e671c9789c8d479436c9457335c1b6..19d4306317c9f2c594a04003ded5c3472770f069 100644
--- a/src/KOKKOS/pair_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_cut_kokkos.cpp
@@ -78,7 +78,7 @@ void PairCoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   vflag = vflag_in;
 
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -215,11 +215,9 @@ void PairCoulCutKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with coul/cut/kk");
   }
diff --git a/src/KOKKOS/pair_coul_debye_kokkos.cpp b/src/KOKKOS/pair_coul_debye_kokkos.cpp
index c4b78b89107f839e3fa38f8feaf255e62c7fb03a..9a6e1b8020b6af8feb84d0b79a849d1d0eecb15c 100644
--- a/src/KOKKOS/pair_coul_debye_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp
@@ -85,7 +85,7 @@ void PairCoulDebyeKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -257,19 +257,12 @@ void PairCoulDebyeKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with coul/debye/kk");
   }
diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_coul_dsf_kokkos.cpp
index 503cdc280d948ff71945bc6f315458d9ec6d3df7..e689754d0aefd292a1b08ff459f23a9c39c4cccf 100644
--- a/src/KOKKOS/pair_coul_dsf_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_dsf_kokkos.cpp
@@ -221,11 +221,9 @@ void PairCoulDSFKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with coul/dsf/kk");
   }
diff --git a/src/KOKKOS/pair_coul_long_kokkos.cpp b/src/KOKKOS/pair_coul_long_kokkos.cpp
index 95b6734e940996acb0ea3f6875b24d790efdd1bc..7536549bf4d642c5928d52409779ad89788bbd85 100644
--- a/src/KOKKOS/pair_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_long_kokkos.cpp
@@ -102,7 +102,7 @@ void PairCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -408,11 +408,9 @@ void PairCoulLongKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with buck/coul/long/kk");
   }
diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.cpp b/src/KOKKOS/pair_coul_wolf_kokkos.cpp
index 774580c9296645de2bb9592b8d986649db8829b8..1785ba273185ac91c4d367e531fb8f6527b501cb 100644
--- a/src/KOKKOS/pair_coul_wolf_kokkos.cpp
+++ b/src/KOKKOS/pair_coul_wolf_kokkos.cpp
@@ -222,11 +222,9 @@ void PairCoulWolfKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with coul/wolf/kk");
   }
diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp
index 151d89d2b0e58390b52c18e936f385bad4c8546a..f3b7c36106939347e1275b702c03b42df8429b98 100644
--- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp
+++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp
@@ -286,11 +286,9 @@ void PairEAMAlloyKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with pair eam/kk/alloy");
   }
diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp
index b503d1e83a73cd38ad3d71e952c039d86bd33738..ba450b0872f4f0477c8818e8c59695af55666f6c 100644
--- a/src/KOKKOS/pair_eam_fs_kokkos.cpp
+++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp
@@ -291,11 +291,9 @@ void PairEAMFSKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with pair eam/kk/fs");
   }
diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp
index d91da280ac6491b933f9c9f21fa75d95c1d717e5..3d8223ed669fc31447e1d84e780b3372e88e776d 100644
--- a/src/KOKKOS/pair_eam_kokkos.cpp
+++ b/src/KOKKOS/pair_eam_kokkos.cpp
@@ -281,11 +281,9 @@ void PairEAMKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with pair eam/kk");
   }
diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h
index 3710c460c0246e12e10571aa5a9680026597eeb7..1e01b3df15a7ebb053854e1592a7e96762c7e852 100644
--- a/src/KOKKOS/pair_kokkos.h
+++ b/src/KOKKOS/pair_kokkos.h
@@ -333,145 +333,6 @@ struct PairComputeFunctor  {
   }
 };
 
-template <class PairStyle, bool STACKPARAMS, class Specialisation>
-struct PairComputeFunctor<PairStyle,FULLCLUSTER,STACKPARAMS,Specialisation>  {
-  typedef typename PairStyle::device_type device_type ;
-  typedef EV_FLOAT value_type;
-
-  PairStyle c;
-  NeighListKokkos<device_type> list;
-
-  PairComputeFunctor(PairStyle* c_ptr,
-                          NeighListKokkos<device_type>* list_ptr):
-  c(*c_ptr),list(*list_ptr) {};
-  ~PairComputeFunctor() {c.cleanup_copy();list.clean_copy();};
-
-  KOKKOS_INLINE_FUNCTION int sbmask(const int& j) const {
-    return j >> SBBITS & 3;
-  }
-
-  template<int EVFLAG, int NEWTON_PAIR>
-  KOKKOS_FUNCTION
-  EV_FLOAT compute_item(const typename Kokkos::TeamPolicy<device_type>::member_type& dev,
-                        const NeighListKokkos<device_type> &list, const NoCoulTag& ) const {
-    EV_FLOAT ev;
-    int i = dev.league_rank()*dev.team_size() + dev.team_rank();
-
-    const X_FLOAT xtmp = c.c_x(i,0);
-    const X_FLOAT ytmp = c.c_x(i,1);
-    const X_FLOAT ztmp = c.c_x(i,2);
-    int itype = c.type(i);
-
-    const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i);
-    const int jnum = list.d_numneigh[i];
-
-    F_FLOAT3 ftmp;
-
-    for (int jj = 0; jj < jnum; jj++) {
-      int jjj = neighbors_i(jj);
-
-      Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(dev,NeighClusterSize),[&] (const int& k, F_FLOAT3& fftmp) {
-        const F_FLOAT factor_lj = c.special_lj[sbmask(jjj+k)];
-        const int j = (jjj + k)&NEIGHMASK;
-        if((j==i)||(j>=c.nall)) return;
-        const X_FLOAT delx = xtmp - c.c_x(j,0);
-        const X_FLOAT dely = ytmp - c.c_x(j,1);
-        const X_FLOAT delz = ztmp - c.c_x(j,2);
-        const int jtype = c.type(j);
-        const F_FLOAT rsq = (delx*delx + dely*dely + delz*delz);
-
-        if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) {
-
-          const F_FLOAT fpair = factor_lj*c.template compute_fpair<STACKPARAMS,Specialisation>(rsq,i,j,itype,jtype);
-          fftmp.x += delx*fpair;
-          fftmp.y += dely*fpair;
-          fftmp.z += delz*fpair;
-
-          if (EVFLAG) {
-            F_FLOAT evdwl = 0.0;
-            if (c.eflag) {
-              evdwl = 0.5*
-                factor_lj * c.template compute_evdwl<STACKPARAMS,Specialisation>(rsq,i,j,itype,jtype);
-              ev.evdwl += evdwl;
-            }
-
-            if (c.vflag_either || c.eflag_atom) ev_tally(ev,i,j,evdwl,fpair,delx,dely,delz);
-          }
-        }
-      },ftmp);
-    }
-
-    Kokkos::single(Kokkos::PerThread(dev), [&]() {
-      c.f(i,0) += ftmp.x;
-      c.f(i,1) += ftmp.y;
-      c.f(i,2) += ftmp.z;
-    });
-
-    return ev;
-  }
-
-  KOKKOS_INLINE_FUNCTION
-    void ev_tally(EV_FLOAT &ev, const int &i, const int &j,
-      const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx,
-                  const F_FLOAT &dely, const F_FLOAT &delz) const
-  {
-    const int EFLAG = c.eflag;
-    const int NEWTON_PAIR = c.newton_pair;
-    const int VFLAG = c.vflag_either;
-
-    if (EFLAG) {
-      if (c.eflag_atom) {
-        const E_FLOAT epairhalf = 0.5 * epair;
-        if (NEWTON_PAIR || i < c.nlocal) c.d_eatom[i] += epairhalf;
-        if (NEWTON_PAIR || j < c.nlocal) c.d_eatom[j] += epairhalf;
-      }
-    }
-
-    if (VFLAG) {
-      const E_FLOAT v0 = delx*delx*fpair;
-      const E_FLOAT v1 = dely*dely*fpair;
-      const E_FLOAT v2 = delz*delz*fpair;
-      const E_FLOAT v3 = delx*dely*fpair;
-      const E_FLOAT v4 = delx*delz*fpair;
-      const E_FLOAT v5 = dely*delz*fpair;
-
-      if (c.vflag_global) {
-          ev.v[0] += 0.5*v0;
-          ev.v[1] += 0.5*v1;
-          ev.v[2] += 0.5*v2;
-          ev.v[3] += 0.5*v3;
-          ev.v[4] += 0.5*v4;
-          ev.v[5] += 0.5*v5;
-      }
-
-      if (c.vflag_atom) {
-        if (i < c.nlocal) {
-          c.d_vatom(i,0) += 0.5*v0;
-          c.d_vatom(i,1) += 0.5*v1;
-          c.d_vatom(i,2) += 0.5*v2;
-          c.d_vatom(i,3) += 0.5*v3;
-          c.d_vatom(i,4) += 0.5*v4;
-          c.d_vatom(i,5) += 0.5*v5;
-        }
-      }
-    }
-  }
-
-  KOKKOS_INLINE_FUNCTION
-  void operator()(const  typename Kokkos::TeamPolicy<device_type>::member_type& dev) const {
-    if (c.newton_pair) compute_item<0,1>(dev,list,typename DoCoul<PairStyle::COUL_FLAG>::type());
-    else compute_item<0,0>(dev,list,typename DoCoul<PairStyle::COUL_FLAG>::type());
-  }
-
-  KOKKOS_INLINE_FUNCTION
-  void operator()(const  typename Kokkos::TeamPolicy<device_type>::member_type& dev, value_type &energy_virial) const {
-    if (c.newton_pair)
-      energy_virial += compute_item<1,1>(dev,list,typename DoCoul<PairStyle::COUL_FLAG>::type());
-    else
-      energy_virial += compute_item<1,0>(dev,list,typename DoCoul<PairStyle::COUL_FLAG>::type());
-  }
-};
-
 template <class PairStyle, bool STACKPARAMS, class Specialisation>
 struct PairComputeFunctor<PairStyle,N2,STACKPARAMS,Specialisation>  {
   typedef typename PairStyle::device_type device_type ;
@@ -607,8 +468,8 @@ struct PairComputeFunctor<PairStyle,N2,STACKPARAMS,Specialisation>  {
 // The enable_if clause will invalidate the last parameter of the function, so that
 // a match is only achieved, if PairStyle supports the specific neighborlist variant.
 // This uses the fact that failure to match template parameters is not an error.
-// By having the enable_if with a ! and without it, exactly one of the two versions of the functions
-// pair_compute_neighlist and pair_compute_fullcluster will match - either the dummy version
+// By having the enable_if with a ! and without it, exactly one of the functions
+// pair_compute_neighlist will match - either the dummy version
 // or the real one further below.
 template<class PairStyle, unsigned NEIGHFLAG, class Specialisation>
 EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable_if<!((NEIGHFLAG&PairStyle::EnabledNeighFlags) != 0), NeighListKokkos<typename PairStyle::device_type>*>::type list) {
@@ -619,15 +480,6 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable
   return ev;
 }
 
-template<class PairStyle, class Specialisation>
-EV_FLOAT pair_compute_fullcluster (PairStyle* fpair, typename Kokkos::Impl::enable_if<!((FULLCLUSTER&PairStyle::EnabledNeighFlags) != 0), NeighListKokkos<typename PairStyle::device_type>*>::type list) {
-  EV_FLOAT ev;
-  (void) fpair;
-  (void) list;
-  printf("ERROR: calling pair_compute with invalid neighbor list style: requested %i  available %i \n",FULLCLUSTER,PairStyle::EnabledNeighFlags);
-  return ev;
-}
-
 // Submit ParallelFor for NEIGHFLAG=HALF,HALFTHREAD,FULL,N2
 template<class PairStyle, unsigned NEIGHFLAG, class Specialisation>
 EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable_if<(NEIGHFLAG&PairStyle::EnabledNeighFlags) != 0, NeighListKokkos<typename PairStyle::device_type>*>::type list) {
@@ -644,41 +496,6 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable
   return ev;
 }
 
-// Submit ParallelFor for NEIGHFLAG=FULLCLUSTER
-template<class PairStyle, class Specialisation>
-EV_FLOAT pair_compute_fullcluster (PairStyle* fpair, typename Kokkos::Impl::enable_if<(FULLCLUSTER&PairStyle::EnabledNeighFlags) != 0, NeighListKokkos<typename PairStyle::device_type>*>::type list) {
-  EV_FLOAT ev;
-  if(fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) {
-    typedef PairComputeFunctor<PairStyle,FULLCLUSTER,false,Specialisation >
-      f_type;
-    f_type ff(fpair, list);
-    #ifdef KOKKOS_HAVE_CUDA
-      const int teamsize = Kokkos::Impl::is_same<typename f_type::device_type, Kokkos::Cuda>::value ? 32 : 1;
-    #else
-      const int teamsize = 1;
-    #endif
-    const int nteams = (list->inum*+teamsize-1)/teamsize;
-    Kokkos::TeamPolicy<typename f_type::device_type> config(nteams,teamsize,NeighClusterSize);
-    if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(config,ff,ev);
-    else Kokkos::parallel_for(config,ff);
-  } else {
-    typedef PairComputeFunctor<PairStyle,FULLCLUSTER,true,Specialisation >
-      f_type;
-    f_type ff(fpair, list);
-    #ifdef KOKKOS_HAVE_CUDA
-      const int teamsize = Kokkos::Impl::is_same<typename f_type::device_type, Kokkos::Cuda>::value ? 32 : 1;
-    #else
-      const int teamsize = 1;
-    #endif
-      const int nteams = (list->inum*+teamsize-1)/teamsize;
-      Kokkos::TeamPolicy<typename f_type::device_type> config(nteams,teamsize,NeighClusterSize);
-    if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(config,ff,ev);
-    else Kokkos::parallel_for(config,ff);
-  }
-  return ev;
-}
-
-
 template<class PairStyle, class Specialisation>
 EV_FLOAT pair_compute (PairStyle* fpair, NeighListKokkos<typename PairStyle::device_type>* list) {
   EV_FLOAT ev;
@@ -690,8 +507,6 @@ EV_FLOAT pair_compute (PairStyle* fpair, NeighListKokkos<typename PairStyle::dev
     ev = pair_compute_neighlist<PairStyle,HALF,Specialisation> (fpair,list);
   } else if (fpair->neighflag == N2) {
     ev = pair_compute_neighlist<PairStyle,N2,Specialisation> (fpair,list);
-  } else if (fpair->neighflag == FULLCLUSTER) {
-    ev = pair_compute_fullcluster<PairStyle,Specialisation> (fpair,list);
   }
   return ev;
 }
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 d438e64e7d923cbb866d611f6e44f8054784ee12..914711a8e5bf77eb35977b9a86ddca754a21afb9 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp
@@ -110,7 +110,7 @@ void PairLJCharmmCoulCharmmImplicitKokkos<DeviceType>::compute(int eflag_in, int
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -455,11 +455,9 @@ void PairLJCharmmCoulCharmmImplicitKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/charmm/coul/charmm/implicit/kk");
   }
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
index 4e125235f465f7a05a4c368e8299c70a545204ca..4af6a896d0eeccc68eee9c70c6cf46613c0bff29 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
@@ -110,7 +110,7 @@ void PairLJCharmmCoulCharmmKokkos<DeviceType>::compute(int eflag_in, int vflag_i
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -456,11 +456,9 @@ void PairLJCharmmCoulCharmmKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/charmm/coul/charmm/kk");
   }
diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp
index 3b2b13f40b1428f2fb9aa6dba6856c6436b56e71..5efba2742dd0ea9a79b7348cb671f79926e9cff6 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp
@@ -110,7 +110,7 @@ void PairLJCharmmCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -486,11 +486,9 @@ void PairLJCharmmCoulLongKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/charmm/coul/long/kk");
   }
diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp
index 87cd1cb7e141a50ba52d6036f6626e25eaa0ab43..96507a599e9cce306f414cc2008945f076934134 100644
--- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp
@@ -87,7 +87,7 @@ void PairLJClass2CoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -289,19 +289,12 @@ void PairLJClass2CoulCutKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/class2/coul/cut/kk");
   }
diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp
index 297a764ddabd4004ac95c3e829ece6c78c602b45..2d1abc9cd31d2afaae8558e01588cab4f80e04d9 100644
--- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp
@@ -95,7 +95,7 @@ void PairLJClass2CoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -445,11 +445,9 @@ void PairLJClass2CoulLongKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/class2/coul/long/kk");
   }
diff --git a/src/KOKKOS/pair_lj_class2_kokkos.cpp b/src/KOKKOS/pair_lj_class2_kokkos.cpp
index a263e81e0e8a74f10f6bc36907f75c8d1527fba5..b5c4c19b8eea774219b7b6dd9505d6cb8e536bdd 100644
--- a/src/KOKKOS/pair_lj_class2_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_class2_kokkos.cpp
@@ -87,7 +87,7 @@ void PairLJClass2Kokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   vflag = vflag_in;
 
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -227,19 +227,12 @@ void PairLJClass2Kokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/class2/kk");
   }
diff --git a/src/KOKKOS/pair_lj_class2_kokkos.h b/src/KOKKOS/pair_lj_class2_kokkos.h
index 8dcabe5b0cb3cdf9dd12944d7e4f02d69435e183..e8ac07da807bc5c57bef8ee3b65047e0f0089859 100644
--- a/src/KOKKOS/pair_lj_class2_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_kokkos.h
@@ -31,7 +31,7 @@ namespace LAMMPS_NS {
 template<class DeviceType>
 class PairLJClass2Kokkos : public PairLJClass2 {
  public:
-  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2|FULLCLUSTER};
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2};
   enum {COUL_FLAG=0};
   typedef DeviceType device_type;
   PairLJClass2Kokkos(class LAMMPS *);
@@ -99,17 +99,14 @@ class PairLJClass2Kokkos : public PairLJClass2 {
   friend class PairComputeFunctor<PairLJClass2Kokkos,HALF,true>;
   friend class PairComputeFunctor<PairLJClass2Kokkos,HALFTHREAD,true>;
   friend class PairComputeFunctor<PairLJClass2Kokkos,N2,true>;
-  friend class PairComputeFunctor<PairLJClass2Kokkos,FULLCLUSTER,true >;
   friend class PairComputeFunctor<PairLJClass2Kokkos,FULL,false>;
   friend class PairComputeFunctor<PairLJClass2Kokkos,HALF,false>;
   friend class PairComputeFunctor<PairLJClass2Kokkos,HALFTHREAD,false>;
   friend class PairComputeFunctor<PairLJClass2Kokkos,N2,false>;
-  friend class PairComputeFunctor<PairLJClass2Kokkos,FULLCLUSTER,false >;
   friend EV_FLOAT pair_compute_neighlist<PairLJClass2Kokkos,FULL,void>(PairLJClass2Kokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJClass2Kokkos,HALF,void>(PairLJClass2Kokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJClass2Kokkos,HALFTHREAD,void>(PairLJClass2Kokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJClass2Kokkos,N2,void>(PairLJClass2Kokkos*,NeighListKokkos<DeviceType>*);
-  friend EV_FLOAT pair_compute_fullcluster<PairLJClass2Kokkos,void>(PairLJClass2Kokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute<PairLJClass2Kokkos,void>(PairLJClass2Kokkos*,NeighListKokkos<DeviceType>*);
   friend void pair_virial_fdotr_compute<PairLJClass2Kokkos>(PairLJClass2Kokkos*);
 };
diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp
index b6071880cfe841d7a7204387cf9ca1fafa0ac953..e68ec5579cac7fcd7363e914b8cb9a36378c8715 100644
--- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp
@@ -87,7 +87,7 @@ void PairLJCutCoulCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -280,19 +280,12 @@ void PairLJCutCoulCutKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/coul/cut/kk");
   }
diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp
index 1da18f0afeb41af1b9320f69bc5d05bea4333ebd..f4011b6f5c178acae7dcaa6f4366df97e9b3207f 100644
--- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp
@@ -91,7 +91,7 @@ void PairLJCutCoulDebyeKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -310,19 +310,12 @@ void PairLJCutCoulDebyeKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/coul/debye/kk");
   }
diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp
index 46cb0a96dc1a93f1d411079656dd9e3e32f59bdf..13c930a15b1f5fa4b630ac03ae5821530d1cc2e1 100644
--- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp
@@ -99,7 +99,7 @@ void PairLJCutCoulDSFKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -301,19 +301,12 @@ void PairLJCutCoulDSFKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/coul/cut/kk");
   }
diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp
index 2a1a1244604a18f252a44b3e12a9766798f93483..42319cfa995c6ba586af0a0109b70a3be83ae1ac 100644
--- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp
@@ -99,7 +99,7 @@ void PairLJCutCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -464,11 +464,9 @@ void PairLJCutCoulLongKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/coul/long/kk");
   }
diff --git a/src/KOKKOS/pair_lj_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_kokkos.cpp
index 2ad7f2d0143e0873f441b0743e26a623f258e223..5f2805622a44bff88314080bf620be9b8a3c0034 100644
--- a/src/KOKKOS/pair_lj_cut_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp
@@ -87,7 +87,7 @@ void PairLJCutKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   vflag = vflag_in;
 
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -245,19 +245,12 @@ void PairLJCutKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/kk");
   }
diff --git a/src/KOKKOS/pair_lj_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_kokkos.h
index 16efd3d2ef16ff88e4f2807a14da71a3c5d02d49..b779874fe87f7882bb497d5b19c02a214d2d9d71 100644
--- a/src/KOKKOS/pair_lj_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_kokkos.h
@@ -31,7 +31,7 @@ namespace LAMMPS_NS {
 template<class DeviceType>
 class PairLJCutKokkos : public PairLJCut {
  public:
-  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2|FULLCLUSTER};
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2};
   enum {COUL_FLAG=0};
   typedef DeviceType device_type;
   PairLJCutKokkos(class LAMMPS *);
@@ -99,17 +99,14 @@ class PairLJCutKokkos : public PairLJCut {
   friend class PairComputeFunctor<PairLJCutKokkos,HALF,true>;
   friend class PairComputeFunctor<PairLJCutKokkos,HALFTHREAD,true>;
   friend class PairComputeFunctor<PairLJCutKokkos,N2,true>;
-  friend class PairComputeFunctor<PairLJCutKokkos,FULLCLUSTER,true >;
   friend class PairComputeFunctor<PairLJCutKokkos,FULL,false>;
   friend class PairComputeFunctor<PairLJCutKokkos,HALF,false>;
   friend class PairComputeFunctor<PairLJCutKokkos,HALFTHREAD,false>;
   friend class PairComputeFunctor<PairLJCutKokkos,N2,false>;
-  friend class PairComputeFunctor<PairLJCutKokkos,FULLCLUSTER,false >;
   friend EV_FLOAT pair_compute_neighlist<PairLJCutKokkos,FULL,void>(PairLJCutKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJCutKokkos,HALF,void>(PairLJCutKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJCutKokkos,HALFTHREAD,void>(PairLJCutKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJCutKokkos,N2,void>(PairLJCutKokkos*,NeighListKokkos<DeviceType>*);
-  friend EV_FLOAT pair_compute_fullcluster<PairLJCutKokkos,void>(PairLJCutKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute<PairLJCutKokkos,void>(PairLJCutKokkos*,NeighListKokkos<DeviceType>*);
   friend void pair_virial_fdotr_compute<PairLJCutKokkos>(PairLJCutKokkos*);
 };
diff --git a/src/KOKKOS/pair_lj_expand_kokkos.cpp b/src/KOKKOS/pair_lj_expand_kokkos.cpp
index 3e1d185d2fd3c16d3a606a35848b5ad6cd04612c..3ed03f0d0b97c4acb58d5653a923ea2d687390c5 100644
--- a/src/KOKKOS/pair_lj_expand_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_expand_kokkos.cpp
@@ -86,7 +86,7 @@ void PairLJExpandKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -230,19 +230,12 @@ void PairLJExpandKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/expand/kk");
   }
diff --git a/src/KOKKOS/pair_lj_expand_kokkos.h b/src/KOKKOS/pair_lj_expand_kokkos.h
index 172ccaae73eb6a7b029cdc8b78cd01d7d247207f..339950a6b252c9952a0ce15a48e677f202ecb4d4 100644
--- a/src/KOKKOS/pair_lj_expand_kokkos.h
+++ b/src/KOKKOS/pair_lj_expand_kokkos.h
@@ -31,7 +31,7 @@ namespace LAMMPS_NS {
 template<class DeviceType>
 class PairLJExpandKokkos : public PairLJExpand {
  public:
-  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2|FULLCLUSTER};
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2};
   enum {COUL_FLAG=0};
   typedef DeviceType device_type;
   PairLJExpandKokkos(class LAMMPS *);
@@ -100,17 +100,14 @@ class PairLJExpandKokkos : public PairLJExpand {
   friend class PairComputeFunctor<PairLJExpandKokkos,HALF,true>;
   friend class PairComputeFunctor<PairLJExpandKokkos,HALFTHREAD,true>;
   friend class PairComputeFunctor<PairLJExpandKokkos,N2,true>;
-  friend class PairComputeFunctor<PairLJExpandKokkos,FULLCLUSTER,true >;
   friend class PairComputeFunctor<PairLJExpandKokkos,FULL,false>;
   friend class PairComputeFunctor<PairLJExpandKokkos,HALF,false>;
   friend class PairComputeFunctor<PairLJExpandKokkos,HALFTHREAD,false>;
   friend class PairComputeFunctor<PairLJExpandKokkos,N2,false>;
-  friend class PairComputeFunctor<PairLJExpandKokkos,FULLCLUSTER,false >;
   friend EV_FLOAT pair_compute_neighlist<PairLJExpandKokkos,FULL,void>(PairLJExpandKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJExpandKokkos,HALF,void>(PairLJExpandKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJExpandKokkos,HALFTHREAD,void>(PairLJExpandKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJExpandKokkos,N2,void>(PairLJExpandKokkos*,NeighListKokkos<DeviceType>*);
-  friend EV_FLOAT pair_compute_fullcluster<PairLJExpandKokkos,void>(PairLJExpandKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute<PairLJExpandKokkos,void>(PairLJExpandKokkos*,NeighListKokkos<DeviceType>*);
   friend void pair_virial_fdotr_compute<PairLJExpandKokkos>(PairLJExpandKokkos*);
 };
diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp
index c764af303f5a91c1556deef816af9347dd4edbad..943cf988c90341a52a804547d9796136e3034491 100644
--- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp
@@ -101,7 +101,7 @@ void PairLJGromacsCoulGromacsKokkos<DeviceType>::compute(int eflag_in, int vflag
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -439,11 +439,9 @@ void PairLJGromacsCoulGromacsKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/gromacs/coul/gromacs/kk");
   }
diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp
index 2f144599ac34a8df9b3465554bb7f1f25983977e..bb4dcb39bf0f1bc03dc85d98eb3ce251c6343c1b 100644
--- a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp
@@ -98,7 +98,7 @@ void PairLJGromacsKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -277,11 +277,9 @@ void PairLJGromacsKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/gromacs/kk");
   }
diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.cpp b/src/KOKKOS/pair_lj_sdk_kokkos.cpp
index 74183dff0b8b332e435105e72daca6af5597c07b..46715e6fa3606bd738980618a9f371df7a446b09 100644
--- a/src/KOKKOS/pair_lj_sdk_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_sdk_kokkos.cpp
@@ -86,7 +86,7 @@ void PairLJSDKKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   vflag = vflag_in;
 
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -258,19 +258,12 @@ void PairLJSDKKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/sdk/kk");
   }
diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.h b/src/KOKKOS/pair_lj_sdk_kokkos.h
index 090b9aa56297f000e0924e073ceedd2f64c6b513..03ca361c1bfec33109e893def868dd3c2ac24b1b 100644
--- a/src/KOKKOS/pair_lj_sdk_kokkos.h
+++ b/src/KOKKOS/pair_lj_sdk_kokkos.h
@@ -31,7 +31,7 @@ namespace LAMMPS_NS {
 template<class DeviceType>
 class PairLJSDKKokkos : public PairLJSDK {
  public:
-  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2|FULLCLUSTER};
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2};
   enum {COUL_FLAG=0};
   typedef DeviceType device_type;
   PairLJSDKKokkos(class LAMMPS *);
@@ -97,17 +97,14 @@ class PairLJSDKKokkos : public PairLJSDK {
   friend class PairComputeFunctor<PairLJSDKKokkos,HALF,true>;
   friend class PairComputeFunctor<PairLJSDKKokkos,HALFTHREAD,true>;
   friend class PairComputeFunctor<PairLJSDKKokkos,N2,true>;
-  friend class PairComputeFunctor<PairLJSDKKokkos,FULLCLUSTER,true >;
   friend class PairComputeFunctor<PairLJSDKKokkos,FULL,false>;
   friend class PairComputeFunctor<PairLJSDKKokkos,HALF,false>;
   friend class PairComputeFunctor<PairLJSDKKokkos,HALFTHREAD,false>;
   friend class PairComputeFunctor<PairLJSDKKokkos,N2,false>;
-  friend class PairComputeFunctor<PairLJSDKKokkos,FULLCLUSTER,false >;
   friend EV_FLOAT pair_compute_neighlist<PairLJSDKKokkos,FULL,void>(PairLJSDKKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJSDKKokkos,HALF,void>(PairLJSDKKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJSDKKokkos,HALFTHREAD,void>(PairLJSDKKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute_neighlist<PairLJSDKKokkos,N2,void>(PairLJSDKKokkos*,NeighListKokkos<DeviceType>*);
-  friend EV_FLOAT pair_compute_fullcluster<PairLJSDKKokkos,void>(PairLJSDKKokkos*,NeighListKokkos<DeviceType>*);
   friend EV_FLOAT pair_compute<PairLJSDKKokkos,void>(PairLJSDKKokkos*,NeighListKokkos<DeviceType>*);
   friend void pair_virial_fdotr_compute<PairLJSDKKokkos>(PairLJSDKKokkos*);
 };
diff --git a/src/KOKKOS/pair_reax_c_kokkos.cpp b/src/KOKKOS/pair_reax_c_kokkos.cpp
index 894c3ab53c9235a7c9d8cbf5e287f7883f536bc0..0fbf579a9268e5c707cdf81a95b6382dd2f6ab8b 100644
--- a/src/KOKKOS/pair_reax_c_kokkos.cpp
+++ b/src/KOKKOS/pair_reax_c_kokkos.cpp
@@ -146,12 +146,10 @@ void PairReaxCKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
     neighbor->requests[irequest]->ghost = 1;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
     neighbor->requests[irequest]->ghost = 1;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with reax/c/kk");
diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp
index d2cda316bee0b5778dc32fde362d44b6d6bd5083..8d0f2fcfc3b3b57c2d361840ac478851240b2ded 100644
--- a/src/KOKKOS/pair_sw_kokkos.cpp
+++ b/src/KOKKOS/pair_sw_kokkos.cpp
@@ -601,7 +601,6 @@ void PairSWKokkos<DeviceType>::init_style()
   if (neighflag == FULL || neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
     if (neighflag == FULL)
       neighbor->requests[irequest]->ghost = 1;
     else
diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp
index 278c5b0a2fd40d1f6739306738d3c4fccdc3f77d..5230d1a91fa68487b459c0f3a22b847cc10c7040 100644
--- a/src/KOKKOS/pair_table_kokkos.cpp
+++ b/src/KOKKOS/pair_table_kokkos.cpp
@@ -96,7 +96,7 @@ void PairTableKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
   eflag = eflag_in;
   vflag = vflag_in;
 
-  if (neighflag == FULL || neighflag == FULLCLUSTER) no_virial_fdotr_compute = 1;
+  if (neighflag == FULL) no_virial_fdotr_compute = 1;
 
   if (eflag || vflag) ev_setup(eflag,vflag);
   else evflag = vflag_fdotr = 0;
@@ -142,19 +142,6 @@ void PairTableKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
         f(this,(NeighListKokkos<DeviceType>*) list);
       if (eflag || vflag) Kokkos::parallel_reduce(nlocal,f,ev);
       else Kokkos::parallel_for(nlocal,f);
-    } else if (neighflag == FULLCLUSTER) {
-      typedef PairComputeFunctor<PairTableKokkos<DeviceType>,FULLCLUSTER,false,S_TableCompute<DeviceType,TABSTYLE> >
-        f_type;
-      f_type f(this,(NeighListKokkos<DeviceType>*) list);
-      #ifdef KOKKOS_HAVE_CUDA
-        const int teamsize = Kokkos::Impl::is_same<DeviceType, Kokkos::Cuda>::value ? 32 : 1;
-      #else
-        const int teamsize = 1;
-      #endif
-      const int nteams = (list->inum*+teamsize-1)/teamsize;
-      Kokkos::TeamPolicy<DeviceType> config(nteams,teamsize,NeighClusterSize);
-      if (eflag || vflag) Kokkos::parallel_reduce(config,f,ev);
-      else Kokkos::parallel_for(config,f);
     }
   } else {
     if (neighflag == FULL) {
@@ -177,19 +164,6 @@ void PairTableKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
         f(this,(NeighListKokkos<DeviceType>*) list);
       if (eflag || vflag) Kokkos::parallel_reduce(nlocal,f,ev);
       else Kokkos::parallel_for(nlocal,f);
-    } else if (neighflag == FULLCLUSTER) {
-      typedef PairComputeFunctor<PairTableKokkos<DeviceType>,FULLCLUSTER,true,S_TableCompute<DeviceType,TABSTYLE> >
-        f_type;
-      f_type f(this,(NeighListKokkos<DeviceType>*) list);
-      #ifdef KOKKOS_HAVE_CUDA
-        const int teamsize = Kokkos::Impl::is_same<DeviceType, Kokkos::Cuda>::value ? 32 : 1;
-      #else
-        const int teamsize = 1;
-      #endif
-      const int nteams = (list->inum*+teamsize-1)/teamsize;
-      Kokkos::TeamPolicy<DeviceType> config(nteams,teamsize,NeighClusterSize);
-      if (eflag || vflag) Kokkos::parallel_reduce(config,f,ev);
-      else Kokkos::parallel_for(config,f);
     }
   }
 
@@ -1261,19 +1235,12 @@ void PairTableKokkos<DeviceType>::init_style()
   if (neighflag == FULL) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 1;
-    neighbor->requests[irequest]->full_cluster = 0;
   } else if (neighflag == N2) {
     neighbor->requests[irequest]->full = 0;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
-  } else if (neighflag == FULLCLUSTER) {
-    neighbor->requests[irequest]->full_cluster = 1;
-    neighbor->requests[irequest]->full = 1;
-    neighbor->requests[irequest]->half = 0;
   } else {
     error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/kk");
   }
diff --git a/src/KOKKOS/pair_table_kokkos.h b/src/KOKKOS/pair_table_kokkos.h
index 09e64804b4774a3023e8f9364f2f262750f9c9db..4d3a9ec10686d70db3b5dd0e9e6cc8b072fe6dfb 100644
--- a/src/KOKKOS/pair_table_kokkos.h
+++ b/src/KOKKOS/pair_table_kokkos.h
@@ -41,7 +41,7 @@ template<class DeviceType>
 class PairTableKokkos : public Pair {
  public:
 
-  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2|FULLCLUSTER};
+  enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF|N2};
   enum {COUL_FLAG=0};
   typedef DeviceType device_type;
 
@@ -170,45 +170,37 @@ class PairTableKokkos : public Pair {
   friend class PairComputeFunctor<PairTableKokkos,HALF,true,S_TableCompute<DeviceType,LOOKUP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,true,S_TableCompute<DeviceType,LOOKUP> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,true,S_TableCompute<DeviceType,LOOKUP> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,true,S_TableCompute<DeviceType,LOOKUP> >;
   friend class PairComputeFunctor<PairTableKokkos,FULL,false,S_TableCompute<DeviceType,LOOKUP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,false,S_TableCompute<DeviceType,LOOKUP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,false,S_TableCompute<DeviceType,LOOKUP> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,false,S_TableCompute<DeviceType,LOOKUP> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,false,S_TableCompute<DeviceType,LOOKUP> >;
 
   friend class PairComputeFunctor<PairTableKokkos,FULL,true,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,true,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,true,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,true,S_TableCompute<DeviceType,LINEAR> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,true,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,FULL,false,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,false,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,false,S_TableCompute<DeviceType,LINEAR> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,false,S_TableCompute<DeviceType,LINEAR> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,false,S_TableCompute<DeviceType,LINEAR> >;
 
   friend class PairComputeFunctor<PairTableKokkos,FULL,true,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,true,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,true,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,true,S_TableCompute<DeviceType,SPLINE> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,true,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,FULL,false,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,false,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,false,S_TableCompute<DeviceType,SPLINE> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,false,S_TableCompute<DeviceType,SPLINE> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,false,S_TableCompute<DeviceType,SPLINE> >;
 
   friend class PairComputeFunctor<PairTableKokkos,FULL,true,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,true,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,true,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,true,S_TableCompute<DeviceType,BITMAP> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,true,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,FULL,false,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALF,false,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,HALFTHREAD,false,S_TableCompute<DeviceType,BITMAP> >;
   friend class PairComputeFunctor<PairTableKokkos,N2,false,S_TableCompute<DeviceType,BITMAP> >;
-  friend class PairComputeFunctor<PairTableKokkos,FULLCLUSTER,false,S_TableCompute<DeviceType,BITMAP> >;
 
   friend void pair_virial_fdotr_compute<PairTableKokkos>(PairTableKokkos*);
 };
diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp
index 2908622e87d698a6686b3973d68e914ee25cf053..342aa8faec7e2dcb0cb2d9cbfdb1bdb3c0cc0559 100644
--- a/src/KOKKOS/pair_tersoff_kokkos.cpp
+++ b/src/KOKKOS/pair_tersoff_kokkos.cpp
@@ -103,7 +103,6 @@ void PairTersoffKokkos<DeviceType>::init_style()
   //if (neighflag == FULL || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
     if (neighflag == FULL)
       neighbor->requests[irequest]->ghost = 1;
     else
@@ -126,26 +125,26 @@ void PairTersoffKokkos<DeviceType>::setup_params()
   for (i = 1; i <= n; i++)
     for (j = 1; j <= n; j++)
       for (k = 1; k <= n; k++) {
-        m = elem2param[map[i]][map[j]][map[k]];
-        k_params.h_view(i,j,k).powerm = params[m].powerm;
-        k_params.h_view(i,j,k).gamma = params[m].gamma;
-        k_params.h_view(i,j,k).lam3 = params[m].lam3;
-        k_params.h_view(i,j,k).c = params[m].c;
-        k_params.h_view(i,j,k).d = params[m].d;
-        k_params.h_view(i,j,k).h = params[m].h;
-        k_params.h_view(i,j,k).powern = params[m].powern;
-        k_params.h_view(i,j,k).beta = params[m].beta;
-        k_params.h_view(i,j,k).lam2 = params[m].lam2;
-        k_params.h_view(i,j,k).bigb = params[m].bigb;
-        k_params.h_view(i,j,k).bigr = params[m].bigr;
-        k_params.h_view(i,j,k).bigd = params[m].bigd;
-        k_params.h_view(i,j,k).lam1 = params[m].lam1;
-        k_params.h_view(i,j,k).biga = params[m].biga;
-        k_params.h_view(i,j,k).cutsq = params[m].cutsq;
-        k_params.h_view(i,j,k).c1 = params[m].c1;
-        k_params.h_view(i,j,k).c2 = params[m].c2;
-        k_params.h_view(i,j,k).c3 = params[m].c3;
-        k_params.h_view(i,j,k).c4 = params[m].c4;
+	m = elem2param[i-1][j-1][k-1];
+	k_params.h_view(i,j,k).powerm = params[m].powerm;
+	k_params.h_view(i,j,k).gamma = params[m].gamma;
+	k_params.h_view(i,j,k).lam3 = params[m].lam3;
+	k_params.h_view(i,j,k).c = params[m].c;
+	k_params.h_view(i,j,k).d = params[m].d;
+	k_params.h_view(i,j,k).h = params[m].h;
+	k_params.h_view(i,j,k).powern = params[m].powern;
+	k_params.h_view(i,j,k).beta = params[m].beta;
+	k_params.h_view(i,j,k).lam2 = params[m].lam2;
+	k_params.h_view(i,j,k).bigb = params[m].bigb;
+	k_params.h_view(i,j,k).bigr = params[m].bigr;
+	k_params.h_view(i,j,k).bigd = params[m].bigd;
+	k_params.h_view(i,j,k).lam1 = params[m].lam1;
+	k_params.h_view(i,j,k).biga = params[m].biga;
+	k_params.h_view(i,j,k).cutsq = params[m].cutsq;
+	k_params.h_view(i,j,k).c1 = params[m].c1;
+	k_params.h_view(i,j,k).c2 = params[m].c2;
+	k_params.h_view(i,j,k).c3 = params[m].c3;
+	k_params.h_view(i,j,k).c4 = params[m].c4;
       }
 
   k_params.template modify<LMPHostType>();
diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp
index 3406c607f34407e8da79a76b77b0bf592ccff375..95da030b56fe7244bcae4daad21a3a8adedd33ab 100644
--- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp
+++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp
@@ -102,7 +102,6 @@ void PairTersoffMODKokkos<DeviceType>::init_style()
   if (neighflag == FULL || neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
     if (neighflag == FULL)
       neighbor->requests[irequest]->ghost = 1;
     else
@@ -125,27 +124,27 @@ void PairTersoffMODKokkos<DeviceType>::setup_params()
   for (i = 1; i <= n; i++)
     for (j = 1; j <= n; j++)
       for (k = 1; k <= n; k++) {
-        m = elem2param[map[i]][map[j]][map[k]];
-        k_params.h_view(i,j,k).powerm = params[m].powerm;
-        k_params.h_view(i,j,k).lam3 = params[m].lam3;
-        k_params.h_view(i,j,k).h = params[m].h;
-        k_params.h_view(i,j,k).powern = params[m].powern;
-        k_params.h_view(i,j,k).beta = params[m].beta;
-        k_params.h_view(i,j,k).lam2 = params[m].lam2;
-        k_params.h_view(i,j,k).bigb = params[m].bigb;
-        k_params.h_view(i,j,k).bigr = params[m].bigr;
-        k_params.h_view(i,j,k).bigd = params[m].bigd;
-        k_params.h_view(i,j,k).lam1 = params[m].lam1;
-        k_params.h_view(i,j,k).biga = params[m].biga;
-        k_params.h_view(i,j,k).cutsq = params[m].cutsq;
-        k_params.h_view(i,j,k).c1 = params[m].c1;
-        k_params.h_view(i,j,k).c2 = params[m].c2;
-        k_params.h_view(i,j,k).c3 = params[m].c3;
-        k_params.h_view(i,j,k).c4 = params[m].c4;
-        k_params.h_view(i,j,k).c5 = params[m].c5;
-        k_params.h_view(i,j,k).ca1 = params[m].ca1;
-        k_params.h_view(i,j,k).ca4 = params[m].ca4;
-        k_params.h_view(i,j,k).powern_del = params[m].powern_del;
+	m = elem2param[i-1][j-1][k-1];
+	k_params.h_view(i,j,k).powerm = params[m].powerm;
+	k_params.h_view(i,j,k).lam3 = params[m].lam3;
+	k_params.h_view(i,j,k).h = params[m].h;
+	k_params.h_view(i,j,k).powern = params[m].powern;
+	k_params.h_view(i,j,k).beta = params[m].beta;
+	k_params.h_view(i,j,k).lam2 = params[m].lam2;
+	k_params.h_view(i,j,k).bigb = params[m].bigb;
+	k_params.h_view(i,j,k).bigr = params[m].bigr;
+	k_params.h_view(i,j,k).bigd = params[m].bigd;
+	k_params.h_view(i,j,k).lam1 = params[m].lam1;
+	k_params.h_view(i,j,k).biga = params[m].biga;
+	k_params.h_view(i,j,k).cutsq = params[m].cutsq;
+	k_params.h_view(i,j,k).c1 = params[m].c1;
+	k_params.h_view(i,j,k).c2 = params[m].c2;
+	k_params.h_view(i,j,k).c3 = params[m].c3;
+	k_params.h_view(i,j,k).c4 = params[m].c4;
+	k_params.h_view(i,j,k).c5 = params[m].c5;
+	k_params.h_view(i,j,k).ca1 = params[m].ca1;
+	k_params.h_view(i,j,k).ca4 = params[m].ca4;
+	k_params.h_view(i,j,k).powern_del = params[m].powern_del;
       }
 
   k_params.template modify<LMPHostType>();
diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp
index 07341911bd9380d9ac2d7cc477cd0e6515ff4684..a9cc1d17305e7c26cf0efad81b4cf6dc88e1226f 100644
--- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp
+++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp
@@ -113,7 +113,6 @@ void PairTersoffZBLKokkos<DeviceType>::init_style()
   if (neighflag == FULL || neighflag == HALF || neighflag == HALFTHREAD) {
     neighbor->requests[irequest]->full = 1;
     neighbor->requests[irequest]->half = 0;
-    neighbor->requests[irequest]->full_cluster = 0;
     if (neighflag == FULL)
       neighbor->requests[irequest]->ghost = 1;
     else
@@ -136,30 +135,30 @@ void PairTersoffZBLKokkos<DeviceType>::setup_params()
   for (i = 1; i <= n; i++)
     for (j = 1; j <= n; j++)
       for (k = 1; k <= n; k++) {
-        m = elem2param[map[i]][map[j]][map[k]];
-        k_params.h_view(i,j,k).powerm = params[m].powerm;
-        k_params.h_view(i,j,k).gamma = params[m].gamma;
-        k_params.h_view(i,j,k).lam3 = params[m].lam3;
-        k_params.h_view(i,j,k).c = params[m].c;
-        k_params.h_view(i,j,k).d = params[m].d;
-        k_params.h_view(i,j,k).h = params[m].h;
-        k_params.h_view(i,j,k).powern = params[m].powern;
-        k_params.h_view(i,j,k).beta = params[m].beta;
-        k_params.h_view(i,j,k).lam2 = params[m].lam2;
-        k_params.h_view(i,j,k).bigb = params[m].bigb;
-        k_params.h_view(i,j,k).bigr = params[m].bigr;
-        k_params.h_view(i,j,k).bigd = params[m].bigd;
-        k_params.h_view(i,j,k).lam1 = params[m].lam1;
-        k_params.h_view(i,j,k).biga = params[m].biga;
-        k_params.h_view(i,j,k).cutsq = params[m].cutsq;
-        k_params.h_view(i,j,k).c1 = params[m].c1;
-        k_params.h_view(i,j,k).c2 = params[m].c2;
-        k_params.h_view(i,j,k).c3 = params[m].c3;
-        k_params.h_view(i,j,k).c4 = params[m].c4;
-        k_params.h_view(i,j,k).Z_i = params[m].Z_i;
-        k_params.h_view(i,j,k).Z_j = params[m].Z_j;
-        k_params.h_view(i,j,k).ZBLcut = params[m].ZBLcut;
-        k_params.h_view(i,j,k).ZBLexpscale = params[m].ZBLexpscale;
+	m = elem2param[i-1][j-1][k-1];
+	k_params.h_view(i,j,k).powerm = params[m].powerm;
+	k_params.h_view(i,j,k).gamma = params[m].gamma;
+	k_params.h_view(i,j,k).lam3 = params[m].lam3;
+	k_params.h_view(i,j,k).c = params[m].c;
+	k_params.h_view(i,j,k).d = params[m].d;
+	k_params.h_view(i,j,k).h = params[m].h;
+	k_params.h_view(i,j,k).powern = params[m].powern;
+	k_params.h_view(i,j,k).beta = params[m].beta;
+	k_params.h_view(i,j,k).lam2 = params[m].lam2;
+	k_params.h_view(i,j,k).bigb = params[m].bigb;
+	k_params.h_view(i,j,k).bigr = params[m].bigr;
+	k_params.h_view(i,j,k).bigd = params[m].bigd;
+	k_params.h_view(i,j,k).lam1 = params[m].lam1;
+	k_params.h_view(i,j,k).biga = params[m].biga;
+	k_params.h_view(i,j,k).cutsq = params[m].cutsq;
+	k_params.h_view(i,j,k).c1 = params[m].c1;
+	k_params.h_view(i,j,k).c2 = params[m].c2;
+	k_params.h_view(i,j,k).c3 = params[m].c3;
+	k_params.h_view(i,j,k).c4 = params[m].c4;
+	k_params.h_view(i,j,k).Z_i = params[m].Z_i;
+	k_params.h_view(i,j,k).Z_j = params[m].Z_j;
+	k_params.h_view(i,j,k).ZBLcut = params[m].ZBLcut;
+	k_params.h_view(i,j,k).ZBLexpscale = params[m].ZBLexpscale;
       }
 
   k_params.template modify<LMPHostType>();
diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h
index 19b3204973bb31ba4e9a22e4848ecbe7f903e4ef..a8c9520298fca55620f0889907bda3a2b477dc39 100644
--- a/src/KOKKOS/region_block_kokkos.h
+++ b/src/KOKKOS/region_block_kokkos.h
@@ -33,10 +33,10 @@ template<class DeviceType>
 class RegBlockKokkos : public RegBlock {
   friend class FixPour;
 
- public:
   typedef DeviceType device_type;
   typedef ArrayTypes<DeviceType> AT;
 
+ public:
   RegBlockKokkos(class LAMMPS *, int, char **);
   ~RegBlockKokkos();
   void match_all_kokkos(int, DAT::t_int_1d);
diff --git a/src/finish.cpp b/src/finish.cpp
index 0d767b42cd7c1c73068cbb0d2da6ae59c1591269..f305d04346bd864bcc70cacd719252d23f237fac 100644
--- a/src/finish.cpp
+++ b/src/finish.cpp
@@ -630,22 +630,17 @@ void Finish::end(int flag)
     // count neighbors in that list for stats purposes
     // allow it to be Kokkos neigh list as well
 
-    for (m = 0; m < neighbor->old_nrequest; m++) {
+    for (m = 0; m < neighbor->old_nrequest; m++)
       if ((neighbor->old_requests[m]->half ||
            neighbor->old_requests[m]->gran ||
            neighbor->old_requests[m]->respaouter ||
            neighbor->old_requests[m]->half_from_full) &&
           neighbor->old_requests[m]->skip == 0 &&
-          neighbor->lists[m] && neighbor->lists[m]->numneigh) {
-        if (!neighbor->lists[m] && lmp->kokkos &&
-            lmp->kokkos->neigh_list_kokkos(m)) break;
-        else break;
-      }
-    }
+          neighbor->lists[m] && neighbor->lists[m]->numneigh) break;
 
     nneigh = 0;
     if (m < neighbor->old_nrequest) {
-      if (neighbor->lists[m]) {
+      if (!neighbor->lists[m]->kokkos) {
         int inum = neighbor->lists[m]->inum;
         int *ilist = neighbor->lists[m]->ilist;
         int *numneigh = neighbor->lists[m]->numneigh;
@@ -675,23 +670,19 @@ void Finish::end(int flag)
     // count neighbors in that list for stats purposes
     // allow it to be Kokkos neigh list as well
 
-    for (m = 0; m < neighbor->old_nrequest; m++) {
+    for (m = 0; m < neighbor->old_nrequest; m++)
       if (neighbor->old_requests[m]->full &&
-          neighbor->old_requests[m]->skip == 0) {
-        if (lmp->kokkos && lmp->kokkos->neigh_list_kokkos(m)) break;
-        else break;
-      }
-    }
+          neighbor->old_requests[m]->skip == 0) break;
 
     nneighfull = 0;
     if (m < neighbor->old_nrequest) {
-      if (neighbor->lists[m] && neighbor->lists[m]->numneigh) {
+      if (!neighbor->lists[m]->kokkos && neighbor->lists[m]->numneigh) {
         int inum = neighbor->lists[m]->inum;
         int *ilist = neighbor->lists[m]->ilist;
         int *numneigh = neighbor->lists[m]->numneigh;
         for (i = 0; i < inum; i++)
           nneighfull += numneigh[ilist[i]];
-      } else if (!neighbor->lists[m] && lmp->kokkos)
+      } else if (lmp->kokkos)
           nneighfull = lmp->kokkos->neigh_count(m);
 
       tmp = nneighfull;
@@ -865,7 +856,7 @@ void mpi_timings(const char *label, Timer *t, enum Timer::ttype tt,
   time_cpu = tmp/nprocs*100.0;
 
   // % variance from the average as measure of load imbalance
-  if ((time_sq/time - time) > 1.0e-10)
+  if (time > 1.0e-10)
     time_sq = sqrt(time_sq/time - time)*100.0;
   else
     time_sq = 0.0;
@@ -917,7 +908,7 @@ void omp_times(FixOMP *fix, const char *label, enum Timer::ttype which,
   time_std /= nthreads;
   time_total /= nthreads;
 
-  if ((time_std/time_avg -time_avg) > 1.0e-10)
+  if (time_avg > 1.0e-10)
     time_std = sqrt(time_std/time_avg - time_avg)*100.0;
   else
     time_std = 0.0;
diff --git a/src/neigh_list.cpp b/src/neigh_list.cpp
index dfab9b023ac6c3b1606886fd30bd2cb2e8bf78f6..f8d496fc6bd3934fffb71111be35435c81d6a721 100644
--- a/src/neigh_list.cpp
+++ b/src/neigh_list.cpp
@@ -67,6 +67,11 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp)
   ipage = NULL;
   dpage = NULL;
 
+  // Kokkos package
+
+  kokkos = 0;
+  execution_space = Host;
+
   // USER-DPD package
 
   ndxAIR_ssa = NULL;
diff --git a/src/neigh_list.h b/src/neigh_list.h
index d3bde212c25c1294686eb0a48ed1fdfc4c071a7a..3b6a4d6760f96aa77eaf76d0fc02167016ef22b4 100644
--- a/src/neigh_list.h
+++ b/src/neigh_list.h
@@ -69,6 +69,11 @@ class NeighList : protected Pointers {
   NeighList *listcopy;          // me = copy list, point to list I copy from
   NeighList *listskip;          // me = skip list, point to list I skip from
 
+  // Kokkos package
+
+  int kokkos;                   // 1 if list stores Kokkos data
+  ExecutionSpace execution_space;
+
   // USER-DPD package and Shardlow Splitting Algorithm (SSA) support
 
   uint16_t (*ndxAIR_ssa)[8]; // for each atom, last neighbor index of each AIR
@@ -80,7 +85,6 @@ class NeighList : protected Pointers {
   void post_constructor(class NeighRequest *);
   void setup_pages(int, int);           // setup page data structures
   void grow(int,int);                   // grow all data structs
-  void stencil_allocate(int, int);      // allocate stencil arrays
   void print_attributes();              // debug routine
   int get_maxlocal() {return maxatom;}
   bigint memory_usage();
diff --git a/src/neighbor.cpp b/src/neighbor.cpp
index e58fc7126eae2fd94209d8a509e911a12436bee4..f27376cb2a2819b8e4d72a900a50df21c17ba5af 100644
--- a/src/neighbor.cpp
+++ b/src/neighbor.cpp
@@ -621,8 +621,7 @@ void Neighbor::init_pair()
   delete [] neigh_stencil;
   delete [] neigh_pair;
 
-  if (lmp->kokkos) nlist = init_lists_kokkos();
-  else nlist = nrequest;
+  nlist = nrequest;
   
   lists = new NeighList*[nrequest];
   neigh_bin = new NBin*[nrequest];
@@ -634,11 +633,10 @@ void Neighbor::init_pair()
   // wait to allocate initial pages until copy lists are detected
   
   for (i = 0; i < nrequest; i++) {
-    if (requests[i]->kokkos_host || requests[i]->kokkos_device) {
-      lists[i] = NULL;
-      continue;
-    }
-    lists[i] = new NeighList(lmp);
+    if (requests[i]->kokkos_host || requests[i]->kokkos_device)
+      create_kokkos_list(i);
+    else
+      lists[i] = new NeighList(lmp);
     lists[i]->index = i;
     
     if (requests[i]->pair) {
@@ -680,10 +678,8 @@ void Neighbor::init_pair()
   //       would be useful when reax/c used in hybrid mode, e.g. with airebo
 
   for (i = 0; i < nrequest; i++) {
-    if (lists[i] == NULL) continue;   // Kokkos
     if (requests[i]->pair && requests[i]->half && requests[i]->newton != 2) {
       for (j = 0; j < nrequest; j++) {
-        if (lists[j] == NULL) continue;   // Kokkos
         if (requests[j]->full && requests[j]->occasional == 0 &&
             !requests[j]->skip && !requests[j]->copy) break;
       }
@@ -708,10 +704,8 @@ void Neighbor::init_pair()
   // for 1st or 2nd check, parent can be copy list or pair or fix
   
   for (i = 0; i < nrequest; i++) {
-    if (lists[i] == NULL) continue;   // Kokkos
     if (!requests[i]->fix && !requests[i]->compute) continue;
     for (j = 0; j < nrequest; j++) {
-      if (lists[j] == NULL) continue;   // Kokkos
       if (requests[i]->half && requests[j]->pair && 
           !requests[j]->skip && requests[j]->half && !requests[j]->copy)
         break;
@@ -733,7 +727,6 @@ void Neighbor::init_pair()
       continue;
     }
     for (j = 0; j < nrequest; j++) {
-      if (lists[j] == NULL) continue;   // Kokkos
       if (requests[i]->half && requests[j]->pair &&
           !requests[j]->skip && requests[j]->full && !requests[j]->copy)
         break;
@@ -844,7 +837,6 @@ void Neighbor::init_pair()
   
   int dnummax = 0;
   for (i = 0; i < nlist; i++) {
-    if (lists[i] == NULL) continue;   // Kokkos
     if (lists[i]->copy) continue;
     lists[i]->setup_pages(pgsize,oneatom);
     dnummax = MAX(dnummax,lists[i]->dnum);
@@ -864,14 +856,8 @@ void Neighbor::init_pair()
   // also Kokkos list initialization
   
   int maxatom = atom->nmax;
-  for (i = 0; i < nlist; i++) {
-    if (lists[i]) {
-      if (neigh_pair[i] && !lists[i]->copy) lists[i]->grow(maxatom,maxatom);
-    } else {
-      init_list_flags1_kokkos(i);
-      init_list_grow_kokkos(i);
-    }
-  }
+  for (i = 0; i < nlist; i++)
+    if (neigh_pair[i] && !lists[i]->copy) lists[i]->grow(maxatom,maxatom);
 
   // plist = indices of perpetual NPair classes
   //         perpetual = non-occasional, re-built at every reneighboring
@@ -885,10 +871,8 @@ void Neighbor::init_pair()
   plist = new int[nlist];
 
   for (i = 0; i < nlist; i++) {
-    if (lists[i]) {
-      if (lists[i]->occasional == 0 && lists[i]->pair_method)
-        plist[npair_perpetual++] = i;
-    } else init_list_flags2_kokkos(i);
+    if (lists[i]->occasional == 0 && lists[i]->pair_method)
+      plist[npair_perpetual++] = i;
   }
   
   for (i = 0; i < nstencil; i++) {
@@ -910,7 +894,6 @@ void Neighbor::init_pair()
   while (!done) {
     done = 1;
     for (i = 0; i < npair_perpetual; i++) {
-      if (!lists[plist[i]]) continue;    // Kokkos check
       ptr = NULL;
       if (lists[plist[i]]->listcopy) ptr = lists[plist[i]]->listcopy;
       if (lists[plist[i]]->listskip) ptr = lists[plist[i]]->listskip;
@@ -1154,15 +1137,14 @@ void Neighbor::print_pairwise_info()
         else if (requests[i]->respamiddle) kind = "respa/middle";
         else if (requests[i]->respaouter) kind = "respa/outer";
         else if (requests[i]->half_from_full) kind = "half/from/full";
-        else if (requests[i]->full_cluster) kind = "full/cluster";    // Kokkos
-        fprintf(out,"      kind: %s",kind);
-        
         if (requests[i]->occasional) fprintf(out,", occasional");
         else fprintf(out,", perpetual");
         if (requests[i]->ghost) fprintf(out,", ghost");
         if (requests[i]->ssa) fprintf(out,", ssa");
         if (requests[i]->omp) fprintf(out,", omp");
         if (requests[i]->intel) fprintf(out,", intel");
+        if (requests[i]->kokkos_device) fprintf(out,", kokkos_device");
+        if (requests[i]->kokkos_host) fprintf(out,", kokkos_host");
         if (requests[i]->copy) 
           fprintf(out,", copy from (%d)",requests[i]->otherlist+1);
         if (requests[i]->skip)
@@ -1237,13 +1219,17 @@ int Neighbor::choose_bin(NeighRequest *rq)
   // flags for settings the request + system requires of NBin class
   //   ssaflag = no/yes ssa request
   //   intelflag = no/yes intel request
+  //   kokkos_device_flag = no/yes kokkos device request
+  //   kokkos_host_flag = no/yes kokkos host request
 
-  int ssaflag,intelflag;
+  int ssaflag,intelflag,kokkos_device_flag,kokkos_host_flag;
 
-  ssaflag = intelflag = 0;
+  ssaflag = intelflag = kokkos_device_flag = kokkos_host_flag = 0;
 
   if (rq->ssa) ssaflag = NB_SSA;
   if (rq->intel) intelflag = NB_INTEL;
+  if (rq->kokkos_device) kokkos_device_flag = NB_KOKKOS_DEVICE;
+  if (rq->kokkos_host) kokkos_host_flag = NB_KOKKOS_HOST;
 
   // use flags to match exactly one of NBin class masks, bit by bit
 
@@ -1254,6 +1240,8 @@ int Neighbor::choose_bin(NeighRequest *rq)
 
     if (ssaflag != (mask & NB_SSA)) continue;
     if (intelflag != (mask & NB_INTEL)) continue;
+    if (kokkos_device_flag != (mask & NB_KOKKOS_DEVICE)) continue;
+    if (kokkos_host_flag != (mask & NB_KOKKOS_HOST)) continue;
 
     return i+1;
   }
@@ -1308,6 +1296,7 @@ int Neighbor::choose_stencil(NeighRequest *rq)
   else if (rq->newton == 1) newtflag = 1;
   else if (rq->newton == 2) newtflag = 0;
 
+
   // use flags to match exactly one of NStencil class masks, bit by bit
   // exactly one of halfflag,fullflag is set and thus must match
 
@@ -1381,16 +1370,18 @@ int Neighbor::choose_pair(NeighRequest *rq)
   //   ssaflag = no/yes request
   //   ompflag = no/yes omp request
   //   intelflag = no/yes intel request
+  //   kokkos_device_flag = no/yes Kokkos device request
+  //   kokkos_host_flag = no/yes Kokkos host request
   //   newtflag = newton off/on request
   //   style = NSQ/BIN/MULTI neighbor style
   //   triclinic = orthgonal/triclinic box
 
   int copyflag,skipflag,halfflag,fullflag,halffullflag,sizeflag,respaflag,
-    ghostflag,off2onflag,onesideflag,ssaflag,ompflag,intelflag;
+    ghostflag,off2onflag,onesideflag,ssaflag,ompflag,intelflag,kokkos_device_flag,kokkos_host_flag;
 
   copyflag = skipflag = halfflag = fullflag = halffullflag = sizeflag = 
     ghostflag = respaflag = off2onflag = onesideflag = ssaflag = 
-    ompflag = intelflag = 0;
+    ompflag = intelflag = kokkos_device_flag = kokkos_host_flag = 0;
 
   if (rq->copy) copyflag = NP_COPY;
   if (rq->skip) skipflag = NP_SKIP;
@@ -1420,6 +1411,8 @@ int Neighbor::choose_pair(NeighRequest *rq)
   if (rq->ssa) ssaflag = NP_SSA;
   if (rq->omp) ompflag = NP_OMP;
   if (rq->intel) intelflag = NP_INTEL;
+  if (rq->kokkos_device) kokkos_device_flag = NP_KOKKOS_DEVICE;
+  if (rq->kokkos_host) kokkos_host_flag = NP_KOKKOS_HOST;
 
   int newtflag;
   if (rq->newton == 0 && newton_pair) newtflag = 1;
@@ -1460,6 +1453,8 @@ int Neighbor::choose_pair(NeighRequest *rq)
     if (ssaflag != (mask & NP_SSA)) continue;
     if (ompflag != (mask & NP_OMP)) continue;
     if (intelflag != (mask & NP_INTEL)) continue;
+    if (kokkos_device_flag != (mask & NP_KOKKOS_DEVICE)) continue;
+    if (kokkos_host_flag != (mask & NP_KOKKOS_HOST)) continue;
 
     if (style == NSQ && !(mask & NP_NSQ)) continue;
     if (style == BIN && !(mask & NP_BIN)) continue;
@@ -1802,6 +1797,7 @@ void Neighbor::build_one(class NeighList *mylist, int preflag)
     ns->create();
   }
 
+
   // build the list
 
   np->build_setup();
diff --git a/src/neighbor.h b/src/neighbor.h
index 9655cca54501439437f10055a159c9d20d6fffa9..eb603ad84f70fd2fc4ccbac8fd2f5466a42aa8b1 100644
--- a/src/neighbor.h
+++ b/src/neighbor.h
@@ -201,7 +201,7 @@ class Neighbor : protected Pointers {
 
   void init_styles();
   void init_pair();
-  void init_topology();
+  virtual void init_topology();
 
   void print_pairwise_info();
   void requests_new2old();
@@ -220,18 +220,17 @@ class Neighbor : protected Pointers {
   int copymode;
 
   virtual void init_cutneighsq_kokkos(int) {}
-  virtual int init_lists_kokkos() {return 0;}
-  virtual void init_list_flags1_kokkos(int) {}
-  virtual void init_list_flags2_kokkos(int) {}
+  virtual void create_kokkos_list(int) {}
   virtual void init_ex_type_kokkos(int) {}
   virtual void init_ex_bit_kokkos() {}
   virtual void init_ex_mol_bit_kokkos() {}
-  virtual void init_list_grow_kokkos(int) {}
 };
 
 namespace NeighConst {
   static const int NB_SSA     = 1<<0;
   static const int NB_INTEL   = 1<<1;
+  static const int NB_KOKKOS_DEVICE  = 1<<2;
+  static const int NB_KOKKOS_HOST    = 1<<3;
 
   static const int NS_HALF    = 1<<0;
   static const int NS_FULL    = 1<<1;
@@ -266,6 +265,8 @@ namespace NeighConst {
   static const int NP_NEWTOFF  = 1<<17;
   static const int NP_ORTHO    = 1<<18;
   static const int NP_TRI      = 1<<19;
+  static const int NP_KOKKOS_DEVICE = 1<<20;
+  static const int NP_KOKKOS_HOST   = 1<<21;
 }
 
 }
diff --git a/src/npair.h b/src/npair.h
index 70fcc5c4527d7781d14cf73768aaf5269a62e6d9..a6440faddff9675346dff5f36c7c127fd8fa7a24 100644
--- a/src/npair.h
+++ b/src/npair.h
@@ -31,7 +31,7 @@ class NPair : protected Pointers {
 
   NPair(class LAMMPS *);
   virtual ~NPair() {}
-  void copy_neighbor_info();
+  virtual void copy_neighbor_info();
   void build_setup();
   virtual void build(class NeighList *) = 0;
 
@@ -94,8 +94,8 @@ class NPair : protected Pointers {
   // methods for all NPair variants
 
   void copy_bin_setup_info();
-  void copy_bin_info();
-  void copy_stencil_info();
+  virtual void copy_bin_info();
+  virtual void copy_stencil_info();
 
   int exclusion(int, int, int,
                 int, int *, tagint *) const;   // test for pair exclusion
diff --git a/src/nstencil.h b/src/nstencil.h
index b9c6dd58fbd97fbbce65fc8d7087bfa8dd73f759..8672584a19b4cd9e7897b829d70128e1d6c9d201 100644
--- a/src/nstencil.h
+++ b/src/nstencil.h
@@ -37,7 +37,7 @@ class NStencil : protected Pointers {
   NStencil(class LAMMPS *);
   virtual ~NStencil();
   void copy_neighbor_info();
-  void create_setup();
+  virtual void create_setup();
   bigint memory_usage();
 
   virtual void create() = 0;