diff --git a/configure.ac b/configure.ac
index 4292d007..af66d1fc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@ dnl Define Versioning Information
 dnl ***********************************************************************
 m4_define([builder_major_version],[3])
 m4_define([builder_minor_version],[22])
-m4_define([builder_micro_version],[4])
+m4_define([builder_micro_version],[5])
 m4_define([builder_version],[builder_major_version.builder_minor_version.builder_micro_version])
 m4_define([builder_interface_age],[0])
 m4_define([builder_bugreport_url],
diff --git a/plugins/vala-pack/Makefile.am b/plugins/vala-pack/Makefile.am
index 187b7cc2..eb43b91c 100644
--- a/plugins/vala-pack/Makefile.am
+++ b/plugins/vala-pack/Makefile.am
@@ -39,6 +39,7 @@ libvala_pack_plugin_la_VALASOURCES = \
 	ide-vala-source-file.vala \
 	ide-vala-symbol-resolver.vala \
 	ide-vala-symbol-tree.vala \
+	ide-vala-build-result-addin.vala \
 	vala-pack-plugin.vala \
 	$(NULL)
 
@@ -58,6 +59,7 @@ nodist_libvala_pack_plugin_la_SOURCES = \
 	ide-vala-source-file.c \
 	ide-vala-symbol-resolver.c \
 	ide-vala-symbol-tree.c \
+	ide-vala-build-result-addin.c \
 	vala-pack-plugin.c \
 	$(NULL)
 
@@ -69,6 +71,7 @@ libvala_pack_plugin_la_VALAFLAGS = \
 	--pkg libvala-$(VALA_VERSION) \
 	--pkg posix \
 	--pkg gio-2.0 \
+	--pkg egg-private \
 	--pkg template-glib-1.0 \
 	$(NULL)
 
diff --git a/plugins/vala-pack/ide-vala-build-result-addin.vala b/plugins/vala-pack/ide-vala-build-result-addin.vala
new file mode 100644
index 00000000..b9583791
--- /dev/null
+++ b/plugins/vala-pack/ide-vala-build-result-addin.vala
@@ -0,0 +1,160 @@
+/* ide-vala-symbol-resolver.vala
+ *
+ * Copyright (C) 2015 Christian Hergert <christian@hergert.me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+using GLib;
+using Ide;
+using Vala;
+using Egg;
+
+namespace Ide
+{
+	public class ValaBuildResultAddin: Ide.Object, Ide.BuildResultAddin
+	{
+		const string ERROR_FORMAT_REGEX = """
+  (?<filename>[a-zA-Z0-9\\-\\.\\/]+):
+  (?<line>\\d+):
+  (?<column>\\d+):
+  (?<level>[\\w\\s]+):
+  (?<message>.*)""";
+		private GLib.Regex errfmt;
+		Egg.SignalGroup signals;
+		private string current_dir;
+		private string top_dir;
+
+		construct {
+			try {
+				errfmt = new GLib.Regex (ERROR_FORMAT_REGEX,
+					GLib.RegexCompileFlags.OPTIMIZE | GLib.RegexCompileFlags.CASELESS, 0);
+			} catch { assert_not_reached (); }
+			assert (errfmt != null);
+			signals = new Egg.SignalGroup (typeof (BuildResult));
+		}
+
+		public void load (Ide.BuildResult result) {
+			signals.set_target (result);
+		}
+		public void unload (Ide.BuildResult result) {
+			signals.set_target (null);
+		}
+
+
+		private Ide.Diagnostic? create_diagnostic (GLib.MatchInfo match_info) {
+			assert (match_info != null);
+			string message = match_info.fetch_named ("message");
+			string filename = match_info.fetch_named ("filename");
+			string line = match_info.fetch_named ("line");
+			string column = match_info.fetch_named ("column");
+			string level = match_info.fetch_named ("level");
+			Context context = this.get_context ();
+			if (!Path.is_absolute (filename) && current_dir != null) {
+				string basedir = current_dir;
+				if (basedir.has_prefix (top_dir)) {
+					if ((top_dir+"/") in basedir)
+						basedir.replace (top_dir+"/", "");
+					else
+						basedir.replace (top_dir, "");
+				}
+				string path = Path.build_filename (basedir, filename, null);
+				filename = path;
+			}
+			if (!Path.is_absolute (filename)) {
+				GLib.File child = null;
+				Ide.Vcs vcs;
+				GLib.File workdir;
+				string path;
+
+				vcs = context.get_vcs ();
+				workdir = vcs.get_working_directory ();
+
+				child = workdir.get_child (filename);
+				path = child.get_path ();
+
+				filename = path;
+			}
+
+			int nline = int.parse (line);
+			if (nline < 1 || nline > int.MAX)
+				return null;
+			nline--;
+
+			int ncolumn = int.parse (column);
+			if (ncolumn < 1 || ncolumn > int.MAX)
+				return null;
+			ncolumn--;
+
+			Ide.DiagnosticSeverity severity = parse_severity (level);
+
+			Ide.File file = new Ide.File.for_path (context, filename);
+			Ide.SourceLocation location = new Ide.SourceLocation (file, nline, ncolumn, 0);
+			Ide.Diagnostic diagnostic = new Ide.Diagnostic (severity, message, location);
+
+			return diagnostic;
+		}
+
+		private static Ide.DiagnosticSeverity parse_severity (string str) {
+			if (str == null)
+				return Ide.DiagnosticSeverity.WARNING;
+			var lower = str.down ();
+			if (lower == "fatal")
+			return Ide.DiagnosticSeverity.FATAL;
+
+			if (lower == "error")
+				return Ide.DiagnosticSeverity.ERROR;
+
+			if (lower == "warning")
+				return Ide.DiagnosticSeverity.WARNING;
+
+			if (lower == "ignored")
+				return Ide.DiagnosticSeverity.IGNORED;
+
+			if (lower == "deprecated")
+				return Ide.DiagnosticSeverity.DEPRECATED;
+
+			if (lower == "note")
+				return Ide.DiagnosticSeverity.NOTE;
+
+			return Ide.DiagnosticSeverity.WARNING;
+		}
+
+		private void
+		log (Ide.BuildResultLog log, string message, Ide.BuildResult result) {
+			GLib.MatchInfo match_info = null;
+			string enterdir = null;
+
+			assert (result is BuildResult);
+			string begin = "Entering directory '";
+			string end = "'\n";
+
+			/*
+			* This expects LANG=C, which is defined in the autotools Builder.
+			* Not the most ideal decoupling of logic, but we don't have a whole
+			* lot to work with here.
+			*/
+			if ((begin in message) && (end in message)) {
+				current_dir = message.replace (begin, "");
+				current_dir = current_dir.replace (end,"");
+			}
+			if (errfmt.match (message, 0, out match_info)) {
+				Ide.Diagnostic diagnostic = create_diagnostic (match_info);
+				if (diagnostic != null)
+					result.emit_diagnostic (diagnostic);
+			}
+		}
+	}
+}
+
diff --git a/plugins/vala-pack/vala-pack-plugin.vala b/plugins/vala-pack/vala-pack-plugin.vala
index 59593d19..5c0edea4 100644
--- a/plugins/vala-pack/vala-pack-plugin.vala
+++ b/plugins/vala-pack/vala-pack-plugin.vala
@@ -31,4 +31,5 @@ public void peas_register_types (GLib.TypeModule module)
 	peas.register_extension_type (typeof (Ide.PreferencesAddin), typeof (Ide.ValaPreferencesAddin));
 	peas.register_extension_type (typeof (Ide.Service), typeof (Ide.ValaService));
 	peas.register_extension_type (typeof (Ide.SymbolResolver), typeof (Ide.ValaSymbolResolver));
+	peas.register_extension_type (typeof (Ide.BuildResultAddin), typeof (Ide.ValaBuildResultAddin));
 }
