diff --git a/libwccl/ops/match/applyoperator.cpp b/libwccl/ops/match/applyoperator.cpp
index e40ddd8d8764363f7ed13ea270f84efc3048bd4e..50742593cbf4840e7990f4282c6c3adfb2814f74 100644
--- a/libwccl/ops/match/applyoperator.cpp
+++ b/libwccl/ops/match/applyoperator.cpp
@@ -8,8 +8,8 @@ ApplyOperator::ApplyOperator(
 	const VariableAccessor<Position>& cur_iter_pos,
 	const VariableAccessor<Match>& matches,
 	const boost::shared_ptr<const MatchOperator>& match_op,
-	const std::vector<boost::shared_ptr<const MatchAction> >& actions,
-	const std::vector<boost::shared_ptr<const Function<Bool> > >& conditions)
+	const boost::shared_ptr<const std::vector<boost::shared_ptr<MatchAction> > >& actions,
+	const boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > >& conditions)
 		: _cur_iter_pos(cur_iter_pos),
 		  _matches(matches),
 		  _match_op(match_op),
@@ -17,7 +17,7 @@ ApplyOperator::ApplyOperator(
 		  _conditions(conditions)
 {
 	BOOST_ASSERT(_match_op);
-	BOOST_ASSERT(actions.size() > 0);
+	BOOST_ASSERT(actions->size() > 0);
 }
 
 void ApplyOperator::execute(const ActionExecContext &context) const
@@ -32,12 +32,12 @@ void ApplyOperator::execute(const ActionExecContext &context) const
 		boost::shared_ptr<Match> match = _match_op->apply(iter_pos, context);
 		// Execute the actions only if match isn't empty and all post-conditions are met:
 		bool should_act = !match->empty();
-		for(size_t i = 0; should_act && i < _conditions.size(); ++i) {
-			should_act = _conditions[i]->apply(context)->get_value();
+		for(size_t i = 0; should_act && i < _conditions->size(); ++i) {
+			should_act = (*_conditions)[i]->apply(context)->get_value();
 		}
 		if (should_act) {
 			matches->append(match); // the match goes to $m:_M[0]
-			foreach (const boost::shared_ptr<const MatchAction>& action, _actions) {
+			foreach (const boost::shared_ptr<MatchAction>& action, *_actions) {
 				action->execute(context);
 			}
 		}
@@ -55,22 +55,22 @@ std::string ApplyOperator::to_string(const Corpus2::Tagset& tagset) const
 {
 	std::ostringstream ostream;
 	ostream << name() << "(" << _match_op->to_string(tagset) << ", ";
-	if (!_conditions.empty()) {
+	if (!_conditions->empty()) {
 		ostream << "cond(";
-		for(size_t i = 0; i < _conditions.size(); ++i) {
+		for(size_t i = 0; i < _conditions->size(); ++i) {
 			if (i != 0) {
 				ostream << ", ";
 			}
-			ostream << _conditions[i]->to_string(tagset);
+			ostream << (*_conditions)[i]->to_string(tagset);
 		}
 		ostream << "), ";
 	}
 	ostream << "actions(";
-	for(size_t i = 0; i < _actions.size(); ++i) {
+	for(size_t i = 0; i < _actions->size(); ++i) {
 		if (i != 0) {
 			ostream << ", ";
 		}
-		ostream << _actions[i]->to_string(tagset);
+		ostream << (*_actions)[i]->to_string(tagset);
 	}
 	ostream << "))";
 	return ostream.str();
@@ -79,22 +79,22 @@ std::string ApplyOperator::to_string(const Corpus2::Tagset& tagset) const
 std::ostream& ApplyOperator::write_to(std::ostream &ostream) const
 {
 	ostream << name() << "(" << *_match_op << ", ";
-	if (!_conditions.empty()) {
+	if (!_conditions->empty()) {
 		ostream << "cond(";
-		for(size_t i = 0; i < _conditions.size(); ++i) {
+		for(size_t i = 0; i < _conditions->size(); ++i) {
 			if (i != 0) {
 				ostream << ", ";
 			}
-			ostream << *_conditions[i];
+			ostream << *(*_conditions)[i];
 		}
 		ostream << "), ";
 	}
 	ostream << "actions(";
-	for(size_t i = 0; i < _actions.size(); ++i) {
+	for(size_t i = 0; i < (*_actions).size(); ++i) {
 		if (i != 0) {
 			ostream << ", ";
 		}
-		ostream << *_actions[i];
+		ostream << *(*_actions)[i];
 	}
 	ostream << "))";
 	return ostream;
diff --git a/libwccl/ops/match/applyoperator.h b/libwccl/ops/match/applyoperator.h
index e160a40a4259416e4712247c49d6587ebf44e09f..526218a4e2cc56d62591fbe8edabffbcca468ce5 100644
--- a/libwccl/ops/match/applyoperator.h
+++ b/libwccl/ops/match/applyoperator.h
@@ -26,8 +26,10 @@ public:
 			const VariableAccessor<Position>& cur_iter_pos,
 			const VariableAccessor<Match>& matches,
 			const boost::shared_ptr<const MatchOperator>& match_op,
-			const std::vector<boost::shared_ptr<const MatchAction> >& actions,
-			const std::vector<boost::shared_ptr<const Function<Bool> > >& conditions = (std::vector<boost::shared_ptr<const Function<Bool> > >()));
+			const boost::shared_ptr<const std::vector<boost::shared_ptr<MatchAction> > >& actions,
+			const boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > >& conditions
+				= boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > >(
+					new boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > >()));
 
 	/**
 	 * @returns Name of the operator.
@@ -61,8 +63,8 @@ private:
 	const VariableAccessor<Position> _cur_iter_pos;
 	const VariableAccessor<Match> _matches;
 	const boost::shared_ptr<const MatchOperator> _match_op;
-	const std::vector<boost::shared_ptr<const MatchAction> > _actions;
-	const std::vector<boost::shared_ptr<const Function<Bool> > > _conditions;
+	const boost::shared_ptr<const std::vector<boost::shared_ptr<MatchAction> > > _actions;
+	const boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > > _conditions;
 };
 
 } /* end ns Wccl */