diff --git a/crpptbx/TCV/loadTCVdata.m b/crpptbx/TCV/loadTCVdata.m
index 6c0a2f7f955bad010f4d2f0a85957fe8e06a8cfb..02b149e0bc691b0dbc5009950a651d2e97cfb8c7 100644
--- a/crpptbx/TCV/loadTCVdata.m
+++ b/crpptbx/TCV/loadTCVdata.m
@@ -135,7 +135,10 @@ end
 if ~isempty(strmatch(data_type_eff_noext,[{'Te'} {'t_e'} {'TE'} {'T_e'}],'exact'))
   data_type_eff_noext='te';
 end
-if ~isempty(strmatch(data_type_eff_noext,[{'Ne'} {'n_e'} {'NE'} {'N_e'}],'exact'))
+if ~isempty(strmatch(data_type_eff_noext,[{'Te_edge'} {'TE_edge'}],'exact'))
+  data_type_eff_noext='te_edge';
+end
+if ~isempty(strmatch(data_type_eff_noext,[{'Ne_edge'} {'NE_edge'}],'exact'))
   data_type_eff_noext='ne';
 end
 if ~isempty(strmatch(data_type_eff_noext,[{'Rcont'}],'exact'))
@@ -212,13 +215,13 @@ liuqeFBTE=[{'\results::i_p'} {'\results::z_axis'} {'\results::r_axis'} {'\result
 	   {'\results::kappa_95'} {'\results::r_contour'} {'\results::z_contour'} {'\results::psi_axis'}];
 
 % keywords which do not have FBTE equivalence and are returned empty
-noFBTE=[{'ne'} {'te'} {'nerho'} {'terho'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ...
+noFBTE=[{'ne'} {'te'} {'nerho'} {'terho'} {'ne_edge'} {'te_edge'} {'nerho_edge'} {'terho_edge'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ...
 	{'neft'} {'neft:trial'} {'teft:trial'} {'neftav:trial'} {'teftav:trial'} {'sxr'} {'sxR'} {'ece'} {'MPX'} {'IOH'} {'vloop'} {'neint'}];
 
 % all keywords and corresponding case to run below
 TCVkeywrdall=[{'Ip'} {'zmag'} {'rmag'} {'rcont'} {'zcont'} {'vol'} {'rhovol'} {'qrho'} {'q95'} {'kappa'} ...
       {'delta'} {'deltatop'} {'deltabot'} {'neint'} ...
-      {'ne'} {'te'} {'nerho'} {'terho'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ...
+      {'ne'} {'te'} {'nerho'} {'terho'}  {'ne_edge'} {'te_edge'} {'nerho_edge'} {'terho_edge'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ...
       {'neft'} {'teft'} {'neftav'} {'teftav'} {'neft:trial'} {'teft:trial'} {'neftav:trial'} {'teftav:trial'}  ...
       {'sxr'} {'sxR'} {'ece'} {'MPX'} {'IOH'} {'vloop'} {'pgyro'} {'jtor'}];
 TCVsig.iip=strmatch('Ip',TCVkeywrdall,'exact');
@@ -237,8 +240,12 @@ TCVsig.ideltabot=strmatch('deltabot',TCVkeywrdall,'exact');
 TCVsig.ineint=strmatch('neint',TCVkeywrdall,'exact');
 TCVsig.ine=strmatch('ne',TCVkeywrdall,'exact');
 TCVsig.ite=strmatch('te',TCVkeywrdall,'exact');
+TCVsig.ine_edge=strmatch('ne_edge',TCVkeywrdall,'exact');
+TCVsig.ite_edge=strmatch('te_edge',TCVkeywrdall,'exact');
 TCVsig.inerho=strmatch('nerho',TCVkeywrdall,'exact');
 TCVsig.iterho=strmatch('terho',TCVkeywrdall,'exact');
+TCVsig.inerho_edge=strmatch('nerho_edge',TCVkeywrdall,'exact');
+TCVsig.iterho_edge=strmatch('terho_edge',TCVkeywrdall,'exact');
 TCVsig.inerhozshift=strmatch('nerhozshift',TCVkeywrdall,'exact');
 TCVsig.iterhozshift=strmatch('terhozshift',TCVkeywrdall,'exact');
 TCVsig.iprofnerho=strmatch('profnerho',TCVkeywrdall,'exact');
@@ -269,12 +276,16 @@ TCVkeywrdcase(TCVsig.ivol)=TCVkeywrdall(TCVsig.ivol); % special as nodes _2 or _
 TCVkeywrdcase(TCVsig.irhovol)=TCVkeywrdall(TCVsig.irhovol); % idem vol
 TCVkeywrdcase(TCVsig.ine)=TCVkeywrdall(TCVsig.ine); % special as dimensions from other nodes
 TCVkeywrdcase(TCVsig.ite)=TCVkeywrdall(TCVsig.ite); % idem
+TCVkeywrdcase(TCVsig.ine_edge)=TCVkeywrdall(TCVsig.ine_edge); % special as dimensions from other nodes
+TCVkeywrdcase(TCVsig.ite_edge)=TCVkeywrdall(TCVsig.ite_edge); % idem
 TCVkeywrdcase(TCVsig.inerho)=TCVkeywrdall(TCVsig.inerho); % idem
+TCVkeywrdcase(TCVsig.inerho_edge)=TCVkeywrdall(TCVsig.inerho_edge); % idem
 TCVkeywrdcase(TCVsig.iteft_trial)=TCVkeywrdall(TCVsig.iteft_trial); % special to extract trial_indx if needed
 TCVkeywrdcase(TCVsig.ineft_trial)=TCVkeywrdall(TCVsig.ineft_trial); % special to extract trial_indx if needed
 TCVkeywrdcase(TCVsig.iteftav_trial)=TCVkeywrdall(TCVsig.iteftav_trial); % special to extract trial_indx if needed
 TCVkeywrdcase(TCVsig.ineftav_trial)=TCVkeywrdall(TCVsig.ineftav_trial); % special to extract trial_indx if needed
 TCVkeywrdcase(TCVsig.iterho)=TCVkeywrdall(TCVsig.iterho); % idem
+TCVkeywrdcase(TCVsig.iterho_edge)=TCVkeywrdall(TCVsig.iterho_edge); % idem
 TCVkeywrdcase(TCVsig.inerhozshift)=TCVkeywrdall(TCVsig.inerhozshift); % idem
 TCVkeywrdcase(TCVsig.iterhozshift)=TCVkeywrdall(TCVsig.iterhozshift); % idem
 TCVkeywrdcase(TCVsig.iprofnerho)=TCVkeywrdall(TCVsig.iprofnerho);
@@ -517,6 +528,36 @@ switch TCVkeywrdcase{index}
     end
     mdsclose('mdsip');
 
+  %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+  case {'ne_edge','te_edge'}
+    % ne or Te from Thomson.edge data on raw z mesh vs (z,t)
+    mdsopen(shot);
+    if strcmp(TCVkeywrdcase{index},'ne')
+      nodenameeff='\results::thomson.edge:ne';
+      tracetdi=tdi(nodenameeff);
+      tracestd=tdi('\results::thomson.edge:ne:error_bar');
+    else
+      nodenameeff='\results::thomson.edge:te';
+      tracetdi=tdi(nodenameeff);
+      tracestd=tdi('\results::thomson.edge:te:error_bar');
+      trace_abs=tdi('\results::thomson.edge:fir_thom_rat');
+    end
+    trace.data=tracetdi.data'; % Thomson.Edge data as (t,z)
+    trace.std=tracestd.data';
+    trace.name=[num2str(shot) ';' nodenameeff];
+    % add correct dimensions
+    time=mdsdata('\results::thomson:times');
+    z=mdsdata('\diagz::thomson_set_up.edge:vertical_pos');
+    trace.dim=[{z};{time}];
+    trace.dimunits=[{'Z [m]'} ; {'time [s]'}];
+    trace.x=z;
+    trace.t=time;
+    % isfield does not work since tracetdi is not a 'struct' but a tdi object, thus isfield using isa does not work
+    if any(strcmp(fieldnames(tracetdi),'units'))
+      trace.units=tracetdi.units;
+    end
+    mdsclose('mdsip');
+
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case {'nerho','terho'}
     % ne or Te from Thomson data on rho=sqrt(psi_normalised) mesh: (rho,t)
@@ -577,6 +618,66 @@ switch TCVkeywrdcase{index}
     end
     mdsclose;
 
+  %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+  case {'nerho_edge','terho_edge'}
+    % ne or Te from Thomson.Edge data on rho=sqrt(psi_normalised) mesh: (rho,t)
+    mdsopen(shot);
+    time=mdsdata('\results::thomson:times');
+    if strcmp(TCVkeywrdcase{index},'nerho')
+      nodenameeff='\results::thomson.edge:ne';
+      tracetdi=tdi(nodenameeff);
+      if isempty(tracetdi.data)
+        ishot=mdsopen(shot)
+        tracetdi=tdi(nodenameeff)
+      end
+      nodenameeff='\results::thomson.edge:ne; error_bar ; fir_thom_rat; (ne,std)*fir_thom_rat';
+      tracestd=tdi('\results::thomson.edge:ne:error_bar');
+      if shot>=23801
+        tracefirrat=tdi('\results::thomson.profiles.auto:fir_thom_rat'); %time base not same!!
+        if isempty(tracefirrat.data)
+          disp('problem with \results::thomson.profiles.auto:fir_thom_rat: empty')
+        end
+      else
+        tracefirrat=tdi('\results::thomson.edge:fir_thom_rat');
+        tracefirrat.dim{1}=time;
+      end
+      tracefirrat_data=NaN*ones(size(tracetdi.dim{1}));
+      if ~isempty(tracefirrat.data)
+        itim=iround(time,tracefirrat.dim{1});
+        tracefirrat_data(itim)=tracefirrat.data;
+      end
+    else
+      nodenameeff='\results::thomson.edge:te';
+      tracetdi=tdi(nodenameeff);
+      nodenameeff='\results::thomson.edge:te; error_bar';
+      tracestd=tdi('\results::thomson.edge:te:error_bar');
+    end
+    trace.data=tracetdi.data'; % Thomson.Edge data as (t,z)
+    trace.std=tracestd.data';
+    if strcmp(TCVkeywrdcase{index},'nerho')
+      trace.firrat=tracefirrat_data;
+      trace.data_abs=trace.data*diag(tracefirrat_data);
+      trace.std_abs=trace.std*diag(tracefirrat_data);
+    end
+    trace.name=[num2str(shot) ';' nodenameeff];
+    % add correct dimensions
+    % construct rho mesh
+    endstr
+    psi_max=tdi(['\results::thomson.edge:psi_max' endstr]);
+    psiscatvol=tdi(['\results::thomson.edge:psiscatvol' endstr]);
+    for ir=1:length(psiscatvol.dim{2})
+      rho(ir,:)= sqrt(1.-psiscatvol.data(:,ir)./psi_max.data(:))';
+    end
+    trace.dim=[{rho};{time}];
+    trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}];
+    trace.x=rho;
+    trace.t=time;
+    % isfield does not work since tracetdi is not a 'struct' but a tdi object, thus isfield using isa does not work
+    if any(strcmp(fieldnames(tracetdi),'units'))
+      trace.units=tracetdi.units;
+    end
+    mdsclose;
+
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case {'nerhozshift','terhozshift'}
     % ne or Te from Thomson data on rho=sqrt(psi_normalised) mesh: (rho,t)