diff --git a/crpptbx/TCV/gdat_tcv.m b/crpptbx/TCV/gdat_tcv.m
index d3185903ef8b892df159d0a9475a2562f40d2839..803c5c32008bc5a05621019c0348ed7609c2f263 100644
--- a/crpptbx/TCV/gdat_tcv.m
+++ b/crpptbx/TCV/gdat_tcv.m
@@ -993,6 +993,138 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       channels = gdat_data.gdat_params.channels;
     end
 
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   case {'icds'}
+    % note: same time array for all at main.data level, then individual at .ec, .nbi levels
+    % At this stage fill just eccd, later add nbi
+    sources_avail = {'ec','nbi'}; % can be set in parameter source
+    % create empty structures for all, so in return one always have same substructres
+    for i=1:length(sources_avail)
+      gdat_data.(sources_avail{i}).data = [];
+      gdat_data.(sources_avail{i}).units = [];
+      gdat_data.(sources_avail{i}).dim=[];
+      gdat_data.(sources_avail{i}).dimunits=[];
+      gdat_data.(sources_avail{i}).t=[];
+      gdat_data.(sources_avail{i}).x=[];
+      gdat_data.(sources_avail{i}).data_fullpath=[];
+      gdat_data.(sources_avail{i}).label=[];
+    end
+    if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source)
+      gdat_data.gdat_params.source = sources_avail;
+    elseif ~iscell(gdat_data.gdat_params.source)
+      if ischar(gdat_data.gdat_params.source)
+	gdat_data.gdat_params.source = lower(gdat_data.gdat_params.source);
+        if ~any(strmatch(gdat_data.gdat_params.source,lower(sources_avail)))
+          if (gdat_params.nverbose>=1)
+            warning(['source= ' gdat_data.gdat_params.source ' is not part of the available sources: ' sprintf('''%s'' ',sources_avail{:})]);
+          end
+          return
+        else
+          gdat_data.gdat_params.source = {gdat_data.gdat_params.source};
+        end
+      else
+        if (gdat_params.nverbose>=1); warning([' source parameter not compatible with: ' sprintf('''%s'' ',sources_avail{:})]); end
+        return
+      end
+    else
+      for i=1:length(gdat_data.gdat_params.source)
+        gdat_data.gdat_params.source{i} = lower(gdat_data.gdat_params.source{i});
+        if ~any(strmatch(gdat_data.gdat_params.source{i},lower(sources_avail)))
+          if gdat_data.gdat_params.nverbose>=1
+            warning(['source = ' gdat_data.gdat_params.source{i} ' not expected with data_request= ' data_request_eff])
+          end
+        end
+      end
+    end
+    % create structure for icd sources from params and complete with defaults
+    source_icd.ec = 'toray';
+    source_icd.nbi = '';
+    for i=1:length(gdat_data.gdat_params.source)
+      if ~isfield(gdat_data.gdat_params,['source_' gdat_data.gdat_params.source{i}])
+        gdat_data.gdat_params.(['source_' gdat_data.gdat_params.source{i}]) = source_icd.(gdat_data.gdat_params.source{i});
+      else
+        source_icd.(gdat_data.gdat_params.source{i}) = gdat_data.gdat_params.(['source_' gdat_data.gdat_params.source{i}]);
+      end
+    end
+
+    mdsopen(shot);
+    % add each source in main.data, on ohm time array
+    gdat_data.units = 'A';
+    gdat_data.label=[]; % label was defined in tcv_mapping_request as char so replace to allow cells
+    %
+    if any(strmatch('ec',gdat_data.gdat_params.source))
+      data_fullpath = '';
+      ec_help = '';
+      % EC
+      if strcmp(lower(source_icd.ec),'toray')
+        [ptot,icdtot] = astra_tcv_EC_exp(shot); % centralized function for toray nodes
+        data_fullpath = 'from toray nodes using astra_tcv_EC_exp(shot)';
+        ec_help = 'from toray icdint with extracting of effective Icd for given launcher depending on nb rays used';
+        if isfield(icdtot,'tgrid'); icdtot.t = icdtot.tgrid; end
+        if isfield(icdtot,'data'); 
+          icdtot.data = icdtot.data * 1e6; % MA -> A
+          icdtot.data = icdtot.data';
+          icdtot.data(:,end+1) = sum(icdtot.data,2);
+        end
+      else
+        disp(['source_icd.ec = ' source_icd.ec ' not yet implemented, ask O. Sauter'])
+        return
+      end
+      if isempty(icdtot.data) || isempty(icdtot.t) || ischar(icdtot.data)
+        if (gdat_params.nverbose>=1)
+          warning(['problems loading data for ' source_icd.ec ...
+                    ' for data_request= ' data_request_eff]);
+        end
+      else
+        gdat_data.ec.data = icdtot.data;
+        gdat_data.ec.units = 'A';
+        gdat_data.ec.dim{1} = icdtot.t;
+        gdat_data.ec.dim{2} = [1:size(gdat_data.ec.data,2)];
+        gdat_data.ec.dimunits={'s','launcher i, total'};
+        gdat_data.ec.t=gdat_data.ec.dim{1};
+        gdat_data.ec.x=gdat_data.ec.dim{2};
+        gdat_data.ec.data_fullpath = data_fullpath;
+        gdat_data.ec.label='I_{cd}';
+        gdat_data.ec.help = ec_help;
+        % add to main, assume 1st one so just use this time base
+        gdat_data.data(:,end+1) = gdat_data.ec.data(:,end);
+        gdat_data.t = gdat_data.ec.t;
+        gdat_data.x(end+1) = 1;
+        gdat_data.label{end+1}=gdat_data.ec.label; % label was defined in tcv_mapping_request as char so replace 1st time
+      end
+    end
+    %
+    if any(strmatch('nb',gdat_data.gdat_params.source))
+      NBH_in_TCV = 0;
+      if shot >= 51641
+        % NBI
+        moderemote = mdsdata('data(\VSYSTEM::TCV_NBHDB_B["NBI:MODEREMOTE_RB"])');
+        lcs_mode   = mdsdata('data(\VSYSTEM::TCV_NBHDB_I["NBI:LCS_MODE"])');
+        % NBH in TCV equiv moderemote='OK' AND lcs_mode = 9
+        NBH_in_TCV = strcmpi(strtrim(moderemote),'OK') && lcs_mode == 9;
+      else
+        % Nodes used in previous block only exist outside of Vista for shots after 51641
+        if any(shot == [51458 51459 51460 51461 51463 51465 51470 51472 ... % 29.JAN.2016
+                        51628 51629 51631 51632 51633 ...                   % 09.FEB.2016
+                        51639 51640 ... 51641                               % 10.FEB.2016
+                       ])
+          NBH_in_TCV = 1;
+        end
+      end
+      if NBH_in_TCV
+        % should add reading from file at this stage ala summary Karpushov
+      end
+    end
+    %
+    % add all to last index of .data(:,i)
+    gdat_data.data(:,end+1) = sum(gdat_data.data(:,:),2);
+    gdat_data.x(end+1) = size(gdat_data.data,2);
+    gdat_data.label{end+1}='total current';
+    gdat_data.dim{1} = gdat_data.t;
+    gdat_data.dim{2} = gdat_data.x;
+    gdat_data.dimunits = {'s', 'index for each source + total CD'};
+    gdat_data.data_fullpath = 'see in individual source substructure';
+
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'mhd'}
     if isfield(gdat_data.gdat_params,'nfft') && ~isempty(gdat_data.gdat_params.nfft)
diff --git a/crpptbx/TCV/tcv_help_parameters.m b/crpptbx/TCV/tcv_help_parameters.m
index 05790029f30cffcfd20ba3b0435f6b912f9f4345..5a7d2f5f561e05e6da6bf0d8f9c25c533d51c5bf 100644
--- a/crpptbx/TCV/tcv_help_parameters.m
+++ b/crpptbx/TCV/tcv_help_parameters.m
@@ -43,7 +43,10 @@ help_struct_all.source = sprintf('%s\n','cxrs: [1 2 3] (default systems);', ...
           'sxr: main source: ''MPX'' (default) or ''XTOMO'', case insensitive', ...
           'mhd request: ''23'':23 LFS/HFS (default), ''23full'': 23cm sector 3 and 11, ''0'':z=0 LFS/HFS, ''0full'': 0cm sector 3 and 11', ...
           'powers: ohmic in any case + ''ec'', ''nbi'', ''rad'' ', ...
-          'rtc: defined, all, adcs');
+          'rtc: defined, all, adcs', ...
+          'icds: ''ec'', ''nbi'' ');
+help_struct_all.source_ec = sprintf('%s\n','toray (for toray nodes), no other source for eccd yet implemented');
+help_struct_all.source_nbi = sprintf('%s\n','nbi_output_matfilename containing out structure, to be added astra nodes');
 help_struct_all.camera = ['sxr: for MPX: ''central'', ''top'' (default), ''bottom'' or ''both'' ; ' ...
                     ' for XTOMO: ''central'' (a central chord only), defaults if empty, [1 3 5] if only camera 1, 3 and 5 are desired'];
 help_struct_all.freq = '''slow'', default, lower sampling; ''fast'' full samples for both mpx and xtomo';
diff --git a/crpptbx/TCV/tcv_requests_mapping.m b/crpptbx/TCV/tcv_requests_mapping.m
index 51505bb27c3ffb4960d285484037bcbb96cb111e..da7cecd65acfd5995aa74eb2993d7a7bc987dc3a 100644
--- a/crpptbx/TCV/tcv_requests_mapping.m
+++ b/crpptbx/TCV/tcv_requests_mapping.m
@@ -131,6 +131,10 @@ switch lower(data_request)
   mapping.label = 'Halpha';
   mapping.method = 'switchcase';
   mapping.expression = '';
+ case 'icds'
+  mapping.timedim = 1;
+  mapping.label = 'various driven current';
+  mapping.method = 'switchcase';
  case 'ioh'
   mapping.timedim = 1;
   mapping.label = 'I ohmic transformer';