diff --git a/doc/source/static.rst b/doc/source/static.rst
index c04380ec65..571a7a9f7a 100644
--- a/doc/source/static.rst
+++ b/doc/source/static.rst
@@ -15,7 +15,7 @@ At a Glance
   * http://logs.openstack.org
   * http://docs-draft.openstack.org
   * http://status.openstack.org
-  * http://pypi.openstack.org
+  * http://mirror.openstack.org
   * http://specs.openstack.org
 :Puppet:
   * :file:`modules/openstack_project/manifests/static.pp`
diff --git a/manifests/site.pp b/manifests/site.pp
index ac95cd8963..14dd32f7c3 100644
--- a/manifests/site.pp
+++ b/manifests/site.pp
@@ -535,7 +535,24 @@ node 'mirror-update.openstack.org' {
   }
 }
 
-# Machines in each region to run PyPI mirrors.
+# Machines in each region to serve AFS mirrors.
+# Node-OS: trusty
+node /^mirror\..*\.openstack\.org$/ {
+  $group = "mirror"
+
+  class { 'openstack_project::server':
+    iptables_public_tcp_ports => [22, 80],
+    sysadmins                 => hiera('sysadmins', []),
+    afs                       => true,
+  }
+
+  class { 'openstack_project::mirror':
+    vhost_name => $::fqdn,
+    require    => Class['Openstack_project::Server'],
+  }
+}
+
+# Legacy machines in each region to run pypi package mirrors.
 # Node-OS: precise
 node /^pypi\..*\.openstack\.org$/ {
   $group = "pypi"
diff --git a/modules/openstack_project/manifests/mirror.pp b/modules/openstack_project/manifests/mirror.pp
new file mode 100644
index 0000000000..647941e4d3
--- /dev/null
+++ b/modules/openstack_project/manifests/mirror.pp
@@ -0,0 +1,9 @@
+# == Class: openstack_project::mirror
+#
+class openstack_project::mirror (
+  $vhost_name = $::fqdn,
+) {
+
+  $mirror_root = '/afs/openstack.org/mirror'
+
+}