diff --git a/corpus2tools/corpus2get.cpp b/corpus2tools/corpus2get.cpp
index 53c50180ba95665df1a839a6095c0196177528aa..6dd0472fdd2bc81d04c89bacee6f47c9369ef924 100644
--- a/corpus2tools/corpus2get.cpp
+++ b/corpus2tools/corpus2get.cpp
@@ -23,7 +23,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/io/reader.h>
 #include <libcorpus2/io/writer.h>
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 #include <boost/program_options.hpp>
 #include <boost/bind.hpp>
diff --git a/corpus2tools/tagset-tool.cpp b/corpus2tools/tagset-tool.cpp
index 7ab43954e4dc71f1f002244cb1a226b8ba03fabc..45ac67dd61bdfd3c9f5a5cfdf3bc5cb3d31e2e46 100644
--- a/corpus2tools/tagset-tool.cpp
+++ b/corpus2tools/tagset-tool.cpp
@@ -19,7 +19,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/tagsetmanager.h>
 #include <libcorpus2/token.h>
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 #include <boost/program_options.hpp>
 #include <boost/bind.hpp>
@@ -107,7 +107,7 @@ void tagset_info(const Corpus2::Tagset& tagset)
 	std::cerr << "Size is " << tagset.size()
 		<< " (extra size is " << tagset.size_extra() << ")\n";
 	std::cerr << "POSes: ";
