diff --git a/BUCK b/BUCK
index 041a12e..db813df 100644
--- a/BUCK
+++ b/BUCK
@@ -1,17 +1,3 @@
-def genwsdl2java(
-    name,
-    srcs,
-    out):
-  genrule(
-    name = name,
-    srcs = srcs,
-      cmd = '$(exe :wsdl2java) -o $TMP ' +
-      '-p com.atlassian.jira.rpc.soap.client $SRCS && ' +
-      'cd $TMP && ' +
-      'zip -qr $OUT .',
-    out = out,
-  )
-
 gerrit_plugin(
   name = 'its-jira',
   srcs = glob(['src/main/java/**/*.java']),
@@ -25,31 +11,10 @@
     'Implementation-Vendor: GerritForge LLP',
   ],
   deps = [
-    ':wsdl2java_lib',
     '//plugins/its-base:its-base__plugin',
-    '//plugins/its-jira/lib/axis:axis',
-    '//plugins/its-jira/lib:xmlrpc-client',
-    '//plugins/its-jira/lib:wsdl4j',
-  ],
-)
-
-java_library(
-  name = 'wsdl2java_lib',
-  srcs = [':wsdl2java_src'],
-  deps = ['//plugins/its-jira/lib/axis:axis'],
-)
-
-genwsdl2java(
-  name = 'wsdl2java_src',
-  srcs = ['src/main/wsdl/jirasoapservice-v2.wsdl'],
-  out = 'wsdl2java.src.zip',
-)
-
-java_binary(
-  name = 'wsdl2java',
-  main_class = 'org.apache.axis.wsdl.WSDL2Java',
-  deps = [
-    '//plugins/its-jira/lib/axis:axis',
-    '//plugins/its-jira/lib/axis:wsdl4j',
-  ],
+    '//plugins/its-jira/lib:jira-rest-java-client-core',
+    '//plugins/its-jira/lib:atlassian-httpclient-apache-httpcomponents',
+    '//plugins/its-jira/lib:jira-rest-java-client-api',
+    '//plugins/its-jira/lib:atlassian-util-concurrent'
+],
 )
diff --git a/lib/BUCK b/lib/BUCK
index 912b16e..239e75b 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -1,6 +1,10 @@
 include_defs('//lib/maven.defs')
 
 define_license('CPL1.0')
+define_license('CDDL')
+define_license('BSD')
+
+ATLASSIAN_REPO = 'https://maven.atlassian.com/repository/public/'
 
 maven_jar(
   name = 'xmlrpc-client',
@@ -42,3 +46,303 @@
   license = 'CPL1.0',
   local_license = True,
 )
