diff --git a/crpptbx/IMAS/get_ids_equilibrium_fixed_boundary.m b/crpptbx/IMAS/get_ids_equilibrium_fixed_boundary.m
index 60ca92c45b08b24afdc29eb551b8c791f412c46c..9223e759b26af21768108c62a74defe9535904a9 100644
--- a/crpptbx/IMAS/get_ids_equilibrium_fixed_boundary.m
+++ b/crpptbx/IMAS/get_ids_equilibrium_fixed_boundary.m
@@ -46,26 +46,226 @@ if nargout>=3; varargout{1} = rmfield(p.Results,'shot'); end
 params_equilibrium = params;
 
 ids_equilibrium = params_equilibrium.empty_struct;
+clear ids_equilibrium_description % so can add new subfields
 
 %
 % ids_properties
 %
-ids_properties.comment = params_equilibrium.comment;
-ids_properties.homogeneous_time = 1;
-ids_properties.source = ['TCV mds for shot = ' num2str(params_equilibrium.shot)];
-ids_properties.provider = 'get_ids_equilibrium_fixed_boundary';
-ids_properties.creation_date = date;
-
-ids_equilibrium.ids_properties = ids_properties;
+ids_equilibrium.ids_properties.comment = params_equilibrium.comment;
+ids_equilibrium.ids_properties.homogeneous_time = 1;
+ids_equilibrium.ids_properties.source = ['TCV mds for shot = ' num2str(params_equilibrium.shot)];
+ids_equilibrium.ids_properties.provider = 'get_ids_equilibrium_fixed_boundary';
+ids_equilibrium.ids_properties.creation_date = date;
 
+% As a general rule, for a new substructure under the main ids, construct a local structure like:
+% "global_quantities" with subfields being the relevant data to get and a local structure:
+% "global_quantities_desc" which contains the same subfields themselves containing the gdat string aftre shot used
 %
 % vacuum_toroidal_field and time, using homogeneous
 %
