diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3ad8982d406914fb57570a6f76de0ba86f487d63
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,11 @@
+language: python
+
+install:
+  - export
+  - sudo add-apt-repository ppa:octave/stable -y
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq octave liboctave-dev
+
+script:
+  - make check-octave
+  - ./success.sh
diff --git a/README.md b/README.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f408f4f4660e85fc72da1a5ddc412721e1c8148d 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+![](https://travis-ci.org/DynareTeam/dseries.svg?branch=master)
diff --git a/src/@x13/print.m b/src/@x13/print.m
new file mode 100644
index 0000000000000000000000000000000000000000..bcb202668d82ca8d6ae1166ce2f3731c5f3e2022
--- /dev/null
+++ b/src/@x13/print.m
@@ -0,0 +1,170 @@
+function basename = print(o, basename)
+
+% Prints spc file.
+
+% Copyright (C) 2017 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare 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,
+% 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 nargin<2 || isempty(basename)
+    basename = randomstring(10);
+end
+
+fid = fopen(sprintf('%s.spc', basename), 'w');
+fprintf(fid, '# File created on %s by Dynare.\n\n', datetime());
+
+% Write SERIES block
+fprintf(fid, 'series {\n');
+fprintf(fid, ' title = "%s"\n', o.y.name{1});
+printstart(fid, o.y.init);
+fprintf(fid, ' period = %i\n', o.y.init.freq);
+fprintf(fid, ' data = %s', sprintf(data2txt(o.y.data)));
+fprintf(fid, '}\n\n');
+
+% Write TRANSFORM block
+if ~all(cellfun(@isempty, struct2cell(o.transform)))
+    optionnames = fieldnames(o.transform);
+    fprintf(fid, 'transform {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.transform.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.transform.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write REGRESSION block
+if ~all(cellfun(@isempty, struct2cell(o.regression)))
+    optionnames = fieldnames(o.regression);
+    fprintf(fid, 'regression {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.regression.(optionnames{i}))
+            if isequal(optionnames{i}, 'user') % Write needed data to a file.
+                % Determine the set of needed data
+                conditionningvariables = strsplit(o.regression.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:regression: 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.regression.user);
+                % Print data statement.
+                fprintf(fid, ' data = %s\n', sprintf(data2txt(x.data)));
+            elseif isequal(optionnames{i}, 'start')
+                if ischar(o.regression.start)
+                    if isdate(o.regression.start)
+                        PERIOD = dates(o.regression.start)
+                    else
+                        error('x13:regression: Option start cannot be interpreted as a date!')
+                    end
+                elseif isdates(o.regression.start)
+                    PERIOD = o.regression.start;
+                else
+                    error('x13:regression: Option start cannot be interpreted as a date!')
+                end
+                printstart(fid, PERIOD);
+            else
+                printoption(fid, optionnames{i}, o.regression.(optionnames{i}));
+            end
+        end
+    end
+    if isempty(o.regression.start)
+        fprintf(fid, ' start = %i.%i\n', o.x.init.year, o.x.init.subperiod);
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write ARIMA block
+if ~all(cellfun(@isempty, struct2cell(o.arima)))
+    optionnames = fieldnames(o.arima);
+    fprintf(fid, 'arima {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.arima.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.arima.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write OUTLIER block
+if ~all(cellfun(@isempty, struct2cell(o.outlier)))
+    optionnames = fieldnames(o.outlier);
+    fprintf(fid, 'outlier {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.outlier.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.outlier.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write FORECAST block
+if ~all(cellfun(@isempty, struct2cell(o.forecast)))
+    optionnames = fieldnames(o.forecast);
+    fprintf(fid, 'forecast {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.forecast.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.forecast.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write ESTIMATE block
+if ~all(cellfun(@isempty, struct2cell(o.estimate)))
+    optionnames = fieldnames(o.estimate);
+    fprintf(fid, 'estimate {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.estimate.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.estimate.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write CHECK block
+if ~all(cellfun(@isempty, struct2cell(o.check)))
+    optionnames = fieldnames(o.check);
+    fprintf(fid, 'check {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.check.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.check.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
+
+% Write X11 block
+if ~all(cellfun(@isempty, struct2cell(o.x11)))
+    optionnames = fieldnames(o.x11);
+    fprintf(fid, 'x11 {\n');
+    for i=1:length(optionnames)
+        if ~isempty(o.x11.(optionnames{i}))
+            printoption(fid, optionnames{i}, o.x11.(optionnames{i}));
+        end
+    end
+    fprintf(fid, '}\n\n');
+end
\ No newline at end of file
diff --git a/src/@x13/run.m b/src/@x13/run.m
new file mode 100644
index 0000000000000000000000000000000000000000..d4c3ebfa50aaaa90448b9d59342a7b52debf9e79
--- /dev/null
+++ b/src/@x13/run.m
@@ -0,0 +1,81 @@
+function run(o, basename)
+
+% Runs x13 program and saves results.
+
+% Copyright (C) 2017 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare 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,
+% 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/>.
+
+% Print spc file.
+basename = o.print();
+
+% Run spc file.
+system(sprintf('%s %s', select_x13_binary(), basename));
+
+o.results.name = basename; % Base name of the generated files.
+
+% Save results related to the REGRESSION command
+if ~all(cellfun(@isempty, struct2cell(o.regression)))
+    if ~isempty(o.regression.save)
+        savedoutput = strsplit(o.regression.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 X11 command
+if ~all(cellfun(@isempty, struct2cell(o.x11)))
+    if ~isempty(o.x11.save)
+        savedoutput = strsplit(o.x11.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 FORECAST command
+if ~all(cellfun(@isempty, struct2cell(o.forecast)))
+    if ~isempty(o.forecast.save)
+        savedoutput = strsplit(o.forecast.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})));
+                name = strsplit(tmp.textdata{1},'\t');
+                name = name(2:end);
+                data = tmp.data(:,2:end);
+                o.results.(savedoutput{i}) = dseries(data, lastobservedperiod(o.y)+1, name);
+            end
+        end
+    end
+end
+
+% Save main generated output file.
+o.results.out = fileread(sprintf('%s.out', basename))
+
+% Delete all generated files.
+delete([basename '.*']);
\ No newline at end of file
diff --git a/src/@x13/subsasgn.m b/src/@x13/subsasgn.m
new file mode 100644
index 0000000000000000000000000000000000000000..1ce18c2380dce19049eb9df54ca95f34d5df7cae
--- /dev/null
+++ b/src/@x13/subsasgn.m
@@ -0,0 +1,18 @@
+function val = subsasgn(val, idx, rhs) % --*-- Unitary tests --*--
+
+% 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 dates 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/>.
+
+error('Members of x13 class are private')
diff --git a/src/@x13/subsref.m b/src/@x13/subsref.m
new file mode 100644
index 0000000000000000000000000000000000000000..dc52d3c67546231ea853b41eb5b58a3537d2bf0a
--- /dev/null
+++ b/src/@x13/subsref.m
@@ -0,0 +1,77 @@
+function o = subsref(o, S) % --*-- Unitary tests --*--
+
+% 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
+% 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,
+% 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 S(1).type
+  case '.'
+    switch S(1).subs
+      case {'arima','regression','transform','outlier', 'forecast', 'check', 'x11', 'estimate'}
+        if isequal(length(S), 1)
+            % Just print the member.
+            disp(o.(S(1).subs))
+        else
+            if isequal(S(2).type,'()')
+                if isempty(S(2).subs)
+                    % Reset the member to its default (empty).
+                    o.(S(1).subs) = setdefaultmember(S(1).subs);
+                else
+                    % Set options.
+                    if mod(length(S(2).subs), 2)
+                        error('x13:%s: Wrong calling sequence, number of input arguments has to be even!', S(1).subs)
+                    end
+                    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});
+                        else
+                            disp(sprintf('Option %s is not available in block %s!', S(2).subs{i}, S(1).subs))
+                        end
+                    end
+                end
+            else
+                error('x13:%s: Wrong calling sequence!', S(1).subs)
+            end
+        end
+      case {'print', 'run'}
+        if isequal(length(S), 1)
+            feval(S(1).subs, o);
+            %print(o);
+        elseif isequal(length(S), 2)
+            if isequal(S(2).type,'()')
+                if isempty(S(2).subs)
+                    feval(S(1).subs, o);
+                    %print(o);
+                else
+                    feval(S(1).subs, o, S(2).subs{:});
+                    %print(o, S(2).subs{1});
+                end
+            else
+                error('x13:: Wrong calling sequence!')
+            end
+        else
+            error('x13:: I expect no more than two input arguments!')
+        end
+      case 'results'
+        o = o.results;
+      otherwise
+        error('x13:: I do not understand what you are asking for!')
+    end
+  otherwise
+    error('x13:: I do not understand what you are asking for!')
+end
\ No newline at end of file
diff --git a/src/@x13/x13.m b/src/@x13/x13.m
new file mode 100644
index 0000000000000000000000000000000000000000..06deeee42bad0dd4a6bddcba65a0200e3fe88c85
--- /dev/null
+++ b/src/@x13/x13.m
@@ -0,0 +1,85 @@
+classdef x13<handle % --*-- Unitary tests --*--
+
+% Class for X13 toolbox.
+
+% 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 dates 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/>.
+
+    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.
+        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
+    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.
+            if ~nargin
+                o.y = dseries();
+                o.x = dseries();
+                o.arima = setdefaultmember('arima');
+                o.regression = setdefaultmember('regression');
+                o.estimate = setdefaultmember('estimate');
+                o.transform = setdefaultmember('transform');
+                o.outlier = setdefaultmember('outlier');
+                o.forecast = setdefaultmember('forecast');
+                o.check = setdefaultmember('check');
+                o.x11 = setdefaultmember('x11');
+                o.results = struct();
+                return
+            end
+            if isdseries(y)
+                if isequal(y.vobs, 1)
+                    o.y = y;
+                else
+                    error('x13:: Wrong input argument (a dseries object with a single variable is expected)!')
+                end
+            else
+                error('x13:: Wrong input argument (a dseries object is expected)!')
+            end
+            if nargin>1
+                if isdseries(x)
+                    o.x = x;
+                else
+                    error('x13:: Wrong input argument (a dseries object is expected)!')
+                end
+            end
+            % Initialize other members (they are empty initially and must be set by calling methods)
+            o.arima = setdefaultmember('arima');
+            o.regression = setdefaultmember('regression');
+            o.estimate = setdefaultmember('estimate');
+            o.transform = setdefaultmember('transform');
+            o.outlier = setdefaultmember('outlier');
+            o.forecast = setdefaultmember('forecast');
+            o.check = setdefaultmember('check');
+            o.x11 = setdefaultmember('x11');
+            o.results = struct();
+        end
+    end
+end
\ No newline at end of file
diff --git a/src/utilities/x13/isoption.m b/src/utilities/x13/isoption.m
new file mode 100644
index 0000000000000000000000000000000000000000..6d36cad5557d4ce549a5493917e5a9b179d2e19b
--- /dev/null
+++ b/src/utilities/x13/isoption.m
@@ -0,0 +1,46 @@
+function b = isoption(command, option)
+
+% 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 dates 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 command
+  case 'arima'
+    b = ismember(option, {'ar', 'ma', 'model', 'print', 'save', 'title'});
+  case 'regression'
+    b = ismember(option, {'aicdiff', 'aictest', 'chi2test', 'chi2testcv', ...
+               'print', 'save', 'pvaictest', 'savelog', 'start', ...
+               'tlimit', 'user', 'usertype', 'variables', 'b', ...
+               'centeruser', 'eastermeans', 'noapply', 'tcrate'});
+  case 'transform'
+    b = ismember(option, {'adjust', 'aicdiff', 'function', 'mode', 'name', ...
+               'power', 'precision', 'print', 'save', 'savelog', ...
+               'start', 'title', 'type'});
+  case 'estimate'
+    b = ismember(option, {'exact', 'maxiter', 'outofsample', 'print', 'save', 'savelog', 'tol', 'file', 'fix'});
+  case 'outlier'
+    b = ismember(option, {'critical', 'lsrun', 'method', 'print', 'save', ...
+              'savelog', 'span', 'types', 'almost', 'tcrate'});
+  case 'forecast'
+    b = ismember(option, {'exclude', 'lognormal', 'maxback', 'maxlead', 'print', 'save', 'probability'});
+  case 'check'
+    b = ismember(option, {'maxlag', 'print', 'save', 'qtype', 'savelog'});
+  case 'x11'
+    b = ismember(option, {'appendbcst', 'appendfcst', 'final', 'mode', 'print', 'save', ...
+               'savelog', 'seasonalma', 'sigmalim', 'title', 'trendma', 'type', ...
+               'calendarsigma', 'centerseasonal', 'keepholiday', 'print1stpass', ...
+               'sfshort', 'sigmavec', 'trendic', 'true7term'});
+  otherwise
+    error('x13:isoption: Unknown block!')
+end
diff --git a/src/utilities/x13/printoption.m b/src/utilities/x13/printoption.m
new file mode 100644
index 0000000000000000000000000000000000000000..647b56c299ec327b6fd894c0a7126adaddecdf46
--- /dev/null
+++ b/src/utilities/x13/printoption.m
@@ -0,0 +1,44 @@
+function printoption(fid, optname, optvalue)
+
+% 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 dates 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 ischar(optvalue)
+    fprintf(fid, ' %s = %s\n', optname, optvalue);
+elseif isreal(optvalue)
+    if isequal(numel(optvalue), 1)
+        if isint(optvalue)
+            fprintf(fid, ' %s = %i\n', optname, optvalue);
+        else
+            fprintf(fid, ' %s = %f\n', optname, optvalue);
+        end
+    else
+        if isvector(optvalue)
+            str = '(';
+            for i=1:length(optvalue)
+                if isint(optvalue(i))
+                    str = sprintf('%s %i', str, optvalue(i));
+                elseif isreal(optvalue(i))
+                    str = sprintf('%s %f', str, optvalue(i));
+                else
+                    error('This option value type is not implemented!');
+                end
+                str = sprintf('%s%s', str, ')');
+            end
+        else
+            error('This option value type is not implemented!');
+        end
+    end
+end
\ No newline at end of file
diff --git a/src/utilities/x13/printstart.m b/src/utilities/x13/printstart.m
new file mode 100644
index 0000000000000000000000000000000000000000..c13db9e4d422e2c1cc3501ed495a16dd9f86f774
--- /dev/null
+++ b/src/utilities/x13/printstart.m
@@ -0,0 +1,32 @@
+function printstart(fid, period)
+
+% 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 dates 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 ~ismember(period.freq, [1 4 12])
+    error('x13:printstart: Only monthly, quaterly or annual data are allowed (option start)!')
+end
+
+switch period.freq
+  case 12
+    ListOfMonths = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'};
+    fprintf(fid, ' start = %i.%s\n', period.year, ListOfMonths{period.subperiod});
+  case 4
+    fprintf(fid, ' start = %i.%i\n', period.year, period.subperiod);
+  case 1
+    fprintf(fid, ' start = %i\n', period.year);
+  otherwise
+    error('x13:regression: This is a bug! Please contact the authors.')
+end
\ No newline at end of file
diff --git a/src/utilities/x13/setdefaultmember.m b/src/utilities/x13/setdefaultmember.m
new file mode 100644
index 0000000000000000000000000000000000000000..d433c8673672cbc5b5f2899c576d68955b47a2dd
--- /dev/null
+++ b/src/utilities/x13/setdefaultmember.m
@@ -0,0 +1,50 @@
+function s = setdefaultmember(name)
+
+% Set members of X13 object to default values (empty).
+
+% 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 dates 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 name
+  case 'arima'
+    s = struct('ar', [], 'ma', [], 'model', [], 'print', [], 'save', [], 'title', []);
+  case 'regression'
+    s = struct('aicdiff', [], 'aictest', [], 'chi2test', [], 'chi2testcv', [], ...
+               'print', [], 'save', [], 'pvaictest', [], 'savelog', [], 'start', [], ...
+               'tlimit', [], 'user', [], 'usertype', [], 'variables', [], 'b', [], ...
+               'centeruser', [], 'eastermeans', [], 'noapply', [], 'tcrate', []);
+  case 'estimate'
+    s = struct('exact', [], 'maxiter', [], 'outofsample', [], 'print', [], 'save', [], 'savelog', ...
+               [], 'tol', [], 'file', [], 'fix', []);
+  case 'transform'
+    s = struct('adjust', [], 'aicdiff', [], 'function', [], 'mode', [], 'name', [], ...
+               'power', [], 'precision', [], 'print', [], 'save', [], 'savelog', [], ...
+               'start', [], 'title', [], 'type', []);
+  case 'outlier'
+    s= struct('critical', [], 'lsrun', [], 'method', [], 'print', [], 'save', [], ...
+              'savelog', [], 'span', [], 'types', [], 'almost', [], 'tcrate', []);
+  case 'forecast'
+    s = struct('exclude', [], 'lognormal', [], 'maxback', [], 'maxlead', [], 'print', [], ...
+               'save', [], 'probability', []);
+  case 'check'
+    s = struct('maxlag', [], 'print', [], 'save', [], 'qtype', [], 'savelog', []);
+  case 'x11'
+    s = struct('appendbcst', [], 'appendfcst', [], 'final', [], 'mode', [], 'print', [], 'save', [], ...
+               'savelog', [], 'seasonalma', [], 'sigmalim', [], 'title', [], 'trendma', [], 'type', [], ...
+               'calendarsigma', [], 'centerseasonal', [], 'keepholiday', [], 'print1stpass', [], ...
+               'sfshort', [], 'sigmavec', [], 'trendic', [], 'true7term', []);
+  otherwise
+    error('x13:setdefaultmember: Unknown member!')
+end
diff --git a/src/utilities/x13/setoption.m b/src/utilities/x13/setoption.m
new file mode 100644
index 0000000000000000000000000000000000000000..32bd99dbe2dbb77e23d41751fa75f7f165bbf573
--- /dev/null
+++ b/src/utilities/x13/setoption.m
@@ -0,0 +1,23 @@
+function command = setoption(command, optname, optvalue)
+
+% 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 dates 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 isfield(command, optname)
+    command.(optname) = optvalue;
+else
+    disp(sprintf('Option %s is unknown!', optname))
+end
+