-	foreach (const std::string& s, tagset.pos_dictionary()) {
+	BOOST_FOREACH(const std::string& s, tagset.pos_dictionary()) {
 		std::cerr << s << " ";
 	}
 	std::cerr << "\n";
@@ -124,7 +124,7 @@ void tagset_query_cb(const Corpus2::Tagset& tagset, const std::string& s,
 			std::cout << tagset.get_pos_mask(pos) << " (" << (int)pos << ")\n";
 		}
 		std::cout << s << " -> POS ->" ;
-		foreach (Corpus2::idx_t a, tagset.get_pos_attributes(pos)) {
+		BOOST_FOREACH(Corpus2::idx_t a, tagset.get_pos_attributes(pos)) {
 			std::string astr = tagset.attribute_dictionary().get_string(a);
 			if (tagset.pos_requires_attribute(pos, a)) {
 				std::cout << " " << astr;
@@ -138,7 +138,7 @@ void tagset_query_cb(const Corpus2::Tagset& tagset, const std::string& s,
 			std::cout << tagset.get_attribute_mask(atr) << " (" << (int)atr << ")\n";
 		}
 		std::cout << s << " -> attribute ->";
-		foreach (Corpus2::mask_t v, tagset.get_attribute_values(atr)) {
+		BOOST_FOREACH(Corpus2::mask_t v, tagset.get_attribute_values(atr)) {
 			std::cout << " " << tagset.get_value_name(v);
 		}
 		std::cout << "\nIn POSes:";
@@ -160,7 +160,7 @@ void tagset_query_cb(const Corpus2::Tagset& tagset, const std::string& s,
 		std::cout << s << " -> value -> attribute ";
 		std::cout << tagset.attribute_dictionary().get_string(a);
 		std::cout << " .";
-		foreach (Corpus2::mask_t v, tagset.get_attribute_values(a)) {
+		BOOST_FOREACH(Corpus2::mask_t v, tagset.get_attribute_values(a)) {
 			std::cout << " " << tagset.get_value_name(v);
 		}
 		std::cout << "\nIn POSes:";
@@ -185,7 +185,7 @@ void tag_parse_cb(const Corpus2::Tagset& tagset, bool validate, bool sort,
 		Corpus2::Token t;
 		tagset.lexemes_into_token(t, UnicodeString(), s);
 		std::vector<std::string> out;
-		foreach (const Corpus2::Lexeme& lex, t.lexemes()) {
+		BOOST_FOREACH(const Corpus2::Lexeme& lex, t.lexemes()) {
 			std::stringstream ss;
 			ss << tagset.tag_to_string(lex.tag());
 			if (validate) {
diff --git a/libcorpus2/ann/annotatedsentence.cpp b/libcorpus2/ann/annotatedsentence.cpp
index d37958c4903f6ca7d99d9be09593152084a46694..50c5ae81df19db8bcc128dbc7173fd1b09c761fa 100644
--- a/libcorpus2/ann/annotatedsentence.cpp
+++ b/libcorpus2/ann/annotatedsentence.cpp
@@ -35,7 +35,7 @@ Sentence::Ptr AnnotatedSentence::clone_shared() const
 {
 	boost::shared_ptr<AnnotatedSentence> copy;
 	copy = boost::make_shared<AnnotatedSentence>();
-	foreach (const Token* t, tokens_) {
+	BOOST_FOREACH(const Token* t, tokens_) {
 		copy->append(t->clone());
 	}
 	copy->channels_ = channels_;
@@ -49,7 +49,7 @@ boost::shared_ptr<AnnotatedSentence> AnnotatedSentence::wrap_sentence(
 	a = boost::dynamic_pointer_cast<AnnotatedSentence>(s);
 	if (!a) {
 		a = boost::make_shared<AnnotatedSentence>();
-		foreach (Token* t, s->tokens()) {
+		BOOST_FOREACH(Token* t, s->tokens()) {
 			a->append(t);
 		}
 		s->release_tokens();
@@ -64,7 +64,7 @@ boost::shared_ptr<AnnotatedSentence> AnnotatedSentence::wrap_sentence_clone(
 	a = boost::dynamic_pointer_cast<AnnotatedSentence>(s);
 	if (!a) {
 		a = boost::make_shared<AnnotatedSentence>();
-		foreach (Token* t, s->tokens()) {
+		BOOST_FOREACH(Token* t, s->tokens()) {
 			a->append(t->clone());
 		}
 	} else {
@@ -87,7 +87,7 @@ boost::shared_ptr<AnnotationView> create_view(
 	std::vector<Annotation> ann = chan.make_annotation_vector(AnnotationChannel::O_INCLUSIVE);
 	boost::shared_ptr<AnnotationView> view;
 	view = boost::make_shared<AnnotationView>(s, ann_name);
-	foreach (const Annotation& a, ann) {
+	BOOST_FOREACH(const Annotation& a, ann) {
 		UnicodeString orth;
 		orth = s->tokens()[a.indices[0]]->orth();
 		for (size_t idxi = 1; idxi < a.indices.size(); ++idxi) {
@@ -107,7 +107,7 @@ boost::shared_ptr<AnnotationView> create_view(
 void AnnotatedSentence::append(Token *t)
 {
 	Sentence::append(t);
-	foreach (chan_map_t::value_type& v, channels_) {
+	BOOST_FOREACH(chan_map_t::value_type& v, channels_) {
 		v.second.resize(size());
 	}
 }
@@ -115,7 +115,7 @@ void AnnotatedSentence::append(Token *t)
 std::string AnnotatedSentence::annotation_info() const
 {
 	std::stringstream ss;
-	foreach (const chan_map_t::value_type& v, channels_) {
+	BOOST_FOREACH(const chan_map_t::value_type& v, channels_) {
 		ss << "Channel " << v.first << ": \t";
 		int ann, disj, un;
 		v.second.do_counts(ann, disj, un);
diff --git a/libcorpus2/ann/channel.cpp b/libcorpus2/ann/channel.cpp
index 2ae9e4e74eff4dbd6d812b29cdf1c3c017dbce7f..6a213996fb469d4a10ed503a81a038a953fc225f 100644
--- a/libcorpus2/ann/channel.cpp
+++ b/libcorpus2/ann/channel.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/ann/channel.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <algorithm>
 #include <boost/bind.hpp>
 #include <sstream>
@@ -97,7 +97,7 @@ int AnnotationChannel::get_new_segment_index() const
 {
 	//cache this?
 	std::vector<bool> used(segments_.size() + 1);
-	foreach (size_t sid, segments_) {
+	BOOST_FOREACH(size_t sid, segments_) {
 		if (sid < used.size()) {
 			used[sid] = true;
 		}
@@ -176,14 +176,14 @@ std::vector<Annotation> AnnotationChannel::make_annotation_vector(
 			not_annotated.push_back(i);
 		}
 	}
-	foreach (int na, not_annotated) {
+	BOOST_FOREACH(int na, not_annotated) {
 		rv.push_back(Annotation());
 		rv.back().indices.push_back(na);
 		rv.back().head_index = na;
 	}
 	rv.erase(std::remove_if(rv.begin(), rv.end(),
 		boost::bind(&Annotation::empty, _1)), rv.end());
-	foreach (Annotation& a, rv) {
+	BOOST_FOREACH(Annotation& a, rv) {
 		if (a.head_index == -1) {
 			a.head_index = a.indices[0];
 		}
@@ -195,7 +195,7 @@ std::vector<Annotation> AnnotationChannel::make_annotation_vector(
 std::string AnnotationChannel::dump_iob() const
 {
 	std::stringstream ss;
-	foreach (Corpus2::IOB::Enum e, iobs()) {
+	BOOST_FOREACH(Corpus2::IOB::Enum e, iobs()) {
 		ss << Corpus2::IOB::to_string(e);
 	}
 	return ss.str();
@@ -204,7 +204,7 @@ std::string AnnotationChannel::dump_iob() const
 std::string AnnotationChannel::dump_segments() const
 {
 	std::stringstream ss;
-	foreach (int s, segments_) {
+	BOOST_FOREACH(int s, segments_) {
 		ss << s;
 	}
 	return ss.str();
@@ -213,7 +213,7 @@ std::string AnnotationChannel::dump_segments() const
 std::string AnnotationChannel::dump_heads() const
 {
 	std::stringstream ss;
-	foreach (bool b, heads_) {
+	BOOST_FOREACH(bool b, heads_) {
 		ss << (b ? "H" : " ");
 	}
 	return ss.str();
@@ -248,7 +248,7 @@ void AnnotationChannel::do_counts(int& annotations, int& disjoint, int& unannota
 	annotations = 0;
 	disjoint = 0;
 	unannotated = 0;
-	foreach (int sid, segments_) {
+	BOOST_FOREACH(int sid, segments_) {
 		if (sid == 0) {
 			++unannotated;
 		} else if (!used_sids.insert(sid).second) { //was already there
diff --git a/libcorpus2/ann/view.cpp b/libcorpus2/ann/view.cpp
index f579b6531a1b763e6ea0af6b957830f029aedcb1..c520adc9c88ece8d458f166a83747d191f92b2a3 100644
--- a/libcorpus2/ann/view.cpp
+++ b/libcorpus2/ann/view.cpp
@@ -35,7 +35,7 @@ Sentence::Ptr AnnotationView::clone_shared() const
 {
 	boost::shared_ptr<AnnotationView> copy;
 	copy = boost::make_shared<AnnotationView>(original_, ann_name_);
-	foreach (const Token* t, tokens_) {
+	BOOST_FOREACH(const Token* t, tokens_) {
 		copy->append(t->clone());
 	}
 	return copy;
diff --git a/libcorpus2/chunk.cpp b/libcorpus2/chunk.cpp
index cc710406e1f0cab4b75a7e2ca25f38602e316f8c..b93e42e34effb02651e3b60164cd9e954d6563d0 100644
--- a/libcorpus2/chunk.cpp
+++ b/libcorpus2/chunk.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/chunk.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <boost/make_shared.hpp>
 
 namespace Corpus2 {
@@ -31,7 +31,7 @@ Chunk::~Chunk()
 boost::shared_ptr<Chunk> Chunk::clone_shared() const
 {
 	boost::shared_ptr<Chunk> copy = boost::make_shared<Chunk>();
-	foreach (const boost::shared_ptr<Sentence>& s, sentences_) {
+	BOOST_FOREACH(const boost::shared_ptr<Sentence>& s, sentences_) {
 		copy->append(s->clone_shared());
 	}
 	copy->attributes_ = attributes_;
diff --git a/libcorpus2/io/cclreader.cpp b/libcorpus2/io/cclreader.cpp
index 0aa71c7e2e9a314052d5c26318bbb6215a0fcf12..ba113bbe53895eec9d1335517c44b7ff9a9591f6 100644
--- a/libcorpus2/io/cclreader.cpp
+++ b/libcorpus2/io/cclreader.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/cclreader.h>
 #include <libcorpus2/io/xmlreader.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libxml++/libxml++.h>
 #include <libxml2/libxml/parser.h>
 #include <boost/make_shared.hpp>
@@ -182,7 +182,7 @@ void CclReaderImpl::start_chunk(const AttributeList& attributes)
 	if (type == "s") {
 		throw XcesError("Trying to parse XCES as CCL (<chunk type=\"s\">)");
 	}
-	foreach (const Attribute& a, attributes) {
+	BOOST_FOREACH(const Attribute& a, attributes) {
 		chunk_->set_attribute(a.name, a.value);
 	}
 	state_ = STATE_CHUNK;
@@ -194,7 +194,7 @@ void CclReaderImpl::start_sentence(const AttributeList &attributes)
 {
 	// find sentence id
 	std::string id = "";
-	foreach (const Attribute& a, attributes) {
+	BOOST_FOREACH(const Attribute& a, attributes) {
 		if (a.name == "id") {
 			id = a.value;
 			break;
@@ -228,7 +228,7 @@ bool CclReaderImpl::process_start_element(const Glib::ustring & name,
 		clear_buf();
 		ann_chan_ = "";
 		ann_head_ = false;
-		foreach (const Attribute& a, attributes) {
+		BOOST_FOREACH(const Attribute& a, attributes) {
 			if (a.name == "chan") {
 				ann_chan_ = a.value;
 			} else if (a.name == "head" && a.value == "1") {
@@ -244,7 +244,7 @@ bool CclReaderImpl::process_start_element(const Glib::ustring & name,
 		grab_characters_ = true;
 		clear_buf();
 		prop_key_ = "";
-		foreach (const Attribute& a, attributes) {
+		BOOST_FOREACH(const Attribute& a, attributes) {
 			if (a.name == "key") {
 				prop_key_ = a.value;
 			}
@@ -291,7 +291,7 @@ bool CclReaderImpl::process_end_element(const Glib::ustring & name)
 void CclReaderImpl::finish_token()
 {
 	XmlReader::finish_token();
-	foreach (const token_ann_t::value_type& v, token_anns_) {
+	BOOST_FOREACH(const token_ann_t::value_type& v, token_anns_) {
 		ann_sent_->get_channel(v.first).set_segment_at(sent_->size() - 1, v.second);
 		if (token_ann_heads_.find(v.first) != token_ann_heads_.end()) {
 			ann_sent_->get_channel(v.first).set_head_at(sent_->size() - 1, true);
diff --git a/libcorpus2/io/cclwriter.cpp b/libcorpus2/io/cclwriter.cpp
index 8d89a05ae2f3621ce0d29bc1300bebe38ae814a7..cd4c941c160d212c8ca463552b852aa676fbdaa5 100644
--- a/libcorpus2/io/cclwriter.cpp
+++ b/libcorpus2/io/cclwriter.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/cclwriter.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libcorpus2/ann/annotatedsentence.h>
 #include <libcorpus2/io/xcescommon.h>
 #include <libcorpus2/tokenmetadata.h>
@@ -65,7 +65,7 @@ void CclWriter::write_sentence_int(const Sentence &s)
 			token_as_xces_xml_head(os(), *t, use_indent_ ? indent_level() : -1, whitespace_info_);
 			if (use_indent_) indent_more();
 			token_as_xces_xml_body(os(), tagset(), *t, use_indent_ ? indent_level() : -1, output_disamb_, sort_tags_);
-			foreach (const AnnotatedSentence::chan_map_t::value_type& v, ann->all_channels()) {
+			BOOST_FOREACH(const AnnotatedSentence::chan_map_t::value_type& v, ann->all_channels()) {
 				osi() << "<ann chan=\"" << v.first << "\"";
 				if (v.second.is_head_at(idx)) {
 					os() << " head=\"1\"";
@@ -76,7 +76,7 @@ void CclWriter::write_sentence_int(const Sentence &s)
 			}
 			boost::shared_ptr<TokenMetaData> md = t->get_metadata();
 			if (md) {
-				foreach (const TokenMetaData::attr_map_t::value_type& v, md->attributes()) {
+				BOOST_FOREACH(const TokenMetaData::attr_map_t::value_type& v, md->attributes()) {
 					osi() << "<prop key=\"" << v.first << "\"" << ">";
 					os() << v.second << "</prop>\n";
 				}
@@ -96,7 +96,7 @@ void CclWriter::write_chunk(const Chunk &c)
 {
 	paragraph_head(c);
 	if (use_indent_) indent_more();
-	foreach (const Sentence::ConstPtr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::ConstPtr& s, c.sentences()) {
 		write_sentence_int(*s);
 	}
 	if (use_indent_) indent_less();
@@ -128,7 +128,7 @@ void CclWriter::paragraph_head()
 void CclWriter::paragraph_head(const Chunk& c)
 {
 	osi() << "<chunk";
-	foreach (const Chunk::attr_map_t::value_type& v, c.attributes()) {
+	BOOST_FOREACH(const Chunk::attr_map_t::value_type& v, c.attributes()) {
 		os() << " " << v.first << "=\"" << v.second << "\"";
 	}
 	os() << ">\n";
diff --git a/libcorpus2/io/conllwriter.cpp b/libcorpus2/io/conllwriter.cpp
index ac6e5943e296e10016614e73888f621112362824..26c3c29a8370d50e88480db16ee4ff7b3304a126 100644
--- a/libcorpus2/io/conllwriter.cpp
+++ b/libcorpus2/io/conllwriter.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include "conllwriter.h"
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <boost/algorithm/string.hpp>
 #include <algorithm>
 
@@ -113,7 +113,7 @@ void ConllWriter::write_token(const Token &t)
 void ConllWriter::write_sentence(const Sentence& s)
 {
 	int i=1;
-	foreach (const Token* t, s.tokens()) {
+	BOOST_FOREACH(const Token* t, s.tokens()) {
 		os()<<i<<"\t";
 		write_token(*t);
 		os()<<"\n";
@@ -124,7 +124,7 @@ void ConllWriter::write_sentence(const Sentence& s)
 
 void ConllWriter::write_chunk(const Chunk &c)
 {
-	foreach (const Sentence::ConstPtr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::ConstPtr& s, c.sentences()) {
 		write_sentence(*s);
 	}
 }
diff --git a/libcorpus2/io/iob-chan.cpp b/libcorpus2/io/iob-chan.cpp
index 4e0f30b4c6f682acda60962ec41fad1deb62e37f..855bf2e8fa0f2dc3e905be1634c5234c1344fb7e 100644
--- a/libcorpus2/io/iob-chan.cpp
+++ b/libcorpus2/io/iob-chan.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/iob-chan.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libcorpus2/ann/annotatedsentence.h>
 
 #include <boost/algorithm/string.hpp>
@@ -32,7 +32,7 @@ IobChanWriter::IobChanWriter(std::ostream& os, const Tagset& tagset,
 		const string_range_vector& params)
 	: TokenWriter(os, tagset, params), warn_on_no_lexemes_(true), force_(true)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "nowarn") {
 			warn_on_no_lexemes_ = false;
@@ -63,7 +63,7 @@ void IobChanWriter::write_sentence(const Sentence& s)
 	if (ann && force_) {
 		// I sincerely apologize
 		AnnotatedSentence* hax = const_cast<AnnotatedSentence*>(ann);
-		foreach(const AnnotatedSentence::chan_map_t::value_type& v, hax->all_channels()) {
+		BOOST_FOREACH(const AnnotatedSentence::chan_map_t::value_type& v, hax->all_channels()) {
 			hax->get_channel(v.first).make_iob_from_segments();
 		}
 	}
@@ -84,7 +84,7 @@ void IobChanWriter::write_sentence(const Sentence& s)
 		}
 		if (ann) {
 			bool first = true;
-			foreach (const AnnotatedSentence::chan_map_t::value_type& v, ann->all_channels()) {
+			BOOST_FOREACH(const AnnotatedSentence::chan_map_t::value_type& v, ann->all_channels()) {
 				if (!first) {
 					os() << ",";
 				}
@@ -100,7 +100,7 @@ void IobChanWriter::write_sentence(const Sentence& s)
 
 void IobChanWriter::write_chunk(const Chunk& c)
 {
-	foreach (const Sentence::ConstPtr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::ConstPtr& s, c.sentences()) {
 		write_sentence(*s);
 	}
 }
@@ -169,7 +169,7 @@ Sentence::Ptr IobChanReader::actual_next_sentence()
 			if (!anns.empty()) {
 				std::vector<std::string> annsplit;
 				boost::algorithm::split(annsplit, anns, boost::is_any_of(","));
-				foreach (const std::string& a, annsplit) {
+				BOOST_FOREACH(const std::string& a, annsplit) {
 					std::vector<std::string> one_ann_split;
 					boost::algorithm::split(one_ann_split, a, boost::is_any_of("-"));
 					if (one_ann_split.size() != 2) {
@@ -192,7 +192,7 @@ Sentence::Ptr IobChanReader::actual_next_sentence()
 		}
 	}
 	if (s) {
-		foreach (const AnnotatedSentence::chan_map_t::value_type& v, s->all_channels()) {
+		BOOST_FOREACH(const AnnotatedSentence::chan_map_t::value_type& v, s->all_channels()) {
 			s->get_channel(v.first).make_segments_from_iob();
 		}
 	}
diff --git a/libcorpus2/io/orthwriter.cpp b/libcorpus2/io/orthwriter.cpp
index 0b5806ae164a83b3786ca053389766b396abd537..c1ce42d6868533beef5d537abe479e6344931519 100644
--- a/libcorpus2/io/orthwriter.cpp
+++ b/libcorpus2/io/orthwriter.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/orthwriter.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -26,7 +26,7 @@ OrthWriter::OrthWriter(std::ostream& os, const Tagset& tagset,
 		const string_range_vector& params)
 	: TokenWriter(os, tagset, params), actual_ws_(false), end_nl_(false)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "actual_ws") {
 			actual_ws_ = true;
@@ -67,7 +67,7 @@ void OrthWriter::write_sentence(const Sentence &s)
 
 void OrthWriter::write_chunk(const Chunk &c)
 {
-	foreach (const Sentence::Ptr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::Ptr& s, c.sentences()) {
 		write_sentence(*s);
 		if (!actual_ws_) {
 			os() << "\n";
diff --git a/libcorpus2/io/plainreader.cpp b/libcorpus2/io/plainreader.cpp
index 28c685032eac50d6481d9662783839a0d38f9367..0376a8f9af7b9bff5cd6c223cbaf7de030f21b00 100644
--- a/libcorpus2/io/plainreader.cpp
+++ b/libcorpus2/io/plainreader.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/plainreader.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
diff --git a/libcorpus2/io/plainwriter.cpp b/libcorpus2/io/plainwriter.cpp
index f75a52f12dc2970fe732b84a120120d05e03e1ca..80da303a2323b15cf1871ded7527cf24c549c7fa 100644
--- a/libcorpus2/io/plainwriter.cpp
+++ b/libcorpus2/io/plainwriter.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/plainwriter.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -27,7 +27,7 @@ PlainWriter::PlainWriter(std::ostream& os, const Tagset& tagset,
 	: TokenWriter(os, tagset, params), ws_(true), disamb_(true)
 	, disamb_only_(false)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "nows") {
 			ws_ = false;
@@ -49,7 +49,7 @@ void PlainWriter::write_token(const Token &t)
 		os() << "\t" << PwrNlp::Whitespace::to_string(t.wa());
 	}
 	os() << "\n";
-	foreach (const Lexeme& lex, t.lexemes()) {
+	BOOST_FOREACH(const Lexeme& lex, t.lexemes()) {
 		if (!disamb_only_ || lex.is_disamb()) {
 			os() << "\t" << lex.lemma_utf8() << "\t"
 				<< tagset().tag_to_string(lex.tag());
@@ -65,7 +65,7 @@ void PlainWriter::write_token(const Token &t)
 }
 void PlainWriter::write_sentence(const Sentence &s)
 {
-	foreach (const Token* t, s.tokens()) {
+	BOOST_FOREACH(const Token* t, s.tokens()) {
 		write_token(*t);
 	}
 	os() << "\n";
@@ -73,7 +73,7 @@ void PlainWriter::write_sentence(const Sentence &s)
 
 void PlainWriter::write_chunk(const Chunk& c)
 {
-	foreach (const boost::shared_ptr<Sentence>& s, c.sentences()) {
+	BOOST_FOREACH(const boost::shared_ptr<Sentence>& s, c.sentences()) {
 		write_sentence(*s);
 	}
 	os() << "\n";
diff --git a/libcorpus2/io/premorphwriter.cpp b/libcorpus2/io/premorphwriter.cpp
index 6a551aa524a69753d7d75668d20bbf4069902a27..c47e84df8090e3b1ad6c5610fbc9fd9106fe72c6 100644
--- a/libcorpus2/io/premorphwriter.cpp
+++ b/libcorpus2/io/premorphwriter.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/premorphwriter.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -26,7 +26,7 @@ PremorphWriter::PremorphWriter(std::ostream& os, const Tagset& tagset,
 		const string_range_vector& params)
 	: TokenWriter(os, tagset, params), cid_(0), force_chunk_(false)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "chunk") {
 			force_chunk_ = true;
@@ -60,7 +60,7 @@ void PremorphWriter::write_sentence(const Sentence &s)
 void PremorphWriter::write_chunk(const Chunk &c)
 {
 	paragraph_head(c);
-	foreach (const Sentence::ConstPtr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::ConstPtr& s, c.sentences()) {
 		write_sentence(*s);
 	}
 	os() << "</chunk>\n";
@@ -97,7 +97,7 @@ void PremorphWriter::paragraph_head()
 void PremorphWriter::paragraph_head(const Chunk& c)
 {
 	os() << "<chunk";
-	foreach (const Chunk::attr_map_t::value_type& v, c.attributes()) {
+	BOOST_FOREACH(const Chunk::attr_map_t::value_type& v, c.attributes()) {
 		os() << " " << v.first << "=\"" << v.second << "\"";
 	}
 	os() << ">\n";
diff --git a/libcorpus2/io/reader.cpp b/libcorpus2/io/reader.cpp
index d1568875fe4f1259c92fb10c4f24c80bd62220a6..8e66fc71f92716bdb3b35de0113181b174971146 100644
--- a/libcorpus2/io/reader.cpp
+++ b/libcorpus2/io/reader.cpp
@@ -193,7 +193,7 @@ std::string TokenReader::reader_help(const std::string& class_id)
 std::vector<std::string> TokenReader::available_reader_types_help()
 {
 	std::vector<std::string> v = available_reader_types();
-	foreach (std::string& id, v) {
+	BOOST_FOREACH(std::string& id, v) {
 		std::stringstream ss;
 		std::map<std::string, std::string>::const_iterator c;
 		c = detail::TokenReaderFactorySingleton::Instance().help.find(id);
@@ -214,7 +214,7 @@ BufferedChunkReader::BufferedChunkReader(const Tagset& tagset)
 
 BufferedChunkReader::~BufferedChunkReader()
 {
-	foreach (Token* t, token_buf_) {
+	BOOST_FOREACH(Token* t, token_buf_) {
 		delete t;
 	}
 }
diff --git a/libcorpus2/io/reader.h b/libcorpus2/io/reader.h
index 562a830ba832c1a5df55c299900d8ecfe5a220f0..dd20bf087b668039f9e93cc1f13032d8dd5124e4 100644
--- a/libcorpus2/io/reader.h
+++ b/libcorpus2/io/reader.h
@@ -216,7 +216,7 @@ T* stream_reader_creator(const Tagset& tagset, std::istream& is,
 	const string_range_vector& params)
 {
 	T* reader = new T(tagset, is);
-	foreach (const string_range& sr, params) {
+	BOOST_FOREACH(const string_range& sr, params) {
 		reader->set_option(boost::copy_range<std::string>(sr));
 	}
 	reader->validate();
@@ -232,7 +232,7 @@ T* path_reader_creator(const Tagset& tagset, const std::string& path,
 	const string_range_vector& params)
 {
 	T* reader = new T(tagset, path);
-	foreach (const string_range& sr, params) {
+	BOOST_FOREACH(const string_range& sr, params) {
 		reader->set_option(boost::copy_range<std::string>(sr));
 	}
 	reader->validate();
diff --git a/libcorpus2/io/rft.cpp b/libcorpus2/io/rft.cpp
index bc3ad0bd5072ef2cb53485aeda3b2c742b084f0b..b35b9a3eed550703178d08d616d513531f4e84b9 100644
--- a/libcorpus2/io/rft.cpp
+++ b/libcorpus2/io/rft.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/rft.h>
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/predicate.hpp>
@@ -33,7 +33,7 @@ RftWriter::RftWriter(std::ostream& os, const Tagset& tagset,
 	: TokenWriter(os, tagset, params), warn_on_no_lexemes_(true)
 	, mbt_dialect_(false), colon_(false), opt_(false), alltags_(false)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "nowarn") {
 			warn_on_no_lexemes_ = false;
@@ -73,7 +73,7 @@ void RftWriter::write_token(const Token& t)
 			std::cerr << "No lexemes for token!";
 		}
 	} else if (alltags_) {
-		foreach (const Lexeme& lex, t.lexemes()) {
+		BOOST_FOREACH(const Lexeme& lex, t.lexemes()) {
 			os() << "\t";
 			write_tag(lex.tag());
 		}
@@ -87,7 +87,7 @@ void RftWriter::write_token(const Token& t)
 
 void RftWriter::write_sentence(const Sentence& s)
 {
-	foreach (const Token* t, s.tokens()) {
+	BOOST_FOREACH(const Token* t, s.tokens()) {
 		write_token(*t);
 	}
 	if (mbt_dialect_) {
@@ -98,7 +98,7 @@ void RftWriter::write_sentence(const Sentence& s)
 
 void RftWriter::write_chunk(const Chunk& c)
 {
-	foreach (const Sentence::ConstPtr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::ConstPtr& s, c.sentences()) {
 		write_sentence(*s);
 	}
 }
diff --git a/libcorpus2/io/sax.h b/libcorpus2/io/sax.h
index 6535c7f245fe14a65c38c6559d3faa9787c6af94..4ea37df7a1055cc5a1a81d8dc80575c2522911bc 100644
--- a/libcorpus2/io/sax.h
+++ b/libcorpus2/io/sax.h
@@ -19,7 +19,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/xcescommon.h>
 #include <libcorpus2/util/tokentimer.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libxml++/parsers/saxparser.h>
 #include <vector>
 
diff --git a/libcorpus2/io/statwriter.cpp b/libcorpus2/io/statwriter.cpp
index 36d82159abb158a2ca83a4137fee73d0bb9da5cd..94b1bbcf86b81be87e03bddeea3c432fb816c293 100644
--- a/libcorpus2/io/statwriter.cpp
+++ b/libcorpus2/io/statwriter.cpp
@@ -17,7 +17,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/io/statwriter.h>
 #include <libcorpus2/ann/annotatedsentence.h>
 #include <iomanip>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -44,13 +44,13 @@ void StatWriter::write_token(const Token& t)
 void StatWriter::write_sentence(const Sentence& s)
 {
 	os() << std::setw(8) << "tokens" << " ";
-	foreach (const Token* t, s.tokens()) {
+	BOOST_FOREACH(const Token* t, s.tokens()) {
 		write_token(*t);
 	}
 	os() << "\n";
 	const AnnotatedSentence* as = dynamic_cast<const AnnotatedSentence*>(&s);
 	if (as) {
-		foreach (const AnnotatedSentence::chan_map_t::value_type& vt, as->all_channels()) {
+		BOOST_FOREACH(const AnnotatedSentence::chan_map_t::value_type& vt, as->all_channels()) {
 			os() << std::setw(8) << vt.first << " ";
 			os() << vt.second.dump_alpha();
 			os() << "\n";
@@ -61,7 +61,7 @@ void StatWriter::write_sentence(const Sentence& s)
 
 void StatWriter::write_chunk(const Chunk& c)
 {
-	foreach (const Sentence::Ptr s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::Ptr s, c.sentences()) {
 		write_sentence(*s);
 	}
 	os() << "\n";
diff --git a/libcorpus2/io/writer.cpp b/libcorpus2/io/writer.cpp
index 166ae62d4f48ed475efce0a3368ae0235cd30ef1..13a41d8d6cb997847b218784b60a754007e79e4d 100644
--- a/libcorpus2/io/writer.cpp
+++ b/libcorpus2/io/writer.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/writer.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <boost/algorithm/string.hpp>
 #include <libcorpus2/exception.h>
 #include <libcorpus2/io/pathwriter.h>
@@ -144,7 +144,7 @@ std::string TokenWriter::writer_help(const std::string& class_id)
 std::vector<std::string> TokenWriter::available_writer_types_help()
 {
 	std::vector<std::string> v = available_writer_types();
-	foreach (std::string& id, v) {
+	BOOST_FOREACH(std::string& id, v) {
 		std::stringstream ss;
 		std::map<std::string, std::string>::const_iterator c;
 		c = detail::TokenWriterFactorySingleton::Instance().help.find(id);
diff --git a/libcorpus2/io/xces.cpp b/libcorpus2/io/xces.cpp
index 4baacb60f2d73c226f7254125bb88c67a54a4803..c527fb7bd67af5283f2811ba1298a0a13baf621e 100644
--- a/libcorpus2/io/xces.cpp
+++ b/libcorpus2/io/xces.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/xces.h>
 #include <libcorpus2/io/reader.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libxml++/libxml++.h>
 #include <libxml++/nodes/node.h>
 #include <libxml++/nodes/element.h>
diff --git a/libcorpus2/io/xcescommon.cpp b/libcorpus2/io/xcescommon.cpp
index 3aea58704ac100d2b05194593a18c2c086c2f9e1..00865fae5d9d79601fa6165d010f8d2213dcb6fc 100644
--- a/libcorpus2/io/xcescommon.cpp
+++ b/libcorpus2/io/xcescommon.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/xcescommon.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <sstream>
 
 namespace Corpus2 {
@@ -68,19 +68,19 @@ void token_as_xces_xml_body(std::ostream& os, const Tagset& tagset,
 	encode_xml_entities_into(os, t.orth_utf8());
 	os << "</orth>\n";
 	if (!sort) {
-		foreach (const Lexeme& l, t.lexemes()) {
+		BOOST_FOREACH(const Lexeme& l, t.lexemes()) {
 			lexeme_as_xces_xml(osi(os, indent), tagset, l, output_disamb);
 		}
 	} else {
 		std::stringstream ss;
 		std::vector<std::string> vss;
-		foreach (const Lexeme& l, t.lexemes()) {
+		BOOST_FOREACH(const Lexeme& l, t.lexemes()) {
 			lexeme_as_xces_xml(osi(ss, indent), tagset, l, output_disamb);
 			vss.push_back(ss.str());
 			ss.str("");
 		}
 		std::sort(vss.begin(), vss.end());
-		foreach (const std::string& s, vss) {
+		BOOST_FOREACH(const std::string& s, vss) {
 			os << s;
 		}
 	}
diff --git a/libcorpus2/io/xcesreader.cpp b/libcorpus2/io/xcesreader.cpp
index 87bfbd7b12bb165d8dd1049a3f0cd4171353454a..e2bf6b54e9c90b1e448f4cfee363aaf2e24a093a 100644
--- a/libcorpus2/io/xcesreader.cpp
+++ b/libcorpus2/io/xcesreader.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/xcesreader.h>
 #include <libcorpus2/io/xmlreader.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libxml++/libxml++.h>
 #include <libxml2/libxml/parser.h>
 #include <boost/make_shared.hpp>
diff --git a/libcorpus2/io/xcesvalidate.cpp b/libcorpus2/io/xcesvalidate.cpp
index 818fe0a8a426439a0190636cd5783b36c3ee73b3..9e124549200ee086c01c1df5d6c88a302bbbf7cc 100644
--- a/libcorpus2/io/xcesvalidate.cpp
+++ b/libcorpus2/io/xcesvalidate.cpp
@@ -17,7 +17,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/io/xcesvalidate.h>
 #include <libcorpus2/tagset.h>
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libxml++/libxml++.h>
 #include <libxml++/nodes/node.h>
 #include <libxml++/nodes/element.h>
diff --git a/libcorpus2/io/xceswriter.cpp b/libcorpus2/io/xceswriter.cpp
index afb01ec9617b3f2113ca35b0814041b96e4182ed..2b6d30606171cbd0f1a9dd36dc0507b6e03b6c04 100644
--- a/libcorpus2/io/xceswriter.cpp
+++ b/libcorpus2/io/xceswriter.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/xcescommon.h>
 #include <libcorpus2/io/xceswriter.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -29,7 +29,7 @@ XcesWriter::XcesWriter(std::ostream& os, const Tagset& tagset,
 	, force_chunk_(false)
 	, split_chunks_on_newlines_(false)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "chunk") {
 			force_chunk_ = true;
@@ -57,7 +57,7 @@ void XcesWriter::write_sentence(const Sentence& s)
 void XcesWriter::write_chunk(const Chunk &c)
 {
 	bool new_chunk = true;
-	foreach (const Sentence::ConstPtr& s, c.sentences()) {
+	BOOST_FOREACH(const Sentence::ConstPtr& s, c.sentences()) {
 		if (split_chunks_on_newlines_ && !s->tokens().empty()) {
 			const Token* first = s->first_token();
 			if (first->wa() == PwrNlp::Whitespace::ManyNewlines) {
@@ -114,7 +114,7 @@ void XcesWriter::do_footer()
 //void XcesWriter::paragraph_head(const Chunk& c)
 //{
 //	osi() << "<chunk";
-//	foreach (const Chunk::attr_map_t::value_type& v, c.attributes()) {
+//	BOOST_FOREACH(const Chunk::attr_map_t::value_type& v, c.attributes()) {
 //		os() << " " << v.first << "=\"" << v.second << "\"";
 //	}
 //	os() << ">\n";
diff --git a/libcorpus2/io/xmlreader.cpp b/libcorpus2/io/xmlreader.cpp
index 3aa6917c38906f118f6020123c5990745a88c33f..0816839e69873f82ec81219d13819b36c30b193f 100644
--- a/libcorpus2/io/xmlreader.cpp
+++ b/libcorpus2/io/xmlreader.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/io/xmlreader.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libxml++/libxml++.h>
 #include <libxml2/libxml/parser.h>
 #include <boost/make_shared.hpp>
@@ -44,7 +44,7 @@ XmlReader::~XmlReader()
 std::string XmlReader::get_type_from_attributes(const AttributeList& attributes) const
 {
 	std::string type;
-	foreach (const Attribute& a, attributes) {
+	BOOST_FOREACH(const Attribute& a, attributes) {
 		if (a.name == "type") {
 			type = a.value;
 		}
@@ -54,7 +54,7 @@ std::string XmlReader::get_type_from_attributes(const AttributeList& attributes)
 
 std::string XmlReader::get_id_from_attributes(const AttributeList& attributes) const
 {
-	foreach (const Attribute& a, attributes) {
+	BOOST_FOREACH(const Attribute& a, attributes) {
 		if (a.name == "id") {
 			return a.value;
 		}
@@ -141,7 +141,7 @@ void XmlReader::start_chunk(const AttributeList& attributes)
 		start_sentence(attributes);
 		chunkless_ = true;
 	} else {
-		foreach (const Attribute& a, attributes) {
+		BOOST_FOREACH(const Attribute& a, attributes) {
 			chunk_->set_attribute(a.name, a.value);
 		}
 		state_ = STATE_CHUNK;
@@ -171,14 +171,14 @@ void XmlReader::start_lexeme(const AttributeList &attributes)
 	assert(tok_ != NULL);
 	bool is_disamb = false;
 	if (!disamb_sh_) {
-		foreach (const Attribute& a, attributes) {
+		BOOST_FOREACH(const Attribute& a, attributes) {
 			if (a.name == "disamb" && a.value == "1") {
 				is_disamb = true;
 			}
 		}
 	} else {
 		is_disamb = true;
-		foreach (const Attribute& a, attributes) {
+		BOOST_FOREACH(const Attribute& a, attributes) {
 			if (a.name == "disamb_sh" && a.value == "0") {
 				is_disamb = false;
 			}
diff --git a/libcorpus2/io/xmlreader.h b/libcorpus2/io/xmlreader.h
index 7e7f8ea62595f46823d3297a00f97639428e9635..9f3983b3bb7c80b358a2f57c30e5268df4fe46e9 100644
--- a/libcorpus2/io/xmlreader.h
+++ b/libcorpus2/io/xmlreader.h
@@ -23,7 +23,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <deque>
 #include <boost/scoped_ptr.hpp>
 #include <libcorpus2/io/sax.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
diff --git a/libcorpus2/io/xmlwriter.cpp b/libcorpus2/io/xmlwriter.cpp
index 8f41c2b4e65657a81f8251719f9619a43c5d975d..78f6a4d59d0b9b10b6775a898275a0a509ca9efe 100644
--- a/libcorpus2/io/xmlwriter.cpp
+++ b/libcorpus2/io/xmlwriter.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <libcorpus2/io/xcescommon.h>
 #include <libcorpus2/io/xmlwriter.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -26,7 +26,7 @@ XmlWriter::XmlWriter(std::ostream& os, const Tagset& tagset,
 	, use_indent_(true), output_disamb_(true)
 	, sort_tags_(false), whitespace_info_(false)
 {
-	foreach (const string_range& param, params) {
+	BOOST_FOREACH(const string_range& param, params) {
 		std::string p = boost::copy_range<std::string>(param);
 		if (p == "flat") {
 			use_indent_ = false;
@@ -54,7 +54,7 @@ void XmlWriter::write_token(const Token &t)
 void XmlWriter::write_sentence(const Sentence& s)
 {
 	if (use_indent_) indent_more();
-	foreach (const Token* t, s.tokens()) {
+	BOOST_FOREACH(const Token* t, s.tokens()) {
 		write_token(*t);
 	}
 	if (use_indent_) indent_less();
@@ -79,7 +79,7 @@ void XmlWriter::paragraph_head()
 void XmlWriter::paragraph_head(const Chunk& c)
 {
 	osi() << "<chunk";
-	foreach (const Chunk::attr_map_t::value_type& v, c.attributes()) {
+	BOOST_FOREACH(const Chunk::attr_map_t::value_type& v, c.attributes()) {
 		os() << " " << v.first << "=\"" << v.second << "\"";
 	}
 	os() << ">\n";
diff --git a/libcorpus2/sentence.cpp b/libcorpus2/sentence.cpp
index 10b3b7db627b57c8fc407cbd3a2a52cff921cfff..bb76754d3ad3bfc78e283da5babbd4c3df586baa 100644
--- a/libcorpus2/sentence.cpp
+++ b/libcorpus2/sentence.cpp
@@ -26,7 +26,7 @@ Sentence::Sentence(const std::string &id)
 
 Sentence::~Sentence()
 {
-	foreach (const Token* t, tokens_) {
+	BOOST_FOREACH(const Token* t, tokens_) {
 		delete t;
 	}
 }
@@ -34,7 +34,7 @@ Sentence::~Sentence()
 Sentence::Ptr Sentence::clone_shared() const
 {
 	Sentence::Ptr s = boost::make_shared<Sentence>();
-	foreach (const Token* t, tokens_) {
+	BOOST_FOREACH(const Token* t, tokens_) {
 		s->append(t->clone());
 	}
 	return s;
diff --git a/libcorpus2/tag.cpp b/libcorpus2/tag.cpp
index 81a7a9a52cf0ca4423451632e8c22737f797ddbb..94c4b76edcaaf76ad2245308db597fc86604d688 100644
--- a/libcorpus2/tag.cpp
+++ b/libcorpus2/tag.cpp
@@ -17,7 +17,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/tag.h>
 #include <libcorpus2/tagsetmanager.h>
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libpwrutils/util.h>
 
 #include <cstring>
diff --git a/libcorpus2/tagging.cpp b/libcorpus2/tagging.cpp
index 9b65484f8f738955bad78ef10fa9efc7a187b966..785edf9ffe411dd9fd138df371a5171fcdb3eebb 100644
--- a/libcorpus2/tagging.cpp
+++ b/libcorpus2/tagging.cpp
@@ -18,7 +18,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/lexeme.h>
 
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libpwrutils/bitset.h>
 
 namespace Corpus2 {
@@ -45,7 +45,7 @@ Tag get_attribute_mask(const Tagset& tagset, std::string attr_name)
 Tag mask_token(const Token& token, const Tag& mask, bool disamb_only)
 {
 	Tag t;
-	foreach (const Corpus2::Lexeme& lexeme, token.lexemes()) {
+	BOOST_FOREACH(const Corpus2::Lexeme& lexeme, token.lexemes()) {
 		if(lexeme.is_disamb() || !disamb_only) {
 			t.combine_with(lexeme.tag().get_masked(mask));
 		}
@@ -78,7 +78,7 @@ bool select_preferred_disamb(const Tagset& tagset, Token* token)
 
 void select_preferred_lexeme(const Tagset& tagset, Token* token)
 {
-	foreach (Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(Lexeme& lex, token->lexemes()) {
 		lex.set_disamb(true);
 	}
 	if (token->lexemes().size() > 1) {
@@ -94,7 +94,7 @@ bool select_preferred_disamb_tag(const Tagset& tagset, Token* token)
 	if(!prototypical.is_disamb()) {
 		return false; // disamb would've taken precedence => no disamb at all
 	}
-	foreach (Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(Lexeme& lex, token->lexemes()) {
 		if (lex.tag() != prototypical.tag()) {
 			lex.set_disamb(false);
 		}
@@ -104,13 +104,13 @@ bool select_preferred_disamb_tag(const Tagset& tagset, Token* token)
 
 void select_preferred_tag(const Tagset& tagset, Token* token)
 {
-	foreach (Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(Lexeme& lex, token->lexemes()) {
 		lex.set_disamb(true);
 	}
 	if (token->lexemes().size() > 1) {
 		const Corpus2::Tag tag_wanted = token->get_preferred_lexeme(tagset).tag();
 		std::vector<Lexeme> wanted;
-		foreach (const Lexeme& lex, token->lexemes()) {
+		BOOST_FOREACH(const Lexeme& lex, token->lexemes()) {
 			if (lex.tag() == tag_wanted) {
 				wanted.push_back(lex);
 			}
@@ -122,14 +122,14 @@ void select_preferred_tag(const Tagset& tagset, Token* token)
 
 void expand_optional_attrs(const Tagset& tagset, Token* token)
 {
-	foreach (Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(Lexeme& lex, token->lexemes()) {
 		lex.set_tag(tagset.expand_optional_attrs(lex.tag()));
 	}
 }
 
 void select_singular_tags(const Tagset& tagset, Token* token)
 {
-	foreach (Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(Lexeme& lex, token->lexemes()) {
 		lex.set_tag(tagset.select_singular(lex.tag()));
 	}
 }
@@ -138,7 +138,7 @@ bool disambiguate_equal(Token* token, const Tag& mask_where,
 						const Tag& mask_wanted)
 {
 	std::vector<Lexeme> wanted;
-	foreach (const Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(const Lexeme& lex, token->lexemes()) {
 		Tag mask_theirs = lex.tag().get_masked(mask_where);
 		if (mask_theirs == mask_wanted) {
 			wanted.push_back(lex);
@@ -155,7 +155,7 @@ bool disambiguate_subset(Token* token, const Tag& mask_where,
 						const Tag& mask_wanted)
 {
 	std::vector<Lexeme> wanted;
-	foreach (const Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(const Lexeme& lex, token->lexemes()) {
 		Tag mask_theirs = lex.tag().get_masked(mask_where);
 		if (mask_theirs.get_masked(mask_wanted) == mask_theirs) {
 			wanted.push_back(lex);
@@ -170,7 +170,7 @@ bool disambiguate_subset(Token* token, const Tag& mask_where,
 
 void set_disambs(Token *token, const Tag& wanted_tag)
 {
-	foreach (Lexeme& lex, token->lexemes()) {
+	BOOST_FOREACH(Lexeme& lex, token->lexemes()) {
 		lex.set_disamb(lex.tag() == wanted_tag);
 	}
 }
diff --git a/libcorpus2/tagset.cpp b/libcorpus2/tagset.cpp
index 4ec7b824be5a5df149702ba3f61d9864bab636b2..54bce5fc07a7807ede69d4d120abecf6b2ba0475 100644
--- a/libcorpus2/tagset.cpp
+++ b/libcorpus2/tagset.cpp
@@ -21,7 +21,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/util/settings.h>
 #include <libcorpus2/tagsetparser.h>
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libpwrutils/util.h>
 
 #include <boost/algorithm/string.hpp>
@@ -136,7 +136,7 @@ Tag Tagset::parse_symbol_string(const std::string &s) const
 	Tag t;
 	std::vector<std::string> parts;
 	boost::algorithm::split(parts, s, boost::is_any_of(","));
-	foreach (const std::string& ss, parts) {
+	BOOST_FOREACH(const std::string& ss, parts) {
 		t.combine_with(parse_symbol(ss));
 	}
 	return t;
@@ -201,7 +201,7 @@ void Tagset::parse_tag(const string_range_vector &fields,
 			boost::algorithm::split(dots, r, boost::is_any_of("."));
 			std::vector<mask_t> values;
 			mask_t amask;
-			foreach (string_range& dot, dots) {
+			BOOST_FOREACH(string_range& dot, dots) {
 				if (dot.empty()) continue;
 				mask_t v = get_value_mask(boost::copy_range<std::string>(dot));
 				mask_t curr = get_attribute_mask(get_value_attribute(v));
@@ -245,7 +245,7 @@ void Tagset::parse_tag(const string_range_vector &fields,
 			append_to_multi_tag(all_variants, attribute_values_[attr], amask);
 		} // else empty, do nothing
 	}
-	foreach (mask_t variant, all_variants) {
+	BOOST_FOREACH(mask_t variant, all_variants) {
 		sink(make_tag(pos_idx, variant, mode));
 	}
 }
@@ -331,7 +331,7 @@ Tag Tagset::make_tag(idx_t pos_idx, mask_t values,
 	if (mode & ParseCheckRequired) {
 		size_t has_req = PwrNlp::count_bits_set(required_values & values);
 		if (has_req != pos_required_attributes_idx_[pos_idx].size()) {
-			foreach (idx_t a, get_pos_attributes(pos_idx)) {
+			BOOST_FOREACH(idx_t a, get_pos_attributes(pos_idx)) {
 				if (pos_requires_attribute(pos_idx, a)) {
 					mask_t amask = get_attribute_mask(a);
 					if ((values & amask).none()) {
@@ -444,7 +444,7 @@ std::string Tagset::tag_to_string(const Tag &tag) const
 	idx_t pos_idx = tag.get_pos_index();
 	ss << get_pos_name(pos_idx);
 	const std::vector<idx_t>& attrs = get_pos_attributes(pos_idx);
-	foreach (const idx_t& a, attrs) {
+	BOOST_FOREACH(const idx_t& a, attrs) {
 		mask_t value = tag.get_values_for(get_attribute_mask(a));
 		if (pos_requires_attribute(pos_idx, a) || value.any()) {
 			ss << ":";
@@ -471,7 +471,7 @@ std::string Tagset::tag_to_no_opt_string(const Tag &tag) const
 	idx_t pos_idx = tag.get_pos_index();
 	ss << get_pos_name(pos_idx);
 	const std::vector<idx_t>& attrs = get_pos_attributes(pos_idx);
-	foreach (const idx_t& a, attrs) {
+	BOOST_FOREACH(const idx_t& a, attrs) {
 		mask_t value = tag.get_values_for(get_attribute_mask(a));
 		ss << ":";
 		if (value.any()) {
@@ -487,7 +487,7 @@ std::vector<std::string> Tagset::tag_to_symbol_string_vector(const Tag& tag,
 		bool compress_attributes /* = true */) const
 {
 	std::vector<std::string> ret;
-	foreach (mask_t p, PwrNlp::set_bits(tag.get_pos())) {
+	BOOST_FOREACH(mask_t p, PwrNlp::set_bits(tag.get_pos())) {
 		ret.push_back(get_pos_name(p));
 	}
 	mask_t vals = tag.get_values();
@@ -500,7 +500,7 @@ std::vector<std::string> Tagset::tag_to_symbol_string_vector(const Tag& tag,
 			}
 		}
 	}
-	foreach (mask_t p, PwrNlp::set_bits(vals)) {
+	BOOST_FOREACH(mask_t p, PwrNlp::set_bits(vals)) {
 		ret.push_back(get_value_name(p));
 	}
 	return ret;
@@ -516,7 +516,7 @@ std::string Tagset::tag_to_symbol_string(const Tag& tag,
 size_t Tagset::tag_size(const Tag& tag) const
 {
 	size_t s = PwrNlp::count_bits_set(tag.get_pos());
-	foreach (mask_t attribute_mask, all_attribute_masks()) {
+	BOOST_FOREACH(mask_t attribute_mask, all_attribute_masks()) {
 		mask_t values = tag.get_values_for(attribute_mask);
 		size_t x = PwrNlp::count_bits_set(values);
 		if (x > 1) {
@@ -529,7 +529,7 @@ size_t Tagset::tag_size(const Tag& tag) const
 bool Tagset::tag_is_singular(const Tag& tag) const
 {
 	if (PwrNlp::count_bits_set(tag.get_pos()) > 1) return false;
-	foreach (mask_t attribute_mask, all_attribute_masks()) {
+	BOOST_FOREACH(mask_t attribute_mask, all_attribute_masks()) {
 		mask_t values = tag.get_values_for(attribute_mask);
 		if (PwrNlp::count_bits_set(values) > 1) return false;
 	}
@@ -553,7 +553,7 @@ std::vector<Tag> Tagset::split_tag(const Tag& tag) const
 		if (ma.any()) {
 			bool dup = false;
 			size_t sz = tags.size();
-			foreach (mask_t vm, get_attribute_values(a)) {
+			BOOST_FOREACH(mask_t vm, get_attribute_values(a)) {
 				if ((v & vm).any()) {
 					if (dup) {
 						for (size_t i = 0; i < sz; ++i) {
@@ -588,7 +588,7 @@ Tag Tagset::select_singular(const Tag& tag) const
 	new_tag.set_pos(pos_mask);
 	// now iterate over attrs
 	const std::vector<idx_t>& attrs = get_pos_attributes(pos_idx);
-	foreach (const idx_t& a, attrs) {
+	BOOST_FOREACH(const idx_t& a, attrs) {
 		mask_t attr_mask = get_attribute_mask(a);
 		mask_t value = tag.get_values_for(attr_mask);
 		// check if the attr is multi-value
@@ -616,7 +616,7 @@ Tag Tagset::expand_optional_attrs(const Tag& tag) const
 {
 	Tag new_tag(tag);
 	idx_t pos_idx = tag.get_pos_index();
-	foreach (idx_t a, get_pos_attributes(pos_idx)) {
+	BOOST_FOREACH(idx_t a, get_pos_attributes(pos_idx)) {
 		mask_t attr_mask = get_attribute_mask(a);
 		mask_t value = tag.get_values_for(attr_mask);
 		if (!value.any()) { // no value given
@@ -851,7 +851,7 @@ void Tagset::lexemes_into_token(Token& tok, const UnicodeString& lemma,
 	func = boost::bind(&Token::add_lexeme, boost::ref(tok),
 			boost::bind(lex, _1));
 
-	foreach (const string_range& o, options) {
+	BOOST_FOREACH(const string_range& o, options) {
 		parse_tag(o, func);
 	}
 }
diff --git a/libcorpus2/tagset.h b/libcorpus2/tagset.h
index 18151c60f7eb8d785ffc7380b9d46d6c6bab7bc1..03d09cfb6c508b83b603cd0c1d141451fe21f1bf 100644
--- a/libcorpus2/tagset.h
+++ b/libcorpus2/tagset.h
@@ -579,7 +579,7 @@ public:
 
 	/// Range getter for all the valid POS masks, in order, compatible with
 	/// boost's foreach
-	/// It is possible to use a foreach (mask_t m, tagset.all_*_masks()) {...}
+	/// It is possible to use a BOOST_FOREACH(mask_t m, tagset.all_*_masks()) {...}
 	boost::iterator_range<mask_iterator> all_pos_masks() const {
 		return boost::iterator_range<mask_iterator>(static_cast<mask_t>(1),
 				static_cast<mask_t>(1) << pos_count());
diff --git a/libcorpus2/tagsetmanager.cpp b/libcorpus2/tagsetmanager.cpp
index 0f3fe430ae0afc0c415bf5931999d3d32dda490c..2c6659a4df8e2bc16a5c1f7e2bb6fc29823d6ef1 100644
--- a/libcorpus2/tagsetmanager.cpp
+++ b/libcorpus2/tagsetmanager.cpp
@@ -17,7 +17,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libcorpus2/tagsetmanager.h>
 #include <libcorpus2/tagsetparser.h>
 #include <libcorpus2/util/settings.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <fstream>
 #include <iostream>
 #include <sstream>
diff --git a/libcorpus2/tagsetparser.cpp b/libcorpus2/tagsetparser.cpp
index 0c3b16cc162526804eda76a2aac77e6380fe5eca..8f102cdf0ab9416f575b69fe9433c2e1d3f486e7 100644
--- a/libcorpus2/tagsetparser.cpp
+++ b/libcorpus2/tagsetparser.cpp
@@ -18,7 +18,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <sstream>
 #include <boost/algorithm/string.hpp>
 #include <fstream>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 namespace Corpus2 {
 
@@ -83,7 +83,7 @@ Tagset TagsetParser::load_ini(std::istream &is)
 			std::deque<std::string>& avalues = vmap[v[0]];
 			v.pop_front();
 			avalues = v;
-			foreach (const std::string& s, v) {
+			BOOST_FOREACH(const std::string& s, v) {
 				if (!symbols.insert(s).second) {
 					throw TagsetParseError("Duplicate symbol", line_no, s);
 				}
@@ -100,12 +100,12 @@ Tagset TagsetParser::load_ini(std::istream &is)
 	mask_t current_value = 1;
 	std::vector<std::string> vec;
 	idx_t current_attribute_index = 0;
-	foreach (const vmap_t::value_type v, vmap) {
+	BOOST_FOREACH(const vmap_t::value_type v, vmap) {
 		mask_t attribute_mask = 0;
 		vec.push_back(v.first);
 		tagset.attribute_values_.resize(
 				tagset.attribute_values_.size() + 1);
-		foreach (const std::string& s, v.second) {
+		BOOST_FOREACH(const std::string& s, v.second) {
 			tagset.attribute_values_.back().push_back(current_value);
 			tagset.value_mask_to_attribute_index_.insert(
 					std::make_pair(current_value, current_attribute_index));
@@ -140,7 +140,7 @@ Tagset TagsetParser::load_ini(std::istream &is)
 			std::vector<bool>& req_mask = reqmap[v[0]];
 			req_mask.resize(tagset.attribute_dict_.size());
 			v.pop_front();
-			foreach (std::string s, v) {
+			BOOST_FOREACH(std::string s, v) {
 				if (s.empty()) continue;
 				bool required = true;
 				if (s[0] == '[' && s[s.size() - 1] == ']') {
@@ -171,7 +171,7 @@ Tagset TagsetParser::load_ini(std::istream &is)
 	}
 
 	vec.clear();
-	foreach (const pmap_t::value_type v, pmap) {
+	BOOST_FOREACH(const pmap_t::value_type v, pmap) {
 		vec.push_back(v.first);
 		mask_t valid(0);
 		mask_t required(0);
@@ -180,7 +180,7 @@ Tagset TagsetParser::load_ini(std::istream &is)
 				tagset.pos_required_attributes_idx_.size() + 1);
 		tagset.pos_valid_attributes_.push_back(
 				std::vector<bool>(tagset.attribute_values_.size(), false));
-		foreach (idx_t a, v.second) {
+		BOOST_FOREACH(idx_t a, v.second) {
 			valid |= tagset.get_attribute_mask(a);
 			if (reqmap[v.first][a]) {
 				required |= tagset.get_attribute_mask(a);
@@ -212,7 +212,7 @@ void TagsetParser::save_ini(const Tagset &tagset, std::ostream &os)
 	idx_t a(0);
 	while (tagset.attribute_dict_.is_id_valid(a)) {
 		os << tagset.attribute_dict_.get_string(a) << "\t= ";
-		foreach (mask_t m, tagset.get_attribute_values(a)) {
+		BOOST_FOREACH(mask_t m, tagset.get_attribute_values(a)) {
 			os << tagset.get_value_name(m) << " ";
 		}
 		os << "\n";
@@ -222,7 +222,7 @@ void TagsetParser::save_ini(const Tagset &tagset, std::ostream &os)
 	idx_t p(0);
 	while (tagset.pos_dict_.is_id_valid(p)) {
 		os << tagset.pos_dict_.get_string(p) << "\t= ";
-		foreach (idx_t a, tagset.get_pos_attributes(p)) {
+		BOOST_FOREACH(idx_t a, tagset.get_pos_attributes(p)) {
 			if (tagset.pos_required_attributes_[p][a]) {
 				os << tagset.attribute_dict_.get_string(a) << " ";
 			} else {
diff --git a/libcorpus2/token.cpp b/libcorpus2/token.cpp
index 63352b7392e83325d796f124f0c5fe74e73025b0..857980e9500aa66b0c8ff8bfb1077f74a87f482d 100644
--- a/libcorpus2/token.cpp
+++ b/libcorpus2/token.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/token.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libcorpus2/tokenmetadata.h>
 #include <sstream>
 #include <boost/bind.hpp>
@@ -144,7 +144,7 @@ bool Token::orth_pos_match(mask_t pos, const UnicodeString &orth) const
 		if (orth.caseCompare(orth_, 0) != 0) return false;
 	}
 	if (pos.any()) {
-		foreach (const Lexeme& lex, lexemes_) {
+		BOOST_FOREACH(const Lexeme& lex, lexemes_) {
 			if (lex.tag().get_pos() != pos) return false;
 		}
 	}
diff --git a/libcorpus2/tokenmetadata.cpp b/libcorpus2/tokenmetadata.cpp
index 41ce6b852417ac486b37719957ba0a55c88e5ec8..4a1b5a3474c643558be3f22e4830defa1a1c5700 100644
--- a/libcorpus2/tokenmetadata.cpp
+++ b/libcorpus2/tokenmetadata.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 #include <libcorpus2/tokenmetadata.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <boost/make_shared.hpp>
 
 namespace Corpus2 {
diff --git a/libcorpus2/util/symboldictionary.h b/libcorpus2/util/symboldictionary.h
index 5258a7342cb73b8c8ae4f0369d087fcc792e2628..4b6b530349bcf2f568bfc2c5bc481243d7c8e74e 100644
--- a/libcorpus2/util/symboldictionary.h
+++ b/libcorpus2/util/symboldictionary.h
@@ -77,7 +77,7 @@ public:
 	/// If the index is not valid, an empty string is returned.
 	const std::string& get_string(IndexT id) const;
 
-	/// Plumbing allow foreach() iteration through the dictionary objects
+	/// Plumbing allow BOOST_FOREACH() iteration through the dictionary objects
 	typedef typename std::vector<std::string>::iterator iterator;
 	typedef typename std::vector<std::string>::const_iterator
 			const_iterator;
diff --git a/libcorpus2_whole/io/relreader.cpp b/libcorpus2_whole/io/relreader.cpp
index 53c46ececd1a20a720302134f3dbf85c1495717c..110d07869a2a5a2673bef2085e645a04ae27efc6 100644
--- a/libcorpus2_whole/io/relreader.cpp
+++ b/libcorpus2_whole/io/relreader.cpp
@@ -14,7 +14,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 	See the LICENSE.CORPUS2, LICENSE.POLIQARP, COPYING.LESSER and COPYING files for more details.
 */
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libcorpus2/exception.h>
 #include <libcorpus2_whole/io/relreader.h>
 
@@ -191,7 +191,7 @@ void RelationReader::parse_direction(const AttributeList& attributes,
 std::string RelationReader::get_attribute_value(
 		const AttributeList& attributes, const std::string& name)
 {
-	foreach (const Attribute& a, attributes) {
+	BOOST_FOREACH(const Attribute& a, attributes) {
 		if (a.name == name) {
 			return a.value;
 		}
diff --git a/libcorpus2_whole/io/relwriter.cpp b/libcorpus2_whole/io/relwriter.cpp
index 1796c28b35e200ccf8c9cec270da64c351687809..89afe616ad40c078dde8db8334f8323faa328804 100755
--- a/libcorpus2_whole/io/relwriter.cpp
+++ b/libcorpus2_whole/io/relwriter.cpp
@@ -15,7 +15,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libcorpus2/exception.h>
 #include <libcorpus2_whole/io/relwriter.h>
 
@@ -42,7 +42,7 @@ void RelationWriter::write(const std::vector< boost::shared_ptr<Relation> >& rel
 	ofs<<"<relations>\n";
 	
 	//relations
-	foreach (const boost::shared_ptr<Relation>& r, relations){
+	BOOST_FOREACH(const boost::shared_ptr<Relation>& r, relations){
 		ofs<<"   <rel name=\"";
 		ofs<<r->name().c_str()<<"\">"<<endl;
 		ofs<<"      <from sent=\"";
diff --git a/libpwrutils/bitset.h b/libpwrutils/bitset.h
index cec87c110e0f4cd1274dd145d21f92eb0f5fcd18..528568f88e4cdf3b3eb254118bf0f47b379c45d2 100644
--- a/libpwrutils/bitset.h
+++ b/libpwrutils/bitset.h
@@ -17,7 +17,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #ifndef PWRNLP_BITSET_H
 #define PWRNLP_BITSET_H
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <boost/range.hpp>
 #include <bitset>
 #include <boost/functional/hash.hpp>
@@ -169,7 +169,7 @@ private:
  * from the returned range.
  *
  * Example usage: \code
- * foreach (const bitset<32>& b, my_bitset) {
+ * BOOST_FOREACH(const bitset<32>& b, my_bitset) {
  *    foo_with(b);
  * }
  * \endcode
diff --git a/libpwrutils/pathsearch.cpp b/libpwrutils/pathsearch.cpp
index 8bec6f8ae27bfee1d5f0c8bac66614ee9ea5f40c..a10f3cde50ea4e866b5921f126fa2b3521989a78 100644
--- a/libpwrutils/pathsearch.cpp
+++ b/libpwrutils/pathsearch.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libpwrutils/pathsearch.h>
 
 #include <libpwrutils/exception.h>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/foreach.hpp>
@@ -86,7 +86,7 @@ std::string PathSearcherBase::find_file(const std::string& filename,
 		}
 		return "";
 	}
-	foreach (const std::string& s, paths_) {
+	BOOST_FOREACH(const std::string& s, paths_) {
 		boost::filesystem::path pi = s / i;
 		if (boost::filesystem::exists(pi) &&
 				!boost::filesystem::is_directory(pi)) {
@@ -115,7 +115,7 @@ std::vector<std::string> PathSearcherBase::list_files(const std::string& suffix)
 {
 	using boost::filesystem::directory_iterator;
 	std::vector<std::string> out;
-	foreach (const std::string& s, get_search_path()) {
+	BOOST_FOREACH(const std::string& s, get_search_path()) {
 		boost::filesystem::path p(s);
 		if (boost::filesystem::is_directory(s)) {
 			for (directory_iterator i(p); i != directory_iterator(); ++i) {
diff --git a/libpwrutils/sentence.h b/libpwrutils/sentence.h
index ce7daaf3c3c5ea2db66da9e3d50a9a323d7237ed..22a469d6c9a59b67947a4e604104481302761f17 100644
--- a/libpwrutils/sentence.h
+++ b/libpwrutils/sentence.h
@@ -17,7 +17,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #ifndef PWRNLP_SENTENCE_H
 #define PWRNLP_SENTENCE_H
 
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <boost/range.hpp>
 #include <vector>
 
@@ -52,7 +52,7 @@ namespace PwrNlp {
 		/// Destructor
 		~SentenceTemplate()
 		{
-			foreach (TT* t, tokens_) {
+			BOOST_FOREACH(TT* t, tokens_) {
 				delete t;
 			}
 		}
@@ -106,7 +106,7 @@ namespace PwrNlp {
 	SentenceTemplate<TT>* SentenceTemplate<TT>::clone() const
 	{
 		SentenceTemplate<TT>* s = new SentenceTemplate<TT>;
-		foreach (const TT* t, tokens_) {
+		BOOST_FOREACH(const TT* t, tokens_) {
 			s->append(t->clone());
 		}
 		return s;
diff --git a/tests/ann_basic.cpp b/tests/ann_basic.cpp
index bfef410af81e37ec0622538a7407b5c39f95d7c9..7525fd176f1f73a4790975283baf4b8b51091ee5 100644
--- a/tests/ann_basic.cpp
+++ b/tests/ann_basic.cpp
@@ -105,7 +105,7 @@ BOOST_AUTO_TEST_CASE( make_ann )
 	ch.make_segments_from_iob();
 	std::vector<Corpus2::Annotation> anns = ch.make_annotation_vector();
 	BOOST_REQUIRE_EQUAL(anns.size(), 4);
-	foreach (const Corpus2::Annotation& a, anns) {
+	BOOST_FOREACH(const Corpus2::Annotation& a, anns) {
 		BOOST_REQUIRE(!a.empty());
 		BOOST_REQUIRE(a.sane());
 	}
@@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE( split_ann )
 	BOOST_CHECK_EQUAL(ch.get_iob_at(5), Corpus2::IOB::O);
 	std::vector<Corpus2::Annotation> anns = ch.make_annotation_vector();
 	BOOST_REQUIRE_EQUAL(anns.size(), 2);
-	foreach (const Corpus2::Annotation& a, anns) {
+	BOOST_FOREACH(const Corpus2::Annotation& a, anns) {
 		BOOST_REQUIRE(!a.empty());
 		BOOST_REQUIRE(a.sane());
 	}
diff --git a/tests/io.cpp b/tests/io.cpp
index 31258d038d3fe052a4b899f3bfd0888b221e9215..f0b4c69164fbf9bb004d93d30a07cf5c6371ba8a 100644
--- a/tests/io.cpp
+++ b/tests/io.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <boost/test/unit_test.hpp>
 #include <set>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libpwrutils/bitset.h>
 #include <libcorpus2/tagsetmanager.h>
 #include <libcorpus2/io/xcesreader.h>
diff --git a/tests/ioann.cpp b/tests/ioann.cpp
index 223f64c26ad08c8db482340574950b27a5767618..5a1f284acab6607cdeef1fef6812870e45e658ae 100644
--- a/tests/ioann.cpp
+++ b/tests/ioann.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <boost/test/unit_test.hpp>
 #include <set>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libpwrutils/bitset.h>
 #include <libcorpus2/tagsetmanager.h>
 #include <libcorpus2/io/cclreader.h>
diff --git a/tests/tag_split.cpp b/tests/tag_split.cpp
index 51dfd6bd88a720d16ce26ed721390191963139cd..f4a1cff99dfefcdf2d332984d9ef9d34bdd1009a 100644
--- a/tests/tag_split.cpp
+++ b/tests/tag_split.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <boost/test/unit_test.hpp>
 #include <set>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libpwrutils/bitset.h>
 #include <libcorpus2/tagset.h>
 #include <libcorpus2/token.h>
@@ -47,7 +47,7 @@ struct F {
 			throw;
 		}
 
-		foreach (const Corpus2::Lexeme& lex, t.lexemes()) {
+		BOOST_FOREACH(const Corpus2::Lexeme& lex, t.lexemes()) {
 			const Corpus2::Tag& tag = lex.tag();
 			BOOST_WARN(tagset->validate_tag(tag, Corpus2::Tagset::ParseStrict, &std::cerr));
 			actual.insert(tagset->tag_to_string(tag));
@@ -157,7 +157,7 @@ BOOST_FIXTURE_TEST_CASE( underscores, F )
 	r0.insert("some:other:data");
 	r0.insert("some:a3:data");
 	std::set<std::string> r;
-	foreach (const std::string& s, r0) {
+	BOOST_FOREACH(const std::string& s, r0) {
 		r.insert(s + ":a");
 		r.insert(s + ":b");
 		r.insert(s + ":c");
@@ -175,7 +175,7 @@ BOOST_FIXTURE_TEST_CASE( underscore_dots, F )
 	r0.insert("some:other:data");
 	r0.insert("some:a3:data");
 	std::set<std::string> r;
-	foreach (const std::string& s, r0) {
+	BOOST_FOREACH(const std::string& s, r0) {
 		r.insert(s + ":a");
 		r.insert(s + ":c");
 	}
@@ -207,7 +207,7 @@ BOOST_FIXTURE_TEST_CASE( tag_size, F )
 	std::vector<Corpus2::Tag> tags = tagset->split_tag(t);
 	BOOST_CHECK_EQUAL(tags.size(), 6);
 	Corpus2::Tag tt;
-	foreach (Corpus2::Tag t, tags) {
+	BOOST_FOREACH(Corpus2::Tag t, tags) {
 		tt.combine_with(t);
 	}
 	BOOST_CHECK(tt == t);
@@ -248,7 +248,7 @@ BOOST_FIXTURE_TEST_CASE( symbols, F )
 
 BOOST_FIXTURE_TEST_CASE(attribute_mask_to_name, F)
 {
-	foreach (Corpus2::mask_t a, tagset->all_attribute_masks()) {
+	BOOST_FOREACH(Corpus2::mask_t a, tagset->all_attribute_masks()) {
 		std::string aname = tagset->get_attribute_name(a);
 		BOOST_CHECK(!aname.empty());
 		Corpus2::mask_t aa = tagset->get_attribute_mask(aname);
@@ -262,7 +262,7 @@ BOOST_AUTO_TEST_CASE(bs_split)
 {
 	std::bitset<32> x(0xf6543);
 	std::bitset<32> y(0);
-	foreach (std::bitset<32> b, PwrNlp::set_bits(x)) {
+	BOOST_FOREACH(std::bitset<32> b, PwrNlp::set_bits(x)) {
 		BOOST_CHECK_EQUAL(b.count(), 1);
 		y |= b;
 	}
diff --git a/tests/tagset_parse.cpp b/tests/tagset_parse.cpp
index 0600cf40dd073b9946152f4b5fe63840252e95d5..ed9817121f1ccebc4ab605903df498fa3c5206b3 100644
--- a/tests/tagset_parse.cpp
+++ b/tests/tagset_parse.cpp
@@ -16,7 +16,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 
 #include <boost/test/unit_test.hpp>
 #include <set>
-#include <libpwrutils/foreach.h>
+#include <boost/foreach.hpp>
 #include <libcorpus2/tagsetparser.h>
 #include <libcorpus2/tagsetmanager.h>
 #include <libcorpus2/util/settings.h>