diff --git a/@BearImp/BearImp.m b/@BearImp/BearImp.m
index 87343c1d532234c000992d9fdf919b8cb45a88ad..f2a94bb99f28792aa62944eeb169d793d9201219 100644
--- a/@BearImp/BearImp.m
+++ b/@BearImp/BearImp.m
@@ -35,6 +35,8 @@ classdef BearImp < handle & matlab.mixin.Copyable
     properties (Access = public)
         % gibt an, ob die Werte vorhanden und aktuell sind
         up2date = struct('L',false,'S',false,'T',false,'R',false,'G',false,'B',false,'H',false,'Z',false)
+        materials
+        inputDataTableFile = 'InputData.xlsx';
     end
     
     properties (Dependent, SetAccess = immutable, GetAccess = public)
@@ -76,6 +78,7 @@ classdef BearImp < handle & matlab.mixin.Copyable
     end
     methods (Access = public)
         setBearing(obj,name)
+        setFitting(obj,shaft,housing)
         setLube   (obj,name)
         calculate (obj)
         calculateContinuous(obj,n)
@@ -241,6 +244,18 @@ classdef BearImp < handle & matlab.mixin.Copyable
                          obj.up2date.L       &&...
                          obj.up2date.S;
         end
+        function materials = get.materials(obj)
+            if ~isstruct(obj.materials)
+                materialTable = readtable(obj.inputDataTableFile,'Sheet','Materials');
+                materialTable = removevars(materialTable,'possible_el_behaviours');
+                for ii = 1:height(materialTable)
+                    materials.(materialTable(ii,:).Material{:}) = table2struct(materialTable(ii,:));
+                end
+                obj.materials = materials;
+            else
+                materials = obj.materials;
+            end
+        end
     end
     
     methods (Access = protected)
diff --git a/@BearImp/calcClear.m b/@BearImp/calcClear.m
index 88ed5e6d136993b76c6508364860bae381903f4e..00c156840cd6d7e152e7edaf59b200c937bd1eeb 100644
--- a/@BearImp/calcClear.m
+++ b/@BearImp/calcClear.m
@@ -46,20 +46,20 @@ R.DeltaP_G = R.DeltaD_ue + R.Gprime - R.DeltaD_F + R.DeltaD_T + R.DeltaD_W + R.D
 R.ue_W = R.ue_d - R.DeltaP_W;
 R.ue_G = R.ue_D - R.DeltaP_G;
 if R.ue_W > 0 % Überprüfe, ob Spiel oder Übermaß vorliegt
-    R.sigma_rir = R.ue_W./L.d .* 1./(((1+(L.d./L.d_f).^2)./(1-(L.d./L.d_f).^2)+1./L.nu_ir)./L.E_ir + ...
-                                     ((1+(L.d_i./L.d).^2)./(1-(L.d_i./L.d).^2)-1./L.nu_W )./L.E_W);
+    R.sigma_rir = R.ue_W./L.d .* 1./(((1+(L.d./L.d_f).^2)./(1-(L.d./L.d_f).^2)+1./L.ring .nu)./L.ring .E + ...
+                                     ((1+(L.d_i./L.d).^2)./(1-(L.d_i./L.d).^2)-1./L.shaft.nu)./L.shaft.E);
 else
     R.sigma_rir = 0;
 end
 if R.ue_G > 0
-    R.sigma_rar = R.ue_G./L.D .* 1./(((1+(L.D_f./L.D).^2)./(1-(L.D_f./L.D).^2)-1./L.nu_ar)./L.E_ar + ...
-                                     ((1+(L.D./L.D_G).^2)./(1-(L.D./L.D_G).^2)+1./L.nu_G)./L.E_G);
+    R.sigma_rar = R.ue_G./L.D .* 1./(((1+(L.D_f./L.D).^2)./(1-(L.D_f./L.D).^2)-1./L.ring   .nu)./L.ring   .E + ...
+                                     ((1+(L.D./L.D_G).^2)./(1-(L.D./L.D_G).^2)+1./L.housing.nu)./L.housing.E);
 else
     R.sigma_rar = 0;
 end
