diff --git a/pom.xml b/pom.xml
index d554b913ed4..0e3589909a9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -208,5 +208,6 @@
shield
watcher
marvel
+ qa
diff --git a/qa/pom.xml b/qa/pom.xml
new file mode 100644
index 00000000000..40053a6cd0f
--- /dev/null
+++ b/qa/pom.xml
@@ -0,0 +1,321 @@
+
+
+
+ 4.0.0
+
+ org.elasticsearch.plugin.qa
+ x-plugins-qa
+ 2.0.0-beta1-SNAPSHOT
+ pom
+ QA: Parent POM
+ 2015
+
+
+ org.elasticsearch
+ elasticsearch-parent
+ 2.0.0-beta1-SNAPSHOT
+
+
+
+
+
+
+
+
+
+ org.hamcrest
+ hamcrest-all
+ test
+
+
+ org.apache.lucene
+ lucene-test-framework
+ test
+
+
+ org.elasticsearch
+ elasticsearch
+ test-jar
+ test
+
+
+
+
+ org.elasticsearch
+ elasticsearch
+ provided
+
+
+ org.apache.lucene
+ lucene-core
+ provided
+
+
+ org.apache.lucene
+ lucene-backward-codecs
+ provided
+
+
+ org.apache.lucene
+ lucene-analyzers-common
+ provided
+
+
+ org.apache.lucene
+ lucene-queries
+ provided
+
+
+ org.apache.lucene
+ lucene-memory
+ provided
+
+
+ org.apache.lucene
+ lucene-highlighter
+ provided
+
+
+ org.apache.lucene
+ lucene-queryparser
+ provided
+
+
+ org.apache.lucene
+ lucene-suggest
+ provided
+
+
+ org.apache.lucene
+ lucene-join
+ provided
+
+
+ org.apache.lucene
+ lucene-spatial
+ provided
+
+
+ org.apache.lucene
+ lucene-expressions
+ provided
+
+
+ com.spatial4j
+ spatial4j
+ provided
+
+
+ com.vividsolutions
+ jts
+ provided
+
+
+ com.github.spullara.mustache.java
+ compiler
+ provided
+
+
+ com.google.guava
+ guava
+ provided
+
+
+ com.carrotsearch
+ hppc
+ provided
+
+
+ joda-time
+ joda-time
+ provided
+
+
+ org.joda
+ joda-convert
+ provided
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ provided
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-smile
+ provided
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+ provided
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-cbor
+ provided
+
+
+ io.netty
+ netty
+ provided
+
+
+ com.ning
+ compress-lzf
+ provided
+
+
+ com.tdunning
+ t-digest
+ provided
+
+
+ org.apache.commons
+ commons-lang3
+ provided
+
+
+ commons-cli
+ commons-cli
+ provided
+
+
+ org.codehaus.groovy
+ groovy-all
+ indy
+ provided
+
+
+ log4j
+ log4j
+ provided
+
+
+ log4j
+ apache-log4j-extras
+ provided
+
+
+ org.slf4j
+ slf4j-api
+ provided
+
+
+ net.java.dev.jna
+ jna
+ provided
+
+
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ test
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+ **/*.properties
+
+
+
+
+
+
+ src/test/java
+
+ **/*.json
+ **/*.txt
+
+
+
+ src/test/resources
+
+ elasticsearch.yml
+ **/*.properties
+
+
+
+ src/test/resources
+ true
+
+ elasticsearch.yml
+ **/*.properties
+
+
+
+
+ ${project.basedir}/rest-api-spec
+ true
+ rest-api-spec
+
+ api/*.json
+ test/**/*.yaml
+
+
+
+
+ ${elasticsearch.tools.directory}/rest-api-spec
+ rest-api-spec
+
+
+ api/info.json
+ api/cluster.health.json
+ api/cluster.state.json
+
+ api/index.json
+ api/get.json
+ api/update.json
+ api/search.json
+ api/indices.analyze.json
+ api/indices.create.json
+ api/indices.refresh.json
+ api/nodes.info.json
+ api/count.json
+
+
+
+
+ ${elasticsearch.tools.directory}/shared-test-resources
+ false
+
+
+
+
+
+
+ com.carrotsearch.randomizedtesting
+ junit4-maven-plugin
+
+
+ integ-tests
+
+
+ 1
+
+
+ 127.0.0.1:${integ.transport.port}
+
+
+
+
+
+
+
+
+
+
+ smoke-test-plugins
+
+
diff --git a/qa/smoke-test-plugins/integration-tests.xml b/qa/smoke-test-plugins/integration-tests.xml
new file mode 100644
index 00000000000..1c1e468b4ac
--- /dev/null
+++ b/qa/smoke-test-plugins/integration-tests.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/qa/smoke-test-plugins/pom.xml b/qa/smoke-test-plugins/pom.xml
new file mode 100644
index 00000000000..88ac234b1c7
--- /dev/null
+++ b/qa/smoke-test-plugins/pom.xml
@@ -0,0 +1,264 @@
+
+
+
+ 4.0.0
+
+
+ org.elasticsearch.plugin.qa
+ x-plugins-qa
+ 2.0.0-beta1-SNAPSHOT
+
+
+
+
+ smoke-test-x-plugins
+ QA: Smoke Test X-Plugins
+ Loads up all of our commercial and open-source plugins
+
+
+ true
+ ${project.basedir}/integration-tests.xml
+ smoke_test_plugins
+ false
+
+ elasticsearch-watcher,elasticsearch-marvel,elasticsearch-license
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ integ-setup-dependencies
+ pre-integration-test
+
+ copy
+
+
+ ${skip.integ.tests}
+ true
+ ${integ.deps}/plugins
+
+
+
+
+ org.elasticsearch.distribution.zip
+ elasticsearch
+ ${elasticsearch.version}
+ zip
+ true
+ ${integ.deps}
+
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-license
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-watcher
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-marvel
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-analysis-kuromoji
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-analysis-smartcn
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-analysis-stempel
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-analysis-phonetic
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-analysis-icu
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-cloud-gce
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-cloud-azure
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-cloud-aws
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-delete-by-query
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-lang-python
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-lang-javascript
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-mapper-size
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+ org.elasticsearch.plugin
+ elasticsearch-site-example
+ ${elasticsearch.version}
+ zip
+ true
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+
+ integ-setup
+ pre-integration-test
+
+ run
+
+
+
+
+
+
+
+
+
+ ${skip.integ.tests}
+
+
+
+
+ integ-teardown
+ post-integration-test
+
+ run
+
+
+
+
+
+ ${skip.integ.tests}
+
+
+
+
+
+ ant-contrib
+ ant-contrib
+ 1.0b3
+
+
+ ant
+ ant
+
+
+
+
+ org.apache.ant
+ ant-nodeps
+ 1.8.1
+
+
+
+
+
+
+
diff --git a/qa/smoke-test-plugins/rest-api-spec/test/smoke_test_plugins/10_basic.yaml b/qa/smoke-test-plugins/rest-api-spec/test/smoke_test_plugins/10_basic.yaml
new file mode 100644
index 00000000000..abd4ae73945
--- /dev/null
+++ b/qa/smoke-test-plugins/rest-api-spec/test/smoke_test_plugins/10_basic.yaml
@@ -0,0 +1,17 @@
+# Integration tests for smoke testing plugins
+#
+"Plugins are actually installed":
+ - do:
+ cluster.state: {}
+
+ # Get master node id
+ - set: { master_node: master }
+
+ - do:
+ nodes.info: {}
+
+ - match: { nodes.$master.plugins.11.name: license }
+ - match: { nodes.$master.plugins.13.name: marvel }
+# Add shield when we figure out how to rest test it
+# - match: { nodes.$master.plugins.13.name: shield }
+ - match: { nodes.$master.plugins.15.name: watcher }
diff --git a/qa/smoke-test-plugins/src/test/java/org/elasticsearch/smoketest/SmokeTestPluginsIT.java b/qa/smoke-test-plugins/src/test/java/org/elasticsearch/smoketest/SmokeTestPluginsIT.java
new file mode 100644
index 00000000000..23d3fbcb09c
--- /dev/null
+++ b/qa/smoke-test-plugins/src/test/java/org/elasticsearch/smoketest/SmokeTestPluginsIT.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+package org.elasticsearch.smoketest;
+
+import com.carrotsearch.randomizedtesting.annotations.Name;
+import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
+import org.elasticsearch.test.rest.ESRestTestCase;
+import org.elasticsearch.test.rest.RestTestCandidate;
+import org.elasticsearch.test.rest.parser.RestTestParseException;
+
+import java.io.IOException;
+
+public class SmokeTestPluginsIT extends ESRestTestCase {
+
+ public SmokeTestPluginsIT(@Name("yaml") RestTestCandidate testCandidate) {
+ super(testCandidate);
+ }
+
+ @ParametersFactory
+ public static Iterable