diff --git a/align.m b/align.m
index 0daff7c41ac7662293a6e83ef485c1df1ede5c13..6c090af04aad092831480498329f08b85a75a70b 100644
--- a/align.m
+++ b/align.m
@@ -1,16 +1,31 @@
-function [Vals,Offs,varargout] = align(Vals,Offs,varargin)
+function [Vals,Offs,varargout] = align(Vals,Offs,filter,varargin)
 %ALIGN Summary of this function goes here
 %   Detailed explanation goes here
 
-nvararg = nargin-2;
+nvararg = nargin-3;
 numVal = numel(Vals);
 Maxs = cell(size(Vals));
 
-Off_ = Offs{1};
-Max_ = Offs{1}+size(Vals{1});
+for val = 1:numVal
+    if ~isempty(Vals{val})
+        break
+    end
+end
+
+Off_ = Offs{val};
+numDim = numel(Off_);
+Max_ = size(Vals{val});
+Max_(end+1:numDim) = 1;
+Max_ = Max_+Off_;
 
 for val = 1:numVal
-    Maxs{val} = Offs{val}+size(Vals{val});
+    if isempty(Vals{val})
+        continue
+    end
+    
+    Maxs{val} = size(Vals{val});
+    Maxs{val}(end+1:numDim) = 1;
+    Maxs{val} = Maxs{val} + Offs{val};
     
     Off_ = min(Offs{val},Off_);
     Max_ = max(Maxs{val},Max_);
@@ -19,13 +34,24 @@ end
 varargout = varargin;
 
 for val = 1:numVal
-    Vals{val} = padarray(Vals{val},Offs{val}-Off_,nan,'pre');
-    Vals{val} = padarray(Vals{val},Max_-Maxs{val},nan,'post');
+    if isempty(Vals{val})
+        continue
+    end
+    
+    padPre  = Offs{val}-Off_;
+    padPost = Max_-Maxs{val};
+    
+    padPre (~filter) = 0;
+    padPost(~filter) = 0;
+    
+    Vals{val} = padarray(Vals{val},padPre ,nan,'pre' );
+    Vals{val} = padarray(Vals{val},padPost,nan,'post');
     
-    Offs{val} = Off_;
     for it = 1:nvararg
-        varargout{it}{val} = padarray(varargout{it}{val},Offs{val}-Off_,nan,'pre');
-        varargout{it}{val} = padarray(varargout{it}{val},Max_-Maxs{val},nan,'post');
+        varargout{it}{val} = padarray(varargout{it}{val},padPre ,nan,'pre' );
+        varargout{it}{val} = padarray(varargout{it}{val},padPost,nan,'post');
     end
+    
+    Offs{val} = Off_;
 end
 end
\ No newline at end of file
diff --git a/join.m b/join.m
index 554d7f087b6afed6b2de79467d1d86035caa73d4..f4cdbb7f6c730f4a767049480453bd11292d5a26 100644
--- a/join.m
+++ b/join.m
@@ -6,19 +6,39 @@ nvararg = nargin-3;
 numLab = numel(Labs);
 Sizes = cell(1,numLab);
 
-Off = Offs{1};
-Size = Off+size(Labs{1});
+for lab = 1:numLab
+    if ~isempty(Vals{lab})
+        break
+    end
+end
+
+Off = Offs{lab};
+Max = size(Vals{lab});
+numDim = numel(Offs{lab});
+Max(end+1:numDim) = 1;
+Max = Off+Max;
 
 for lab = 1:numLab
+    if isempty(Vals{lab})
+        continue
+    end
+    
     Off = min(Off,Offs{lab});
-    Sizes{lab} = size(Labs{lab});
-    Size = max(Size,Offs{lab}+Sizes{lab});
+    Sizes{lab} = size(Vals{lab});
+    Sizes{lab}(end+1:numDim) = 1;
+    Max = max(Max,Offs{lab}+Sizes{lab});
 end
 
-numDim = numel(Off);
-[Val,Lab,varargout{1:nvararg}] = deal(nan(Size));
+Size = Max-Off;
+
+[Val,varargout{1:nvararg}] = deal(nan(Size));
+Lab = zeros(Size);
 
 for lab = 1:numLab
+    if isempty(Vals{lab})
+        continue
+    end
+    
     Mask = Labs{lab}==lab;
     
     gv = arrayfun(@(sl,ol,o) (1:sl)+ol-o,Sizes{lab},Offs{lab},Off,'UniformOutput',false);
diff --git a/split.m b/split.m
index 65a9ef44dda36273cee09f528bc3a866869226a6..4f990aa4db45719483cb6d3d65cc562338bde04f 100644
--- a/split.m
+++ b/split.m
@@ -3,12 +3,20 @@ function [Vals,Labs,Offs,varargout] = split(Val,Lab,Off,varargin)
 %   Detailed explanation goes here
 
 nvararg = nargin-3;
+numDim = numel(Off);
 numLab = max(Lab(:));
 [Vals,Labs,Offs,varargout{1:nvararg}] = deal(cell(1,numLab));
 
+Offs(:) = deal({Off});
+
 for lab = 1:numLab
+    if ~any(Lab(:)==lab)
+        continue
+    end
+    
     [Vals{lab},gv] = utils.tighten(Val,Lab==lab);
     Labs{lab} = Lab(gv{:});
+    gv(end+1:numDim) = deal({1});
     Offs{lab} = Off-1+cellfun(@(v) v(1),gv);
     
     for it = 1:nvararg