diff --git a/zUtil_Imaging/gtESF2LSF.m b/zUtil_Imaging/gtESF2LSF.m
index 3c5818a120471519ea4e2b5011ae8915e99ef784..0be8d4c14f468e1978b04d4ba154690d2a19a4ab 100644
--- a/zUtil_Imaging/gtESF2LSF.m
+++ b/zUtil_Imaging/gtESF2LSF.m
@@ -6,33 +6,41 @@ function lsf_line = gtESF2LSF(img, varargin)
         'keep_oversampling', true, 'verbose', true);
     conf = parse_pv_pairs(conf, varargin);
 
-    p = gtLoadParameters();
-
     if (ischar(img))
         img = GtVolView.loadVolume(img);
     elseif (numel(img) == 1)
+        p = gtLoadParameters();
+
         filename = sprintf('refHST%04d.edf', img);
         filename = fullfile(p.acq.dir, '0_rawdata', p.acq.name, filename);
         img = edf_read(filename);
     end
 
     if (isempty(conf.bb))
-        bb_half_size = ceil(p.acq.bbdir(3:4) / 2);
-        bb = [p.acq.bbdir(1:2), bb_half_size];
-        if (isempty(conf.direction) || strcmpi(conf.direction, 'top-bottom'))
-            bb(1) = bb(1) + ceil(bb_half_size(1) / 2);
-            bb(2) = bb(2) - ceil(bb_half_size(2) / 2);
-        elseif (strcmpi(conf.direction, 'left-right'))
-            bb(1) = bb(1) - ceil(bb_half_size(1) / 2);
-            bb(2) = bb(2) + ceil(bb_half_size(2) / 2);
-        elseif (strcmpi(conf.direction, 'right-left'))
-            bb(1) = bb(1) + 3 * ceil(bb_half_size(1) / 2);
-            bb(2) = bb(2) + ceil(bb_half_size(2) / 2);
-        else
-            bb(1) = bb(1) + ceil(bb_half_size(1) / 2);
-            bb(2) = bb(2) + 3 * ceil(bb_half_size(2) / 2);
+        try
+            if (~exist('p', 'var') || isempty(p))
+                p = gtLoadParameters();
+            end
+
+            bb_half_size = ceil(p.acq.bbdir(3:4) / 2);
+            bb = [p.acq.bbdir(1:2), bb_half_size];
+            if (isempty(conf.direction) || strcmpi(conf.direction, 'top-bottom'))
+                bb(1) = bb(1) + ceil(bb_half_size(1) / 2);
+                bb(2) = bb(2) - ceil(bb_half_size(2) / 2);
+            elseif (strcmpi(conf.direction, 'left-right'))
+                bb(1) = bb(1) - ceil(bb_half_size(1) / 2);
+                bb(2) = bb(2) + ceil(bb_half_size(2) / 2);
+            elseif (strcmpi(conf.direction, 'right-left'))
+                bb(1) = bb(1) + 3 * ceil(bb_half_size(1) / 2);
+                bb(2) = bb(2) + ceil(bb_half_size(2) / 2);
+            else
+                bb(1) = bb(1) + ceil(bb_half_size(1) / 2);
+                bb(2) = bb(2) + 3 * ceil(bb_half_size(2) / 2);
+            end
+            bb(3:4) = bb(3:4) + 1 - mod(bb(3:4), 2);
+        catch
+            bb = [0, 0, size(img, 2), size(img, 1)];
         end
-        bb(3:4) = bb(3:4) + 1 - mod(bb(3:4), 2);
 
         conf.bb = get_roi_bb(img, 'ESF Bounding Box', bb);
     end
diff --git a/zUtil_Imaging/gtLSFs2PSF.m b/zUtil_Imaging/gtLSFs2PSF.m
index 23d909297c257d59dd660c1403e4d640b20d591b..bd7b96ed402206d8141076ea317bae301a804240 100644
--- a/zUtil_Imaging/gtLSFs2PSF.m
+++ b/zUtil_Imaging/gtLSFs2PSF.m
@@ -1,19 +1,24 @@
 function psf = gtLSFs2PSF(lsfs, varargin)
