diff --git a/.gitignore b/.gitignore
index 14aa128097..eb9aba1f3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ manifests/secrets.pp
 .test/
 openstack_infra_config.egg-info/
 /.project
+/.pydevproject
diff --git a/manifests/site.pp b/manifests/site.pp
index bb944a7b79..c5bd570b49 100644
--- a/manifests/site.pp
+++ b/manifests/site.pp
@@ -344,6 +344,8 @@ node 'pypi.slave.openstack.org' {
     pypi_username          => 'openstackci',
     pypi_password          => hiera('pypi_password'),
     jenkins_ssh_public_key => $openstack_project::jenkins_ssh_key,
+    jenkinsci_username     => hiera('jenkins_ci_org_user'),
+    jenkinsci_password     => hiera('jenkins_ci_org_password'),
   }
 }
 
diff --git a/modules/jenkins/files/slave_scripts/maven-properties.sh b/modules/jenkins/files/slave_scripts/maven-properties.sh
new file mode 100644
index 0000000000..ca5328fd05
--- /dev/null
+++ b/modules/jenkins/files/slave_scripts/maven-properties.sh
@@ -0,0 +1,30 @@
+#!/bin/bash -ex
+
+# This file is a helper for versioning and deployment of
+# maven projects.  It sets up environment variables to
+# pass to maven build commands so that we can generate
+# versioned builds within the gerrit workflow.
+
+# get version info from scm
+SCM_TAG=$(git describe --abbrev=0 --tags) || true
+SCM_SHA=$(git rev-parse --short HEAD)
+
+# assumes format is like this  '0.0.4-2-g135721c'
+COMMITS_SINCE_TAG=`git describe | awk '{split($0,a,"-"); print a[2]}'`
+
+# just use git sha if there is no tag yet.
+if [[ "${SCM_TAG}" == "" ]]; then
+    SCM_TAG=$SCM_SHA
+fi
+
+# General build version should be something like '0.0.4.3.d4ee90c'
+# Release build version should be something like '0.0.5'
+if [[ "${COMMITS_SINCE_TAG}" == "" ]]; then
+    PROJECT_VER=$SCM_TAG
+else
+    PROJECT_VER="$SCM_TAG.$COMMITS_SINCE_TAG.$SCM_SHA";
+fi
+
+echo "SCM_SHA=$SCM_SHA" >maven.properties
+echo "COMMITS_SINCE_TAG=$COMMITS_SINCE_TAG" >>maven.properties
+echo "PROJECT_VER=$PROJECT_VER" >>maven.properties
diff --git a/modules/jenkins/files/slave_scripts/maven-upload.sh b/modules/jenkins/files/slave_scripts/maven-upload.sh
new file mode 100644
index 0000000000..1610e0d1dc
--- /dev/null
+++ b/modules/jenkins/files/slave_scripts/maven-upload.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+#
+# Copyright 2013  Hewlett-Packard Development Company, L.P.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# Upload java binaries to maven repositories
+
+PROJECT=$1
+REPO_URL=$2
+REPO_CRED_FILE=$3
+
+FILENAME=`ls ${PROJECT}*.hpi`
+# Strip project name and extension leaving only the version.
+VERSION=`echo ${FILENAME} | sed -n "s/${PROJECT}-\(.*\).hpi/\1/p"`
+
+curl -X PUT \
+     -u --config ${REPO_CRED_FILE} \
+     --data-binary @${FILENAME} \
+     -i "${REPO_URL}/${PROJECT}/${VERSION}/${FILENAME}" > /dev/null 2>&1
+
+exit $?
diff --git a/modules/openstack_project/files/jenkins_job_builder/config/jenkins-plugin-jobs.yaml b/modules/openstack_project/files/jenkins_job_builder/config/jenkins-plugin-jobs.yaml
index 0a3492ecc9..85423c9e92 100644
--- a/modules/openstack_project/files/jenkins_job_builder/config/jenkins-plugin-jobs.yaml
+++ b/modules/openstack_project/files/jenkins_job_builder/config/jenkins-plugin-jobs.yaml
@@ -3,6 +3,11 @@
     project-type: maven
     node: precise
 
+    properties:
+      - inject:
+          script-file: /usr/local/jenkins/slave_scripts/maven-properties.sh
+          properties-file: maven.properties
+
     prebuilders:
       - gerrit-git-prep
 
@@ -12,7 +17,7 @@
         group-id: '{maven-group-id}'
         artifact-id: '{name}'
       root-pom: pom.xml
-      goals: 'clean package'
+      goals: 'clean package -Dproject-version=$PROJECT_VER'
 
     publishers:
       - console-log
