diff --git a/src/perl/make_xmlwritecode.pl b/src/perl/make_xmlwritecode.pl
new file mode 100644
--- /dev/null
+++ b/src/perl/make_xmlwritecode.pl
@@ -0,0 +1,223 @@
+#!/usr/bin/perl
+
+#
+# $Id$
+#
+# This file is part of the Virtual Leaf.
+#
+# The Virtual Leaf 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.
+#
+# The Virtual Leaf 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 the Virtual Leaf. If not, see .
+#
+# Copyright 2010 Roeland Merks.
+
+# Store essential model source code in XML files, so the exact model
+# used for the geometry can be retrieved later on The crucial model
+# description is in the files "reactions.h" (or similar) and leaf.cpp
+# (or similar).
+
+# First we should retrieve the name of the main code (i.e. leaf.cpp or
+# so), and the version of reactions.h that we include there.
+
+# We can get this from the project file (possibly called "LeafGrowth.pro")
+
+# If more than one project file found, issue an error
+
+open prlist, "ls *.pro |";
+
+@projectfiles = ();
+while () {
+ chomp;
+ push @projectfiles, $_;
+}
+
+if ($#projectfiles > 0) {
+ print stderr "Oops, I found several project files: ";
+ for $p (@projectfiles) {
+ print stderr "$p ";
+ }
+ print stderr "\n";
+ print stderr "Please make sure you have only one, and try again\n";
+ exit(1);
+}
+
+if ($#projectfiles < 0) {
+ print stderr "No project files found. Please add a project file.\n";
+ exit(1);
+}
+
+$project = $projectfiles[0];
+
+print stderr "Using project file \"$project\"\n";
+
+# extract TARGET and REACTIONS from project file
+
+open pfile,"<$project";
+my @targets = ();
+while () {
+ if (/^[ \t]*TARGET/) {
+ my @line = split(/=/);
+ my $target = $line[1];
+ chomp $target;
+ $target =~ s/[ \t]//g;
+ push @targets, $target;
+ }
+ if (/^[ \t]*REACTIONS/) {
+ my @line = split(/=/);
+ my $reaction = $line[1];
+ chomp $reaction;
+ $reaction =~ s/[ \t]//g;
+ push @reactions, $reaction;
+ }
+}
+
+
+if ($#targets > 0) {
+ print stderr "Too many targets found: ";
+ for $t (@targets) {
+ print stderr "$t ";
+ }
+ print stderr "\n";
+ exit(1);
+}
+
+if ($#targets < 0) {
+ print stderr "No targets found in project $project\n";
+ exit(1);
+}
+
+$target = $targets[0];
+
+print "Target is $target\n";
+
+if ($#reactions > 0) {
+ print stderr "Too many reactions found: ";
+ for $t (@reactions) {
+ print stderr "$t ";
+ }
+ print stderr "\n";
+ exit(1);
+}
+
+if ($#reactions < 0) {
+ print stderr "No reactions found in project $project\n";
+ exit(1);
+}
+
+$reaction = $reactions[0];
+
+print "Reactions header is $reaction\n";
+
+$mainsource = $target.".cpp";
+
+# extract "reactions" source from mainsource
+# assuming that the header file name starts with "reactions_"
+
+#open sfile, "<$mainsource";
+#
+#while () {
+# if (/^[ \t]*\#include/) {
+# chomp;
+# my @line = split(/\#include/);
+# my $header = $line[1];
+# $header =~ s/[\t ]//g;
+# if ($header =~ /reactions/) {
+# $header =~ s/[\"\<\>]//g;
+# push @headers, $header;
+# }
+# }
+#}
+#
+#if ($#headers > 0) {
+# print stderr "Oops, more than one reactions header found: ";
+# for $h (@headers) {
+# print stderr "$h ";
+# }
+# print stderr "\n";
+# print stderr "Don't know what to do now... Please rename a header in $mainsource, so only one will start with \"reactions\"\n";
+# exit(1);
+#}
+#
+#if ($#headers < 0) {
+# print stderr "Oops, no reactions header found in $mainsource.\n";
+# print stderr "Please make sure the name of your reactions header starts with \"reactions\"\n";
+# exit(1);
+#}
+#
+#$reactions = $headers[0];
+
+
+
+# now generating xmlcode to write the contents of these files (hard coded in the executables)
+
+open xmlsrc, ">xmlwritecode.cpp";
+
+print xmlsrc <
+#include
+#include
+#include
+#include "xmlwrite.h"
+
+
+void XMLIO::XMLWriteLeafSourceCode(xmlNode *parent) {
+
+ // Embed the code in our xml file, so we can reconstruct the model we used
+ // to produce it...
+
+END_MARKER
+
+sub construct_string_constant_from_file {
+
+ my $fname = shift;
+ my $str = "";
+
+ open srcfile, "<$fname";
+ while () {
+ chomp;
+ s/\\/\\\\/g;
+ s/\"/\\\"/g;
+ s/\&/\&/g;
+ $str.=$_."\\n";
+ }
+ $str .= "\";\n";
+ return $str;
+}
+
+print xmlsrc "xmlChar *sourcecode = (xmlChar *)\"".construct_string_constant_from_file( "$mainsource" );
+ print xmlsrc <