diff --git a/align.m b/align.m
index 94f52e02cd07a456a135a0e350ee4f815dbcee08..d6773c514f3b266e984592b7477440580f0ba33c 100644
--- a/align.m
+++ b/align.m
@@ -6,14 +6,13 @@ function [Ref,Rec] = align(Ref,Rec)
 [OffRec,ColRec,LabRec] = SR.SetToFields(Rec);
 
 numLab = numel(LabRef);
-filter = logical([1,1,1,0,0]);
 
 for lab = 1:numLab
     LabRef{lab}(LabRef{lab}==0) = nan;
     LabRec{lab}(LabRec{lab}==0) = nan;
     
     [Cols,Offs,Labs] = utils.align({ColRef{lab},ColRec{lab}},...
-        {OffRef{lab},OffRec{lab}},filter,{LabRef{lab},LabRec{lab}});
+        {OffRef{lab},OffRec{lab}},{LabRef{lab},LabRec{lab}});
     
     [ColRef{lab},ColRec{lab}] = deal(Cols{:});
     [OffRef{lab},OffRec{lab}] = deal(Offs{:});
diff --git a/complete.m b/complete.m
index ff020ad7a7fe70168fd1ca71510a455ce0872e22..8c952b33900a5263c516fdb1aeaa83fed9e717c9 100644
--- a/complete.m
+++ b/complete.m
@@ -2,27 +2,25 @@ function [Ref,Value,Mask] = complete(Ref,method,varargin)
 %COMPLETESET Summary of this function goes here
 %   Detailed explanation goes here
 
-[Offset,Color,Label] = SR.SetToFields(Ref);
+[Offset,Color] = SR.SetToFields(Ref);
 Size = cellfun(@size,Color,'UniformOutput',false);
 [ImgSize,ImgRes] = cellfun(@(x) deal(x(1:3),x(4:end)),Size,'UniformOutput',false);
 RefSize = size(Ref);
-numLab = numel(Label);
+numLab = numel(Color);
 
 for lab = 1:numLab
-    Color{lab} = reshape(Color{lab},prod(ImgSize{lab}),prod(ImgRes{lab}));
-    Label{lab} = reshape(Label{lab},prod(ImgSize{lab}),prod(ImgRes{lab}));
-    Color{lab}(~(Label{lab}==lab)) = nan;
+    Color{lab} = reshape(Color{lab},prod(ImgSize{lab}),[]);
 end
 
 switch method
     case 'global'
         Value = {Set2Matrix(Color)};
-        Mask  = {Set2Matrix(Label)};
     case 'local'
         Value = Color;
-        Mask  = Label;
 end
 
+Mask = Value;
+
 for it = 1:numel(Value)
     [Value{it},Mask{it}] = utils.complete(Value{it},varargin{:});
 end
@@ -37,10 +35,10 @@ switch method
 end
 
 for lab = 1:numLab
-    Color{lab} = reshape(Color{lab},[ImgSize{lab},ImgRes{lab}]);
     Label{lab} = reshape(Label{lab},[ImgSize{lab},ImgRes{lab}]);
-    Color{lab}(~Label{lab}) = nan;
-    Label{lab} = lab*double(Label{lab});
+    Color{lab} = reshape(Color{lab},[ImgSize{lab},ImgRes{lab}]);
+    
+    Label{lab} = lab*double(any(Label{lab},3));
 end
 
 Color = reshape(Color,RefSize);
@@ -52,7 +50,7 @@ Ref = SR.FieldsToSet(Offset,Color,Label);
     function Matrix = Set2Matrix(Set)
         Matrix = cell2mat(reshape(Set,[],1));
     end
-       
+
     function Set = Matrix2Set(Matrix,ImgSize,ImgRes)
         for iter = 1:numel(ImgSize)
             ImgSize{iter} = prod(ImgSize{iter});
diff --git a/completeOriginal.m b/completeOriginal.m
index ab2af9fb8bef484b988a9bf1d90860b2a216119c..3eae5209ac474643f5b3b37c0f11e89db69dd47b 100644
--- a/completeOriginal.m
+++ b/completeOriginal.m
@@ -3,17 +3,27 @@ function Ref = completeOriginal(Ref)
 %   Detailed explanation goes here
 
 [Offset,Color,Label] = SR.SetToFields(Ref);
-Size = cellfun(@size,Color,'UniformOutput',false);
-[ImgSize,ImgRes] = cellfun(@(x) deal(x(1:3),x(4:end)),Size,'UniformOutput',false);
 
 numLab = numel(Label);
 
 for lab = 1:numLab
