diff --git a/LFtoSR.m b/LFtoSR.m
index ddf601e4859b78a8cb4d61f556bb7df8ec18c106..f4d2c2266a10b18c989e5cb98543ab0b9cbb250e 100644
--- a/LFtoSR.m
+++ b/LFtoSR.m
@@ -38,16 +38,17 @@ end
 % Lightfield properties
 LFVal  = LFSet.Value;
 LFLab  = LFSet.Label;
-LFDisp = LFSet.Disparity;
+LFDispX = LFSet.DisparityX;
+LFDispY = LFSet.DisparityY;
 LFPos  = LFSet.Position;
-LFSize = LFSet.Size;
+LFSize = size(LFVal);
 
 % Number of super-rays to be in the set
 numLab = max(LFLab(:));
 
 % Initialize super-ray set
-[SRVal,SRSize,SRPos,SRDisp,SRLab] = deal(cell(numLab,1));
-SRSet = SR.FieldsToSet(SRVal,SRSize,SRPos,SRDisp,SRLab);
+[SRVal,SRLab,SRPos,SRDispX,SRDispY] = deal(cell(numLab,1));
+SRSet = SR.FieldsToSet(SRVal,SRLab,SRPos,SRDispX,SRDispY);
 
 % Lightfield grid vectors representing super-ray bounding box
 ugv = reshape(1:LFSize(1),[],1);
@@ -103,7 +104,8 @@ for lab = 1:numLab
     Mask = LFLab==lab;
     
     % Set current super-ray disparity
-    SRSet(lab).Disparity = median(LFDisp(Mask));    
+    SRSet(lab).DisparityX = median(LFDispX(Mask));    
+    SRSet(lab).DisparityY = median(LFDispY(Mask));    
 
     % x and y coordinates of each pixel of the super-ray after disparity compensation
     if relative
@@ -136,7 +138,7 @@ for lab = 1:numLab
     [SRUq,SRVq,SRXq,SRYq] = ndgrid(srugv,srvgv,srxgv,srygv);
     
     % Set current super-ray size (size of the bounding box)
-    SRSet(lab).Size = [numel(srugv),numel(srvgv),numel(srxgv),numel(srygv)];
+    SRSize = [numel(srugv),numel(srvgv),numel(srxgv),numel(srygv)];
     
     % Perform disparity compensation if necessary
     if ~dispComp
@@ -159,7 +161,7 @@ for lab = 1:numLab
             inSRMask = repmat(any(any(inSRMask,1),2),size(inSRMask,1),size(inSRMask,2),1,1);
         case 'all'
             % inside super-ray bounding box
-            inSRMask = true(SRSet(lab).Size);
+            inSRMask = true(SRSize);
     end
     
     % Set label inside super-ray boundary
diff --git a/SRtoLF.m b/SRtoLF.m
index e73dd15a4e49ef69a812a847aace374096716d82..3c92dbe63cb5a4d71c474b70ea3ce713555c63f9 100644
--- a/SRtoLF.m
+++ b/SRtoLF.m
@@ -41,18 +41,19 @@ else
 end
 
 %% Initialize constants
-%SRVal  = {SRSet.Value};
-%SRLab  = {SRSet.Label};
+SRVal  = {SRSet.Value};
+% SRLab  = {SRSet.Label};
 SRPos  = {SRSet.Position};
-SRDisp = {SRSet.Disparity};
-SRSize = {SRSet.Size};
+% SRDispX = {SRSet.DisparityX};
+% SRDispY = {SRSet.DisparityY};
+SRSize = cellfun(@size,SRVal,'UniformOutput',false);
 
 % Number of super-rays in the set
 numLab = numel(SRSet);
 
 % Lightfield central (reference) view coordinates 
-uref = floor(SRSet(1).Size(1)/2)+1; 
-vref = floor(SRSet(1).Size(2)/2)+1; 
+uref = floor(SRSize{1}(1)/2)+1; 
+vref = floor(SRSize{1}(2)/2)+1; 
 
 % Structuring element to dilate super-ray for cubic interpolation
 se = strel('arbitrary',reshape([0,1,0],1,1,3)|reshape([0,1,0],1,1,1,3));
@@ -76,8 +77,8 @@ if extend
 end
     
 % Initialize lightfield
-[LFVal,LFDisp,LFLab,LFBuf] = deal(nan(LFSize));
-LFSet = SR.FieldsToSet(LFVal,LFSize,LFPos,LFDisp,LFLab);
+[LFVal,LFLab,LFDispX,LFDispY,LFBuf] = deal(nan(LFSize));
+LFSet = SR.FieldsToSet(LFVal,LFLab,LFPos,LFDispX,LFDispY);
 
 switch order
     case 'ascend'
@@ -95,9 +96,10 @@ for lab = sortedLab
     
     % Current super-ray properties
     SRVal  = SRSet(lab).Value;
-    SRSize = SRSet(lab).Size;
+    SRSize = size(SRVal);
     SRPos  = SRSet(lab).Position;
