diff --git a/src/dump_image.cpp b/src/dump_image.cpp
index 5e6701ff344d6e9d3f457ea6766b2ca14c0d646a..5d1154478fb5375cef1d138c695010d581b5c378 100644
--- a/src/dump_image.cpp
+++ b/src/dump_image.cpp
@@ -27,6 +27,8 @@
 #include "group.h"
 #include "force.h"
 #include "comm.h"
+#include "modify.h"
+#include "fix.h"
 #include "input.h"
 #include "variable.h"
 #include "math_const.h"
@@ -40,7 +42,7 @@ using namespace MathConst;
 #define BIG 1.0e20
 
 enum{NUMERIC,ATOM,TYPE,ELEMENT,ATTRIBUTE};
-enum{SPHERE,LINE};           // also in Body child classes
+enum{SPHERE,LINE,TRI};           // also in some Body and Fix child classes
 enum{STATIC,DYNAMIC};
 enum{NO,YES};
 
@@ -108,7 +110,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) :
   // set defaults for optional args
 
   atomflag = YES;
-  lineflag = triflag = bodyflag = NO;
+  lineflag = triflag = bodyflag = fixflag = NO;
   if (atom->nbondtypes == 0) bondflag = NO;
   else {
     bondflag = YES;
@@ -116,6 +118,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) :
     bdiam = NUMERIC;
     bdiamvalue = 0.5;
   }
+  char *fixID = NULL;
 
   thetastr = phistr = NULL;
   cflag = STATIC;
@@ -195,6 +198,16 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) :
       bodyflag2 = force->numeric(FLERR,arg[iarg+3]);
       iarg += 4;
 
+    } else if (strcmp(arg[iarg],"fix") == 0) {
+      if (iarg+5 > narg) error->all(FLERR,"Illegal dump image command");
+      fixflag = YES;
+      fixID = arg[iarg+1];
+      if (strcmp(arg[iarg+2],"type") == 0) fixcolor = TYPE;
+      else error->all(FLERR,"Illegal dump image command");
+      fixflag1 = force->numeric(FLERR,arg[iarg+3]);
+      fixflag2 = force->numeric(FLERR,arg[iarg+4]);
+      iarg += 5;
+
     } else if (strcmp(arg[iarg],"size") == 0) {
       if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command");
       int width = force->inumeric(FLERR,arg[iarg+1]);
@@ -354,7 +367,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) :
     } else error->all(FLERR,"Illegal dump image command");
   }
 
-  // error checks and setup for lineflag, triflag, bodyflag
+  // error checks and setup for lineflag, triflag, bodyflag, fixflag
 
   if (lineflag) {
     avec_line = (AtomVecLine *) atom->style_match("line");
@@ -375,6 +388,12 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) :
   extraflag = 0;
   if (lineflag || triflag || bodyflag) extraflag = 1;
 
+  if (fixflag) {
+    int ifix = modify->find_fix(fixID);
+    if (ifix < 0) error->all(FLERR,"Fix ID for dump image does not exist");
+    fixptr = modify->fix[ifix];
+  }
+
   // allocate image buffer now that image size is known
 
   image->buffers();
@@ -716,9 +735,10 @@ void DumpImage::create_image()
   int i,j,k,m,n,itype,atom1,atom2,imol,iatom,btype,ibonus,drawflag;
   tagint tagprev;
   double diameter,delx,dely,delz;
-  int *bodyvec;
-  double **bodyarray;
+  int *bodyvec,*fixvec;
+  double **bodyarray,**fixarray;
   double *color,*color1,*color2;
+  double *p1,*p2,*p3;
   double xmid[3],pt1[3],pt2[3],pt3[3];
   double mat[3][3];
 
@@ -820,7 +840,6 @@ void DumpImage::create_image()
     int *tri = atom->tri;
     int *type = atom->type;
 
-
     for (i = 0; i < nchoose; i++) {
       j = clist[i];
       if (tri[j] < 0) continue;
@@ -1014,6 +1033,47 @@ void DumpImage::create_image()
     }
   }
 
+  // render objects provided by a fix
+
+  if (fixflag) {
+    int tridraw,edgedraw;
+    if (domain->dimension == 3) {
+      tridraw = 1;
+      edgedraw = 1;
+      if ((int) fixflag1 == 2) tridraw = 0;
+      if ((int) fixflag1 == 1) edgedraw = 0;
+    }
+
+    n = fixptr->image(fixvec,fixarray);
+
+    for (i = 0; i < n; i++) {
+      if (fixvec[i] == SPHERE) {
+        // no fix draws spheres yet
+      } else if (fixvec[i] == LINE) {
+        if (fixcolor == TYPE) {
+          itype = static_cast<int> (fixarray[i][0]);
+          color = colortype[itype];
+        }
+        image->draw_cylinder(&fixarray[i][1],&fixarray[i][4],
+                             color,fixflag1,3);
+      } else if (fixvec[i] == TRI) {
+        if (fixcolor == TYPE) {
+          itype = static_cast<int> (fixarray[i][0]);
+          color = colortype[itype];
+        }
+        p1 = &fixarray[i][1];
+        p2 = &fixarray[i][4];
+        p3 = &fixarray[i][7];
+        if (tridraw) image->draw_triangle(p1,p2,p3,color);
+        if (edgedraw) {
+          image->draw_cylinder(p1,p2,color,fixflag2,3);
+          image->draw_cylinder(p2,p3,color,fixflag2,3);
+          image->draw_cylinder(p3,p1,color,fixflag2,3);
+        }
+      }
+    }
+  }
+
   // render outline of my sub-box, orthogonal or triclinic
 
   if (subboxflag) {
diff --git a/src/dump_image.h b/src/dump_image.h
index 64846e3e4b5864261df73eda716baf255cf1da22..7e85ff9cd4c1eebc0d2eb83ba9636955a0ad8c28 100644
--- a/src/dump_image.h
+++ b/src/dump_image.h
@@ -50,7 +50,10 @@ class DumpImage : public DumpCustom {
   int bodyflag;                    // 0/1 for draw atoms as bodies
   int bodycolor;                   // what determines color of bodies
   double bodyflag1,bodyflag2;      // user-specified params for drawing bodies
-  
+  int fixflag;                     // 0/1 to draw what fix provides
+  int fixcolor;                    // what determines color of fix objects
+  double fixflag1,fixflag2;        // user-specified params for fix objects
+
   int bondflag;                    // 0/1 for draw bonds
   int bcolor,bdiam;                // what determines color/diam of bonds
   double bdiamvalue;               // bond diameter value
@@ -80,6 +83,8 @@ class DumpImage : public DumpCustom {
   class AtomVecTri *avec_tri;
   class AtomVecBody *avec_body;
 
+  class Fix *fixptr;               // ptr to Fix that provides image data
+
   class Image *image;              // class that renders each image
 
   int *chooseghost;                // extended choose array for comm