diff --git a/dynare++/kord/decision_rule.cweb b/dynare++/kord/decision_rule.cweb
index a4a4f59e1f3662a4dd6188543095dfe9587a6088..99536d3de155ea0a27044775c5bb0eecae3cd61f 100644
--- a/dynare++/kord/decision_rule.cweb
+++ b/dynare++/kord/decision_rule.cweb
@@ -112,7 +112,7 @@ void SimResults::simulate(int num_sim, const DecisionRule& dr, const Vector& sta
 {
 	JournalRecordPair paa(journal);
 	paa << "Performing " << num_sim << " stochastic simulations for "
-		<< num_per << " periods" << endrec;
+		<< num_per << " periods burning " << num_burn << " initial periods"  << endrec;
 	simulate(num_sim, dr, start, vcov);
 	int thrown = num_sim - data.size();
 	if (thrown > 0) {
@@ -138,31 +138,34 @@ void SimResults::simulate(int num_sim, const DecisionRule& dr, const Vector& sta
 		rsrs.push_back(sr);
 		THREAD* worker = new
 			SimulationWorker(*this, dr, DecisionRule::horner,
-							 num_per, start, rsrs.back());
+							 num_per+num_burn, start, rsrs.back());
 		gr.insert(worker);
 	}
 	gr.run();
 }
 
-@ This adds the data with the realized shocks. If the data is not
-finite, the both data and shocks are thrown away.
+@ This adds the data with the realized shocks. It takes only periods
+which are not to be burnt. If the data is not finite, the both data
+and shocks are thrown away.
 
 @<|SimResults::addDataSet| code@>=
 bool SimResults::addDataSet(TwoDMatrix* d, ExplicitShockRealization* sr)
 {
 	KORD_RAISE_IF(d->nrows() != num_y,
 				  "Incompatible number of rows for SimResults::addDataSets");
-	KORD_RAISE_IF(d->ncols() != num_per,
+	KORD_RAISE_IF(d->ncols() != num_per+num_burn,
 				  "Incompatible number of cols for SimResults::addDataSets");
+	bool ret = false;
 	if (d->isFinite()) {
-		data.push_back(d);
-		shocks.push_back(sr);
-		return true;
-	} else {
-		delete d;
-		delete sr;
-		return false;
+		data.push_back(new TwoDMatrix((const TwoDMatrix&)(*d),num_burn,num_per));
+		shocks.push_back(new ExplicitShockRealization(
+								ConstTwoDMatrix(sr->getShocks(),num_burn,num_per)));
+		ret = true;
 	}
+
+	delete d;
+	delete sr;
+	return ret;
 }
 
 @ 
@@ -341,13 +344,12 @@ void SimResultsDynamicStats::calcVariance()
 
 @ 
 @<|SimResultsIRF::simulate| code1@>=
-void SimResultsIRF::simulate(const DecisionRule& dr, const Vector& start,
-							 Journal& journal)
+void SimResultsIRF::simulate(const DecisionRule& dr, Journal& journal)
 {
 	JournalRecordPair paa(journal);
 	paa << "Performing " << control.getNumSets() << " IRF simulations for "
 		<< num_per << " periods; shock=" << ishock << ", impulse=" << imp << endrec;
-	simulate(dr, start);
+	simulate(dr);
 	int thrown = control.getNumSets() - data.size();
 	if (thrown > 0) {
 		JournalRecord rec(journal);
@@ -360,13 +362,13 @@ void SimResultsIRF::simulate(const DecisionRule& dr, const Vector& start,
 
 @ 
 @<|SimResultsIRF::simulate| code2@>=
-void SimResultsIRF::simulate(const DecisionRule& dr, const Vector& start)
+void SimResultsIRF::simulate(const DecisionRule& dr)
 {
 	THREAD_GROUP gr;
 	for (int idata = 0; idata < control.getNumSets(); idata++) {
 		THREAD* worker = new
 			SimulationIRFWorker(*this, dr, DecisionRule::horner,
-								num_per, start, idata, ishock, imp);
+								num_per, idata, ishock, imp);
 		gr.insert(worker);
 	}
 	gr.run();
@@ -489,8 +491,8 @@ IRFResults::IRFResults(const DynamicModel& mod, const DecisionRule& dr,
 	}
 
 	for (unsigned int ii = 0; ii < irf_list_ind.size(); ii++) {
-		irf_res[2*ii]->simulate(dr, model.getSteady(), journal);
-		irf_res[2*ii+1]->simulate(dr, model.getSteady(), journal);
+		irf_res[2*ii]->simulate(dr, journal);
+		irf_res[2*ii+1]->simulate(dr, journal);
 	}
 }
 
@@ -538,6 +540,8 @@ void SimulationIRFWorker::operator()()
 	ExplicitShockRealization* esr =
 	    new ExplicitShockRealization(res.control.getShocks(idata));
 	esr->addToShock(ishock, 0, imp);
+	const TwoDMatrix& data = res.control.getData(idata);
+	ConstVector st(data, res.control.getNumBurn());
 	TwoDMatrix* m = dr.simulate(em, np, st, *esr);
 	m->add(-1.0, res.control.getData(idata));
 	{
@@ -585,16 +589,18 @@ void RTSimulationWorker::operator()()
 	dy.add(-1.0, ysteady_pred);
 	sr.get(ip, u);
 	dr.eval(em, y, dyu);
-	nc.update(y);
+    if (ip >= res.num_burn)
+		nc.update(y);
 
 @
 @<simulate other real-time periods@>=
-while (y.isFinite() && ip < res.num_per) {
+while (y.isFinite() && ip < res.num_burn + res.num_per) {
 	ip++;
 	dy = ypred;
 	sr.get(ip, u);
 	dr.eval(em, y, dyu);
-	nc.update(y);
+    if (ip >= res.num_burn)
+	    nc.update(y);
 }
 
 @ This calculates factorization $FF^T=V$ in the Cholesky way. It does
diff --git a/dynare++/kord/decision_rule.hweb b/dynare++/kord/decision_rule.hweb
index caf7315faab80877bd9ac969f39a1c4fdf9a2ae7..f79b6f803e8c949a460e035e57f7e826dde48f7a 100644
--- a/dynare++/kord/decision_rule.hweb
+++ b/dynare++/kord/decision_rule.hweb
@@ -696,11 +696,12 @@ class SimResults {
 protected:@;
 	int num_y;
 	int num_per;
+	int num_burn;
 	vector<TwoDMatrix*> data;
 	vector<ExplicitShockRealization*> shocks;
 public:@;
-	SimResults(int ny, int nper)
-		: num_y(ny), num_per(nper)@+ {}
+	SimResults(int ny, int nper, int nburn = 0)
+		: num_y(ny), num_per(nper), num_burn(nburn)@+ {}
 	virtual ~SimResults();
 	void simulate(int num_sim, const DecisionRule& dr, const Vector& start,
 				  const TwoDMatrix& vcov, Journal& journal);
@@ -708,6 +709,8 @@ public:@;
 				  const TwoDMatrix& vcov);
 	int getNumPer() const
 		{@+ return num_per;@+}
+	int getNumBurn() const
+		{@+ return num_burn;@+}
 	int getNumSets() const
 		{@+ return (int)data.size();@+}
 	const TwoDMatrix& getData(int i) const
@@ -728,8 +731,8 @@ protected:@;
 	Vector mean;
 	TwoDMatrix vcov;
 public:@;
-	SimResultsStats(int ny, int nper)
-		: SimResults(ny, nper), mean(ny), vcov(ny,ny)@+ {}
+	SimResultsStats(int ny, int nper, int nburn = 0)
+		: SimResults(ny, nper, nburn), mean(ny), vcov(ny,ny)@+ {}
 	void simulate(int num_sim, const DecisionRule& dr, const Vector& start,
 				  const TwoDMatrix& vcov, Journal& journal);
 	void writeMat4(FILE* fd, const char* lname) const;
@@ -748,8 +751,8 @@ protected:@;
 	TwoDMatrix mean;
 	TwoDMatrix variance;
 public:@;
-	SimResultsDynamicStats(int ny, int nper)
-		: SimResults(ny, nper), mean(ny,nper), variance(ny,nper)@+ {}
+	SimResultsDynamicStats(int ny, int nper, int nburn = 0)
+		: SimResults(ny, nper, nburn), mean(ny,nper), variance(ny,nper)@+ {}
 	void simulate(int num_sim, const DecisionRule& dr, const Vector& start,
 				  const TwoDMatrix& vcov, Journal& journal);
 	void writeMat4(FILE* fd, const char* lname) const; 
@@ -778,12 +781,11 @@ protected:@;
 	TwoDMatrix variances;
 public:@;
 	SimResultsIRF(const SimResults& cntl, int ny, int nper, int i, double impulse)
-		: SimResults(ny, nper), control(cntl),
+		: SimResults(ny, nper, 0), control(cntl),
 		  ishock(i), imp(impulse),
 		  means(ny, nper), variances(ny, nper)@+ {}
-	void simulate(const DecisionRule& dr, const Vector& start,
-				 Journal& journal);
-	void simulate(const DecisionRule& dr, const Vector& start);
+	void simulate(const DecisionRule& dr, Journal& journal);
+	void simulate(const DecisionRule& dr);
 	void writeMat4(FILE* fd, const char* lname) const;
 protected:@;
 	void calcMeans();
@@ -804,13 +806,14 @@ protected:@;
 	Vector mean;
 	TwoDMatrix vcov;
 	int num_per;
+	int num_burn;
 	NormalConj nc;
 	int incomplete_simulations;
 	int thrown_periods;
 public:@;
-	RTSimResultsStats(int ny, int nper)
+	RTSimResultsStats(int ny, int nper, int nburn = 0)
 		: mean(ny), vcov(ny, ny),
-		  num_per(nper), nc(ny),
+		  num_per(nper), num_burn(nburn), nc(ny),
 		  incomplete_simulations(0), thrown_periods(0)@+ {}
 	void simulate(int num_sim, const DecisionRule& dr, const Vector& start,
 				  const TwoDMatrix& vcov, Journal& journal);
@@ -879,7 +882,6 @@ class SimulationIRFWorker : public THREAD {
 	const DecisionRule& dr;
 	DecisionRule::emethod em;
 	int np;
-	const Vector& st;
 	int idata;
 	int ishock;
 	double imp;	
@@ -887,9 +889,8 @@ public:@;
 	SimulationIRFWorker(SimResultsIRF& sim_res,
 						const DecisionRule& dec_rule,
 						DecisionRule::emethod emet, int num_per,
-						const Vector& start, int id,
-						int ishck, double impulse)
-		: res(sim_res), dr(dec_rule), em(emet), np(num_per), st(start),
+						int id, int ishck, double impulse)
+		: res(sim_res), dr(dec_rule), em(emet), np(num_per),
 		  idata(id), ishock(ishck), imp(impulse)@+ {}
 	void operator()();
 };
@@ -951,12 +952,16 @@ class ExplicitShockRealization : virtual public ShockRealization {
 public:@;
 	ExplicitShockRealization(const TwoDMatrix& sh)
 		: shocks(sh)@+ {}
+	ExplicitShockRealization(const ConstTwoDMatrix& sh)
+		: shocks(sh)@+ {}
 	ExplicitShockRealization(const ExplicitShockRealization& sr)
 		: shocks(sr.shocks)@+ {}
 	ExplicitShockRealization(ShockRealization& sr, int num_per);
 	void get(int n, Vector& out);
 	int numShocks() const
 		{@+ return shocks.nrows();@+}
+	const TwoDMatrix& getShocks()
+		{@+ return shocks;@+}
 	void addToShock(int ishock, int iper, double val);
 	void print() const
 		{@+ shocks.print();@+}
diff --git a/dynare++/src/dynare_params.cpp b/dynare++/src/dynare_params.cpp
index 3acd42c79b7a4652954ff7b73ac39f800023f791..95a76a674c8c3b4c7e27b0f8dbfe38552fdc0c23 100644
--- a/dynare++/src/dynare_params.cpp
+++ b/dynare++/src/dynare_params.cpp
@@ -13,9 +13,10 @@ const char* help_str =
 "    --version            print version and return\n"
 "\n"
 "options:\n"
-"    --per <num>          number of periods simulated [100]\n"
+"    --per <num>          number of periods simulated after burnt [100]\n"
+"    --burn <num>         number of periods burnt [0]\n"
 "    --sim <num>          number of simulations [80]\n"
-"    --rtper <num>        number of RT periods simulated [0]\n"
+"    --rtper <num>        number of RT periods simulated after burnt [0]\n"
 "    --rtsim <num>        number of RT simulations [0]\n"
 "    --condper <num>      number of periods in cond. simulations [0]\n"
 "    --condsim <num>      number of conditional simulations [0]\n"
@@ -45,7 +46,7 @@ const char* help_str =
 const char* dyn_basename(const char* str);
 
 DynareParams::DynareParams(int argc, char** argv)
-	: modname(NULL), num_per(100), num_sim(80), 
+	: modname(NULL), num_per(100), num_burn(0), num_sim(80), 
 	  num_rtper(0), num_rtsim(0),
 	  num_condper(0), num_condsim(0),
 	  num_threads(2), num_steps(0),
@@ -70,6 +71,7 @@ DynareParams::DynareParams(int argc, char** argv)
 	struct option const opts [] = {
 		{"periods", required_argument, NULL, opt_per},
 		{"per", required_argument, NULL, opt_per},
+		{"burn", required_argument, NULL, opt_burn},
 		{"simulations", required_argument, NULL, opt_sim},
 		{"sim", required_argument, NULL, opt_sim},
 		{"rtperiods", required_argument, NULL, opt_rtper},
@@ -108,6 +110,10 @@ DynareParams::DynareParams(int argc, char** argv)
 			if (1 != sscanf(optarg, "%d", &num_per))
 				fprintf(stderr, "Couldn't parse integer %s, ignored\n", optarg);
 			break;
+		case opt_burn:
+			if (1 != sscanf(optarg, "%d", &num_burn))
+				fprintf(stderr, "Couldn't parse integer %s, ignored\n", optarg);
+			break;
 		case opt_sim:
 			if (1 != sscanf(optarg, "%d", &num_sim))
 				fprintf(stderr, "Couldn't parse integer %s, ignored\n", optarg);
diff --git a/dynare++/src/dynare_params.h b/dynare++/src/dynare_params.h
index 3c6a65adc833d47327cd4b5250ff7f2e2623b9cb..594c35ea278a514c0444aea2e08c62a2cd083198 100644
--- a/dynare++/src/dynare_params.h
+++ b/dynare++/src/dynare_params.h
@@ -17,6 +17,7 @@ struct DynareParams {
 	const char* modname;
 	std::string basename;
 	int num_per;
+	int num_burn;
 	int num_sim;
 	int num_rtper;
 	int num_rtsim;
@@ -56,7 +57,8 @@ struct DynareParams {
 	int getCheckPathPoints() const
 		{return 10*check_num;}
 private:
-	enum {opt_per, opt_sim, opt_rtper, opt_rtsim, opt_condper, opt_condsim, opt_prefix, opt_threads,
+	enum {opt_per, opt_burn, opt_sim, opt_rtper, opt_rtsim, opt_condper, opt_condsim,
+		  opt_prefix, opt_threads,
 		  opt_steps, opt_seed, opt_order, opt_ss_tol, opt_check,
 		  opt_check_along_path, opt_check_along_shocks, opt_check_on_ellipse,
 		  opt_check_evals, opt_check_scale, opt_check_num, opt_noirfs, opt_irfs,
diff --git a/dynare++/src/main.cpp b/dynare++/src/main.cpp
index fa4eb01dd10e11386b41282a59a1f79077ffc8f1..5ac5d15d1897794a5b2200f2e33e9dc7718fee05 100644
--- a/dynare++/src/main.cpp
+++ b/dynare++/src/main.cpp
@@ -130,7 +130,7 @@ int main(int argc, char** argv)
 
 		// simulate conditional
 		if (params.num_condper > 0 && params.num_condsim > 0) {
-			SimResultsDynamicStats rescond(dynare.numeq(), params.num_condper);
+			SimResultsDynamicStats rescond(dynare.numeq(), params.num_condper, 0);
 			ConstVector det_ss(app.getSS(),0);
 			rescond.simulate(params.num_condsim, app.getFoldDecisionRule(), det_ss, dynare.getVcov(), journal);
 			rescond.writeMat4(matfd, params.prefix);
@@ -140,7 +140,7 @@ int main(int argc, char** argv)
 		//const DecisionRule& dr = app.getUnfoldDecisionRule();
 		const DecisionRule& dr = app.getFoldDecisionRule();
 		if (params.num_per > 0 && params.num_sim > 0) {
-			SimResultsStats res(dynare.numeq(), params.num_per);
+			SimResultsStats res(dynare.numeq(), params.num_per, params.num_burn);
 			res.simulate(params.num_sim, dr, dynare.getSteady(), dynare.getVcov(), journal);
 			res.writeMat4(matfd, params.prefix);
 			
@@ -153,7 +153,7 @@ int main(int argc, char** argv)
 
 		// simulate with real-time statistics
 		if (params.num_rtper > 0 && params.num_rtsim > 0) {
-			RTSimResultsStats rtres(dynare.numeq(), params.num_rtper);
+			RTSimResultsStats rtres(dynare.numeq(), params.num_rtper, params.num_burn);
 			rtres.simulate(params.num_rtsim, dr, dynare.getSteady(), dynare.getVcov(), journal);
 			rtres.writeMat4(matfd, params.prefix);
 		}