diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt
index 47643569e66f38409c9e7534f7dffe37da9de570..5a5de9ac9bb8d09d6a84ea42efab7d4059f4b21a 100644
--- a/doc/src/Section_start.txt
+++ b/doc/src/Section_start.txt
@@ -455,8 +455,7 @@ and related PPPM operations are somewhat insensitive to floating point
 truncation errors and thus do not always need to be performed in
 double precision.  Using the -DFFT_SINGLE setting trades off a little
 accuracy for reduced memory use and parallel communication costs for
-transposing 3d FFT data.  Note that single precision FFTs have only
-been tested with the FFTW3, FFTW2, MKL, and KISS FFT options.
+transposing 3d FFT data.
 
 Step 7 :h6
 
diff --git a/doc/src/pair_buck.txt b/doc/src/pair_buck.txt
index 1b9f333376afd295143f5f5dfdda163b4c6a6e99..49161404c3dd370f97f922079864dd5eeddebd9b 100644
--- a/doc/src/pair_buck.txt
+++ b/doc/src/pair_buck.txt
@@ -75,7 +75,7 @@ Lennard-Jones 12/6) given by
 :c,image(Eqs/pair_buck.jpg)
 
 where rho is an ionic-pair dependent length parameter, and Rc is the
-cutoff on both terms.
+cutoff on both terms. 
 
 The styles with {coul/cut} or {coul/long} or {coul/msm} add a
 Coulombic term as described for the "lj/cut"_pair_lj.html pair styles.
@@ -120,6 +120,9 @@ cutoff (distance units)
 cutoff2 (distance units) :ul
 
 The second coefficient, rho, must be greater than zero.
+The coefficients A, rho, and C can be written as analytical expressions
+of epsilon and sigma, in analogy to the Lennard-Jones potential
+"(Khrapak)"_#Khrapak.
 
 The latter 2 coefficients are optional.  If not specified, the global
 A,C and Coulombic cutoffs are used.  If only one cutoff is specified,
@@ -127,7 +130,6 @@ it is used as the cutoff for both A,C and Coulombic interactions for
 this type pair.  If both coefficients are specified, they are used as
 the A,C and Coulombic cutoffs for this type pair.  You cannot specify
 2 cutoffs for style {buck}, since it has no Coulombic terms.
-
 For {buck/coul/long} only the LJ cutoff can be specified since a
 Coulombic cutoff cannot be specified for an individual I,J type pair.
 All type pairs use the same global Coulombic cutoff specified in the
@@ -194,3 +196,6 @@ only enabled if LAMMPS was built with that package.  See the
 "pair_coeff"_pair_coeff.html, "pair_style born"_pair_born.html
 
 [Default:] none
+
+:link(Khrapak)
+[(Khrapak)] Khrapak, Chaudhuri, and Morfill, J Chem Phys, 134, 054120 (2011).
diff --git a/lib/voronoi/Install.py b/lib/voronoi/Install.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ae08917e5bbde5c923617df136cd11e799ffbbc
--- /dev/null
+++ b/lib/voronoi/Install.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+
+# install.py tool to download, unpack, build, and link to the Voro++ library
+# used to automate the steps described in the README file in this dir
+
+import sys,os,re,urllib,commands
+
+# help message
+
+help = """
+Syntax: install.py -v version -g gdir [gname] -b bdir -l ldir
+  specify one or more options, order does not matter
+  gdir,bdir,ldir can be paths relative to lib/latte, full paths, or contain ~
+  -v = version of Voro++ to download and build
+       default = voro++-0.4.6 (current as of Jan 2015)
+  -g = grab (download) from math.lbl.gov/voro++ website
+       unpack tarfile in gdir to produce version dir (e.g. voro++-0.4.6)
+       if optional gname specified, rename version dir to gname within gdir
+  -b = build Voro++, bdir = Voro++ home directory
+       note that bdir must include the version suffix unless renamed
+  -l = create 2 softlinks (includelink,liblink)
+         in lib/voronoi to src dir of ldir = Voro++ home directory
+       note that ldir must include the version suffix unless renamed
+"""
+
+# settings
+
+version = "voro++-0.4.6"
+url = "http://math.lbl.gov/voro++/download/dir/%s.tar.gz" % version
+
+# print error message or help
+
+def error(str=None):
+  if not str: print help
+  else: print "ERROR",str
+  sys.exit()
+
+# expand to full path name
+# process leading '~' or relative path
+  
+def fullpath(path):
+  return os.path.abspath(os.path.expanduser(path))
+  
+# parse args
+
+args = sys.argv[1:]
+nargs = len(args)
+if nargs == 0: error()
+
+grabflag = 0
+buildflag = 0
+linkflag = 0
+
+iarg = 0
+while iarg < nargs:
+  if args[iarg] == "-v":
+    if iarg+2 > nargs: error()
+    version = args[iarg+1]
+    iarg += 2  
+  elif args[iarg] == "-g":
+    if iarg+2 > nargs: error()
+    grabflag = 1
+    grabdir = args[iarg+1]
+    grabname = None
+    if iarg+2 < nargs and args[iarg+2][0] != '-':
+      grabname = args[iarg+2]
+      iarg += 1
+    iarg += 2
+  elif args[iarg] == "-b":
+    if iarg+2 > nargs: error()
+    buildflag = 1
+    builddir = args[iarg+1]
+    iarg += 2
+  elif args[iarg] == "-l":
+    if iarg+2 > nargs: error()
+    linkflag = 1
+    linkdir = args[iarg+1]
+    iarg += 2
+  else: error()
+
+# download and unpack Voro++ tarball
+
+if grabflag:
+  print "Downloading Voro++ ..."
+  grabdir = fullpath(grabdir)
+  if not os.path.isdir(grabdir): error("Grab directory does not exist")
+  urllib.urlretrieve(url,"%s/%s.tar.gz" % (grabdir,version))
+  
+  print "Unpacking Voro++ tarball ..."
+  tardir = "%s/%s" % (grabdir,version)
+  if os.path.exists(tardir): commands.getoutput("rm -rf %s" % tardir)
+  cmd = "cd %s; tar zxvf %s.tar.gz" % (grabdir,version)
+  txt = commands.getoutput(cmd)
+  print tardir,grabdir,grabname
+  if grabname: os.rename(tardir,"%s/%s" % (grabdir,grabname))
+
+# build Voro++
+
+if buildflag:
+  print "Building Voro++ ..."
+  cmd = "cd %s; make" % builddir
+  txt = commands.getoutput(cmd)
+  print txt
+
+# create 2 links in lib/voronoi to Voro++ src dir
+
+if linkflag:
+  print "Creating links to Voro++ include and lib files"
+  if os.path.isfile("includelink") or os.path.islink("includelink"):
+    os.remove("includelink")
+  if os.path.isfile("liblink") or os.path.islink("liblink"):
+    os.remove("liblink")
+  cmd = "ln -s %s/src includelink" % linkdir
+  commands.getoutput(cmd)
+  cmd = "ln -s %s/src liblink" % linkdir
+  commands.getoutput(cmd)
diff --git a/lib/voronoi/README b/lib/voronoi/README
index 62acb30a5ad9e50587a0caa249b7a5c2bad52050..2507a9bae40d363380ce99404e12291e7986c933 100644
--- a/lib/voronoi/README
+++ b/lib/voronoi/README
@@ -9,8 +9,8 @@ Laboratory.
 -----------------
 
 You must perform the following steps yourself, or you can use the