-R.e_ir = 2000 .* L.d./L.E_ir .* (L.d./L.d_f)./(1-(L.d./L.d_f).^2) .* R.sigma_rir .* 1e-3;
-R.e_ar = 2000 .* L.D./L.E_ar .* (L.D_f./L.D)./(1-(L.D_f./L.D).^2) .* R.sigma_rar .* 1e-3;
-R.e_t = L.alpha_t .* L.d_m .* 5; % aktuell mit fix Detla_t = 5 implementiert
+R.e_ir = 2000 .* L.d./L.ring.E .* (L.d./L.d_f)./(1-(L.d./L.d_f).^2) .* R.sigma_rir .* 1e-3;
+R.e_ar = 2000 .* L.D./L.ring.E .* (L.D_f./L.D)./(1-(L.D_f./L.D).^2) .* R.sigma_rar .* 1e-3;
+R.e_t = L.ring.alpha_t .* L.d_m .* 5; % aktuell mit fix Detla_t = 5 implementiert
 R.P_d = L.c - R.e_ir + R.e_ar - R.e_t + 0; % aktuelle mit fix e_L = 0 implementiert
 
 %% Attribute ändern
diff --git a/@BearImp/calcFilm.m b/@BearImp/calcFilm.m
index 303f5ef6d4eebb9297fc182ecc5ec2fab0a5d045..f8f4906249da0de98d0b35525543cace95ed8174 100644
--- a/@BearImp/calcFilm.m
+++ b/@BearImp/calcFilm.m
@@ -22,8 +22,8 @@ L = obj.L; S = obj.S; T = obj.T; G = obj.G; B = obj.B; T_Oil = obj.T_Oil; n = ob
 H = struct;
 
 %% Berechnung
-H.b(1,:) = (6*G.fraktE_i.*B.Q.*G.R_si  ./  (pi*G.k_i.*G.E_redi)).^(1/3);
-H.b(2,:) = (6*G.fraktE_a.*B.Q.*G.R_sa  ./  (pi*G.k_a.*G.E_reda)).^(1/3);
+H.b(1,:) = (6*G.fraktE_i.*B.Q.*G.R_si  ./  (pi*G.k_i.*G.E_red)).^(1/3);
+H.b(2,:) = (6*G.fraktE_a.*B.Q.*G.R_sa  ./  (pi*G.k_a.*G.E_red)).^(1/3);
 H.a = bsxfun(@times,[G.k_i;G.k_a],H.b);
 H.A = pi*H.a.*H.b;
 H.p = bsxfun(@rdivide,B.Q,H.A);
diff --git a/@BearImp/calcGeo.m b/@BearImp/calcGeo.m
index a8fabfd7b5d02d47b11c319ceb859b0191439b79..ccdc75dcd6711247a2745a00a17f39c34e8e58ca 100644
--- a/@BearImp/calcGeo.m
+++ b/@BearImp/calcGeo.m
@@ -20,9 +20,7 @@ L = obj.L; R = obj.R; F_a = obj.F_a;
 G = struct;
 
 %% Berechnung
-G.E_redi = 2  ./  ((1-L.nu_wk.^2)./L.E_wk + (1-L.nu_ir.^2)/L.E_ir);
-G.E_reda = 2  ./  ((1-L.nu_wk.^2)./L.E_wk + (1-L.nu_ar.^2)/L.E_ar);
-G.E_red = [G.E_redi;G.E_reda];
+G.E_red = 2  ./  ((1-L.RE_A.nu.^2)./L.RE_A.E + (1-L.ring.nu.^2)/L.ring.E);
 G.B_m = L.f_a + L.f_i - 1;
 if F_a
     if R.P_d > 0
