From 4b961f72563a59cb66a1800f1be2ee40a3a1cbef Mon Sep 17 00:00:00 2001
From: unknown <bOBaN@bOBaN-desktop.(none)>
Date: Tue, 25 Sep 2012 20:13:48 +0200
Subject: [PATCH] boost foreach fix

---
 corpus2tools/corpus2get.cpp          |  2 +-
 corpus2tools/tagset-tool.cpp         | 12 +++++------
 libcorpus2/ann/annotatedsentence.cpp | 12 +++++------
 libcorpus2/ann/channel.cpp           | 16 +++++++--------
 libcorpus2/ann/view.cpp              |  2 +-
 libcorpus2/chunk.cpp                 |  4 ++--
 libcorpus2/io/cclreader.cpp          | 12 +++++------
 libcorpus2/io/cclwriter.cpp          | 10 +++++-----
 libcorpus2/io/conllwriter.cpp        |  6 +++---
 libcorpus2/io/iob-chan.cpp           | 14 ++++++-------
 libcorpus2/io/orthwriter.cpp         |  6 +++---
 libcorpus2/io/plainreader.cpp        |  2 +-
 libcorpus2/io/plainwriter.cpp        | 10 +++++-----
 libcorpus2/io/premorphwriter.cpp     |  8 ++++----
 libcorpus2/io/reader.cpp             |  4 ++--
 libcorpus2/io/reader.h               |  4 ++--
 libcorpus2/io/rft.cpp                | 10 +++++-----
 libcorpus2/io/sax.h                  |  2 +-
 libcorpus2/io/statwriter.cpp         |  8 ++++----
 libcorpus2/io/writer.cpp             |  4 ++--
 libcorpus2/io/xces.cpp               |  2 +-
 libcorpus2/io/xcescommon.cpp         |  8 ++++----
 libcorpus2/io/xcesreader.cpp         |  2 +-
 libcorpus2/io/xcesvalidate.cpp       |  2 +-
 libcorpus2/io/xceswriter.cpp         |  8 ++++----
 libcorpus2/io/xmlreader.cpp          | 12 +++++------
 libcorpus2/io/xmlreader.h            |  2 +-
 libcorpus2/io/xmlwriter.cpp          |  8 ++++----
 libcorpus2/sentence.cpp              |  4 ++--
 libcorpus2/tag.cpp                   |  2 +-
 libcorpus2/tagging.cpp               | 22 ++++++++++----------
 libcorpus2/tagset.cpp                | 30 ++++++++++++++--------------
 libcorpus2/tagset.h                  |  2 +-
 libcorpus2/tagsetmanager.cpp         |  2 +-
 libcorpus2/tagsetparser.cpp          | 18 ++++++++---------
 libcorpus2/token.cpp                 |  4 ++--
 libcorpus2/tokenmetadata.cpp         |  2 +-
 libcorpus2/util/symboldictionary.h   |  2 +-
 libcorpus2_whole/io/relreader.cpp    |  4 ++--
 libcorpus2_whole/io/relwriter.cpp    |  4 ++--
 libpwrutils/bitset.h                 |  4 ++--
 libpwrutils/pathsearch.cpp           |  6 +++---
 libpwrutils/sentence.h               |  6 +++---
 tests/ann_basic.cpp                  |  4 ++--
 tests/io.cpp                         |  2 +-
 tests/ioann.cpp                      |  2 +-
 tests/tag_split.cpp                  | 14 ++++++-------
 tests/tagset_parse.cpp               |  2 +-
 48 files changed, 164 insertions(+), 164 deletions(-)

diff --git a/corpus2tools/corpus2get.cpp b/corpus2tools/corpus2get.cpp
index 53c5018..6dd0472 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 7ab4395..45ac67d 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 d37958c..50c5ae8 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 2ae9e4e..6a21399 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 f579b65..c520adc 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 cc71040..b93e42e 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 0aa71c7..ba113bb 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 8d89a05..cd4c941 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 ac6e594..26c3c29 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 4e0f30b..855bf2e 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 0b5806a..c1ce42d 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 28c6850..0376a8f 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 f75a52f..80da303 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 6a551aa..c47e84d 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 d156887..8e66fc7 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 562a830..dd20bf0 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 bc3ad0b..b35b9a3 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 6535c7f..4ea37df 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 36d8215..94b1bbc 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 166ae62..13a41d8 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 4baacb6..c527fb7 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 3aea587..00865fa 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 87bfbd7..e2bf6b5 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 818fe0a..9e12454 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 afb01ec..2b6d306 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 3aa6917..0816839 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 7e7f8ea..9f3983b 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 8f41c2b..78f6a4d 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 10b3b7d..bb76754 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 81a7a9a..94c4b76 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 9b65484..785edf9 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 4ec7b82..54bce5f 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 18151c6..03d09cf 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 0f3fe43..2c6659a 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 0c3b16c..8f102cd 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 63352b7..857980e 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 41ce6b8..4a1b5a3 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 5258a73..4b6b530 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 53c46ec..110d078 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 1796c28..89afe61 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 cec87c1..528568f 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 8bec6f8..a10f3cd 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 ce7daaf..22a469d 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 bfef410..7525fd1 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 31258d0..f0b4c69 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 223f64c..5a1f284 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 51dfd6b..f4a1cff 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 0600cf4..ed98171 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>
-- 
GitLab