-    SRDisp = SRSet(lab).Disparity;
+    SRDispX = SRSet(lab).DisparityX;
+    SRDispY = SRSet(lab).DisparityY;
     SRLab  = SRSet(lab).Label;
     
     % Super-ray position (offset from reference frame center)
@@ -196,10 +198,11 @@ for lab = sortedLab
     indSRLFMask = indLF(SRLFMask);
     
     % Set lightfield pixels values, label and disparity corresponding to current super-ray
-    LFSet.Value    (indSRLFMask) = LFVal(SRLFMask);
-    LFSet.Label    (indSRLFMask) = LFLab(SRLFMask);
-    LFSet.Disparity(indSRLFMask) = SRDisp;
-    LFBuf          (indSRLFMask) = LFBuf(indSRLFMask)+1;    
+    LFSet.Value     (indSRLFMask) = LFVal(SRLFMask);
+    LFSet.Label     (indSRLFMask) = LFLab(SRLFMask);
+    LFSet.DisparityX(indSRLFMask) = SRDispX;
+    LFSet.DisparityY(indSRLFMask) = SRDispY;
+    LFBuf           (indSRLFMask) = LFBuf(indSRLFMask)+1;    
 end
 utils.printSameLine();
 
diff --git a/align.m b/align.m
index ecd70a1230f2d00e7e8cd93068cc348097fca64b..ee62356ce5ab7c489cd013de3a94bbff8430ea8e 100644
--- a/align.m
+++ b/align.m
@@ -5,12 +5,14 @@ function [SR1Set,SR2Set] = align(SR1Set,SR2Set)
 SR1Val  = {SR1Set.Value};
 SR1Lab  = {SR1Set.Label};
 SR1Pos  = {SR1Set.Position};
-SR1Disp = {SR1Set.Disparity};
+SR1DispX = {SR1Set.DisparityX};
+SR1DispY = {SR1Set.DisparityY};
 
 SR2Val  = {SR2Set.Value};
 SR2Lab  = {SR2Set.Label};
 SR2Pos  = {SR2Set.Position};
-SR2Disp = {SR2Set.Disparity};
+SR2DispX = {SR2Set.DisparityX};
+SR2DispY = {SR2Set.DisparityY};
 
 for lab = 1:numel(SR1Lab)
     SR1Lab{lab}(SR1Lab{lab}==0) = nan;
@@ -25,12 +27,7 @@ for lab = 1:numel(SR1Lab)
     SR2Lab{lab}(isnan(SR2Lab{lab})) = 0;
 end
 
-SR1Size = cellfun(@size,SR1Val,'UniformOutput',false);
-SR2Size = cellfun(@size,SR2Val,'UniformOutput',false);
+SR1Set = SR.FieldsToSet(SR1Val,SR1Lab,SR1Pos,SR1DispX,SR1DispY);
+SR2Set = SR.FieldsToSet(SR2Val,SR2Lab,SR2Pos,SR2DispX,SR2DispY);
 
-SR1Set = struct('Value',SR1Val,'Label',SR1Lab,'Position',SR1Pos,...
-    'Disparity',SR1Disp,'Size',SR1Size);
-
-SR2Set = struct('Value',SR2Val,'Label',SR2Lab,'Position',SR2Pos,...
-    'Disparity',SR2Disp,'Size',SR2Size);
 end
\ No newline at end of file
diff --git a/completeSet.m b/completeSet.m
index f815b8e051e23e5991aa6f389e339b7094d42917..768885f0d34a5d3c5ec942a943f1a72d347573af 100644
--- a/completeSet.m
+++ b/completeSet.m
@@ -2,7 +2,7 @@ function CompSet = completeSet(RefSet,method,varargin)
 %COMPLETESET Summary of this function goes here
 %   Detailed explanation goes here
 
-[Value,Size,Position,Disparity,~] = SR.SetToFields(RefSet);
+[Value,~,Position,DisparityX,DisparityY] = SR.SetToFields(RefSet);
 
 SRSize  = [];
 maxSize = [];
@@ -26,7 +26,7 @@ parfor it=1:numel(Value)
     LabelComp{it} = it*double(MaskComp{it});
 end
 
-CompSet = SR.FieldsToSet(ValueComp,Size,Position,Disparity,LabelComp);
+CompSet = SR.FieldsToSet(ValueComp,LabelComp,Position,DisparityX,DisparityY);
 
 %% Auxiliary functions
     function LFRef = SRtoLF(SRRef)
diff --git a/factorizeGlobal.m b/factorizeGlobal.m
index 2162c4d4c2b91a210d3bcee5ce0d89bade0e4f1c..85d21b64d2a0aa9962a9ee0204c7b0a5cd386696 100644
--- a/factorizeGlobal.m
+++ b/factorizeGlobal.m
@@ -11,7 +11,6 @@ SRB = LFtoSR(LFB,SRMask);
 
 for lab=1:numel(SRRef)
     SRBSet(lab).Value = SRB{lab};