diff --git a/@BearImp/setBearing.m b/@BearImp/setBearing.m
index 76305eeebd3a483199484c37475923d22e61621e..7babfa974b82372284a5f42930b90733ff22a61e 100644
--- a/@BearImp/setBearing.m
+++ b/@BearImp/setBearing.m
@@ -1,29 +1,102 @@
-function setBearing(obj,name)
-%setBearing       -> öffnet ein Auswahlmenü, um ein Lager auszuwählen
-%setBearing(name) -> lädt das angegebene Lager
-%Voraussetzung: 'Lager.xlsx' im Suchpfad
-
-%    pmd Berechnungstool Lagerimpedanz
-%    Version: 1.0.0
-%    Stand: 12.05.2021
-%    Autor: Steffen Puchtler
-
-    arguments
-        obj
-        name char = ''
-    end
-    bearingTable = readtable('Bearings.xlsx');
-    if isempty(name)    % kein Lager gegeben
-        [selection, ok] = listdlg('ListString',bearingTable.Labelling,'SelectionMode','Single','Name','Lagerauswahl','PromptString','Wählen Sie ein Lager: ');
-        if ~ok, return, end
-        L = table2struct(bearingTable(selection,:));
-    else                % Lager gegeben
-        index = strcmp(name,bearingTable.Labelling);
-        if ~any(index)
-            error('Lagertyp nicht gefunden')
-        else
-            L = table2struct(bearingTable(index,:));
-        end
-    end
-    obj.set('L',L)
-end
\ No newline at end of file
+function setBearing(obj,name)
+%setBearing       -> öffnet ein Auswahlmenü, um ein Lager auszuwählen
+%setBearing(name) -> lädt das angegebene Lager
+
+%    pmd Berechnungstool Lagerimpedanz
+%    Version: 1.0.0
+%    Stand: 17.06.2021
+%    Autor: Steffen Puchtler
+
+    arguments
+        obj
+        name char = ''
+    end
+    if numel(obj) > 1
+        for ii = 1:numel(obj) % TODO: not working with matrices
+            obj(ii).setBearing(name);
+        end
+        return
+    end
+    bearingTable = readtable(obj.inputDataTableFile,'Sheet','Bearings');
+    if isempty(name)    % kein Lager gegeben
+        [selection, ok] = listdlg('ListString',bearingTable.Labelling,'SelectionMode','Single','Name','Lagerauswahl','PromptString','Wählen Sie ein Lager: ');
+        if ~ok, return, end
+        L = table2struct(bearingTable(selection,:));
+    else                % Lager gegeben
+        index = strcmp(name,bearingTable.Labelling);
+        if ~any(index)
+            error('Lagertyp nicht gefunden')
+        else
+            L = table2struct(bearingTable(index,:));
+        end
+    end
+    
+    L = cutTrailingNumbers(L);
+    
+    for diameterString = 'dD'
+        L = setTolerances(L, diameterString);
+    end
+    
+    % materials
+    L.ring = obj.materials.(L.material_ring);
+    L.RE_A = obj.materials.(L.material_RE_A);
+    if isempty(L.material_RE_B)
+        L = rmfield(L,{'RE_order'});
+    else
+        L.RE_B = obj.materials.(L.material_RE_B);
+    end
+    L = rmfield(L,{'material_RE_A','material_RE_B','material_ring'});
+
+    L.d_m = (L.d + L.D)/2;
+
+    L = orderfields(L);
+    obj.set('L',L)
+    obj.setFitting('drawing')
+end
+
+function L = setTolerances(L, diameterString)
+    
+    tolerance = str2double(L.(['fitting_' diameterString]));
+    if isnan(tolerance)
+        [lower, upper] = getTolerance(L,diameterString);
+    else
+        lower = tolerance;
+        upper = tolerance;
+    end
+    switch diameterString
+        case 'd'
+            L.EI_d = lower;
+            L.ES_d = upper;
+        case 'D'
+            L.ei_D = lower;
+            L.es_D = upper;
+    end
+end
+
+function [lower, upper] = getTolerance(L,diameterString)
+    switch diameterString
+        case 'd'
+            sheetName = 'DIN 620-2 inner';
+        case 'D'
+            sheetName = 'DIN 620-2 outer';
+    end
+    toleranceData = readtable('InputData.xlsx','Sheet',sheetName);
+    toleranceClass = L.(['fitting_' diameterString]);
+    
+    diameter = L.(diameterString);
+    index = find(toleranceData.([diameterString '_above']) >= diameter,1) - 1;
+    
+    lower = toleranceData(index,:).([toleranceClass '_lower']);
+    upper = toleranceData(index,:).([toleranceClass '_upper']);
+end
+
+function strct = cutTrailingNumbers(strct)
+    fields = fieldnames(strct);
+    for ii = 1:numel(fields)
+        fieldname = fields{ii};
+        if double(fieldname(end)) <= 57 % 9
+            strct.(fieldname(1:end-1)) = strct.(fieldname);
+            strct = rmfield(strct,fieldname);
+        end
+    end
+end
diff --git a/@BearImp/setFitting.m b/@BearImp/setFitting.m
new file mode 100644
index 0000000000000000000000000000000000000000..01bfbaf3cd04b0eeca357d3dea6057cdb186f356
--- /dev/null
+++ b/@BearImp/setFitting.m
@@ -0,0 +1,76 @@
+function setFitting(obj,shaft,housing)
+%setFitting                -> öffnet Auswahlmenüs, um Welle und Gehäuse auszuwählen
+%setFitting('drawing')     -> lädt die in der Zeichnung angegebenen Werte
+%setFitting(shaft,housing) -> lädt die angegebene Welle & Gehäuse
+
+%    pmd Berechnungstool Lagerimpedanz
+%    Version: 1.0.0
+%    Stand: 17.06.2021
+%    Autor: Steffen Puchtler
+
+    arguments
+        obj
+        shaft char = ''
+        housing char = ''
+    end
+    if numel(obj) > 1
+        for ii = 1:numel(obj) % TODO: not working with matrices
+            obj(ii).setFitting(shaft,housing);
+        end
+        return
+    end
+    if nargin == 2 && strcmp(shaft,'drawing')
+        housing = 'drawing';
+    end
+    
+    fittingTable = readtable(obj.inputDataTableFile,'Sheet','Fittings');
+    if isempty(shaft)    % keine Welle gegeben
+        [index, ok] = listdlg('ListString',fittingTable.Shaft,'SelectionMode','Single','Name','Auswahl Welle','PromptString','Wählen Sie eine Welle: ');
+        if ~ok, return, end
+        setShaftTolerances(obj,fittingTable,index)
+    else                 % Welle gegeben
+        if strcmp(shaft,'drawing')
+            shaft = [num2str(obj.L.d*1e3) ' drawing'];
+        end
+        index = strcmp(shaft,fittingTable.Shaft);
+        if ~any(index)
+            error('Wellenbezeichnung nicht gefunden')
+        else
+            setShaftTolerances(obj,fittingTable,index)
+        end
+    end
+    assert(fittingTable(index,:).d == obj.L.d,'Welle passt nicht zum Lager')
+    obj.L.shaft   = obj.materials.(fittingTable(index,:).material_shaft{:});
+                                                    % TODO: Redundanz beseitigen ########
+    if isempty(housing)    % kein Gehäuse gegeben
+        [index, ok] = listdlg('ListString',fittingTable.Housing,'SelectionMode','Single','Name','Auswahl Gehäuse','PromptString','Wählen Sie ein Gehäuse: ');
+        if ~ok, return, end
+        setHousingTolerances(obj,fittingTable,index)
+    else                   % Welle gegeben
+        if strcmp(housing,'drawing')
+            housing = [num2str(obj.L.D*1e3) ' drawing'];
+        end
+        index = strcmp(housing,fittingTable.Housing);
+        if ~any(index)
+            error('Gehäusebezeichnung nicht gefunden')
+        else
+            setHousingTolerances(obj,fittingTable,index)
+        end
+    end
+    assert(fittingTable(index,:).D == obj.L.D,'Gehäuse passt nicht zum Lager')
+    obj.L.housing = obj.materials.(fittingTable(index,:).material_housing{:});
+    obj.L = orderfields(obj.L);
+end
+
+function setShaftTolerances(obj,fittingTable,index)
+    obj.L.ei_d = fittingTable(index,:).Delta_lower_shaft;
+    obj.L.es_d = fittingTable(index,:).Delta_upper_shaft;
+    obj.L.d_i  = fittingTable(index,:).d_i;
+end
+
+function setHousingTolerances(obj,fittingTable,index)
+    obj.L.EI_D = fittingTable(index,:).Delta_lower_housing;
+    obj.L.ES_D = fittingTable(index,:).Delta_lower_housing;
+    obj.L.D_G  = fittingTable(index,:).D_G;
+end
+    
\ No newline at end of file
diff --git a/@BearImp/setLube.m b/@BearImp/setLube.m
index bd46b050fd602dd9e9ab09bee91e8752076b0124..62c59ecfac9fc6414909865b521d6172e2542a1d 100644
--- a/@BearImp/setLube.m
+++ b/@BearImp/setLube.m
@@ -1,18 +1,25 @@
 function setLube(obj,name)
 %setLube       -> öffnet ein Auswahlmenü, um einen Schmierstoff auszuwählen
 %setLube(name) -> lädt den angegebenen Schmierstoff
