diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java
index 77d2b1b..59cb1bd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/InitJira.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.its.jira;
 
+import com.google.common.base.Strings;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.pgm.init.api.AllProjectsConfig;
 import com.google.gerrit.pgm.init.api.AllProjectsNameOnInitProvider;
@@ -24,6 +25,8 @@
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.its.base.its.InitIts;
 import com.googlesource.gerrit.plugins.its.base.validation.ItsAssociationPolicy;
+import com.googlesource.gerrit.plugins.its.jira.restapi.JiraServerInfo;
+import com.googlesource.gerrit.plugins.its.jira.restapi.JiraServerInfoRestApi;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -126,8 +129,13 @@
   private boolean isJiraConnectSuccessful() {
     ui.message("Checking Jira connectivity ... ");
     try {
-      new JiraClient(jiraUrl, jiraUsername, jiraPassword).sysInfo().getVersion();
-      ui.message("[OK]\n");
+      JiraServerInfo serverInfo =
+          new JiraServerInfoRestApi(jiraUrl, jiraUsername, jiraPassword).get();
+      if (Strings.isNullOrEmpty(serverInfo.getVersion())) {
+        ui.message("*ERROR* Jira returned an empty version number");
+        return false;
+      }
+      ui.message("[OK] - Jira Ver {}\n", serverInfo.getVersion());
       return true;
     } catch (IOException e) {
       ui.message("*FAILED* (%s)\n", e.toString());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java
index 7311a9b..4a77ca3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/JiraClient.java
@@ -31,7 +31,6 @@
 import com.googlesource.gerrit.plugins.its.jira.restapi.JiraServerInfo;
 import com.googlesource.gerrit.plugins.its.jira.restapi.JiraTransition;
 import java.io.IOException;
-import java.net.URL;
 import java.util.Arrays;
 import java.util.List;
 import org.slf4j.Logger;
@@ -44,19 +43,8 @@
   private final Gson gson;
 
   @Inject
-  public JiraClient(JiraConfig jiraConfig) {
-    this(jiraConfig.getJiraUrl(), jiraConfig.getUsername(), jiraConfig.getPassword());
-  }
-
-  /**
-   * This constructor is kept to allow testing connectivity from the init class
-   *
-   * @param url jira url
-   * @param user username of the jira user
-   * @param pass password of the jira user
-   */
-  JiraClient(URL url, String user, String pass) {
-    this.apiBuilder = new JiraRestApiProvider(url, user, pass);
+  public JiraClient(JiraRestApiProvider apiBuilder) {
+    this.apiBuilder = apiBuilder;
     this.gson = new Gson();
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
index 35f70ce..450ac47 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
@@ -17,6 +17,7 @@
 import static com.googlesource.gerrit.plugins.its.jira.UrlHelper.*;
 
 import com.google.gson.Gson;
+import com.google.inject.Inject;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
@@ -30,7 +31,9 @@
 
 /** Jira Rest Client. */
 public class JiraRestApi<T> {
+
   private static final String BASE_PREFIX = "rest/api/2";
+
   private final URL baseUrl;
   private final String auth;
   private final Gson gson;
@@ -45,14 +48,21 @@
    * @param url jira url
    * @param user username of the jira user
    * @param pass password of the jira user
+   * @param classOfT class type of the object requested
+   * @param classPrefix prefix for the rest api request
    */
-  JiraRestApi(URL url, String user, String pass, Class<T> classOfT, String classPrefix) {
-    this.auth = Base64.getEncoder().encodeToString((user + ":" + pass).getBytes());
+  @Inject
+  public JiraRestApi(URL url, String user, String pass, Class<T> classOfT, String classPrefix) {
+    this.auth = encode(user, pass);
     this.baseUrl = resolveUrl(url, BASE_PREFIX, classPrefix, "/");
     this.gson = new Gson();
     this.classOfT = classOfT;
   }
 
+  private static String encode(String user, String pass) {
+    return Base64.getEncoder().encodeToString((user + ":" + pass).getBytes());
+  }
+
   public int getResponseCode() {
     return responseCode;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
index 37534a5..d09441a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
@@ -14,21 +14,24 @@
 
 package com.googlesource.gerrit.plugins.its.jira.restapi;
 
-import java.net.URL;
+import com.google.inject.Inject;
+import com.googlesource.gerrit.plugins.its.jira.JiraConfig;
 
 public class JiraRestApiProvider {
-  private final URL url;
-  private final String user;
-  private final String pass;
+  private JiraConfig jiraConfig;
 
-  public JiraRestApiProvider(URL url, String user, String pass) {
-    this.url = url;
-    this.user = user;
-    this.pass = pass;
+  @Inject
+  public JiraRestApiProvider(JiraConfig jiraConfig) {
+    this.jiraConfig = jiraConfig;
   }
 
   public <T> JiraRestApi<T> get(Class<T> classOfT, String classPrefix) {
-    return new JiraRestApi<>(url, user, pass, classOfT, classPrefix);
+    return new JiraRestApi<>(
+        jiraConfig.getJiraUrl(),
+        jiraConfig.getUsername(),
+        jiraConfig.getPassword(),
+        classOfT,
+        classPrefix);
   }
 
   public JiraRestApi<JiraIssue> getIssue() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraServerInfoRestApi.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraServerInfoRestApi.java
new file mode 100644
index 0000000..10a4c91
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraServerInfoRestApi.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// 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.
+
+package com.googlesource.gerrit.plugins.its.jira.restapi;
+
+import static java.net.HttpURLConnection.HTTP_OK;
+
+import java.io.IOException;
+import java.net.URL;
+
+public class JiraServerInfoRestApi extends JiraRestApi<JiraServerInfo> {
+
+  public JiraServerInfoRestApi(URL url, String user, String pass) {
+    super(url, user, pass, JiraServerInfo.class, "/serverInfo/");
+  }
+
+  public JiraServerInfo get() throws IOException {
+    return doGet("", HTTP_OK);
+  }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
index b87b591..073a03c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
@@ -16,38 +16,48 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.base.CharMatcher;
+import java.net.MalformedURLException;
 import java.net.URL;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
 
+@RunWith(MockitoJUnitRunner.class)
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class JiraRestApiTest {
+  private static final String ISSUE_CLASS_PREFIX = "/issue/";
+
+  private URL url;
+  private String user = "user";
+  private String password = "pass";
+  private JiraRestApi restApi;
+
+  private void setURL(String jiraUrl) throws MalformedURLException {
+    url = new URL(CharMatcher.is('/').trimFrom(jiraUrl) + "/");
+  }
 
   @Test
   public void testJiraServerInfoForNonRootJiraUrl() throws Exception {
-    URL nonRootJiraUrl = new URL("http://jira.mycompany.com/myroot/");
-    JiraRestApi<JiraServerInfo> serverInfo =
-        new JiraRestApiProvider(nonRootJiraUrl, "", "").getServerInfo();
-
-    String jiraApiUrl = serverInfo.getBaseUrl().toString();
-    assertThat(jiraApiUrl).startsWith(nonRootJiraUrl.toString());
+    setURL("http://jira.mycompany.com/myroot/");
+    restApi = new JiraRestApi(url, user, password, JiraIssue.class, ISSUE_CLASS_PREFIX);
+    String jiraApiUrl = restApi.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(url.toString());
   }
 
   @Test
   public void testJiraServerInfoForNonRootJiraUrlNotEndingWithSlash() throws Exception {
-    URL nonRootJiraUrl = new URL("http://jira.mycompany.com/myroot/");
-    JiraRestApi<JiraServerInfo> serverInfo =
-        new JiraRestApiProvider(nonRootJiraUrl, "", "").getServerInfo();
-
-    String jiraApiUrl = serverInfo.getBaseUrl().toString();
-    assertThat(jiraApiUrl).startsWith(nonRootJiraUrl.toString());
+    setURL("http://jira.mycompany.com/myroot");
+    restApi = new JiraRestApi(url, user, password, JiraIssue.class, ISSUE_CLASS_PREFIX);
+    String jiraApiUrl = restApi.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(url.toString());
   }
 
   @Test
   public void testJiraServerInfoForRootJiraUrl() throws Exception {
-    URL rootJiraUrl = new URL("http://jira.mycompany.com");
-    JiraRestApi<JiraServerInfo> serverInfo =
-        new JiraRestApiProvider(rootJiraUrl, "", "").getServerInfo();
-
-    String jiraApiUrl = serverInfo.getBaseUrl().toString();
-    assertThat(jiraApiUrl).startsWith(rootJiraUrl.toString());
+    setURL("http://jira.mycompany.com");
+    restApi = new JiraRestApi(url, user, password, JiraIssue.class, ISSUE_CLASS_PREFIX);
+    String jiraApiUrl = restApi.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(url.toString());
   }
 }
