From 039636edc1b151431cba21a28986ff2be66b5349 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sun, 13 Mar 2011 14:54:08 +0100
Subject: Cleaned up includes.


diff --git a/BuildTools/CLang/.gitignore b/BuildTools/CLang/.gitignore
new file mode 100644
index 0000000..df682c0
--- /dev/null
+++ b/BuildTools/CLang/.gitignore
@@ -0,0 +1,4 @@
+CLangDiagnosticsFlags
+CLangDiagnosticsFlagsTool.sh
+CLangDiagnosticsFlagsTool
+clang-diagnostics-overview.*
diff --git a/BuildTools/CLang/CLangDiagnosticsFlagsTool.cpp b/BuildTools/CLang/CLangDiagnosticsFlagsTool.cpp
new file mode 100644
index 0000000..82cc902
--- /dev/null
+++ b/BuildTools/CLang/CLangDiagnosticsFlagsTool.cpp
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <iostream>
+#include <set>
+#include <vector>
+#include <cassert>
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/topological_sort.hpp>
+#include <boost/graph/topological_sort.hpp>
+#include <boost/graph/graphviz.hpp>
+
+// -----------------------------------------------------------------------------
+// Include diagnostics data from CLang
+// -----------------------------------------------------------------------------
+
+#define DIAG(name, a, b, c, d, e, f, g) name,
+	
+namespace diag {
+	enum LexKinds {
+#include <clang/Basic/DiagnosticLexKinds.inc>
+#include <clang/Basic/DiagnosticParseKinds.inc>
+#include <clang/Basic/DiagnosticCommonKinds.inc>
+#include <clang/Basic/DiagnosticDriverKinds.inc>
+#include <clang/Basic/DiagnosticFrontendKinds.inc>
+#include <clang/Basic/DiagnosticSemaKinds.inc>
+	};
+}
+
+#define GET_DIAG_ARRAYS
+#include <clang/Basic/DiagnosticGroups.inc>
+#undef GET_DIAG_ARRAYS
+
+struct DiagTableEntry {
+	const char* name;
+	const short* array;
+	const short* group;
+};
+
+static const DiagTableEntry diagnostics[] = {
+#define GET_DIAG_TABLE
+#include <clang/Basic/DiagnosticGroups.inc>
+#undef GET_DIAG_TABLE
+};
+static const size_t diagnostics_count = sizeof(diagnostics) / sizeof(diagnostics[0]);
+
+// -----------------------------------------------------------------------------
+
+using namespace boost;
+
+struct Properties {
+	Properties() : missing(false), redundant(false) {
+	}
+
+	std::string name;
+	bool have;
+	bool implicitHave;
+	bool dontWant;
+	bool implicitDontWant;
+	bool ignored;
+	bool available;
+	bool missing;
+	bool redundant;
+	bool alreadyCovered;
+};
+
+class GraphVizLabelWriter {
+	public:
+		GraphVizLabelWriter(const std::vector<Properties>& properties) : properties(properties) {
+		}	
+		
+		template <class VertexOrEdge>
+		void operator()(std::ostream& out, const VertexOrEdge& v) const {
+			std::string color;
+			if (properties[v].missing) {
+				color = "orange";
+			}
+			else if (properties[v].redundant) {
+				color = "lightblue";
+			}
+			else if (properties[v].have) {
+				color = "darkgreen";
+			}
+			else if (properties[v].implicitHave) {
+				color = "green";
+			}
+			else if (properties[v].dontWant) {
+				color = "red";
+			}
+			else if (properties[v].implicitDontWant) {
+				color = "pink";
+			}
+			else if (properties[v].ignored) {
+				color = "white";
+			}
+			else if (properties[v].available) {
+				color = "yellow";
+			}
+			else {
+				assert(false);
+			}
+			out << "[label=" << escape_dot_string(properties[v].name) << " fillcolor=\"" << color << "\" style=filled]";
+		}
+
+	private:
+		const std::vector<Properties> properties;
+};
+
+int main(int argc, char* argv[]) {
+	// Parse command-line arguments
+	std::set<std::string> have;
+	std::set<std::string> dontWant;
+	std::string outputDir;
+	for (int i = 1; i < argc; ++i) {
+		std::string arg(argv[i]);
+		if (starts_with(arg, "-W")) {
+			have.insert(arg.substr(2, arg.npos));
+		}
+		else if (starts_with(arg, "-w")) {
+			dontWant.insert(arg.substr(2, arg.npos));
+		}
+		else if (starts_with(arg, "-O")) {
+			outputDir = arg.substr(2, arg.npos) + "/";
+		}
+	}
+
+	// Build the graph and initialize properties
+	typedef adjacency_list<vecS, vecS, bidirectionalS> Graph;
+	typedef graph_traits<Graph>::vertex_descriptor Vertex;
+	Graph g(diagnostics_count);
+	std::vector<Properties> properties(num_vertices(g));
+	for (size_t i = 0; i < diagnostics_count; ++i) {
+		std::string name(diagnostics[i].name);
+		properties[i].name = name;
+		properties[i].implicitHave = properties[i].have = have.find(name) != have.end();
+		properties[i].implicitDontWant = properties[i].dontWant = dontWant.find(name) != dontWant.end();
+		properties[i].ignored = diagnostics[i].group == 0 && diagnostics[i].array == 0;
+		properties[i].alreadyCovered = false;
+		properties[i].available = true;
+		for (const short* j = diagnostics[i].group; j && *j != -1; ++j) {
+			add_edge(i, *j, g);
+		}
+	}
+
+	// Sort the diagnostics
+	std::list<Vertex> sortedDiagnostics;
+	boost::topological_sort(g, std::front_inserter(sortedDiagnostics));
+
+	// Propagate dontWant and have properties down
+	for(std::list<Vertex>::const_iterator i = sortedDiagnostics.begin(); i != sortedDiagnostics.end(); ++i) {
+		graph_traits<Graph>::adjacency_iterator adjacentIt, adjacentEnd;
+		for (tie(adjacentIt, adjacentEnd) = adjacent_vertices(*i, g); adjacentIt != adjacentEnd; ++adjacentIt) {
+			properties[*adjacentIt].implicitDontWant = properties[*i].implicitDontWant || properties[*adjacentIt].implicitDontWant;
+			properties[*adjacentIt].implicitHave = properties[*i].implicitHave || properties[*adjacentIt].implicitHave;
+		}
+	}
+
+	// Propagate 'available' property upwards
+	for(std::list<Vertex>::const_reverse_iterator i = sortedDiagnostics.rbegin(); i != sortedDiagnostics.rend(); ++i) {
+		properties[*i].available = properties[*i].available && !properties[*i].implicitDontWant;
+		graph_traits<Graph>::in_edge_iterator edgesIt, edgesEnd;
+		graph_traits<Graph>::edge_descriptor edge;
+		for (tie(edgesIt, edgesEnd) = in_edges(*i, g); edgesIt != edgesEnd; ++edgesIt) {
+			properties[source(*edgesIt, g)].available = properties[source(*edgesIt, g)].available && properties[*i].available;
+		}
+	}
+
+	// Collect missing & redundant flags
+	std::set<std::string> missing;
+	std::set<std::string> redundant;
+	for(std::list<Vertex>::const_iterator i = sortedDiagnostics.begin(); i != sortedDiagnostics.end(); ++i) {
+		bool markChildrenCovered = true;
+		if (properties[*i].alreadyCovered) {
+			if (properties[*i].have) {
+				properties[*i].redundant = true;
+				redundant.insert(properties[*i].name);
+			}
+		}
+		else {
+			if (properties[*i].available) {
+				if (!properties[*i].implicitHave && !properties[*i].ignored) {
+					properties[*i].missing = true;
+					missing.insert(properties[*i].name);
+				}
+			}
+			else {
+				markChildrenCovered = false;
+			}
+		}
+		if (markChildrenCovered) {
+			graph_traits<Graph>::adjacency_iterator adjacentIt, adjacentEnd;
+			for (tie(adjacentIt, adjacentEnd) = adjacent_vertices(*i, g); adjacentIt != adjacentEnd; ++adjacentIt) {
+				properties[*adjacentIt].alreadyCovered = true;
+			}
+		}
+	}
+
+	// Write information
+	if (!missing.empty()) {
+		std::cout << "Missing diagnostic flags: ";
+		for(std::set<std::string>::const_iterator i = missing.begin(); i != missing.end(); ++i) {
+			std::cout << "-W" << *i << " ";
+		}
+		std::cout<< std::endl;
+	}
+
+	if (!redundant.empty()) {
+		std::cout << "Redundant diagnostic flags: ";
+		for(std::set<std::string>::const_iterator i = redundant.begin(); i != redundant.end(); ++i) {
+			std::cout << "-W" << *i << " ";
+		}
+		std::cout<< std::endl;
+	}
+
+	// Write graphviz file
+	if (!outputDir.empty()) {
+		std::ofstream f((outputDir + "clang-diagnostics-overview.dot").c_str());
+		write_graphviz(f, g, GraphVizLabelWriter(properties));
+		f.close();
+	}
+
+	return 0;
+}
diff --git a/BuildTools/CLang/SConscript b/BuildTools/CLang/SConscript
new file mode 100644
index 0000000..850c35c
--- /dev/null
+++ b/BuildTools/CLang/SConscript
@@ -0,0 +1,15 @@
+Import("env")
+
+#myenv = Environment()
+#myenv.Append(CPPPATH = ["."])
+#myenv.Program("CLangDiagnosticsFlagsTool", ["CLangDiagnosticsFlagsTool.cpp"])
+#
+#disabledDiagnostics = ["-wunreachable-code", "-wunused-macros", "-wmissing-noreturn", "-wlong-long", "-wcast-align", "-wglobal-constructors", "-wmissing-prototypes", "-wpadded", "-wshadow"]
+#clangDiagnosticsFlagsToolCommand = "BuildTools/CLang/CLangDiagnosticsFlagsTool -O" + env.Dir(".").abspath + " " + " ".join(disabledDiagnostics) + " "
+#clangDiagnosticsFlagsToolCommand += " ".join([flag for flag in env["CXXFLAGS"] if flag.startswith("-W")])
+#clangDiagnosticsFlagsToolCommand += "\n"
+#clangDiagnosticsFlagsToolCommand += "dot -Tpng " + env.Dir(".").abspath + "/clang-diagnostics-overview.dot > " + env.Dir(".").abspath + "/clang-diagnostics-overview.png\n"
+#v = env.WriteVal("#/BuildTools/CLang/CLangDiagnosticsFlagsTool.sh", env.Value(clangDiagnosticsFlagsToolCommand))
+#env.AddPostAction(v, Chmod(v[0], 0755))
+#
+#
diff --git a/BuildTools/CheckHeaders.py b/BuildTools/CheckHeaders.py
new file mode 100755
index 0000000..73f49db
--- /dev/null
+++ b/BuildTools/CheckHeaders.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+import os, sys
+
+foundBadHeaders = False
+
+for (path, dirs, files) in os.walk(".") :
+  if "3rdParty" in path or ".sconf" in path or ".framework" in path :
+    continue
+  if not "Swiften" in path :
+    continue
+
+  for filename in [os.path.join(path, file) for file in files if file.endswith(".h")] :
+    file = open(filename, "r")
+    for line in file.readlines() :
+      for include in ["iostream", "algorithm", "cassert", "boost/bind.hpp", "boost/filesystem.hpp", "Base/foreach.h", "Base/Log.h", "boost/date_time/date_time.hpp", "boost/filesystem/filesystem.hpp"] :
+        if "#include" in line and include in line and not "Base/Log" in filename :
+          print "Found " + include + " include in " + filename
+          foundBadHeaders = True
+
+sys.exit(foundBadHeaders)
diff --git a/BuildTools/SCons/SConstruct b/BuildTools/SCons/SConstruct
index bd40f1f..43b6df0 100644
--- a/BuildTools/SCons/SConstruct
+++ b/BuildTools/SCons/SConstruct
@@ -178,7 +178,14 @@ else :
 		env.Append(CXXFLAGS = ["-Werror"])
 	gccVersion = env["CCVERSION"].split(".")
 	if gccVersion >= ["4", "5", "0"] :
-		env.Append(CCFLAGS = ["-Wlogical-op"])
+		env.Append(CXXFLAGS = ["-Wlogical-op"])
+	if "clang" in env["CC"] :
+		env.Append(CXXFLAGS = ["-W#warnings", "-W-Wc++0x-compat", "-Wc++0x-compat", "-Waddress-of-temporary", "-Wambiguous-member-template", "-Warray-bounds", "-Watomic-properties", "-Wbind-to-temporary-copy", "-Wbuiltin-macro-redefined", "-Wc++-compat", "-Wc++0x-extensions", "-Wcomments", "-Wconditional-uninitialized", "-Wconstant-logical-operand", "-Wdeclaration-after-statement", "-Wdeprecated", "-Wdeprecated-implementations", "-Wdeprecated-writable-strings", "-Wduplicate-method-arg", "-Wempty-body", "-Wendif-labels", "-Wenum-compare", "-Wformat=2", "-Wfour-char-constants", "-Wgnu", "-Wincomplete-implementation", "-Winvalid-noreturn", "-Winvalid-offsetof", "-Winvalid-token-paste", "-Wlocal-type-template-args", "-Wmethod-signatures", "-Wmicrosoft", "-Wmissing-declarations", "-Wnon-pod-varargs", "-Wnonfragile-abi2", "-Wnull-dereference", "-Wout-of-line-declaration", "-Woverlength-strings", "-Wpacked", "-Wpointer-arith", "-Wpointer-sign", "-Wprotocol", "-Wreadonly-setter-attrs", "-Wselector", "-Wshift-overflow", "-Wshift-sign-overflow", "-Wstrict-selector-match", "-Wsuper-class-method-mismatch", "-Wtautological-compare", "-Wtypedef-redefinition", "-Wundeclared-selector", "-Wunknown-attributes", "-Wunknown-warning-option", "-Wunnamed-type-template-args", "-Wunused-exception-parameter", "-Wunused-member-function", "-Wused-but-marked-unused", "-Wvariadic-macros"])
+# To enable: 
+# "-Wheader-hygiene"
+#	"-Wnon-gcc",
+# "-Wweak-vtables",
+# "-Wlarge-by-value-copy",
 
 if env.get("coverage", 0) :
 	assert(env["PLATFORM"] != "win32")
@@ -621,6 +628,9 @@ if env.Dir("#/.git").exists() :
 # Project files
 ################################################################################
 
+# Build tools
+env.SConscript(dirs = ["#/BuildTools/CLang"])
+
 # Modules
 modules = []
 for dir in os.listdir(Dir("#/3rdParty").abspath) :
diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayload.h b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayload.h
index 7533a1e..62ea495 100644
--- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayload.h
+++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayload.h
@@ -8,9 +8,8 @@
 
 #include <Swiften/Swiften.h>
 
-using namespace Swift;
 //...
