diff --git a/libwccl/ops/functions/bool/iterations/leftlook.cpp b/libwccl/ops/functions/bool/iterations/leftlook.cpp
index c7f4d6965f96f56acd17bae8bccbe4eeb817afd7..d1a80282735c953fa4b714e79914fa7e2b589546 100644
--- a/libwccl/ops/functions/bool/iterations/leftlook.cpp
+++ b/libwccl/ops/functions/bool/iterations/leftlook.cpp
@@ -8,7 +8,7 @@ bool LeftLook::iterate(
 	Wccl::Position &p,
 	const Wccl::FunExecContext &context) const
 {
-	for(int i = right; i >= left; ++i) {
+	for(int i = right; i >= left; --i) {
 		p.set_value(i);
 		if(evaluating_expr_->apply(context)->get_value()) {
 			return true;
diff --git a/libwccl/ops/functions/bool/predicates/pointagreement.h b/libwccl/ops/functions/bool/predicates/pointagreement.h
index b9b58e910e707f0d821b571f14e3114174769765..cefa1f7c25058cf0381be5421528a9aed9163c25 100644
--- a/libwccl/ops/functions/bool/predicates/pointagreement.h
+++ b/libwccl/ops/functions/bool/predicates/pointagreement.h
@@ -19,10 +19,12 @@ public:
 	PointAgreement(
 		const PosFunctionPtr& pos1_expr,
 		const PosFunctionPtr& pos2_expr,
-		const TSetFunctionPtr& attribs_expr)
+		const TSetFunctionPtr& attribs_expr,
+		const Corpus2::Tagset& tagset)
 		: pos1_expr_(pos1_expr),
 		  pos2_expr_(pos2_expr),
-		  attribs_expr_(attribs_expr)
+		  attribs_expr_(attribs_expr),
+		  tagset_(tagset)
 	{
 		BOOST_ASSERT(pos1_expr_);
 		BOOST_ASSERT(pos2_expr_);
@@ -45,6 +47,7 @@ protected:
 	const PosFunctionPtr pos1_expr_;
 	const PosFunctionPtr pos2_expr_;
 	const TSetFunctionPtr attribs_expr_;
+	const Corpus2::Tagset& tagset_;
 
 	/**
 	 * Gets two positions from arguments. If either of them
diff --git a/libwccl/ops/functions/bool/predicates/strongagreement.h b/libwccl/ops/functions/bool/predicates/strongagreement.h
index c59ee02a08dcfa47736cf938aff6920063cbe804..83c9dd630e1645936a6aebf05af67e12ce6c1478 100644
--- a/libwccl/ops/functions/bool/predicates/strongagreement.h
+++ b/libwccl/ops/functions/bool/predicates/strongagreement.h
@@ -18,10 +18,12 @@ public:
 	StrongAgreement(
 		const PosFunctionPtr& left_pos_expr,
 		const PosFunctionPtr& right_pos_expr,
-		const TSetFunctionPtr& attribs_expr)
+		const TSetFunctionPtr& attribs_expr,
+		const Corpus2::Tagset& tagset)
 		: left_pos_expr_(left_pos_expr),
 		  right_pos_expr_(right_pos_expr),
-		  attribs_expr_(attribs_expr)
+		  attribs_expr_(attribs_expr),
+		  tagset_(tagset)
 	{
 		BOOST_ASSERT(left_pos_expr_);
 		BOOST_ASSERT(right_pos_expr_);
@@ -45,6 +47,7 @@ protected:
 	const PosFunctionPtr left_pos_expr_;
 	const PosFunctionPtr right_pos_expr_;
 	const TSetFunctionPtr attribs_expr_;
+	const Corpus2::Tagset& tagset_;
 
 	/**
 	 * Gets start and end positions for range from arguments.
diff --git a/libwccl/ops/functions/bool/predicates/weakagreement.h b/libwccl/ops/functions/bool/predicates/weakagreement.h
index f3f58838001b3032875a685a48414c98b510c305..e4a47ab7ab14791210709439cd6c1c9aee150dbb 100644
--- a/libwccl/ops/functions/bool/predicates/weakagreement.h
+++ b/libwccl/ops/functions/bool/predicates/weakagreement.h
@@ -18,10 +18,12 @@ public:
 	WeakAgreement(
 		const PosFunctionPtr& left_pos_expr,
 		const PosFunctionPtr& right_pos_expr,
-		const TSetFunctionPtr& attribs_expr)
+		const TSetFunctionPtr& attribs_expr,
+		const Corpus2::Tagset& tagset)
 		: left_pos_expr_(left_pos_expr),
 		  right_pos_expr_(right_pos_expr),
-		  attribs_expr_(attribs_expr)
+		  attribs_expr_(attribs_expr),
+		  tagset_(tagset)
 	{
 		BOOST_ASSERT(left_pos_expr_);
 		BOOST_ASSERT(right_pos_expr_);
@@ -45,6 +47,7 @@ protected:
 	const PosFunctionPtr left_pos_expr_;
 	const PosFunctionPtr right_pos_expr_;
 	const TSetFunctionPtr attribs_expr_;
+	const Corpus2::Tagset& tagset_;
 
 	/**
 	 * Gets start and end positions for range from arguments.
diff --git a/libwccl/ops/functions/tset/agrfilter.h b/libwccl/ops/functions/tset/agrfilter.h
index f86f3fda842938e718fbd5fc25b597ce6a8c9942..d41d4c63980b29d0c676071e8b206745ffb351e2 100644
--- a/libwccl/ops/functions/tset/agrfilter.h
+++ b/libwccl/ops/functions/tset/agrfilter.h
@@ -22,11 +22,13 @@ public:
 			const PosFunctionPtr& left_pos_expr,
 			const PosFunctionPtr& right_pos_expr,
 			const TSetFunctionPtr& attribs_expr,
-			const TSetFunctionPtr& mask_expr)
+			const TSetFunctionPtr& mask_expr,
+			const Corpus2::Tagset& tagset)
 		: left_pos_expr_(left_pos_expr),
 		  right_pos_expr_(right_pos_expr),
 		  attribs_expr_(attribs_expr),
-		  mask_expr_(mask_expr)
+		  mask_expr_(mask_expr),
+		  tagset_(tagset)
 	{
 		BOOST_ASSERT(left_pos_expr_);
 		BOOST_ASSERT(right_pos_expr_);
@@ -54,7 +56,7 @@ protected:
 	const TSetFunctionPtr attribs_expr_;
 	const TSetFunctionPtr mask_expr_;
 
-
+	const Corpus2::Tagset& tagset_;
 
 	/**
 	 * Gets range specified via Position expressions. Trims the range
diff --git a/libwccl/values/value.h b/libwccl/values/value.h
index efd92cb7f0cc5d726e8396f0f28f5b66f71b9836..f4048c04e298b78d9d2e80794af0bacc291a2de3 100644
--- a/libwccl/values/value.h
+++ b/libwccl/values/value.h
@@ -6,7 +6,10 @@
 #define WCCL_VALUE_PREAMBLE \
 static const char* type_name; \
 const char* get_type_name() const { return type_name; } \
-static std::string var_repr(const std::string &var_name);
+static std::string var_repr(const std::string &var_name); \
+std::string make_var_repr(const std::string &var_name) const { \
+	return var_repr(var_name); \
+}
 
 
 namespace Wccl {
@@ -35,6 +38,8 @@ public:
 
 	virtual ~Value() {}
 
+	virtual std::string make_var_repr(const std::string&) const = 0;
+
 	/**
 	 * String representation function, in general, a tagset is required,
 	 * but some classes might not need that, so by default just forward
diff --git a/wcclparser/main.cpp b/wcclparser/main.cpp
index 2ef8976a2e02cb7e22454de13d61b6888cc3791c..4df9c59eb70490eaab65c868df74a43be780caa8 100644
--- a/wcclparser/main.cpp
+++ b/wcclparser/main.cpp
@@ -90,8 +90,17 @@ void libedit_read_loop(boost::function<bool (const std::string&)>& line_cb)
 }
 #endif
 
+void dumpvariables(const Wccl::Variables& vars, const Corpus2::Tagset& tagset)
+{
+	typedef std::pair<std::string, boost::shared_ptr<Wccl::Value> > v_t;
+	foreach (const v_t& v, vars.get_all<Wccl::Value>()) {
+		std::cerr << v.second->make_var_repr(v.first) << "="
+			<< v.second->to_string(tagset) << "\n";
+	}
+}
+
 bool process_line(const std::string& line, Wccl::Parser& parser,
-	Wccl::SentenceContext& sc, bool all_positions)
+	Wccl::SentenceContext& sc, bool all_positions, bool dump_variables)
 {
 	if (line.empty() || line == "exit" || line == "quit") {
 		return true;
@@ -123,6 +132,9 @@ bool process_line(const std::string& line, Wccl::Parser& parser,
 						<< "Parsed expression: "
 						<< retVal->to_string(parser.tagset())
 						<< std::endl;
+					if (dump_variables) {
+						dumpvariables(*cx.variables(), parser.tagset());
+					}
 				} else {
 					std::cerr << "Problem while parsing -- "
 						<< "retVal is NULL!" << std::endl;
@@ -156,6 +168,7 @@ int main(int argc, char** argv)
 	std::string query_load = "";
 	std::string position = "0";
 	bool quiet = false;
+	bool dump_variables = false;
 	using boost::program_options::value;
 
 	boost::program_options::options_description desc("Allowed options");
@@ -172,6 +185,8 @@ int main(int argc, char** argv)
 			 "Query to run (disables interactive mode)\n")
 			("quiet,q", value(&quiet)->zero_tokens(),
 			 "Suppress messages\n")
+			("variables,V", value(&dump_variables)->zero_tokens(),
+			 "Dump variables after running each query\n")
 			("help,h", "Show help")
 			;
 	boost::program_options::variables_map vm;
@@ -214,14 +229,14 @@ int main(int argc, char** argv)
 		sc.set_position(pos);
 		Wccl::Parser parser(tagset);
 		if (!query.empty()) {
-			process_line(query, parser, sc, position == "all");
+			process_line(query, parser, sc, position == "all", dump_variables);
 			return 0;
 		} else if (!query_load.empty()) {
 			std::ifstream qf(query_load.c_str());
 			if (qf.good()) {
 				std::stringstream ss;
 				ss << qf.rdbuf();
-				process_line(ss.str(), parser, sc, position == "all");
+				process_line(ss.str(), parser, sc, position == "all", dump_variables);
 				return 0;
 			} else {
 				throw Wccl::FileNotFound(sentence_load, "", "Query file");
@@ -229,7 +244,7 @@ int main(int argc, char** argv)
 		}
 		boost::function<bool (const std::string&)> f;
 		f = boost::bind(&process_line, _1, boost::ref(parser), boost::ref(sc),
-			position == "all");
+			position == "all", dump_variables);
 #ifdef HAVE_LIBEDIT
 		libedit_read_loop(f);
 #else