diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index a0260238c477c5f59e71644977223ea49e93017c..f17030311664d363178939f54750cb91684ed917 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -72,6 +72,9 @@ header {
 	#include <libwccl/values/annotationmatch.h>
 	#include <libwccl/values/matchvector.h>
 	#include <libwccl/ops/match/applyoperator.h>
+	#include <libwccl/ops/match/conditions/optionalmatch.h>
+	#include <libwccl/ops/match/conditions/repeatedmatch.h>
+	#include <libwccl/ops/match/conditions/conjconditions.h>
 
 	// Unicode String
 	#include <unicode/uniset.h>
@@ -236,6 +239,22 @@ parse_rule_sequence
 	: rule_seq = rules[tagset, vars]
 ;
 
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// Rule for parsing the match rules
+// Returns ????
+parse_match_rule
+	[const Corpus2::Tagset& tagset]
+	returns [boost::shared_ptr<Expression> ret_match]
+{
+	Variables vars;
+	// TODO Dodac do vars pozycje $_ oraz wektor $m_M
+	// TODO
+	fprintf(stderr, "TODO: parse_match_rule -> return type\n");
+}
+	: ret_match = match_rule_operator[tagset, vars] 
+;
+
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 // VALUES
@@ -1680,6 +1699,120 @@ action_unify
 		}
 ;
 
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// Match rules
+// Returns boost::shared_ptr<Expression>
+match_rule_operator
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<Expression> ret_op]
+{
+	//
+}
+	: ret_op = match_operator [tagset, vars]
+;
+
+// Match apply operator:
+// 	apply(match(), conditions, actions) 
+// 	apply(match(), actions)
+// Returns boost::shared_ptr<ApplyOperator>
+match_apply_operator
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<ApplyOperator> ret_op]
+{
+	// VariableAccessor<Match> matches;
+	// VariableAccessor<Position> cur_iter_pos;
+	// boost::shared_ptr<const MatchOperator> match_op;
+	// std::vector<boost::shared_ptr<const MatchAction> > actions;
+	// std::vector<boost::shared_ptr<const Function<Bool> > > conditions;
+	// TODO
+}
+	: "apply" LPAREN RPAREN {
+		// TODO
+	}
+;
+
+// Match operator: match(match_conditions)
+// Returns boost::shared_ptr<MatchOperator>
+match_operator
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<MatchOperator> op]
+{
+	boost::shared_ptr<ConjConditions> match_cond;
+}
+	: "match" LPAREN match_cond = match_condition [tagset,vars] RPAREN {
+		op.reset(new MatchOperator(match_cond));
+	}
+;
+
+// Match conditions. Wrapper for vector of the match conditions
+match_condition
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<ConjConditions> condition]
+{
+	std::vector<boost::shared_ptr<const MatchCondition> > m_cond;
+}
+	: m_cond = match_condition_in [tagset, vars] {
+		condition.reset(new ConjConditions(m_cond));
+	}
+;
+
+// Match conditions.
+// Retutns std::vector< boost::shared_ptr<const MatchCondition> >
+match_condition_in
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [std::vector< boost::shared_ptr<const MatchCondition> > ret]
+{
+	boost::shared_ptr<const MatchCondition> r_cond;
+}
+	: r_cond = match_cond_all[tagset, vars] {
+		ret.push_back(r_cond);
+	}
+	(
+		COMMA
+		r_cond = match_cond_all[tagset, vars] {
+			ret.push_back(r_cond);
+		}
+	)*
+;
+
+// One of the match condition
+// Returns boost::shared_ptr<const MatchCondition>
+match_cond_all
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<const MatchCondition> ret]
+	: ret = match_cond_optional [tagset, vars]
+	| ret = match_cond_repeate  [tagset, vars]
+;
+
+// Match condition - optional
+// Returns boost::shared_ptr<OptionalMatch>
+match_cond_optional
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<OptionalMatch> mtch]
+{
+	boost::shared_ptr<ConjConditions> m_cond;
+}
+	: "optional" LPAREN m_cond = match_condition [tagset, vars] RPAREN {
+		mtch.reset(new OptionalMatch(m_cond));
+	}
+;
+
+// Match condition - repleace
+// Returns boost::shared_ptr<OptionalMatch>
+match_cond_repeate
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<OptionalMatch> mtch]
+{
+	boost::shared_ptr<ConjConditions> m_cond;
+}
+	: "repeate" LPAREN m_cond = match_condition [tagset, vars] RPAREN {
+		mtch.reset(new OptionalMatch(m_cond));
+	}
+;
+
+// ----------------------------------------------------------------------------
+
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 // ANTLR LEXER