diff --git a/join.m b/join.m
index 6e8148190551c09c5ca148e943d3f653a9e94375..9d01475d289a6179dc390e89f0668a87a3e91d1e 100644
--- a/join.m
+++ b/join.m
@@ -1,57 +1,91 @@
-function [Col,Lab,Off,varargout] = join(Cols,Labs,Offs,varargin)
-%JOIN Summary of this function goes here
+function [Lab,Off,varargout] = join(Labs,Offs,varargin)
+%ALIGN Summary of this function goes here
 %   Detailed explanation goes here
 
-nvararg = nargin-3;
+nvararg = nargin-2;
 numLab = numel(Labs);
-Sizes = cell(1,numLab);
+Maxs = cell(size(Labs));
+
+filter = logical([1,1,0,0,0]);
 
 for lab = 1:numLab
-    if ~isempty(Cols{lab})
-        break
-    end
+    if ~isempty(Offs{lab}); break; end
 end
 
 Off = Offs{lab};
-Max = size(Cols{lab});
-numDim = numel(Offs{lab});
+numDim = numel(Off);
+Max = size(Labs{lab});
 Max(end+1:numDim) = 1;
-Max = Off+Max;
+Max = Max+Off;
 
 for lab = 1:numLab
-    if isempty(Cols{lab})
-        continue
-    end
+    if isempty(Labs{lab}); continue; end
+    
+    Maxs{lab} = size(Labs{lab});
+    Maxs{lab}(end+1:numDim) = 1;
+    Maxs{lab} = Maxs{lab} + Offs{lab};
     
-    Off = min(Off,Offs{lab});
-    Sizes{lab} = size(Cols{lab});
-    Sizes{lab}(end+1:numDim) = 1;
-    Max = max(Max,Offs{lab}+Sizes{lab});
+    Off = min(Offs{lab},Off);
+    Max = max(Maxs{lab},Max);
 end
 
 Size = Max-Off;
-
-[Col,varargout{1:nvararg}] = deal(nan(Size));
 Lab = zeros(Size);
 
-for lab = 1:numLab
-    if isempty(Cols{lab})
-        continue
+[varargout,Size_it,Max_it,Maxs_it] = deal(cell(1,nvararg));
+
+for it = 1:nvararg
+    for lab = 1:numLab
+        if ~isempty(varargin{it}{lab})
+            break
+        end
     end
     
-    Mask = Labs{lab}==lab;
+    numDim = numel(Off);
+    Max_it{it} = size(varargin{it}{lab});
+    Max_it{it}(end+1:numDim) = 1;
+    Max_it{it} = Max_it{it}+Off;
+    
+    for lab = 1:numLab
+        if isempty(varargin{it}{lab}); continue; end
+        
+        Maxs_it{it}{lab} = size(varargin{it}{lab});
+        Maxs_it{it}{lab}(end+1:numDim) = 1;
+        Maxs_it{it}{lab} = Maxs_it{it}{lab} + Offs{lab};
+        
+        Max_it{it} = max(Maxs_it{it}{lab},Max);
+    end
+    
+    Size_it{it} = Max_it{it}-Off;
+    varargout{it} = nan(Size_it{it});
+end
+
+for lab = 1:numLab
+    if isempty(Labs{lab}); continue; end
+    
+    padPre  = Offs{lab}-Off;
+    padPost = Max-Maxs{lab};
+    
+    padPre (~filter) = 0;
+    padPost(~filter) = 0;
     
-    gv = arrayfun(@(sl,ol,o) (1:sl)+ol-o,Sizes{lab},Offs{lab},Off,'UniformOutput',false);
-    GV = cell(1,numDim);
-    [GV{:}] = ndgrid(gv{:});
-    inds = sub2ind(Size,GV{:});
-    inds = inds(Mask(:));
+    Lab_ = padarray(Labs{lab},padPre ,0,'pre' );
+    Lab_ = padarray(Lab_     ,padPost,0,'post');
     
-    Col(inds) = Cols{lab}(Mask(:));
-    Lab(inds) = Labs{lab}(Mask(:));
+    Lab(Lab_==lab) = lab;
     
     for it = 1:nvararg
-        varargout{it}(inds) = varargin{it}{lab}(Mask(:));
+        %padPre  = Offs{lab}-Off;
+        padPost = Max_it{it}-Maxs_it{it}{lab};
+        
+        %padPre (~filter) = 0;
+        padPost(~filter) = 0;
+        
+        varargout_ = padarray(varargin{it}{lab},padPre ,nan,'pre' );
+        varargout_ = padarray(varargout_        ,padPost,nan,'post');
+        
+        Lab_it = Lab_.*ones(Size_it{it});
+        varargout{it}(Lab_it==lab) = varargout_(Lab_it==lab);
     end
 end
 
diff --git a/split.m b/split.m
index a20e2a21434eeba60126f316573175943f3f5445..fbf93b7c87ffa9f8fda8f56bd53eed3df6cf3f62 100644
--- a/split.m
+++ b/split.m
@@ -5,9 +5,11 @@ function [Cols,Labs,Offs,varargout] = split(Col,Lab,Off,varargin)
 nvararg = nargin-3;
 numDim = numel(Off);
 numLab = max(Lab(:));
+
 [Cols,Labs,Offs,varargout{1:nvararg}] = deal(cell(1,numLab));
 
 Offs(:) = deal({Off});
+Lab = Lab.*ones(size(Col));
 
 for lab = 1:numLab
     if ~any(Lab(:)==lab)