diff --git a/src/lilv_internal.h b/src/lilv_internal.h
index af8e31a..72be413 100644
--- a/src/lilv_internal.h
+++ b/src/lilv_internal.h
@@ -185,6 +185,8 @@ struct LilvWorldImpl {
 		SordNode* lv2_requiredFeature;
 		SordNode* lv2_symbol;
 		SordNode* lv2_prototype;
+		SordNode* mod_builderVersion;
+		SordNode* mod_releaseNumber;
 		SordNode* owl_Ontology;
 		SordNode* pset_value;
 		SordNode* rdf_a;
@@ -238,8 +240,10 @@ struct LilvUIImpl {
 };
 
 typedef struct LilvVersion {
+	int builder;
 	int minor;
 	int micro;
+	int release;
 } LilvVersion;
 
 /*
@@ -335,6 +339,42 @@ lilv_version_cmp(const LilvVersion* a, const LilvVersion* b)
 	}
 }
 
+static inline int
+lilv_version_cmp_mod(const LilvVersion* a, const LilvVersion* b)
+{
+	// same version
+	if (a->builder == b->builder && a->minor == b->minor
+	    && a->micro == b->micro && a->release == b->release)
+		return 0;
+
+	// check builder
+	if (a->builder < b->builder)
+		return -1;
+	if (a->builder > b->builder)
+		return 1;
+
+	// check minor
+	if (a->minor < b->minor)
+		return -1;
+	if (a->minor > b->minor)
+		return 1;
+
+	// check micro
+	if (a->micro < b->micro)
+		return -1;
+	if (a->micro > b->micro)
+		return 1;
+
+	// check release
+	if (a->release < b->release)
+		return -1;
+	if (a->release > b->release)
+		return 1;
+
+	// huh!?
+	return 0;
+}
+
 struct LilvHeader*
 lilv_collection_get_by_uri(const ZixTree* seq, const LilvNode* uri);
 
diff --git a/src/world.c b/src/world.c
index 1e51a2d..d52edf4 100644
--- a/src/world.c
+++ b/src/world.c
@@ -78,6 +78,8 @@ lilv_world_new(void)
 	world->uris.lv2_requiredFeature = NEW_URI(LV2_CORE__requiredFeature);
 	world->uris.lv2_symbol          = NEW_URI(LV2_CORE__symbol);
 	world->uris.lv2_prototype       = NEW_URI(LV2_CORE__prototype);
+	world->uris.mod_builderVersion  = NEW_URI("http://moddevices.com/ns/mod#builderVersion");
+	world->uris.mod_releaseNumber   = NEW_URI("http://moddevices.com/ns/mod#releaseNumber");
 	world->uris.owl_Ontology        = NEW_URI(NS_OWL "Ontology");
 	world->uris.pset_value          = NEW_URI(LV2_PRESETS__value);
 	world->uris.rdf_a               = NEW_URI(LILV_NS_RDF  "type");
@@ -657,17 +659,27 @@ load_plugin_model(LilvWorld*      world,
 static LilvVersion
 get_version(LilvWorld* world, SordModel* model, const LilvNode* subject)
 {
+	const SordNode* builder_node = sord_get(
+		model, subject->node, world->uris.mod_builderVersion, NULL, NULL);
 	const SordNode* minor_node = sord_get(
 		model, subject->node, world->uris.lv2_minorVersion, NULL, NULL);
 	const SordNode* micro_node = sord_get(
 		model, subject->node, world->uris.lv2_microVersion, NULL, NULL);
+	const SordNode* release_node = sord_get(
+		model, subject->node, world->uris.mod_releaseNumber, NULL, NULL);
 
 
-	LilvVersion version = { 0, 0 };
+	LilvVersion version = { 0, 0, 0, 0 };
+	if (builder_node) {
+		version.builder = atoi((const char*)sord_node_get_string(builder_node));
+	}
 	if (minor_node && micro_node) {
 		version.minor = atoi((const char*)sord_node_get_string(minor_node));
 		version.micro = atoi((const char*)sord_node_get_string(micro_node));
 	}
+	if (release_node) {
+		version.release = atoi((const char*)sord_node_get_string(release_node));
+	}
 
 	return version;
 }
@@ -720,17 +732,19 @@ lilv_world_load_bundle(LilvWorld* world, const LilvNode* bundle_uri)
 		LilvVersion last_version = get_version(world, last_model, plugin_uri);
 		sord_free(this_model);
 		sord_free(last_model);
-		const int cmp = lilv_version_cmp(&this_version, &last_version);
+		const int cmp = lilv_version_cmp_mod(&this_version, &last_version);
 		if (cmp > 0) {
 			zix_tree_insert((ZixTree*)unload_uris,
 			                lilv_node_duplicate(plugin_uri),
 			                NULL);
-			LILV_WARNF("Replacing version %d.%d of <%s> from <%s>\n",
-			           last_version.minor, last_version.micro,
+			LILV_WARNF("Replacing version %d:%d.%d-%d of <%s> from <%s>\n",
+			           last_version.builder, last_version.minor,
+			           last_version.micro, last_version.release,
 			           sord_node_get_string(plug),
 			           sord_node_get_string(last_bundle->node));
-			LILV_NOTEF("New version %d.%d found in <%s>\n",
-			           this_version.minor, this_version.micro,
+			LILV_NOTEF("New version %d:%d.%d-%d found in <%s>\n",
+			           this_version.builder, this_version.minor,
+			           this_version.micro, this_version.release,
 			           sord_node_get_string(bundle_node));
 		} else if (cmp < 0) {
 			LILV_WARNF("Ignoring bundle <%s>\n",
