Merge branch 'stable-2.15'

* stable-2.15:
  Upgrade bazlets to latest stable-2.15 to build with 2.15.10 API
  Upgrade bazlets to latest stable-2.15 to build with 2.15.9 API
  Upgrade bazlets to latest stable-2.15 to build with 2.15.8 API
  Upgrade bazlets to latest stable-2.14 to build with 2.14.18 API
  Format Java files with google-java-format
  Bazel: Include eclipse-out directory in .bazelignore
  Add explanatory comment to empty BUILD file(s)
  Add explanatory comment to empty BUILD file(s)
  Migrate (i.e. move) `tools/bazel.rc` to `.bazelrc`
  Upgrade bazlets to latest stable-2.15 to build with 2.15.7 API
  Upgrade bazlets to latest stable-2.14 to build with 2.14.17 API
  Upgrade bazlets to latest stable-2.15 to build with 2.15.6 API
  WORKSPACE: Make commented out local_path line spaces indent consistent
  WORKSPACE: Make commented out local_path line spaces indent consistent
  Upgrade bazlets to latest stable-2.14 to build with 2.14.16 API
  Remove redundant entries from .gitignore
  Align Eclipse compiler settings with core Gerrit's
  bazlets: Replace native.git_repository with skylark rule
  bazlets: Replace native.git_repository with skylark rule
  Format all Bazel build files with buildifier
  Upgrade bazlets to latest stable-2.15 to build with 2.15.5 API
  Remove explicit dependency on commons-dbcp
  Upgrade bazlets to latest stable-2.14 to build with 2.14.15 API
  Update bazlets to latest stable-2.15 to build with 2.15.4 API
  Remove explicit dependency on commons-dbcp
  Format all build files with buildifier
  Update bazlets to latest stable-2.14 to build with released 2.14.14 API
  Migrate (i.e. move) `tools/bazel.rc` to `.bazelrc`
  Format Java files with google-java-format 1.6
  Format BUILD file with buildifier
  Update bazlets to latest revision on stable-2.14
  Fix common-dbcp dependency name for in-tree build
  Remove unused imports
  Add configurable support for in-progress status
  Add config option to control jobs panel position
  Add config option for panels jobs ordering

Change-Id: I67593f3cfbe8cfe014e1f8d8820f317e20522710
diff --git a/.bazelignore b/.bazelignore
new file mode 100644
index 0000000..30f1613
--- /dev/null
+++ b/.bazelignore
@@ -0,0 +1 @@
+eclipse-out
diff --git a/.gitignore b/.gitignore
index 737b856..d09104d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,16 +1,7 @@
-/target
 /.classpath
 /.project
 /.settings
-/.buckconfig.local
-/.buckd
-/buck-cache
-/buck-out
-/local.properties
 *.pyc
-.buckversion
-.watchmanconfig
-/bucklets
 bazel-bin
 bazel-genfiles
 bazel-out
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f63f41a
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,127 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=enabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.processAnnotations=enabled
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/WORKSPACE b/WORKSPACE
index b2ca20d..7d3080f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -4,7 +4,7 @@
 
 load_bazlets(
     commit = "c15e64db2a87c0453427ff45f79d1ed3899b5d92",
-    # local_path = "/home/<user>/projects/bazlets",
+    #local_path = "/home/<user>/projects/bazlets",
 )
 
 # Snapshot Plugin API
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/ConfigInfo.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/ConfigInfo.java
index 5571efa..2d3f1db 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/ConfigInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/ConfigInfo.java
@@ -25,6 +25,16 @@
   final native boolean
       showJobsDropDownPanel() /*-{ return this.show_jobs_drop_down_panel ? true : false; }-*/;
 