-%Voraussetzung: 'Schmierstoffe.xlsx' im Suchpfad
 
 %    pmd Berechnungstool Lagerimpedanz
 %    Version: 1.0.0
-%    Stand: 12.05.2021
+%    Stand: 16.06.2021
 %    Autor: Steffen Puchtler
 
     arguments
         obj
         name char = ''
     end
-    lubeTable = readtable('Lubricants.xlsx');
+    
+    if numel(obj) > 1
+        for ii = 1:numel(obj) % TODO: not working with matrices
+            obj(ii).setLube(name);
+        end
+        return
+    end
+    
+    lubeTable = readtable(obj.inputDataTableFile,'Sheet','Lubricants');
     if isempty(name)    % kein Schmierstoff gegeben
         [selection, ok] = listdlg('ListString',lubeTable.Labelling,'SelectionMode','Single','Name','Schmierstoffauswahl','PromptString','Wählen Sie einen Schmierstoff: ');
         if ~ok, return, end
@@ -25,5 +32,5 @@ function setLube(obj,name)
             S = table2struct(lubeTable(index,:));
         end
     end
-    obj.set('S',S);
+    obj.S = S;
 end
\ No newline at end of file
diff --git a/Bearings.xlsx b/Bearings.xlsx
deleted file mode 100644
index b7835f154cc7d3174b06d6815e884ff11d2597d1..0000000000000000000000000000000000000000
Binary files a/Bearings.xlsx and /dev/null differ
diff --git a/Dokumentation.docx b/Dokumentation.docx
index f3fe7f93067bb9143687db5ca1af6dd38c4befe4..00e94659a7a077fb043fb9e7ac8a3c1cee96b4d3 100644
Binary files a/Dokumentation.docx and b/Dokumentation.docx differ
diff --git a/InputData.xlsx b/InputData.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..84f4701b50666be93a4d290855fc8c5099309528
Binary files /dev/null and b/InputData.xlsx differ
diff --git a/Lubricants.xlsx b/Lubricants.xlsx
deleted file mode 100644
index 462db4c7ddae7036d3934e113c3b25a3a4810a72..0000000000000000000000000000000000000000
Binary files a/Lubricants.xlsx and /dev/null differ