-    Label{lab} = reshape(Label{lab},prod(ImgSize{lab}),prod(ImgRes{lab}));
-    Label{lab} = repmat(any(Label{lab}==lab,2),1,size(Label{lab},2));
-    Label{lab} = lab*double(Label{lab});
-    Label{lab} = reshape(Label{lab},[ImgSize{lab},ImgRes{lab}]);
-    Color{lab}(Label{lab}~=lab) = nan;
+    LFSize = size(Color{lab});
+    ImgSize = LFSize(1:2);
+    ImgRes = LFSize(4:end);
+    
+    ImgSizeC = num2cell(ImgSize);
+    ImgResC  = num2cell(ImgRes);
+    
+    Label{lab} = reshape(Label{lab},prod(ImgSize),[]);
+    Color{lab} = reshape(Color{lab},prod(ImgSize),[]);
+    
+    M = any(Label{lab}==lab,2);
+    Label{lab}( M,:) = lab;
+    Label{lab}(~M,:) = 0;
+    Color{lab}(~M,:) = nan;
+    
+    Label{lab} = reshape(Label{lab},ImgSizeC{:},[],ImgResC{:});
+    Color{lab} = reshape(Color{lab},ImgSizeC{:},[],ImgResC{:});
 end
 
 Ref = SR.FieldsToSet(Offset,Color,Label);
diff --git a/factorize.m b/factorize.m
index d527e59772ce52dfc96ee3ab192b65ef48728cec..061941c407b920b056cd62674bbe96938aec9c89 100644
--- a/factorize.m
+++ b/factorize.m
@@ -9,6 +9,7 @@ RefSize = size(Ref);
 numLab = numel(Label);
 
 for lab = 1:numLab
+    Label{lab} = Label{lab}.*ones(Size{lab});
     Color{lab} = reshape(Color{lab},prod(ImgSize{lab}),prod(ImgRes{lab}));
     Label{lab} = reshape(Label{lab},prod(ImgSize{lab}),prod(ImgRes{lab}));
     Color{lab}(~(Label{lab}==lab)) = nan;
@@ -39,7 +40,7 @@ end
 
 for lab = 1:numLab
     Color{lab} = reshape(Color{lab},[ImgSize{lab},ImgRes{lab}]);
-    Label{lab} = lab.*double(~isnan(Color{lab}));
+    Label{lab} = lab*double(any(~isnan(Color{lab}),3));
 end
 
 Color = reshape(Color,RefSize);
diff --git a/fuse.m b/fuse.m
index 44cbf5422c179bc1193f3242270707a872644967..76bafe82eae5d6b7fe1cfc4f2d7413659bbd16a6 100644
--- a/fuse.m
+++ b/fuse.m
@@ -14,20 +14,19 @@ elseif isempty(VisSet)
 end
 
 numLab = numel(LabVis);
-filter = logical([1,1,1,0,0]);
 
 for lab = 1:numLab
     LabVis{lab}(LabVis{lab}==0) = nan;
     LabOcc{lab}(LabOcc{lab}==0) = nan;
     
     [Cols,Offs,Labs] = utils.align({ColVis{lab},ColOcc{lab}},...
-        {OffVis{lab},OffOcc{lab}},filter,{LabVis{lab},LabOcc{lab}});
+        {OffVis{lab},OffOcc{lab}},{LabVis{lab},LabOcc{lab}});
     
     for it = 1:numel(Labs)
         Labs{it} = it.*double(Labs{it}==lab);
     end
     
-    [ColVis{lab},LabVis{lab},OffVis{lab}] = utils.join(Cols,Labs,Offs);
+    [LabVis{lab},OffVis{lab},ColVis{lab}] = utils.join(Labs,Offs,Cols);
     
     LabVis{lab} = lab.*double(LabVis{lab}~=0);
 end
diff --git a/getQueryCoordsAffine.m b/getQueryCoordsAffine.m
index 675aa505d1a21118b3da8d3cf9f534ca50f78e42..70e8c0750e2c7ad805b0b8524defec315e4e4025 100644
--- a/getQueryCoordsAffine.m
+++ b/getQueryCoordsAffine.m
@@ -17,6 +17,7 @@ LFDisp(isnan(LFDisp))=0;
 
 % Compute projected coordinates of reference samples
 gv = arrayfun(@(x) 1:x,LFSize,'UniformOutput',false);