+  final native boolean
+      showJobsBelowRelatedInfoBlock() /*-{ return this.show_jobs_below_related_info_block ? true : false; }-*/;
+
+  final native boolean
+      enableInProgressStatus() /*-{ return this.enable_in_progress_status ? true : false; }-*/;
+
+  final native String sortJobsPanel() /*-{ return this.sort_jobs_panel }-*/;
+
+  final native String sortJobsDropDownPanel() /*-{ return this.sort_jobs_drop_down_panel }-*/;
+
   final native void setShowJobsSummaryPanel(boolean s) /*-{ this.show_jobs_summary_panel = s; }-*/;
 
   final native void setShowJobsPanel(boolean s) /*-{ this.show_jobs_panel = s; }-*/;
@@ -32,6 +42,16 @@
   final native void setShowJobsDropDownPanel(
       boolean s) /*-{ this.show_jobs_drop_down_panel = s; }-*/;
 
+  final native void setShowJobsBelowRelatedInfoBlock(
+      boolean s) /*-{ this.show_jobs_below_related_info_block = s; }-*/;
+
+  final native void setEnableInProgressStatus() /*-{ this.enable_in_progress_status = s; }-*/;
+
+  final native void setSortJobsPanel(String s) /*-{ this.sort_jobs_panel = s; }-*/;
+
+  final native void setSortJobsDropDownPanel(
+      String s) /*-{ this.sort_jobs_drop_down_panel = s; }-*/;
+
   static ConfigInfo create() {
     ConfigInfo g = (ConfigInfo) createObject();
     return g;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsDropDownPanel.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsDropDownPanel.java
index 8079306..320ab2c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsDropDownPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsDropDownPanel.java
@@ -34,6 +34,12 @@
 /** Extension for change screen that displays a status in the header bar. */
 public class JobsDropDownPanel extends FlowPanel {
   static class Factory implements Panel.EntryPoint {
+    private final ConfigInfo info;
+
+    public Factory(ConfigInfo info) {
+      this.info = info;
+    }
+
     @Override
     public void onLoad(Panel panel) {
       RevisionInfo rev = panel.getObject(GerritUiExtensionPoint.Key.REVISION_INFO).cast();
@@ -41,11 +47,11 @@
         return;
       }
 
-      panel.setWidget(new JobsDropDownPanel(panel));
+      panel.setWidget(new JobsDropDownPanel(panel, info));
     }
   }
 
-  JobsDropDownPanel(Panel panel) {
+  JobsDropDownPanel(Panel panel, ConfigInfo info) {
     ChangeInfo change = panel.getObject(GerritUiExtensionPoint.Key.CHANGE_INFO).cast();
     String decodedChangeId = URL.decodePathSegment(change.id());
     RevisionInfo rev = panel.getObject(GerritUiExtensionPoint.Key.REVISION_INFO).cast();
@@ -54,7 +60,7 @@
         .view("revisions")
         .id(rev.id())
         .view(Plugin.get().getPluginName(), "verifications")
-        .addParameter("sort", "REPORTER")
+        .addParameter("sort", info.sortJobsDropDownPanel())
         .addParameter("filter", "CURRENT")
         .get(
             new AsyncCallback<NativeMap<VerificationInfo>>() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsPanel.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsPanel.java
index 151f21a..8c237c1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsPanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/JobsPanel.java
@@ -33,7 +33,15 @@
 
 /** Extension for change screen that displays a status below the label info. */
 public class JobsPanel extends FlowPanel {
+  private final ConfigInfo info;
+
   static class Factory implements Panel.EntryPoint {
+    private final ConfigInfo info;
+
+    public Factory(ConfigInfo info) {
+      this.info = info;
+    }
+
     @Override
     public void onLoad(Panel panel) {
       RevisionInfo rev = panel.getObject(GerritUiExtensionPoint.Key.REVISION_INFO).cast();
@@ -41,11 +49,12 @@
         return;
       }
 
-      panel.setWidget(new JobsPanel(panel));
+      panel.setWidget(new JobsPanel(panel, info));
     }
   }
 
-  JobsPanel(Panel panel) {
+  JobsPanel(Panel panel, ConfigInfo info) {
+    this.info = info;
     final ChangeInfo change = panel.getObject(GerritUiExtensionPoint.Key.CHANGE_INFO).cast();
     String decodedChangeId = URL.decodePathSegment(change.id());
     final RevisionInfo rev = panel.getObject(GerritUiExtensionPoint.Key.REVISION_INFO).cast();
@@ -54,7 +63,7 @@
         .view("revisions")
         .id(rev.id())
         .view(Plugin.get().getPluginName(), "verifications")
-        .addParameter("sort", "REPORTER")
+        .addParameter("sort", info.sortJobsPanel())
         .addParameter("filter", "CURRENT")
         .get(
             new AsyncCallback<NativeMap<VerificationInfo>>() {
@@ -81,7 +90,11 @@
       HorizontalPanel p = new HorizontalPanel();
       short vote = jobs.get(key).value();
       if (vote > 0) {
-        p.add(new Image(VerifyStatusPlugin.RESOURCES.greenCheck()));
+        p.add(
+            new Image(
+                ((vote == 2) && info.enableInProgressStatus())
+                    ? VerifyStatusPlugin.RESOURCES.progress()
+                    : VerifyStatusPlugin.RESOURCES.greenCheck()));
       } else if (vote < 0) {
         p.add(new Image(VerifyStatusPlugin.RESOURCES.redNot()));
       } else if (vote == 0) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/Resources.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/Resources.java
index f71659c..eff41cd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/Resources.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/Resources.java
@@ -36,4 +36,7 @@
 
   @Source("donut.png")
   public ImageResource rerun();
+
+  @Source("loader.gif")
+  public ImageResource progress();
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/VerifyStatusPlugin.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/VerifyStatusPlugin.java
index 58c22f1..34de386 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/VerifyStatusPlugin.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/VerifyStatusPlugin.java
@@ -44,15 +44,17 @@
                 if (info.showJobsPanel()) {
                   Plugin.get()
                       .panel(
-                          GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK,
-                          new JobsPanel.Factory(),
+                          info.showJobsBelowRelatedInfoBlock()
+                              ? GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_RELATED_INFO_BLOCK
+                              : GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK,
+                          new JobsPanel.Factory(info),
                           "VerifyStatusJobsPanel");
                 }
                 if (info.showJobsDropDownPanel()) {
                   Plugin.get()
                       .panel(
                           GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_POP_DOWNS,
-                          new JobsDropDownPanel.Factory(),
+                          new JobsDropDownPanel.Factory(info),
                           "VerifyStatusJobsDropDownPanel");
                 }
               }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/loader.gif b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/loader.gif
new file mode 100644
index 0000000..e40f19a
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/client/loader.gif
Binary files differ
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/public/verify-status.css b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/public/verify-status.css
index caf61ac..c8915d3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/public/verify-status.css
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/public/verify-status.css
@@ -2,3 +2,6 @@
   border-spacing: 0px 5px;
 }
 
+div.gwt-TabPanelBottom div {
+  height: 100% !important;
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetConfig.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetConfig.java
index 36ed04f..3ba9176 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetConfig.java
@@ -36,6 +36,11 @@
     info.showJobsPanel = cfg.getBoolean("showJobsPanel", true);
     info.showJobsDropDownPanel = cfg.getBoolean("showJobsDropDownPanel", true);
     info.showJobsSummaryPanel = cfg.getBoolean("showJobsSummaryPanel", true);
+    info.showJobsBelowRelatedInfoBlock = cfg.getBoolean("showJobsBelowRelatedInfoBlock", false);
+    info.enableInProgressStatus = cfg.getBoolean("enableInProgressStatus", false);
+    info.sortJobsPanel = cfg.getEnum(JobsSorting.values(), "sortJobsPanel", JobsSorting.REPORTER);
+    info.sortJobsDropDownPanel =
+        cfg.getEnum(JobsSorting.values(), "sortJobsDropDownPanel", JobsSorting.REPORTER);
     return info;
   }
 
@@ -43,5 +48,9 @@
     Boolean showJobsPanel;
     Boolean showJobsDropDownPanel;
     Boolean showJobsSummaryPanel;
+    Boolean showJobsBelowRelatedInfoBlock;
+    Boolean enableInProgressStatus;
+    JobsSorting sortJobsPanel;
+    JobsSorting sortJobsDropDownPanel;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetVerifications.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetVerifications.java
index b50606b..74ee698 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetVerifications.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/GetVerifications.java
@@ -16,6 +16,7 @@
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.gerrit.common.Nullable;
 import com.google.gerrit.extensions.restapi.RestReadView;
 import com.google.gerrit.server.change.RevisionResource;
 import com.google.gwtorm.server.OrmException;
@@ -39,17 +40,14 @@
     this.schemaFactory = schemaFactory;
   }
 
-  private String sort;
-  private String filter;
-
   @Option(
       name = "--sort",
       aliases = {"-s"},
       metaVar = "SORT",
       usage = "Sort the list by an entry")
-  public void setSort(String sort) {
-    this.sort = sort.toUpperCase();
-  }
+  private JobsSorting sort;
+
+  private String filter;
 
   @Option(
       name = "--filter",
@@ -75,44 +73,53 @@
     return info;
   }
 
-  private void sortJobs(List<PatchSetVerification> jobs, String order) {
-    if (order.equals("REPORTER")) {
-      // sort the jobs list by reporter(A-Z)/Name(A-Z)/Granted(Z-A)
-      Collections.sort(
-          jobs,
-          new Comparator<PatchSetVerification>() {
-            @Override
-            public int compare(PatchSetVerification a, PatchSetVerification b) {
-              return new CompareToBuilder()
-                  .append(a.getReporter(), b.getReporter())
-                  .append(a.getName(), b.getName())
-                  .append(b.getGranted(), a.getGranted())
-                  .toComparison();
-            }
-          });
-    } else if (order.equals("NAME")) {
-      // sort the jobs list by Name(A-Z)/Granted(Z-A)
-      Collections.sort(
-          jobs,
-          new Comparator<PatchSetVerification>() {
-            @Override
-            public int compare(PatchSetVerification a, PatchSetVerification b) {
-              return new CompareToBuilder()
-                  .append(a.getName(), b.getName())
-                  .append(b.getGranted(), a.getGranted())
-                  .toComparison();
-            }
-          });
-    } else if (order.equals("DATE")) {
-      // sort the jobs list by Granted(Z-A)
-      Collections.sort(
-          jobs,
-          new Comparator<PatchSetVerification>() {
-            @Override
-            public int compare(PatchSetVerification a, PatchSetVerification b) {
-              return new CompareToBuilder().append(b.getGranted(), a.getGranted()).toComparison();
-            }
-          });
+  private void sortJobs(List<PatchSetVerification> jobs, @Nullable JobsSorting order) {
+    if (order == null) {
+      return;
+    }
+    switch (order) {
+      case REPORTER:
+        // sort the jobs list by reporter(A-Z)/Name(A-Z)/Granted(Z-A)
+        Collections.sort(
+            jobs,
+            new Comparator<PatchSetVerification>() {
+              @Override
+              public int compare(PatchSetVerification a, PatchSetVerification b) {
+                return new CompareToBuilder()
+                    .append(a.getReporter(), b.getReporter())
+                    .append(a.getName(), b.getName())
+                    .append(b.getGranted(), a.getGranted())
+                    .toComparison();
+              }
+            });
+        break;
+      case NAME:
+        // sort the jobs list by Name(A-Z)/Granted(Z-A)
+        Collections.sort(
+            jobs,
+            new Comparator<PatchSetVerification>() {
+              @Override
+              public int compare(PatchSetVerification a, PatchSetVerification b) {
+                return new CompareToBuilder()
+                    .append(a.getName(), b.getName())
+                    .append(b.getGranted(), a.getGranted())
+                    .toComparison();
+              }
+            });
+        break;
+      case DATE:
+        // sort the jobs list by Granted(Z-A)
+        Collections.sort(
+            jobs,
+            new Comparator<PatchSetVerification>() {
+              @Override
+              public int compare(PatchSetVerification a, PatchSetVerification b) {
+                return new CompareToBuilder().append(b.getGranted(), a.getGranted()).toComparison();
+              }
+            });
+        break;
+      default:
+        break;
     }
   }
 
@@ -131,7 +138,7 @@
       if (filter != null && !filter.isEmpty()) {
         if (filter.equals("CURRENT")) {
           // logic to get current jobs assumes list is sorted by reporter
-          sortJobs(result, "REPORTER");
+          sortJobs(result, JobsSorting.REPORTER);
           isSorted = true;
           String prevReporter = "";
           String prevName = "";
@@ -164,14 +171,8 @@
       }
 
       // sort jobs
-      if (sort != null && !sort.isEmpty()) {
-        if (sort.equals("REPORTER") && !isSorted) {
-          sortJobs(jobs, "REPORTER");
-        } else if (sort.equals("NAME")) {
-          sortJobs(jobs, "NAME");
-        } else if (sort.equals("DATE")) {
-          sortJobs(jobs, "DATE");
-        }
+      if ((sort != JobsSorting.REPORTER) || !isSorted) {
+        sortJobs(jobs, sort);
       }
 
       for (PatchSetVerification v : jobs) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/JobsSorting.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/JobsSorting.java
new file mode 100644
index 0000000..cb4b7dc
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/JobsSorting.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.verifystatus.server;
+
+public enum JobsSorting {
+  DATE,
+  REPORTER,
+  NAME
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/PutConfig.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/PutConfig.java
index 8fbaa7b..a9de8b0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/PutConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/server/PutConfig.java
@@ -37,6 +37,10 @@
     public Boolean showJobsPanel;
     public Boolean showJobsDropDownPanel;
     public Boolean showJobsSummaryPanel;
+    public Boolean showJobsBelowRelatedInfoBlock;
+    public Boolean enableInProgressStatus;
+    public String sortJobsPanel;
+    public String sortJobsDropDownPanel;
   }
 
   private final PluginConfigFactory cfgFactory;
@@ -74,6 +78,34 @@
     } else {
       cfg.unset("plugin", pluginName, "showJobsSummaryPanel");
     }
+    if (input.showJobsBelowRelatedInfoBlock != null) {
+      cfg.setBoolean(
+          "plugin",
+          pluginName,
+          "showJobsBelowRelatedInfoBlock",
+          input.showJobsBelowRelatedInfoBlock);
+    } else {
+      cfg.unset("plugin", pluginName, "showJobsBelowRelatedInfoBlock");
+    }
+    if (input.enableInProgressStatus != null) {
+      cfg.setBoolean("plugin", pluginName, "enableInProgressStatus", input.enableInProgressStatus);
+    } else {
+      cfg.unset("plugin", pluginName, "enableInProgressStatus");
+    }
+    if (input.sortJobsPanel != null) {
+      cfg.setEnum("plugin", pluginName, "sortJobsPanel", JobsSorting.valueOf(input.sortJobsPanel));
+    } else {
+      cfg.unset("plugin", pluginName, "sortJobsPanel");
+    }
+    if (input.sortJobsDropDownPanel != null) {
+      cfg.setEnum(
+          "plugin",
+          pluginName,
+          "sortJobsDropDownPanel",
+          JobsSorting.valueOf(input.sortJobsDropDownPanel));
+    } else {
+      cfg.unset("plugin", pluginName, "sortJobsDropDownPanel");
+    }
 
     cfg.save();
     cfgFactory.getFromGerritConfig(pluginName, true);
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index f80a646..d037730 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -72,13 +72,25 @@
 |:------------- |:-------|
 |less than 0    |Failed  |
 |0              |Unstable|
-|greater than 0 |Passed  |
+|1              |Passed  |
+|2              |In-progress if enableInProgressStatus=true, otherwise Passed|
+|greater than 2 |Passed  |
 
 
 The information icon is an indicator that a job has abstained from voting
 (or is a non-voting job).  Abstaining typically indicates that a job's
 score may not factor into determining the combined vote.
 
+If enableInProgressStatus is true then the loading icon is an indicator that a job
+has been set with value 2 and identified as 'in progress'.
+_NOTE_: The Jenkins [Gerrit verify status reporter plugin] currently doesn't
+support in-progress or any equivalent status so enabling progress status makes
+sense only if one uses own postbuild/prebuild custom pipeline logic for setting
+statuses via API. For instance:
+1. In-progress status with value=2 is sent via API as the first step of the build.
+2. From postbuild section actual finish status is calculated in groovy script and
+is send via API.
+
 
 ### <a id="configure-panels"> @PLUGIN@ configure-panels
 
@@ -91,11 +103,15 @@
 
 #### Parameters
 
-|Field Name             |Description|
-|:----------------------|:----------|
-|showJobsPanel          | Whether jobs panel should be displayed (default to true)|
-|showJobsDropDownPanel  | Whether jobs drop down panel should be displayed (default to true)|
-|showJobsSummaryPanel   | Whether jobs summary panel should be displayed (default to true)|
+|Field Name                    |Description|
+|:-----------------------------|:----------|
+|showJobsPanel                 | Whether jobs panel should be displayed (default to true)|
+|showJobsDropDownPanel         | Whether jobs drop down panel should be displayed (default to true)|
+|showJobsSummaryPanel          | Whether jobs summary panel should be displayed (default to true)|
+|showJobsBelowRelatedInfoBlock | Whether jobs panel should be positioned below related info block (default to false)|
+|enableInProgressStatus        | Whether value=2 should be treated as 'in progress' status (default to false)|
+|sortJobsPanel                 | The order of jobs sorting on jobs panel (REPORTER,NAME,DATE default to REPORTER). Both upper and lower cases are allowed.|
+|sortJobsDropDownPanel         | The order of jobs sorting on jobs drop down panel (REPORTER,NAME,DATE default to REPORTER). Both upper and lower cases are allowed.|
 
 
 #### Example
diff --git a/src/main/resources/Documentation/rest-api-config.md b/src/main/resources/Documentation/rest-api-config.md
index c4936a5..de16a62 100644
--- a/src/main/resources/Documentation/rest-api-config.md
+++ b/src/main/resources/Documentation/rest-api-config.md
@@ -67,11 +67,15 @@
 The `ConfigInfo` entity contains the configuration of the @PLUGIN@
 plugin.
 
-|Field Name               |Description|
-|:------------------------|:----------|
-|show_jobs_panel          | Whether jobs panel should be displayed|
-|show_jobs_drop_down_panel| Whether jobs drop down panel should be displayed|
-|show_jobs_summary_panel  | Whether jobs summary panel should be displayed|
+|Field Name                         |Description|
+|:----------------------------------|:----------|
+|show_jobs_panel                    | Whether jobs panel should be displayed|
+|show_jobs_drop_down_panel          | Whether jobs drop down panel should be displayed|
+|show_jobs_summary_panel            | Whether jobs summary panel should be displayed|
+|show_jobs_below_related_info_block | Whether jobs panel should be positioned below related info block|
+|enable_in_progress_status          | Whether value=2 should be treated as 'in progress' status|
+|sort_jobs_panel                    | The order of jobs sorting on jobs panel (REPORTER,NAME,DATE)|
+|sort_jobs_drop_down_panel          | The order of jobs sorting on jobs drop down panel (REPORTER,NAME,DATE)|
 
 
 SEE ALSO
diff --git a/tools/bzl/BUILD b/tools/bzl/BUILD
index e69de29..c5ed0b7 100644
--- a/tools/bzl/BUILD
+++ b/tools/bzl/BUILD
@@ -0,0 +1 @@
+# Empty file required by Bazel