diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..78ddfb9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+# Artifacts from the build system
+bin
+vendor
+composer.phar
+build-temp
+build.properties
diff --git a/build.default.properties b/build.default.properties
new file mode 100644
index 0000000..24fab9a
--- /dev/null
+++ b/build.default.properties
@@ -0,0 +1,19 @@
+# Default build properties for Panopoly.
+
+# IMPORTANT: Don't modify this file for your environment!
+#
+# Instead create a build.properties file which has your overrides.
+#
+# This file will be updated by the maintainers of Panopoly.
+
+drupal.profile = panopoly
+
+build.artifacts.profile.modules.dirs = contrib,panopoly
+build.artifacts.profile.themes.dirs = responsive_bartik
+build.artifacts.profile.libraries.dirs = backbone,jquery.imagesloaded,jquery.imgareaselect,markitup,respondjs,SolrPhpClient,tinymce,underscore
+
+# For Selenium 2.46.0
+build.tools.selenium.url = http://goo.gl/cvntq5
+# Where we'll keep the selenium pid file
+build.tools.selenium.pid = ${build.artifacts.temp.dir}/selenium.pid
+
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..9f14eaa
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<project name="panopoly" default="usage">
+  <import file="build/build.import.xml" />
+
+  <!-- =====================================================================
+       Test targets: Running the tests.
+       ===================================================================== -->
+
+  <target name="test"
+          depends="init, make-core, setup-composer, selenium-start"
+          description="Run the Behat tests.">
+    <property name="project.test.dir" value="${phing.dir}/modules/panopoly/panopoly_test/tests"/>
+
+    <!-- Make sure Behat is installed via composer. -->
+    <!-- TODO: move this into a 'setup-behat' target. -->
+    <if>
+      <not>
+        <available file="${project.test.dir}/bin/behat"/>
+      </not>
+      <then>
+        <exec command="${php.interpreter} ${build.tools.composer} install" dir="${project.test.dir}" checkreturn="true" logoutput="true"/>
+      </then>
+    </if>
+
+    <!-- TODO: Write a behat.yml file using our config. -->
+
+    <!-- Run Behat. -->
+    <exec command="${project.test.dir}/bin/behat" dir="${project.test.dir}" checkreturn="true" logoutput="true"/>
+  </target>
+
+  <target name="selenium-start"
+          depends="init, setup-selenium"
+          description="Start running Selenium in the background."
+          unless="project.selenium.skip">
+    <if>
+      <not>
+        <available file="${build.tools.selenium.pid}"/>
+      </not>
+      <then>
+        <daemon-start command="java -jar ${build.tools.selenium}" pid="${build.tools.selenium.pid}"/>
+        <echo msg="Selenium started. Run 'phing selenium-stop' to stop it."/>
+      </then>
+      <else>
+        <echo msg="Selenium already running. Run 'phing selenium-stop' to stop it."/>
+      </else>
+    </if>
+  </target>
+
+  <target name="selenium-stop"
+          depends="init"
+          description="Stop running Selenium in the background.">
+    <if>
+      <available file="${build.tools.selenium.pid}"/>
+      <then>
+        <daemon-stop pid="${build.tools.selenium.pid}"/>
+        <delete file="${build.tools.selenium.pid}" quiet="true"/>
+      </then>
+      <else>
+        <echo msg="Couldn't find Selenium pid file. We can only assume it isn't running!"/>
+      </else>
+    </if>
+  </target>
+
+  <!-- =====================================================================
+       Setup targets: Used to setup dependencies for use in normal targets.
+       ===================================================================== -->
+
+  <target name="setup-selenium"
+          depends="init, internal:setup-dirs"
+          description="Download Selenium."
+          unless="project.selenium.skip">
+    <property name="build.tools.selenium" value="${build.tools.dir}/selenium.jar"/>
+    <if>
+      <not>
+        <available file="${build.tools.selenium}"/>
+      </not>
+      <then>
+        <httpget url="${build.tools.selenium.url}" dir="${build.tools.dir}" filename="selenium.jar" followRedirects="true" />
+      </then>
+    </if>
+  </target>
+</project>
diff --git a/build/README.md b/build/README.md
new file mode 100644
index 0000000..0f307d6
--- /dev/null
+++ b/build/README.md
@@ -0,0 +1,22 @@
+Phing Drupal Distributions
+==========================
+
+Phing build scripts for working with Drupal distributions.
+
+To use with your distribution:
+
+1. Copy this directory into a sub-directory called 'build' in your profile
+
+2. Copy the 'examples/build.xml', 'examples/build.default.properties' and
+   'examples/composer.json' to the top-level directory of your profile.
+
+3. Modify 'build.default.properties' to suit the needs of your distro. If you
+   need to change some settings just for you, create a 'build.properties' file.
+
+4. Download Composer. See https://getcomposer.org/download/#main
+   
+5. Run 'composer install' or 'php composer.phar install' to install Phing and
+   its dependencies.
+
+6. Run 'bin/phing -l' to see what targets you can build!
+
diff --git a/build/build.default.properties b/build/build.default.properties
new file mode 100644
index 0000000..f170735
--- /dev/null
+++ b/build/build.default.properties
@@ -0,0 +1,47 @@
+# Default values for all the build properties.
+
+# The profile where working on (defaults to the project name).
+drupal.profile = ${phing.project.name}
+
+# Where to put temporary files created by the build process.
+build.artifacts.temp.dir = ${phing.dir}/build-temp
+
+# What build artifacts get created when making the profile.
+build.artifacts.profile.modules.dirs = contrib,${drupal.profile}
+build.artifacts.profile.themes.dirs = 
+build.artifacts.profile.libraries.dirs = 
+
+# The default build mode (either "upstream" or "dev").
+build.mode = upstream
+
+# Where to build core.
+build.core.dir = /var/www
+
+# Options to build the project using Drush make
+# The upstream make file for the project
+# TODO: move some of these to 'build.*' rather than 'drush.make.*'
+drush.make.profile-upstream = drupal-org.make
+# The development make file for the project
+drush.make.profile-dev = drupal-org-dev.make
+# The core make file
+drush.make.core = drupal-org-core.make
+# The number of concurrent threads to run when doing Drush make
+drush.make.concurrency = 1
+
+# The repository to clone for Phing Drush task.
+build.tools.phing.drush.repository.url = http://git.drupal.org/project/phingdrushtask.git
+build.tools.phing.drush.repository.revision = 7.x-1.x
+
+# The default install mode (currently only "drush").
+install.mode = drush
+
+# Database configuration.
+drush.site-install.db_url = mysqli://dbuser:dbpassword@dbhost/dbname
+drush.site-install.db_prefix =
+drush.site-install.site_name = ${phing.project.name}
+drush.site-install.site_mail = admin@example.com
+drush.site-install.account_name = admin
+drush.site-install.account_pass = admin
+drush.site-install.account_mail = admin@example.com
+drush.site-install.sites_subdir = default
+
diff --git a/build/build.import.xml b/build/build.import.xml
new file mode 100644
index 0000000..8218739
--- /dev/null
+++ b/build/build.import.xml
@@ -0,0 +1,419 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<project name="phingdrupaldistributions" phingVersion="2.10.0" default="usage">
+  <target name="usage" depends="init">
+    <echo msg="Hello! Phing is used to allow developers to easily build, install and test ${phing.project.name}!"/>
+    <echo msg="A good way to get started is to create a build.properties file which tells phing about your environment and then run 'phing test' which will run the Behat tests and make sure that ${phing.project.name} is working correctly in your environment."/>
+  </target>
+
+  <!-- =====================================================================
+       Profile build targets: Building the profile from .make files.
+       ===================================================================== -->
+
+  <target name="check-profile"
+          depends="init"
+          description="Checks if the profile is built or not."
+          hidden="true">
+    <property name="project.check-profile" value="false"/>
+    <available-filelist property="project.check-profile">
+      <filelist dir="${phing.dir}/modules" files="${build.artifacts.profile.modules.dirs}"/>
+      <filelist dir="${phing.dir}/themes" files="${build.artifacts.profile.themes.dirs}"/>
+      <filelist dir="${phing.dir}/libraries" files="${build.artifacts.profile.libraries.dirs}"/>
+    </available-filelist>
+  </target>
+
+  <target name="make-profile-upstream"
+          depends="init, setup-drush, check-profile"
+          description="Build the modules, libraries and themes for this profile using the development code from upstream."
+          unless="project.make-profile.skip">
+    <if>
+      <or>
+        <isfalse value="${project.check-profile}"/>
+        <and>
+          <isset property="project.make-profile.rebuild"/>
+          <istrue value="${project.make-profile.rebuild}"/>
+        </and>
+      </or>
+      <then>
+
+        <drush command="make" assume="yes">
+          <option name="no-core"/>
+          <option name="contrib-destination">.</option>
+          <param>${drush.make.profile-upstream}</param>
+          <option name="concurrency">${drush.make.concurrency}</option>
+        </drush>
+
+        <!-- Set property to prevent target from being executed multiple times -->
+        <property name="project.make-profile.skip" value="true"/>
+      </then>
+      <else>
+        <echo msg="Profile has already been built. Run 'phing rebuild-profile-upstream' to force it to be built again."/>
+      </else>
+    </if>
+  </target>
+
+  <target name="make-profile-dev"
+          depends="init, setup-drush, check-profile"
+          description="Build the modules, libraries and themes for this profile using the development you're working on."
+          unless="project.make-profile.skip">
+    <if>
+      <or>
+        <isfalse value="${project.check-profile}"/>
+        <and>
+          <isset property="project.make-profile.rebuild"/>
+          <istrue value="${project.make-profile.rebuild}"/>
+        </and>
+      </or>
+      <then>
+
+        <drush command="make" assume="yes">
+          <option name="no-core"/>
+          <option name="contrib-destination">.</option>
+          <param>${drush.make.profile-dev}</param>
+          <option name="concurrency">${drush.make.concurrency}</option>
+          <option name="no-gitinfofile"/>
+          <option name="working-copy"/>
+        </drush>
+
+        <!-- Set property to prevent target from being executed multiple times -->
+        <property name="project.make-profile.skip" value="true"/>
+      </then>
+      <else>
+        <echo msg="Profile has already been built. Run 'phing rebuild-profile-dev' to force it to be built again."/>
+      </else>
+    </if>
+  </target>
+
+  <target name="make-profile"
+          depends="internal:load-properties"
+          description="Build the modules, libraries and themes for this profile using the default build mode (${build.mode})."
+          unless="project.make-profile.skip">
+    <phingcall target="make-profile-${build.mode}"/>
+  </target>
+
+  <target name="rebuild-profile-upstream"
+          description="Force a rebuild of the modules, libraries and themes for this profile using the development code from upstream.">
+    <phingcall target="make-profile-upstream">
+      <property name="project.make-profile.rebuild" value="1"/>
+    </phingcall>
+  </target>
+
+  <target name="rebuild-profile-dev"
+          description="Force a rebuild of the modules, libraries and themes for this profile using the development code you're working on.">
+    <!-- TODO: this one is a little tricky, because we don't want to wipe out the existing
+         Git clones, but instead pull from upstream again. Then we want to run the .make files
+         in the modules directly, rather than running the main .make file again. -->
+    <echo msg="Unimplemented, sorry! For the time-being you can go to the Git clones and pull from dev yourself."/>
+  </target>
+
+  <target name="rebuild-profile"
+          depends="internal:load-properties"
+          description="Force a rebuild of the modules, libraries and themes for this profile using the default build mode (${build.mode})."
+          unless="project.make-profile.skip">
+    <phingcall target="rebuild-profile-${build.mode}"/>
+  </target>
+
+  <!-- =====================================================================
+       Core build targets: Building core from .make files and adding profile.
+       ===================================================================== -->
+
+  <target name="add-profile-to-core"
+          depends="internal:load-properties"
+          description="Add profile to core in a platform independent way."
+          hidden="true">
+    <!-- TODO: we should copy on platforms that don't support symlinks! I think we
+         can even do some magic with <uptodate> to only copy if something has changed. -->
+    <symlink link="${build.core.dir}/profiles/${drupal.profile}" target="${phing.dir}"/>
+  </target>
+
+  <target name="make-core-upstream"
+          depends="init, setup-drush, make-profile-upstream"
+          description="Builds core somewhere the webserver can find it using the development code from upstream."
+          unless="project.make-core.skip">
+    <if>
+      <or>
+        <not>
+          <available file="${build.core.dir}"/>
+        </not>
+        <and>
+          <isset property="project.make-core.rebuild"/>
+          <istrue value="${project.make-core.rebuild}"/>
+        </and>
+      </or>
+      <then>
+
+        <drush command="make" assume="yes">
+          <param>${drush.make.core}</param>
+          <param>${build.core.dir}</param>
+          <option name="concurrency">${drush.make.concurrency}</option>
+        </drush>
+
+        <!-- Set property to prevent target from being executed multiple times -->
+        <property name="project.make-core.skip" value="true"/>
+      </then>
+      <else>
+        <echo msg="Core has already been built. Run 'phing rebuild-core-upstream' to force it to be built again."/>
+      </else>
+    </if>
+
+    <phingcall target="add-profile-to-core"/>
+  </target>
+
+  <target name="make-core-dev"
+          depends="init, setup-drush, make-profile-dev"
+          description="Builds core somewhere the webserver can find it using the development code you're working on."
+          unless="project.make-core.skip">
+    <if>
+      <or>
+        <not>
+          <available file="${build.core.dir}"/>
+        </not>
+        <and>
+          <isset property="project.make-core.rebuild"/>
+          <istrue value="${project.make-core.rebuild}"/>
+        </and>
+      </or>
+      <then>
+
+        <drush command="make" assume="yes">
+          <param>${drush.make.core}</param>
+          <param>${build.core.dir}</param>
+          <option name="concurrency">${drush.make.concurrency}</option>
+        </drush>
+
+        <!-- Set property to prevent target from being executed multiple times -->
+        <property name="project.make-core.skip" value="true"/>
+      </then>
+      <else>
+        <echo msg="Core has already been built. Run 'phing rebuild-core-dev' to force it to be built again."/>
+      </else>
+    </if>
+
+    <phingcall target="add-profile-to-core"/>
+  </target>
+
+  <target name="make-core"
+          depends="internal:load-properties"
+          description="Builds core somewhere the webserver can find it using the the default build mode (${build.mode})."
+          unless="project.make-core.skip">
+    <phingcall target="make-core-${build.mode}"/>
+  </target>
+
+  <target name="rebuild-core-upstream"
+          description="Force a rebuild of core using the development code from upstream.">
+    <phingcall target="make-core-upstream">
+      <property name="project.make-core.rebuild" value="1"/>
+    </phingcall>
+  </target>
+
+  <target name="rebuild-core-dev"
+          description="Builds core somewhere the webserver can find it using the development code you're working on.">
+    <phingcall target="make-core-dev">
+      <property name="project.make-core.rebuild" value="1"/>
+    </phingcall>
+  </target>
+
+  <!-- =====================================================================
+       Install targets: Installing Drupal.
+       ===================================================================== -->
+
+  <target name="install-drush"
+          depends="init, make-core, setup-drush"
+          description="Install Drupal using Drush."
+          unless="project.install.skip">
+    <if>
+      <or>
+        <not>
+          <available file="${build.core.dir}/sites/${drush.site-install.sites_subdir}/settings.php" />
+        </not>
+        <and>
+          <isset property="project.install.reinstall"/>
+          <istrue value="${project.install.reinstall}"/>
+        </and>
+      </or>
+      <then>
+        <drush command="site-install" root="${build.core.dir}" assume="yes">
+          <param>${drupal.profile}</param>
+          <option name="db-url">${drush.site-install.db_url}</option>
+          <option name="db-prefix">${drush.site-install.db_prefix}</option>
+          <option name="site-name">${drush.site-install.site_name}</option>
+          <option name="site-mail">${drush.site-install.site_mail}</option>
+          <option name="account-name">${drush.site-install.account_name}</option>
+          <option name="account-pass">${drush.site-install.account_pass}</option>
+          <option name="account-mail">${drush.site-install.account_mail}</option>
+          <option name="sites-subdir">${drush.site-install.sites_subdir}</option>
+        </drush>
+
+        <!-- Set property to prevent target from being executed multiple times -->
+        <property name="project.install.skip" value="true"/>
+      </then>
+      <else>
+        <echo msg="Site has already been installed. Run 'phing reinstall-drush' to force it to be installed again."/>
+      </else>
+    </if>
+  </target>
+
+  <target name="reinstall-drush"
+          description="Force a reinstall of Drupal using Drush.">
+    <phingcall target="install-drush">
+      <property name="project.install.reinstall" value="1"/>
+    </phingcall>
+  </target>
+
+  <target name="install"
+          depends="internal:load-properties"
+          description="Install Drupal using ${install.mode}."
+          unless="project.install.skip">
+    <phingcall target="install-${install.mode}"/>
+  </target>
+
+  <!-- =====================================================================
+       Clean-up targets: Deleting build artifacts.
+       ===================================================================== -->
+
+  <target name="clean"
+          depends="init, clean-temp, clean-profile, clean-core"
+          description="Clean up all the files created by the build process.">
+  </target>
+
+  <target name="clean-temp"
+          depends="init"
+          description="Clean up temporary files.">
+    <delete dir="${build.artifacts.temp.dir}" quiet="true"/>
+  </target>
+
+  <target name="clean-profile"
+          depends="init"
+          description="Clean files created when making the profile.">
+    <delete quiet="true">
+      <filelist dir="${phing.dir}/modules" files="${build.artifacts.profile.modules.dirs}"/>
+      <filelist dir="${phing.dir}/themes" files="${build.artifacts.profile.themes.dirs}"/>
+      <filelist dir="${phing.dir}/libraries" files="${build.artifacts.profile.libraries.dirs}"/>
+    </delete>
+  </target>
+
+  <target name="clean-core"
+          depends="init"
+          description="Clean files created when making core.">
+    <delete dir="${build.core.dir}" quiet="true"/>
+  </target>
+
+  <!-- =====================================================================
+       Setup targets: Used to setup dependencies for use in normal targets.
+       ===================================================================== -->
+
+  <target name="setup-drush"
+          depends="init, internal:setup-dirs"
+          description="Setup drush in order to execute drush tasks."
+          hidden="true">
+    <!-- TODO: If the user doesn't have drush, or the wrong version of drush
+         we could actually use composer to install it. -->
+
+    <!-- Setup the Drush task to make using from Phing easier. -->
+    <property name="build.tools.phing.drush.dir" value="${build.tools.dir}/phing-drush" />
+    <if>
+      <not><available type="dir" file="${build.tools.phing.drush.dir}"/></not>
+      <then>
+        <gitclone
+          repository="${build.tools.phing.drush.repository.url}"
+          targetPath="${build.tools.phing.drush.dir}" />
+        <gitcheckout
+          repository="${build.tools.phing.drush.dir}"
+          branchname="${build.tools.phing.drush.repository.revision}" />
+      </then>
+    </if>
+
+    <!-- Register as custom Phing task -->
+    <taskdef name="drush" classname="DrushTask"
+             classpath="${build.tools.phing.drush.dir}" />
+  </target>
+
+  <target name="setup-composer"
+          depends="init, internal:setup-dirs"
+          description="Setup composer so that we can use it to install stuff."
+          hidden="true">
+
+     <!-- First, check for system composer. -->
+     <exec command="which composer" outputProperty="build.tools.composer"/>
+
+     <!-- If not available, then we download our own local composer. -->
+     <if>
+       <isfalse value="${build.tools.composer}"/>
+       <then>
+         <property name="build.tools.composer" value="${build.tools.dir}/composer.phar" override="true"/>
+
+         <if>
+           <not>
+             <available file="${build.tools.composer}"/>
+           </not>
+           <then>
+             <php expression="$argv = array('--install-dir', '${build.tools.dir}'); eval('?>'.file_get_contents('https://getcomposer.org/installer'))" />
+           </then>
+         </if>
+       </then>
+     </if>
+  </target>
+
+  <!-- =====================================================================
+       Internal targets: Used for really low-level setup.
+       ===================================================================== -->
+
+  <target name="init"
+          depends="internal:load-properties"
+          description="Performs the internal setup necessary to run ALL normal tasks."
+          unless="internal.done.init"
+          hidden="true">
+    <!-- We use this pattern for a lot of the "fundamental" targets. Normally, this
+         isn't necessary because phing keeps track of the dependencies that have
+         already run. But if we use 'phingcall' it resets the list of run dependencies
+         (but not the properties) so it'll run re-run targets it's already run.
+
+         By putting unless="internal.done.XXX" in the target and setting a property
+         we can prevent the target from being re-run!
+
+         We shouldn't do this for every target, because it's an ugly pattern. Instead
+         we should do it sparingly, in the cases where we see targets that are
+         frequently being re-run needlessly. -->
+    <property name="internal.done.init" value="true"/>
+
+    <!-- Load custom Tasks. -->
+    <taskdef name="available-filelist" classname="AvailableFileListTask"
+             classpath="${internal.build.dir}/lib" />
+    <taskdef name="daemon-start" classname="DaemonStartTask"
+             classpath="${internal.build.dir}/lib" />
+    <taskdef name="daemon-stop" classname="DaemonStopTask"
+             classpath="${internal.build.dir}/lib" />
+  </target>
+
+  <target name="internal:load-properties"
+          description="Loads the build.properties with the correct defaults set."
+          unless="internal.done.load-properties"
+          hidden="true">
+    <property name="internal.done.load-properties" value="true"/>
+
+    <!-- Make an alias to our internal build dir that's easier to type. -->
+    <property name="internal.build.dir" value="${phing.dir.phingdrupaldistributions}" />
+
+    <!-- First load the internal defaults from phing-drupal-distributions. -->
+    <property file="${internal.build.dir}/build.default.properties" override="true"/>
+
+    <!-- Next, load the distribution's defaults. -->
+    <property file="${phing.dir}/build.default.properties" override="true"/>
+
+    <!-- Finally, load the user's local defaults. -->
+    <property file="${phing.dir}/build.properties" override="true"/>
+  </target>
+
+  <target name="internal:setup-dirs"
+          depends="internal:load-properties"
+          description="Sets up the build directories for build artifacts."
+          unless="internal.done.setup-dirs"
+          hidden="true">
+    <property name="internal.done.setup-dirs" value="true"/>
+
+    <!-- Create temp directory and it's children. -->
+    <property name="build.tools.dir" value="${build.artifacts.temp.dir}/tools"/>
+    <mkdir dir="${build.artifacts.temp.dir}"/>
+    <mkdir dir="${build.tools.dir}"/>
+  </target>
+</project>
diff --git a/build/examples/build.default.properties b/build/examples/build.default.properties
new file mode 100644
index 0000000..5348fc1
--- /dev/null
+++ b/build/examples/build.default.properties
@@ -0,0 +1,4 @@
+
+# The name of your install profile. By default, it's the project name.
+#drupal.profile = ${phing.project.name}
+
diff --git a/build/examples/build.xml b/build/examples/build.xml
new file mode 100644
index 0000000..cc1504d
--- /dev/null
+++ b/build/examples/build.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<project name="my-profile-name" default="usage">
+  <import file="build/build.import.xml" />
+</project>
diff --git a/build/examples/composer.json b/build/examples/composer.json
new file mode 100644
index 0000000..942c817
--- /dev/null
+++ b/build/examples/composer.json
@@ -0,0 +1,9 @@
+{
+  "require": {
+    "phing/phing": "2.*",
+    "pear/versioncontrol_git": "@dev"
+  },
+  "config": {
+    "bin-dir": "bin/"
+  }
+}
diff --git a/build/lib/AvailableFileListTask.php b/build/lib/AvailableFileListTask.php
new file mode 100644
index 0000000..36cd798
--- /dev/null
+++ b/build/lib/AvailableFileListTask.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * @file
+ * A Phing task to run Drush commands.
+ */
+require_once "phing/Task.php";
+require_once "phing/tasks/system/condition/Condition.php";
+//require_once "phing/system/io/Phingfile.php";
+
+/**
+ * AvailableFileListTask
+ *
+ * Like AvailableTask, but takes a filelist.
+ */
+class AvailableFileListTask extends Task implements Condition {
+
+  protected $filelists = array();
+  protected $property = NULL;
+  protected $value = NULL;
+
+  /**
+   * Support embedded <filelist> element.
+   * @return FileList
+   */
+  public function createFileList() {
+    $filelist = new FileList();
+    $this->filelists[] = $filelist;
+    return $filelist;
+  }
+
+  /**
+   * Set the property to set.
+   *
+   * @param string $str
+   */
+  public function setProperty($str) {
+    $this->property = $str;
+  }
+
+  /**
+   * Set the value to set the property to.
+   *
+   * @param string $str
+   */
+  public function setValue($str) {
+    $this->value = $str;
+  }
+
+  /**
+   * Get the value to set the property to.
+   */
+  public function getValue() {
+    return ($this->value !== NULL) ? $this->value : "true";
+  }
+
+  /**
+   * Evaluate the condition.
+   */
+  public function evaluate() {
+    foreach ($this->filelists as $filelist) {
+      $dir = $filelist->getDir($this->getProject());
+      foreach ($filelist->getFiles($this->getProject()) as $file) {
+        $file = new PhingFile($dir, $file);
+        if (!$file->exists()) {
+          return FALSE;
+        }
+      }
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * The main entry point method.
+   */
+  public function main() {
+    if ($this->property === NULL) {
+      throw new BuildException("property attribute is required.", $this->location);
+    }
+
+    if ($this->evaluate()) {
+      $this->getProject()->setProperty($this->property, $this->getValue());
+    }
+  }
+
+}
+
diff --git a/build/lib/DaemonStartTask.php b/build/lib/DaemonStartTask.php
new file mode 100644
index 0000000..b0cc999
--- /dev/null
+++ b/build/lib/DaemonStartTask.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * @file
+ * A Phing task to run start a daemon.
+ */
+require_once "phing/Task.php";
+
+/**
+ * DaemonStartTask
+ */
+class DaemonStartTask extends Task {
+
+  protected $command = NULL;
+  protected $dir = NULL;
+  protected $pid = NULL;
+
+  /**
+   * Set the command to run.
+   *
+   * @param string $str
+   */
+  public function setCommand($str) {
+    $this->command = $str;
+  }
+
+  /**
+   * Set the dir to run the command in.
+   *
+   * @param PhingFile $dir
+   */
+  public function setDir(PhingFile $dir) {
+    $this->dir = $dir;
+  }
+
+  /**
+   * Set the pid file to store the pid in.
+   *
+   * @param PhingFile $dir
+   */
+  public function setPid(PhingFile $file) {
+    $this->pid = $file;
+  }
+
+  /**
+   * The main entry point method.
+   */
+  public function main() {
+    if ($this->command === NULL) {
+      throw new BuildException("property command is required.", $this->location);
+    }
+    if ($this->pid === NULL) {
+      throw new BuildException("property pid is required.", $this->location);
+    }
+
+    // Switch to the requested directory.
+    if ($this->dir !== NULL) {
+      $this->currdir = getcwd();
+      @chdir($this->dir->getPath());
+    }
+
+    // Execute the command.
+    $output = array();
+    $return = NULL;
+    $command = $this->command . " >/dev/null 2>&1 & echo $!";
+    exec($command, $output, $return);
+
+    // Switch back to previous directory.
+    if (!empty($this->currdir)) {
+      @chdir($this->currdir);
+    }
+
+    // Check that it worked.
+    if ($return != 0) {
+      throw new BuildException("{$this->command} failed to start with exit code $return");
+    }
+
+    // Declare success!
+    $pid = trim($output[0]);
+    $this->log("{$this->command} started with PID $pid");
+
+    // Write to the PID file.
+    $pid_file = fopen($this->pid->getPath(), 'wt');
+    fwrite($pid_file, $pid);
+    fclose($pid_file);
+  }
+}
+
diff --git a/build/lib/DaemonStopTask.php b/build/lib/DaemonStopTask.php
new file mode 100644
index 0000000..3ad6983
--- /dev/null
+++ b/build/lib/DaemonStopTask.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ * A Phing task to run stop a daemon.
+ */
+require_once "phing/Task.php";
+
+/**
+ * DaemonStopTask
+ */
+class DaemonStopTask extends Task {
+
+  protected $pid = NULL;
+
+  /**
+   * Set the pid file to store the pid in.
+   *
+   * @param PhingFile $dir
+   */
+  public function setPid(PhingFile $file) {
+    $this->pid = $file;
+  }
+
+  /**
+   * The main entry point method.
+   */
+  public function main() {
+    if ($this->pid === NULL) {
+      throw new BuildException("property pid is required.", $this->location);
+    }
+
+    $pid = trim($this->pid->contents());
+    if (posix_kill($pid, SIGKILL)) {
+      $this->log("Killed process with PID $pid");
+      $this->pid->delete();
+    }
+    else {
+      $this->log("Unable to kill process with PID $pid");
+    }
+  }
+}
+
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..af0a143
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,16 @@
+{
+  "repositories": [
+    {
+      "type": "pear",
+      "url": "http://pear.php.net"
+    }
+  ],
+  "require": {
+    "phing/phing": "2.*",
+    "pear/versioncontrol_git": "@dev",
+    "pear-pear.php.net/HTTP_Request2": "2.2.x"
+  },
+  "config": {
+    "bin-dir": "bin/"
+  }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..5a3c5a2
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,424 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "2accc6cbde48ffa833392abf6a93720a",
+    "packages": [
+        {
+            "name": "pear-pear.php.net/Archive_Tar",
+            "version": "1.3.16",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/Archive_Tar-1.3.16.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "php": ">=4.3.0.0"
+            },
+            "replace": {
+                "pear-pear/archive_tar": "== 1.3.16.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "New BSD\n License"
+            ],
+            "description": "This class provides handling of tar files in PHP.\nIt supports creating, listing, extracting and adding to tar files.\nGzip support is available if PHP has the zlib extension built-in or\nloaded. Bz2 compression is also supported with the bz2 extension loaded."
+        },
+        {
+            "name": "pear-pear.php.net/Console_Getopt",
+            "version": "1.3.1",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/Console_Getopt-1.3.1.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "php": ">=4.3.0.0"
+            },
+            "replace": {
+                "pear-pear/console_getopt": "== 1.3.1.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "PHP License"
+            ],
+            "description": "This is a PHP implementation of &quot;getopt&quot; supporting both\nshort and long options."
+        },
+        {
+            "name": "pear-pear.php.net/HTTP_Request2",
+            "version": "2.2.1",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/HTTP_Request2-2.2.1.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "pear-pear.php.net/net_url2": ">=2.0.0.0",
+                "pear-pear.php.net/pear": ">=1.9.2.0",
+                "php": ">=5.2.0.0"
+            },
+            "replace": {
+                "pear-pear/http_request2": "== 2.2.1.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "BSD License"
+            ],
+            "description": "PHP5 rewrite of HTTP_Request package (with parts of HTTP_Client). Provides\ncleaner API and pluggable Adapters:\n  * Socket adapter, based on old HTTP_Request code,\n  * Curl adapter, wraps around PHP's cURL extension,\n  * Mock adapter, to use for testing packages dependent on HTTP_Request2.\nSupports POST requests with data and file uploads, basic and digest\nauthentication, cookies, managing cookies across requests, proxies, gzip and\ndeflate encodings, redirects, monitoring the request progress with Observers..."
+        },
+        {
+            "name": "pear-pear.php.net/Net_URL2",
+            "version": "2.2.0",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/Net_URL2-2.2.0.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "php": ">=5.1.4.0"
+            },
+            "replace": {
+                "pear-pear/net_url2": "== 2.2.0.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of\n    relative URLs."
+        },
+        {
+            "name": "pear-pear.php.net/PEAR",
+            "version": "1.9.5",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/PEAR-1.9.5.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "ext-pcre": "*",
+                "ext-xml": "*",
+                "pear-pear.php.net/archive_tar": ">=1.3.11.0",
+                "pear-pear.php.net/console_getopt": ">=1.2.0.0",
+                "pear-pear.php.net/structures_graph": ">=1.0.2.0",
+                "pear-pear.php.net/xml_util": ">=1.2.0.0",
+                "php": ">=4.4.0.0,!=5.0.0.0,!=5.1.0.0,!=5.1.1.0,!=5.1.2.0,!=5.1.3.0,!=5.1.4.0,!=5.1.5.0"
+            },
+            "conflict": {
+                "pear-pear.php.net/pear_frontend_gtk": "<0.4.0.0",
+                "pear-pear.php.net/pear_frontend_web": "<=0.4.0.0"
+            },
+            "replace": {
+                "pear-pear/pear": "== 1.9.5.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "New BSD License"
+            ],
+            "description": "The PEAR package contains:\n * the PEAR installer, for creating, distributing\n   and installing packages\n * the PEAR_Exception PHP5 error handling mechanism\n * the PEAR_ErrorStack advanced error handling mechanism\n * the PEAR_Error error handling mechanism\n * the OS_Guess class for retrieving info about the OS\n   where PHP is running on\n * the System class for quick handling of common operations\n   with files and directories\n * the PEAR base class\n  Features in a nutshell:\n  * full support for channels\n  * pre-download dependency validation\n  * new package.xml 2.0 format allows tremendous flexibility while maintaining BC\n  * support for optional dependency groups and limited support for sub-packaging\n  * robust dependency support\n  * full dependency validation on uninstall\n  * remote install for hosts with only ftp access - no more problems with\n    restricted host installation\n  * full support for mirroring\n  * support for bundling several packages into a single tarball\n  * support for static dependencies on a url-based package\n  * support for custom file roles and installation tasks"
+        },
+        {
+            "name": "pear-pear.php.net/Structures_Graph",
+            "version": "1.1.0",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/Structures_Graph-1.1.0.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "php": ">=5.3.0.0"
+            },
+            "replace": {
+                "pear-pear/structures_graph": "== 1.1.0.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "LGPL License"
+            ],
+            "description": "Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed\nand undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing\nas well as for characteristic extraction from the graph topology."
+        },
+        {
+            "name": "pear-pear.php.net/XML_Util",
+            "version": "1.3.0",
+            "dist": {
+                "type": "file",
+                "url": "http://pear.php.net/get/XML_Util-1.3.0.tgz",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "ext-pcre": "*",
+                "php": ">=5.3.0.0"
+            },
+            "replace": {
+                "pear-pear/xml_util": "== 1.3.0.0"
+            },
+            "type": "pear-library",
+            "autoload": {
+                "classmap": [
+                    ""
+                ]
+            },
+            "include-path": [
+                "/"
+            ],
+            "license": [
+                "BSD License"
+            ],
+            "description": "Selection of methods that are often needed when working with XML documents.  Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more."
+        },
+        {
+            "name": "pear/pear_exception",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/pear/PEAR_Exception.git",
+                "reference": "8c18719fdae000b690e3912be401c76e406dd13b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/8c18719fdae000b690e3912be401c76e406dd13b",
+                "reference": "8c18719fdae000b690e3912be401c76e406dd13b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=4.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*"
+            },
+            "type": "class",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "PEAR": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                "."
+            ],
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Helgi Thormar",
+                    "email": "dufuz@php.net"
+                },
+                {
+                    "name": "Greg Beaver",
+                    "email": "cellog@php.net"
+                }
+            ],
+            "description": "The PEAR Exception base class.",
+            "homepage": "https://github.com/pear/PEAR_Exception",
+            "keywords": [
+                "exception"
+            ],
+            "time": "2015-02-10 20:07:52"
+        },
+        {
+            "name": "pear/versioncontrol_git",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/pear/VersionControl_Git.git",
+                "reference": "7e8387c0cfee8640d86a40591ec9741c5cc25c68"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/pear/VersionControl_Git/zipball/7e8387c0cfee8640d86a40591ec9741c5cc25c68",
+                "reference": "7e8387c0cfee8640d86a40591ec9741c5cc25c68",
+                "shasum": ""
+            },
+            "require": {
+                "pear/pear_exception": "*"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "VersionControl": "./"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                "./"
+            ],
+            "license": [
+                "Apache License"
+            ],
+            "authors": [
+                {
+                    "name": "Kousuke Ebihara",
+                    "email": "ebihara@php.net",
+                    "role": "Lead"
+                }
+            ],
+            "description": "VersionControl_Git is a library that provides OO interface to handle Git repository.",
+            "time": "2014-02-21 08:06:18"
+        },
+        {
+            "name": "phing/phing",
+            "version": "2.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phingofficial/phing.git",
+                "reference": "a185fef6df7241e540466b67486a4c4b552260e1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phingofficial/phing/zipball/a185fef6df7241e540466b67486a4c4b552260e1",
+                "reference": "a185fef6df7241e540466b67486a4c4b552260e1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2.0"
+            },
+            "require-dev": {
+                "ext-pdo_sqlite": "*",
+                "lastcraft/simpletest": "@dev",
+                "pdepend/pdepend": "2.x",
+                "pear-pear.php.net/http_request2": "2.2.x",
+                "pear-pear.php.net/net_growl": "2.7.x",
+                "pear-pear.php.net/pear_packagefilemanager": "1.7.x",
+                "pear-pear.php.net/pear_packagefilemanager2": "1.0.x",
+                "pear-pear.php.net/xml_serializer": "0.20.x",
+                "pear/pear_exception": "~1.0",
+                "pear/versioncontrol_git": "@dev",
+                "pear/versioncontrol_svn": "~0.5",
+                "phpdocumentor/phpdocumentor": "2.x",
+                "phploc/phploc": "2.x",
+                "phpmd/phpmd": "~2.2",
+                "phpunit/phpunit": ">=3.7",
+                "sebastian/phpcpd": "2.x",
+                "squizlabs/php_codesniffer": "~2.2"
+            },
+            "suggest": {
+                "pdepend/pdepend": "PHP version of JDepend",
+                "pear/archive_tar": "Tar file management class",
+                "pear/versioncontrol_git": "A library that provides OO interface to handle Git repository",
+                "pear/versioncontrol_svn": "A simple OO-style interface for Subversion, the free/open-source version control system",
+                "phpdocumentor/phpdocumentor": "Documentation Generator for PHP",
+                "phploc/phploc": "A tool for quickly measuring the size of a PHP project",
+                "phpmd/phpmd": "PHP version of PMD tool",
+                "phpunit/php-code-coverage": "Library that provides collection, processing, and rendering functionality for PHP code coverage information",
+                "phpunit/phpunit": "The PHP Unit Testing Framework",
+                "sebastian/phpcpd": "Copy/Paste Detector (CPD) for PHP code",
+                "tedivm/jshrink": "Javascript Minifier built in PHP"
+            },
+            "bin": [
+                "bin/phing"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.11.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "classes/phing/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                "classes"
+            ],
+            "license": [
+                "LGPL-3.0"
+            ],
+            "authors": [
+                {
+                    "name": "Michiel Rook",
+                    "email": "mrook@php.net"
+                },
+                {
+                    "name": "Phing Community",
+                    "homepage": "https://www.phing.info/trac/wiki/Development/Contributors"
+                }
+            ],
+            "description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.",
+            "homepage": "https://www.phing.info/",
+            "keywords": [
+                "build",
+                "phing",
+                "task",
+                "tool"
+            ],
+            "time": "2015-05-20 13:04:38"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {
+        "pear/versioncontrol_git": 20
+    },
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}
