diff --git a/fslmeants.cc b/fslmeants.cc
index af166a6875d652f279317745d7770230c634883a..bd775216efa437c72d97dca76f78782509567d3e 100644
--- a/fslmeants.cc
+++ b/fslmeants.cc
@@ -72,6 +72,10 @@ Option<int> order(string("--order"), 1,
 Option<bool> transpose(string("--transpose"), false,
 		  string("        output results in transpose format (one row per voxel/mean)"),
 		  false, no_argument);
+Option<bool> weightedMask(string("-w"), false,
+		  string("output weighted mean, using mask values as weights, and exit."),
+		  false, no_argument);
+
 
 int nonoptarg;
 
@@ -96,6 +100,7 @@ int main(int argc,char *argv[])
   options.add(transpose);
   options.add(verbose);
   options.add(help);
+  options.add(weightedMask);
   
   nonoptarg = options.parse_command_line(argc, argv);
   
@@ -122,6 +127,32 @@ int main(int argc,char *argv[])
     mask = 1.0;
   }
 
+
+
+  if ( weightedMask.value() ) {
+    Matrix meanwts(vin.tsize(),1);
+    for(int t=0;t<vin.tsize();t++) {    
+      double mean(0);
+      double meanWeight(0);
+      for (int z=mask.minz(); z<=mask.maxz(); z++) 
+	for (int y=mask.miny(); y<=mask.maxy(); y++) 
+	  for (int x=mask.minx(); x<=mask.maxx(); x++) {
+	    mean+=mask(x,y,z)*vin(x,y,z,t);	
+	    meanWeight+=mask(x,y,z);
+	  }
+      meanwts(t+1,1)=(mean/meanWeight);
+    }
+
+    if ( transpose.value() ) 
+      meanwts=meanwts.t();
+    if ( outmat.set() ) 
+      write_ascii_matrix(meanwts,outmat.value());
+    else 
+      cout << meanwts << endl;
+    return(0);
+  }
+
+
   int nlabs=1;
   if (labelname.set() && showall.unset()) {
     read_volume(label,labelname.value());