diff --git a/src/read_data.cpp b/src/read_data.cpp
index 65dff7301ceca5725f4492679eb5d0550712b598..085603be5479aac4a6b9d3a94187f47d958a9e52 100644
--- a/src/read_data.cpp
+++ b/src/read_data.cpp
@@ -23,6 +23,7 @@
 #include "atom_vec_ellipsoid.h"
 #include "atom_vec_line.h"
 #include "atom_vec_tri.h"
+#include "force.h"
 #include "molecule.h"
 #include "comm.h"
 #include "update.h"
@@ -108,13 +109,10 @@ void ReadData::command(int narg, char **arg)
 {
   if (narg < 1) error->all(FLERR,"Illegal read_data command");
 
-  if (domain->box_exist)
-    error->all(FLERR,"Cannot read_data after simulation box is defined");
-  if (domain->dimension == 2 && domain->zperiodic == 0)
-    error->all(FLERR,"Cannot run 2d simulation with nonperiodic Z dimension");
-
-  // fixes that process data file info
+  // optional args
 
+  addflag = mergeflag = 0;
+  offset[0] = offset[1] = offset[2] = 0.0;
   nfix = 0;
   fix_index = NULL;
   fix_header = NULL;
@@ -122,7 +120,20 @@ void ReadData::command(int narg, char **arg)
 
   int iarg = 1;
   while (iarg < narg) {
-    if (strcmp(arg[iarg],"fix") == 0) {
+    if (strcmp(arg[iarg],"add") == 0) {
+      addflag = 1;
+      iarg++;
+    } else if (strcmp(arg[iarg],"merge") == 0) {
+      mergeflag = 1;
+      iarg++;
+    } else if (strcmp(arg[iarg],"offset") == 0) {
+      if (iarg+4 > narg)
+        error->all(FLERR,"Illegal read_data command");
+      offset[0] = force->numeric(FLERR,arg[iarg+1]);
+      offset[1] = force->numeric(FLERR,arg[iarg+2]);
+      offset[2] = force->numeric(FLERR,arg[iarg+3]);
+      iarg += 4;
+    } else if (strcmp(arg[iarg],"fix") == 0) {
       if (iarg+4 > narg)
         error->all(FLERR,"Illegal read_data command");
       memory->grow(fix_index,nfix+1,"read_data:fix_index");
@@ -149,6 +160,18 @@ void ReadData::command(int narg, char **arg)
     } else error->all(FLERR,"Illegal read_data command");
   }
 
+  // error checks
+
+  if (domain->box_exist && !addflag && !mergeflag)
+    error->all(FLERR,"Cannot read_data after simulation box is defined");
+  if (addflag && mergeflag) error->all(FLERR,"Cannot read_data add and merge");
+  if (domain->dimension == 2 && offset[2] != 0.0)
+    error->all(FLERR,"Cannot use non-zero z offset in read_data "
+               "for 2d simulation");
+
+  if (domain->dimension == 2 && domain->zperiodic == 0)
+    error->all(FLERR,"Cannot run 2d simulation with nonperiodic Z dimension");
+
   // perform 1-pass read if no molecular topoogy in file
   // perform 2-pass read if molecular topology,
   //   first pass calculates max topology/atom
@@ -633,8 +656,6 @@ void ReadData::header()
     if (eof == NULL) error->one(FLERR,"Unexpected end of data file");
   }
 
-  // customize for new header lines
-
   while (1) {
 
     // read a line and bcast length if flag is set
@@ -675,6 +696,7 @@ void ReadData::header()
     }
 
     // search line for header keyword and set corresponding variable
+    // customize for new header lines
 
     if (strstr(line,"atoms")) {
       sscanf(line,BIGINT_FORMAT,&atom->natoms);
diff --git a/src/read_data.h b/src/read_data.h
index 7026efcc676b3c3c083d21df5e794885453e1727..685c707b8eddcba27ee8bf695e6807a192c04d05 100644
--- a/src/read_data.h
+++ b/src/read_data.h
@@ -37,7 +37,11 @@ class ReadData : protected Pointers {
   char **arg;
   int me,narg,maxarg,compressed;
 
-  int nfix;         // # of extra fixes that process/store info in data file
+  // optional args
+
+  int addflag,mergeflag;
+  double offset[3];
+  int nfix;         
   int *fix_index;
   char **fix_header;
   char **fix_section;