-install.py Python script to automate any or all steps of the process.
-Type "python install.py" for instructions.
+Install.py Python script to automate any or all steps of the process.
+Type "python Install.py" for instructions.
 
 1.  Download Voro++ at http://math.lbl.gov/voro++/download
     either as a tarball or via SVN, and unpack the
diff --git a/lib/voronoi/install.py b/lib/voronoi/install.py
deleted file mode 100644
index 645d1675648fd281c3d3ac5905d29a0c132e66f1..0000000000000000000000000000000000000000
--- a/lib/voronoi/install.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!usr/local/python
-
-# install.py tool to download, unpack, build, and link to the Voro++ library
-# used to automate the steps described in the README file in this dir
-
-import sys,os,re,urllib,commands
-
-help = """
-Syntax: install.py -d dir -v version -g -b -i installdir -l incdir libdir
-        specify one or more options, order does not matter
-        -d = dir to download tarball to, unpack tarball in, perform build in
-             dir will be created if it doesn't exist (only last level)
-             default = this dir
-        -v = version of Voro++ to download and work with
-             default = voro++-0.4.6 (current as of Jan 2015)
-        -g = download (grab) tarball from
-             http://math.lbl.gov/voro++/download/dir/version
-        -b = build Voro++ by invoking "make" in its home dir
-             no default
-        -i = install Voro++ by invoking "make install" in its home dir
-             installdir arg is optional:
-               if not specified, installs at PREFIX defined in config.mk file
-               if specified, will overwrite PREFIX and install there
-             if PREFIX starts with /usr, will invoke "sudo make install"
-        -l = create two links to incdir and libdir
-             incdir and libdir are optional (specify neither or both):
-               if specified, includelink and liblink are to those two dirs
-                 these are dirs where Voro++ include files and lib file are
-               if not specified and no install, links are to Voro++ src dir
-               if not specified and install performed,
-                 links are to include and lib dirs under PREFIX
-"""
-
-def error():
-  print help
-  sys.exit()
-  
-# parse args
-
-args = sys.argv
-
-if len(args) == 1: error()
-
-dir = "."
-version = "voro++-0.4.6"
-grabflag = 0
-buildflag = 0
-installflag = 0
-linkflag = 0
-
-iarg = 1
-while iarg < len(args):
-  if args[iarg] == "-d":
-    if iarg+2 > len(args): error()
-    dir = args[iarg+1]
-    iarg += 2  
-  elif args[iarg] == "-v":
-    if iarg+2 > len(args): error()
-    version = args[iarg+1]
-    iarg += 2  
-  elif args[iarg] == "-g":
-    grabflag = 1
-    iarg += 1
-  elif args[iarg] == "-b":
-    buildflag = 1
-    iarg += 1
-  elif args[iarg] == "-i":
-    installflag = 1
-    if iarg+1 == len(args) or args[iarg+1][0] == '-':
-      installdir = ""
-      iarg += 1
-    else:
-      if iarg+2 > len(args): error()
-      installdir = args[iarg+1]
-      iarg += 2  
-  elif args[iarg] == "-l":
-    linkflag = 1
-    if iarg+1 == len(args) or args[iarg+1][0] == '-' or \
-          iarg+2 == len(args) or args[iarg+2][0] == '-':
-      includedir = libdir = ""
-      iarg += 1
-    else:
-      if iarg+3 > len(args): error()
-      includedir = args[iarg+1]
-      libdir = args[iarg+2]
-      iarg += 3
-  else: error()
-
-dir = os.path.abspath(dir)
-url = "http://math.lbl.gov/voro++/download/dir/%s.tar.gz" % version
-
-# create dir if does not exist
-
-if not os.path.isdir(dir):
-  if os.path.isfile(dir):
-    print "ERROR: Dir already exists as file"
-    sys.exit()
-  os.mkdir(dir)
-  if not os.path.isdir(dir):
-    print "ERROR: Unable to create dir"
-    sys.exit()
-
-# download and unpack tarball
-
-if grabflag:
-  print "Downloading Voro++ tarball ..."
-  urllib.urlretrieve(url,"%s/%s.tar.gz" % (dir,version))
-  print "Unpacking Voro++ tarball ..."
-  cmd = "cd %s; tar zxvf %s.tar.gz" % (dir,version)
-  txt = commands.getoutput(cmd)
-
-# build Voro++ in its dir
-
-if buildflag:
-  print "Building Voro++ ..."
-  cmd = "cd %s/%s; make" % (dir,version)
-  txt = commands.getoutput(cmd)
-  print txt
-
-# install Voro++
-# if installdir set, overwrite PREFIX var in its config.mk file
-# if PREFIX var starts with /usr, invoke sudo make install, else make install
-  
-if installflag:
-  print "Installing Voro++ ..."
-  if installdir:
-    txt = open("%s/%s/config.mk" % (dir,version),'r').read()
-    txt = re.sub("PREFIX=.*?\n","PREFIX=%s\n" % installdir,txt)
-    open("%s/%s/config.mk" % (dir,version),'w').write(txt)
-    print "TXT:",txt
-  txt = open("%s/%s/config.mk" % (dir,version),'r').read()
-  var = re.findall("PREFIX=.*?\n",txt)
-  prefix = var[0].split('=')[1].strip()
-  if prefix.startswith("/usr"):
-    cmd = "cd %s/%s; sudo make install" % (dir,version)
-  else:
-    cmd = "cd %s/%s; make install" % (dir,version)
-  txt = commands.getoutput(cmd)
-  print txt
-  
-# create links in this dir to Voro++ include and lib files
-
-if linkflag:
-  print "Creating links to Voro++ include and lib files"
-  if os.path.isfile("includelink") or os.path.islink("includelink"):
-    os.remove("includelink")
-  if os.path.isfile("liblink") or os.path.islink("liblink"):
-    os.remove("liblink")
-  if includedir:
-    cmd = "ln -s %s includelink" % includedir
-    txt = commands.getoutput(cmd)
-    cmd = "ln -s %s liblink" % linkdir
-    txt = commands.getoutput(cmd)
-  elif not installflag:
-    cmd = "ln -s %s/%s/src includelink" % (dir,version)
-    txt = commands.getoutput(cmd)
-    cmd = "ln -s %s/%s/src liblink" % (dir,version)
-    txt = commands.getoutput(cmd)
-  else:
-    cmd = "ln -s %s/include includelink" % prefix
-    txt = commands.getoutput(cmd)
-    cmd = "ln -s %s/lib liblink" % prefix
-    txt = commands.getoutput(cmd)
diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp
index 407c980729d12f16aa579e9442ff6e412142f11f..cba5a0a176087a6125078cc8be950040e58a9454 100644
--- a/src/MC/fix_gcmc.cpp
+++ b/src/MC/fix_gcmc.cpp
@@ -60,7 +60,7 @@ using namespace MathConst;
 // this must be lower than MAXENERGYSIGNAL
 // by a large amount, so that it is still
 // less than total energy when negative
