diff --git a/make-mb-release-alignments b/make-mb-release-alignments
new file mode 100755
index 0000000000000000000000000000000000000000..0d6a646f961a72d36a2a75baae6cfbd12247209f
--- /dev/null
+++ b/make-mb-release-alignments
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+
+my @releases = (
+    { opera     => 'das-rheingold',
+      recording => 'Neuhold1993',
+      release   => '468d27f6-b1c2-4c4e-be5e-591703800a60' },
+
+    { opera     => 'das-rheingold',
+      recording => 'Bohm1966',
+      release   => '98f65dd0-e887-4d7a-af35-85d488bd7eb9' },
+
+    { opera     => 'das-rheingold',
+      recording => 'Krauss1953',
+      release   => 'c988df46-9359-4148-836b-4c67cc5e280e' },
+
+    { opera     => 'das-rheingold',
+      recording => 'Thielemann2008',
+      release   => 'e0cb99c2-4b0d-4bb9-9ce0-750646326dde' },
+    );
+
+
+mkdir '.release-cache';
+
+map { my ($op, $rl, $rc) = ($_->{opera}, $_->{release}, $_->{recording});
+      `curl -s -H "Accept: application/xml" http://musicbrainz.org/ws/2/release/$rl?inc=recordings |xmllint --format - > .release-cache/$rl.xml` unless -e ".release-cache/$rl.xml";
+      `xsltproc --stringparam opera $op --stringparam recording $rc templates/release2alignment.xslt .release-cache/$rl.xml |xmllint --format - >>$op-alignment.xml`; } @releases;
diff --git a/templates/release2alignment.xslt b/templates/release2alignment.xslt
new file mode 100644
index 0000000000000000000000000000000000000000..d3866e5abc11f7348c690d5e26645d4c1486d402
--- /dev/null
+++ b/templates/release2alignment.xslt
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+               xmlns:mb="http://musicbrainz.org/ns/mmd-2.0#"
+               version="1.0">
+
+<xsl:param name="opera" />
+<xsl:param name="recording" />
+
+<xsl:output method="xml" />
+
+<xsl:template match="/">
+  <xsl:variable name="release-id"><xsl:value-of select="//mb:release[1]/@id" /></xsl:variable>
+  <back>
+    <timeline
+        id="recording-{$recording}"
+        unit="s">
+      <xsl:apply-templates select="//mb:track" mode="when" />
+    </timeline>
+    <linkGrp
+        type="audio-cues"
+        domains="#{$opera} #recording-{$recording} http://musicbrainz.org/release/{$release-id}">
+      <xsl:apply-templates select="//mb:track" mode="link" />
+    </linkGrp>
+  </back>
+</xsl:template>
+
+<xsl:template match="mb:track[not(preceding::mb:track)]" mode="when">
+  <when id="when-{$recording}/CD{ancestor::mb:medium/mb:position}:{mb:position}" absolute="unknown" />
+</xsl:template>
+
+<xsl:template match="mb:track[preceding::mb:track]" mode="when">
+  <xsl:variable name="preceding-track" select="preceding::mb:track[1]" />
+  <xsl:variable name="preceding-when-id"><xsl:value-of select="$recording" />-CD<xsl:value-of select="$preceding-track/ancestor::mb:medium/mb:position" />-<xsl:value-of select="$preceding-track/mb:position" /></xsl:variable>
+
+  <when id="when-{$recording}/CD{ancestor::mb:medium/mb:position}:{mb:position}" interval="{format-number(number(preceding::mb:track[1]/mb:length) div 1000,0)}" since="#when-{$preceding-when-id}" />
+</xsl:template>
+
+<xsl:template match="mb:track" mode="link">
+  <xsl:variable name="cue-id"><xsl:value-of select="$recording" />-CD<xsl:value-of select="ancestor::mb:medium/mb:position" />-<xsl:value-of select="mb:position" /></xsl:variable>
+  <link target="#cue-{$cue-id} #when-{$cue-id} #{@id}" />
+</xsl:template>
+
+</xsl:transform>