diff --git a/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m b/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m
index 55410bbccad6c17f91bafae69de8c009819d03e9..e046b51696641a428184464f6e2a079bb8342fe9 100644
--- a/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m
+++ b/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m
@@ -654,22 +654,27 @@ classdef Gt6DReconstructionAlgorithmFactory < handle
                 valid_proj_indxes = find(valid_proj_dirs)';
                 num_valid_projs = numel(valid_proj_indxes);
 
-                offsets{ii}.('sino_offsets') = [];
-                offsets{ii}.('blob_offsets') = [];
-                offsets{ii}.('proj_offsets') = [];
-                offsets{ii}.('proj_coeffs')  = [];
-
-                offsets{ii}.proj(num_valid_projs) = struct( ...
-                    'sino_offset', [], 'blob_offset', [], ...
-                    'proj_offsets', [], 'proj_coeffs', [] );
+                c_sino_offsets = cell(2, num_valid_projs);
+                c_blob_offsets = cell(2, num_valid_projs);
+                c_proj_offsets = cell(1, num_valid_projs);
+                c_proj_coeffs = cell(1, num_valid_projs);
+
+                slices_pos_blobs = reshape(slice_pos_in_blob(valid_proj_indxes, ii, :), [], 2);
+                ws_int_coeffs = reshape(w_int_coeffs(valid_proj_indxes, ii, :), [], 2);
+
+                % computing the correction for the blob truncation, if any
+                % applies
+                blob_shirnking_offset = (~blobs_to_not_shrink(valid_proj_indxes)) ...
+                    .* ( 1 - slice_lims(valid_proj_indxes, 1) );
+
                 for jj = 1:num_valid_projs
                     n = valid_proj_indxes(jj);
 
-                    slices_1 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 1)).slices];
-                    coeffs_1 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 1)).coeffs] * w_int_coeffs(n, ii, 1);
+                    slices_1 = proj_coeffs{n}(slices_pos_blobs(jj, 1)).slices;
+                    coeffs_1 = proj_coeffs{n}(slices_pos_blobs(jj, 1)).coeffs * ws_int_coeffs(jj, 1);
 
-                    slices_2 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 2)).slices];
-                    coeffs_2 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 2)).coeffs] * w_int_coeffs(n, ii, 2);
+                    slices_2 = proj_coeffs{n}(slices_pos_blobs(jj, 2)).slices;
+                    coeffs_2 = proj_coeffs{n}(slices_pos_blobs(jj, 2)).coeffs * ws_int_coeffs(jj, 2);
 
                     % ugly but it avoids a lot of compuation later
                     if (numel(slices_1) == 2 && numel(slices_2) == 2 && all(slices_1 == slices_2))
@@ -691,20 +696,29 @@ classdef Gt6DReconstructionAlgorithmFactory < handle
                     end
 
                     % Correcting w-slices indices for blob truncation
-                    if (~blobs_to_not_shrink(n))
-                        slices = slices - slice_lims(n, 1) +1;
-                    end
+                    slices = slices + blob_shirnking_offset(jj);
+
+                    ones_num_slices = ones(numel(slices), 1);
+                    c_sino_offsets{1, jj} = jj;
+                    c_sino_offsets{2, jj} = jj(1, ones_num_slices);
 
-                    offsets{ii}.proj(jj) = struct( ...
-                        'sino_offset', jj, 'blob_offset', n, ...
-                        'proj_offsets', slices, 'proj_coeffs', coeffs );
+                    c_blob_offsets{1, jj} = n;
+                    c_blob_offsets{2, jj} = n(1, ones_num_slices);
 
-                    offsets{ii}.('sino_offsets') = [offsets{ii}.('sino_offsets'), jj(1, ones(numel(slices), 1))];
-                    offsets{ii}.('blob_offsets') = [offsets{ii}.('blob_offsets'), n(1, ones(numel(slices), 1))];
-                    offsets{ii}.('proj_offsets') = [offsets{ii}.('proj_offsets'), slices];
-                    offsets{ii}.('proj_coeffs')  = [offsets{ii}.('proj_coeffs'),  coeffs];
+                    c_proj_offsets{jj} = slices;
+                    c_proj_coeffs{jj} = coeffs;
                 end
 
+                offsets{ii} = struct( ...
+                    'sino_offsets', [c_sino_offsets{2, :}], ...
+                    'blob_offsets', [c_blob_offsets{2, :}], ...
+                    'proj_offsets', [c_proj_offsets{:}], ...
+                    'proj_coeffs', [c_proj_coeffs{:}], ...
+                    'proj', struct( ...
+                        'sino_offset', c_sino_offsets(1, :), 'blob_offset', c_blob_offsets(1, :), ...
+                        'proj_offsets', c_proj_offsets, 'proj_coeffs', c_proj_coeffs ) ...
+                    );
+
                 geometries{ii} = double(geometries{ii}(valid_proj_dirs, :));
             end
         end