-// energy changes are added to MAXENERGYSIGNAL
+// energy contributions are added to MAXENERGYSIGNAL
 
 #define MAXENERGYTEST 1.0e50
 
@@ -701,6 +701,9 @@ void FixGCMC::pre_exchange()
 
   if (full_flag) {
     energy_stored = energy_full();
+    if (overlap_flag && energy_stored > MAXENERGYTEST)
+        error->warning(FLERR,"Energy of old configuration in "
+                       "fix gcmc is > MAXENERGYTEST.");
 
     if (mode == MOLECULE) {
       for (int i = 0; i < ncycles; i++) {
@@ -778,6 +781,9 @@ void FixGCMC::attempt_atomic_translation()
   if (i >= 0) {
     double **x = atom->x;
     double energy_before = energy(i,ngcmc_type,-1,x[i]);
+    if (overlap_flag && energy_before > MAXENERGYTEST)
+        error->warning(FLERR,"Energy of old configuration in "
+                       "fix gcmc is > MAXENERGYTEST.");
     double rsq = 1.1;
     double rx,ry,rz;
     rx = ry = rz = 0.0;
@@ -998,6 +1004,9 @@ void FixGCMC::attempt_molecule_translation()
   if (translation_molecule == -1) return;
 
   double energy_before_sum = molecule_energy(translation_molecule);
+  if (overlap_flag && energy_before_sum > MAXENERGYTEST)
+    error->warning(FLERR,"Energy of old configuration in "
+                   "fix gcmc is > MAXENERGYTEST.");
 
   double **x = atom->x;
   double rx,ry,rz;
@@ -1095,6 +1104,9 @@ void FixGCMC::attempt_molecule_rotation()
   if (rotation_molecule == -1) return;
 
   double energy_before_sum = molecule_energy(rotation_molecule);
+  if (overlap_flag && energy_before_sum > MAXENERGYTEST)
+    error->warning(FLERR,"Energy of old configuration in "
+                   "fix gcmc is > MAXENERGYTEST.");
 
   int nlocal = atom->nlocal;
   int *mask = atom->mask;
@@ -2170,6 +2182,8 @@ double FixGCMC::molecule_energy(tagint gas_molecule_id)
 
 double FixGCMC::energy_full()
 {
+  int imolecule;
+  
   if (triclinic) domain->x2lamda(atom->nlocal);
   domain->pbc();
   comm->exchange();
@@ -2185,14 +2199,15 @@ double FixGCMC::energy_full()
   // return signal value for energy 
 
   if (overlap_flag) {
+    int overlaptestall;
+    int overlaptest = 0;
     double delx,dely,delz,rsq;
     double **x = atom->x;
     tagint *molecule = atom->molecule;
     int nall = atom->nlocal + atom->nghost;
     for (int i = 0; i < atom->nlocal; i++) {
-      int imolecule = molecule[i];
+      if (mode == MOLECULE) imolecule = molecule[i];
       for (int j = i+1; j < nall; j++) {
-
         if (mode == MOLECULE)
           if (imolecule == molecule[j]) continue;
       
@@ -2201,11 +2216,18 @@ double FixGCMC::energy_full()
         delz = x[i][2] - x[j][2];
         rsq = delx*delx + dely*dely + delz*delz;
       
-        if (rsq < overlap_cutoff) return MAXENERGYSIGNAL;
+        if (rsq < overlap_cutoff) {
+          overlaptest = 1;
+          break;
+        }
       }
+      if (overlaptest) break;
     }
+    MPI_Allreduce(&overlaptest, &overlaptestall, 1,
+                  MPI_INT, MPI_MAX, world);
+    if (overlaptestall) return MAXENERGYSIGNAL;
   }
-  
+
   // clear forces so they don't accumulate over multiple
   // calls within fix gcmc timestep, e.g. for fix shake
   
diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h
index 9b2184dda2810f1dea8ddf1de0a183b9773bc46d..2519c0096534fd046805bafc76f007e7af84ff5c 100644
--- a/src/MC/fix_gcmc.h
+++ b/src/MC/fix_gcmc.h
@@ -106,7 +106,7 @@ class FixGCMC : public Fix {
   double xlo,xhi,ylo,yhi,zlo,zhi;
   double region_xlo,region_xhi,region_ylo,region_yhi,region_zlo,region_zhi;
   double region_volume;
-  double energy_stored;
+  double energy_stored;  // full energy of old/current configuration
   double *sublo,*subhi;
   int *local_gas_list;
   double **cutsq;
@@ -214,9 +214,14 @@ W: Fix gcmc using full_energy option
 
 Fix gcmc has automatically turned on the full_energy option since it
 is required for systems like the one specified by the user. User input
-included one or more of the following: kspace, triclinic, a hybrid
-pair style, an eam pair style, or no "single" function for the pair
-style.
+included one or more of the following: kspace, a hybrid
+pair style, an eam pair style, tail correction, 
+or no "single" function for the pair style.
+
+W: Energy of old configuration in fix gcmc is > MAXENERGYTEST. 
+
+This probably means that a pair of atoms are closer than the 
+overlap cutoff distance for keyword overlap_cutoff.
 
 E: Invalid atom type in fix gcmc command
 
diff --git a/src/Makefile b/src/Makefile
index d7e990461fec87e98a928e9322b07e8445683955..e6821646d13c7680e290cee662144e22f1a54286 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -43,6 +43,15 @@ endif
 
 # Package variables
 
+# PACKAGE    = standard packages
+# PACKUSER   = user packagse
+# PACKLIB    = all packages that require an additional lib
+# PACKSYS    = subset that reqiure a common system library
+# PACKINT    = subset that require an internal (provided) library
+# PACKEXT    = subset that require an external (downloaded) library
+# PACKLIB    = PACKSYS + PACKING + PACKEXT
+# PACKSCRIPT = libs under lammps/lib that have an Install.py script
+
 PACKAGE = asphere body class2 colloid compress coreshell dipole gpu \
 	  granular kim kokkos kspace manybody mc meam misc molecule \
 	  mpiio mscg opt peri poems \
@@ -55,10 +64,21 @@ PACKUSER = user-atc user-awpmd user-cg-cmm user-cgdna user-colvars \
 	   user-quip user-reaxc user-smd user-smtbq user-sph user-tally \
 	   user-vtk
 
-PACKLIB = compress gpu kim kokkos meam mpiio mscg poems python reax voronoi \
-	  user-atc user-awpmd user-colvars user-h5md user-lb user-molfile \
+PACKLIB = compress gpu kim kokkos meam mpiio mscg poems \
+	  python reax voronoi \
+	  user-atc user-awpmd user-colvars user-h5md user-molfile \
 	  user-nc-dump user-qmmm user-quip user-smd user-vtk
 
+PACKSYS = compress mpiio python
+
+PACKINT = gpu kokkos meam poems reax user-atc user-awpmd user-colvars
+
+PACKEXT = kim mscg voronoi \
+	  user-h5md user-molfile user-nc-dump user-qmmm user-quip \
+	  user-smd user-vtk
+
+PACKSCRIPT = voronoi
+
 PACKALL = $(PACKAGE) $(PACKUSER)
 
 PACKAGEUC = $(shell echo $(PACKAGE) | tr a-z A-Z)
@@ -66,6 +86,7 @@ PACKUSERUC = $(shell echo $(PACKUSER) | tr a-z A-Z)
 
 YESDIR = $(shell echo $(@:yes-%=%) | tr a-z A-Z)
 NODIR  = $(shell echo $(@:no-%=%) | tr a-z A-Z)
+LIBDIR = $(shell echo $(@:lib-%=%))
 
 # List of all targets
 
@@ -75,9 +96,9 @@ help:
 	@echo 'make clean-machine       delete object files for one machine'
 	@echo 'make mpi-stubs           build dummy MPI library in STUBS'
 	@echo 'make install-python      install LAMMPS wrapper in Python'
-	@echo 'make tar                 create lmp_src.tar.gz of src dir and packages'
+	@echo 'make tar                 create lmp_src.tar.gz for src dir and packages'
 	@echo ''
-	@echo 'make package                 list available packages'
+	@echo 'make package                 list available packages and their dependencies'
 	@echo 'make package-status (ps)     status of all packages'
 	@echo 'make yes-package             install a single pgk in src dir'
 	@echo 'make no-package              remove a single pkg from src dir'
@@ -87,11 +108,16 @@ help:
 	@echo 'make no-standard (no-std)    remove all standard pkgs'
 	@echo 'make yes-user                install all user pkgs'
 	@echo 'make no-user                 remove all user pkgs'
-	@echo 'make no-lib                  remove all pkgs with external libs'
+	@echo 'make yes-lib       install all pkgs with libs (incldued or ext)'
+	@echo 'make no-lib        remove all pkgs with libs (included or ext)'
+	@echo 'make yes-ext                 install all pkgs with external libs'
+	@echo 'make no-ext                  remove all pkgs with external libs'
 	@echo ''
 	@echo 'make package-update (pu) replace src files with updated package files'
 	@echo 'make package-overwrite   replace package files with src files'
 	@echo 'make package-diff (pd)   diff src files against package files'
+	@echo ''
+	@echo 'make lib-package         download/build/install a package library'
 	@echo 'make purge               purge obsolete copies of source files'
 	@echo ''
 	@echo 'make machine             build LAMMPS for machine'
@@ -221,6 +247,13 @@ package:
 	@echo ''
 	@echo 'User-contributed packages:' $(PACKUSER)
 	@echo ''
+	@echo 'Packages that need system libraries:' $(PACKSYS)
+	@echo ''
+	@echo 'Packages that need provided libraries:' $(PACKINT)
+	@echo ''
+	@echo 'Packages that need external libraries:' $(PACKEXT)
+	@echo ''
+	@echo 'make package                 list available packages'
 	@echo 'make package                 list available packages'
 	@echo 'make package-status (ps)     status of all packages'
 	@echo 'make yes-package             install a single pgk in src dir'
@@ -229,13 +262,18 @@ package:
 	@echo 'make no-all                  remove all pkgs from src dir'
 	@echo 'make yes-standard (yes-std)  install all standard pkgs'
 	@echo 'make no-standard (no-srd)    remove all standard pkgs'
-	@echo ''
 	@echo 'make yes-user                install all user pkgs'
 	@echo 'make no-user                 remove all user pkgs'
-	@echo 'make no-lib                  remove all pkgs with external libs'
+	@echo 'make yes-lib       install all pkgs with libs (included or ext)'
+	@echo 'make no-lib        remove all pkgs with libs (included or ext)'
+	@echo 'make yes-ext                 install all pkgs with external libs'
+	@echo 'make no-ext                  remove all pkgs with external libs'
+	@echo ''
 	@echo 'make package-update (pu)  replace src files with package files'
 	@echo 'make package-overwrite    replace package files with src files'
 	@echo 'make package-diff (pd)    diff src files against package file'
+	@echo ''
+	@echo 'make lib-package      download/build/install a package library'
 
 yes-all:
 	@for p in $(PACKALL); do $(MAKE) yes-$$p; done
@@ -255,9 +293,18 @@ yes-user:
 no-user:
 	@for p in $(PACKUSER); do $(MAKE) no-$$p; done
 
+yes-lib:
+	@for p in $(PACKLIB); do $(MAKE) yes-$$p; done
+
 no-lib:
 	@for p in $(PACKLIB); do $(MAKE) no-$$p; done
 
+yes-ext:
+	@for p in $(PACKEXT); do $(MAKE) yes-$$p; done
+
+no-ext:
+	@for p in $(PACKEXT); do $(MAKE) no-$$p; done
+
 yes-%:
 	@if [ ! -e Makefile.package ]; \
 	  then cp Makefile.package.empty Makefile.package; fi
@@ -288,6 +335,16 @@ no-%:
 		$(SHELL) Depend.sh $(NODIR) 0; \
         fi;
 
+# download/build/install a package library
+
+lib-%:
+	@if [ ! -e ../lib/$(LIBDIR)/Install.py ]; then \
+	  echo "Install script for lib $(@:lib-%=%) does not exist"; \
+	else \
+	  echo "Installing lib for package $(@:lib-%=%)"; \
+	  cd ../lib/$(LIBDIR); python Install.py $(args); \
+	fi;
+
 # status = list src files that differ from package files
 # update = replace src files with newer package files
 # overwrite = overwrite package files with newer src files
diff --git a/src/REPLICA/compute_event_displace.cpp b/src/REPLICA/compute_event_displace.cpp
index 1431fc202ebf25be0aababc7faa4ac587abbf2c4..330e2ebca33a522267581e434a81b86cb627ba28 100644
--- a/src/REPLICA/compute_event_displace.cpp
+++ b/src/REPLICA/compute_event_displace.cpp
@@ -84,7 +84,7 @@ void ComputeEventDisplace::init()
 }
 
 /* ----------------------------------------------------------------------
-   return non-zero if an atom has moved > displace_dist since last event
+   return non-zero if any atom has moved > displace_dist since last event
 ------------------------------------------------------------------------- */
 
 double ComputeEventDisplace::compute_scalar()
@@ -145,6 +145,62 @@ double ComputeEventDisplace::compute_scalar()
   return scalar;
 }
 
+/* ----------------------------------------------------------------------
+   return count of atoms that have moved > displace_dist since last event
+------------------------------------------------------------------------- */
+
+int ComputeEventDisplace::all_events()
+{
+  invoked_scalar = update->ntimestep;
+
+  if (id_event == NULL) return 0.0;
+
+  int event = 0;
+  double **xevent = fix_event->array_atom;
+
+  double **x = atom->x;
+  int *mask = atom->mask;
+  imageint *image = atom->image;
+  int nlocal = atom->nlocal;
+
+  double *h = domain->h;
+  double xprd = domain->xprd;
+  double yprd = domain->yprd;
+  double zprd = domain->zprd;
+  int xbox,ybox,zbox;
+  double dx,dy,dz,rsq;
+
+  if (triclinic == 0) {
+    for (int i = 0; i < nlocal; i++)
+      if (mask[i] & groupbit) {
+        xbox = (image[i] & IMGMASK) - IMGMAX;
+        ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
+        zbox = (image[i] >> IMG2BITS) - IMGMAX;
+        dx = x[i][0] + xbox*xprd - xevent[i][0];
+        dy = x[i][1] + ybox*yprd - xevent[i][1];
+        dz = x[i][2] + zbox*zprd - xevent[i][2];
+        rsq = dx*dx + dy*dy + dz*dz;
+        if (rsq >= displace_distsq) event++;
+      }
+  } else {
+    for (int i = 0; i < nlocal; i++)
+      if (mask[i] & groupbit) {
+        xbox = (image[i] & IMGMASK) - IMGMAX;
+        ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
+        zbox = (image[i] >> IMG2BITS) - IMGMAX;
+        dx = x[i][0] + h[0]*xbox + h[5]*ybox + h[4]*zbox - xevent[i][0];
+        dy = x[i][1] + h[1]*ybox + h[3]*zbox - xevent[i][1];
+        dz = x[i][2] + h[2]*zbox - xevent[i][2];
+        rsq = dx*dx + dy*dy + dz*dz;
+        if (rsq >= displace_distsq) event++;
+      }
+  }
+
+  int allevents;
+  MPI_Allreduce(&event,&allevents,1,MPI_INT,MPI_SUM,world);
+
+  return allevents;
+}
 
 /* ---------------------------------------------------------------------- */
 
diff --git a/src/REPLICA/compute_event_displace.h b/src/REPLICA/compute_event_displace.h
index c545c696a44c5c3223b26ce4093aae9be36843b8..602f3c4b760ba6edfbb2b65771f06c0c155c45a4 100644
--- a/src/REPLICA/compute_event_displace.h
+++ b/src/REPLICA/compute_event_displace.h
@@ -30,8 +30,11 @@ class ComputeEventDisplace : public Compute {
   ~ComputeEventDisplace();
   void init();
   double compute_scalar();
+
+  int all_events();
   void reset_extra_compute_fix(const char *);
 
+  
  private:
   int triclinic;
   double displace_distsq;
diff --git a/src/finish.cpp b/src/finish.cpp
index b81b5e6785ff331c9ea4e7b3cfa46ef7023112ff..45e9226388d30c4a6cd33fc1f91d75500e323d99 100644
--- a/src/finish.cpp
+++ b/src/finish.cpp
@@ -130,7 +130,7 @@ void Finish::end(int flag)
                           atom->natoms);
       if (logfile) fprintf(logfile,fmt1,time_loop,ntasks,update->nsteps,
                            atom->natoms);
-
+      
       // Gromacs/NAMD-style performance metric for suitable unit settings
 
       if ( timeflag && !minflag && !prdflag && !tadflag &&
@@ -144,7 +144,7 @@ void Finish::end(int flag)
         double one_fs = force->femtosecond;
         double t_step = ((double) time_loop) / ((double) update->nsteps);
         double step_t = 1.0/t_step;
-
+        
         if (strcmp(update->unit_style,"lj") == 0) {
           double tau_day = 24.0*3600.0 / t_step * update->dt / one_fs;
           const char perf[] = "Performance: %.3f tau/day, %.3f timesteps/s\n";
@@ -161,26 +161,28 @@ void Finish::end(int flag)
       }
 
       // CPU use on MPI tasks and OpenMP threads
-
-      if (lmp->kokkos) {
-        const char fmt2[] =
-          "%.1f%% CPU use with %d MPI tasks x %d OpenMP threads\n";
-        if (screen) fprintf(screen,fmt2,cpu_loop,nprocs,
-                            lmp->kokkos->num_threads);
-        if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs,
-                             lmp->kokkos->num_threads);
-      } else {
+      
+      if (timeflag) {
+        if (lmp->kokkos) {
+          const char fmt2[] =
+            "%.1f%% CPU use with %d MPI tasks x %d OpenMP threads\n";
+          if (screen) fprintf(screen,fmt2,cpu_loop,nprocs,
+                              lmp->kokkos->num_threads);
+          if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs,
+                               lmp->kokkos->num_threads);
+        } else {
 #if defined(_OPENMP)
-        const char fmt2[] =
-        "%.1f%% CPU use with %d MPI tasks x %d OpenMP threads\n";
-        if (screen) fprintf(screen,fmt2,cpu_loop,nprocs,nthreads);
-        if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs,nthreads);
+          const char fmt2[] =
+            "%.1f%% CPU use with %d MPI tasks x %d OpenMP threads\n";
+          if (screen) fprintf(screen,fmt2,cpu_loop,nprocs,nthreads);
+          if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs,nthreads);
 #else
-        const char fmt2[] =
-          "%.1f%% CPU use with %d MPI tasks x no OpenMP threads\n";
-        if (screen) fprintf(screen,fmt2,cpu_loop,nprocs);
-        if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs);
+          const char fmt2[] =
+            "%.1f%% CPU use with %d MPI tasks x no OpenMP threads\n";
+          if (screen) fprintf(screen,fmt2,cpu_loop,nprocs);
+          if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs);
 #endif
+        }
       }
     }
   }
