diff --git a/src/new/thermal/FT_thermal_distortion.m b/src/new/thermal/FT_thermal_distortion.m
index 3ce9b81bf95ed520cdd54f0e21393fef7f156d60..f98b18e008eeadd32fa233b50c57b194b6a8c35c 100644
--- a/src/new/thermal/FT_thermal_distortion.m
+++ b/src/new/thermal/FT_thermal_distortion.m
@@ -6,8 +6,6 @@
 % The function returns the distortion of the surface and the parameters c 
 % and p for the closest (Gaussian weighted) fit paraboloid.
 %
-% N.B. Currently only valid for coating absorption. 
-%
 % beam:     Structure storing beam parameters (FT_init_thermal_beam.m)
 % mirror:   Structure storing mirror parameters (FT_init_thermal_mirror.m)
 % r:        Radial coordinate [m]
@@ -29,13 +27,14 @@ function [U,c,p] = FT_thermal_distortion(beam,mirror,r,option,num_terms)
     % Calculate thermal distortion from coating absorption
     if strcmp(option,'coating')
         
-        U = FT_thermal_distortion_from_coating_absorption(beam,mirror,r,num_terms);
-        [c,p] = FT_approximate_paraboloid_for_thermal_distortion(beam,mirror,num_terms);
+        [U,coeffs,SV] = FT_thermal_distortion_from_coating_absorption(beam,mirror,r,num_terms);
+        [c,p] = FT_approximate_paraboloid_for_thermal_distortion(coeffs,SV,beam,mirror);
         
     % Calculate distortion from bulk absorption
     elseif strcmp(option,'bulk')
        
-        % Currently only valid for coating absorption
+        [U,coeffs] = FT_thermal_distortion_from_bulk_absorption(beam,mirror,r,num_terms);
+        [c,p] = FT_approximate_paraboloid_for_thermal_distortion(coeffs,0,beam,mirror);
         
     end
 
diff --git a/src/new/thermal/FT_thermal_distortion_from_bulk_absorption.m b/src/new/thermal/FT_thermal_distortion_from_bulk_absorption.m
new file mode 100644
index 0000000000000000000000000000000000000000..6dd46b0e6bab367a29618326d3bf725d676dc2ed
--- /dev/null
+++ b/src/new/thermal/FT_thermal_distortion_from_bulk_absorption.m
@@ -0,0 +1,80 @@
+%--------------------------------------------------------------------------
+% function [U_bulk,coeffs] = FT_thermal_distortion_from_bulk_absorption(beam,mirror,r,num_terms)
+%
+% A Matlab function which calculates an approximation of the thermal
+% distortion of a mirror surface due to absorption of power in the bulk of
+% the mirror (or substrate).  The approximation expands the distortion as a
+% series of bessel functions, for a mirror in equilibrium.  The equations
+% are taken from the Living Review, 'On Special Optical Modes and Thermal 
+% Issues in Advanced GW Interferometric Detectors', Vinet, 2009.
+%
+% N.B. Currently only valid for an incident LG00 beam.
+%
+% beam:     Structure containing information about the incident beam (see
+%           FT_init_thermal_beam.m).
+% mirror:   Structure containing thermal properties of the mirror (see
+%           FT_init_thermal_mirror.m).
+% r:        Vector of radial coordinates [m]
+% num_terms:Number of bessel terms to include in series.
+%
+% U_bulk:   Returned surface distortion [m]
+% coeffs:   Coefficients for bessel series expansion. 
+%
+% Part of the Simtools package, http://www.gwoptics.org/simtools
+% Charlotte Bond 13.11.2013
+%--------------------------------------------------------------------------
+%
+
+function [U_bulk,coeffs] = FT_thermal_distortion_from_bulk_absorption(beam,mirror,r,num_terms)
+    
+    % Mirror and beam parameters 
+    % Currently only valid for LG00
+    p = 0;
+    l = 0;  
+    
+    % Mirror parameters
+    a = mirror.a;
+    h = mirror.h;
+    K = mirror.K;
+    Babs = mirror.Babs;
+    X = mirror.X;
+    alpha = mirror.alpha;
+    Y = mirror.Y;
+    pois = mirror.pois;
+    
+    % Beam parameters
+    Power = beam.P;
+    lambda = beam.lambda;
+    w = beam.w;
+    
+    % Lens is axis-symmetric
+    r_abs = abs(r);
+    
+    % Constants
+    C1 = alpha*(1+pois)*Babs*Power*a/(pi*K);    
+    zeta_n = FT_bessel_zeros(l,X,num_terms);
+    pn = FT_calculate_fourier_bessel_coefficients(p,l,X,w,a,num_terms);
+    gamma_n = zeta_n*h/(2*a);
+    Tn = sinh(gamma_n).*cosh(gamma_n)+gamma_n;
+    d1n = zeta_n.*sinh(gamma_n)+X*cosh(gamma_n);
+    
+    U_bulk = 0;
+    
+    % Calculate coefficents for thermal distortion in terms of bessel
+    % functins
+    for n=1:num_terms
+        
+        C2 = pn(n)/zeta_n(n)^3 * sinh(gamma_n(n));
+        t1 = 2*sinh(gamma_n(n))/Tn(n);
+        t2 = X/d1n(n);
+        
+        J0 = besselj(0,zeta_n(n)*r_abs/a);
+        
+        coeffs(n) = -C1*C2*(t1-t2);
+        
+        U_bulk = U_bulk + coeffs(n)*(1-J0);
+    
+    end
+        
+end
+
diff --git a/src/new/thermal/FT_thermal_distortion_from_coating_absorption.m b/src/new/thermal/FT_thermal_distortion_from_coating_absorption.m
index 4dbb2d538357282b6bcab0fcaaaf47e5acf4fff7..1f4a6112cb492c1585e36fedffa9a49edb275603 100644
--- a/src/new/thermal/FT_thermal_distortion_from_coating_absorption.m
+++ b/src/new/thermal/FT_thermal_distortion_from_coating_absorption.m
@@ -16,7 +16,10 @@
 % num_terms:Number of terms to include in approximation.  (50 terms is
 %           usually sufficient).
 % 