+gv{3} = 1;
 ugv = reshape(gv{4},1,1,1,[],1);
 vgv = reshape(gv{5},1,1,1,1,[]);
 ugv = ugv-centerView(1);
diff --git a/join.m b/join.m
index afef225456bd68c21e4992d9645241c97d5d0328..24d86071f5e42be0d828be43373e157f62bda22d 100644
--- a/join.m
+++ b/join.m
@@ -4,7 +4,7 @@ function Ref = join(Ref)
 
 [Offset,Color,Label] = SR.SetToFields(Ref);
 
-[Color,Label,Offset] = utils.join(Color,Label,Offset);
+[Label,Offset,Color] = utils.join(Label,Offset,Color);
 
 Ref = SR.FieldsToSet(Offset,Color,Label);
 
diff --git a/project.m b/project.m
index 04a4cc50d4a784288a4914013ff239a6d360c1f7..e91f419ee1f609f263e7d2e6873af13a87fb4194 100644
--- a/project.m
+++ b/project.m
@@ -14,20 +14,18 @@ for lab = 1:numLab
     SizeRef = size(ColorRef{lab});
     SizeRef(end+1:5) = 1;
     ImgSizeRef = SizeRef(1:3);
-    ImgResRef = SizeRef(4:end);
     
-    ColorRef{lab} = reshape(ColorRef{lab},prod(ImgSizeRef),prod(ImgResRef));
-    LabelRef{lab} = reshape(LabelRef{lab},prod(ImgSizeRef),prod(ImgResRef));
-    ColorRef{lab}(~( LabelRef{lab}==lab)) = 0;
+    M = (LabelRef{lab}~=lab) & true(SizeRef);
+    ColorRef{lab}(M) = 0;
+    ColorRef{lab} = reshape(ColorRef{lab},prod(ImgSizeRef),[]);
     
     SizeRec = size(ColorRec{lab});
     SizeRec(end+1:5) = 1;
     ImgSizeRec = SizeRec(1:3);
-    ImgResRec = SizeRec(4:end);
     
-    ColorRec{lab} = reshape(ColorRec{lab},prod(ImgSizeRec),prod(ImgResRec));
-    LabelRec{lab} = reshape(LabelRec{lab},prod(ImgSizeRec),prod(ImgResRec));
-    ColorRec{lab}(~(LabelRec{lab}==lab)) = 0;
+    M = (LabelRec{lab}~=lab) & true(SizeRec);
+    ColorRec{lab}(M) = 0;
+    ColorRec{lab} = reshape(ColorRec{lab},prod(ImgSizeRec),[]);
 end
 
 switch method
diff --git a/separate.m b/separate.m
index 63c98e68b419bb8de7c79ad23aa5f80b36929cfe..63f9858d10ea3392d35e26155d3aa600ecded29b 100644
--- a/separate.m
+++ b/separate.m
@@ -3,20 +3,25 @@ function [VisRef,OccRef] = separate(Ref,Mask)
 %   Detailed explanation goes here
 
 [Offset,ColVis,LabVis] = SR.SetToFields(Ref);
-numLab = numel(LabVis);
+numLab = numel(Ref);
 
 ColOcc = ColVis;
 LabOcc = LabVis;
 
 for lab = 1:numLab
-    LabOcc{lab} = LabVis{lab}==lab & ~Mask{lab};
-    LabVis{lab} = LabVis{lab}==lab &  Mask{lab};
+    MVis = LabVis{lab}==lab &  Mask{lab};
+    MOcc = LabOcc{lab}==lab & ~Mask{lab};
     
-    ColVis  {lab}( ~LabVis{lab}) = nan;
-    ColOcc  {lab}(~~LabVis{lab}) = nan;
+    LabVis{lab}( MVis) = lab;
+    LabVis{lab}(~MVis) = 0;
+    LabOcc{lab}( MOcc) = lab;
+    LabOcc{lab}(~MOcc) = 0;
     
-    LabVis{lab} = lab*double(LabVis{lab});
-    LabOcc{lab} = lab*double(LabOcc{lab});
+    MVis = MVis & true(size(ColVis{lab}));
+    MOcc = MOcc & true(size(ColOcc{lab}));
+    
+    ColVis{lab}(~MVis) = nan;
+    ColOcc{lab}(~MOcc) = nan;
 end
 
 VisRef = SR.FieldsToSet(Offset,ColVis,LabVis);