@@ -22,6 +27,11 @@
     project-type: maven
     node: precise
 
+    properties:
+      - inject:
+          script-file: /usr/local/jenkins/slave_scripts/maven-properties.sh
+          properties-file: maven.properties
+
     prebuilders:
       - gerrit-git-prep
 
@@ -31,13 +41,35 @@
         group-id: '{maven-group-id}'
         artifact-id: '{name}'
       root-pom: pom.xml
-      goals: 'clean package -Dmaven.test.skip=true'
+      goals: 'clean package -Dmaven.test.skip=true -Dproject-version=$PROJECT_VER'
 
     publishers:
       - war:
           site: 'tarballs.openstack.org'
           warfile: 'target/{name}.hpi'
-          target: 'tarballs/ci/'
+          target: 'tarballs/ci/{name}/{name}-$PROJECT_VER.hpi'
+      - console-log-post
+
+- job-template:
+    name: '{name}-jenkinsci-upload'
+    node: pypi
+
+    builders:
+      - shell: |
+          #!/bin/bash -xe
+          TAG=`echo $ZUUL_REF | sed 's/^refs.tags.//'`
+          FILENAME="{name}-$TAG.hpi"
+
+          # copy plugin plugin artifacts from tarballs to local workspace
+          rm -rf *.hpi
+          curl -o $FILENAME http://{tarball-site}/ci/{name}/$FILENAME
+
+          # deploy plugin artifacts from workspace to repo.jenkins-ci.org
+          JENKINSCI_REPO="http://repo.jenkins-ci.org/list/releases/org/jenkins-ci/plugins"
+          JENKINSCI_REPO_CREDS="/home/jenkins/.jenkinsci-curl"
+          /usr/local/jenkins/slave_scripts/maven-upload.sh {name} $JENKINSCI_REPO $JENKINSCI_REPO_CREDS
+
+    publishers:
       - console-log-post
 
 - job-group:
@@ -45,3 +77,4 @@
     jobs:
       - 'gate-{name}-build'
       - '{name}-hpi-artifact'
+      - '{name}-jenkinsci-upload'
diff --git a/modules/openstack_project/files/zuul/layout.yaml b/modules/openstack_project/files/zuul/layout.yaml
index a4e6ae1de0..da8374ae78 100644
--- a/modules/openstack_project/files/zuul/layout.yaml
+++ b/modules/openstack_project/files/zuul/layout.yaml
@@ -1538,6 +1538,9 @@ projects:
       - gate-gearman-plugin-build
     post:
       - gearman-plugin-hpi-artifact
+    release:
+      - gearman-plugin-hpi-artifact:
+        - gearman-plugin-jenkinsci-upload
 
   - name: openstack-infra/zmq-event-publisher
     check:
diff --git a/modules/openstack_project/manifests/pypi_slave.pp b/modules/openstack_project/manifests/pypi_slave.pp
index 3787d00887..b6f44c4334 100644
--- a/modules/openstack_project/manifests/pypi_slave.pp
+++ b/modules/openstack_project/manifests/pypi_slave.pp
@@ -12,12 +12,15 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 #
-# Class to install dependencies for uploading python packages to pypi.
+# Class to install dependencies for uploading python packages to pypi and
+# maven repositories
 #
 class openstack_project::pypi_slave (
   $pypi_password,
   $jenkins_ssh_public_key,
-  $pypi_username = 'openstackci'
+  $pypi_username = 'openstackci',
+  $jenkinsci_username,
+  $jenkinsci_password
 ) {
   class { 'openstack_project::slave':
     ssh_key => $jenkins_ssh_public_key,
@@ -39,4 +42,14 @@ class openstack_project::pypi_slave (
     content => template('openstack_project/pypicurl.erb'),
     require => File['/home/jenkins'],
   }
+
+  file { '/home/jenkins/.jenkinsci-curl':
+    ensure  => present,
+    owner   => 'jenkins',
+    group   => 'jenkins',
+    mode    => '0600',
+    content => template('openstack_project/jenkinsci-curl.erb'),
+    require => File['/home/jenkins'],
+  }
+
 }
diff --git a/modules/openstack_project/templates/jenkinsci-curl.erb b/modules/openstack_project/templates/jenkinsci-curl.erb
new file mode 100644
index 0000000000..d475bf8f8b
--- /dev/null
+++ b/modules/openstack_project/templates/jenkinsci-curl.erb
@@ -0,0 +1 @@
+user = "<%= jenkinsci_username %>:<%= jenkinsci_password %>"