-% U_coat:  Returned distortion of the mirror surface [m]
+% U_coat:   Returned distortion of the mirror surface [m]
+% coeffs:   Coefficients in expansion of thermal distortion as sum of bessel
+%           functions.
+% SV:       Coefficients for Saint-Venant correction.
 %
 % Equations taken from Vinet 2009, Thermal issues in GW detectors and the
 % Virgo Optics book.
@@ -26,7 +29,7 @@
 %--------------------------------------------------------------------------
 %
 
-function [U_coat] = FT_thermal_distortion_from_coating_absorption(beam,mirror,r,num_terms)
+function [U_coat,coeffs,SV] = FT_thermal_distortion_from_coating_absorption(beam,mirror,r,num_terms)
 
     % Mirror and beam parameters 
     % Currently only valid for LG00
@@ -44,7 +47,7 @@ function [U_coat] = FT_thermal_distortion_from_coating_absorption(beam,mirror,r,
     pois = mirror.pois;
     
     % Beam parameters
-    P = beam.P;
+    Power = beam.P;
     lambda = beam.lambda;
     w = beam.w;
     
@@ -52,34 +55,36 @@ function [U_coat] = FT_thermal_distortion_from_coating_absorption(beam,mirror,r,
     r_abs = abs(r);
     
     % Constants
-    c1 = alpha*(1+pois)*Cabs*P/(pi*K);
-    c2 = -12*alpha*Y*Cabs*P*X/(pi*a*K*h^3);
+    c1 = alpha*(1+pois)*Cabs*Power/(2*pi*K);
+    c2 = -12*alpha*Y*X*Cabs*a*Power/(pi*K*h^3);
     
     % Calculate coefficients
-    zeta_0s = FT_bessel_zeros(0,X,num_terms);
+    zeta_n = FT_bessel_zeros(2*l,X,num_terms);
+    pn = FT_calculate_fourier_bessel_coefficients(p,l,X,w,a,num_terms);
+    gamma_n = zeta_n*h/(2*a);
+    d1n = zeta_n.*sinh(gamma_n)+X*cosh(gamma_n);
+    d2n = zeta_n.*cosh(gamma_n)+X*sinh(gamma_n);
     
     % Approximation of surface distortion
-    uz_coat = 0;
-    B = 0;
+    uz = 0;
+    w1 = 0;
     
+    % Calculate distortion as bessel sum
     for s=1:num_terms
         
-        f1 = c1 * zeta_0s(s)*exp(-zeta_0s(s)^2*w^2/(8*a^2)) / ((zeta_0s(s)^2+X^2)*besselj(0,zeta_0s(s))^2) * (zeta_0s(s)+X-(zeta_0s(s)-X)*exp(-2*zeta_0s(s)*h/a)) / ((zeta_0s(s)+X)^2-(zeta_0s(s)-X)^2*exp(-2*zeta_0s(s)*h/a)); 
-        uz_coat = uz_coat + f1 * (besselj(0,zeta_0s(s)*r_abs/a)-1);
-        
-        % Coefficient for Saint-Venant correction
-        f2 = c2 * exp(-w^2*zeta_0s(s)^2/(8*a^2)) / ((zeta_0s(s)^2+X^2)*besselj(0,zeta_0s(s))) * (1/((zeta_0s(s)+X)^2-((zeta_0s(s)-X)^2*exp(-2*zeta_0s(s)*h/a))));
-        f2 = f2 * ( ((zeta_0s(s)-X)*exp(-zeta_0s(s)*h/a)*a^2/(zeta_0s(s)^2)* ( (zeta_0s(s)*h/(2*a) * (exp(zeta_0s(s)*h/(2*a)) + exp(-zeta_0s(s)*h/(2*a)))) + (exp(-zeta_0s(s)*h/(2*a))-exp(zeta_0s(s)*h/(2*a)))) + ((zeta_0s(s)+X)*a^2/(zeta_0s(s)^2)*(-(zeta_0s(s)*h/(2*a)*(exp(-zeta_0s(s)*h/(2*a))+exp(zeta_0s(s)*h/(2*a)))) + (exp(zeta_0s(s)*h/(2*a))-exp(-zeta_0s(s)*h/(2*a)))))));
-                
-        B = B + f2;
+        % Negative compared to Vinet 2009, for match Finesse convention
+        coeffs(s) =  - c1 * pn(s)/zeta_n(s) * (sinh(gamma_n(s))/d1n(s) + cosh(gamma_n(s))/d2n(s)); 
+        w1 = w1 - c2*pn(s)*besselj(0,zeta_n(s))/(zeta_n(s)^4)*(gamma_n(s)*cosh(gamma_n(s))-sinh(gamma_n(s)))/d2n(s);
+        uz = uz + coeffs(s)*(1-besselj(2*l,zeta_n(s)*r_abs/a));
        
     end
     
     % Saint-Venant correction
-    duz_coat = (1-pois)/(2*Y) * B * r.^2;
+    SV = -(1-pois)/(2*Y)*w1;
+    duz = SV * r.^2;
     
-    % Final thermal distortion
-    U_coat = uz_coat + duz_coat;
+    % Final thermal distortion 
+    U_coat = uz + duz;
 
 end