-b0=gdat(params_equilibrium.shot,'b0','source','liuqe'); % to get on liuqe time array
-vacuum_toroidal_field.r0 = b0.r0;
-vacuum_toroidal_field.b0 = b0.data;
+vacuum_toroidal_field.b0=gdat(params_equilibrium.shot,'b0','source','liuqe'); % to get on liuqe time array
+vacuum_toroidal_field_desc.b0 = '''b0'',''source'',''liuqe''';
+vacuum_toroidal_field_desc.r0 = '.r0 subfield from: [''b0'',''source'',''liuqe'']';
+ids_equilibrium.vacuum_toroidal_field.r0 = vacuum_toroidal_field.b0.r0;
+ids_equilibrium.vacuum_toroidal_field.b0 = vacuum_toroidal_field.b0.data;
+ids_equilibrium_description.vacuum_toroidal_field = vacuum_toroidal_field_desc;
+
+ids_equilibrium.time = vacuum_toroidal_field.b0.t;
+ids_equilibrium_description.time = '.t subfield from: [''b0'',''source'',''liuqe'']';
+
+ids_equilibrium.time = [0.6666 0.68333];
+
+ids_equilibrium.time_slice(1:length(ids_equilibrium.time)) = ids_equilibrium.time_slice(1);
+
+% load time array data to copy to time_slices
+
+% global_quantities data into local global_quantities.* structure with correct end names and global_quantities_desc.* with description. Use temp.* and temp_desc.* structures for temporary data
+
+% brute force solution load all eqdsks
+% $$$ for it=1:length(ids_equilibrium.time)
+% $$$   ids_equilibrium.time(it)
+% $$$   temp.eqdsks{it}=gdat(params_equilibrium.shot,'eqdsk','time',ids_equilibrium.time(it),'write',0);
+% $$$ end
+% $$$ temp_desc.eqdsks{1} = '''eqdsk'',''time'',ids_equilibrium.time(it)';
+
+global_quantities.area = gdat(params_equilibrium.shot,'area_edge');
+global_quantities_desc.area = 'area_edge';
+global_quantities.beta_normal = gdat(params_equilibrium.shot,'betan');
+global_quantities_desc.beta_normal = 'betan';
+global_quantities.beta_pol = gdat(params_equilibrium.shot,'betap');
+global_quantities_desc.beta_pol = 'betap';
+global_quantities.beta_tor = gdat(params_equilibrium.shot,'beta');
+global_quantities_desc.beta_tor = 'beta';
+global_quantities.energy_mhd = gdat(params_equilibrium.shot,'w_mhd');
+global_quantities_desc.energy_mhd = 'w_mhd';
+global_quantities.ip = gdat(params_equilibrium.shot,'ip');
+global_quantities_desc.ip = 'ip';
+% length_pol = gdat(params_equilibrium.shot,'length_pol'); % to be added
+global_quantities.li_3 = gdat(params_equilibrium.shot,'li');
+global_quantities_desc.li_3 = 'li';
+temp.r_magnetic_axis = gdat(params_equilibrium.shot,'r_axis');
+temp_desc.r_magnetic_axis = 'r_axis';
+temp.z_magnetic_axis = gdat(params_equilibrium.shot,'z_axis');
+temp_desc.z_magnetic_axis = 'z_axis';
+temp.psi_axis = gdat(params_equilibrium.shot,'psi_axis'); % needs to add psi_edge sincepsi_axis liuqe assuming 0 dege value
+temp_desc.psi_axis = 'psi_axis';
+global_quantities.psi_boundary = gdat(params_equilibrium.shot,'psi_edge');
+global_quantities_desc.psi_boundary = 'psi_edge';
+global_quantities.q_95 = gdat(params_equilibrium.shot,'q95');
+global_quantities_desc.q_95 = 'q95';
+global_quantities.q_axis = gdat(params_equilibrium.shot,'q0'); % will be checked with q_rho?
+global_quantities_desc.q_axis = 'q0';
+temp.q_rho = gdat(params_equilibrium.shot,'q_rho');
+temp_desc.q_rho = 'q_rho';
+% surface = gdat(params_equilibrium.shot,'surface'); % to be added
+global_quantities.volume = gdat(params_equilibrium.shot,'volume');
+global_quantities_desc.volume = 'volume';
+global_quantities.w_mhd = gdat(params_equilibrium.shot,'w_mhd');
+global_quantities_desc.w_mhd = 'w_mhd';
+
+global_quantities_fieldnames = fieldnames(global_quantities);
+special_fields = {'magnetic_axis', 'psi_axis', 'q_min'}; % fields needing non-automatic treatments
+for it=1:length(ids_equilibrium.time)
+  for i=1:length(global_quantities_fieldnames)
+    if ~any(strcmp(global_quantities_fieldnames{i},special_fields))
+      if ~isstruct(ids_equilibrium.time_slice{it}.global_quantities.(global_quantities_fieldnames{i}))
+        ids_equilibrium.time_slice{it}.global_quantities.(global_quantities_fieldnames{i}) = ...
+            global_quantities.(global_quantities_fieldnames{i}).data(it);
+      else
+        special_fields{end+1} = global_quantities_fieldnames{i};
+      end
+    end
+  end
+end
 
-ids_equilibrium.vacuum_toroidal_field = vacuum_toroidal_field;
-ids_equilibrium.time = b0.t;
+% special case
+for it=1:length(ids_equilibrium.time)
+  ids_equilibrium.time_slice{it}.global_quantities.magnetic_axis.r = temp.r_magnetic_axis.data(it);
+  ids_equilibrium.time_slice{it}.global_quantities.magnetic_axis.z = temp.z_magnetic_axis.data(it);
+  ids_equilibrium.time_slice{it}.global_quantities.psi_axis = temp.psi_axis.data(it) + ...
+      ids_equilibrium.time_slice{it}.global_quantities.psi_boundary;
+  [zz,izz]=min(temp.q_rho.data(:,it));
+  ids_equilibrium.time_slice{it}.global_quantities.q_min.value = zz;
+  ids_equilibrium.time_slice{it}.global_quantities.q_min.rho_tor_norm = temp.q_rho.grids_1d.rhotornorm(izz);
+end
+
+% for boundary in addition to lcfs
+% active_limiter_point = gdat(params_equilibrium.shot,'active_limiter_point');
+boundary.elongation = gdat(params_equilibrium.shot,'kappa');
+boundary_desc.elongation = 'kappa';
+% elongation_lower = gdat(params_equilibrium.shot,'elongation_lower');
+% elongation_upper = gdat(params_equilibrium.shot,'elongation_upper');
+boundary.minor_radius = gdat(params_equilibrium.shot,'a_minor');
+boundary_desc.minor_radius = 'a_minor';
+% squareness_lower_inner = gdat(params_equilibrium.shot,'squareness_lower_inner');
+% squareness_lower_outer = gdat(params_equilibrium.shot,'squareness_lower_outer');
+% squareness_upper_inner = gdat(params_equilibrium.shot,'squareness_upper_inner');
+% squareness_upper_outer = gdat(params_equilibrium.shot,'squareness_upper_outer');
+% strike_point = gdat(params_equilibrium.shot,'strike_point');
+boundary.triangularity = gdat(params_equilibrium.shot,'delta');
+boundary_desc.triangularity = 'delta';
+boundary.triangularity_lower = gdat(params_equilibrium.shot,'delta_bottom');
+boundary_desc.triangularity_lower = 'delta_bottom';
+boundary.triangularity_upper = gdat(params_equilibrium.shot,'delta_top');
+boundary_desc.triangularity_upper = 'delta_top';
+temp.n_x_point = gdat(params_equilibrium.shot,'tcv_eq(''''n_xpts'''',''''liuqe.m'''')');
+temp_desc.n_x_point = '''tcv_eq(''''n_xpts'''',''''liuqe.m'''')''';
+temp.r_x_point = gdat(params_equilibrium.shot,'tcv_eq(''''r_xpts'''',''''liuqe.m'''')');
+temp_desc.r_x_point = '''tcv_eq(''''r_xpts'''',''''liuqe.m'''')''';
+temp.z_x_point = gdat(params_equilibrium.shot,'tcv_eq(''''z_xpts'''',''''liuqe.m'''')');
+temp_desc.z_x_point = '''tcv_eq(''''z_xpts'''',''''liuqe.m'''')''';
+temp.rgeom = gdat(params_equilibrium.shot,'rgeom');
+temp_desc.rgeom = 'rgeom';
+temp.zgeom = gdat(params_equilibrium.shot,'zgeom');
+temp_desc.zgeom = 'zgeom';
+temp.r_lcfs = gdat(params_equilibrium.shot,'r_contour_edge');
+temp_desc.r_lcfs = 'r_contour_edge';
+temp.z_lcfs = gdat(params_equilibrium.shot,'z_contour_edge');
+temp_desc.z_lcfs = 'z_contour_edge';
+
+boundary_fieldnames = fieldnames(boundary);
+special_fields = {'lcfs', 'geometric_axis', 'x_point'}; % fields needing non-automatic treatments
+for it=1:length(ids_equilibrium.time)
+  for i=1:length(boundary_fieldnames)
+    if ~any(strcmp(boundary_fieldnames{i},special_fields))
+      if ~isstruct(ids_equilibrium.time_slice{it}.boundary.(boundary_fieldnames{i}))
+        ids_equilibrium.time_slice{it}.boundary.(boundary_fieldnames{i}) = ...
+            boundary.(boundary_fieldnames{i}).data(it);
+      else
+        special_fields{end+1} = boundary_fieldnames{i};
+      end
+    end
+  end
+end
+
+% special cases
+for it=1:length(ids_equilibrium.time)
+  ids_equilibrium.time_slice{it}.boundary.outline.r = temp.r_lcfs.data(it);
+  ids_equilibrium.time_slice{it}.boundary.outline.z = temp.z_lcfs.data(it);
+  ids_equilibrium.time_slice{it}.boundary.lcfs.r = ids_equilibrium.time_slice{it}.boundary.outline.r;
+  ids_equilibrium.time_slice{it}.boundary.lcfs.z = ids_equilibrium.time_slice{it}.boundary.outline.z;
+  ids_equilibrium.time_slice{it}.boundary.geometric_axis.r = temp.rgeom.data(it);
+  ids_equilibrium.time_slice{it}.boundary.geometric_axis.z = temp.zgeom.data(it);
+  if temp.n_x_point.data(it) > 0
+    ids_equilibrium.time_slice{it}.boundary.x_point(1:temp.n_x_point.data(it)) = ids_equilibrium.time_slice{it}.boundary.x_point(1);
+    for i=1:length(temp.n_x_point.data(it))
+      ids_equilibrium.time_slice{it}.boundary.x_point{i}.r = temp.r_x_point.data(i,it);
+      ids_equilibrium.time_slice{it}.boundary.x_point{i}.z = temp.z_x_point.data(i,it);
+    end
+  end
+end
+
+%
+%% profiles_1d (cannot use eqdsk since not same radial mesh)
+%
+% area = gdat(params_equilibrium.shot,'area');
+% b_average = gdat(params_equilibrium.shot,'b_average');
+% beta_pol = gdat(params_equilibrium.shot,'beta_pol');
+% b_field_average = gdat(params_equilibrium.shot,'b_field_average');
+% b_field_max = gdat(params_equilibrium.shot,'b_field_max');
+% b_field_min = gdat(params_equilibrium.shot,'b_field_min');
+% b_max = gdat(params_equilibrium.shot,'b_max');
+% b_min = gdat(params_equilibrium.shot,'b_min');
+% darea_dpsi = gdat(params_equilibrium.shot,'darea_dpsi');
+% darea_drho_tor = gdat(params_equilibrium.shot,'darea_drho_tor');
+profiles_1d.dpressure_dpsi = gdat(params_equilibrium.shot,'pprime');
+% dpsi_drho_tor = gdat(params_equilibrium.shot,'dpsi_drho_tor');
+% dvolume_dpsi = gdat(params_equilibrium.shot,'dvolume_dpsi');
+% dvolume_drho_tor = gdat(params_equilibrium.shot,'dvolume_drho_tor');
+% elongation = gdat(params_equilibrium.shot,'elongation');
+profiles_1d.f_df_dpsi = gdat(params_equilibrium.shot,'ffprime');
+profiles_1d.f = gdat(params_equilibrium.shot,'rbphi_rho');
+% geometric_axis = gdat(params_equilibrium.shot,'geometric_axis');
+% gm1 = gdat(params_equilibrium.shot,'gm1');
+% gm2 = gdat(params_equilibrium.shot,'gm2');
+% gm3 = gdat(params_equilibrium.shot,'gm3');
+% gm4 = gdat(params_equilibrium.shot,'gm4');
+% gm5 = gdat(params_equilibrium.shot,'gm5');
+% gm6 = gdat(params_equilibrium.shot,'gm6');
+% gm7 = gdat(params_equilibrium.shot,'gm7');
+% gm8 = gdat(params_equilibrium.shot,'gm8');
+% gm9 = gdat(params_equilibrium.shot,'gm9');
+% j_parallel = gdat(params_equilibrium.shot,'j_parallel');
+% j_tor = gdat(params_equilibrium.shot,'j_tor');
+% magnetic_shear = gdat(params_equilibrium.shot,'magnetic_shear');
+% mass_density = gdat(params_equilibrium.shot,'mass_density');
+profiles_1d.phi = gdat(params_equilibrium.shot,'phi_tor');
+profiles_1d.pressure = gdat(params_equilibrium.shot,'pressure');
+% psi = gdat(params_equilibrium.shot,'psi_rho'); % (could take from .x of any like rhotor and psi_axis, psi_edge from global_quantities)
+profiles_1d.q = gdat(params_equilibrium.shot,'q_rho');
+profiles_1d.rho_tor = gdat(params_equilibrium.shot,'rhotor');
+%rho_tor_norm = gdat(params_equilibrium.shot,'rhotor_norm'); % from rho_tor
+profiles_1d.rho_volume_norm = gdat(params_equilibrium.shot,'rhovol');
+% r_inboard = gdat(params_equilibrium.shot,'r_inboard');
+% r_outboard = gdat(params_equilibrium.shot,'r_outboard');
+% squareness_lower_inner = gdat(params_equilibrium.shot,'squareness_lower_inner');
+% squareness_lower_outer = gdat(params_equilibrium.shot,'squareness_lower_outer');
+% squareness_upper_inner = gdat(params_equilibrium.shot,'squareness_upper_inner');
+% squareness_upper_outer = gdat(params_equilibrium.shot,'squareness_upper_outer');
+% surface = gdat(params_equilibrium.shot,'surface');
+% trapped_fraction = gdat(params_equilibrium.shot,'trapped_fraction');
+% triangularity_lower = gdat(params_equilibrium.shot,'triangularity_lower');
+% triangularity_upper = gdat(params_equilibrium.shot,'triangularity_upper');
+profiles_1d.volume = gdat(params_equilibrium.shot,'volume_rho');
 
-time_slice(1:length(ids_equilibrium.time)) = ids_equilibrium.time_slice(1);
+keyboard
diff --git a/crpptbx/TCV/gdat_tcv.m b/crpptbx/TCV/gdat_tcv.m
index adfb5aa4911b60565684051d9cc13884a0a41858..d3f2b77db13a8ac974f9d916e98a880dcc7cb19c 100644
--- a/crpptbx/TCV/gdat_tcv.m
+++ b/crpptbx/TCV/gdat_tcv.m
@@ -932,6 +932,34 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       gdat_data.gdat_params.time = time;
       if (gdat_params.nverbose>=3); disp(['"time" is expected as an option, choose default time = ' num2str(time)]); end
     end
+    default_write_eqdsk = 1;
+    if isfield(gdat_data.gdat_params,'write') && ~isempty(gdat_data.gdat_params.write)
+      if ischar(gdat_data.gdat_params.write)
+        if strcmp(lower(gdat_data.gdat_params.write),'no')
+          gdat_data.gdat_params.write = 0;
+        elseif strcmp(lower(gdat_data.gdat_params.write),'yes')
+          gdat_data.gdat_params.write = 1;
+        else
+          if (gdat_params.nverbose>=3); disp(['expects 0 or 1, event yes or no for write option, not: ' ...
+                    gdat_data.gdat_params.write ', use default 1']);
+          end
+          gdat_data.gdat_params.write = [];
+        end
+      end
+      if gdat_data.gdat_params.write~=1 && gdat_data.gdat_params.write~=0
+        gdat_data.gdat_params.write = default_write_eqdsk;
+      end
+    else
+      gdat_data.gdat_params.write = default_write_eqdsk;
+    end
+    default_map_eqdsk_psirz = 0;
+    if isfield(gdat_data.gdat_params,'map_eqdsk_psirz') && ~isempty(gdat_data.gdat_params.map_eqdsk_psirz)
+      if ~isnumeric(gdat_data.gdat_params.map_eqdsk_psirz) || (gdat_data.gdat_params.map_eqdsk_psirz~=1 && gdat_data.gdat_params.map_eqdsk_psirz~=0)
+        gdat_data.gdat_params.map_eqdsk_psirz = default_map_eqdsk_psirz_eqdsk;
+      end
+    else
+      gdat_data.gdat_params.map_eqdsk_psirz = default_map_eqdsk_psirz;
+    end
     gdat_data.gdat_params.time = time;
     gdat_data.t = time;
     zshift = 0.;
@@ -959,7 +987,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         end
         return
       end
-      eqdskval=read_eqdsk(fnames_readresults{4},cocos_read_results_for_chease,0,[],[],1); % read_results now has relevant cocos LIUQE=17
+      ii = regexpi(fnames_readresults{4},'eqdsksigns');
+      if ~isempty(ii)
+        eqdskval=read_eqdsk(fnames_readresults{4},cocos_read_results_for_chease,0,[],[],1); % read_results now has relevant cocos LIUQE= 17
+      else
+        disp('wrong name check order of eqdsk outputs')
+        return
+      end
       for i=1:length(fnames_readresults)
         unix(['rm ' fnames_readresults{i}]);
       end
@@ -968,7 +1002,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       [eqdsk_cocos_in, eqdsk_cocosout_IpB0pos,cocos_inout]=eqdsk_cocos_transform(eqdskval,[cocos_read_results_for_chease cocos_in]);
       fnamefull = fullfile(['/tmp/' getenv('USER')],['EQDSK_' num2str(shot) 't' num2str(time_eff,'%.4f')]);
       % We still write COCOS=2 case, since closer to standard (in /tmp)
-      write_eqdsk(fnamefull,eqdsk_cocos_in,cocos_in,[],[],[],1);
+      if gdat_data.gdat_params.write==1
+        write_eqdsk(fnamefull,eqdsk_cocos_in,cocos_in,[],[],[],1);
+      end
       % Now gdat_tcv should return the convention from LIUQE which is COCOS=17, except if specified in option
       % create standard filename name from shot, time_eff (cocos will be added by write_eqdsk)
       cocos_out = 17;
@@ -982,20 +1018,32 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       % cannot use it for psi(R,Z) in .data and .x since R, Z might be different at different times,
       % so project psi(R,Z) on Rmesh, Zmesh of 1st time
       if length(time) > 1
-        gdat_data.eqdsk{itime} = write_eqdsk(fnamefull,eqdsk_cocosout,cocos_out);
-        if itime==1
-          gdat_data.data(:,:,itime) = gdat_data.eqdsk{itime}.psi;
-          gdat_data.dim{1} = gdat_data.eqdsk{itime}.rmesh;
-          gdat_data.dim{2} = gdat_data.eqdsk{itime}.zmesh;
+        if gdat_data.gdat_params.write==1
+          gdat_data.eqdsk{itime} = write_eqdsk(fnamefull,eqdsk_cocosout,cocos_out);
         else
-	  xx=repmat(reshape(gdat_data.dim{1},length(gdat_data.dim{1}),1),1,size(gdat_data.eqdsk{itime}.psi,2));
-	  yy=repmat(reshape(gdat_data.dim{2},1,length(gdat_data.dim{2})),size(gdat_data.eqdsk{itime}.psi,1),1);
-	  aa = interpos2Dcartesian(gdat_data.eqdsk{itime}.rmesh,gdat_data.eqdsk{itime}.zmesh ...
+          gdat_data.eqdsk{itime} = eqdsk_cocosout;
+        end
+        if gdat_data.gdat_params.map_eqdsk_psirz==1
+          if itime==1
+            gdat_data.data(:,:,itime) = gdat_data.eqdsk{itime}.psi;
+            gdat_data.dim{1} = gdat_data.eqdsk{itime}.rmesh;
+            gdat_data.dim{2} = gdat_data.eqdsk{itime}.zmesh;
+          else
+            xx=repmat(reshape(gdat_data.dim{1},length(gdat_data.dim{1}),1),1,size(gdat_data.eqdsk{itime}.psi,2));
+            yy=repmat(reshape(gdat_data.dim{2},1,length(gdat_data.dim{2})),size(gdat_data.eqdsk{itime}.psi,1),1);
+            aa = interpos2Dcartesian(gdat_data.eqdsk{itime}.rmesh,gdat_data.eqdsk{itime}.zmesh ...
 	  ,gdat_data.eqdsk{itime}.psi,xx,yy,-1,-1);
-          gdat_data.data(:,:,itime) = aa;
+            gdat_data.data(:,:,itime) = aa;
+          end
+        else
+          % do not map all psi(r,z) onto same mesh and leave .data, .dim empty (much faster)
         end
       else
-        gdat_data.eqdsk = write_eqdsk(fnamefull,eqdsk_cocosout,cocos_out);
+        if gdat_data.gdat_params.write==1
+          gdat_data.eqdsk = write_eqdsk(fnamefull,eqdsk_cocosout,cocos_out);
+        else
+          gdat_data.eqdsk = eqdsk_cocosout;
+        end
         gdat_data.data = gdat_data.eqdsk.psi;
         gdat_data.dim{1} = gdat_data.eqdsk.rmesh;
         gdat_data.dim{2} = gdat_data.eqdsk.zmesh;
@@ -1003,7 +1051,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     end
     gdat_data.dim{3} = gdat_data.t;
     gdat_data.x = gdat_data.dim(1:2);
-    gdat_data.data_fullpath=['psi(R,Z) and eqdsk from read_eqdsk from LIUQE' num2str(liuqe_version) ';zshift=' num2str(zshift)];
+    if gdat_data.gdat_params.map_eqdsk_psirz==1
+      gdat_data.data_fullpath=['psi(R,Z,t) on same R,Zmesh in .data and eqdsk{itime} from read_eqdsk from LIUQE' num2str(liuqe_version) ';zshift=' num2str(zshift)];
+    else
+      gdat_data.data_fullpath=['eqdsk{itime} from read_eqdsk from LIUQE' num2str(liuqe_version) ';zshift=' num2str(zshift)];
+    end
     gdat_data.units = 'T m^2';
     gdat_data.dimunits = {'m','m','s'};
     gdat_data.request_description = ['data=psi, x=(R,Z), eqdsk contains eqdsk structure with which ' ...
@@ -1842,6 +1894,26 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     if (length(gdat_data.dim)>=mapping_for_tcv.gdat_timedim); gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; end
     if (length(gdat_data.dim)>0); gdat_data.x = gdat_data.dim{1}; end
         
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   case {'pprime', 'pprime_rho'}
+    if liuqe_matlab==0
+      nodenameeff = ['tcv_eq(''' liuqefortran2liuqematlab('pprime_rho',1,0) ''',''LIUQE' substr_liuqe_tcv_eq ''')'];
+      tracetdi=tdi(nodenameeff);
+      tracetdi.dim{1} = sqrt(tracetdi.dim{1}); % correct x-axis psi_norm to rhopol
+      tracetdi.data = tracetdi.data ./2 ./pi; % correct node assumption
+    else
+      nodenameeff = ['tcv_eq(''pprime_rho'',''LIUQE.M' substr_liuqe_tcv_eq ''')'];
+      tracetdi=tdi(nodenameeff);
+    end
+    gdat_data.data = tracetdi.data;
+    gdat_data.dim = tracetdi.dim;
+    gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim};
+    gdat_data.x = gdat_data.dim{setdiff([1 2],mapping_for_tcv.gdat_timedim)};
+    gdat_data.data_fullpath=nodenameeff;
+    gdat_data.dimunits = tracetdi.dimunits;
+    gdat_data.units = tracetdi.units;
+    gdat_data.request_description = 'pprime=dp/dpsi';
+
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'psi_edge'}
     % psi at edge, 0 by construction in Liuqe, thus not given
@@ -1872,6 +1944,25 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
     gdat_data.vsurf = vsurf;
     gdat_data.vsurf_description = ['time derivative from surface_psi, obtained from \results::surface_flux'];
 
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   case {'r_contour_edge', 'z_contour_edge'}
+    if liuqe_matlab==0
+      nodenameeff=['\results::' data_request_eff(1) '_contour' substr_liuqe];
+      % npts_contour = tdi(['\results::npts_contour' substr_liuqe]);
+      tracetdi=tdi(nodenameeff);
+      gdat_data.request_description = 'NaNs when smaller nb of boundary points at given time, can use \results::npts_contour';
+    else
+      nodenameeff = ['tcv_eq(''' data_request_eff(1) '_edge'',''LIUQE.M' substr_liuqe_tcv_eq ''')'];
+      tracetdi=tdi(nodenameeff);
+      gdat_data.request_description = 'lcfs on same nb of points for all times';
+    end
+    gdat_data.data = tracetdi.data;
+    gdat_data.dim = tracetdi.dim;
+    gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim};
+    gdat_data.data_fullpath=nodenameeff;
+    gdat_data.dimunits = tracetdi.dimunits;
+    gdat_data.units = tracetdi.units;
+
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'rhotor_edge', 'rhotor', 'rhotor_norm'}
     % Phi(LCFS) = int(Bphi dSphi), can use Eq.(11) of "Tokamak coordinate conventions: COCOS" paper:
diff --git a/crpptbx/TCV/tcv_help_parameters.m b/crpptbx/TCV/tcv_help_parameters.m
index 5a7d2f5f561e05e6da6bf0d8f9c25c533d51c5bf..db22c4ebb7cd51caf11b25d1dc1b7f226370c921 100644
--- a/crpptbx/TCV/tcv_help_parameters.m
+++ b/crpptbx/TCV/tcv_help_parameters.m
@@ -52,7 +52,8 @@ help_struct_all.camera = ['sxr: for MPX: ''central'', ''top'' (default), ''botto
 help_struct_all.freq = '''slow'', default, lower sampling; ''fast'' full samples for both mpx and xtomo';
 help_struct_all.max_adcs = 'rtc: source=''adcs'' maximum nb of adc channels loaded for each board in each active node';
 help_struct_all.nfft = '512 (default) changes time resolution in spectrogram in gdat_plot for ''mhd'' request';
-
+help_struct_all.map_eqdsk_psirz = 'eqdsk: if time array provided, maps all psi(R,Z,t) on same R,Zmesh in .data (1) or not (0, default)';
+help_struct_all.write = 'eqdsk: write eqdsk while loading data (1, default) or not (0)';
 %help_struct_all. = '';
 
 
diff --git a/crpptbx/TCV/tcv_requests_mapping.m b/crpptbx/TCV/tcv_requests_mapping.m
index da7cecd65acfd5995aa74eb2993d7a7bc987dc3a..93b32b12741719fd3d59a45bd0f03c7884d6e370 100644
--- a/crpptbx/TCV/tcv_requests_mapping.m
+++ b/crpptbx/TCV/tcv_requests_mapping.m
@@ -236,6 +236,10 @@ switch lower(data_request)
   mapping.timedim = 1;
   mapping.label = 'various powers';
   mapping.method = 'switchcase';
+ case {'pprime', 'pprime_rho'}
+  mapping.timedim = 2;
+  mapping.label = 'pprime';
+  mapping.method = 'switchcase';
  case {'psi_axis', 'psi_mag'}
   mapping.timedim = 1;
   mapping.method = 'tdiliuqe';
@@ -289,6 +293,10 @@ switch lower(data_request)
   mapping.expression = '\results::r_contour';
   mapping.expression = '\tcv_shot::top.results.equil_1.results:r_surf'; % LCFS R coordinates (r,t)
   mapping.expression = 'tcv_eq(''''r_edge'''',''''LIUQE.M'''')';
+
+  mapping.label = 'R\_lcfs';
+  mapping.method = 'switchcase';
+
 % $$$   mapping.method = 'expression';
 % $$$   mapping.expression = ['params_eff = gdat_data.gdat_params;params_eff.data_request=''tcv_eq(''''''''r_edge'''''''',''''''''LIUQE.M'''''''')''; ' ...
 % $$$                     'gdat_tmp=gdat_tcv(shot,params_eff);gdat_tmp.data=gdat_tmp.data(:,:,end);' ...
@@ -354,6 +362,10 @@ switch lower(data_request)
  case 'transp'
   mapping.label = 'transp output';
   mapping.method = 'switchcase';
+ case {'ttprime', 'ttprime_rho'}
+  mapping.timedim = 2;
+  mapping.label = 'pprime';
+  mapping.method = 'switchcase';
  case 'vloop'
   mapping.timedim = 1;
   mapping.label = 'Vloop';
@@ -398,6 +410,10 @@ switch lower(data_request)
   mapping.expression = '\results::z_contour';
   mapping.expression = '\tcv_shot::top.results.equil_1.results:z_surf'; % LCFS Z coordinates (r,t)
   mapping.expression = 'tcv_eq(''''z_edge'''',''''LIUQE.M'''')';
+
+  mapping.label = 'Z\_lcfs';
+  mapping.method = 'switchcase';
+
 % $$$   mapping.method = 'expression';
 % $$$   mapping.expression = ['params_eff = gdat_data.gdat_params;params_eff.data_request=''tcv_eq(''''''''z_edge'''''''',''''''''LIUQE.M'''''''')''; ' ...
 % $$$                     'gdat_tmp=gdat_tcv(shot,params_eff);gdat_tmp.data=gdat_tmp.data(:,:,end);' ...
diff --git a/crpptbx/liuqefortran2liuqematlab.m b/crpptbx/liuqefortran2liuqematlab.m
index 6d3d783ebd00c9bc8abbafb973f58468e3834455..b5effd13341d8dfd9bcfeef771b9e475dea27806 100644
--- a/crpptbx/liuqefortran2liuqematlab.m
+++ b/crpptbx/liuqefortran2liuqematlab.m
@@ -27,6 +27,7 @@ function liuqe_fortran_matlab = liuqefortran2liuqematlab(varargin);
 liuqe_fortran_matlab_table = [ ...
     {'l_i'}           , {'l_i_3'}     ; ...
     {'i_p'}           , {'i_pl'}  ; ...
+    {'pprime_psi'}    , {'pprime_rho'} ; ... % warning on different x-mesh
     {'surface_flux'}  , {'psi_surf'}  ; ...
     {'q_zero'}        , {'q_axis'}    ; ...
     {'q_psi'}         , {'q'}    ; ...