diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index 20e53c3b0fad1f5857b7c47b18889722dbc05c41..ae10dc4c8e11d0a7a8dfc7dc46d5480279130835 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -58,7 +58,10 @@ header {
 	#include <libwccl/ops/functions/bool/iterations/leftlook.h>
 	#include <libwccl/ops/functions/bool/iterations/rightlook.h>
 	
-	// actions
+	// Rules, actions
+	#include <libwccl/ops/rule.h>
+	#include <libwccl/ops/rulesequence.h>
+	//
 	#include <libwccl/ops/actions/unify.h>
 	#include <libwccl/ops/actions/delete.h>
 	#include <libwccl/ops/actions/select.h>
@@ -204,6 +207,30 @@ parse_position_operator
 	EOF
 ;
 
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// Rule for parsing single WCCL Rule
+// Returns boost::shared_ptr<Rule>
+parse_single_rule
+	[const Corpus2::Tagset &tagset]
+	returns [boost::shared_ptr<Rule> rle]
+{	
+	Variables vars;
+}
+	: rle = rule [tagset, vars]
+;
+
+// Rule for parsing rules section in the wccl file
+// Returns boost::shared_ptr<RuleSequence>
+parse_rule_sequence
+	[const Corpus2::Tagset& tagset]
+	returns [boost::shared_ptr<RuleSequence> rule_seq]
+{
+	Variables vars;
+}
+	: rule_seq = rules[tagset, vars]
+;
+
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 // VALUES
@@ -1331,19 +1358,104 @@ symset_setvar
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-// Tagging rules:
+// Tagging actions and rules:
 // ----------------------------------------------------------------------------
-rule_action
+
+// ----------------------------------------------------------------------------
+// Single action such as select, delete, relabel or unify
+action
 	[const Corpus2::Tagset& tagset, Variables& vars]
-	returns [boost::shared_ptr<Action> action]
-	: action = action_select  [tagset, vars]
-	| action = action_delete  [tagset, vars]
-	| action = action_relabel [tagset, vars]
+	returns [boost::shared_ptr<Action> act]
+	: act = action_select  [tagset, vars]
+	| act = action_delete  [tagset, vars]
+	| act = action_relabel [tagset, vars]
 	//
-	| action = action_unify   [tagset, vars]
+	| act = action_unify [tagset, vars]
 	//
 ;
 
+// Action sequence - the actions are separated with commas:
+// 	select(...), select(...), delete(...)
+action_sequence
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<std::vector<boost::shared_ptr<Action> > > v_act]
+{
+	boost::shared_ptr<Action> act;
+	v_act.reset(new std::vector<boost::shared_ptr<Action> >);
+}
+	: act = action[tagset, vars] {
+		v_act->push_back(act);
+	} 
+	(
+		COMMA act = action[tagset, vars] {
+			v_act->push_back(act);
+		}
+	)*
+;
+
+// ----------------------------------------------------------------------------
+// Single rule:
+// 	rule(NAME, ACTIONS) or rule(NAME, COND, ACTIONS)
+rule
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<Rule> rle]
+{
+	boost::shared_ptr<Function<Bool> > condition;
+	boost::shared_ptr<std::vector<boost::shared_ptr<Action> > > actions;
+}
+	: "rule" LPAREN name: STRING COMMA
+	(
+		(bool_operator[tagset, vars]) =>
+		(
+			condition = bool_operator [tagset, vars] COMMA
+			actions = action_sequence [tagset, vars] {
+				// rule(NAME, COND, ACTIONS)
+				rle.reset(
+					new Rule(token_ref_to_std_string(name), vars, actions, condition));
+			}
+		)
+	|
+		(
+			actions = action_sequence [tagset, vars] {
+				// rule(NAME, ACTIONS)
+				rle.reset(new Rule(token_ref_to_std_string(name), vars, actions));
+			}
+		)
+	)
+	RPAREN
+;
+
+// Rule sequence
+rule_sequence
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<RuleSequence> rule_seq]
+{
+	// FIXME czy tutaj przypadkiem nie powinno byc shared_ptr?
+	std::vector<Rule> rls;
+	boost::shared_ptr<Rule> rle;
+
+	rule_seq.reset(new RuleSequence(rls));
+}
+	: rle = rule [tagset, vars] {
+		rls.push_back(*rle);
+	}
+	(
+		COMMA rle = rule [tagset, vars] {
+			rls.push_back(*rle);
+		}
+	)*
+;
+
+// Temporary name. 
+// This is wrapper for rule_sequence in rules section in the wccl file
+rules
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<RuleSequence> rule_seq]
+	: "rules" LPAREN rule_seq = rule_sequence [tagset, vars] RPAREN {
+		//
+	}
+;
+
 // ----------------------------------------------------------------------------
 // Select action: 
 //	select(position, predicate) or select(predicate);