-class EchoPayload : public Payload {
+class EchoPayload : public Swift::Payload {
 	public:
 		EchoPayload() {}
 
diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadParserFactory.h b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadParserFactory.h
index 9cbb795..33a8c41 100644
--- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadParserFactory.h
+++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadParserFactory.h
@@ -9,9 +9,7 @@
 #include <Swiften/Swiften.h>
 #include "EchoPayload.h"
 
-using namespace Swift;
-
-class EchoPayloadParser : public GenericPayloadParser<EchoPayload> {
+class EchoPayloadParser : public Swift::GenericPayloadParser<EchoPayload> {
 	public:
 		EchoPayloadParser() : currentDepth(0) {}
 
@@ -36,7 +34,7 @@ class EchoPayloadParser : public GenericPayloadParser<EchoPayload> {
 		std::string currentText;
 };
 
-class EchoPayloadParserFactory : public GenericPayloadParserFactory<EchoPayloadParser> {
+class EchoPayloadParserFactory : public Swift::GenericPayloadParserFactory<EchoPayloadParser> {
 	public:
 		EchoPayloadParserFactory() :
 			GenericPayloadParserFactory<EchoPayloadParser>("echo", "http://swift.im/echo") {}
diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadSerializer.h b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadSerializer.h
index 85e8e67..068113c 100644
--- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadSerializer.h
+++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/EchoPayloadSerializer.h
@@ -9,9 +9,7 @@
 #include <Swiften/Swiften.h>
 #include "EchoPayload.h"
 
-using namespace Swift;
-
-class EchoPayloadSerializer : public GenericPayloadSerializer<EchoPayload> {
+class EchoPayloadSerializer : public Swift::GenericPayloadSerializer<EchoPayload> {
 	public:
 		std::string serializePayload(boost::shared_ptr<EchoPayload> payload) const {
 			XMLElement element("echo", "http://swift.im/protocol/echo");
diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp
index 380ce6a..809c56a 100644
--- a/Slimber/Server.cpp
+++ b/Slimber/Server.cpp
@@ -8,7 +8,9 @@
 
 #include <string>
 #include <boost/bind.hpp>
+#include <iostream>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/Base/String.h"
 #include "Swiften/LinkLocal/LinkLocalConnector.h"
 #include "Swiften/Network/Connection.h"
diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp
index 49cfec4..2ef5f9e 100644
--- a/Sluift/sluift.cpp
+++ b/Sluift/sluift.cpp
@@ -14,6 +14,7 @@ extern "C" {
 #include <deque>
 #include <boost/assign/list_of.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Swiften.h>
 
 #include "Watchdog.h"
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index 94d4b9a..5f51ac6 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -8,6 +8,7 @@
 
 #include <boost/bind.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include "Swift/Controllers/Chat/ChatController.h"
 #include "Swift/Controllers/Chat/MUCSearchController.h"
 #include "Swift/Controllers/XMPPEvents/EventController.h"
diff --git a/Swift/Controllers/Chat/MUCSearchController.cpp b/Swift/Controllers/Chat/MUCSearchController.cpp
index 743aabb..2d5c7e7 100644
--- a/Swift/Controllers/Chat/MUCSearchController.cpp
+++ b/Swift/Controllers/Chat/MUCSearchController.cpp
@@ -11,6 +11,7 @@
 #include <boost/bind.hpp>
 #include <boost/shared_ptr.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Disco/GetDiscoItemsRequest.h>
 #include <Swiften/Base/Log.h>
 #include <Swiften/Base/String.h>
diff --git a/Swift/Controllers/Chat/UserSearchController.cpp b/Swift/Controllers/Chat/UserSearchController.cpp
index b3403d7..deac2f9 100644
--- a/Swift/Controllers/Chat/UserSearchController.cpp
+++ b/Swift/Controllers/Chat/UserSearchController.cpp
@@ -9,9 +9,9 @@
 #include <boost/bind.hpp>
 #include <boost/shared_ptr.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Disco/GetDiscoInfoRequest.h>
 #include <Swiften/Disco/GetDiscoItemsRequest.h>
-
 #include <Swift/Controllers/DiscoServiceWalker.h>
 #include <Swift/Controllers/UIEvents/UIEventStream.h>
 #include <Swift/Controllers/UIEvents/RequestChatWithUserDialogUIEvent.h>
diff --git a/Swift/Controllers/DiscoServiceWalker.cpp b/Swift/Controllers/DiscoServiceWalker.cpp
index ce29927..6aed6eb 100644
--- a/Swift/Controllers/DiscoServiceWalker.cpp
+++ b/Swift/Controllers/DiscoServiceWalker.cpp
@@ -6,6 +6,7 @@
 
 #include <Swift/Controllers/DiscoServiceWalker.h>
 #include <Swiften/Base/Log.h>
+#include <Swiften/Base/foreach.h>
 
 #include <boost/bind.hpp>
 
diff --git a/Swift/Controllers/ProfileSettingsProvider.h b/Swift/Controllers/ProfileSettingsProvider.h
index 74bcd12..8ba250c 100644
--- a/Swift/Controllers/ProfileSettingsProvider.h
+++ b/Swift/Controllers/ProfileSettingsProvider.h
@@ -7,6 +7,7 @@
 #pragma once
 
 #include "Swift/Controllers/Settings/SettingsProvider.h"
+#include <Swiften/Base/foreach.h>
 
 namespace Swift {
 
diff --git a/Swift/Controllers/Roster/ContactRosterItem.cpp b/Swift/Controllers/Roster/ContactRosterItem.cpp
index c6064d6..7146040 100644
--- a/Swift/Controllers/Roster/ContactRosterItem.cpp
+++ b/Swift/Controllers/Roster/ContactRosterItem.cpp
@@ -7,6 +7,8 @@
 #include "Swift/Controllers/Roster/ContactRosterItem.h"
 #include "Swift/Controllers/Roster/GroupRosterItem.h"
 
+#include <Swiften/Base/foreach.h>
+
 namespace Swift {
 
 
diff --git a/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp b/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp
index c1045ee..0a242ae 100644
--- a/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp
+++ b/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp
@@ -9,6 +9,7 @@
 #include <boost/bind.hpp>
 #include <vector>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/Base/String.h"
 #include "Swift/Controllers/Roster/GroupRosterItem.h"
 
diff --git a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
index 16f2745..ca74dbb 100644
--- a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
+++ b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
@@ -8,6 +8,7 @@
 #include <cppunit/extensions/HelperMacros.h>
 #include <cppunit/extensions/TestFactoryRegistry.h>
 
+#include <Swiften/Base/foreach.h>
 #include "Swift/Controllers/Roster/RosterController.h"
 #include "Swift/Controllers/UnitTest/MockMainWindowFactory.h"
 // #include "Swiften/Elements/Payload.h"
diff --git a/Swift/Controllers/XMPPEvents/EventController.cpp b/Swift/Controllers/XMPPEvents/EventController.cpp
index 7f8f216..98fd634 100644
--- a/Swift/Controllers/XMPPEvents/EventController.cpp
+++ b/Swift/Controllers/XMPPEvents/EventController.cpp
@@ -9,6 +9,7 @@
 #include <boost/bind.hpp>
 #include <algorithm>
 
+#include <Swiften/Base/foreach.h>
 #include "Swift/Controllers/XMPPEvents/MessageEvent.h"
 #include "Swift/Controllers/XMPPEvents/ErrorEvent.h"
 #include "Swift/Controllers/XMPPEvents/SubscriptionRequestEvent.h"
diff --git a/Swiften/Avatars/AvatarFileStorage.cpp b/Swiften/Avatars/AvatarFileStorage.cpp
index 4f76c80..9effc16 100644
--- a/Swiften/Avatars/AvatarFileStorage.cpp
+++ b/Swiften/Avatars/AvatarFileStorage.cpp
@@ -8,6 +8,7 @@
 
 #include <iostream>
 #include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem.hpp>
 
 #include <Swiften/Base/foreach.h>
 #include <Swiften/Base/String.h>
@@ -58,7 +59,7 @@ void AvatarFileStorage::addAvatar(const std::string& hash, const ByteArray& avat
 		}
 	}
 	boost::filesystem::ofstream file(avatarPath, boost::filesystem::ofstream::binary|boost::filesystem::ofstream::out);
-	file.write(reinterpret_cast<const char*>(avatar.getData()), avatar.getSize());
+	file.write(reinterpret_cast<const char*>(avatar.getData()), static_cast<std::streamsize>(avatar.getSize()));
 	file.close();
 }
 
diff --git a/Swiften/Avatars/AvatarFileStorage.h b/Swiften/Avatars/AvatarFileStorage.h
index e736230..b7e73f5 100644
--- a/Swiften/Avatars/AvatarFileStorage.h
+++ b/Swiften/Avatars/AvatarFileStorage.h
@@ -8,7 +8,7 @@
 
 #include <map>
 #include <string>
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 
 #include <Swiften/JID/JID.h>
 #include "Swiften/Base/ByteArray.h"
diff --git a/Swiften/Avatars/AvatarManager.h b/Swiften/Avatars/AvatarManager.h
index e1af451..3461973 100644
--- a/Swiften/Avatars/AvatarManager.h
+++ b/Swiften/Avatars/AvatarManager.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 
 #include <Swiften/Base/boost_bsignals.h>
 #include <Swiften/Base/ByteArray.h>
diff --git a/Swiften/Avatars/AvatarProvider.h b/Swiften/Avatars/AvatarProvider.h
index 0f66904..d2d408e 100644
--- a/Swiften/Avatars/AvatarProvider.h
+++ b/Swiften/Avatars/AvatarProvider.h
@@ -6,9 +6,10 @@
 
 #pragma once
 
-#include "Swiften/Base/boost_bsignals.h"
 #include <string>
 
+#include <Swiften/Base/boost_bsignals.h>
+
 namespace Swift {
 	class JID;
 
diff --git a/Swiften/Avatars/AvatarStorage.h b/Swiften/Avatars/AvatarStorage.h
index 48fc885..d1aff39 100644
--- a/Swiften/Avatars/AvatarStorage.h
+++ b/Swiften/Avatars/AvatarStorage.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <string>
 
 namespace Swift {
diff --git a/Swiften/Avatars/VCardAvatarManager.h b/Swiften/Avatars/VCardAvatarManager.h
index 3f99dad..6c02ace 100644
--- a/Swiften/Avatars/VCardAvatarManager.h
+++ b/Swiften/Avatars/VCardAvatarManager.h
@@ -6,11 +6,8 @@
 
 #pragma once
 
-#include <map>
-
 #include "Swiften/Avatars/AvatarProvider.h"
 #include "Swiften/JID/JID.h"
-#include "Swiften/Elements/VCard.h"
 
 namespace Swift {
 	class MUCRegistry;
diff --git a/Swiften/Base/ByteArray.h b/Swiften/Base/ByteArray.h
index ad2c1e5..2059052 100644
--- a/Swiften/Base/ByteArray.h
+++ b/Swiften/Base/ByteArray.h
@@ -6,11 +6,9 @@
 
 #pragma once
 
-#include <cstring>
 #include <vector>
-#include <iostream>
-
 #include <string>
+#include <cstring> // for memcpy
 
 namespace Swift {
 	class ByteArray
@@ -24,7 +22,7 @@ namespace Swift {
 
 			ByteArray(const char* c) {
 				while (*c) {
-					data_.push_back(*c);
+					data_.push_back(static_cast<unsigned char>(*c));
 					++c;
 				}
 			}
@@ -75,7 +73,7 @@ namespace Swift {
 			}
 
 			void resize(size_t size, char c) {
-				return data_.resize(size, c);
+				return data_.resize(size, static_cast<unsigned char>(c));
 			}
 
 			friend ByteArray operator+(const ByteArray& a, const ByteArray&b) {
@@ -87,7 +85,7 @@ namespace Swift {
 			friend ByteArray operator+(const ByteArray& a, char b) {
 				ByteArray x;
 				x.resize(1);
-				x[0] = b;
+				x[0] = static_cast<unsigned char>(b);
 				return a + x;
 			}
 
@@ -97,7 +95,7 @@ namespace Swift {
 			}
 
 			ByteArray& operator+=(char c) {
-				data_.push_back(c);
+				data_.push_back(static_cast<unsigned char>(c));
 				return *this;
 			}
 
diff --git a/Swiften/Base/IDGenerator.h b/Swiften/Base/IDGenerator.h
index 4b6289b..d536dcc 100644
--- a/Swiften/Base/IDGenerator.h
+++ b/Swiften/Base/IDGenerator.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_IDGenerator_H
-#define SWIFTEN_IDGenerator_H
+#pragma once
 
 #include <string>
 
@@ -20,5 +19,3 @@ namespace Swift {
 			std::string currentID_;
 	};
 }
-
-#endif
diff --git a/Swiften/Base/Paths.h b/Swiften/Base/Paths.h
index 06c6aeb..8ac4640 100644
--- a/Swiften/Base/Paths.h
+++ b/Swiften/Base/Paths.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 
 namespace Swift {
 	class Paths {
diff --git a/Swiften/Base/Platform.h b/Swiften/Base/Platform.h
index 32e2671..6cdb667 100644
--- a/Swiften/Base/Platform.h
+++ b/Swiften/Base/Platform.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_Platform_H
-#define SWIFTEN_Platform_H
+#pragma once
 
 // Base platforms
 #if defined(linux) || defined(__linux) || defined(__linux__)
@@ -46,5 +45,3 @@
 #elif defined(BOOST_BIG_ENDIAN)
 #define SWIFTEN_BIG_ENDIAN
 #endif
-
-#endif
diff --git a/Swiften/Base/String.h b/Swiften/Base/String.h
index 192d53b..0de6cac 100644
--- a/Swiften/Base/String.h
+++ b/Swiften/Base/String.h
@@ -6,7 +6,6 @@
 
 #pragma once
 
-#include <map>
 #include <string>
 #include <vector>
 
diff --git a/Swiften/Base/foreach.h b/Swiften/Base/foreach.h
index 05366d6..87f6147 100644
--- a/Swiften/Base/foreach.h
+++ b/Swiften/Base/foreach.h
@@ -4,12 +4,9 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_FOREACH_H
-#define SWIFTEN_FOREACH_H
+#pragma once
 
 #include <boost/foreach.hpp>
 
 #undef foreach
 #define foreach BOOST_FOREACH
-
-#endif
diff --git a/Swiften/Base/sleep.h b/Swiften/Base/sleep.h
index c2bc601..a95e907 100644
--- a/Swiften/Base/sleep.h
+++ b/Swiften/Base/sleep.h
@@ -4,11 +4,8 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_sleep_H
-#define SWIFTEN_sleep_H
+#pragma once
 
 namespace Swift {
 	void sleep(unsigned int msecs);
 }
-
-#endif
diff --git a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
index 5d7961b..aa16892 100644
--- a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
+++ b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
@@ -8,6 +8,7 @@
 #include <cppunit/extensions/TestFactoryRegistry.h>
 #include <boost/bind.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/Chat/ChatStateNotifier.h"
 #include "Swiften/Client/DummyStanzaChannel.h"
 #include "Swiften/Disco/DummyEntityCapsProvider.h"
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index 083b8a0..05c1e6e 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include "Swiften/Client/CoreClient.h"
+#include <Swiften/Client/CoreClient.h>
 
 namespace Swift {
 	class SoftwareVersionResponder;
@@ -85,12 +85,12 @@ namespace Swift {
 			/**
 			 * Returns the last received presence for the given (full) JID.
 			 */
-			Presence::ref getLastPresence(const JID& jid) const;
+			boost::shared_ptr<Presence> getLastPresence(const JID& jid) const;
 
 			/**
 			 * Returns the presence with the highest priority received for the given JID.
 			 */
-			Presence::ref getHighestPriorityPresence(const JID& bareJID) const;
+			boost::shared_ptr<Presence> getHighestPriorityPresence(const JID& bareJID) const;
 
 			PresenceOracle* getPresenceOracle() const {
 				return presenceOracle;
@@ -142,7 +142,7 @@ namespace Swift {
 			/**
 			 * This signal is emitted when a JID changes presence.
 			 */
-			boost::signal<void (Presence::ref)> onPresenceChange;
+			boost::signal<void (boost::shared_ptr<Presence>)> onPresenceChange;
 
 		private:
 			Storages* getStorages() const;
diff --git a/Swiften/Client/ClientSessionStanzaChannel.cpp b/Swiften/Client/ClientSessionStanzaChannel.cpp
index 6b32b3d..85d9dec 100644
--- a/Swiften/Client/ClientSessionStanzaChannel.cpp
+++ b/Swiften/Client/ClientSessionStanzaChannel.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/Client/ClientSessionStanzaChannel.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 namespace Swift {
 
diff --git a/Swiften/Client/ClientXMLTracer.cpp b/Swiften/Client/ClientXMLTracer.cpp
new file mode 100644
index 0000000..a26ce66
--- /dev/null
+++ b/Swiften/Client/ClientXMLTracer.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Client/ClientXMLTracer.h>
+
+#include <iostream>
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+ClientXMLTracer::ClientXMLTracer(CoreClient* client) {
+	client->onDataRead.connect(boost::bind(&ClientXMLTracer::printData, '<', _1));
+	client->onDataWritten.connect(boost::bind(&ClientXMLTracer::printData, '>', _1));
+}
+
+void ClientXMLTracer::printData(char direction, const std::string& data) {
+	printLine(direction);
+	std::cerr << data << std::endl;
+}
+
+void ClientXMLTracer::printLine(char c) {
+	for (unsigned int i = 0; i < 80; ++i) {
+		std::cerr << c;
+	}
+	std::cerr << std::endl;
+}
+
+}
diff --git a/Swiften/Client/ClientXMLTracer.h b/Swiften/Client/ClientXMLTracer.h
index bca2a54..617c53f 100644
--- a/Swiften/Client/ClientXMLTracer.h
+++ b/Swiften/Client/ClientXMLTracer.h
@@ -6,29 +6,15 @@
 
 #pragma once
 
-#include <boost/bind.hpp>
-
 #include <Swiften/Client/CoreClient.h>
 
 namespace Swift {
 	class ClientXMLTracer {
 		public:
-			ClientXMLTracer(CoreClient* client) {
-				client->onDataRead.connect(boost::bind(&ClientXMLTracer::printData, '<', _1));
-				client->onDataWritten.connect(boost::bind(&ClientXMLTracer::printData, '>', _1));
-			}
+			ClientXMLTracer(CoreClient* client);
 
 		private:
-			static void printData(char direction, const std::string& data) {
-				printLine(direction);
-				std::cerr << data << std::endl;
-			}
-
-			static void printLine(char c) {
-				for (unsigned int i = 0; i < 80; ++i) {
-					std::cerr << c;
-				}
-				std::cerr << std::endl;
-			}
+			static void printData(char direction, const std::string& data);
+			static void printLine(char c);
 	};
 }
diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp
index f0c5333..8e51c8e 100644
--- a/Swiften/Client/CoreClient.cpp
+++ b/Swiften/Client/CoreClient.cpp
@@ -283,5 +283,25 @@ void CoreClient::setUseTLS(UseTLS b) {
 	useTLS = b;
 }
 
+bool CoreClient::isAvailable() const {
+	return stanzaChannel_->isAvailable();
+}
+
+bool CoreClient::getStreamManagementEnabled() const {
+	return stanzaChannel_->getStreamManagementEnabled();
+}
+
+StanzaChannel* CoreClient::getStanzaChannel() const {
+	return stanzaChannel_;
+}
+
+const JID& CoreClient::getJID() const {
+	if (session_) {
+		return session_->getLocalJID();
+	}
+	else {
+		return jid_;
+	}
+}
 
 }
diff --git a/Swiften/Client/CoreClient.h b/Swiften/Client/CoreClient.h
index eb9c42c..060c699 100644
--- a/Swiften/Client/CoreClient.h
+++ b/Swiften/Client/CoreClient.h
@@ -6,35 +6,32 @@
 
 #pragma once
 
-#include "Swiften/Base/boost_bsignals.h"
+#include <string>
 #include <boost/shared_ptr.hpp>
+#include <Swiften/Base/boost_bsignals.h>
 
-#include "Swiften/Network/PlatformDomainNameResolver.h"
-#include "Swiften/Network/Connector.h"
-#include "Swiften/Base/Error.h"
-#include "Swiften/Client/ClientSession.h"
-#include "Swiften/Client/ClientError.h"
-#include "Swiften/Elements/Presence.h"
-#include "Swiften/Elements/Message.h"
-#include "Swiften/JID/JID.h"
-#include <string>
-#include "Swiften/Client/StanzaChannel.h"
-#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
-#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
 #include <Swiften/Entity/Entity.h>
-
-#include "Swiften/Client/ClientSessionStanzaChannel.h"
+#include <Swiften/JID/JID.h>
+#include <Swiften/Client/ClientError.h>
 
 namespace Swift {
+	class Connector;
+	class Message;
+	class Presence;
+	class Error;
 	class IQRouter;
 	class TLSContextFactory;
 	class ConnectionFactory;
+	class Connection;
 	class TimerFactory;
 	class ClientSession;
+	class StanzaChannel;
+	class Stanza;
 	class BasicSessionStream;
 	class PlatformTLSFactories;
 	class CertificateTrustChecker;
 	class NetworkFactories;
+	class ClientSessionStanzaChannel;
 
 	/** 
 	 * The central class for communicating with an XMPP server.
@@ -80,12 +77,12 @@ namespace Swift {
 			/**
 			 * Sends a message.
 			 */
-			void sendMessage(Message::ref);
+			void sendMessage(boost::shared_ptr<Message>);
 
 			/**
 			 * Sends a presence stanza.
 			 */
-			void sendPresence(Presence::ref);
+			void sendPresence(boost::shared_ptr<Presence>);
 
 			/**
 			 * Sends raw, unchecked data.
@@ -103,9 +100,7 @@ namespace Swift {
 			 * Checks whether the client is connected to the server,
 			 * and stanzas can be sent.
 			 */
-			bool isAvailable() const {
-				return stanzaChannel_->isAvailable();
-			}
+			bool isAvailable() const;
 
 			/**
 			 * Checks whether the client is active.
@@ -118,14 +113,7 @@ namespace Swift {
 			 * Returns the JID of the client. 
 			 * After the session was initialized, this returns the bound JID.
 			 */
-			const JID& getJID() const {
-				if (session_) {
-					return session_->getLocalJID();
-				}
-				else {
-					return jid_;
-				}
-			}
+			const JID& getJID() const;
 
 			/**
 			 * Checks whether stream management is enabled.
@@ -135,13 +123,9 @@ namespace Swift {
 			 *
 			 * \see onStanzaAcked
 			 */
-			bool getStreamManagementEnabled() const {
-				return stanzaChannel_->getStreamManagementEnabled();
-			}
+			bool getStreamManagementEnabled() const;
 
-			StanzaChannel* getStanzaChannel() const {
-				return stanzaChannel_;
-			}
+			StanzaChannel* getStanzaChannel() const;
 
 			/**
 			 * Sets the certificate trust checker.
@@ -197,12 +181,12 @@ namespace Swift {
 			/**
 			 * Emitted when a message is received.
 			 */
-			boost::signal<void (Message::ref)> onMessageReceived;
+			boost::signal<void (boost::shared_ptr<Message>)> onMessageReceived;
 
 			/**
 			 * Emitted when a presence stanza is received.
 			 */
-			boost::signal<void (Presence::ref) > onPresenceReceived;
+			boost::signal<void (boost::shared_ptr<Presence>) > onPresenceReceived;
 
 			/**
 			 * Emitted when the server acknowledges receipt of a
@@ -210,7 +194,7 @@ namespace Swift {
 			 *
 			 * \see getStreamManagementEnabled()
 			 */
-			boost::signal<void (Stanza::ref)> onStanzaAcked;
+			boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaAcked;
 
 		private:
 			void handleConnectorFinished(boost::shared_ptr<Connection>);
@@ -219,9 +203,9 @@ namespace Swift {
 			void handleNeedCredentials();
 			void handleDataRead(const std::string&);
 			void handleDataWritten(const std::string&);
-			void handlePresenceReceived(Presence::ref);
-			void handleMessageReceived(Message::ref);
-			void handleStanzaAcked(Stanza::ref);
+			void handlePresenceReceived(boost::shared_ptr<Presence>);
+			void handleMessageReceived(boost::shared_ptr<Message>);
+			void handleStanzaAcked(boost::shared_ptr<Stanza>);
 
 		private:
 			JID jid_;
@@ -231,7 +215,7 @@ namespace Swift {
 			UseTLS useTLS;
 			ClientSessionStanzaChannel* stanzaChannel_;
 			IQRouter* iqRouter_;
-			Connector::ref connector_;
+			boost::shared_ptr<Connector> connector_;
 			PlatformTLSFactories* tlsFactories;
 			boost::shared_ptr<Connection> connection_;
 			boost::shared_ptr<BasicSessionStream> sessionStream_;
diff --git a/Swiften/Client/FileStorages.h b/Swiften/Client/FileStorages.h
index 451105f..fc05c86 100644
--- a/Swiften/Client/FileStorages.h
+++ b/Swiften/Client/FileStorages.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 
 #include "Swiften/Client/Storages.h"
 
diff --git a/Swiften/Client/NickResolver.h b/Swiften/Client/NickResolver.h
index 881362a..bf373fa 100644
--- a/Swiften/Client/NickResolver.h
+++ b/Swiften/Client/NickResolver.h
@@ -5,9 +5,9 @@
  */
 
 #include <map>
-#include <boost/signals.hpp>
 #include <boost/shared_ptr.hpp>
 
+#include <Swiften/Base/boost_bsignals.h>
 #include <string>
 #include "Swiften/JID/JID.h"
 #include "Swiften/Elements/VCard.h"
diff --git a/Swiften/Component/ComponentSessionStanzaChannel.cpp b/Swiften/Component/ComponentSessionStanzaChannel.cpp
index b9fecb2..b342714 100644
--- a/Swiften/Component/ComponentSessionStanzaChannel.cpp
+++ b/Swiften/Component/ComponentSessionStanzaChannel.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/Component/ComponentSessionStanzaChannel.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 namespace Swift {
 
diff --git a/Swiften/Component/ComponentXMLTracer.cpp b/Swiften/Component/ComponentXMLTracer.cpp
new file mode 100644
index 0000000..b952c29
--- /dev/null
+++ b/Swiften/Component/ComponentXMLTracer.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Component/ComponentXMLTracer.h>
+
+#include <iostream>
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+ComponentXMLTracer::ComponentXMLTracer(CoreComponent* client) {
+	client->onDataRead.connect(boost::bind(&ComponentXMLTracer::printData, '<', _1));
+	client->onDataWritten.connect(boost::bind(&ComponentXMLTracer::printData, '>', _1));
+}
+
+void ComponentXMLTracer::printData(char direction, const std::string& data) {
+	printLine(direction);
+	std::cerr << data << std::endl;
+}
+
+void ComponentXMLTracer::printLine(char c) {
+	for (unsigned int i = 0; i < 80; ++i) {
+		std::cerr << c;
+	}
+	std::cerr << std::endl;
+}
+
+}
diff --git a/Swiften/Component/ComponentXMLTracer.h b/Swiften/Component/ComponentXMLTracer.h
index 70a617b..d7e2b46 100644
--- a/Swiften/Component/ComponentXMLTracer.h
+++ b/Swiften/Component/ComponentXMLTracer.h
@@ -6,29 +6,15 @@
 
 #pragma once
 
-#include <boost/bind.hpp>
-
 #include "Swiften/Component/Component.h"
 
 namespace Swift {
 	class ComponentXMLTracer {
 		public:
-			ComponentXMLTracer(Component* component) {
-				component->onDataRead.connect(boost::bind(&ComponentXMLTracer::printData, '<', _1));
-				component->onDataWritten.connect(boost::bind(&ComponentXMLTracer::printData, '>', _1));
-			}
+			ComponentXMLTracer(CoreComponent* component);
 
 		private:
-			static void printData(char direction, const std::string& data) {
-				printLine(direction);
-				std::cerr << data << std::endl;
-			}
-
-			static void printLine(char c) {
-				for (unsigned int i = 0; i < 80; ++i) {
-					std::cerr << c;
-				}
-				std::cerr << std::endl;
-			}
+			static void printData(char direction, const std::string& data);
+			static void printLine(char c);
 	};
 }
diff --git a/Swiften/Component/CoreComponent.cpp b/Swiften/Component/CoreComponent.cpp
index e79d735..f995ab0 100644
--- a/Swiften/Component/CoreComponent.cpp
+++ b/Swiften/Component/CoreComponent.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/Component/CoreComponent.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 #include "Swiften/Component/ComponentSession.h"
 #include "Swiften/Network/Connector.h"
diff --git a/Swiften/Component/SConscript b/Swiften/Component/SConscript
index 0a9f250..ef5700c 100644
--- a/Swiften/Component/SConscript
+++ b/Swiften/Component/SConscript
@@ -7,6 +7,7 @@ sources = [
 		"ComponentSessionStanzaChannel.cpp",
 		"CoreComponent.cpp",
 		"Component.cpp",
+		"ComponentXMLTracer.cpp",
 	]
 
 swiften_env.Append(SWIFTEN_OBJECTS = swiften_env.SwiftenObject(sources))
diff --git a/Swiften/Compress/ZLibCompressor.cpp b/Swiften/Compress/ZLibCompressor.cpp
index 7e3116e..b740c68 100644
--- a/Swiften/Compress/ZLibCompressor.cpp
+++ b/Swiften/Compress/ZLibCompressor.cpp
@@ -6,6 +6,8 @@
 
 #include "Swiften/Compress/ZLibCompressor.h"
 
+#include <cassert>
+
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 
 namespace Swift {
diff --git a/Swiften/Compress/ZLibCompressor.h b/Swiften/Compress/ZLibCompressor.h
index 7fe5387..e0b4759 100644
--- a/Swiften/Compress/ZLibCompressor.h
+++ b/Swiften/Compress/ZLibCompressor.h
@@ -6,8 +6,6 @@
 
 #pragma once
 
-#include <cassert>
-
 #include "Swiften/Compress/ZLibCodecompressor.h"
 #include "Swiften/Base/ByteArray.h"
 
diff --git a/Swiften/Compress/ZLibDecompressor.cpp b/Swiften/Compress/ZLibDecompressor.cpp
index af7349b..78e9846 100644
--- a/Swiften/Compress/ZLibDecompressor.cpp
+++ b/Swiften/Compress/ZLibDecompressor.cpp
@@ -6,6 +6,8 @@
 
 #include "Swiften/Compress/ZLibDecompressor.h"
 
+#include <cassert>
+
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 
 namespace Swift {
diff --git a/Swiften/Compress/ZLibDecompressor.h b/Swiften/Compress/ZLibDecompressor.h
index ec08a4f..917e1b7 100644
--- a/Swiften/Compress/ZLibDecompressor.h
+++ b/Swiften/Compress/ZLibDecompressor.h
@@ -6,8 +6,6 @@
 
 #pragma once
 
-#include <cassert>
-
 #include "Swiften/Compress/ZLibCodecompressor.h"
 #include "Swiften/Base/ByteArray.h"
 
diff --git a/Swiften/Config/swiften-config.cpp b/Swiften/Config/swiften-config.cpp
index b3875cb..0c46cf0 100644
--- a/Swiften/Config/swiften-config.cpp
+++ b/Swiften/Config/swiften-config.cpp
@@ -11,6 +11,7 @@
 #include <boost/program_options/variables_map.hpp>
 #include <boost/program_options.hpp>
 #include <boost/version.hpp>
+#include <boost/filesystem.hpp>
 #include <string>
 
 #include <Swiften/Base/Platform.h>
diff --git a/Swiften/Disco/CapsFileStorage.cpp b/Swiften/Disco/CapsFileStorage.cpp
index 1e53854..17fe37b 100644
--- a/Swiften/Disco/CapsFileStorage.cpp
+++ b/Swiften/Disco/CapsFileStorage.cpp
@@ -8,6 +8,7 @@
 
 #include <iostream>
 #include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem.hpp>
 
 #include "Swiften/Base/ByteArray.h"
 #include "Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.h"
diff --git a/Swiften/Disco/CapsFileStorage.h b/Swiften/Disco/CapsFileStorage.h
index 5faf08b..b3757e0 100644
--- a/Swiften/Disco/CapsFileStorage.h
+++ b/Swiften/Disco/CapsFileStorage.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 
 #include "Swiften/Disco/CapsStorage.h"
 #include <string>
diff --git a/Swiften/Disco/CapsManager.cpp b/Swiften/Disco/CapsManager.cpp
index 63166e6..6eb7c17 100644
--- a/Swiften/Disco/CapsManager.cpp
+++ b/Swiften/Disco/CapsManager.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/Disco/CapsManager.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 #include "Swiften/Client/StanzaChannel.h"
 #include "Swiften/Disco/CapsStorage.h"
diff --git a/Swiften/Disco/DummyEntityCapsProvider.cpp b/Swiften/Disco/DummyEntityCapsProvider.cpp
new file mode 100644
index 0000000..a906652
--- /dev/null
+++ b/Swiften/Disco/DummyEntityCapsProvider.cpp
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Disco/DummyEntityCapsProvider.h>
+
+#include <iostream>
+
+namespace Swift {
+
+DiscoInfo::ref DummyEntityCapsProvider::getCaps(const JID& jid) const {
+	std::map<JID, DiscoInfo::ref>::const_iterator i = caps.find(jid);
+	if (i != caps.end()) {
+		return i->second;
+	}
+	return DiscoInfo::ref();
+}
+
+}
diff --git a/Swiften/Disco/DummyEntityCapsProvider.h b/Swiften/Disco/DummyEntityCapsProvider.h
index 68cef2f..1bd4bb9 100644
--- a/Swiften/Disco/DummyEntityCapsProvider.h
+++ b/Swiften/Disco/DummyEntityCapsProvider.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include <map>
-#include <iostream>
+
 #include "Swiften/Disco/EntityCapsProvider.h"
 
 namespace Swift {
@@ -16,13 +16,7 @@ namespace Swift {
 			DummyEntityCapsProvider() {
 			}
 
-			DiscoInfo::ref getCaps(const JID& jid) const {
-				std::map<JID, DiscoInfo::ref>::const_iterator i = caps.find(jid);
-				if (i != caps.end()) {
-					return i->second;
-				}
-				return DiscoInfo::ref();
-			}
+			DiscoInfo::ref getCaps(const JID& jid) const;
 
 			std::map<JID, DiscoInfo::ref> caps;
 	};
diff --git a/Swiften/Disco/SConscript b/Swiften/Disco/SConscript
index 9982192..a4b47db 100644
--- a/Swiften/Disco/SConscript
+++ b/Swiften/Disco/SConscript
@@ -5,6 +5,7 @@ objects = swiften_env.SwiftenObject([
 			"CapsManager.cpp",
 			"EntityCapsManager.cpp",
 			"EntityCapsProvider.cpp",
+			"DummyEntityCapsProvider.cpp",
 			"CapsStorage.cpp",
 			"CapsFileStorage.cpp",
 			"ClientDiscoManager.cpp",
diff --git a/Swiften/Elements/Body.h b/Swiften/Elements/Body.h
index 2887390..a2497f7 100644
--- a/Swiften/Elements/Body.h
+++ b/Swiften/Elements/Body.h
@@ -6,14 +6,13 @@
 
 #pragma once
 
-#include "Swiften/Elements/Payload.h"
 #include <string>
 
+#include <Swiften/Elements/Payload.h>
+
 namespace Swift {
 	class Body : public Payload {
 		public:
-			typedef boost::shared_ptr<Body> ref;
-
 			Body(const std::string& text = "") : text_(text) {
 			}
 
diff --git a/Swiften/Elements/Bytestreams.h b/Swiften/Elements/Bytestreams.h
index b493375..211396b 100644
--- a/Swiften/Elements/Bytestreams.h
+++ b/Swiften/Elements/Bytestreams.h
@@ -9,9 +9,9 @@
 #include <vector>
 #include <boost/optional.hpp>
 #include <boost/shared_ptr.hpp>
+#include <string>
 
 #include "Swiften/JID/JID.h"
-#include <string>
 #include "Swiften/Elements/Payload.h"
 
 namespace Swift {
diff --git a/Swiften/Elements/CapsInfo.h b/Swiften/Elements/CapsInfo.h
index ccad278..f1e2c37 100644
--- a/Swiften/Elements/CapsInfo.h
+++ b/Swiften/Elements/CapsInfo.h
@@ -7,8 +7,8 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
-
 #include <string>
+
 #include "Swiften/Elements/Payload.h"
 
 namespace Swift {
diff --git a/Swiften/Elements/ChatState.h b/Swiften/Elements/ChatState.h
index 2896877..ddeed79 100644
--- a/Swiften/Elements/ChatState.h
+++ b/Swiften/Elements/ChatState.h
@@ -7,6 +7,7 @@
 #pragma once
 
 #include <string>
+
 #include "Swiften/Elements/Payload.h"
 
 namespace Swift {
diff --git a/Swiften/Elements/Command.h b/Swiften/Elements/Command.h
index f4059a8..4a9c2a3 100644
--- a/Swiften/Elements/Command.h
+++ b/Swiften/Elements/Command.h
@@ -7,8 +7,8 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
-
 #include <string>
+
 #include "Swiften/Elements/Payload.h"
 #include "Swiften/Elements/Form.h"
 
diff --git a/Swiften/Elements/ComponentHandshake.h b/Swiften/Elements/ComponentHandshake.h
index 6047eab..3fe0457 100644
--- a/Swiften/Elements/ComponentHandshake.h
+++ b/Swiften/Elements/ComponentHandshake.h
@@ -7,9 +7,9 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
+#include <string>
 
 #include "Swiften/Elements/Element.h"
-#include <string>
 
 namespace Swift {
 	class ComponentHandshake : public Element {
diff --git a/Swiften/Elements/Delay.h b/Swiften/Elements/Delay.h
index 3213037..85d167b 100644
--- a/Swiften/Elements/Delay.h
+++ b/Swiften/Elements/Delay.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
 #include <boost/optional.hpp>
 
 #include "Swiften/Elements/Payload.h"
diff --git a/Swiften/Elements/DiscoInfo.cpp b/Swiften/Elements/DiscoInfo.cpp
index f0e728e..158ea66 100644
--- a/Swiften/Elements/DiscoInfo.cpp
+++ b/Swiften/Elements/DiscoInfo.cpp
@@ -6,6 +6,8 @@
 
 #include "Swiften/Elements/DiscoInfo.h"
 
+#include <algorithm>
+
 namespace Swift {
 
 const std::string DiscoInfo::ChatStatesFeature = std::string("http://jabber.org/protocol/chatstates");
@@ -33,4 +35,8 @@ bool DiscoInfo::Identity::operator<(const Identity& other) const {
 	}
 }
 
+bool DiscoInfo::hasFeature(const std::string& feature) const {
+	return std::find(features_.begin(), features_.end(), feature) != features_.end();
+}
+
 }
diff --git a/Swiften/Elements/DiscoInfo.h b/Swiften/Elements/DiscoInfo.h
index d5bf64a..6144b16 100644
--- a/Swiften/Elements/DiscoInfo.h
+++ b/Swiften/Elements/DiscoInfo.h
@@ -7,11 +7,9 @@
 #pragma once
 
 #include <vector>
-#include <algorithm>
-
-#include "Swiften/Elements/Payload.h"
 #include <string>
 
+#include "Swiften/Elements/Payload.h"
 #include "Swiften/Elements/Form.h"
 
 namespace Swift {
@@ -82,9 +80,7 @@ namespace Swift {
 				features_.push_back(feature);
 			}
 
-			bool hasFeature(const std::string& feature) const {
-				return std::find(features_.begin(), features_.end(), feature) != features_.end();
-			}
+			bool hasFeature(const std::string& feature) const;
 
 			void addExtension(Form::ref form) {
 				extensions_.push_back(form);
diff --git a/Swiften/Elements/DiscoItems.h b/Swiften/Elements/DiscoItems.h
index cc5a583..1b7063b 100644
--- a/Swiften/Elements/DiscoItems.h
+++ b/Swiften/Elements/DiscoItems.h
@@ -7,10 +7,9 @@
 #pragma once
 
 #include <vector>
-#include <algorithm>
+#include <string>
 
 #include "Swiften/Elements/Payload.h"
-#include <string>
 #include "Swiften/JID/JID.h"
 
 namespace Swift {
diff --git a/Swiften/Elements/Element.h b/Swiften/Elements/Element.h
index aded528..1e6a9d0 100644
--- a/Swiften/Elements/Element.h
+++ b/Swiften/Elements/Element.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_ELEMENT_H
-#define SWIFTEN_ELEMENT_H
+#pragma once
 
 namespace Swift {
 	class Element {
@@ -13,5 +12,3 @@ namespace Swift {
 			virtual ~Element();
 	};
 }
-
-#endif
diff --git a/Swiften/Elements/ErrorPayload.h b/Swiften/Elements/ErrorPayload.h
index 12ad574..cece81f 100644
--- a/Swiften/Elements/ErrorPayload.h
+++ b/Swiften/Elements/ErrorPayload.h
@@ -7,9 +7,9 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
+#include <string>
 
 #include "Swiften/Elements/Payload.h"
-#include <string>
 
 namespace Swift {
 	class ErrorPayload : public Payload {
diff --git a/Swiften/Elements/Form.h b/Swiften/Elements/Form.h
index 1c50f0c..4e6e9f1 100644
--- a/Swiften/Elements/Form.h
+++ b/Swiften/Elements/Form.h
@@ -7,11 +7,10 @@
 #pragma once
 
 #include <vector>
+#include <string>
 
 #include "Swiften/Elements/Payload.h"
 #include "Swiften/Elements/FormField.h"
-#include <string>
-
 #include "Swiften/JID/JID.h"
 
 namespace Swift {
diff --git a/Swiften/Elements/FormField.h b/Swiften/Elements/FormField.h
index f455303..35e05ac 100644
--- a/Swiften/Elements/FormField.h
+++ b/Swiften/Elements/FormField.h
@@ -11,8 +11,8 @@
 
 #include <vector>
 #include <boost/shared_ptr.hpp>
-
 #include <string>
+
 #include "Swiften/JID/JID.h"
 
 namespace Swift {
diff --git a/Swiften/Elements/IBB.h b/Swiften/Elements/IBB.h
index 55f2c4f..faee71d 100644
--- a/Swiften/Elements/IBB.h
+++ b/Swiften/Elements/IBB.h
@@ -7,8 +7,8 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
-
 #include <string>
+
 #include "Swiften/Base/ByteArray.h"
 #include "Swiften/Elements/Payload.h"
 
diff --git a/Swiften/Elements/InBandRegistrationPayload.h b/Swiften/Elements/InBandRegistrationPayload.h
index e4e1e6f..6e0f741 100644
--- a/Swiften/Elements/InBandRegistrationPayload.h
+++ b/Swiften/Elements/InBandRegistrationPayload.h
@@ -8,10 +8,10 @@
 
 #include <boost/shared_ptr.hpp>
 #include <boost/optional.hpp>
+#include <string>
 
 #include "Swiften/Elements/Payload.h"
 #include "Swiften/Elements/Form.h"
-#include <string>
 
 namespace Swift {
 	class InBandRegistrationPayload : public Payload {
diff --git a/Swiften/Elements/JingleContent.h b/Swiften/Elements/JingleContent.h
index 4ae908b..97b071f 100644
--- a/Swiften/Elements/JingleContent.h
+++ b/Swiften/Elements/JingleContent.h
@@ -8,13 +8,12 @@
 
 #include <vector>
 #include <boost/optional.hpp>
-
 #include <string>
+
 #include <Swiften/JID/JID.h>
 #include <Swiften/Elements/Payload.h>
 #include <Swiften/Elements/JingleDescription.h>
 #include <Swiften/Elements/JingleTransport.h>
-#include <Swiften/Base/foreach.h>
 
 namespace Swift {
 	class JingleContent : public Payload {
@@ -49,18 +48,18 @@ namespace Swift {
 				descriptions.push_back(description);
 			}
 
-			const std::vector<JingleTransport::ref>& getTransports() const {
+			const std::vector<boost::shared_ptr<JingleTransportPayload> >& getTransports() const {
 				return transports;
 			}
 
-			void addTransport(JingleTransport::ref transport) {
+			void addTransport(boost::shared_ptr<JingleTransportPayload>  transport) {
 				transports.push_back(transport);
 			}
 
 			template<typename T>
 			boost::shared_ptr<T> getDescription() const {
-				foreach (JingleDescription::ref i, descriptions) {
-					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(i));
+				for (size_t i = 0; i < descriptions.size(); ++i) {
+					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(descriptions[i]));
 					if (result) {
 						return result;
 					}
@@ -70,8 +69,8 @@ namespace Swift {
 
 			template<typename T>
 			boost::shared_ptr<T> getTransport() const {
-				foreach (JingleTransport::ref i, transports) {
-					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(i));
+				for (size_t i = 0; i < transports.size(); ++i) {
+					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(transports[i]));
 					if (result) {
 						return result;
 					}
@@ -84,6 +83,10 @@ namespace Swift {
 			std::string name;
 			//Senders senders;
 			std::vector<JingleDescription::ref> descriptions;
+<<<<<<< HEAD:Swiften/Elements/JingleContent.h
 			std::vector<JingleTransport::ref> transports;
+=======
+			std::vector<boost::shared_ptr<JingleTransportPayload> > transports;
+>>>>>>> 7c05f3f... Cleaned up headers.:Swiften/Elements/JingleContentPayload.h
 	};
 }
diff --git a/Swiften/Elements/JingleTransport.h b/Swiften/Elements/JingleTransport.h
index ecd2a34..7a9ea29 100644
--- a/Swiften/Elements/JingleTransport.h
+++ b/Swiften/Elements/JingleTransport.h
@@ -6,9 +6,13 @@
 
 #pragma once
 
+#include <boost/shared_ptr.hpp>
+
 #include <Swiften/Elements/Payload.h>
 
 namespace Swift {
-	class JingleTransport : public Payload {
+	class JingleTransportPayload : public Payload {
+		public:
+			typedef boost::shared_ptr<JingleTransportPayload> ref;
 	};
 }
diff --git a/Swiften/Elements/MUCPayload.h b/Swiften/Elements/MUCPayload.h
index c372360..eb3baeb 100644
--- a/Swiften/Elements/MUCPayload.h
+++ b/Swiften/Elements/MUCPayload.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include <boost/optional.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
 
 #include "Swiften/JID/JID.h"
 #include <string>
diff --git a/Swiften/Elements/Payload.h b/Swiften/Elements/Payload.h
index c87b899..8b6d44a 100644
--- a/Swiften/Elements/Payload.h
+++ b/Swiften/Elements/Payload.h
@@ -6,13 +6,9 @@
 
 #pragma once
 
-#include <boost/shared_ptr.hpp>
-
 namespace Swift {
 	class Payload {
 		public:
-			typedef boost::shared_ptr<Payload> ref;
-
 			virtual ~Payload();
 	};
 }
diff --git a/Swiften/Elements/Presence.cpp b/Swiften/Elements/Presence.cpp
new file mode 100644
index 0000000..6cde567
--- /dev/null
+++ b/Swiften/Elements/Presence.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Elements/Presence.h>
+
+#include <Swiften/Elements/Priority.h>
+#include <Swiften/Elements/Status.h>
+
+namespace Swift {
+
+Presence::Presence() : type_(Available) /*, showType_(Online)*/ {
+}
+
+Presence::Presence(const std::string& status) : type_(Available) {
+	setStatus(status);
+}
+
+Presence::~Presence() {
+}
+
+int Presence::getPriority() const {
+	boost::shared_ptr<Priority> priority(getPayload<Priority>());
+	return (priority ? priority->getPriority() : 0);
+}
+
+void Presence::setPriority(int priority) {
+	updatePayload(boost::shared_ptr<Priority>(new Priority(priority)));
+}
+
+std::string Presence::getStatus() const { 
+	boost::shared_ptr<Status> status(getPayload<Status>());
+	if (status) {
+		return status->getText();
+	}
+	return "";
+}
+
+void Presence::setStatus(const std::string& status) { 
+	updatePayload(boost::shared_ptr<Status>(new Status(status)));
+}
+
+
+}
diff --git a/Swiften/Elements/Presence.h b/Swiften/Elements/Presence.h
index 7f957ba..5ae482b 100644
--- a/Swiften/Elements/Presence.h
+++ b/Swiften/Elements/Presence.h
@@ -6,11 +6,8 @@
 
 #pragma once
 
-
-#include "Swiften/Elements/Stanza.h"
-#include "Swiften/Elements/Status.h"
-#include "Swiften/Elements/StatusShow.h"
-#include "Swiften/Elements/Priority.h"
+#include <Swiften/Elements/Stanza.h>
+#include <Swiften/Elements/StatusShow.h>
 
 namespace Swift {
 	class Presence : public Stanza {
@@ -19,10 +16,9 @@ namespace Swift {
 
 			enum Type { Available, Error, Probe, Subscribe, Subscribed, Unavailable, Unsubscribe, Unsubscribed };
 
-			Presence() : type_(Available) /*, showType_(Online)*/ {}
-			Presence(const std::string& status) : type_(Available) {
-				setStatus(status);
-			}
+			Presence();
+			Presence(const std::string& status);
+			virtual ~Presence();
 
 			static ref create() {
 				return ref(new Presence());
@@ -51,26 +47,11 @@ namespace Swift {
 				updatePayload(boost::shared_ptr<StatusShow>(new StatusShow(show)));
 			}
 
-			std::string getStatus() const { 
-				boost::shared_ptr<Status> status(getPayload<Status>());
-				if (status) {
-					return status->getText();
-				}
-				return "";
-			}
+			std::string getStatus() const;
+			void setStatus(const std::string& status);
 
-			void setStatus(const std::string& status) { 
-				updatePayload(boost::shared_ptr<Status>(new Status(status)));
-			}
-
-			int getPriority() const {
-				boost::shared_ptr<Priority> priority(getPayload<Priority>());
-				return (priority ? priority->getPriority() : 0);
-			}
-
-			void setPriority(int priority) {
-				updatePayload(boost::shared_ptr<Priority>(new Priority(priority)));
-			}
+			int getPriority() const;
+			void setPriority(int priority);
 
 			boost::shared_ptr<Presence> clone() const {
 				return boost::shared_ptr<Presence>(new Presence(*this));
diff --git a/Swiften/Elements/Priority.h b/Swiften/Elements/Priority.h
index 12181d4..2c0cb9b 100644
--- a/Swiften/Elements/Priority.h
+++ b/Swiften/Elements/Priority.h
@@ -6,13 +6,11 @@
 
 #pragma once
 
-#include "Swiften/Elements/Payload.h"
+#include <Swiften/Elements/Payload.h>
 
 namespace Swift {
 	class Priority : public Payload {
 		public:
-			typedef boost::shared_ptr<Priority> ref;
-
 			Priority(int priority = 0) : priority_(priority) {
 			}
 
diff --git a/Swiften/Elements/SecurityLabelsCatalog.h b/Swiften/Elements/SecurityLabelsCatalog.h
index 10ef459..cd84b0b 100644
--- a/Swiften/Elements/SecurityLabelsCatalog.h
+++ b/Swiften/Elements/SecurityLabelsCatalog.h
@@ -4,13 +4,13 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_SecurityLabelsCatalog_H
-#define SWIFTEN_SecurityLabelsCatalog_H
+#pragma once
 
 #include <vector>
+#include <string>
+#include <boost/shared_ptr.hpp>
 
 #include "Swiften/JID/JID.h"
-#include <string>
 #include "Swiften/Elements/Payload.h"
 #include "Swiften/Elements/SecurityLabel.h"
 
@@ -85,5 +85,3 @@ namespace Swift {
 			std::vector<Item> items_;
 	};
 }
-
-#endif
diff --git a/Swiften/Elements/SoftwareVersion.h b/Swiften/Elements/SoftwareVersion.h
index 5863b38..887c6e9 100644
--- a/Swiften/Elements/SoftwareVersion.h
+++ b/Swiften/Elements/SoftwareVersion.h
@@ -6,8 +6,10 @@
 
 #pragma once
 
-#include "Swiften/Elements/Payload.h"
 #include <string>
+#include <boost/shared_ptr.hpp>
+
+#include "Swiften/Elements/Payload.h"
 
 namespace Swift {
 	class SoftwareVersion : public Payload {
diff --git a/Swiften/Elements/Stanza.cpp b/Swiften/Elements/Stanza.cpp
index d15d778..607dfd1 100644
--- a/Swiften/Elements/Stanza.cpp
+++ b/Swiften/Elements/Stanza.cpp
@@ -9,8 +9,13 @@
 
 #include <typeinfo>
 
+#include <Swiften/Base/foreach.h>
+
 namespace Swift {
 
+Stanza::Stanza() {
+}
+	
 Stanza::~Stanza() {
 	payloads_.clear();
 }
diff --git a/Swiften/Elements/Stanza.h b/Swiften/Elements/Stanza.h
index 9b934e4..9e082cc 100644
--- a/Swiften/Elements/Stanza.h
+++ b/Swiften/Elements/Stanza.h
@@ -7,27 +7,28 @@
 #pragma once
 
 #include <vector>
+#include <string>
 #include <boost/shared_ptr.hpp>
-#include <boost/optional.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/optional/optional_fwd.hpp>
+#include <boost/date_time/posix_time/ptime.hpp>
 
-#include "Swiften/Elements/Element.h"
-#include "Swiften/Elements/Payload.h"
-#include <string>
-#include "Swiften/Base/foreach.h"
-#include "Swiften/JID/JID.h"
+#include <Swiften/Elements/Element.h>
+#include <Swiften/JID/JID.h>
 
 namespace Swift {
+	class Payload;
+
 	class Stanza : public Element {
 		public:
 			typedef boost::shared_ptr<Stanza> ref;
 
+			Stanza();
 			virtual ~Stanza();
 
 			template<typename T> 
 			boost::shared_ptr<T> getPayload() const {
-				foreach (const boost::shared_ptr<Payload>& i, payloads_) {
-					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(i));
+				for (size_t i = 0; i < payloads_.size(); ++i) {
+					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(payloads_[i]));
 					if (result) {
 						return result;
 					}
@@ -38,8 +39,8 @@ namespace Swift {
 			template<typename T> 
 			std::vector< boost::shared_ptr<T> > getPayloads() const {
 				std::vector< boost::shared_ptr<T> > results;
-				foreach (const boost::shared_ptr<Payload>& i, payloads_) {
-					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(i));
+				for (size_t i = 0; i < payloads_.size(); ++i) {
+					boost::shared_ptr<T> result(boost::dynamic_pointer_cast<T>(payloads_[i]));
 					if (result) {
 						results.push_back(result);
 					}
@@ -78,8 +79,6 @@ namespace Swift {
 			std::string id_;
 			JID from_;
 			JID to_;
-
-			typedef std::vector< boost::shared_ptr<Payload> > Payloads;
-			Payloads payloads_;
+			std::vector< boost::shared_ptr<Payload> > payloads_;
 	};
 }
diff --git a/Swiften/Elements/Status.h b/Swiften/Elements/Status.h
index 3ef6401..bb9b6e9 100644
--- a/Swiften/Elements/Status.h
+++ b/Swiften/Elements/Status.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_Status_H
-#define SWIFTEN_Status_H
+#pragma once
 
 #include "Swiften/Elements/Payload.h"
 #include <string>
@@ -28,5 +27,3 @@ namespace Swift {
 			std::string text_;
 	};
 }
-
-#endif
diff --git a/Swiften/Elements/StatusShow.h b/Swiften/Elements/StatusShow.h
index a158239..6ea8385 100644
--- a/Swiften/Elements/StatusShow.h
+++ b/Swiften/Elements/StatusShow.h
@@ -4,11 +4,9 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_StatusShow_H
-#define SWIFTEN_StatusShow_H
+#pragma once
 
-#include "Swiften/Elements/Payload.h"
-#include <string>
+#include <Swiften/Elements/Payload.h>
 
 namespace Swift {
 	class StatusShow : public Payload {
@@ -32,19 +30,16 @@ namespace Swift {
 			 */
 			static int typeToAvailabilityOrdering(Type type) {
 				switch (type) {
-				case Online: return 4;
-				case FFC: return 5;
-				case Away: return 2;
-				case XA: return 1;
-				case DND: return 3;
-				case None: return 0;
+					case Online: return 4;
+					case FFC: return 5;
+					case Away: return 2;
+					case XA: return 1;
+					case DND: return 3;
+					case None: return 0;
 				}
-				return -1;
 			}
 
 		private:
 			Type type_;
 	};
 }
-
-#endif
diff --git a/Swiften/Elements/StreamFeatures.cpp b/Swiften/Elements/StreamFeatures.cpp
new file mode 100644
index 0000000..c6f6c04
--- /dev/null
+++ b/Swiften/Elements/StreamFeatures.cpp
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Elements/StreamFeatures.h>
+
+#include <algorithm>
+
+namespace Swift {
+
+bool StreamFeatures::hasCompressionMethod(const std::string& mechanism) const {
+	return std::find(compressionMethods_.begin(), compressionMethods_.end(), mechanism) != compressionMethods_.end();
+}
+
+bool StreamFeatures::hasAuthenticationMechanism(const std::string& mechanism) const {
+	return std::find(authenticationMechanisms_.begin(), authenticationMechanisms_.end(), mechanism) != authenticationMechanisms_.end();
+}
+
+}
diff --git a/Swiften/Elements/StreamFeatures.h b/Swiften/Elements/StreamFeatures.h
index fbc0bb8..4bb21f0 100644
--- a/Swiften/Elements/StreamFeatures.h
+++ b/Swiften/Elements/StreamFeatures.h
@@ -7,9 +7,9 @@
 #pragma once
 
 #include <vector>
-#include <algorithm>
-
 #include <string>
+#include <boost/shared_ptr.hpp>
+
 #include "Swiften/Elements/Element.h"
 
 namespace Swift {
@@ -51,9 +51,7 @@ namespace Swift {
 				compressionMethods_.push_back(mechanism);
 			}
 
-			bool hasCompressionMethod(const std::string& mechanism) const {
-				return std::find(compressionMethods_.begin(), compressionMethods_.end(), mechanism) != compressionMethods_.end();
-			}
+			bool hasCompressionMethod(const std::string& mechanism) const;
 
 			const std::vector<std::string>& getAuthenticationMechanisms() const {
 				return authenticationMechanisms_;
@@ -63,9 +61,7 @@ namespace Swift {
 				authenticationMechanisms_.push_back(mechanism);
 			}
 
-			bool hasAuthenticationMechanism(const std::string& mechanism) const {
-				return std::find(authenticationMechanisms_.begin(), authenticationMechanisms_.end(), mechanism) != authenticationMechanisms_.end();
-			}
+			bool hasAuthenticationMechanism(const std::string& mechanism) const;
 
 			bool hasAuthenticationMechanisms() const {
 				return !authenticationMechanisms_.empty();
diff --git a/Swiften/Elements/UnitTest/StanzaTest.cpp b/Swiften/Elements/UnitTest/StanzaTest.cpp
index 4020f8b..4669f16 100644
--- a/Swiften/Elements/UnitTest/StanzaTest.cpp
+++ b/Swiften/Elements/UnitTest/StanzaTest.cpp
@@ -7,6 +7,7 @@
 #include <cppunit/extensions/HelperMacros.h>
 #include <cppunit/extensions/TestFactoryRegistry.h>
 #include <boost/shared_ptr.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
 
 #include "Swiften/Elements/Stanza.h"
 #include "Swiften/Elements/Payload.h"
diff --git a/Swiften/Entity/Entity.cpp b/Swiften/Entity/Entity.cpp
index da2ecaf..dea47b0 100644
--- a/Swiften/Entity/Entity.cpp
+++ b/Swiften/Entity/Entity.cpp
@@ -6,26 +6,45 @@
 
 #include "Swiften/Entity/Entity.h"
 
+#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
+#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
+
+
 namespace Swift {
 
+Entity::Entity() {
+	payloadParserFactories = new FullPayloadParserFactoryCollection();
+	payloadSerializers = new FullPayloadSerializerCollection();
+}
+
 Entity::~Entity() {
+	delete payloadSerializers;
+	delete payloadParserFactories;
 }
 
 
 void Entity::addPayloadParserFactory(PayloadParserFactory* payloadParserFactory) {
-	payloadParserFactories.addFactory(payloadParserFactory);
+	payloadParserFactories->addFactory(payloadParserFactory);
 }
 
 void Entity::removePayloadParserFactory(PayloadParserFactory* payloadParserFactory) {
-	payloadParserFactories.removeFactory(payloadParserFactory);
+	payloadParserFactories->removeFactory(payloadParserFactory);
 }
 
 void Entity::addPayloadSerializer(PayloadSerializer* payloadSerializer) {
-	payloadSerializers.addSerializer(payloadSerializer);
+	payloadSerializers->addSerializer(payloadSerializer);
 }
 
 void Entity::removePayloadSerializer(PayloadSerializer* payloadSerializer) {
-	payloadSerializers.removeSerializer(payloadSerializer);
+	payloadSerializers->removeSerializer(payloadSerializer);
+}
+
+PayloadParserFactoryCollection* Entity::getPayloadParserFactories() {
+	return payloadParserFactories;
+}
+
+PayloadSerializerCollection* Entity::getPayloadSerializers() {
+	return payloadSerializers;
 }
 
 }
diff --git a/Swiften/Entity/Entity.h b/Swiften/Entity/Entity.h
index 20d02ba..65480d0 100644
--- a/Swiften/Entity/Entity.h
+++ b/Swiften/Entity/Entity.h
@@ -6,21 +6,20 @@
 
 #pragma once
 
-#include <Swiften/Base/boost_bsignals.h>
-#include <boost/shared_ptr.hpp>
-
-#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
-#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
-
 namespace Swift {
 	class PayloadParserFactory;
 	class PayloadSerializer;
+	class FullPayloadParserFactoryCollection;
+	class FullPayloadSerializerCollection;
+	class PayloadParserFactoryCollection;
+	class PayloadSerializerCollection;
 
 	/** 
 	 * The base class for XMPP entities (Clients, Components).
 	 */
 	class Entity  {
 		public: 
+			Entity();
 			virtual ~Entity();
 
 			void addPayloadParserFactory(PayloadParserFactory* payloadParserFactory);
@@ -30,16 +29,11 @@ namespace Swift {
 			void removePayloadSerializer(PayloadSerializer* payloadSerializer);
 
 		protected:
-			PayloadParserFactoryCollection* getPayloadParserFactories() {
-				return &payloadParserFactories;
-			}
-
-			PayloadSerializerCollection* getPayloadSerializers() {
-				return &payloadSerializers;
-			}
+			PayloadParserFactoryCollection* getPayloadParserFactories();
+			PayloadSerializerCollection* getPayloadSerializers();
 
 		private:
-			FullPayloadParserFactoryCollection payloadParserFactories;
-			FullPayloadSerializerCollection payloadSerializers;
+			FullPayloadParserFactoryCollection* payloadParserFactories;
+			FullPayloadSerializerCollection* payloadSerializers;
 	};
 }
diff --git a/Swiften/EventLoop/DummyEventLoop.cpp b/Swiften/EventLoop/DummyEventLoop.cpp
new file mode 100644
index 0000000..3741eec
--- /dev/null
+++ b/Swiften/EventLoop/DummyEventLoop.cpp
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/EventLoop/DummyEventLoop.h>
+
+#include <iostream>
+
+namespace Swift {
+
+DummyEventLoop::DummyEventLoop() {
+}
+
+DummyEventLoop::~DummyEventLoop() {
+	if (!events_.empty()) {
+		std::cerr << "DummyEventLoop: Unhandled events at destruction time" << std::endl;
+	}
+	events_.clear();
+}
+
+
+}
diff --git a/Swiften/EventLoop/DummyEventLoop.h b/Swiften/EventLoop/DummyEventLoop.h
index b7ef516..68f9b85 100644
--- a/Swiften/EventLoop/DummyEventLoop.h
+++ b/Swiften/EventLoop/DummyEventLoop.h
@@ -7,24 +7,14 @@
 #pragma once
 
 #include <deque>
-#include <iostream>
-#include <boost/function.hpp>
 
 #include "Swiften/EventLoop/EventLoop.h"
-#include "Swiften/Base/foreach.h"
 
 namespace Swift {
 	class DummyEventLoop : public EventLoop {
 		public:
-			DummyEventLoop() {
-			}
-
-			~DummyEventLoop() {
-				if (!events_.empty()) {
-					std::cerr << "DummyEventLoop: Unhandled events at destruction time" << std::endl;
-				}
-				events_.clear();
-			}
+			DummyEventLoop();
+			~DummyEventLoop();
 
 			void processEvents() {
 				while (!events_.empty()) {
diff --git a/Swiften/EventLoop/SConscript b/Swiften/EventLoop/SConscript
index 21ae8b9..e448f43 100644
--- a/Swiften/EventLoop/SConscript
+++ b/Swiften/EventLoop/SConscript
@@ -5,6 +5,7 @@ sources = [
 		"EventOwner.cpp",
 		"Event.cpp",
 		"SimpleEventLoop.cpp",
+		"DummyEventLoop.cpp",
 	]
 
 objects = swiften_env.SwiftenObject(sources)
diff --git a/Swiften/Examples/BenchTool/BenchTool.cpp b/Swiften/Examples/BenchTool/BenchTool.cpp
index 9e54ed9..1fb6601 100644
--- a/Swiften/Examples/BenchTool/BenchTool.cpp
+++ b/Swiften/Examples/BenchTool/BenchTool.cpp
@@ -6,6 +6,7 @@
 
 #include <boost/bind.hpp>
 #include <boost/thread.hpp>
+#include <iostream>
 
 #include "Swiften/Client/Client.h"
 #include "Swiften/Network/TimerFactory.h"
diff --git a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
index fda203a..3b66d96 100644
--- a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
+++ b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
@@ -6,6 +6,7 @@
 
 #include <boost/bind.hpp>
 #include <boost/thread.hpp>
+#include <iostream>
 
 #include "Swiften/Client/Client.h"
 #include "Swiften/Network/Timer.h"
diff --git a/Swiften/Examples/SendFile/ReceiveFile.cpp b/Swiften/Examples/SendFile/ReceiveFile.cpp
index b46d790..effa1b7 100644
--- a/Swiften/Examples/SendFile/ReceiveFile.cpp
+++ b/Swiften/Examples/SendFile/ReceiveFile.cpp
@@ -7,7 +7,10 @@
 #include <boost/bind.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/smart_ptr/make_shared.hpp>
+#include <iostream>
 
+#include <Swiften/Elements/Presence.h>
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Client/Client.h>
 #include <Swiften/Network/BoostNetworkFactories.h>
 #include <Swiften/EventLoop/SimpleEventLoop.h>
diff --git a/Swiften/Examples/SendFile/SendFile.cpp b/Swiften/Examples/SendFile/SendFile.cpp
index 5ec00a9..565c51f 100644
--- a/Swiften/Examples/SendFile/SendFile.cpp
+++ b/Swiften/Examples/SendFile/SendFile.cpp
@@ -6,8 +6,10 @@
 
 #include <boost/bind.hpp>
 #include <boost/filesystem.hpp>
+#include <iostream>
 
 #include "Swiften/Client/Client.h"
+#include <Swiften/Elements/Presence.h>
 #include "Swiften/Network/BoostTimer.h"
 #include "Swiften/Network/TimerFactory.h"
 #include "Swiften/Network/BoostNetworkFactories.h"
diff --git a/Swiften/Examples/SendMessage/SendMessage.cpp b/Swiften/Examples/SendMessage/SendMessage.cpp
index d7f7333..ad75318 100644
--- a/Swiften/Examples/SendMessage/SendMessage.cpp
+++ b/Swiften/Examples/SendMessage/SendMessage.cpp
@@ -6,8 +6,10 @@
 
 #include <boost/bind.hpp>
 #include <boost/thread.hpp>
+#include <iostream>
 
 #include "Swiften/Client/Client.h"
+#include "Swiften/Elements/Message.h"
 #include "Swiften/Network/BoostNetworkFactories.h"
 #include "Swiften/Network/TimerFactory.h"
 #include "Swiften/EventLoop/EventLoop.h"
diff --git a/Swiften/FileTransfer/FileReadBytestream.h b/Swiften/FileTransfer/FileReadBytestream.h
index 055e194..4027c43 100644
--- a/Swiften/FileTransfer/FileReadBytestream.h
+++ b/Swiften/FileTransfer/FileReadBytestream.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/filesystem/fstream.hpp>
 
 #include "Swiften/FileTransfer/ReadBytestream.h"
diff --git a/Swiften/FileTransfer/FileWriteBytestream.h b/Swiften/FileTransfer/FileWriteBytestream.h
index c6f7b39..16f4b1f 100644
--- a/Swiften/FileTransfer/FileWriteBytestream.h
+++ b/Swiften/FileTransfer/FileWriteBytestream.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/filesystem/fstream.hpp>
 
 #include "Swiften/FileTransfer/WriteBytestream.h"
diff --git a/Swiften/FileTransfer/IBBReceiveSession.cpp b/Swiften/FileTransfer/IBBReceiveSession.cpp
index 5c90757..f980c47 100644
--- a/Swiften/FileTransfer/IBBReceiveSession.cpp
+++ b/Swiften/FileTransfer/IBBReceiveSession.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/FileTransfer/IBBReceiveSession.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 #include "Swiften/Queries/IQRouter.h"
 #include "Swiften/FileTransfer/IBBRequest.h"
diff --git a/Swiften/FileTransfer/IBBSendSession.cpp b/Swiften/FileTransfer/IBBSendSession.cpp
index 0fb47d3..52949c4 100644
--- a/Swiften/FileTransfer/IBBSendSession.cpp
+++ b/Swiften/FileTransfer/IBBSendSession.cpp
@@ -44,7 +44,7 @@ void IBBSendSession::handleIBBResponse(IBB::ref, ErrorPayload::ref error) {
 				request->onResponse.connect(boost::bind(&IBBSendSession::handleIBBResponse, this, _1, _2));
 				request->send();
 			}
-			catch (const BytestreamException& e) {
+			catch (const BytestreamException&) {
 				finish(FileTransferError(FileTransferError::ReadError));
 			}
 		}
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
index 9951f7a..268ba4c 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/FileTransfer/SOCKS5BytestreamServerSession.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 #include "Swiften/Base/ByteArray.h"
 #include "Swiften/FileTransfer/SOCKS5BytestreamRegistry.h"
@@ -98,7 +99,7 @@ void SOCKS5BytestreamServerSession::sendData() {
 		try {
 			connection->write(bytestream->read(chunkSize));
 		}
-		catch (const BytestreamException& e) {
+		catch (const BytestreamException&) {
 			finish(true);
 		}
 	}
diff --git a/Swiften/JID/JID.h b/Swiften/JID/JID.h
index 63e063d..9f447db 100644
--- a/Swiften/JID/JID.h
+++ b/Swiften/JID/JID.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include <string>
-#include <ostream>
+#include <iosfwd>
 
 namespace Swift {
 	class JID {
diff --git a/Swiften/Jingle/JingleSession.h b/Swiften/Jingle/JingleSession.h
index c00492d..b57701b 100644
--- a/Swiften/Jingle/JingleSession.h
+++ b/Swiften/Jingle/JingleSession.h
@@ -12,7 +12,6 @@
 #include <string>
 #include <Swiften/Elements/JinglePayload.h>
 #include <Swiften/Elements/JingleContent.h>
-#include <Swiften/Base/foreach.h>
 
 namespace Swift {
 	class JingleSession {
@@ -29,9 +28,9 @@ namespace Swift {
 
 			template<typename T>
 			JingleContent::ref getContentWithDescription() const {
-				foreach (JingleContent::ref content, contents) {
-					if (content->getDescription<T>()) {
-						return content;
+				for (size_t i = 0; i < contents.size(); ++i) {
+					if (contents[i]->getDescription<T>()) {
+						return contents[i];
 					}
 				}
 				return JingleContent::ref();
diff --git a/Swiften/Jingle/JingleSessionManager.cpp b/Swiften/Jingle/JingleSessionManager.cpp
index e60449b..af512e8 100644
--- a/Swiften/Jingle/JingleSessionManager.cpp
+++ b/Swiften/Jingle/JingleSessionManager.cpp
@@ -7,6 +7,7 @@
 #include <Swiften/Jingle/JingleSessionManager.h>
 #include <Swiften/Jingle/JingleResponder.h>
 #include <Swiften/Jingle/IncomingJingleSessionHandler.h>
+#include <Swiften/Base/foreach.h>
 
 namespace Swift {
 
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.cpp
new file mode 100644
index 0000000..e31bf87
--- /dev/null
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h>
+
+#include <boost/bind.hpp>
+#include <iostream>
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h>
+
+namespace Swift {
+
+void AvahiBrowseQuery::startBrowsing() {
+	std::cout << "Start browsing" << std::endl;
+	assert(!browser);
+	avahi_threaded_poll_lock(querier->getThreadedPoll());
+	browser = avahi_service_browser_new(querier->getClient(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_presence._tcp", NULL, static_cast<AvahiLookupFlags>(0), &handleServiceDiscoveredStatic, this);
+	if (!browser) {
+		std::cout << "Error" << std::endl;
+		eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
+	}
+	avahi_threaded_poll_unlock(querier->getThreadedPoll());
+}
+
+void AvahiBrowseQuery::stopBrowsing() {
+	std::cout << "Stop browsing" << std::endl;
+	avahi_threaded_poll_lock(querier->getThreadedPoll());
+	avahi_service_browser_free(browser);
+	browser = NULL;
+	avahi_threaded_poll_unlock(querier->getThreadedPoll());
+}
+
+void AvahiBrowseQuery::handleServiceDiscovered(AvahiServiceBrowser *, AvahiIfIndex interfaceIndex, AvahiProtocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags) {
+	switch (event) {
+		case AVAHI_BROWSER_FAILURE:	
+			std::cout << "Service browse error" << std::endl;
+			eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
+			break;
+		case AVAHI_BROWSER_NEW: {
+			DNSSDServiceID service(name, domain, type, interfaceIndex);
+			std::cout << "Service discovered " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl;
+			eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this());
+			break;
+		}
+		case AVAHI_BROWSER_REMOVE: {
+			std::cout << "Service went away " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl;
+			DNSSDServiceID service(name, domain, type, interfaceIndex);
+			eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this());
+			break;
+		}
+		case AVAHI_BROWSER_ALL_FOR_NOW:
+		case AVAHI_BROWSER_CACHE_EXHAUSTED:
+			break;
+	}
+}
+
+}
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h
index 163a5f6..7641712 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiBrowseQuery.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/bind.hpp>
+#include <avahi-client/lookup.h>
 
 #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h"
 #include "Swiften/LinkLocal/DNSSD/DNSSDBrowseQuery.h"
@@ -20,54 +20,15 @@ namespace Swift {
 			AvahiBrowseQuery(boost::shared_ptr<AvahiQuerier> q, EventLoop* eventLoop) : AvahiQuery(q, eventLoop), browser(NULL) {
 			}
 
-			void startBrowsing() {
-				std::cout << "Start browsing" << std::endl;
-				assert(!browser);
-				avahi_threaded_poll_lock(querier->getThreadedPoll());
-				browser = avahi_service_browser_new(querier->getClient(), AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_presence._tcp", NULL, static_cast<AvahiLookupFlags>(0), &handleServiceDiscoveredStatic, this);
-				if (!browser) {
-					std::cout << "Error" << std::endl;
-					eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
-				}
-				avahi_threaded_poll_unlock(querier->getThreadedPoll());
-			}
-
-			void stopBrowsing() {
-				std::cout << "Stop browsing" << std::endl;
-				avahi_threaded_poll_lock(querier->getThreadedPoll());
-				avahi_service_browser_free(browser);
-				browser = NULL;
-				avahi_threaded_poll_unlock(querier->getThreadedPoll());
-			}
+			void startBrowsing();
+			void stopBrowsing();
 
 		private:
 			static void handleServiceDiscoveredStatic(AvahiServiceBrowser *b, AvahiIfIndex interfaceIndex, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags flags, void* context) {
 				static_cast<AvahiBrowseQuery*>(context)->handleServiceDiscovered(b, interfaceIndex, protocol, event, name, type, domain, flags);
 			}
 
-			void handleServiceDiscovered(AvahiServiceBrowser *, AvahiIfIndex interfaceIndex, AvahiProtocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags) {
-				switch (event) {
-					case AVAHI_BROWSER_FAILURE:	
-						std::cout << "Service browse error" << std::endl;
-						eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
-						break;
-					case AVAHI_BROWSER_NEW: {
-						DNSSDServiceID service(name, domain, type, interfaceIndex);
-						std::cout << "Service discovered " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl;
-						eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this());
-						break;
-					}
-					case AVAHI_BROWSER_REMOVE: {
-						std::cout << "Service went away " << name << " " << domain << " " << type << " " << interfaceIndex << std::endl;
-						DNSSDServiceID service(name, domain, type, interfaceIndex);
-						eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this());
-						break;
-					}
-					case AVAHI_BROWSER_ALL_FOR_NOW:
-					case AVAHI_BROWSER_CACHE_EXHAUSTED:
-						break;
-				}
-			}
+			void handleServiceDiscovered(AvahiServiceBrowser *, AvahiIfIndex interfaceIndex, AvahiProtocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags);
 
 		private:
 			AvahiServiceBrowser* browser;
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.cpp
new file mode 100644
index 0000000..7975e7b
--- /dev/null
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h>
+
+#include <iostream>
+#include <boost/bind.hpp>
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h>
+
+namespace Swift {
+
+void AvahiRegisterQuery::registerService() {
+	std::cout << "Registering service " << name << ":" << port << std::endl;
+	avahi_threaded_poll_lock(querier->getThreadedPoll());
+	if (!group) {
+		std::cout << "Creating entry group" << std::endl;
+		group = avahi_entry_group_new(querier->getClient(), handleEntryGroupChange, this);
+		if (!group) {
+			std::cout << "Error ceating entry group" << std::endl;
+			eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this());
+		}
+	}
+
+	doRegisterService();
+	avahi_threaded_poll_unlock(querier->getThreadedPoll());
+}
+
+void AvahiRegisterQuery::unregisterService() {
+	if (group) {
+		avahi_entry_group_free(group);
+		group = NULL;
+	}
+}
+
+void AvahiRegisterQuery::updateServiceInfo(const ByteArray& txtRecord) {
+	this->txtRecord = txtRecord;
+	avahi_threaded_poll_lock(querier->getThreadedPoll());
+	assert(group);
+	avahi_entry_group_reset(group);
+	doRegisterService();
+	avahi_threaded_poll_unlock(querier->getThreadedPoll());
+}
+
+void AvahiRegisterQuery::doRegisterService() {
+	AvahiStringList* txtList;
+	avahi_string_list_parse(txtRecord.getData(), txtRecord.getSize(), &txtList);
+
+	int result = avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), name.c_str(), "_presence._tcp", NULL, NULL, port, txtList);
+	if (result < 0) {
+		std::cout << "Error registering service: " << avahi_strerror(result) << std::endl;
+		eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this());
+	}
+	result = avahi_entry_group_commit(group);
+	if (result < 0) {
+		std::cout << "Error registering service: " << avahi_strerror(result) << std::endl;
+	}
+}
+
+void AvahiRegisterQuery::handleEntryGroupChange(AvahiEntryGroup* g, AvahiEntryGroupState state) {
+	std::cout << "ENtry group callback: " << state << std::endl;
+	switch (state) {
+		case AVAHI_ENTRY_GROUP_ESTABLISHED :
+			// Domain is a hack!
+			eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, "local", "_presence._tcp", 0))), shared_from_this());
+			std::cout << "Entry group established" << std::endl;
+			break;
+	case AVAHI_ENTRY_GROUP_COLLISION : {
+			std::cout << "Entry group collision" << std::endl;
+			/*char *n;
+			n = avahi_alternative_service_name(name);
+			avahi_free(name);
+			name = n;*/
+			break;
+	}
+
+	case AVAHI_ENTRY_GROUP_FAILURE :
+			std::cout << "Entry group failure " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))) << std::endl;
+			break;
+
+	case AVAHI_ENTRY_GROUP_UNCOMMITED:
+	case AVAHI_ENTRY_GROUP_REGISTERING:
+			;
+
+	/*
+	DNSServiceErrorType result = DNSServiceRegister(
+			&sdRef, 0, 0, name.c_str(), "_presence._tcp", NULL, NULL, port, 
+			txtRecord.getSize(), txtRecord.getData(), 
+			&AvahiRegisterQuery::handleServiceRegisteredStatic, this);
+	if (result != kDNSServiceErr_NoError) {
+		sdRef = NULL;
+	}*/
+	//eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this());
+	}
+}
+
+
+}
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
index 07966af..3303f1b 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
@@ -21,94 +21,18 @@ namespace Swift {
 			AvahiRegisterQuery(const std::string& name, int port, const ByteArray& txtRecord, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), name(name), port(port), txtRecord(txtRecord), group(0) {
 			}
 
-			void registerService() {
-				std::cout << "Registering service " << name << ":" << port << std::endl;
-				avahi_threaded_poll_lock(querier->getThreadedPoll());
-				if (!group) {
-					std::cout << "Creating entry group" << std::endl;
-					group = avahi_entry_group_new(querier->getClient(), handleEntryGroupChange, this);
-					if (!group) {
-						std::cout << "Error ceating entry group" << std::endl;
-						eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this());
-					}
-				}
-
-				doRegisterService();
-				avahi_threaded_poll_unlock(querier->getThreadedPoll());
-			}
-
-			void unregisterService() {
-				if (group) {
-					avahi_entry_group_free(group);
-					group = NULL;
-				}
-			}
-
-			void updateServiceInfo(const ByteArray& txtRecord) {
-				this->txtRecord = txtRecord;
-				avahi_threaded_poll_lock(querier->getThreadedPoll());
-				assert(group);
-				avahi_entry_group_reset(group);
-				doRegisterService();
-				avahi_threaded_poll_unlock(querier->getThreadedPoll());
-			}
+			void registerService();
+			void unregisterService();
+			void updateServiceInfo(const ByteArray& txtRecord);
 
 		private:
-			void doRegisterService() {
-				AvahiStringList* txtList;
-				avahi_string_list_parse(txtRecord.getData(), txtRecord.getSize(), &txtList);
-
-				int result = avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), name.c_str(), "_presence._tcp", NULL, NULL, port, txtList);
-				if (result < 0) {
-					std::cout << "Error registering service: " << avahi_strerror(result) << std::endl;
-					eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this());
-				}
-				result = avahi_entry_group_commit(group);
-				if (result < 0) {
-					std::cout << "Error registering service: " << avahi_strerror(result) << std::endl;
-				}
-			}
+			void doRegisterService();
 
 			static void handleEntryGroupChange(AvahiEntryGroup *g, AvahiEntryGroupState state, void *userdata) {
 				static_cast<AvahiRegisterQuery*>(userdata)->handleEntryGroupChange(g, state);
 			}
 
-			void handleEntryGroupChange(AvahiEntryGroup* g, AvahiEntryGroupState state) {
-				std::cout << "ENtry group callback: " << state << std::endl;
-				switch (state) {
-					case AVAHI_ENTRY_GROUP_ESTABLISHED :
-						// Domain is a hack!
-						eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>(DNSSDServiceID(name, "local", "_presence._tcp", 0))), shared_from_this());
-						std::cout << "Entry group established" << std::endl;
-						break;
-				case AVAHI_ENTRY_GROUP_COLLISION : {
-						std::cout << "Entry group collision" << std::endl;
-						/*char *n;
-						n = avahi_alternative_service_name(name);
-						avahi_free(name);
-						name = n;*/
-						break;
-				}
-
-				case AVAHI_ENTRY_GROUP_FAILURE :
-						std::cout << "Entry group failure " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))) << std::endl;
-						break;
-
-				case AVAHI_ENTRY_GROUP_UNCOMMITED:
-				case AVAHI_ENTRY_GROUP_REGISTERING:
-						;
-
-				/*
-				DNSServiceErrorType result = DNSServiceRegister(
-						&sdRef, 0, 0, name.c_str(), "_presence._tcp", NULL, NULL, port, 
-						txtRecord.getSize(), txtRecord.getData(), 
-						&AvahiRegisterQuery::handleServiceRegisteredStatic, this);
-				if (result != kDNSServiceErr_NoError) {
-					sdRef = NULL;
-				}*/
-				//eventLoop->postEvent(boost::bind(boost::ref(onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this());
-			}
-		}
+			void handleEntryGroupChange(AvahiEntryGroup* g, AvahiEntryGroupState state);
 
 /*
 			static void handleServiceRegisteredStatic(DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context) {
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp
new file mode 100644
index 0000000..d9a1c5c
--- /dev/null
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h>
+
+#include <iostream>
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+AvahiResolveHostnameQuery::AvahiResolveHostnameQuery(const std::string& hostname, int, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), hostname(hostname) {
+	std::cout << "Resolving hostname " << hostname << std::endl;
+}
+
+void AvahiResolveHostnameQuery::run() {
+		eventLoop->postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>(HostAddress(hostname))), shared_from_this());
+}
+
+}
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h
index 00712f1..acc1897 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.h
@@ -19,13 +19,9 @@ namespace Swift {
 
 	class AvahiResolveHostnameQuery : public DNSSDResolveHostnameQuery, public AvahiQuery {
 		public: 
-			AvahiResolveHostnameQuery(const std::string& hostname, int, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), hostname(hostname) {
-				std::cout << "Resolving hostname " << hostname << std::endl;
-			}
+			AvahiResolveHostnameQuery(const std::string& hostname, int, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop);
 
-			void run() {
-					eventLoop->postEvent(boost::bind(boost::ref(onHostnameResolved), boost::optional<HostAddress>(HostAddress(hostname))), shared_from_this());
-			}
+			void run();
 
 			void finish() {
 			}
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.cpp
new file mode 100644
index 0000000..24fe067
--- /dev/null
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h>
+
+#include <boost/bind.hpp>
+#include <iostream>
+
+#include <Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h>
+
+namespace Swift {
+
+void AvahiResolveServiceQuery::start() {
+	std::cout << "Start resolving " << service.getName() << " " << service.getType() << " " << service.getDomain() << std::endl;
+	avahi_threaded_poll_lock(querier->getThreadedPoll());
+	assert(!resolver);
+	resolver = avahi_service_resolver_new(querier->getClient(), service.getNetworkInterfaceID(), AVAHI_PROTO_UNSPEC, service.getName().c_str(), service.getType().c_str(), service.getDomain().c_str(), AVAHI_PROTO_UNSPEC, static_cast<AvahiLookupFlags>(0), handleServiceResolvedStatic, this);
+	if (!resolver) {
+		std::cout << "Error starting resolver" << std::endl;
+		eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this());
+	}
+	avahi_threaded_poll_unlock(querier->getThreadedPoll());
+}
+
+void AvahiResolveServiceQuery::stop() {
+	std::cout << "Stop resolving" << std::endl;
+	avahi_threaded_poll_lock(querier->getThreadedPoll());
+	avahi_service_resolver_free(resolver);
+	resolver = NULL;
+	avahi_threaded_poll_unlock(querier->getThreadedPoll());
+}
+
+void AvahiResolveServiceQuery::handleServiceResolved(AvahiServiceResolver* resolver, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent event, const char *name, const char * type, const char* domain, const char * /*host_name*/, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags) {
+	std::cout << "Resolve finished" << std::endl;
+	switch(event) {
+		case AVAHI_RESOLVER_FAILURE:
+			std::cout << "Resolve error " << avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(resolver))) << std::endl;
+			eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this());
+			break;
+		case AVAHI_RESOLVER_FOUND: {
+			std::cout << "Success" << std::endl;
+			char a[AVAHI_ADDRESS_STR_MAX];
+			avahi_address_snprint(a, sizeof(a), address);
+
+			ByteArray txtRecord;
+			txtRecord.resize(1024);
+			avahi_string_list_serialize(txt, txtRecord.getData(), txtRecord.getSize());
+
+			// FIXME: Probably not accurate
+			std::string fullname = std::string(name) + "." + std::string(type) + "." + std::string(domain) + ".";
+			std::cout << "Result: " << fullname << "->" << std::string(a) << ":" << port << std::endl;
+			eventLoop->postEvent(
+					boost::bind(
+						boost::ref(onServiceResolved), 
+						Result(fullname, std::string(a), port, txtRecord)),
+					shared_from_this());
+			break;
+		}
+	}
+}
+
+}
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h
index e9c4db1..be48409 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveServiceQuery.h
@@ -6,6 +6,8 @@
 
 #pragma once
 
+#include <avahi-client/lookup.h>
+
 #include "Swiften/LinkLocal/DNSSD/Avahi/AvahiQuery.h"
 #include "Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h"
 #include "Swiften/LinkLocal/LinkLocalServiceInfo.h"
@@ -20,59 +22,15 @@ namespace Swift {
 			AvahiResolveServiceQuery(const DNSSDServiceID& service, boost::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), service(service), resolver(NULL) {
 			}
 
-			void start() {
-				std::cout << "Start resolving " << service.getName() << " " << service.getType() << " " << service.getDomain() << std::endl;
-				avahi_threaded_poll_lock(querier->getThreadedPoll());
-				assert(!resolver);
-				resolver = avahi_service_resolver_new(querier->getClient(), service.getNetworkInterfaceID(), AVAHI_PROTO_UNSPEC, service.getName().c_str(), service.getType().c_str(), service.getDomain().c_str(), AVAHI_PROTO_UNSPEC, static_cast<AvahiLookupFlags>(0), handleServiceResolvedStatic, this);
-				if (!resolver) {
-					std::cout << "Error starting resolver" << std::endl;
-					eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this());
-				}
-				avahi_threaded_poll_unlock(querier->getThreadedPoll());
-			}
-
-			void stop() {
-				std::cout << "Stop resolving" << std::endl;
-				avahi_threaded_poll_lock(querier->getThreadedPoll());
-				avahi_service_resolver_free(resolver);
-				resolver = NULL;
-				avahi_threaded_poll_unlock(querier->getThreadedPoll());
-			}
+			void start();
+			void stop();
 
 		private:
 			static void handleServiceResolvedStatic(AvahiServiceResolver* resolver, AvahiIfIndex interfaceIndex, AvahiProtocol protocol, AvahiResolverEvent event, const char *name, const char *type, const char *domain, const char *host_name, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags flags, void* context) {
 				static_cast<AvahiResolveServiceQuery*>(context)->handleServiceResolved(resolver, interfaceIndex, protocol, event, name, type, domain, host_name, address, port, txt, flags);
 			}
 
-			void handleServiceResolved(AvahiServiceResolver* resolver, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent event, const char *name, const char * type, const char* domain, const char * /*host_name*/, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags) {
-				std::cout << "Resolve finished" << std::endl;
-				switch(event) {
-					case AVAHI_RESOLVER_FAILURE:
-						std::cout << "Resolve error " << avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(resolver))) << std::endl;
-						eventLoop->postEvent(boost::bind(boost::ref(onServiceResolved), boost::optional<Result>()), shared_from_this());
-						break;
-					case AVAHI_RESOLVER_FOUND: {
-						std::cout << "Success" << std::endl;
-						char a[AVAHI_ADDRESS_STR_MAX];
-						avahi_address_snprint(a, sizeof(a), address);
-
-						ByteArray txtRecord;
-						txtRecord.resize(1024);
-						avahi_string_list_serialize(txt, txtRecord.getData(), txtRecord.getSize());
-
-						// FIXME: Probably not accurate
-						std::string fullname = std::string(name) + "." + std::string(type) + "." + std::string(domain) + ".";
-						std::cout << "Result: " << fullname << "->" << std::string(a) << ":" << port << std::endl;
-						eventLoop->postEvent(
-								boost::bind(
-									boost::ref(onServiceResolved), 
-									Result(fullname, std::string(a), port, txtRecord)),
-								shared_from_this());
-						break;
-					}
-				}
-			}
+			void handleServiceResolved(AvahiServiceResolver* resolver, AvahiIfIndex, AvahiProtocol, AvahiResolverEvent event, const char *name, const char * type, const char* domain, const char * /*host_name*/, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags);
 
 		private:
 			DNSSDServiceID service;
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
index edd3056..c342247 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
@@ -9,7 +9,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <list>
-#include <boost/thread.hpp>
+#include <boost/thread/thread.hpp>
 #include <boost/thread/mutex.hpp>
 
 #include "Swiften/LinkLocal/DNSSD/DNSSDQuerier.h"
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
index d7d0228..b13b0c4 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
@@ -7,7 +7,9 @@
 #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDBrowseQuery.h"
 #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h"
 #include "Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDResolveServiceQuery.h"
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
index b2871c9..9aef6a5 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
@@ -11,7 +11,6 @@
 #include <list>
 #include <set>
 
-#include "Swiften/Base/foreach.h"
 #include <string>
 #include "Swiften/EventLoop/EventOwner.h"
 #include "Swiften/LinkLocal/DNSSD/DNSSDQuerier.h"
@@ -63,8 +62,8 @@ namespace Swift {
 			template<typename T>
 			std::vector< boost::shared_ptr<T> > getAllQueriesEverRun() const {
 				std::vector< boost::shared_ptr<T> > result;
-				foreach(const boost::shared_ptr<FakeDNSSDQuery>& query, allQueriesEverRun) {
-					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(query)) {
+				for (QueryList::const_iterator i = allQueriesEverRun.begin(); i != allQueriesEverRun.end(); ++i) {
+					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(*i)) {
 						result.push_back(resultQuery);
 					}
 				}
@@ -75,8 +74,8 @@ namespace Swift {
 			template<typename T>
 			std::vector< boost::shared_ptr<T> > getQueries() const {
 				std::vector< boost::shared_ptr<T> > result;
-				foreach(const boost::shared_ptr<FakeDNSSDQuery>& query, runningQueries) {
-					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(query)) {
+				for (QueryList::const_iterator i = runningQueries.begin(); i != runningQueries.end(); ++i) {
+					if (boost::shared_ptr<T> resultQuery = boost::dynamic_pointer_cast<T>(*i)) {
 						result.push_back(resultQuery);
 					}
 				}
@@ -86,8 +85,9 @@ namespace Swift {
 		private:
 			std::string domain;
 			EventLoop* eventLoop;
-			std::list< boost::shared_ptr<FakeDNSSDQuery> > runningQueries;
-			std::list< boost::shared_ptr<FakeDNSSDQuery> > allQueriesEverRun;
+			typedef std::list< boost::shared_ptr<FakeDNSSDQuery> > QueryList;
+			QueryList runningQueries;
+			QueryList allQueriesEverRun;
 			std::set<DNSSDServiceID> services;
 			typedef std::map<DNSSDServiceID,DNSSDResolveServiceQuery::Result> ServiceInfoMap;
 			ServiceInfoMap serviceInfo;
diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp
index 65542d2..d13032d 100644
--- a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp
+++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp
@@ -8,6 +8,7 @@
 
 #include <boost/bind.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/StreamStack/XMPPLayer.h"
 #include "Swiften/Elements/ProtocolHeader.h"
 #include "Swiften/Elements/StreamFeatures.h"
diff --git a/Swiften/LinkLocal/SConscript b/Swiften/LinkLocal/SConscript
index 6edf993..29ea692 100644
--- a/Swiften/LinkLocal/SConscript
+++ b/Swiften/LinkLocal/SConscript
@@ -31,7 +31,11 @@ elif myenv.get("HAVE_AVAHI", 0) :
 	myenv.Append(CPPDEFINES = ["HAVE_AVAHI"])
 	sources += [
 			"DNSSD/Avahi/AvahiQuerier.cpp",
-			"DNSSD/Avahi/AvahiQuery.cpp"
+			"DNSSD/Avahi/AvahiQuery.cpp",
+			"DNSSD/Avahi/AvahiResolveHostnameQuery.cpp",
+			"DNSSD/Avahi/AvahiResolveServiceQuery.cpp",
+			"DNSSD/Avahi/AvahiRegisterQuery.cpp",
+			"DNSSD/Avahi/AvahiBrowseQuery.cpp",
 		]
 
 objects = myenv.SwiftenObject(sources)
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
index 98deed1..a2e8280 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
@@ -7,6 +7,8 @@
 #include <cppunit/extensions/HelperMacros.h>
 #include <cppunit/extensions/TestFactoryRegistry.h>
 
+#include <boost/bind.hpp>
+
 #include "Swiften/LinkLocal/LinkLocalConnector.h"
 #include "Swiften/LinkLocal/LinkLocalService.h"
 #include "Swiften/LinkLocal/DNSSD/DNSSDServiceID.h"
diff --git a/Swiften/MUC/MUC.cpp b/Swiften/MUC/MUC.cpp
index 68a5a86..553e49d 100644
--- a/Swiften/MUC/MUC.cpp
+++ b/Swiften/MUC/MUC.cpp
@@ -10,6 +10,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/smart_ptr/make_shared.hpp>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/Presence/DirectedPresenceSender.h"
 #include "Swiften/Client/StanzaChannel.h"
 #include "Swiften/Queries/IQRouter.h"
diff --git a/Swiften/MUC/MUCBookmarkManager.cpp b/Swiften/MUC/MUCBookmarkManager.cpp
index d0855cd..65e15e3 100644
--- a/Swiften/MUC/MUCBookmarkManager.cpp
+++ b/Swiften/MUC/MUCBookmarkManager.cpp
@@ -9,6 +9,7 @@
 #include <boost/bind.hpp>
 #include <iostream>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/Queries/IQRouter.h"
 #include "Swiften/Queries/Requests/GetPrivateStorageRequest.h"
 #include "Swiften/Queries/Requests/SetPrivateStorageRequest.h"
diff --git a/Swiften/Network/BoostConnection.cpp b/Swiften/Network/BoostConnection.cpp
index f7ff8c4..c0faad9 100644
--- a/Swiften/Network/BoostConnection.cpp
+++ b/Swiften/Network/BoostConnection.cpp
@@ -9,6 +9,8 @@
 #include <iostream>
 #include <boost/bind.hpp>
 #include <boost/thread.hpp>
+#include <boost/asio/placeholders.hpp>
+#include <boost/asio/write.hpp>
 
 #include <Swiften/Base/Log.h>
 #include "Swiften/EventLoop/EventLoop.h"
diff --git a/Swiften/Network/BoostConnection.h b/Swiften/Network/BoostConnection.h
index 506eedf..16e587d 100644
--- a/Swiften/Network/BoostConnection.h
+++ b/Swiften/Network/BoostConnection.h
@@ -6,7 +6,8 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/asio/ip/tcp.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/thread/mutex.hpp>
 
diff --git a/Swiften/Network/BoostConnectionFactory.h b/Swiften/Network/BoostConnectionFactory.h
index ea9d656..bf1bc6c 100644
--- a/Swiften/Network/BoostConnectionFactory.h
+++ b/Swiften/Network/BoostConnectionFactory.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
 
 #include "Swiften/Network/ConnectionFactory.h"
 #include "Swiften/Network/BoostConnection.h"
diff --git a/Swiften/Network/BoostConnectionServer.cpp b/Swiften/Network/BoostConnectionServer.cpp
index 4c6403c..e5fb8c0 100644
--- a/Swiften/Network/BoostConnectionServer.cpp
+++ b/Swiften/Network/BoostConnectionServer.cpp
@@ -8,6 +8,7 @@
 
 #include <boost/bind.hpp>
 #include <boost/system/system_error.hpp>
+#include <boost/asio/placeholders.hpp>
 
 #include "Swiften/EventLoop/EventLoop.h"
 
diff --git a/Swiften/Network/BoostConnectionServer.h b/Swiften/Network/BoostConnectionServer.h
index a45e598..3424720 100644
--- a/Swiften/Network/BoostConnectionServer.h
+++ b/Swiften/Network/BoostConnectionServer.h
@@ -7,8 +7,9 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/asio/ip/tcp.hpp>
 #include <boost/enable_shared_from_this.hpp>
-#include <boost/asio.hpp>
 #include "Swiften/Base/boost_bsignals.h"
 
 #include "Swiften/Network/BoostConnection.h"
diff --git a/Swiften/Network/BoostIOServiceThread.h b/Swiften/Network/BoostIOServiceThread.h
index 1f72049..ea04b02 100644
--- a/Swiften/Network/BoostIOServiceThread.h
+++ b/Swiften/Network/BoostIOServiceThread.h
@@ -6,8 +6,8 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
-#include <boost/thread.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/thread/thread.hpp>
 #include <boost/shared_ptr.hpp>
 
 namespace Swift {
diff --git a/Swiften/Network/BoostTimer.cpp b/Swiften/Network/BoostTimer.cpp
index 12d06c1..27e4b34 100644
--- a/Swiften/Network/BoostTimer.cpp
+++ b/Swiften/Network/BoostTimer.cpp
@@ -8,6 +8,7 @@
 
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/asio.hpp>
+#include <boost/bind.hpp>
 
 #include "Swiften/EventLoop/EventLoop.h"
 
diff --git a/Swiften/Network/BoostTimer.h b/Swiften/Network/BoostTimer.h
index 1139dcf..614698d 100644
--- a/Swiften/Network/BoostTimer.h
+++ b/Swiften/Network/BoostTimer.h
@@ -6,8 +6,8 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
-#include <boost/thread.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/asio/deadline_timer.hpp>
 #include <boost/enable_shared_from_this.hpp>
 
 #include "Swiften/EventLoop/EventOwner.h"
diff --git a/Swiften/Network/BoostTimerFactory.h b/Swiften/Network/BoostTimerFactory.h
index c0e9ef7..789ba24 100644
--- a/Swiften/Network/BoostTimerFactory.h
+++ b/Swiften/Network/BoostTimerFactory.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
 
 #include "Swiften/Network/TimerFactory.h"
 #include "Swiften/Network/BoostTimer.h"
diff --git a/Swiften/Network/CAresDomainNameResolver.h b/Swiften/Network/CAresDomainNameResolver.h
index a630b61..f0973b9 100644
--- a/Swiften/Network/CAresDomainNameResolver.h
+++ b/Swiften/Network/CAresDomainNameResolver.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include <ares.h>
-#include <boost/thread.hpp>
+#include <boost/thread/thread.hpp>
 #include <boost/thread/mutex.hpp>
 #include <list>
 
diff --git a/Swiften/Network/Connection.h b/Swiften/Network/Connection.h
index 529dd82..fdbbef6 100644
--- a/Swiften/Network/Connection.h
+++ b/Swiften/Network/Connection.h
@@ -7,13 +7,13 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
+#include <Swiften/Base/boost_bsignals.h>
 
-#include "Swiften/Base/boost_bsignals.h"
-#include "Swiften/Base/ByteArray.h"
-#include <string>
-#include "Swiften/Network/HostAddressPort.h"
+#include <Swiften/Base/ByteArray.h>
 
 namespace Swift {
+	class HostAddressPort;
+
 	class Connection {
 		public:
 			typedef boost::shared_ptr<Connection> ref;
diff --git a/Swiften/Network/DummyConnection.cpp b/Swiften/Network/DummyConnection.cpp
new file mode 100644
index 0000000..ffc6dc2
--- /dev/null
+++ b/Swiften/Network/DummyConnection.cpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Network/DummyConnection.h>
+
+#include <boost/bind.hpp>
+#include <cassert>
+
+namespace Swift {
+
+DummyConnection::DummyConnection(EventLoop* eventLoop) : eventLoop(eventLoop) {
+}
+
+void DummyConnection::receive(const ByteArray& data) {
+	eventLoop->postEvent(boost::bind(boost::ref(onDataRead), ByteArray(data)), shared_from_this());
+}
+
+void DummyConnection::listen() {
+	assert(false);
+}
+
+void DummyConnection::connect(const HostAddressPort&) {
+	assert(false);
+}
+
+
+}
diff --git a/Swiften/Network/DummyConnection.h b/Swiften/Network/DummyConnection.h
index 6b426b1..e8cc48b 100644
--- a/Swiften/Network/DummyConnection.h
+++ b/Swiften/Network/DummyConnection.h
@@ -6,26 +6,20 @@
 
 #pragma once
 
-#include <cassert>
-#include <boost/bind.hpp>
 #include <boost/enable_shared_from_this.hpp>
 
 #include "Swiften/Network/Connection.h"
+#include "Swiften/Network/HostAddressPort.h"
 #include "Swiften/EventLoop/EventLoop.h"
 #include "Swiften/EventLoop/EventOwner.h"
 
 namespace Swift {
 	class DummyConnection : public Connection, public EventOwner,	public boost::enable_shared_from_this<DummyConnection> {
 		public:
-			DummyConnection(EventLoop* eventLoop) : eventLoop(eventLoop) {}
+			DummyConnection(EventLoop* eventLoop);
 
-			void listen() {
-				assert(false);
-			}
-
-			void connect(const HostAddressPort&) {
-				assert(false);
-			}
+			void listen();
+			void connect(const HostAddressPort&);
 
 			void disconnect() {
 				//assert(false);
@@ -36,9 +30,7 @@ namespace Swift {
 				onDataSent(data);
 			}
 
-			void receive(const ByteArray& data) {
-				eventLoop->postEvent(boost::bind(boost::ref(onDataRead), ByteArray(data)), shared_from_this());
-			}
+			void receive(const ByteArray& data);
 
 			HostAddressPort getLocalAddress() const {
 				return localAddress;
diff --git a/Swiften/Network/FakeConnection.cpp b/Swiften/Network/FakeConnection.cpp
new file mode 100644
index 0000000..be5555c
--- /dev/null
+++ b/Swiften/Network/FakeConnection.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Network/FakeConnection.h>
+
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+FakeConnection::FakeConnection(EventLoop* eventLoop) : eventLoop(eventLoop), state(Initial), delayConnect(false) {
+}
+
+FakeConnection::~FakeConnection() {
+}
+
+void FakeConnection::listen() {
+	assert(false);
+}
+
+void FakeConnection::setError(const Error& e) {
+	error = boost::optional<Error>(e);
+	state = DisconnectedWithError;
+	if (connectedTo) {
+		eventLoop->postEvent(
+				boost::bind(boost::ref(onDisconnected), error),
+				shared_from_this());
+	}
+}
+
+void FakeConnection::connect(const HostAddressPort& address) {
+	if (delayConnect) {
+		state = Connecting;
+	}
+	else {
+		if (!error) {
+			connectedTo = address;
+			state = Connected;
+		}
+		else {
+			state = DisconnectedWithError;
+		}
+		eventLoop->postEvent(
+				boost::bind(boost::ref(onConnectFinished), error),
+				shared_from_this());
+	}
+}
+
+void FakeConnection::disconnect() {
+	if (!error) {
+		state = Disconnected;
+	}
+	else {
+		state = DisconnectedWithError;
+	}
+	connectedTo.reset();
+	eventLoop->postEvent(
+			boost::bind(boost::ref(onDisconnected), error),
+			shared_from_this());
+}
+
+}
diff --git a/Swiften/Network/FakeConnection.h b/Swiften/Network/FakeConnection.h
index 4e2e960..693dabf 100644
--- a/Swiften/Network/FakeConnection.h
+++ b/Swiften/Network/FakeConnection.h
@@ -7,7 +7,6 @@
 #pragma once
 
 #include <boost/optional.hpp>
-#include <boost/bind.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <vector>
 
@@ -30,56 +29,17 @@ namespace Swift {
 				DisconnectedWithError
 			};
 
-			FakeConnection(EventLoop* eventLoop) : eventLoop(eventLoop), state(Initial), delayConnect(false) {}
-
-			virtual void listen() {
-				assert(false);
-			}
+			FakeConnection(EventLoop* eventLoop);
+			~FakeConnection();
 
+			virtual void listen();
 			virtual HostAddressPort getLocalAddress() const {
 				return HostAddressPort();
 			}
 
-			void setError(const Error& e) {
-				error = boost::optional<Error>(e);
-				state = DisconnectedWithError;
-				if (connectedTo) {
-					eventLoop->postEvent(
-							boost::bind(boost::ref(onDisconnected), error),
-							shared_from_this());
-				}
-			}
-
-			virtual void connect(const HostAddressPort& address) {
-				if (delayConnect) {
-					state = Connecting;
-				}
-				else {
-					if (!error) {
-						connectedTo = address;
-						state = Connected;
-					}
-					else {
-						state = DisconnectedWithError;
-					}
-					eventLoop->postEvent(
-							boost::bind(boost::ref(onConnectFinished), error),
-							shared_from_this());
-				}
-			}
-
-			virtual void disconnect() {
-				if (!error) {
-					state = Disconnected;
-				}
-				else {
-					state = DisconnectedWithError;
-				}
-				connectedTo.reset();
-				eventLoop->postEvent(
-						boost::bind(boost::ref(onDisconnected), error),
-						shared_from_this());
-			}
+			void setError(const Error& e);
+			virtual void connect(const HostAddressPort& address);
+			virtual void disconnect();
 
 			virtual void write(const ByteArray& data) {
 				dataWritten.push_back(data);
diff --git a/Swiften/Network/HostAddress.cpp b/Swiften/Network/HostAddress.cpp
index 7acd407..331a233 100644
--- a/Swiften/Network/HostAddress.cpp
+++ b/Swiften/Network/HostAddress.cpp
@@ -24,7 +24,7 @@ HostAddress::HostAddress(const std::string& address) {
 	try {
 		address_ = boost::asio::ip::address::from_string(address);
 	}
-	catch (const std::exception& t) {
+	catch (const std::exception&) {
 	}
 }
 
diff --git a/Swiften/Network/HostAddress.h b/Swiften/Network/HostAddress.h
index 34ccd24..3e9c8a6 100644
--- a/Swiften/Network/HostAddress.h
+++ b/Swiften/Network/HostAddress.h
@@ -7,12 +7,9 @@
 #pragma once
 
 #include <string>
-#include <vector>
-#include <boost/asio.hpp>
+#include <boost/asio/ip/address.hpp>
 
 namespace Swift {
-	
-
 	class HostAddress {
 		public:
 			HostAddress();
diff --git a/Swiften/Network/HostAddressPort.h b/Swiften/Network/HostAddressPort.h
index 6883380..c99ca65 100644
--- a/Swiften/Network/HostAddressPort.h
+++ b/Swiften/Network/HostAddressPort.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
+#include <boost/asio/ip/tcp.hpp>
 
 #include "Swiften/Network/HostAddress.h"
 
diff --git a/Swiften/Network/PlatformDomainNameAddressQuery.cpp b/Swiften/Network/PlatformDomainNameAddressQuery.cpp
index 1832255..ec7e663 100644
--- a/Swiften/Network/PlatformDomainNameAddressQuery.cpp
+++ b/Swiften/Network/PlatformDomainNameAddressQuery.cpp
@@ -6,6 +6,8 @@
 
 #include <Swiften/Network/PlatformDomainNameAddressQuery.h>
 
+#include <boost/asio/ip/tcp.hpp>
+
 #include <Swiften/Network/PlatformDomainNameResolver.h>
 #include <Swiften/EventLoop/EventLoop.h>
 
diff --git a/Swiften/Network/PlatformDomainNameAddressQuery.h b/Swiften/Network/PlatformDomainNameAddressQuery.h
index c2854ac..e1dc05f 100644
--- a/Swiften/Network/PlatformDomainNameAddressQuery.h
+++ b/Swiften/Network/PlatformDomainNameAddressQuery.h
@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
 #include <boost/enable_shared_from_this.hpp>
 
 #include <Swiften/Network/DomainNameAddressQuery.h>
diff --git a/Swiften/Network/PlatformDomainNameResolver.h b/Swiften/Network/PlatformDomainNameResolver.h
index e681331..295ecc5 100644
--- a/Swiften/Network/PlatformDomainNameResolver.h
+++ b/Swiften/Network/PlatformDomainNameResolver.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include <deque>
-#include <boost/thread.hpp>
+#include <boost/thread/thread.hpp>
 #include <boost/thread/mutex.hpp>
 #include <boost/thread/condition_variable.hpp>
 
diff --git a/Swiften/Network/SConscript b/Swiften/Network/SConscript
index fa186fa..420dff5 100644
--- a/Swiften/Network/SConscript
+++ b/Swiften/Network/SConscript
@@ -12,6 +12,8 @@ sourceList = [
 			"BoostIOServiceThread.cpp",
 			"ConnectionFactory.cpp",
 			"ConnectionServer.cpp",
+			"DummyConnection.cpp",
+			"FakeConnection.cpp",
  			"Connector.cpp",
 			"TimerFactory.cpp",
 			"DummyTimerFactory.cpp",
diff --git a/Swiften/Parser/PayloadParser.h b/Swiften/Parser/PayloadParser.h
index 423a2bb..3dc04df 100644
--- a/Swiften/Parser/PayloadParser.h
+++ b/Swiften/Parser/PayloadParser.h
@@ -44,6 +44,6 @@ namespace Swift {
 			/**
 			 * Retrieve a pointer to the payload.
 			 */
-			virtual Payload::ref getPayload() const = 0;
+			virtual boost::shared_ptr<Payload> getPayload() const = 0;
 	};
 }
diff --git a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
index 35db9ec..3de11ac 100644
--- a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
+++ b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
@@ -27,7 +27,7 @@ void BytestreamsParser::handleStartElement(const std::string& element, const std
 			try {
 				getPayloadInternal()->addStreamHost(Bytestreams::StreamHost(attributes.getAttribute("host"), JID(attributes.getAttribute("jid")), boost::lexical_cast<int>(attributes.getAttribute("port"))));
 			}
-			catch (boost::bad_lexical_cast& e) {
+			catch (boost::bad_lexical_cast&) {
 			}
 		}
 		else if (element == "streamhost-used") {
diff --git a/Swiften/Parser/PayloadParsers/DelayParser.cpp b/Swiften/Parser/PayloadParsers/DelayParser.cpp
index 3425b84..0ab2d7b 100644
--- a/Swiften/Parser/PayloadParsers/DelayParser.cpp
+++ b/Swiften/Parser/PayloadParsers/DelayParser.cpp
@@ -9,6 +9,7 @@
 #include <locale>
 
 #include <boost/date_time/time_facet.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
 
 namespace Swift {
 
diff --git a/Swiften/Parser/PayloadParsers/DelayParserFactory.cpp b/Swiften/Parser/PayloadParsers/DelayParserFactory.cpp
index 19d0530..48841d2 100644
--- a/Swiften/Parser/PayloadParsers/DelayParserFactory.cpp
+++ b/Swiften/Parser/PayloadParsers/DelayParserFactory.cpp
@@ -6,6 +6,7 @@
 
 #include <Swiften/Parser/PayloadParsers/DelayParserFactory.h>
 
+#include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/date_time/time_facet.hpp>
 
 namespace Swift {
diff --git a/Swiften/Parser/PayloadParsers/IBBParser.cpp b/Swiften/Parser/PayloadParsers/IBBParser.cpp
index f36dc43..308f4ab 100644
--- a/Swiften/Parser/PayloadParsers/IBBParser.cpp
+++ b/Swiften/Parser/PayloadParsers/IBBParser.cpp
@@ -27,7 +27,7 @@ void IBBParser::handleStartElement(const std::string& element, const std::string
 			try {
 				getPayloadInternal()->setSequenceNumber(boost::lexical_cast<int>(attributes.getAttribute("seq")));
 			}
-			catch (boost::bad_lexical_cast& e) {
+			catch (boost::bad_lexical_cast&) {
 			}
 		}
 		else if (element == "open") {
@@ -42,7 +42,7 @@ void IBBParser::handleStartElement(const std::string& element, const std::string
 			try {
 				getPayloadInternal()->setBlockSize(boost::lexical_cast<int>(attributes.getAttribute("block-size")));
 			}
-			catch (boost::bad_lexical_cast& e) {
+			catch (boost::bad_lexical_cast&) {
 			}
 		}
 		else if (element == "close") {
diff --git a/Swiften/Parser/PayloadParsers/PriorityParser.cpp b/Swiften/Parser/PayloadParsers/PriorityParser.cpp
index bcbf67f..553a2b1 100644
--- a/Swiften/Parser/PayloadParsers/PriorityParser.cpp
+++ b/Swiften/Parser/PayloadParsers/PriorityParser.cpp
@@ -24,7 +24,7 @@ void PriorityParser::handleEndElement(const std::string&, const std::string&) {
 		try {
 			priority = boost::lexical_cast<int>(text_);
 		}
-		catch (boost::bad_lexical_cast& e) {
+		catch (boost::bad_lexical_cast&) {
 		}
 		getPayloadInternal()->setPriority(priority);
 	}
diff --git a/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp b/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp
index 1cf7fcf..0d4a407 100644
--- a/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp
+++ b/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp
@@ -42,7 +42,7 @@ void StreamInitiationParser::handleStartElement(const std::string& element, cons
 			try {
 				currentFile.size = boost::lexical_cast<int>(attributes.getAttribute("size"));
 			}
-			catch (boost::bad_lexical_cast& e) {
+			catch (boost::bad_lexical_cast&) {
 			}
 		}
 		else if (element == "feature" && ns == FEATURE_NEG_NS) {
diff --git a/Swiften/Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp
index 68a2e4f..e2b8be2 100644
--- a/Swiften/Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp
+++ b/Swiften/Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp
@@ -24,7 +24,7 @@ class PriorityParserTest : public CppUnit::TestFixture {
 
 			CPPUNIT_ASSERT(parser.parse("<priority>-120</priority>"));
 
-			Priority::ref payload = boost::dynamic_pointer_cast<Priority>(parser.getPayload());
+			boost::shared_ptr<Priority> payload = boost::dynamic_pointer_cast<Priority>(parser.getPayload());
 			CPPUNIT_ASSERT_EQUAL(-120, payload->getPriority());
 		}
 
@@ -33,7 +33,7 @@ class PriorityParserTest : public CppUnit::TestFixture {
 
 			CPPUNIT_ASSERT(parser.parse("<priority>invalid</priority>"));
 
-			Priority::ref payload = boost::dynamic_pointer_cast<Priority>(parser.getPayload());
+			boost::shared_ptr<Priority> payload = boost::dynamic_pointer_cast<Priority>(parser.getPayload());
 			CPPUNIT_ASSERT_EQUAL(0, payload->getPriority());
 		}
 };
diff --git a/Swiften/Presence/PayloadAddingPresenceSender.cpp b/Swiften/Presence/PayloadAddingPresenceSender.cpp
index c3d1638..43071b3 100644
--- a/Swiften/Presence/PayloadAddingPresenceSender.cpp
+++ b/Swiften/Presence/PayloadAddingPresenceSender.cpp
@@ -34,7 +34,7 @@ bool PayloadAddingPresenceSender::isAvailable() const {
 	return sender->isAvailable();
 }
 
-void PayloadAddingPresenceSender::setPayload(Payload::ref payload) {
+void PayloadAddingPresenceSender::setPayload(boost::shared_ptr<Payload> payload) {
 	this->payload = payload;
 	if (lastSentPresence) {
 		sendPresence(lastSentPresence);
diff --git a/Swiften/Presence/PayloadAddingPresenceSender.h b/Swiften/Presence/PayloadAddingPresenceSender.h
index ae82970..ba891a8 100644
--- a/Swiften/Presence/PayloadAddingPresenceSender.h
+++ b/Swiften/Presence/PayloadAddingPresenceSender.h
@@ -21,7 +21,7 @@ namespace Swift {
 		public:
 			PayloadAddingPresenceSender(PresenceSender*);
 
-			void sendPresence(Presence::ref);
+			void sendPresence(boost::shared_ptr<Presence>);
 			bool isAvailable() const;
 
 			/**
@@ -30,11 +30,11 @@ namespace Swift {
 			 * with an updated payload. Initial presence is reset when unavailable presence is
 			 * sent.
 			 */
-			void setPayload(Payload::ref);
+			void setPayload(boost::shared_ptr<Payload>);
 
 		private:
-			Presence::ref lastSentPresence;
+			boost::shared_ptr<Presence> lastSentPresence;
 			PresenceSender* sender;
-			Payload::ref payload;
+			boost::shared_ptr<Payload> payload;
 	};
 }
diff --git a/Swiften/QA/ClientTest/ClientTest.cpp b/Swiften/QA/ClientTest/ClientTest.cpp
index 35bb096..09d357c 100644
--- a/Swiften/QA/ClientTest/ClientTest.cpp
+++ b/Swiften/QA/ClientTest/ClientTest.cpp
@@ -6,6 +6,7 @@
 
 #include <boost/bind.hpp>
 #include <boost/thread.hpp>
+#include <iostream>
 
 #include "Swiften/Client/Client.h"
 #include "Swiften/Network/TimerFactory.h"
diff --git a/Swiften/Queries/RawRequest.h b/Swiften/Queries/RawRequest.h
index 477952f..e5b3a1d 100644
--- a/Swiften/Queries/RawRequest.h
+++ b/Swiften/Queries/RawRequest.h
@@ -31,7 +31,7 @@ namespace Swift {
 			RawRequest(IQ::Type type, const JID& receiver, const std::string& data, IQRouter* router) : Request(type, receiver, boost::make_shared<RawXMLPayload>(data), router) {
 			}
 
-			virtual void handleResponse(Payload::ref payload, ErrorPayload::ref error) {
+			virtual void handleResponse(boost::shared_ptr<Payload> payload, ErrorPayload::ref error) {
 				if (error) {
 					onResponse(ErrorSerializer().serializePayload(error));
 				}
diff --git a/Swiften/Queries/Request.h b/Swiften/Queries/Request.h
index eee89e9..88eda63 100644
--- a/Swiften/Queries/Request.h
+++ b/Swiften/Queries/Request.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_Request_H
-#define SWIFTEN_Request_H
+#pragma once
 
 #include <boost/shared_ptr.hpp>
 #include <boost/optional.hpp>
@@ -48,15 +47,15 @@ namespace Swift {
 					const JID& receiver, 
 					IQRouter* router);
 
-			virtual void setPayload(Payload::ref payload) {
+			virtual void setPayload(boost::shared_ptr<Payload> payload) {
 				payload_ = payload;
 			}
 
-			Payload::ref getPayload() const {
+			boost::shared_ptr<Payload> getPayload() const {
 				return payload_;
 			}
 
-			virtual void handleResponse(Payload::ref, ErrorPayload::ref) = 0;
+			virtual void handleResponse(boost::shared_ptr<Payload>, boost::shared_ptr<ErrorPayload>) = 0;
 
 		private:
 			bool handleIQ(boost::shared_ptr<IQ>);
@@ -70,5 +69,3 @@ namespace Swift {
 			bool sent_;
 	};
 }
-
-#endif
diff --git a/Swiften/Queries/Requests/SubmitInBandRegistrationFormRequest.h b/Swiften/Queries/Requests/SubmitInBandRegistrationFormRequest.h
index 0700c65..5dd19b5 100644
--- a/Swiften/Queries/Requests/SubmitInBandRegistrationFormRequest.h
+++ b/Swiften/Queries/Requests/SubmitInBandRegistrationFormRequest.h
@@ -26,11 +26,11 @@ namespace Swift {
 			SetInBandRegistrationRequest(const JID& to, InBandRegistrationPayload::ref payload, IQRouter* router) : Request(IQ::Set, to, InBandRegistrationPayload::ref(payload), router) {
 			}
 
-			virtual void handleResponse(Payload::ref payload, ErrorPayload::ref error) {
+			virtual void handleResponse(boost::shared_ptr<Payload> payload, ErrorPayload::ref error) {
 				onResponse(payload, error);
 			}
 
 		public:
-			boost::signal<void (Payload::ref, ErrorPayload::ref)> onResponse;
+			boost::signal<void (boost::shared_ptr<Payload>, ErrorPayload::ref)> onResponse;
 	};
 }
diff --git a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp
new file mode 100644
index 0000000..983bc22
--- /dev/null
+++ b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010-2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h>
+
+#include <boost/bind.hpp>
+#include <cassert>
+
+using namespace Swift;
+
+XMPPRosterSignalHandler::XMPPRosterSignalHandler(Swift::XMPPRoster* roster) {
+	lastEvent_ = None;
+	roster->onJIDAdded.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDAdded, this, _1));
+	roster->onJIDRemoved.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDRemoved, this, _1));
+	roster->onJIDUpdated.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDUpdated, this, _1, _2, _3));
+}
+
+void XMPPRosterSignalHandler::handleJIDUpdated(const Swift::JID& jid, const std::string& oldName, const std::vector<std::string>& oldGroups) {
+	assert(lastEvent_ == None);
+	lastJID_ = jid;
+	lastOldName_ = oldName;
+	lastOldGroups_ = oldGroups;
+	lastEvent_ = Update;
+}
diff --git a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h
index 1bbd8e9..c59b4c6 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h
+++ b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h
@@ -3,34 +3,25 @@
  * Licensed under the GNU General Public License v3.
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
+
 #pragma once
-#include <boost/shared_ptr.hpp>
-#include <boost/bind.hpp>
 
+#include <boost/shared_ptr.hpp>
 #include <vector>
 
-
 #include "Swiften/Roster/XMPPRosterImpl.h"
 
-using namespace Swift;
-
-
 enum XMPPRosterEvents {None, Add, Remove, Update};
 
 class XMPPRosterSignalHandler {
 public:
-	XMPPRosterSignalHandler(XMPPRoster* roster) {
-		lastEvent_ = None;
-		roster->onJIDAdded.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDAdded, this, _1));
-		roster->onJIDRemoved.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDRemoved, this, _1));
-		roster->onJIDUpdated.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDUpdated, this, _1, _2, _3));
-	}
+	XMPPRosterSignalHandler(Swift::XMPPRoster* roster);
 
 	XMPPRosterEvents getLastEvent() {
 		return lastEvent_;
 	}
 
-	JID getLastJID() {
+	Swift::JID getLastJID() {
 		return lastJID_;
 	}
 
@@ -47,26 +38,20 @@ public:
 	}
 
 private:
-	void handleJIDAdded(const JID& jid) {
+	void handleJIDAdded(const Swift::JID& jid) {
 		lastJID_ = jid;
 		lastEvent_ = Add;
 	}
 
-	void handleJIDRemoved(const JID& jid) {
+	void handleJIDRemoved(const Swift::JID& jid) {
 		lastJID_ = jid;
 		lastEvent_ = Remove;
 	}
 
-	void handleJIDUpdated(const JID& jid, const std::string& oldName, const std::vector<std::string>& oldGroups) {
-		CPPUNIT_ASSERT_EQUAL(None, lastEvent_);
-		lastJID_ = jid;
-		lastOldName_ = oldName;
-		lastOldGroups_ = oldGroups;
-		lastEvent_ = Update;
-	}
+	void handleJIDUpdated(const Swift::JID& jid, const std::string& oldName, const std::vector<std::string>& oldGroups);
 
 	XMPPRosterEvents lastEvent_;
-	JID lastJID_;
+	Swift::JID lastJID_;
 	std::string lastOldName_;
 	std::vector<std::string> lastOldGroups_;
 
diff --git a/Swiften/SConscript b/Swiften/SConscript
index 8a2972a..8961d09 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -55,6 +55,7 @@ if env["SCONS_STAGE"] == "build" :
 			"Client/ClientSessionStanzaChannel.cpp",
 			"Client/CoreClient.cpp",
 			"Client/Client.cpp",
+			"Client/ClientXMLTracer.cpp",
 			"Client/ClientSession.cpp",
 			"Client/MemoryStorages.cpp",
 			"Client/FileStorages.cpp",
@@ -65,7 +66,9 @@ if env["SCONS_STAGE"] == "build" :
 			"Compress/ZLibDecompressor.cpp",
 			"Compress/ZLibCompressor.cpp",
 			"Elements/DiscoInfo.cpp",
+			"Elements/Presence.cpp",
 			"Elements/Form.cpp",
+			"Elements/StreamFeatures.cpp",
 			"Elements/Element.cpp",
 			"Elements/IQ.cpp",
 			"Elements/Payload.cpp",
@@ -138,6 +141,7 @@ if env["SCONS_STAGE"] == "build" :
 			"Server/SimpleUserRegistry.cpp",
 			"Server/UserRegistry.cpp",
 			"Session/Session.cpp",
+			"Session/SessionTracer.cpp",
 			"Session/SessionStream.cpp",
 			"Session/BasicSessionStream.cpp",
 			"StringCodecs/Base64.cpp",
@@ -260,6 +264,7 @@ if env["SCONS_STAGE"] == "build" :
 			File("Queries/UnitTest/ResponderTest.cpp"),
 			File("Roster/UnitTest/XMPPRosterImplTest.cpp"),
 			File("Roster/UnitTest/XMPPRosterControllerTest.cpp"),
+			File("Roster/UnitTest/XMPPRosterSignalHandler.cpp"),
 			File("Serializer/PayloadSerializers/UnitTest/PayloadsSerializer.cpp"),
 			File("Serializer/PayloadSerializers/UnitTest/CapsInfoSerializerTest.cpp"),
 			File("Serializer/PayloadSerializers/UnitTest/FormSerializerTest.cpp"),
@@ -318,7 +323,7 @@ if env["SCONS_STAGE"] == "build" :
 				swiften_includes.append(include)
 				if root.endswith("OpenSSL") :
 					continue
-				if file.startswith("CAres") or file.startswith("LibXML") or file.startswith("Expat") :
+				if file.startswith("CAres") or file.startswith("LibXML") or file.startswith("Expat") or file.startswith("foreach") or file.startswith("Log.h") or file.startswith("format.h") :
 					continue
 				swiften_header += "#include <" + include + ">\n"
 				swiften_includes.append(include)
diff --git a/Swiften/Serializer/IQSerializer.h b/Swiften/Serializer/IQSerializer.h
index 21ec300..784ce09 100644
--- a/Swiften/Serializer/IQSerializer.h
+++ b/Swiften/Serializer/IQSerializer.h
@@ -7,8 +7,6 @@
 #ifndef SWIFTEN_IQSerializer_H
 #define SWIFTEN_IQSerializer_H
 
-#include <cassert>
-
 #include "Swiften/Serializer/GenericStanzaSerializer.h"
 #include "Swiften/Elements/IQ.h"
 #include "Swiften/Serializer/XML/XMLElement.h"
diff --git a/Swiften/Serializer/PayloadSerializer.h b/Swiften/Serializer/PayloadSerializer.h
index 34e6679..c4ad23b 100644
--- a/Swiften/Serializer/PayloadSerializer.h
+++ b/Swiften/Serializer/PayloadSerializer.h
@@ -4,15 +4,14 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_PAYLOADSERIALIZER_H
-#define SWIFTEN_PAYLOADSERIALIZER_H
-
-#include <boost/shared_ptr.hpp>
+#pragma once
 
 #include <string>
-#include "Swiften/Elements/Payload.h"
+#include <boost/shared_ptr.hpp>
 
 namespace Swift {
+	class Payload;
+
 	class PayloadSerializer {
 		public:
 			virtual ~PayloadSerializer();
@@ -21,5 +20,3 @@ namespace Swift {
 			virtual std::string serialize(boost::shared_ptr<Payload>) const = 0;
 	};
 }
-
-#endif
diff --git a/Swiften/Serializer/PayloadSerializers/DelaySerializer.cpp b/Swiften/Serializer/PayloadSerializers/DelaySerializer.cpp
index 4922042..bdf5505 100644
--- a/Swiften/Serializer/PayloadSerializers/DelaySerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/DelaySerializer.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/Serializer/PayloadSerializers/DelaySerializer.h"
 
 #include <boost/shared_ptr.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
 
 #include <Swiften/Base/String.h>
 #include "Swiften/Serializer/XML/XMLElement.h"
diff --git a/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
index d7e1613..f19874a 100644
--- a/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
@@ -6,6 +6,9 @@
 
 #include "Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.h"
 
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
 #include "Swiften/Serializer/XML/XMLElement.h"
 #include <Swiften/Base/String.h>
 
diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
index 70fb2ac..ee9f279 100644
--- a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
@@ -49,7 +49,7 @@ std::string StreamInitiationSerializer::serializePayload(boost::shared_ptr<Strea
 		siElement.addNode(fileElement);
 	}
 
-	boost::shared_ptr<XMLElement> featureElement(new XMLElement("feature", "http://jabber.org/protocol/feature-neg"));
+	boost::shared_ptr<XMLElement> featureElement(new XMLElement("feature", FEATURE_NEG_NS));
 	if (streamInitiation->getProvidedMethods().size() > 0) {
 		Form::ref form(new Form(Form::FormType));
 		ListSingleFormField::ref field = ListSingleFormField::create();
diff --git a/Swiften/Serializer/PresenceSerializer.h b/Swiften/Serializer/PresenceSerializer.h
index 3cb9aab..be31597 100644
--- a/Swiften/Serializer/PresenceSerializer.h
+++ b/Swiften/Serializer/PresenceSerializer.h
@@ -7,8 +7,6 @@
 #ifndef SWIFTEN_PresenceSerializer_H
 #define SWIFTEN_PresenceSerializer_H
 
-#include <cassert>
-
 #include "Swiften/Serializer/GenericStanzaSerializer.h"
 #include "Swiften/Elements/Presence.h"
 
diff --git a/Swiften/Serializer/StanzaSerializer.cpp b/Swiften/Serializer/StanzaSerializer.cpp
index cfc9a43..6bd2ef0 100644
--- a/Swiften/Serializer/StanzaSerializer.cpp
+++ b/Swiften/Serializer/StanzaSerializer.cpp
@@ -10,6 +10,7 @@
 #include <typeinfo>
 #include <iostream>
 
+#include <Swiften/Base/foreach.h>
 #include "Swiften/Serializer/XML/XMLElement.h"
 #include "Swiften/Serializer/XML/XMLRawTextNode.h"
 #include "Swiften/Serializer/PayloadSerializer.h"
diff --git a/Swiften/Session/SessionTracer.cpp b/Swiften/Session/SessionTracer.cpp
new file mode 100644
index 0000000..6d41e40
--- /dev/null
+++ b/Swiften/Session/SessionTracer.cpp
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/Session/SessionTracer.h>
+
+#include <iostream>
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+SessionTracer::SessionTracer(boost::shared_ptr<Session> session) : session(session) {
+	session->onDataRead.connect(boost::bind(&SessionTracer::printData, this, '<', _1));
+	session->onDataWritten.connect(boost::bind(&SessionTracer::printData, this, '>', _1));
+}
+
+void SessionTracer::printData(char direction, const ByteArray& data) {
+	std::cerr << direction << direction << " " << session->getLocalJID() << " ";
+	for (unsigned int i = 0; i < 72 - session->getLocalJID().toString().size() - session->getRemoteJID().toString().size(); ++i) {
+		std::cerr << direction;
+	}
+	std::cerr << " " << session->getRemoteJID()<< " " << direction << direction << std::endl;
+	std::cerr << data.toString() << std::endl;
+}
+
+}
diff --git a/Swiften/Session/SessionTracer.h b/Swiften/Session/SessionTracer.h
index cce45eb..51b8d16 100644
--- a/Swiften/Session/SessionTracer.h
+++ b/Swiften/Session/SessionTracer.h
@@ -6,29 +6,18 @@
 
 #pragma once
 
-#include <iostream>
+#include <string>
 
 #include "Swiften/Session/Session.h"
-#include <string>
 #include "Swiften/Base/ByteArray.h"
 
 namespace Swift {
 	class SessionTracer {
 		public:
-			SessionTracer(boost::shared_ptr<Session> session) : session(session) {
-				session->onDataRead.connect(boost::bind(&SessionTracer::printData, this, '<', _1));
-				session->onDataWritten.connect(boost::bind(&SessionTracer::printData, this, '>', _1));
-			}
+			SessionTracer(boost::shared_ptr<Session> session);
 
 		private:
-			void printData(char direction, const ByteArray& data) {
-				std::cerr << direction << direction << " " << session->getLocalJID() << " ";
-				for (unsigned int i = 0; i < 72 - session->getLocalJID().toString().size() - session->getRemoteJID().toString().size(); ++i) {
-					std::cerr << direction;
-				}
-				std::cerr << " " << session->getRemoteJID()<< " " << direction << direction << std::endl;
-				std::cerr << data.toString() << std::endl;
-			}
+			void printData(char direction, const ByteArray& data);
 
 			boost::shared_ptr<Session> session;
 	};
diff --git a/Swiften/StreamManagement/StanzaAckRequester.cpp b/Swiften/StreamManagement/StanzaAckRequester.cpp
index f7d603b..4b626c9 100644
--- a/Swiften/StreamManagement/StanzaAckRequester.cpp
+++ b/Swiften/StreamManagement/StanzaAckRequester.cpp
@@ -7,6 +7,7 @@
 #include "Swiften/StreamManagement/StanzaAckRequester.h"
 
 #include <boost/numeric/conversion/cast.hpp>
+#include <iostream>
 
 #include "Swiften/Elements/Message.h"
 
diff --git a/Swiften/StreamStack/CompressionLayer.h b/Swiften/StreamStack/CompressionLayer.h
index b8293a8..7d8656e 100644
--- a/Swiften/StreamStack/CompressionLayer.h
+++ b/Swiften/StreamStack/CompressionLayer.h
@@ -27,7 +27,7 @@ namespace Swift {
 				try {
 					writeDataToChildLayer(compressor_.process(data));
 				}
-				catch (const ZLibException& e) {
+				catch (const ZLibException&) {
 					onError();
 				}
 			}
@@ -36,7 +36,7 @@ namespace Swift {
 				try {
 					writeDataToParentLayer(decompressor_.process(data));
 				}
-				catch (const ZLibException& e) {
+				catch (const ZLibException&) {
 					onError();
 				}
 			}
diff --git a/Swiften/StreamStack/ConnectionLayer.cpp b/Swiften/StreamStack/ConnectionLayer.cpp
new file mode 100644
index 0000000..00b4289
--- /dev/null
+++ b/Swiften/StreamStack/ConnectionLayer.cpp
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/StreamStack/ConnectionLayer.h>
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+ConnectionLayer::ConnectionLayer(boost::shared_ptr<Connection> connection) : connection(connection) {
+	connection->onDataRead.connect(boost::bind(&ConnectionLayer::writeDataToParentLayer, this, _1));
+}
+
+ConnectionLayer::~ConnectionLayer() {
+	connection->onDataRead.disconnect(boost::bind(&ConnectionLayer::writeDataToParentLayer, this, _1));
+}
+
+
+}
diff --git a/Swiften/StreamStack/ConnectionLayer.h b/Swiften/StreamStack/ConnectionLayer.h
index 0da0900..bd9c093 100644
--- a/Swiften/StreamStack/ConnectionLayer.h
+++ b/Swiften/StreamStack/ConnectionLayer.h
@@ -6,9 +6,7 @@
 
 #pragma once
 
-#include "Swiften/Base/boost_bsignals.h"
 #include <boost/shared_ptr.hpp>
-#include <boost/bind.hpp>
 
 #include "Swiften/StreamStack/LowLayer.h"
 #include "Swiften/Network/Connection.h"
@@ -16,13 +14,8 @@
 namespace Swift {
 	class ConnectionLayer : public LowLayer {
 		public:
-			ConnectionLayer(boost::shared_ptr<Connection> connection) : connection(connection) {
-				connection->onDataRead.connect(boost::bind(&ConnectionLayer::writeDataToParentLayer, this, _1));
-			}
-
-			~ConnectionLayer() {
-				connection->onDataRead.disconnect(boost::bind(&ConnectionLayer::writeDataToParentLayer, this, _1));
-			}
+			ConnectionLayer(boost::shared_ptr<Connection> connection);
+			~ConnectionLayer();
 
 			void writeData(const ByteArray& data) {
 				connection->write(data);
diff --git a/Swiften/StreamStack/SConscript b/Swiften/StreamStack/SConscript
index 022c695..06fcc03 100644
--- a/Swiften/StreamStack/SConscript
+++ b/Swiften/StreamStack/SConscript
@@ -6,6 +6,7 @@ sources = [
 		"HighLayer.cpp",
 		"LowLayer.cpp",
 		"StreamStack.cpp",
+		"ConnectionLayer.cpp",
 		"TLSLayer.cpp",
 		"WhitespacePingLayer.cpp",
 		"XMPPLayer.cpp",
diff --git a/Swiften/StreamStack/StreamStack.h b/Swiften/StreamStack/StreamStack.h
index 562245e..c9ebecd 100644
--- a/Swiften/StreamStack/StreamStack.h
+++ b/Swiften/StreamStack/StreamStack.h
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "Swiften/Elements/Stanza.h"
-#include "Swiften/Base/foreach.h"
 
 namespace Swift {
 	class XMPPLayer;
@@ -30,8 +29,8 @@ namespace Swift {
 			}
 
 			template<typename T> T* getLayer() {
-				foreach(StreamLayer* streamLayer, layers_) {
-					T* layer = dynamic_cast<T*>(streamLayer);
+				for (size_t i = 0; i < layers_.size(); ++i) {
+					T* layer = dynamic_cast<T*>(layers_[i]);
 					if (layer) {
 						return layer;
 					}
diff --git a/Swiften/VCards/VCardFileStorage.cpp b/Swiften/VCards/VCardFileStorage.cpp
index a246838..ec676e1 100644
--- a/Swiften/VCards/VCardFileStorage.cpp
+++ b/Swiften/VCards/VCardFileStorage.cpp
@@ -7,6 +7,8 @@
 #include "Swiften/VCards/VCardFileStorage.h"
 
 #include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem.hpp>
+#include <iostream>
 
 #include <Swiften/Base/String.h>
 #include <Swiften/StringCodecs/Hexify.h>
diff --git a/Swiften/VCards/VCardFileStorage.h b/Swiften/VCards/VCardFileStorage.h
index 26bf4b2..ba422f4 100644
--- a/Swiften/VCards/VCardFileStorage.h
+++ b/Swiften/VCards/VCardFileStorage.h
@@ -7,7 +7,7 @@
 #pragma once
 
 #include <boost/shared_ptr.hpp>
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
 #include <string>
 #include <map>
 
diff --git a/Swiftob/Commands.cpp b/Swiftob/Commands.cpp
index e39d23e..0e44a23 100644
--- a/Swiftob/Commands.cpp
+++ b/Swiftob/Commands.cpp
@@ -6,6 +6,7 @@
 
 #include "Swiftob/Commands.h"
 
+#include <Swiften/Base/foreach.h>
 #include <iostream>
 #include <boost/bind.hpp>
 
diff --git a/Swiftob/LuaCommands.cpp b/Swiftob/LuaCommands.cpp
index 7be818e..3843fb3 100644
--- a/Swiftob/LuaCommands.cpp
+++ b/Swiftob/LuaCommands.cpp
@@ -9,7 +9,9 @@
 #include <boost/bind.hpp>
 #include <vector>
 #include <algorithm>
+#include <iostream>
 
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Client/Client.h>
 #include <Swiften/Network/TimerFactory.h>
 
diff --git a/Swiftob/MUCs.cpp b/Swiftob/MUCs.cpp
index 55bf313..0f9d7d2 100644
--- a/Swiftob/MUCs.cpp
+++ b/Swiftob/MUCs.cpp
@@ -6,6 +6,10 @@
 
 #include "Swiftob/MUCs.h"
 
+#include <boost/bind.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Client/Client.h>
 #include <Swiften/MUC/MUC.h>
 #include <Swiften/MUC/MUCManager.h>
diff --git a/Swiftob/Users.cpp b/Swiftob/Users.cpp
index 55ba4eb..e9344a0 100644
--- a/Swiftob/Users.cpp
+++ b/Swiftob/Users.cpp
@@ -8,6 +8,7 @@
 
 #include <iostream>
 
+#include <Swiften/Base/foreach.h>
 #include <Swiften/Client/Client.h>
 
 #include "Swiftob/MUCs.h"
-- 
cgit v0.10.2-6-g49f6