diff --git a/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java b/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java
new file mode 100644
index 000000000..da27484f7
--- /dev/null
+++ b/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2017 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.rest.search;
+
+import org.alfresco.rest.RestTest;
+import org.alfresco.rest.model.builder.NodesBuilder;
+import org.alfresco.utility.model.ContentModel;
+import org.alfresco.utility.model.FileModel;
+import org.alfresco.utility.model.FileType;
+import org.alfresco.utility.model.FolderModel;
+import org.alfresco.utility.model.SiteModel;
+import org.alfresco.utility.model.UserModel;
+import org.testng.annotations.BeforeClass;
+
+/**
+ * Abstract Search test class that contains useful methods
+ * such as:
+ *
+ *
Preparing the data to index.
+ *
Preparing search requests.
+ * @author Michael Suzuki
+ *
+ */
+public class AbstractSearchTest extends RestTest
+{
+ protected static final String SEARCH_DATA_SAMPLE_FOLDER = "folder";
+ UserModel userModel, adminUserModel;
+ SiteModel siteModel;
+ UserModel searchedUser;
+ NodesBuilder nodesBuilder;
+ protected FileModel file,file2;
+
+ @BeforeClass(alwaysRun = true)
+ public void dataPreparation() throws Exception
+ {
+ adminUserModel = dataUser.getAdminUser();
+ userModel = dataUser.createRandomTestUser();
+ siteModel = dataSite.usingUser(userModel).createPublicRandomSite();
+ /*
+ * Create the following file structure for preconditions :
+ * |- folder
+ * |-- pangram.txt
+ * |-- cars.pdf
+ */
+ nodesBuilder = restClient.authenticateUser(userModel).withCoreAPI().usingNode(ContentModel.my()).defineNodes();
+ FolderModel folder = new FolderModel(SEARCH_DATA_SAMPLE_FOLDER);
+ dataContent.usingSite(siteModel).createFolder(folder);
+ //Create files
+ file = new FileModel("pangram.txt", FileType.TEXT_PLAIN, "The quick brown fox jumps over the lazy dog");
+ file2 = new FileModel("cars.txt", FileType.TEXT_PLAIN, "The landrover discovery is not a sports car");
+ ContentModel cm = new ContentModel();
+ cm.setCmisLocation(folder.getCmisLocation());
+ cm.setName(folder.getName());
+ dataContent.usingSite(siteModel).usingResource(cm).createContent(file);
+ dataContent.usingSite(siteModel).usingResource(cm).createContent(file2);
+ }
+ /**
+ * Helper method which create an http post request to Search API end point.
+ * @param term String search term
+ * @return {@link SearchResponse} response.
+ * @throws Exception if error
+ *
+ */
+ protected SearchResponse query(String term) throws Exception
+ {
+ RestRequestQueryModel queryReq = new RestRequestQueryModel();
+ queryReq.setLanguage("afts");
+ queryReq.setQuery(term);
+ SearchRequest query = new SearchRequest(queryReq);
+ return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query);
+ }
+ /**
+ * Helper method which create an http post request to Search API end point.
+ * @param term String search term
+ * @return {@link SearchResponse} response.
+ * @throws Exception if error
+ *
+ */
+ protected SearchResponse query(RestRequestQueryModel queryReq,RestRequestHighlightModel highlight) throws Exception
+ {
+ SearchRequest query = new SearchRequest(queryReq);
+ query.setHighlight(highlight);
+ return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query);
+ }
+ /**
+ * Helper method which create an http post request to Search API end point.
+ * @param term String search term
+ * @return {@link SearchResponse} response.
+ * @throws Exception if error
+ *
+ */
+ protected SearchResponse query(SearchRequest query) throws Exception
+ {
+ return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query);
+ }
+}
diff --git a/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java b/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java
new file mode 100644
index 000000000..ae79f4620
--- /dev/null
+++ b/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2017 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.rest.search;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.alfresco.rest.model.RestRequestFacetFieldsModel;
+import org.alfresco.utility.model.TestGroup;
+import org.testng.annotations.Test;
+
+/**
+ * Faceted search test.
+ * @author Michael Suzuki
+ *
+ */
+public class FacetedSearchTest extends AbstractSearchTest
+{
+
+ @Test(groups={TestGroup.SEARCH, TestGroup.REST_API})
+ /**
+ * Perform the below facet query.
+ * {
+ * "query": {
+ * "query": "cars",
+ * "language": "afts"
+ * },
+ * "facetQueries": [
+ * {"query": "content.size:[o TO 102400]", "label": "small"},
+ * {"query": "content.size:[102400 TO 1048576]", "label": "medium"},
+ * {"query": "content.size:[1048576 TO 16777216]", "label": "large"}
+ * ],
+ * "facetFields": {"facets": [{"field": "'content.size'"}]}
+ * }
+ *
+ * Expected response
+ * {"list": {
+ * "entries": [... All the results],
+ * "pagination": {
+ * "maxItems": 100,
+ * "hasMoreItems": false,
+ * "totalItems": 61,
+ * "count": 61,
+ * "skipCount": 0
+ * },
+ * "context": {
+ * "consistency": {"lastTxId": 512},
+ * "facetQueries": [
+ * {
+ * "count": 61,
+ * "label": "small"
+ * },
+ * {
+ * "count": 0,
+ * "label": "large"
+ * },
+ * {
+ * "count": 0,
+ * "label": "medium"
+ * }
+ * ]
+ * }
+ * }}
+ * @throws Exception
+ */
+ public void searchWithFaceting() throws Exception
+ {
+ SearchRequest query = new SearchRequest();
+ RestRequestQueryModel queryReq = new RestRequestQueryModel();
+ queryReq.setQuery("cars");
+ query.setQuery(queryReq);
+
+ List facets = new ArrayList();
+ facets.add(new FacetQuery("content.size:[0 TO 102400]", "small"));
+ facets.add(new FacetQuery("content.size:[102400 TO 1048576]", "medium"));
+ facets.add(new FacetQuery("content.size:[1048576 TO 16777216]", "large"));
+ query.setFacetQueries(facets);
+
+ RestRequestFacetFieldsModel facetFields = new RestRequestFacetFieldsModel();
+ List