diff --git a/4_grains/gtLoadGrain.m b/4_grains/gtLoadGrain.m
index 558c732b14efa0e609d68edefb0de295df12e66a..2e2a2dc2430ebf4760af5790a7fc0a75876762d6 100644
--- a/4_grains/gtLoadGrain.m
+++ b/4_grains/gtLoadGrain.m
@@ -1,8 +1,13 @@
 function grain = gtLoadGrain(phase_id, grain_id, varargin)
-    conf = struct('fields', {{}});
+    conf = struct('fields', {{}}, 'parameters', {[]});
     conf = parse_pv_pairs(conf, varargin);
 
-    phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id));
+    if (isempty(conf.parameters))
+        phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id));
+    else
+        phase_dir = fullfile(conf.parameters.acq.dir, '4_grains', sprintf('phase_%02d', phase_id));
+    end
+
     for ii = numel(grain_id):-1:1
         grain_file = fullfile(phase_dir, sprintf('grain_%04d.mat', grain_id(ii)));
 
diff --git a/4_grains/gtLoadGrainRec.m b/4_grains/gtLoadGrainRec.m
new file mode 100644
index 0000000000000000000000000000000000000000..9dfe5f40f633f34e4d363c421d8dd35899f04c49
--- /dev/null
+++ b/4_grains/gtLoadGrainRec.m
@@ -0,0 +1,20 @@
+function grain_det = gtLoadGrainRec(phase_id, grain_id, varargin)
+    conf = struct('fields', {{}}, 'parameters', {[]});
+    conf = parse_pv_pairs(conf, varargin);
+
+    if (isempty(conf.parameters))
+        phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id));
+    else
+        phase_dir = fullfile(conf.parameters.acq.dir, '4_grains', sprintf('phase_%02d', phase_id));
+    end
+
+    for ii = numel(grain_id):-1:1
+        grain_file = fullfile(phase_dir, sprintf('grain_details_%04d.mat', grain_id(ii)));
+
+        if (isempty(conf.fields))
+            grain_det(ii) = load(grain_file);
+        else
+            grain_det(ii) = load(grain_file, conf.fields{:});
+        end
+    end
+end
diff --git a/4_grains/gtSaveGrain.m b/4_grains/gtSaveGrain.m
index d35ddbd77a4c06ba693f035632dcf112aecf6195..d27792346be7c374b4780ce502afc231022a47e9 100644
--- a/4_grains/gtSaveGrain.m
+++ b/4_grains/gtSaveGrain.m
@@ -1,8 +1,12 @@
 function gtSaveGrain(phase_id, grain_id, grain, varargin)
-    conf = struct('fields', {{}});
+    conf = struct('fields', {{}}, 'parameters', {[]});
     conf = parse_pv_pairs(conf, varargin);
 
-    phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id));
+    if (isempty(conf.parameters))
+        phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id));
+    else
+        phase_dir = fullfile(conf.parameters.acq.dir, '4_grains', sprintf('phase_%02d', phase_id));
+    end
     grain_file = fullfile(phase_dir, sprintf('grain_%04d.mat', grain_id));
 
     if (isempty(conf.fields))
diff --git a/4_grains/gtSaveGrainRec.m b/4_grains/gtSaveGrainRec.m
new file mode 100644
index 0000000000000000000000000000000000000000..c539b09274dc2bbe3449cc38450d9ac6d5f1a747
--- /dev/null
+++ b/4_grains/gtSaveGrainRec.m
@@ -0,0 +1,31 @@
+function gtSaveGrainRec(phase_id, grain_id, grain_det, varargin)
+    details_fields = {'VOL3D', 'ODF6D', 'ODFw', 'ODFuvw'};
+    conf = struct( ...
+        'fields', {details_fields}, ...
+        'parameters', {[]}, ...
+        'clean', false );
+    conf = parse_pv_pairs(conf, varargin);
+
+    % Only allow for the possible fields
+    conf.fields = intersect(conf.fields, details_fields);
+
+    phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id));
+    grain_file = fullfile(phase_dir, sprintf('grain_details_%04d.mat', grain_id));
+
+    if (conf.clean)
+        if (exist(grain_file, file))
+            gr_det = load(grain_file);
+        else
+            gr_det = struct();
+        end
+        for ii_f = 1:numel(conf.fields)
+            gr_det.(conf.fields{ii_f}) = grain_det.(conf.fields{ii_f});
+        end
+        save(grain_file, '-struct', 'gr_det', '-v7.3');
+    else
+        mat_grain_file = matfile(grain_file, 'Writable', true);
+        for ii_f = 1:numel(conf.fields)
+            mat_grain_file.(conf.fields{ii_f}) = grain_det.(conf.fields{ii_f});
+        end
+    end
+end
diff --git a/5_reconstruction/gtAstraReconstructGrain.m b/5_reconstruction/gtAstraReconstructGrain.m
index 250176dbd25cf9f80ec036ca7bfa64b79bd51602..83d82f6e3b817a82458f2d36548689ad72466c0e 100644
--- a/5_reconstruction/gtAstraReconstructGrain.m
+++ b/5_reconstruction/gtAstraReconstructGrain.m
@@ -1,4 +1,4 @@
-function vol = gtAstraReconstructGrain(grainID, phaseID, parameters)
+function gtAstraReconstructGrain(grainID, phaseID, parameters)
 % GTASTRARECONSTRUCTGRAIN  3D ART (ASTRA) reconstruction on a GPU machine
 %     gtAstraReconstructGrain(grainID, phaseID, [parameters])
 %     -------------------------------------------------------
@@ -13,7 +13,7 @@ function vol = gtAstraReconstructGrain(grainID, phaseID, parameters)
 %       Commenting and formatting
 %
 
-    if ~exist('parameters','var') || isempty(parameters)
+    if (~exist('parameters','var') || isempty(parameters))
         parameters = gtLoadParameters();
     end
 
@@ -26,11 +26,15 @@ function vol = gtAstraReconstructGrain(grainID, phaseID, parameters)
         rec.num_iter = parameters.rec.num_iter;
     end
 
-    gr = gtLoadGrain(phaseID, grainID, 'fields', {'proj', 'selected'});
+    gr = gtLoadGrain(phaseID, grainID, 'fields', {'proj'});
+    if (~isfield(gr.proj, 'selected'))
+        gr_extra = gtLoadGrain(phaseID, grainID, 'fields', {'selected'});
+        gr.proj.selected = gr_extra.selected;
+    end
     gr.proj.num_iter = rec.num_iter;
 
-    gr.proj.stack = gr.proj.stack(:, gr.selected, :);
-    gr.proj.geom  = gr.proj.geom(gr.selected, :);
+    gr.proj.stack = gr.proj.stack(:, gr.proj.selected, :);
+    gr.proj.geom  = gr.proj.geom(gr.proj.selected, :);
 
     is_cone = isfield(parameters.labgeo, 'sourcepoint') ...
         && (~isempty(parameters.labgeo.sourcepoint));
@@ -43,4 +47,11 @@ function vol = gtAstraReconstructGrain(grainID, phaseID, parameters)
     end
 
     gtSaveGrain(phaseID, grainID, gr, 'fields', {'vol'});
+
+    shift = gtFwdSimComputeVolumeShifts(gr.proj, parameters, size(gr.vol));
+
+    % Saving details to file
+    gr.VOL3D = struct('intensity', {gr.vol}, 'shift', {shift});
+
+    gtSaveGrainRec(phaseID, grainID, gr, 'fields', {'VOL3D'});
 end