diff --git a/src/integrate.h b/src/integrate.h
index 19ed546a9b113318e2809f0fa8eac8e441251bf1..4ca3a788fa3d8f1754674a030cb0ce6d8b5d7c32 100644
--- a/src/integrate.h
+++ b/src/integrate.h
@@ -23,7 +23,7 @@ class Integrate : protected Pointers {
   Integrate(class LAMMPS *, int, char **);
   virtual ~Integrate();
   virtual void init();
-  virtual void setup() = 0;
+  virtual void setup(int flag=1) = 0;
   virtual void setup_minimal(int) = 0;
   virtual void run(int) = 0;
   virtual void cleanup() {}
diff --git a/src/min.cpp b/src/min.cpp
index 9207c6bdc2e7062e6234fb1c246274fae028e72e..79d7d6a8bdaff9b99d5858115a5f58485563695c 100644
--- a/src/min.cpp
+++ b/src/min.cpp
@@ -180,13 +180,15 @@ void Min::init()
    setup before run
 ------------------------------------------------------------------------- */
 
-void Min::setup()
+void Min::setup(int flag)
 {
   if (comm->me == 0 && screen) {
     fprintf(screen,"Setting up %s style minimization ...\n",
             update->minimize_style);
-    fprintf(screen,"  Unit style    : %s\n", update->unit_style);
-    timer->print_timeout(screen);
+    if (flag) {
+      fprintf(screen,"  Unit style    : %s\n", update->unit_style);
+      timer->print_timeout(screen);
+    }
   }
   update->setupflag = 1;
 
@@ -294,7 +296,7 @@ void Min::setup()
       requestor[m]->min_xf_get(m);
 
   modify->setup(vflag);
-  output->setup();
+  output->setup(flag);
   update->setupflag = 0;
 
   // stats for initial thermo output
diff --git a/src/min.h b/src/min.h
index 639f87ed66f2aba9d546e440ead3fde35d4d3740..464018e825349fe3613007ae0153ed4794b608a8 100644
--- a/src/min.h
+++ b/src/min.h
@@ -31,7 +31,7 @@ class Min : protected Pointers {
   Min(class LAMMPS *);
   virtual ~Min();
   virtual void init();
-  void setup();
+  void setup(int flag=1);
   void setup_minimal(int);
   void run(int);
   void cleanup();
diff --git a/src/output.cpp b/src/output.cpp
index a2275b74bea6f9e88f7b3158477a132e65330b22..5e56ccfebcaf148471687a788976772c78eccc60 100644
--- a/src/output.cpp
+++ b/src/output.cpp
@@ -652,6 +652,21 @@ void Output::delete_dump(char *id)
   ndump--;
 }
 
+/* ----------------------------------------------------------------------
+   find a dump by ID
+   return index of dump or -1 if not found
+------------------------------------------------------------------------- */
+
+int Output::find_dump(const char *id)
+{
+  if (id == NULL) return -1;
+  int idump;
+  for (idump = 0; idump < ndump; idump++)
+    if (strcmp(id,dump[idump]->id) == 0) break;
+  if (idump == ndump) return -1;
+  return idump;
+}
+
 /* ----------------------------------------------------------------------
    set thermo output frequency from input script
 ------------------------------------------------------------------------- */
diff --git a/src/output.h b/src/output.h
index de5eaaa70b708fa61a3e95fd3f40cd86cad57009..535475934332d53e47b2d0435ce5b2c42a5312f5 100644
--- a/src/output.h
+++ b/src/output.h
@@ -76,6 +76,7 @@ class Output : protected Pointers {
   void add_dump(int, char **);       // add a Dump to Dump list
   void modify_dump(int, char **);    // modify a Dump
   void delete_dump(char *);          // delete a Dump from Dump list
+  int find_dump(const char *);       // find a Dump ID
 
   void set_thermo(int, char **);     // set thermo output freqquency
   void create_thermo(int, char **);  // create a thermo style
diff --git a/src/respa.cpp b/src/respa.cpp
index 7646115fa908bb99d97b8c86b4e83c2efadbdcbd..5d51ff64eef696215eea0498e94610b6eebf7eb5 100644
--- a/src/respa.cpp
+++ b/src/respa.cpp
@@ -398,24 +398,27 @@ void Respa::init()
    setup before run
 ------------------------------------------------------------------------- */
 
-void Respa::setup()
+void Respa::setup(int flag)
 {
   if (comm->me == 0 && screen) {
     fprintf(screen,"Setting up r-RESPA run ...\n");
-    fprintf(screen,"  Unit style    : %s\n", update->unit_style);
-    fprintf(screen,"  Current step  : " BIGINT_FORMAT "\n", update->ntimestep);
-    fprintf(screen,"  Time steps    :");
-    for (int ilevel=0; ilevel < nlevels; ++ilevel)
-      fprintf(screen," %d:%g",ilevel+1, step[ilevel]);
-    fprintf(screen,"\n  r-RESPA fixes :");
-    for (int l=0; l < modify->n_post_force_respa; ++l) {
-      Fix *f = modify->fix[modify->list_post_force_respa[l]];
-      if (f->respa_level >= 0)
-        fprintf(screen," %d:%s[%s]",
-                MIN(f->respa_level+1,nlevels),f->style,f->id);
+    if (flag) {
+      fprintf(screen,"  Unit style    : %s\n", update->unit_style);
+      fprintf(screen,"  Current step  : " BIGINT_FORMAT "\n",
+              update->ntimestep);
+      fprintf(screen,"  Time steps    :");
+      for (int ilevel=0; ilevel < nlevels; ++ilevel)
+        fprintf(screen," %d:%g",ilevel+1, step[ilevel]);
+      fprintf(screen,"\n  r-RESPA fixes :");
+      for (int l=0; l < modify->n_post_force_respa; ++l) {
+        Fix *f = modify->fix[modify->list_post_force_respa[l]];
+        if (f->respa_level >= 0)
+          fprintf(screen," %d:%s[%s]",
+                  MIN(f->respa_level+1,nlevels),f->style,f->id);
+      }
+      fprintf(screen,"\n");
+      timer->print_timeout(screen);
     }
-    fprintf(screen,"\n");
-    timer->print_timeout(screen);
   }
 
   update->setupflag = 1;
@@ -482,7 +485,7 @@ void Respa::setup()
 
   sum_flevel_f();
   modify->setup(vflag);
-  output->setup();
+  output->setup(flag);
   update->setupflag = 0;
 }
 
diff --git a/src/respa.h b/src/respa.h
index 3355cd2eb7a1fd10aefaca628160ed1822215246..0b08b12bd7088220ce63000c054b3278cba34fe2 100644
--- a/src/respa.h
+++ b/src/respa.h
@@ -48,7 +48,7 @@ class Respa : public Integrate {
   Respa(class LAMMPS *, int, char **);
   virtual ~Respa();
   virtual void init();
-  virtual void setup();
+  virtual void setup(int flag=1);
   virtual void setup_minimal(int);
   virtual void run(int);
   virtual void cleanup();
diff --git a/src/verlet.cpp b/src/verlet.cpp
index 915648040e54293a0e4e0e9199e9da5c3eb222f6..b242b00722477ff4e9a7a15c921ec50e6793c49b 100644
--- a/src/verlet.cpp
+++ b/src/verlet.cpp
@@ -85,14 +85,17 @@ void Verlet::init()
    setup before run
 ------------------------------------------------------------------------- */
 
-void Verlet::setup()
+void Verlet::setup(int flag)
 {
   if (comm->me == 0 && screen) {
     fprintf(screen,"Setting up Verlet run ...\n");
-    fprintf(screen,"  Unit style    : %s\n", update->unit_style);
-    fprintf(screen,"  Current step  : " BIGINT_FORMAT "\n", update->ntimestep);
-    fprintf(screen,"  Time step     : %g\n", update->dt);
-    timer->print_timeout(screen);
+    if (flag) {
+      fprintf(screen,"  Unit style    : %s\n", update->unit_style);
+      fprintf(screen,"  Current step  : " BIGINT_FORMAT "\n",
+              update->ntimestep);
+      fprintf(screen,"  Time step     : %g\n", update->dt);
+      timer->print_timeout(screen);
+    }
   }
 
   if (lmp->kokkos)
@@ -148,7 +151,7 @@ void Verlet::setup()
   if (force->newton) comm->reverse_comm();
 
   modify->setup(vflag);
-  output->setup();
+  output->setup(flag);
   update->setupflag = 0;
 }
 
diff --git a/src/verlet.h b/src/verlet.h
index 0e2a333fabc76ad1b32e794db741af67e8dab566..29bd3f16b34424d16ea5abd0a0f48b7715ef6829 100644
--- a/src/verlet.h
+++ b/src/verlet.h
@@ -29,7 +29,7 @@ class Verlet : public Integrate {
   Verlet(class LAMMPS *, int, char **);
   virtual ~Verlet() {}
   virtual void init();
-  virtual void setup();
+  virtual void setup(int flag=1);
   virtual void setup_minimal(int);
   virtual void run(int);
   void cleanup();
diff --git a/src/write_restart.cpp b/src/write_restart.cpp
index f1ee4a4472b923dbba26fd7432fc6bfda4afe695..77e2cb05d951b11d81f9091a0c4b320163353f12 100644
--- a/src/write_restart.cpp
+++ b/src/write_restart.cpp
@@ -297,6 +297,9 @@ void WriteRestart::write(char *file)
 
   // communication buffer for my atom info
   // max_size = largest buffer needed by any proc
+  // NOTE: are assuming size_restart() returns 32-bit int
+  //   for a huge one-proc problem, nlocal could be 32-bit
+  //   but nlocal * doubles-peratom could oveflow
 
   int max_size;
   int send_size = atom->avec->size_restart();