diff --git a/zUtil_TIFF/gtTIFVolWriter.m b/zUtil_TIFF/gtTIFVolWriter.m
index 26b75464a8361b683f705886fb6bbe02a9d526ad..b170d45e158ba9d102c8c7ae6c8d92f4355dbf27 100644
--- a/zUtil_TIFF/gtTIFVolWriter.m
+++ b/zUtil_TIFF/gtTIFVolWriter.m
@@ -1,5 +1,5 @@
 function gtTIFVolWriter(vol, filename, varargin)
-% GTTIFVOLWRITER  Writes volume data to TIFF file without compression.
+% GTTIFVOLWRITER  Writes volume data to TIFF file with compression modes.
 %                 Either single file of multiple files stack can be produced.
 %                 The produced TIFF files contain 8/16 bit unsigned integers.
 %     -------------------------------------------------------------------------
@@ -19,10 +19,14 @@ function gtTIFVolWriter(vol, filename, varargin)
 %       'yrange'     = <range>               "            Y     "
 %       'zrange'     = <range>               "            Z     "
 %
-%       'type'       = <string>  Type of data written in the TIFF file
-%                                it can be 'uint8' or 'uint16'
+%       'type'       = <string>  Force type of data written in the TIFF file
+%                                it can be 'uint8', 'uint16' or 'logical'
 %                                default is 'uint8'
 %
+%       'compress'   = <string>  Compression mode, by default 'none', can be
+%                                'packbits', 'lzm', 'deflate', 'jpeg', 'ccitt',
+%                                'fax3', 'fax4'
+%
 %       'mode'       = <string>  Output type which is 'single' or 'stack'
 %                                default is a single TIFF file
 %       'digits'     = <int>     Number of digits in stack filenames
@@ -39,10 +43,11 @@ function gtTIFVolWriter(vol, filename, varargin)
 %     Version 001 15-02-2012 by YGuilhem, yoann.guilhem@esrf.fr
 
 % Set default parameters and parse optional arguments
-params.type = 'uint8';
+params.type = '';
 params.xrange = 'all';
 params.yrange = 'all';
 params.zrange = 'all';
+params.compress = 'none';
 params.mode = 'single';
 params.filext = 'tif';
 params.digits = 4;
@@ -50,18 +55,18 @@ params.startindex = 1;
 params = parse_pv_pairs(params, varargin);
 
 % Translating range parameters
-if strcmp(params.xrange,'all')
-    rangeX = 1:size(vol,1);
+if strcmp(params.xrange, 'all')
+    rangeX = 1:size(vol, 1);
 else
     rangeX = params.xrange;
 end
-if strcmp(params.yrange,'all')
-    rangeY = 1:size(vol,2);
+if strcmp(params.yrange, 'all')
+    rangeY = 1:size(vol, 2);
 else
     rangeY = params.yrange;
 end
-if strcmp(params.zrange,'all')
-    rangeZ = 1:size(vol,3);
+if strcmp(params.zrange, 'all')
+    rangeZ = 1:size(vol, 3);
 else
     rangeZ = params.zrange;
 end
@@ -69,22 +74,65 @@ outVolSizeX = length(rangeX);
 outVolSizeY = length(rangeY);
 outVolSizeZ = length(rangeZ);
 
-if ~isa(vol,params.type)
-    % Creating grayscale integer volume 
-    grayVol = mat2gray(vol);
+% Checking input/output types and decide whther casting/rescaling operations 
+doCast  = false;
+rescale = 0;
+inputType = class(vol);
+if ~isempty(params.type) && ~any(strcmp(params.type, {'logical', 'uint8', 'uint16'}))
+    Mexc = MException('TIFF:wrong_type', ['Output type ''' params.type ''' is not supported!']);
+    throw(Mexc);
+elseif any(strcmp(inputType, {'logical', 'uint8', 'uint16'}))
+    if isempty(params.type)
+        params.type = class(vol);
+    elseif strcmp(params.type, inputType)
+        %true;
+        doCast  = false;
+    elseif strcmp(params.type, 'uint8')
+        doCast  = true;
+        rescale = 255;
+    else
+        doCast  = true;
+    end
+else
+    cast = true;
     switch params.type
-        case 'uint8' 
-            outVol = uint8(grayVol*255);
-        case 'uint16'
-            outVol = uint16(grayVol*65535);
-        otherwise
-            Mexc = MException('TIFF:wrong_type', ['Output type ''' params.type ''' is not supported!']);
-            throw(Mexc);
+    case 'logical'
+        %true;
+        rescale = 0;
+    case 'uint8'
+        rescale = 255;
+    otherwise
+        rescale = 65535;
+    end
+end
+
+% Cast and rescale if needed
+if doCast
+    if rescale
+        disp(['Rescaling input volume to [0 ' str2num(rescale) '] and casting it to ' params.type ' ...']);
+        outVol = cast(mat2gray(vol) * rescale, params.type);
+    else
+        disp(['Casting input volume to ' params.type ' ...']);
+        outVol = cast(vol, params.type);
     end
 else
     outVol = vol;
 end
 
+% Check compression mode
+if isempty(params.compress)
+    params.compress = 'none';
+elseif any(strcmp(params.compress, {'true', 'yes', 'y'}))
+    if islogical(outVol)
+        params.compress = 'ccitt';
+    else
+        params.compress = 'packbits';
+    end
+elseif ~any(strcmp(params.compress, {'none', 'packbits', 'lzm', 'deflate', 'jpeg', 'ccitt', 'fax3', 'fax4'}))
+    warning(['Unkown compression mode: ' params.compress ' -> Setting it to ''none''...']);
+    params.compress = 'none';
+end
+
 % Guessing output directory, filename and extension
 [fdir, fname, fext] = fileparts(filename);
 
@@ -102,14 +150,14 @@ if strcmpi(params.mode, 'single')
 
     % Writing volume in TIFF file
     for i=1:length(rangeZ)
-        imwrite(outVol(rangeX(1):rangeX(end), rangeY(1):rangeY(end),rangeZ(i))', filename, 'tif', 'Compression', 'none', 'writemode', 'append');
+        imwrite(outVol(rangeX(1):rangeX(end), rangeY(1):rangeY(end), rangeZ(i))', filename, 'tif', 'Compression', params.compress, 'writemode', 'append');
     end
 
 elseif strcmpi(params.mode, 'stack')
 
     % Check stack starting index
     if isnumeric(params.startindex)
-        if mod(params.startindex,1) ~= 0
+        if mod(params.startindex, 1) ~= 0
             params.startindex = round(params.startindex);
             disp(['Argument ''startindex'' convert to ' num2str(params.startindex)]);
         end
@@ -120,7 +168,7 @@ elseif strcmpi(params.mode, 'stack')
 
     % Check stack number of digits
     if isnumeric(params.digits)
-        if mod(params.digits,1) ~= 0
+        if mod(params.digits, 1) ~= 0
             params.digits = round(params.digits);
             disp(['Argument ''digits'' convert to ' num2str(params.digits)]);
         end
@@ -144,7 +192,7 @@ elseif strcmpi(params.mode, 'stack')
     % Writing volume in TIFF file
     for i=1:length(rangeZ)
         outFile = sprintf(filenameFormat, i+offset);
-        imwrite(outVol(rangeX(1):rangeX(end), rangeY(1):rangeY(end),rangeZ(i))', outFile, 'tif', 'Compression', 'none');
+        imwrite(outVol(rangeX(1):rangeX(end), rangeY(1):rangeY(end), rangeZ(i))', outFile, 'tif', 'Compression', params.compress, 'writemode', 'overwrite');
     end
 
 end