+
+maven_jar(
+  name = 'jira-rest-java-client-core',
+  id = 'com.atlassian.jira:jira-rest-java-client-core:3.0.0',
+  sha1 = '6dd9fcb1b6cbf2e266270bd3ab10a10f8c8a5464',
+  deps = [
+    ':atlassian-httpclient-apache-httpcomponents',
+    ':atlassian-util-concurrent',
+    ':guava',
+    ':httpmime',
+    ':jersey-client',
+    ':jersey-json',
+    ':jira-rest-java-client-api',
+    ':joda-time'
+  ],
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'atlassian-httpclient-apache-httpcomponents',
+  id = 'com.atlassian.httpclient:atlassian-httpclient-apache-httpcomponents:0.13.2',
+  deps = [
+    ':atlassian-event',
+    ':atlassian-httpclient-api',
+    ':httpasyncclient',
+    ':httpasyncclient-cache',
+    ':httpclient-cache',
+    ':httpcore',
+    ':httpcore-nio',
+    ':sal-api',
+    ':slf4j-api',
+    ':spring-context'
+  ],
+  repository = ATLASSIAN_REPO,
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'spring-context',
+  id = 'org.springframework:spring-context:2.5.6',
+  deps = [
+    ':aopalliance',
+    ':spring-core',
+    ':spring-beans'
+  ],
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'aopalliance',
+  id = 'aopalliance:aopalliance:1.0',
+  license = 'PublicDomain'
+)
+
+maven_jar(
+  name = 'spring-beans',
+  id = 'org.springframework:spring-beans:2.5.6',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'spring-core',
+  id = 'org.springframework:spring-core:2.5.6',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'httpasyncclient',
+  id  = 'org.apache.httpcomponents:httpasyncclient:4.0-beta3-atlassian-1',
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'httpcore',
+  id = 'org.apache.httpcomponents:httpcore:4.2.2',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'httpcore-nio',
+  id = 'org.apache.httpcomponents:httpcore-nio:4.2.2',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'httpclient-cache',
+  id = 'org.apache.httpcomponents:httpclient-cache:4.2.1-atlassian-2',
+  deps = [
+    ':httpclient'
+  ],
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'httpclient',
+  id = 'org.apache.httpcomponents:httpclient:4.2.1-atlassian-2',
+  deps = [
+    ':commons-codec'
+  ],
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'commons-codec',
+  id = 'commons-codec:commons-codec:1.6',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'httpasyncclient-cache',
+  id = 'org.apache.httpcomponents:httpasyncclient-cache:4.0-beta3-atlassian-1',
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'slf4j-api',
+  id = 'org.slf4j:slf4j-api:1.6.4',
+  license = 'slf4j'
+)
+
+maven_jar(
+  name  ='atlassian-event',
+  id = 'com.atlassian.event:atlassian-event:2.2.0',
+  license = 'BSD',
+  repository = ATLASSIAN_REPO,
+  local_license = True
+)
+
+maven_jar(
+  name = 'sal-api',
+  id = 'com.atlassian.sal:sal-api:2.7.0',
+  license = 'BSD',
+  repository = ATLASSIAN_REPO,
+  local_license = True
+)
+
+maven_jar(
+  name = 'atlassian-httpclient-api',
+  id = 'com.atlassian.httpclient:atlassian-httpclient-api:0.13.2',
+  sha1 = '1d375dbeb33159b72fb85ff992c078712d7ebb92',
+  deps = [
+    ':atlassian-httpclient-spi'
+  ],
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'atlassian-httpclient-spi',
+  id = 'com.atlassian.httpclient:atlassian-httpclient-spi:0.13.2',
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'joda-time',
+  id = 'joda-time:joda-time:1.6',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'atlassian-util-concurrent',
+  id = 'com.atlassian.util.concurrent:atlassian-util-concurrent:2.4.0-M9',
+  repository = ATLASSIAN_REPO,
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'httpmime',
+  id = 'org.apache.httpcomponents:httpmime:4.1.2',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'guava',
+  id = 'com.google.guava:guava:10.0.1',
+  deps = [
+    ':jsr305'
+  ],
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'jsr305',
+  id = 'com.google.code.findbugs:jsr305:1.3.9',
+  license = 'Apache2.0',
+  attach_source = False
+)
+
+maven_jar(
+  name = 'jira-rest-java-client-api',
+  id = 'com.atlassian.jira:jira-rest-java-client-api:3.0.0',
+  sha1 = 'dd2dfa40cfbb43fe0e450d359d639c1d9a1fa28e',
+  license = 'Apache2.0',
+  repository = ATLASSIAN_REPO
+)
+
+maven_jar(
+  name = 'jersey-client',
+  id = 'com.sun.jersey:jersey-client:1.5',
+  deps = [
+    ':jersey-core'
+  ],
+  license = 'CDDL',
+  local_license = True
+)
+
+maven_jar(
+  name = 'jersey-core',
+  id = 'com.sun.jersey:jersey-core:1.5',
+  license = 'CDDL',
+  local_license = True
+)
+
+maven_jar(
+  name = 'jersey-json',
+  id = 'com.sun.jersey:jersey-json:1.5',
+  deps = [
+    ':jackson-core-asl',
+    ':jackson-mapper-asl',
+    ':jackson-xc',
+    ':jaxb-impl',
+    ':jettison'
+  ],
+  license = 'CDDL',
+  local_license = True
+)
+
+maven_jar(
+  name = 'jettison',
+  id = 'org.codehaus.jettison:jettison:1.1',
+  deps = [
+    ':stax-api-1'
+  ],
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'stax-api-1',
+  id='stax:stax-api:1.0.1',
+  license = 'Apache2.0',
+  attach_source = False
+)
+
+maven_jar(
+  name = 'jaxb-impl',
+  id = 'com.sun.xml.bind:jaxb-impl:2.2.3',
+  deps = [
+    ':jaxb-api'
+  ],
+  license = 'CDDL',
+  local_license = True
+)
+
+maven_jar(
+  name = 'jaxb-api',
+  id = 'javax.xml.bind:jaxb-api:2.2.2',
+  deps = [
+    ':stax-api-2'
+  ],
+  license = 'CDDL',
+  local_license = True
+)
+
+maven_jar(
+  name = 'stax-api-2',
+  id = 'javax.xml.stream:stax-api:1.0-2',
+  license = 'CDDL',
+  attach_source = False,
+  local_license = True
+)
+
+maven_jar(
+  name = 'jackson-core-asl',
+  id = 'org.codehaus.jackson:jackson-core-asl:1.5.5',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'jackson-mapper-asl',
+  id = 'org.codehaus.jackson:jackson-mapper-asl:1.5.5',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'jackson-jaxrs',
+  id = 'org.codehaus.jackson:jackson-jaxrs:1.5.5',
+  license = 'Apache2.0'
+)
+
+maven_jar(
+  name = 'jackson-xc',
+  id = 'org.codehaus.jackson:jackson-xc:1.5.5',
+  license = 'Apache2.0'
+)
diff --git a/lib/LICENSE-BSD b/lib/LICENSE-BSD
new file mode 100644
index 0000000..a63f2ea
--- /dev/null
+++ b/lib/LICENSE-BSD
@@ -0,0 +1,9 @@
+The Regents of the University of California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+All advertising materials mentioning features or use of this software must display the following acknowledgement: “This product includes software developed by the University of California, Berkeley and its contributors.”
+Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib/LICENSE-CDDL b/lib/LICENSE-CDDL
new file mode 100644
index 0000000..fcf1fb5
--- /dev/null
+++ b/lib/LICENSE-CDDL
@@ -0,0 +1,129 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
+Version 1.0
+1. Definitions.
+
+1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
+
+1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
+
+1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
+
+1.4. “Executable” means the Covered Software in any form other than Source Code.
+
+1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
+
+1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
+
+1.7. “License” means this document.
+
+1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+
+1.9. “Modifications” means the Source Code and Executable form of any of the following:
+
+A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
+
+B. Any new file that contains any part of the Original Software or previous Modification; or
+
+C. Any new file that is contributed or otherwise made available under the terms of this License.
+
+1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
+
+1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+
+1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
+
+1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
+
+(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
+
+2.2. Contributor Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code.
+
+Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
+
+3.2. Modifications.
+
+The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
+
+3.3. Required Notices.
+
+You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms.
+
+You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions.
+
+You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+3.6. Larger Works.
+
+You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions.
+
+Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
+
+4.2. Effect of New Versions.
+
+You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
+
+4.3. Modified Versions.
+
+When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/InitJira.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/InitJira.java
index fe36872..0e5a8f8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/InitJira.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/InitJira.java
@@ -15,7 +15,7 @@
 package com.googlesource.gerrit.plugins.hooks.jira;
 
 import java.io.IOException;
-import java.rmi.RemoteException;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 
 import com.google.gerrit.extensions.annotations.PluginName;
@@ -40,7 +40,6 @@
   private final Section.Factory sections;
   private final InitFlags flags;
   private Section jira;
-  private Section jiraComment;
   private String jiraUrl;
   private String jiraUsername;
   private String jiraPassword;
@@ -90,7 +89,7 @@
 
   private void init() {
     this.jira = sections.get(pluginName, null);
-    this.jiraComment = sections.get(COMMENT_LINK_SECTION, pluginName);
+    Section jiraComment = sections.get(COMMENT_LINK_SECTION, pluginName);
 
     do {
       enterJiraConnectivity();
@@ -120,13 +119,10 @@
   private boolean isJiraConnectSuccessful() {
     ui.message("Checking Jira connectivity ... ");
     try {
-      JiraClient jiraClient = new JiraClient(jiraUrl);
-      JiraSession jiraToken =
-          jiraClient.login(jiraUsername, jiraPassword);
-      jiraClient.logout(jiraToken);
+      new JiraClient(jiraUrl, jiraUsername, jiraPassword).sysInfo().getVersion();
       ui.message("[OK]\n");
       return true;
-    } catch (RemoteException e) {
+    } catch (URISyntaxException e) {
       ui.message("*FAILED* (%s)\n", e.toString());
       return false;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java
index 5f1e919..2429917 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java
@@ -14,66 +14,133 @@
 
 package com.googlesource.gerrit.plugins.hooks.jira;
 
-import java.net.URL;
-import java.rmi.RemoteException;
+import com.atlassian.jira.rest.client.api.IssueRestClient;
+import com.atlassian.jira.rest.client.api.JiraRestClient;
+import com.atlassian.jira.rest.client.api.JiraRestClientFactory;
+import com.atlassian.jira.rest.client.api.RestClientException;
+import com.atlassian.jira.rest.client.api.domain.Comment;
+import com.atlassian.jira.rest.client.api.domain.Issue;
+import com.atlassian.jira.rest.client.api.domain.ServerInfo;
+import com.atlassian.jira.rest.client.api.domain.Transition;
+import com.atlassian.jira.rest.client.api.domain.input.TransitionInput;
+import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory;
+import com.atlassian.util.concurrent.Promise;
+import com.googlesource.gerrit.plugins.hooks.its.InvalidTransitionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import com.atlassian.jira.rpc.soap.client.JiraSoapService;
-import com.atlassian.jira.rpc.soap.client.JiraSoapServiceServiceLocator;
-import com.atlassian.jira.rpc.soap.client.RemoteComment;
-import com.atlassian.jira.rpc.soap.client.RemoteFieldValue;
-import com.atlassian.jira.rpc.soap.client.RemoteIssue;
-import com.atlassian.jira.rpc.soap.client.RemoteNamedObject;
-import com.atlassian.jira.rpc.soap.client.RemoteServerInfo;
+import java.net.URI;
+import java.net.URISyntaxException;
 
+/**
+ * Jira Rest Client.
+ */
 public class JiraClient {
+  private static final Logger log = LoggerFactory.getLogger(JiraClient.class);
 
-  private final JiraSoapService service;
+  private JiraRestClient client = null;
 
-  public JiraClient(final String baseUrl) throws RemoteException {
-    this(baseUrl, "/rpc/soap/jirasoapservice-v2");
+  /**
+   * @param url  jira url
+   * @param user username of the jira user
+   * @param pass password of the jira user
+   * @throws URISyntaxException
+   */
+  public JiraClient(String url, String user, String pass) throws URISyntaxException {
+    URI jiraUri = new URI(url);
+    log.debug("Trying to access Jira at " + jiraUri);
+    JiraRestClientFactory factory = new AsynchronousJiraRestClientFactory();
+    client = factory.createWithBasicHttpAuthentication(jiraUri, user, pass);
+    log.debug("Initialized jira client " + client);
   }
 
-  public JiraClient(final String baseUrl, final String rpcPath) throws RemoteException {
-    try {
-      JiraSoapServiceServiceLocator locator = new JiraSoapServiceServiceLocator();
-      service = locator.getJirasoapserviceV2(new URL(baseUrl+rpcPath));
+  /**
+   * @param issueKey Issue id
+   * @return Issueobjekt by issue id
+   * @throws RestClientException
+   */
+  public Issue getIssue(String issueKey) throws RestClientException {
+    IssueRestClient issueClient = this.client.getIssueClient();
+    return issueClient.getIssue(issueKey).claim();
+  }
+
+  /**
+   * @param issueKey Jira Issue key
+   * @return true if issue exists
+   */
+  public boolean issueExists(String issueKey) throws RestClientException {
+    boolean ret = true;
+    try{
+      getIssue(issueKey);
+    } catch (RestClientException e) {
+      if (e.getStatusCode().get() == 404){
+        log.error("Issue " + issueKey + " not found ");
+        ret = false;
+      } else {
+        throw e;
+      }
     }
-    catch (Exception e) {
-        throw new RemoteException("ServiceException during SOAPClient contruction", e);
+    return ret;
+  }
+
+  /**
+   * @param issueKey Jira Issue key
+   * @return Iterable of available transitions
+   * @throws RestClientException
+   */
+  public Iterable<Transition> getTransitions(String issueKey) throws RestClientException {
+    return client.getIssueClient().getTransitions(getIssue(issueKey)).claim();
+  }
+
+  /**
+   * @param issueKey Jira Issue key
+   * @param comment  Comment  to be added
+   * @throws RestClientException
+   */
+  public void addComment(String issueKey, Comment comment) throws RestClientException, URISyntaxException {
+    log.debug("Trying to add comment for issue " + issueKey);
+    Issue issue = getIssue(issueKey);
+    URI issueUri;
+    issueUri = new URI(issue.getSelf().toString() + "/comment/");
+    IssueRestClient issueClient = client.getIssueClient();
+    Promise<Void> promise = issueClient.addComment(issueUri, comment);
+    promise.claim();
+    log.debug("Comment added to issue " + issueKey);
+  }
+
+  /**
+   * @param issueKey   Jira Issue key
+   * @param transition Transition to perform
+   * @return true if successful
+   */
+  public boolean doTransition(String issueKey, String transition) throws RestClientException, InvalidTransitionException {
+    Transition t = getTransitionByName(getTransitions(issueKey), transition);
+    if (t == null) {
+      throw new InvalidTransitionException("Action " + transition
+        + " not executable on issue " + issueKey);
     }
+    TransitionInput input;
+    input = new TransitionInput(t.getId());
+    log.debug("Setting transition input to: " + input.toString());
+    client.getIssueClient().transition(getIssue(issueKey), input).claim();
+    return true;
   }
 
-  public JiraSession login(final String username, final String password) throws RemoteException {
-    String token = service.login(username, password);
-    return new JiraSession(username, token);
+  /**
+   * @return Serverinformation of jira
+   */
+  public ServerInfo sysInfo() throws RestClientException {
+    return client.getMetadataClient().getServerInfo().claim();
   }
 
-  public void logout(JiraSession token) throws RemoteException {
-    service.logout(getToken(token));
+  private Transition getTransitionByName(Iterable<Transition> transitions, String transition) {
+    Transition ret = null;
+    for (Transition t : transitions) {
+      if (transition.equals(t.getName())) {
+        ret = t;
+        break;
+      }
+    }
+    return ret;
   }
-
-  public RemoteIssue getIssue(JiraSession token, String issueKey) throws RemoteException {
-    return service.getIssue(getToken(token), issueKey);
-  }
-
-  public RemoteNamedObject[] getAvailableActions(JiraSession token, String issueKey) throws RemoteException {
-    return service.getAvailableActions(getToken(token), issueKey);
-  }
-
-  public RemoteIssue performAction(JiraSession token, String issueKey, String actionId, RemoteFieldValue... params) throws RemoteException {
-    return service.progressWorkflowAction(getToken(token), issueKey, actionId, params);
-  }
-
-  public void addComment(JiraSession token, String issueKey, RemoteComment comment) throws RemoteException {
-    service.addComment(getToken(token), issueKey, comment);
-  }
-
-  public RemoteServerInfo getServerInfo(JiraSession token) throws RemoteException {
-    return service.getServerInfo(getToken(token));
-  }
-
-  private String getToken(JiraSession token) {
-    return token == null ? null : token.getToken();
-  }
-
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraItsFacade.java
index 152e6d1..30682be 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraItsFacade.java
@@ -14,27 +14,19 @@
 
 package com.googlesource.gerrit.plugins.hooks.jira;
 
-import java.io.IOException;
-import java.net.URL;
-import java.rmi.RemoteException;
-import java.util.concurrent.Callable;
-
-import org.apache.axis.AxisFault;
+import com.atlassian.jira.rest.client.api.domain.Comment;
+import com.atlassian.jira.rest.client.api.domain.ServerInfo;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.googlesource.gerrit.plugins.hooks.its.ItsFacade;
 import org.eclipse.jgit.lib.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.atlassian.jira.rpc.soap.client.RemoteAuthenticationException;
-import com.atlassian.jira.rpc.soap.client.RemoteComment;
-import com.atlassian.jira.rpc.soap.client.RemoteNamedObject;
-import com.atlassian.jira.rpc.soap.client.RemoteServerInfo;
-
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-
-import com.googlesource.gerrit.plugins.hooks.its.InvalidTransitionException;
-import com.googlesource.gerrit.plugins.hooks.its.ItsFacade;
+import java.io.IOException;
+import java.net.URL;
+import java.util.concurrent.Callable;
 
 public class JiraItsFacade implements ItsFacade {
 
@@ -50,17 +42,15 @@
   private Config gerritConfig;
 
   private JiraClient client;
-  private JiraSession token;
 
   @Inject
   public JiraItsFacade(@PluginName String pluginName,
-      @GerritServerConfig Config cfg) {
+                       @GerritServerConfig Config cfg) {
     this.pluginName = pluginName;
     try {
       this.gerritConfig = cfg;
-      RemoteServerInfo info = client().getServerInfo(token);
-      log.info("Connected to JIRA at " + info.getBaseUrl()
-          + ", reported version is " + info.getVersion());
+      ServerInfo info = client().sysInfo();
+      log.info("Connected to JIRA at {}, reported version is {}", info.getBaseUri(), info.getVersion());
     } catch (Exception ex) {
       log.warn("Jira is currently not available", ex);
     }
@@ -69,14 +59,14 @@
   @Override
   public String healthCheck(final Check check) throws IOException {
 
-      return execute(new Callable<String>(){
-        @Override
-        public String call() throws Exception {
-          if (check.equals(Check.ACCESS))
-            return healthCheckAccess();
-          else
-            return healthCheckSysinfo();
-        }});
+    return execute(new Callable<String>(){
+      @Override
+      public String call() throws Exception {
+        if (check.equals(Check.ACCESS))
+          return healthCheckAccess();
+        else
+          return healthCheckSysinfo();
+      }});
   }
 
   @Override
@@ -85,11 +75,9 @@
     execute(new Callable<String>(){
       @Override
       public String call() throws Exception {
-        log.debug("Adding comment " + comment + " to issue " + issueKey);
-        RemoteComment remoteComment = new RemoteComment();
-        remoteComment.setBody(comment);
-        client().addComment(token, issueKey, remoteComment);
-        log.debug("Added comment " + comment + " to issue " + issueKey);
+        log.debug("Adding comment {} to issue {}", comment, issueKey);
+        client().addComment(issueKey, Comment.valueOf(comment));
+        log.debug("Added comment {} to issue {}", comment, issueKey);
         return issueKey;
       }});
   }
@@ -104,107 +92,51 @@
   public void performAction(final String issueKey, final String actionName)
       throws IOException {
 
-    execute(new Callable<String>(){
+    execute(new Callable<String>() {
       @Override
       public String call() throws Exception {
+        log.debug("Performing action {} on issue {}", actionName, issueKey);
         doPerformAction(issueKey, actionName);
         return issueKey;
       }});
   }
 
   private void doPerformAction(final String issueKey, final String actionName)
-      throws RemoteException, IOException {
-    String actionId = null;
-    RemoteNamedObject[] actions =
-        client().getAvailableActions(token, issueKey);
-    for (RemoteNamedObject action : actions) {
-      if (action.getName().equalsIgnoreCase(actionName)) {
-        actionId = action.getId();
-      }
-    }
-
-    if (actionId != null) {
-      log.debug("Executing action " + actionName + " on issue " + issueKey);
-      client().performAction(token, issueKey, actionId);
+      throws IOException {
+    log.debug("Trying to perform action: " + actionName + " on issue " + issueKey);
+    boolean ret = client().doTransition(issueKey, actionName);
+    if (ret) {
+      log.debug("Action " + actionName + " successful on Issue " + issueKey);
     } else {
-      StringBuilder sb = new StringBuilder();
-      for (RemoteNamedObject action : actions) {
-        if (sb.length() > 0) sb.append(',');
-        sb.append('\'');
-        sb.append(action.getName());
-        sb.append('\'');
-      }
-
-      log.error("Action " + actionName
-          + " not found within available actions: " + sb);
-      throw new InvalidTransitionException("Action " + actionName
-          + " not executable on issue " + issueKey);
+      log.debug("Action {} on Issue {} not possible", actionName, issueKey);
     }
   }
 
-
   @Override
   public boolean exists(final String issueKey) throws IOException {
-    return execute(new Callable<Boolean>(){
+    return execute(new Callable<Boolean>() {
       @Override
       public Boolean call() throws Exception {
-        return client().getIssue(token, issueKey) != null;
+        return client().issueExists(issueKey);
       }});
   }
 
-  public void logout() {
-    this.logout(false);
-  }
-
-  public void logout(boolean quiet) {
-    try {
-      client().logout(token);
-    }
-    catch (Exception ex) {
-      if (!quiet) log.error("I was unable to logout", ex);
-    }
-  }
-
-  public Object login() {
-    return login(false);
-  }
-
-  public Object login(boolean quiet) {
-    try {
-      token = client.login(getUsername(), getPassword());
-      log.info("Connected to " + getUrl() + " as " + token);
-      return token;
-    }
-    catch (Exception ex) {
-      if (!quiet) {
-        log.error("I was unable to login", ex);
-      }
-
-      return null;
-    }
-  }
-
   private JiraClient client() throws IOException {
-
     if (client == null) {
       try {
-        log.debug("Connecting to jira at URL " + getUrl());
-        client = new JiraClient(getUrl());
-        log.debug("Autenthicating as user " + getUsername());
-      } catch (Exception ex) {
-        log.info("Unable to connect to Connected to " + getUrl() + " as "
-            + getUsername());
-        throw new IOException(ex);
+        log.debug("Connecting to jira at {}", getUrl());
+        client = new JiraClient(getUrl(), getUsername(), getPassword());
+        log.debug("Authenticating as User {}", getUsername());
+      } catch (Exception e) {
+        log.info("Unable to connect to " + getUrl() + " as "
+          + getUsername());
+        throw new IOException(e);
       }
-
-      login();
     }
-
     return client;
   }
 
   private <P> P execute(Callable<P> function) throws IOException {
-
     int attempt = 0;
     while(true) {
       try {
@@ -212,11 +144,8 @@
       } catch (Exception ex) {
         if (isRecoverable(ex) && ++attempt < MAX_ATTEMPTS) {
           log.debug("Call failed - retrying, attempt {} of {}", attempt, MAX_ATTEMPTS);
-          logout(true);
-          login(true);
           continue;
         }
-
         if (ex instanceof IOException)
           throw ((IOException)ex);
         else
@@ -224,57 +153,40 @@
       }
     }
   }
-
   private boolean isRecoverable(Exception ex) {
-    if (ex instanceof RemoteAuthenticationException)
-      return true;
-
     String className = ex.getClass().getName();
-    if (ex instanceof AxisFault) {
-      AxisFault af = (AxisFault)ex;
-      className = (af.detail == null ? "unknown" : af.detail.getClass().getName());
-    }
-
     return className.startsWith("java.net");
   }
 
   private String getPassword() {
-    final String pass =
-        gerritConfig.getString(pluginName, null,
-            GERRIT_CONFIG_PASSWORD);
-    return pass;
+    return gerritConfig.getString(pluginName, null,
+      GERRIT_CONFIG_PASSWORD);
   }
 
   private String getUsername() {
-    final String user =
-        gerritConfig.getString(pluginName, null,
-            GERRIT_CONFIG_USERNAME);
-    return user;
+    return gerritConfig.getString(pluginName, null,
+      GERRIT_CONFIG_USERNAME);
   }
 
   private String getUrl() {
-    final String url =
-        gerritConfig.getString(pluginName, null, GERRIT_CONFIG_URL);
-    return url;
+    return gerritConfig.getString(pluginName, null, GERRIT_CONFIG_URL);
   }
 
   @Override
   public String createLinkForWebui(String url, String text) {
-    return "["+text+"|"+url+"]";
+    return "[" + text + "|" + url + "]";
   }
 
-  private String healthCheckAccess() throws RemoteException {
-    JiraClient client = new JiraClient(getUrl());
-    JiraSession token = client.login(getUsername(), getPassword());
-    client.logout(token);
-    final String result = "{\"status\"=\"ok\",\"username\"=\""+getUsername()+"\"}";
+  private String healthCheckAccess() throws IOException {
+    client().sysInfo();
+    final String result = "{\"status\"=\"ok\",\"username\"=\"" + getUsername() + "\"}";
     log.debug("Healtheck on access result: {}", result);
     return result;
   }
 
-  private String healthCheckSysinfo() throws RemoteException, IOException {
-    final RemoteServerInfo res = client().getServerInfo(token);
-    final String result = "{\"status\"=\"ok\",\"system\"=\"Jira\",\"version\"=\""+res.getVersion()+"\",\"url\"=\""+getUrl()+"\",\"build\"=\""+res.getBuildNumber()+"\"}";
+  private String healthCheckSysinfo() throws IOException {
+    ServerInfo info = client().sysInfo();
+    final String result = "{\"status\"=\"ok\",\"system\"=\"Jira\",\"version\"=\""+info.getVersion()+"\",\"url\"=\""+getUrl()+"\",\"build\"=\""+info.getBuildNumber()+"\"}";
     log.debug("Healtheck on sysinfo result: {}", result);
     return result;
   }
