diff --git a/matlab/@dynSeries/save.m b/matlab/@dynSeries/save.m
new file mode 100644
index 0000000000000000000000000000000000000000..67cc0aa8ceacb35b3a424072a4c79b2311fce670
--- /dev/null
+++ b/matlab/@dynSeries/save.m
@@ -0,0 +1,102 @@
+function save(A,basename,format)
+% Saves a dynSeries object on disk.
+    
+if nargin<3 || isempty(format)
+    format = 'csv';
+end
+
+if nargin<2 || isempty(basename)
+    basename = inputname(1);
+end
+
+switch format
+  case 'm'
+    fid = fopen([basename, '.m'],'w');
+    fprintf(fid,'%% File created on %s.\n',datestr(now));
+    fprintf(fid,'\n');
+    fprintf(fid,'FREQ__ = %s;\n',num2str(A.freq));
+    fprintf(fid,'INIT__ = '' %s'';\n',A.init.format);
+    fprintf(fid,'\n');
+    for v=1:A.vobs
+        fprintf(fid,'%s = [\n', A.name{v});
+        fprintf(fid,'%15.8g\n',A.data(1:end-1,v));
+        fprintf(fid,'%15.8g];\n\n',A.data(end,v));
+    end
+    fclose(fid);
+  case 'mat'
+    FREQ__ = A.freq;
+    INIT__ = A.init.format;
+    str = [];
+    for v=1:A.vobs
+        str = [str, A.name{v} ' = A.data(:,' num2str(v) ');' ];
+    end
+    eval(str);
+    save([basename '.mat'],'INIT__','FREQ__',A.name{:});
+  case 'csv'
+    fid = fopen([basename, '.csv'],'w');
+    fprintf(fid,', %s', A.name{:});
+    fprintf(fid,'\n');
+    for t=1:A.nobs
+        date = A.init+(t-1);
+        str = sprintf(', %15.8g',A.data(t,:));
+        fprintf(fid, '%s%s\n',date.format,str);
+    end
+    fclose(fid);
+end
+
+%@test:1
+%$ % Define a data set.
+%$ A = [transpose(1:10),2*transpose(1:10)];
+%$
+%$ % Define names
+%$ A_name = {'A1';'A2'};
+%$
+%$ % Instantiate a time series object.
+%$ try
+%$    ts1 = dynSeries(A,[],A_name,[]);
+%$    save(ts1,[],'csv');
+%$    t = 1;
+%$ catch
+%$    t = 0;
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ % Define a data set.
+%$ A = [transpose(1:10),2*transpose(1:10)];
+%$
+%$ % Define names
+%$ A_name = {'A1';'A2'};
+%$
+%$ % Instantiate a time series object.
+%$ try
+%$    ts1 = dynSeries(A,[],A_name,[]);
+%$    save(ts1,[],'m');
+%$    t = 1;
+%$ catch
+%$    t = 0;
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
+
+%@test:3
+%$ % Define a data set.
+%$ A = [transpose(1:10),2*transpose(1:10)];
+%$
+%$ % Define names
+%$ A_name = {'A1';'A2'};
+%$
+%$ % Instantiate a time series object.
+%$ try
+%$    ts1 = dynSeries(A,[],A_name,[]);
+%$    save(ts1,[],'m');
+%$    t = 1;
+%$ catch
+%$    t = 0;
+%$ end
+%$
+%$ T = all(t);
+%@eof:3
diff --git a/matlab/@dynSeries/subsref.m b/matlab/@dynSeries/subsref.m
index 64e17364a911df3895a393b2566364a360450211..66772dec691bac8c1cd3f83aa81a03f5943fc14d 100644
--- a/matlab/@dynSeries/subsref.m
+++ b/matlab/@dynSeries/subsref.m
@@ -69,6 +69,9 @@ if length(S)==1 && isequal(S.type,'.')
         us = builtin('subsref', ts, S);
       case {'log','exp'}                                                   % Give "dot access" to public methods.
         us = feval(S.subs,ts);
+      case {'save'}
+        us = NaN;
+        save(ts);
       otherwise                                                            % Extract a sub-object by selecting one variable.
         ndx = strmatch(S.subs,ts.name);
         if ~isempty(ndx)
@@ -119,9 +122,17 @@ end
 
 if (length(S)==1) && isequal(S(1).type,'{}')
     us = extract(ts,S(1).subs{:});
+    return
+end
+
+if (length(S)==2) && isequal(S(1).subs,'save') && isequal(S(1).type,'.') && isequal(S(2).type,'()')
+    us = NaN;
+    save(ts,S(2).subs{:});
+    return
 end
 
 
+
 %@test:1
 %$ % Define a data set.
 %$ A = [transpose(1:10),2*transpose(1:10)];
@@ -306,3 +317,40 @@ end
 %$ T = all(t);
 %@eof:6
 
+%@test:7
+%$ % Define a data set.
+%$ A = [transpose(1:10),2*transpose(1:10)];
+%$
+%$ % Define names
+%$ A_name = {'A1';'A2'};
+%$
+%$ % Instantiate a time series object.
+%$ try
+%$    ts1 = dynSeries(A,[],A_name,[]);
+%$    ts1.save;
+%$    t = 1;
+%$ catch
+%$    t = 0;
+%$ end
+%$
+%$ T = all(t);
+%@eof:7
+
+%@test:8
+%$ % Define a data set.
+%$ A = [transpose(1:10),2*transpose(1:10)];
+%$
+%$ % Define names
+%$ A_name = {'A1';'A2'};
+%$
+%$ % Instantiate a time series object.
+%$ try
+%$    ts1 = dynSeries(A,[],A_name,[]);
+%$    ts1.save('test_generated_data_file','m');
+%$    t = 1;
+%$ catch
+%$    t = 0;
+%$ end
+%$
+%$ T = all(t);
+%@eof:8