diff --git a/+quantity/BasicVariable.m b/+quantity/BasicVariable.m
index 3d09b575c963bb1220f22603f5dad5359b64e5b7..d0177ea0ae018d09caddba02c6d921567726f6b8 100644
--- a/+quantity/BasicVariable.m
+++ b/+quantity/BasicVariable.m
@@ -39,6 +39,8 @@ function obj = BasicVariable(valueContinuous, varargin)
 
 	if nargin > 0 && ~isempty(varargin)
 
+		% #todo
+		error("This constructor must be reworked!")
 			% make default grid:
 			preParser = misc.Parser();
 			preParser.addParameter('T', 1);
diff --git a/+quantity/Domain.m b/+quantity/Domain.m
index 187f6eac0eee8cb217e9aca186d7f80adcb059bf..d7acf37fa27966ab562d038664930161dc5f6114 100644
--- a/+quantity/Domain.m
+++ b/+quantity/Domain.m
@@ -82,6 +82,14 @@ classdef (InferiorClasses = {?quantity.EquidistantDomain}) Domain < ...
 			quan = quantity.Symbolic(sym(obj.name), obj, 'name', obj.name);
 		end % Symbolic()
 		
+		function q = Function(obj)
+			arguments
+				obj (1,1) quantity.Domain;
+			end
+			
+			q = quantity.Function(eval("@(" + obj.name + ")" + obj.name), obj, 'name', obj.name);
+		end
+		
 	end
 		
 	methods (Access = public)
@@ -220,8 +228,14 @@ classdef (InferiorClasses = {?quantity.EquidistantDomain}) Domain < ...
 			arguments (Repeating)
 				searchName string;
 			end
-						
-			d = obj( obj.gridIndex( searchName ) );
+					
+			idx = obj.gridIndex( searchName );
+			
+			if idx == 0
+				d = [];
+			else 
+				d = obj( idx );
+			end
 		end
 		
 		function rest = remove(obj, toBeRemoved)
diff --git a/+unittests/+quantity/testDiscrete.m b/+unittests/+quantity/testDiscrete.m
index a66b422cf9fec6c844dd6450cff52b2b91c5c945..881c204ce2930cbada25b79a5b1fda1cc95c823b 100644
--- a/+unittests/+quantity/testDiscrete.m
+++ b/+unittests/+quantity/testDiscrete.m
@@ -4,6 +4,25 @@ function [tests] = testDiscrete()
 tests = functiontests(localfunctions);
 end
 
+function testCatBug(tc)
+
+z = quantity.Domain("z", linspace(0, 1, 7));
+zeta = quantity.Domain("zeta", linspace(0, 1, 5));
+A = quantity.Discrete(sin(z.grid * pi), z);
+
+x = A * subs(A, "z", "zeta");
+C1 = [0*z.Discrete + zeta.Discrete; x];
+C2 = [zeta.Discrete + 0*z.Discrete; x];
+tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta]));
+
+x = A * subs(A, "z", "zeta");
+C1 = [0*z.Symbolic + zeta.Symbolic; x];
+C2 = [zeta.Symbolic + 0*z.Symbolic; x];
+tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta]));
+
+end
+
+
 function testEigScalar(tc)
 z = quantity.Domain("z", linspace(-1, 1, 11));
 [Vz, Dz, Wz] = z.Discrete.eig();
diff --git a/+unittests/+quantity/testFunction.m b/+unittests/+quantity/testFunction.m
index 1e46cbcbbe7b95858361874880f9a3464fd97faa..83d001a52672d24dba4f3ae33685dd42520fbe93 100644
--- a/+unittests/+quantity/testFunction.m
+++ b/+unittests/+quantity/testFunction.m
@@ -4,6 +4,19 @@ function [tests] = testFunction()
 tests = functiontests(localfunctions);
 end
 
+function testCatBug(tc)
+
+z = quantity.Domain("z", linspace(0, 1, 7));
+zeta = quantity.Domain("zeta", linspace(0, 1, 5));
+A = quantity.Function(@(z)sin(z * pi), z);
+
+x = A * subs(A, "z", "zeta");
+C1 = [0*z.Function + zeta.Function; x];
+C2 = [zeta.Function + 0*z.Function; x];
+tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta]));
+
+end
+
 function testChangeGrid(tc)
 
 z = quantity.Domain("z", 0:5);
@@ -19,6 +32,7 @@ c = a.changeGrid( linspace(0,5), "z");
 
 end
 
+
 function testAt(tc)
 z = quantity.Domain("z", linspace(0, 1, 11));
 f = quantity.Function({@(z)sin(z), @(z)1+z; @(z)cos(z), @(z)z.^2}, z);
@@ -214,4 +228,4 @@ f = quantity.Function(...
 verifyEqual(testCase, size(f), [2, 3]);
 verifyEqual(testCase, size(f, 2), 3);
 
-end
\ No newline at end of file
+end
diff --git a/+unittests/+quantity/testSymbolic.m b/+unittests/+quantity/testSymbolic.m
index c8b0dc50407cefd85703f8d149d8601cee98e310..87b447ca0367e560a8bdab3331dac98404d447a7 100644
--- a/+unittests/+quantity/testSymbolic.m
+++ b/+unittests/+quantity/testSymbolic.m
@@ -8,18 +8,23 @@ function testValueContinuousBug(tc)
 z = quantity.Domain("z", linspace(0, 1, 7));
 zeta = quantity.Domain("zeta", linspace(0, 1, 5));
 A = quantity.Symbolic(sin(sym("z") * pi), z);
+
 B1 = [0*z.Symbolic + zeta.Symbolic, A + 0*zeta.Symbolic; ...
 	z.Symbolic+zeta.Symbolic, A * subs(A, "z", "zeta")];
 B2 = [zeta.Symbolic + 0*z.Symbolic, A + 0*zeta.Symbolic; ...
 	z.Symbolic+zeta.Symbolic, A * subs(A, "z", "zeta")];
 tc.verifyEqual(B1.on([z, zeta]), B2.on([z, zeta]));
 
-C1 = [0*z.Symbolic + zeta.Symbolic, A + 0*zeta.Symbolic];
-c1 = zeta.Symbolic + 0*z.Symbolic;
-c2 = A + 0*zeta.Symbolic;
-C2 = [c1, c2];
+x = A * subs(A, "z", "zeta");
+C1 = [0*z.Symbolic + zeta.Symbolic; x];
+C2 = [zeta.Symbolic + 0*z.Symbolic; x];
 tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta]));
 
+e = zeta.Symbolic + 0*z.Symbolic;
+e = e.sort();
+f = e.changeGrid({z.grid z.grid}, ["z", "zeta"]);
+
+
 % TODO: fix this error! See issue #41
 % this problem is maybe caused as input arguments of B2(1).valueContinuous is somehow ordered
 % differently compared to B2(2:4).valueContinuous or all B(:).valueContinuous,