-    conf = struct('method', 'fourier');
+    conf = struct('method', 'fourier', 'downsampling', 1);
     conf = parse_pv_pairs(conf, varargin);
 
     num_lsfs = numel(lsfs);
 
+    data = cat(1, lsfs.data);
+    num_data_pixels = size(data, 2);
+
     if (num_lsfs == 1)
         % We're assuming here that the only LSF given is the radial
         % component of a radially symmetric PSF
-        data = reshape(lsfs.data, [], 1);
+        data = reshape(data, [], 1);
+        data = (data + flipud(data)) / 2;
+
         switch (lower(conf.method))
             case 'astra'
             case 'iradon'
                 data = data(:, ones(180, 1));
                 psf_inner = iradon(data, 1:180,'linear', 'Shepp-Logan');
-                psf_upsize = [numel(lsfs.data), numel(lsfs.data)];
+                psf_upsize = [num_data_pixels, num_data_pixels];
                 psf = zeros(psf_upsize, lsfs.data_type);
                 shifts = (psf_upsize - 1) / 2 - size(psf_inner) / 2 + 1;
                 psf(1+shifts(1):size(psf_inner, 1)+shifts(1), 1+shifts(2):size(psf_inner, 2)+shifts(2)) = psf_inner;
@@ -22,7 +27,7 @@ function psf = gtLSFs2PSF(lsfs, varargin)
                 data_f = fft(data_f);
                 data_f = fftshift(data_f);
 
-                psf_edge = (numel(lsfs.data) - 1) / 2;
+                psf_edge = (num_data_pixels - 1) / 2;
                 [xx, yy] = ndgrid(-psf_edge:psf_edge, -psf_edge:psf_edge);
                 rr = sqrt(xx .^ 2 + yy .^ 2);
                 psf_f = interp1(-psf_edge:psf_edge, data_f, rr, 'spline', 0);
@@ -50,13 +55,11 @@ function psf = gtLSFs2PSF(lsfs, varargin)
         end
 
         % The LSFs given here, are Fourier samplings of the 2D PSF
-        data = cat(1, lsfs.data);
-
         data_f = ifftshift(data, 2);
         data_f = fft(data_f, [], 2);
         data_f = fftshift(data_f, 2);
 
-        psf_edge = (size(data, 2) - 1) / 2;
+        psf_edge = (num_data_pixels - 1) / 2;
 
         dirs = cat(1, lsfs.direction);
         angles = mod(atan2d(dirs(:, 2), dirs(:, 1)), 360);
@@ -87,9 +90,30 @@ function psf = gtLSFs2PSF(lsfs, varargin)
         psf = real(fftshift(psf));
     end
 
-    if (lsfs(1).keep_oversampling)
-        psf = reshape(psf, lsfs(1).oversampling, lsfs(1).size, lsfs(1).oversampling, lsfs(1).size);
-        psf = squeeze(sum(sum(psf, 1), 3));
+    if (lsfs(1).keep_oversampling) % It was kept before, so now we get rid of it
+        to_be_summed = conf.downsampling * lsfs(1).oversampling;
+    else
+        to_be_summed = conf.downsampling;
+    end
+    extra_pixels = mod(to_be_summed - mod(num_data_pixels, to_be_summed), to_be_summed);
+    num_data_pixels = num_data_pixels + extra_pixels;
+
+    if (mod(conf.downsampling, 2))
+        if (mod(lsfs(1).size, conf.downsampling))
+            padsize = (extra_pixels - 1) / 2;
+            psf = padarray(psf, [padsize, padsize], 'both');
+        end
+    else
+        half_in_size = (size(psf) - 1) / 2;
+        half_out_size = (num_data_pixels - 1) / 2;
+        [xx, yy] = ndgrid(-half_out_size:half_out_size, -half_out_size:half_out_size);
+        psf = interp2(-half_in_size(1):half_in_size(1), -half_in_size(2):half_in_size(2), psf, xx, yy, 'spline', 0);
+        size(psf)
     end
+
+    final_psf_size = ceil(lsfs(1).size / conf.downsampling);
+
+    psf = reshape(psf, to_be_summed, final_psf_size, to_be_summed, final_psf_size);
+    psf = squeeze(sum(sum(psf, 1), 3));
     psf = psf / sum(psf(:));
 end