-    SRBSet(lab).Size  = size(SRB{lab});    
     SRBSet(lab).Label = lab*double(~isnan(SRB{lab}));
 end
 
@@ -53,5 +52,4 @@ end
         
         SRRef = cellfun(@(sr) permute(sr,[3,4,1,2]),SRRef,'UniformOutput',false);
     end
-end
-
+end
\ No newline at end of file
diff --git a/factorizeLocal.m b/factorizeLocal.m
index f7905ab1104a78c207cfc3ee08faddf5865c7740..df70566ff0bdb280642fd4f33ba23db996144e84 100644
--- a/factorizeLocal.m
+++ b/factorizeLocal.m
@@ -9,7 +9,6 @@ SRRef = {SRRefSet.Value};
 
 for lab=1:numel(SRRef)
     SRBSet(lab).Value = SRB{lab};
-    SRBSet(lab).Size  = size(SRB{lab});
     SRBSet(lab).Label = lab*double(~isnan(SRB{lab}));
 end
 end
\ No newline at end of file
diff --git a/fuse.m b/fuse.m
index 9c6151f3389c4b66c23b525a380efdc18938da6e..7beb9dfdab12f38f921a7b20e1be77a528c34657 100644
--- a/fuse.m
+++ b/fuse.m
@@ -2,10 +2,11 @@ function SRBlendSet = fuse(SRVisSet,SRHidSet)
 %FUSE Summary of this function goes here
 %   Detailed explanation goes here
 
-SRVisVal = {SRVisSet.Value};
-SRVisLab = {SRVisSet.Label};
-SRVisPos = {SRVisSet.Position};
-SRVisDisp = {SRVisSet.Disparity};
+SRVisVal   = {SRVisSet.Value};
+SRVisLab   = {SRVisSet.Label};
+SRVisPos   = {SRVisSet.Position};
+SRVisDispX = {SRVisSet.DisparityX};
+SRVisDispY = {SRVisSet.DisparityY};
 
 SRHidVal = {SRHidSet.Value};
 SRHidLab = {SRHidSet.Label};
@@ -19,13 +20,10 @@ end
 
 [SRBlendVal,SRBlendPos] = SR.fuseSR(SRVisVal,SRVisPos,SRHidVal,SRHidPos);
  SRBlendLab             = SR.fuseSR(SRVisLab,SRVisPos,SRHidLab,SRHidPos);
-SRBlendDisp = SRVisDisp;
 
 for lab = 1:numel(SRVisLab)
     SRBlendLab{lab}(isnan(SRBlendLab{lab})) = 0;
 end
 
-SRBlendSize = cellfun(@size,SRBlendVal,'UniformOutput',false);
-SRBlendSet = struct('Value',SRBlendVal,'Label',SRBlendLab,'Position',SRBlendPos,...
-    'Disparity',SRBlendDisp,'Size',SRBlendSize);
+SRBlendSet = SR.FieldsToSet(SRBlendVal,SRBlendLab,SRBlendPos,SRVisDispX,SRVisDispY);
 end
\ No newline at end of file
diff --git a/pseudoInvGlobal.m b/pseudoInvGlobal.m
index 108d9f29b3287e90b0812bdb1246a6fb4e0b84a4..ea44497ac226a5f1c04d76fc4944ca3b56a0bd6f 100644
--- a/pseudoInvGlobal.m
+++ b/pseudoInvGlobal.m
@@ -8,8 +8,10 @@ SRB = {SRBSet.Value};
 SRRef = {SRRefSet.Value};
 
 for lab =1:numel(SRB)
-    angB = SRBSet(lab).Size(1:2);
-    angRef = SRRefSet(lab).Size(1:2);
+    szB = size(SRBSet(lab).Value);
+    angB = szB(1:2);
+    szRef = size(SRRefSet(lab).Value);
+    angRef = szRef(1:2);
     M = ~isnan(SRBSet(lab).Value);
     MB = repmat(all(all(M,1),2),[angB,1,1]);
     MRef = repmat(all(all(M,1),2),[angRef,1,1]);
diff --git a/pseudoInvLocal.m b/pseudoInvLocal.m
index 2bbbc1bf831054484612e73631f0d099fa34bf41..fbf4861b60e04b34380eb19c2eccfaf899178f34 100644
--- a/pseudoInvLocal.m
+++ b/pseudoInvLocal.m
@@ -8,8 +8,10 @@ SRB = {SRBSet.Value};
 SRRef = {SRRefSet.Value};
 
 for lab =1:numel(SRB)
-    angB = SRBSet(lab).Size(1:2);
-    angRef = SRRefSet(lab).Size(1:2);
+    szB = size(SRBSet(lab).Value);
+    angB = szB(1:2);
+    szRef = size(SRRefSet(lab).Value);
+    angRef = szRef(1:2);
     M = ~isnan(SRBSet(lab).Value);
     MB = repmat(all(all(M,1),2),[angB,1,1]);
     MRef = repmat(all(all(M,1),2),[angRef,1,1]);