diff --git a/src/lib/Hydra/Schema/BuildOutputs.pm b/src/lib/Hydra/Schema/BuildOutputs.pm
new file mode 100644
index 00000000..44b9756e
--- /dev/null
+++ b/src/lib/Hydra/Schema/BuildOutputs.pm
@@ -0,0 +1,90 @@
+use utf8;
+package Hydra::Schema::BuildOutputs;
+
+# Created by DBIx::Class::Schema::Loader
+# DO NOT MODIFY THE FIRST PART OF THIS FILE
+
+=head1 NAME
+
+Hydra::Schema::BuildOutputs
+
+=cut
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+
+=head1 TABLE: C<BuildOutputs>
+
+=cut
+
+__PACKAGE__->table("BuildOutputs");
+
+=head1 ACCESSORS
+
+=head2 build
+
+  data_type: 'integer'
+  is_foreign_key: 1
+  is_nullable: 0
+
+=head2 name
+
+  data_type: 'text'
+  is_nullable: 0
+
+=head2 path
+
+  data_type: 'text'
+  is_nullable: 0
+
+=cut
+
+__PACKAGE__->add_columns(
+  "build",
+  { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
+  "name",
+  { data_type => "text", is_nullable => 0 },
+  "path",
+  { data_type => "text", is_nullable => 0 },
+);
+
+=head1 PRIMARY KEY
+
+=over 4
+
+=item * L</build>
+
+=item * L</name>
+
+=back
+
+=cut
+
+__PACKAGE__->set_primary_key("build", "name");
+
+=head1 RELATIONS
+
+=head2 build
+
+Type: belongs_to
+
+Related object: L<Hydra::Schema::Builds>
+
+=cut
+
+__PACKAGE__->belongs_to(
+  "build",
+  "Hydra::Schema::Builds",
+  { id => "build" },
+  { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
+);
+
+
+# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UpVoKdd3OwMvlvyMjcYNVA
+
+
+# You can replace this text with custom code or comments, and it will be preserved on regeneration
+1;
diff --git a/src/lib/Hydra/Schema/BuildStepOutputs.pm b/src/lib/Hydra/Schema/BuildStepOutputs.pm
new file mode 100644
index 00000000..7f560732
--- /dev/null
+++ b/src/lib/Hydra/Schema/BuildStepOutputs.pm
@@ -0,0 +1,115 @@
+use utf8;
+package Hydra::Schema::BuildStepOutputs;
+
+# Created by DBIx::Class::Schema::Loader
+# DO NOT MODIFY THE FIRST PART OF THIS FILE
+
+=head1 NAME
+
+Hydra::Schema::BuildStepOutputs
+
+=cut
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+
+=head1 TABLE: C<BuildStepOutputs>
+
+=cut
+
+__PACKAGE__->table("BuildStepOutputs");
+
+=head1 ACCESSORS
+
+=head2 build
+
+  data_type: 'integer'
+  is_foreign_key: 1
+  is_nullable: 0
+
+=head2 stepnr
+
+  data_type: 'integer'
+  is_foreign_key: 1
+  is_nullable: 0
+
+=head2 name
+
+  data_type: 'text'
+  is_nullable: 0
+
+=head2 path
+
+  data_type: 'text'
+  is_nullable: 0
+
+=cut
+
+__PACKAGE__->add_columns(
+  "build",
+  { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
+  "stepnr",
+  { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
+  "name",
+  { data_type => "text", is_nullable => 0 },
+  "path",
+  { data_type => "text", is_nullable => 0 },
+);
+
+=head1 PRIMARY KEY
+
+=over 4
+
+=item * L</build>
+
+=item * L</stepnr>
+
+=item * L</name>
+
+=back
+
+=cut
+
+__PACKAGE__->set_primary_key("build", "stepnr", "name");
+
+=head1 RELATIONS
+
+=head2 build
+
+Type: belongs_to
+
+Related object: L<Hydra::Schema::Builds>
+
+=cut
+
+__PACKAGE__->belongs_to(
+  "build",
+  "Hydra::Schema::Builds",
+  { id => "build" },
+  { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
+);
+
+=head2 buildstep
+
+Type: belongs_to
+
+Related object: L<Hydra::Schema::BuildSteps>
+
+=cut
+
+__PACKAGE__->belongs_to(
+  "buildstep",
+  "Hydra::Schema::BuildSteps",
+  { build => "build", stepnr => "stepnr" },
+  { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
+);
+
+
+# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dC1yX7arRVu9K3wG9dAjCg
+
+
+# You can replace this text with custom code or comments, and it will be preserved on regeneration
+1;
diff --git a/src/sql/upgrade-9.sql b/src/sql/upgrade-9.sql
new file mode 100644
index 00000000..573cc5dc
--- /dev/null
+++ b/src/sql/upgrade-9.sql
@@ -0,0 +1,33 @@
+create table BuildOutputs (
+    build         integer not null,
+    name          text not null,
+    path          text not null,
+    primary key   (build, name),
+    foreign key   (build) references Builds(id) on delete cascade
+);
+
+insert into BuildOutputs (build, name, path)
+    select id, 'out', outPath from Builds;
+
+alter table Builds drop column outPath;
+
+create table BuildStepOutputs (
+    build         integer not null,
+    stepnr        integer not null,
+    name          text not null,
+    path          text not null,
+    primary key   (build, stepnr, name),
+    foreign key   (build) references Builds(id) on delete cascade,
+    foreign key   (build, stepnr) references BuildSteps(build, stepnr) on delete cascade
+);
+
+insert into BuildStepOutputs (build, stepnr, name, path)
+    select build, stepnr, 'out', outPath from BuildSteps where outPath is not null;
+
+drop index IndexBuildStepsOnBuild;
+drop index IndexBuildStepsOnOutpath;
+drop index IndexBuildStepsOnOutpathBuild;
+
+alter table BuildSteps drop column outPath;
+
+create index IndexBuildStepOutputsOnPath on BuildStepOutputs(path);