diff --git a/.gitignore b/.gitignore
index 17eea65cc7480ad20af3a7e2561b46ae58498aef..670dfeb97a923e2c775af0b2cbb9e1505f74031b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 *~
+.DS_Store
 externals/*
 src/git.info
 src/git.last-commit-hash
\ No newline at end of file
diff --git a/src/@x13/print.m b/src/@x13/print.m
index aaff0036950b6737fd65eaf78fa4fd1c240276f8..fa8952b83b7dcaa54cc625c0b10eee62d0bf43fe 100644
--- a/src/@x13/print.m
+++ b/src/@x13/print.m
@@ -216,4 +216,178 @@ if ismember('x11', o.commands)
     fprintf(fid, '}\n\n');
 end
 
+% Write FORCE block
+if ismember('force', o.commands)
+    fprintf(fid, 'force {');
+    if ~all(cellfun(@isempty, struct2cell(o.force)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.force);
+        for i=1:length(optionnames)
+            if ~isempty(o.force.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.force.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write HISTORY block
+if ismember('history', o.commands)
+    fprintf(fid, 'history {');
+    if ~all(cellfun(@isempty, struct2cell(o.history)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.history);
+        for i=1:length(optionnames)
+            if ~isempty(o.history.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.history.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write METADATA block
+if ismember('metadata', o.commands)
+    fprintf(fid, 'metadata {');
+    if ~all(cellfun(@isempty, struct2cell(o.metadata)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.metadata);
+        for i=1:length(optionnames)
+            if ~isempty(o.metadata.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.metadata.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write IDENTIFY block
+if ismember('identify', o.commands)
+    fprintf(fid, 'identify {');
+    if ~all(cellfun(@isempty, struct2cell(o.identify)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.identify);
+        for i=1:length(optionnames)
+            if ~isempty(o.identify.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.identify.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write PICKMDL block
+if ismember('pickmdl', o.commands)
+    fprintf(fid, 'pickmdl {');
+    if ~all(cellfun(@isempty, struct2cell(o.pickmdl)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.pickmdl);
+        for i=1:length(optionnames)
+            if ~isempty(o.pickmdl.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.pickmdl.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write SEATS block
+if ismember('seats', o.commands)
+    fprintf(fid, 'seats {');
+    if ~all(cellfun(@isempty, struct2cell(o.seats)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.seats);
+        for i=1:length(optionnames)
+            if ~isempty(o.seats.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.seats.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write SLIDINGSPANS block
+if ismember('slidingspans', o.commands)
+    fprintf(fid, 'slidingspans {');
+    if ~all(cellfun(@isempty, struct2cell(o.slidingspans)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.slidingspans);
+        for i=1:length(optionnames)
+            if ~isempty(o.slidingspans.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.slidingspans.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write SPECTRUM block
+if ismember('spectrum', o.commands)
+    fprintf(fid, 'spectrum {');
+    if ~all(cellfun(@isempty, struct2cell(o.spectrum)))
+        fprintf(fid, '\n');
+        optionnames = fieldnames(o.spectrum);
+        for i=1:length(optionnames)
+            if ~isempty(o.spectrum.(optionnames{i}))
+                printoption(fid, optionnames{i}, o.spectrum.(optionnames{i}));
+            end
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write X11REGRESSION block
+if ismember('x11regression', o.commands)
+    fprintf(fid, 'x11regression {');
+    if ~all(cellfun(@isempty, struct2cell(o.x11regression)))
+        optionnames = fieldnames(o.x11regression);
+        fprintf(fid, '\n');
+        for i=1:length(optionnames)
+            if ~isempty(o.x11regression.(optionnames{i}))
+                if isequal(optionnames{i}, 'user') % Write needed data to a file.
+                                                   % Determine the set of needed data
+                    conditionningvariables = strsplit(o.x11regression.user, {',' , '(' , ')' , ' '});
+                    conditionningvariables = conditionningvariables(~cellfun(@isempty,conditionningvariables));
+                    % Check that these data are available.
+                    for i=1:length(conditionningvariables)
+                        if ~ismember(conditionningvariables{i}, o.x.name)
+                            fclose(fid);
+                            error('x13:x11regression: Variable %s is unkonwn', conditionningvariables{i})
+                        end
+                    end
+                    % Select the data.
+                    if length(conditionningvariables)<vobs(o.x)
+                        x = o.x{conditionningvariables{:}};
+                    else
+                        x= o.x;
+                    end
+                    % Print user statement.
+                    fprintf(fid, ' user = %s\n', o.x11regression.user);
+                    % Print data statement.
+                    fprintf(fid, ' data = %s\n', sprintf(data2txt(x.data)));
+                elseif isequal(optionnames{i}, 'start')
+                    if ischar(o.x11regression.start)
+                        if isdate(o.x11regression.start)
+                            PERIOD = dates(o.x11regression.start);
+                        else
+                            error('x13:x11regression: Option start cannot be interpreted as a date!')
+                        end
+                    elseif isdates(o.x11regression.start)
+                        PERIOD = o.x11regression.start;
+                    else
+                        error('x13:x11regression: Option start cannot be interpreted as a date!')
+                    end
+                    printstart(fid, PERIOD);
+                else
+                    printoption(fid, optionnames{i}, o.x11regression.(optionnames{i}));
+                end
+            end
+        end
+        if ~isempty(o.x) && isempty(o.x11regression.start)
+            fprintf(fid, ' start = %i.%i\n', year(o.x.init), subperiod(o.x.init));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
 fclose(fid);
\ No newline at end of file
diff --git a/src/@x13/run.m b/src/@x13/run.m
index e414d10cad07ced40466e31be55079e81c3b5070..2acb8018ad3935eb8c4f0d2657a6908bc84eb21b 100644
--- a/src/@x13/run.m
+++ b/src/@x13/run.m
@@ -74,5 +74,288 @@ if ~all(cellfun(@isempty, struct2cell(o.forecast)))
     end
 end
 
+% Save results related to the TRANSFORM command
+if ~all(cellfun(@isempty, struct2cell(o.transform)))
+    if ~isempty(o.transform.save)
+        savedoutput = strsplit(o.transform.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                o.results.(savedoutput{i}) = dseries(data(:,2), o.y.init, savedoutput{i});
+            end
+        end
+    end
+end
+
+% Save results related to the OUTLIER command
+if ~all(cellfun(@isempty, struct2cell(o.outlier)))
+    if ~isempty(o.outlier.save)
+        savedoutput = strsplit(o.outlier.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                if lower(savedoutput{i}) == 'fts'
+                    header = strjoin(tmp.textdata(1));
+                    header = strsplit(header, {'\t'});
+                    header = header(1,2:end);
+                    o.results.(savedoutput{i}) = dseries(data(:,2:end), o.y.init, regexprep(header,'\(|\)',''));
+                elseif lower(savedoutput{i}) == 'oit'
+                    header = strjoin(tmp.textdata(1,1));
+                    header = strsplit(header, {'\t'});
+                    header = header(1,4:end);
+                    info   = tmp.textdata(3:end,3);
+                    for j = 1:numel(info)
+                        flag = strjoin(info(j));
+                        o.results.(savedoutput{i}).(['outlier_' num2str(j)]).type = flag(1:2);
+                        o.results.(savedoutput{i}).(['outlier_' num2str(j)]).date(1,1) = str2double(flag(3:strfind(flag,'.')-1));
+                        o.results.(savedoutput{i}).(['outlier_' num2str(j)]).date(1,2) = str2double(flag(strfind(flag,'.')+1:end));
+                        o.results.(savedoutput{i}).(['outlier_' num2str(j)]).(header{1}) = data(j,1);% medrmse
+                        o.results.(savedoutput{i}).(['outlier_' num2str(j)]).(header{2}) = data(j,2);% rmse
+                        o.results.(savedoutput{i}).(['outlier_' num2str(j)]).(header{3}) = data(j,3);% t-stat
+                    end
+                end
+            end
+        end
+    end
+end
+
+% Save results related to the SLIDINGSPANS command
+if ~all(cellfun(@isempty, struct2cell(o.slidingspans)))
+    if ~isempty(o.slidingspans.save)
+        savedoutput = strsplit(o.slidingspans.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                header = strjoin(tmp.textdata(1));
+                header = strsplit(header, {'\t'});
+                header = header(1,2:end);
+                % In this case, the initial date is not the start of the series provided
+                startdate = num2str(data(1,1));
+                startdate = dates(o.y.dates.freq,str2double(startdate(1:4)),str2double(startdate(5:6)));
+                o.results.(savedoutput{i}) = dseries(data(:,2:end),startdate, regexprep(header,'%','pct'));
+            end
+        end
+    end
+end
+
+% Save results related to the IDENTIFY command
+if ~all(cellfun(@isempty, struct2cell(o.identify)))
+    if ~isempty(o.identify.save)
+        savedoutput = strsplit(o.identify.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                header = strjoin(tmp.textdata(3,1));
+                header = strsplit(header, {'\t'});
+                header = header(1,2:end);
+                for j = 1:length(data)
+                    for k = 1:numel(header)
+                        o.results.(savedoutput{i}).(['lag' num2str(j)]).(strjoin(regexprep(header(k),'(\.||\-)',''))) = data(j,k+1);
+                    end
+                end
+            end
+        end
+    end
+end
+
+% Save results related to the CHECK command
+if ~all(cellfun(@isempty, struct2cell(o.check)))
+    if ~isempty(o.check.save)
+        savedoutput = strsplit(o.check.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                % if "ac2" is selected and output is treated as a table/struct, there will be a
+                % dimension error. As long as there is no fix, ac2 is saved as text.
+                if lower(savedoutput{i}) == 'ac2'
+                    o.results.(savedoutput{i}) = fileread(sprintf('%s.ac2', basename));
+                else
+                    tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                    data = tmp.data;
+                    header = strjoin(tmp.textdata(1,1));
+                    header = strsplit(header, {'\t'});
+                    header = header(1,2:end);
+                    for j = 1:length(data)
+                        for k = 1:numel(header)
+                            o.results.(savedoutput{i}).(['lag' num2str(j)]).(strjoin(regexprep(header(k),'(\.||\-)',''))) = data(j,k+1);
+                        end
+                    end
+                end
+            end
+        end
+    end
+end
+
+% Save results related to the FORCE command
+if ~all(cellfun(@isempty, struct2cell(o.force)))
+    if ~isempty(o.force.save)
+        savedoutput = strsplit(o.force.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                o.results.(savedoutput{i}) = dseries(data(:,2), o.y.init, savedoutput{i});
+            end
+        end
+    end
+end
+
+% Save results related to the SPECTRUM command
+if ~all(cellfun(@isempty, struct2cell(o.spectrum)))
+    if ~isempty(o.spectrum.save)
+        savedoutput = strsplit(o.spectrum.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                header = strjoin(tmp.textdata(1,1));
+                header = strsplit(header, {'\t'});
+                header = regexprep(header(2:end),'10','Ten');
+                for j = 1:numel(header)
+                    o.results.(savedoutput{i}).(strjoin(regexprep(header(j),'(\*||\(||\))',''))) = data(:,j+1);
+                end
+            end
+        end
+    end
+end
+
+% Save results related to the SEATS command
+if ~all(cellfun(@isempty, struct2cell(o.seats)))
+    if ~isempty(o.seats.save)
+        savedoutput = strsplit(o.seats.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                data = tmp.data;
+                o.results.(savedoutput{i}) = dseries(data(:,2), o.y.init, savedoutput{i});
+            end
+        end
+    end
+    o.results.tbs = fileread(sprintf('%s.tbs', basename));
+end
+
+% Save results related to the X11REGRESSION command
+if ~all(cellfun(@isempty, struct2cell(o.x11regression)))
+    if ~isempty(o.x11regression.save)
+        savedoutput = strsplit(o.x11regression.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                if lower(savedoutput{i}) == 'xrc'
+                    o.results.out = fileread(sprintf('%s.xrc', basename));
+                else
+                    tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                    data = tmp.data;
+                    o.results.(savedoutput{i}) = dseries(data(:,2), o.y.init, savedoutput{i});
+                end
+            end
+        end
+    end
+end
+
+% Save results related to the ESTIMATE command
+if ~all(cellfun(@isempty, struct2cell(o.estimate)))
+    if ~isempty(o.estimate.save)
+        savedoutput = strsplit(o.estimate.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i = 1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                % The .est file cannot be read straightforwardly using
+                % importdata, so it is treated separately:
+                if lower(savedoutput{i}) == 'est'
+                    fid  = fopen(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                    fid2 = fopen(sprintf('%s.estx', basename), 'w');
+                    r = 1;
+                    s = 0;
+                    while s<=1
+                        a = fgetl(fid);
+                        if a ~= -1
+                            output{r,1} = a;
+                            fprintf(fid2,[a '\n']);
+                        else
+                            s = s+1;
+                        end
+                        r = r+1;
+                    end
+                    o.results.(savedoutput{i}) = fileread(sprintf('%s.estx', basename));
+                else
+                    tmp  = importdata(sprintf('%s.%s', basename, lower(savedoutput{i})));
+                    data = tmp.data;
+                end
+
+                if lower(savedoutput{i}) == 'lks'
+                    for j = 1:numel(tmp.textdata)
+                        o.results.(savedoutput{i}).(tmp.textdata{j}) = data(j);
+                    end
+                elseif lower(savedoutput{i}) == 'ref'
+                    header = strjoin(tmp.textdata(1,1));
+                    header = strsplit(header, {'\t'});
+                    header = regexprep(header(1,2:end),'( ||\-)','');
+                    for j = 1:numel(header)
+                        o.results.(savedoutput{i}).(header{j}) = dseries(data(:,j+1), o.y.init, header(j));
+                    end
+                elseif lower(savedoutput{i}) == 'rrs'
+                    o.results.(savedoutput{i}) = dseries(data(:,2), o.y.init, savedoutput{i});
+                elseif lower(savedoutput{i}) == 'rsd'
+                    o.results.(savedoutput{i}) = dseries(data(:,2), o.y.init, savedoutput{i});
+                elseif lower(savedoutput{i}) == 'rcm'
+                    o.results.(savedoutput{i}) = fileread(sprintf('%s.rcm', basename));
+                elseif lower(savedoutput{i}) == 'acm'
+                    o.results.(savedoutput{i}) = fileread(sprintf('%s.acm', basename));
+                elseif lower(savedoutput{i}) == 'rts'
+                    header = strjoin(tmp.textdata(1,1));
+                    header = strsplit(header, {'\t'});
+                    info   = tmp.textdata(3:end,1:2);
+                    for j = 1:rows(data)
+                        for k = 1:columns(info)
+                            o.results.(savedoutput{i}).(['root_' num2str(j)]).(header{k}) = strjoin(info(j,k));
+                        end
+                        for k = 1:columns(data)
+                            o.results.(savedoutput{i}).(['root_' num2str(j)]).(header{k+columns(info)}) = data(j,k);
+                        end
+                    end
+                elseif lower(savedoutput{i}) == 'itr'
+                    data   = data(:,3:end);
+                    header = strjoin(tmp.textdata(1,1));
+                    header = strsplit(header, {'\t'});
+                    header = header(3:end-1);
+                    for j = 1:rows(data)
+                        for k = 1:columns(header)
+                            o.results.(savedoutput{i}).(['iter_' num2str(j)]).(header{k}) = data(j,k);
+                        end
+                    end
+                elseif lower(savedoutput{i}) == 'mdl'
+                    o.results.(savedoutput{i}) = fileread(sprintf('%s.mdl', basename));
+                end
+            end
+        end
+    end
+end
+
+% Save results related to the HISTORY command
+if ~all(cellfun(@isempty, struct2cell(o.history)))
+    if ~isempty(o.history.save)
+        savedoutput = strsplit(o.history.save, {',' , '(' , ')' , ' '});
+        savedoutput = savedoutput(~cellfun('isempty', savedoutput));
+        for i=1:length(savedoutput)
+            if exist(sprintf('%s.%s', basename, lower(savedoutput{i})))
+                % Prov
+                o.results.(savedoutput{i}) =fileread(sprintf('%s.%s', basename,lower(savedoutput{i})));
+            end
+        end
+    end
+end
+
 % Save main generated output file.
 o.results.out = fileread(sprintf('%s.out', basename));
\ No newline at end of file
diff --git a/src/@x13/subsasgn.m b/src/@x13/subsasgn.m
index 33353b31a3d2c32270306c0a0ec9b355687250b4..3fe9956ed303eba330cdd6a81fc9e9b25eeb3f08 100644
--- a/src/@x13/subsasgn.m
+++ b/src/@x13/subsasgn.m
@@ -1,4 +1,4 @@
-function val = subsasgn(val, idx, rhs) % --*-- Unitary tests --*--
+function val = subsasgn(val, idx, rhs)
 
 % Copyright (C) 2017 Dynare Team
 %
diff --git a/src/@x13/subsref.m b/src/@x13/subsref.m
index e26223940b0d5fb14964e1caccba056c33fca0c2..df687ff1b06b5bfa7f8c5231e028de1827a79c88 100644
--- a/src/@x13/subsref.m
+++ b/src/@x13/subsref.m
@@ -1,17 +1,15 @@
-function o = subsref(o, S) % --*-- Unitary tests --*--
+function o = subsref(o, S)
 
 % Overloads the subsref method.
 
 % Copyright (C) 2017 Dynare Team
 %
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
+% This code is free software: you can redistribute it and/or modify
 % it under the terms of the GNU General Public License as published by
 % the Free Software Foundation, either version 3 of the License, or
 % (at your option) any later version.
 %
-% Dynare is distributed in the hope that it will be useful,
+% Dynare dseries submodule is distributed in the hope that it will be useful,
 % but WITHOUT ANY WARRANTY; without even the implied warranty of
 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 % GNU General Public License for more details.
@@ -22,24 +20,24 @@ function o = subsref(o, S) % --*-- Unitary tests --*--
 switch S(1).type
   case '.'
     switch S(1).subs
-      case {'arima','automdl','regression','transform','outlier', 'forecast', 'check', 'x11', 'estimate'}
+      case {'x','y'}
+        if isequal(length(S), 1)
+            o = builtin('subsref', o, S(1));
+        else
+            if isequal(S(2).type,'.')
+                o = builtin('subsref', o.(S(1).subs), S(2));
+            end
+        end
+      case {'commands'}
+        o = builtin('subsref', o, S(1));
+      case {'arima','automdl','regression','transform','outlier', 'forecast', 'check', 'x11', 'estimate','composite',...
+            'force','history','metadata','identify','pickmdl','seats','slidingspans','spectrum','x11regression'}
         if isequal(length(S), 1)
-            % Just print the member.
-            disp(o.(S(1).subs))
+            o = builtin('subsref', o, S(1));
         else
             if isequal(S(2).type,'()')
                 if ~ismember(S(1).subs, o.commands)
-                    switch S(1).subs
-                      case 'arima'
-                        if ismember('automdl', o.commands)
-                            error('x13:arima: ARIMA command is not compatible with AUTOMDL command!')
-                        end
-                      case 'automdl'
-                        if ismember('arima', o.commands)
-                            error('x13:automdl: AUTOMDL command is not compatible with ARIMA command!')
-                        end
-                      otherwise
-                    end
+                    checkcommandcompatibility(o, S(1).subs);
                     o.commands(end+1) = {S(1).subs};
                 end
                 if isempty(S(2).subs)
@@ -53,11 +51,14 @@ switch S(1).type
                     for i=1:2:length(S(2).subs)
                         if isoption(S(1).subs, S(2).subs{i})
                             o.(S(1).subs) = setoption(o.(S(1).subs), S(2).subs{i}, S(2).subs{i+1});
+                            checkoptioncompatibility(o);
                         else
                             disp(sprintf('Option %s is not available in block %s!', S(2).subs{i}, S(1).subs))
                         end
                     end
                 end
+            elseif isequal(S(2).type,'.')
+                o = builtin('subsref', o.(S(1).subs), S(2));
             else
                 error('x13:%s: Wrong calling sequence!', S(1).subs)
             end
@@ -80,7 +81,13 @@ switch S(1).type
         end
       case 'results'
         % Returns a structure with all the results.
-        o = o.results;
+        if isequal(length(S), 1)
+            o = builtin('subsref', o, S(1));
+        else
+            if isequal(S(2).type,'.')
+                o = builtin('subsref', o.(S(1).subs), S(2));
+            end
+        end
       otherwise
         error('x13:: I do not understand what you are asking for!')
     end
diff --git a/src/@x13/x13.m b/src/@x13/x13.m
index 2eeece9009bf8490bdaf20b7bd01c57be3d74d6b..98fc4422ebd83534532b3a85937cf25c554414b1 100644
--- a/src/@x13/x13.m
+++ b/src/@x13/x13.m
@@ -1,4 +1,4 @@
-classdef x13<handle % --*-- Unitary tests --*--
+classdef x13<handle
 
 % Class for X13 toolbox.
 
@@ -18,30 +18,39 @@ classdef x13<handle % --*-- Unitary tests --*--
 % along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
 
 properties
-    y          = [];         % dseries object with a single variable.
-    x          = [];         % dseries object with an arbitrary number of variables (to be used in the REGRESSION block).
-    arima      = [];         % ARIMA model.
-    automdl    = [];         % ARIMA model selection.
-    regression = [];         % Regression model.
-    estimate   = [];         % Estimation options.
-    transform  = [];         % Transform command  applied to y.
-    outlier    = [];         % Outlier command.
-    forecast   = [];         % Forecast command.
-    check      = [];         % Check command.
-    x11        = [];         % X11 cmmand
-    results    = [];         % Estimation results
-    commands   = {};         % List of commands.
+    y             = [];  % dseries object with a single variable.
+    x             = [];  % dseries object with an arbitrary number of variables (to be used in the REGRESSION block).
+    arima         = [];  % ARIMA model.
+    automdl       = [];  % ARIMA model selection.
+    regression    = [];  % Regression command, specification for including regression variables in a regARIMA model, or for specifying regression variables whose effects are to be removed by the identify spec to aid ARIMA model identification.
+    estimate      = [];  % Estimation command, estimates the regARIMA model specified with the regression and arima commands.
+    transform     = [];  % Transform command, transforms or adjusts the series prior to estimating a regARIMA model.
+    outlier       = [];  % Outlier command, performs automatic detection of additive (point) outliers, temporary change outliers, level shifts, or any combination of the three using the specified model.
+    forecast      = [];  % Forecast command, forecasts and/or backcasts the time series y using the estimated model.
+    check         = [];  % Check command, produces statistics for diagnostic checking of residuals from the estimated model.
+    x11           = [];  % X11 command, invokes seasonal adjustment by an enhanced version of the methodology of the Census Bureau X-11 and X-11Q program.
+    force         = [];  % Force command, allow users to force yearly totals of the seasonally adjusted series to equal those of the original series for convenience.
+    history       = [];  % History command, requests a sequence of runs from a sequence of truncated versions of the time series.
+    metadata      = [];  % Metadata command, allows users to insert metadata into the diagnostic summary file.
+    identify      = [];  % Identify command, produces tables and line printer plots of sample ACFs and PACFs for identifying the ARIMA part of a regARIMA model.
+    pickmdl       = [];  % Pickmdl command, automatic model selection procedure for the ARIMA part of the regARIMA model.
+    seats         = [];  % Seats command, invokes the production of model based signal extraction using SEATS, a seasonal adjustment program developed by Victor Gomez and Agustin Maravall at the Bank of Spain.
+    slidingspans  = [];  % Slidingspans command, compares different features of seasonal adjustment output from overlapping subspans of the time series data.
+    spectrum      = [];  % Spectrum command, spectrum diagnostics to detect seasonality or trading day effects in monthly series.
+    x11regression = [];  % X11Regression command, estimates calendar effects by regression modeling of the irregular component with predefined or user-defined regressors.
+    results       = [];  % Estimation results.
+    commands      = {};  % List of commands.
 end
 
 methods
-        function o = x13(y, x)
-        % Constructor for the x13 class.
-        %
-        % INPUTS
-        % - y      [dseries]    Data.
-        %
-        % OUPUTS
-        % - o      [x13]        Empty object except for the data.
+    function o = x13(y, x)
+    % Constructor for the x13 class.
+    %
+    % INPUTS
+    % - y      [dseries]    Data.
+    %
+    % OUPUTS
+    % - o      [x13]        Empty object except for the data.
         if ~nargin
             o.y = dseries();
             o.x = dseries();
@@ -54,6 +63,15 @@ methods
             o.forecast = setdefaultmember('forecast');
             o.check = setdefaultmember('check');
             o.x11 = setdefaultmember('x11');
+            o.force = setdefaultmember('force');
+            o.history = setdefaultmember('history');
+            o.metadata = setdefaultmember('metadata');
+            o.identify = setdefaultmember('identify');
+            o.pickmdl = setdefaultmember('pickmdl');
+            o.seats = setdefaultmember('seats');
+            o.slidingspans = setdefaultmember('slidingspans');
+            o.spectrum = setdefaultmember('spectrum');
+            o.x11regression = setdefaultmember('x11regression');
             o.results = struct();
             o.commands = {};
             return
@@ -86,8 +104,18 @@ methods
         o.forecast = setdefaultmember('forecast');
         o.check = setdefaultmember('check');
         o.x11 = setdefaultmember('x11');
+        o.force = setdefaultmember('force');
+        o.history = setdefaultmember('history');
+        o.metadata = setdefaultmember('metadata');
+        o.identify = setdefaultmember('identify');
+        o.pickmdl = setdefaultmember('pickmdl');
+        o.seats = setdefaultmember('seats');
+        o.slidingspans = setdefaultmember('slidingspans');
+        o.spectrum = setdefaultmember('spectrum');
+        o.x11regression = setdefaultmember('x11regression');
         o.results = struct();
         o.commands = {};
-        end
+    end
 end
+
 end
\ No newline at end of file
diff --git a/src/utilities/x13/checkcommandcompatibility.m b/src/utilities/x13/checkcommandcompatibility.m
new file mode 100644
index 0000000000000000000000000000000000000000..9359cddc821821ecb8e686c7c7f6261c8b53d183
--- /dev/null
+++ b/src/utilities/x13/checkcommandcompatibility.m
@@ -0,0 +1,40 @@
+function checkcommandcompatibility(o, comm)
+
+% Checks for compatibility of X13 commands.
+
+% Copyright (C) 2017 Dynare Team
+%
+% This code is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare dseries submodule is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+switch comm
+  case 'arima'
+    if ismember('automdl', o.commands)
+        error('x13:arima: ARIMA command is not compatible with AUTOMDL command!')               
+    elseif ismember('pickmdl', o.commands)
+        error('x13:arima: ARIMA command is not compatible with PICKMDL command!')
+    end
+  case 'automdl'
+    if ismember('arima', o.commands)
+        error('x13:automdl: AUTOMDL command is not compatible with ARIMA command!')
+    elseif ismember('pickmdl', o.commands)
+        error('x13:automdl: AUTOMDL command is not compatible with PICKMDL command!')
+    end
+  case 'pickmdl'
+    if ismember('arima', o.commands)
+        error('x13:pickmdl: PICKMDL command is not compatible with ARIMA command!')
+    elseif ismember('automdl', o.commands)
+        error('x13:pickmdl: PICKMDL command is not compatible with AUTOMDL command!')              
+    end                          
+  otherwise
+end
\ No newline at end of file
diff --git a/src/utilities/x13/checkoptioncompatibility.m b/src/utilities/x13/checkoptioncompatibility.m
new file mode 100644
index 0000000000000000000000000000000000000000..e405ae2ca26818c869db737c1a60dfa406e2ddb5
--- /dev/null
+++ b/src/utilities/x13/checkoptioncompatibility.m
@@ -0,0 +1,38 @@
+function checkoptioncompatibility(o)
+
+% Checks for compatibility of options in different X13 commands.
+
+% Copyright (C) 2017 Dynare Team
+%
+% This code is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare dseries submodule is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+if ~isempty(o.estimate.file)
+    if ~isempty(o.arima.model)
+        error('Options ARIMA.model and ESTIMATE.file not compatible!');
+    elseif ~isempty(o.arima.ar)
+        error('Options ARIMA.ar and ESTIMATE.file not compatible!');
+    elseif ~isempty(o.arima.model)
+        error('Options ARIMA.ma and ESTIMATE.file not compatible!');
+    elseif ~isempty(o.regression.user)
+        error('Options REGRESSION.user and ESTIMATE.file not compatible!');
+    elseif ~isempty(o.regression.b)
+        error('Options REGRESSION.b and ESTIMATE.file not compatible!');
+    elseif ~isempty(o.regression.variables)
+        error('Options REGRESSION.variables and ESTIMATE.file not compatible!');
+    elseif ismember('automdl',o.commands)
+        error('Command AUTOMDL not compatible with ESTIMATE.file option!');
+    elseif ismember('pickmdl',o.commands)
+        error('Command PICKMDL not compatible with ESTIMATE.file option!');
+    end    
+end
\ No newline at end of file
diff --git a/src/utilities/x13/isoption.m b/src/utilities/x13/isoption.m
index 258ce583e506a7fbd44d51b0aef4e88e6faf6942..e63d44ae121bdd20b4113283b10ae1a0bbf7ef53 100644
--- a/src/utilities/x13/isoption.m
+++ b/src/utilities/x13/isoption.m
@@ -45,6 +45,36 @@ switch command
                         'savelog', 'seasonalma', 'sigmalim', 'title', 'trendma', 'type', ...
                         'calendarsigma', 'centerseasonal', 'keepholiday', 'print1stpass', ...
                         'sfshort', 'sigmavec', 'trendic', 'true7term', 'excludefcst'});
+  case 'force'
+    b = ismember(option, {'print', 'save', 'lambda', 'mode', 'rho', 'round', 'start', 'target', 'type', ...
+                         'usefcst', 'indforce'});
+  case 'history'
+    b = ismember(option, {'print', 'save', 'endtable', 'estimates', 'fixmdl', 'fixreg', 'fstep', 'sadjlags', ...
+                         'savelog', 'start', 'target', 'trendlags', 'fixx11reg', 'outlier', 'outlierwin', ...
+                         'refresh', 'transformfcst', 'x11outlier'});
+  case 'metadata'
+    b = ismember(option, {'keys', 'values'});
+  case 'identify'
+    b = ismember(option, {'print', 'save', 'diff', 'maxlag', 'sdiff'});
+  case 'pickmdl'
+    b = ismember(option, {'print', 'bcstlim', 'fcstlim', 'file', 'identify', 'method', 'mode', 'outofsample', ...
+                          'overdiff', 'qlim', 'savelog'});
+  case 'seats'
+    b = ismember(option, {'print', 'save', 'appendfcst', 'finite', 'hpcycle', 'noadmiss', 'out', 'printphtrf', 'qmax', ...
+                         'savelog', 'statseas', 'tabtables', 'bias', 'epsiv', 'epsphi', 'hplan', 'imean', ...
+                         'maxit', 'rmod', 'xl'});
+  case 'slidingspans'
+    b = ismember(option, {'print', 'save', 'cutchng', 'cutseas', 'cuttd', 'fixmdl', 'fixreg', 'length', 'numspans', ...
+                         'outlier', 'savelog', 'start', 'additivesa', 'fixx11reg', 'x11outlier'});
+  case 'spectrum'
+    b = ismember(option, {'print', 'save', 'logqs', 'qcheck', 'savelog', 'start', 'tukey120', 'decibel', 'difference', ...
+                         'maxar', 'peaxwidth', 'series', 'siglevel', 'type'});
+  case 'x11regression'
+    b = ismember(option, {'print', 'save', 'aicdiff', 'aictest', 'critical', 'data', 'file', 'format', 'outliermethod', ...
+                         'outlierspan', 'prior', 'savelog','sigma', 'span', 'start', 'tdprior', 'user', ...
+                         'usertype', 'variables', 'almost', 'b', 'centeruser', 'eastermeans', 'forcecal', ...
+                         'noapply', 'reweight', 'umdata', 'umfile', 'umformat', 'umname', 'umprecision', ...
+                         'umstart', 'umtrimzero'});
   otherwise
     error('x13:isoption: Unknown block!')
 end
diff --git a/src/utilities/x13/setdefaultmember.m b/src/utilities/x13/setdefaultmember.m
index f75ddb05e012b228f6d298322d553e835627f44b..a266a0f698582c5787c4d440a9272a434d1db08d 100644
--- a/src/utilities/x13/setdefaultmember.m
+++ b/src/utilities/x13/setdefaultmember.m
@@ -1,6 +1,6 @@
 function s = setdefaultmember(name)
 
-% Set members of X13 object to default values (empty).
+% Sets members of X13 object to default values (empty).
 
 % Copyright (C) 2017 Dynare Team
 %
@@ -49,6 +49,36 @@ switch name
                'savelog', [], 'seasonalma', [], 'sigmalim', [], 'title', [], 'trendma', [], 'type', [], ...
                'calendarsigma', [], 'centerseasonal', [], 'keepholiday', [], 'print1stpass', [], ...
                'sfshort', [], 'sigmavec', [], 'trendic', [], 'true7term', [], 'excludefcst', []);
+  case 'force'
+    s = struct('print', [], 'save', [], 'lambda', [], 'mode', [], 'rho', [], 'round', [], 'start', [], 'target', [], 'type', [], ...
+               'usefcst', [], 'indforce', []);
+  case 'history'
+    s = struct('print', [], 'save', [], 'endtable', [], 'estimates', [], 'fixmdl', [], 'fixreg', [], 'fstep', [], 'sadjlags', [], ...
+               'savelog', [], 'start', [], 'target', [], 'trendlags', [], 'fixx11reg', [], 'outlier', [], 'outlierwin', [], ...
+               'refresh', [], 'transformfcst', [], 'x11outlier', []);
+  case 'metadata'
+    s = struct('keys', [], 'values', []);
+  case 'identify'
+    s = struct('print', [], 'save', [], 'diff', [], 'maxlag', [], 'sdiff', []);
+  case 'pickmdl'
+    s = struct('print', [], 'bcstlim', [], 'fcstlim', [], 'file', [], 'identify', [], 'method', [], 'mode', [], 'outofsample', [], ...
+               'overdiff', [], 'qlim', [], 'savelog', []);
+  case 'seats'
+    s = struct('print', [], 'save', [], 'appendfcst', [], 'finite', [], 'hpcycle', [], 'noadmiss', [], 'out', [], 'printphtrf', [], 'qmax', [], ...
+               'savelog', [], 'statseas', [], 'tabtables', [], 'bias', [], 'epsiv', [], 'epsphi', [], 'hplan', [], 'imean', [], ...
+               'maxit', [], 'rmod', [], 'xl', []);
+  case 'slidingspans'
+    s = struct('print', [], 'save', [], 'cutchng', [], 'cutseas', [], 'cuttd', [], 'fixmdl', [], 'fixreg', [], 'length', [], 'numspans', [], ...
+               'outlier', [], 'savelog', [], 'start', [], 'additivesa', [], 'fixx11reg', [], 'x11outlier', []);
+  case 'spectrum'
+    s = struct('print', [], 'save', [], 'logqs', [], 'qcheck', [], 'savelog', [], 'start', [], 'tukey120', [], 'decibel', [], 'difference', [], ...
+               'maxar', [], 'peaxwidth', [], 'series', [], 'siglevel', [], 'type', []);
+  case 'x11regression'
+    s = struct('print', [], 'save', [], 'aicdiff', [], 'aictest', [], 'critical', [], 'data', [], 'file', [], 'format', [], 'outliermethod', [], ...
+               'outlierspan', [], 'prior', [], 'savelog', [],'sigma', [], 'span', [], 'start', [], 'tdprior', [], 'user', [], ...
+               'usertype', [], 'variables', [], 'almost', [], 'b', [], 'centeruser', [], 'eastermeans', [], 'forcecal', [], ...
+               'noapply', [], 'reweight', [], 'umdata', [], 'umfile', [], 'umformat', [], 'umname', [], 'umprecision', [], ...
+               'umstart', [], 'umtrimzero', []);
   otherwise
     error('x13:setdefaultmember: Unknown member!')
 end