diff --git a/xslfo/datenspuren/schedule/Makefile b/xslfo/datenspuren/schedule/Makefile
new file mode 100644
index 000000000..687139a67
--- /dev/null
+++ b/xslfo/datenspuren/schedule/Makefile
@@ -0,0 +1,33 @@
+EXPORT_URL=http://www.datenspuren.de/fahrplan/
+FOP=~/programs/fop/fop
+XSLT=xsltproc
+XSLT_FLAGS=--novalid
+XEP=~/Java/XEP/xep
+
+KEEP=day_1.de.html day_2.de.html
+
+FOP_FILES=day_1.pdf day_2.pdf
+XEP_FILES=day_1-xep.pdf day_2-xep.pdf
+
+all: $(FOP_FILES) $(XEP_FILES) $(KEEP)
+
+day_%.de.html:
+ wget -O $@ $(EXPORT_URL)/$@
+
+schedule.de.xml:
+ wget -O $@ $(EXPORT_URL)/$@
+
+day_%.xml: day_%.de.html day_schedule.xsl schedule.de.xml
+ $(XSLT) $(XSLT_FLAGS) day_schedule.xsl $<|ruby schedule_add_spans.rb > $@
+
+day_%.fo: day_%.xml schedule-fo.xsl
+ $(XSLT) $(XSLT_FLAGS) -o $@ schedule-fo.xsl $<
+
+day_%-xep.pdf: day_%.fo
+ $(XEP) -fo $< -pdf $@
+
+day_%.pdf: day_%.fo
+ $(FOP) $(FOP_FLAGS) -fo $< -pdf $@
+
+clean:
+ rm -f day_*.{de.html,xml,fo,pdf} schedule.de.xml
diff --git a/xslfo/datenspuren/schedule/day_schedule.xsl b/xslfo/datenspuren/schedule/day_schedule.xsl
new file mode 100644
index 000000000..dc7f596ad
--- /dev/null
+++ b/xslfo/datenspuren/schedule/day_schedule.xsl
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xslfo/datenspuren/schedule/schedule-fo.xsl b/xslfo/datenspuren/schedule/schedule-fo.xsl
new file mode 100644
index 000000000..ee9809c20
--- /dev/null
+++ b/xslfo/datenspuren/schedule/schedule-fo.xsl
@@ -0,0 +1,149 @@
+
+
+
+
+ bold
+ 14pt
+ center
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Release ,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zeit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ == ++ ==
+
+
+
+
+
+
+
+
+ : +
+
+ y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+
+
+
+
diff --git a/xslfo/datenspuren/schedule/schedule_add_spans.rb b/xslfo/datenspuren/schedule/schedule_add_spans.rb
new file mode 100644
index 000000000..d083b90eb
--- /dev/null
+++ b/xslfo/datenspuren/schedule/schedule_add_spans.rb
@@ -0,0 +1,32 @@
+#!/usr/bin/env ruby
+
+require 'rexml/document'
+
+matrix = REXML::Document.new($stdin).root
+tracks = 0
+matrix.each_element('rooms/room') {
+ tracks += 1
+}
+trackspans = [0] * tracks
+matrix.each_element('table/timeslot') { |timeslot|
+ events = []
+ timeslot.each_element { |event|
+ timeslot.delete(event)
+ events << event
+ }
+ $stderr.puts trackspans.inspect
+ tracks.times { |i|
+ if trackspans[i] > 1
+ timeslot.add(REXML::Element.new('span'))
+ trackspans[i] -= 1
+ else
+ event = events.shift || REXML::Element.new('empty')
+ timeslot.add(event)
+ if event.name == 'event'
+ trackspans[i] = (event.attributes['slots'] || 1).to_i
+ end
+ end
+ }
+ $stderr.puts "Stale elements: #{events.inspect}" if events.size > 0
+}
+matrix.write($stdout, 0)