diff --git a/rm-server/test/resources/org/alfresco/repository/generic-paged-results.lib.ftl b/rm-server/test/resources/org/alfresco/repository/generic-paged-results.lib.ftl
new file mode 100644
index 0000000000..4aaee22c5a
--- /dev/null
+++ b/rm-server/test/resources/org/alfresco/repository/generic-paged-results.lib.ftl
@@ -0,0 +1,13 @@
+<#macro pagedResults data>
+ "total": ${data.total?c},
+ "pageSize": ${data.pageSize?c},
+ "startIndex": ${data.startIndex?c},
+ "itemCount": ${data.itemCount?c},
+ "items":
+ [
+ <#list data.items as item>
+ <#nested item>
+ <#if item_has_next>,#if>
+ #list>
+ ]
+#macro>
\ No newline at end of file
diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetTest.java
new file mode 100644
index 0000000000..0cd3373406
--- /dev/null
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetTest.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2005-2015 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.module.org_alfresco_module_rm.script.classification;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.alfresco.module.org_alfresco_module_rm.classification.ClassificationLevel;
+import org.alfresco.module.org_alfresco_module_rm.classification.SecurityClearance;
+import org.alfresco.module.org_alfresco_module_rm.classification.SecurityClearanceService;
+import org.alfresco.module.org_alfresco_module_rm.classification.UserQueryParams;
+import org.alfresco.module.org_alfresco_module_rm.test.util.BaseWebScriptUnitTest;
+import org.alfresco.query.PagingResults;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.security.PersonService.PersonInfo;
+import org.alfresco.util.Pair;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.extensions.webscripts.DeclarativeWebScript;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Test for get user security clearance API
+ *
+ * @author Tuna Aksoy
+ * @since 3.0
+ */
+public class UserSecurityClearanceGetTest extends BaseWebScriptUnitTest
+{
+ /** Classpath location of ftl template for web script */
+ private static final String WEBSCRIPT_TEMPLATE = WEBSCRIPT_ROOT_RM + "classification/usersecurityclearance.get.json.ftl";
+
+ /** User security clearance webscript instance*/
+ private @Spy @InjectMocks UserSecurityClearanceGet webscript;
+
+ /** Mocked security clearance service */
+ private @Mock SecurityClearanceService mockedSecurityClearanceService;
+
+ /** {@inheritDoc} */
+ @Override
+ protected DeclarativeWebScript getWebScript()
+ {
+ return webscript;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected String getWebScriptTemplate()
+ {
+ return WEBSCRIPT_TEMPLATE;
+ }
+
+ /**
+ * Test to get all security clearances (no filtering)
+ * @throws Exception
+ */
+ @Test
+ public void getUserSecurityClearances() throws Exception
+ {
+ String userName = "aUserName0";
+ String firstName = "aFirstName0";
+ String lastName = "aLastName0";
+ String classificationLevelId = "id0";
+ String classificationLevelDisplayLabel = "displayLabel0";
+
+ doReturn(new PagingResults()
+ {
+ @Override
+ public List getPage()
+ {
+ return createSecurityClearances(1);
+ }
+
+ @Override
+ public String getQueryExecutionId()
+ {
+ return anyString();
+ }
+
+ @Override
+ public Pair getTotalResultCount()
+ {
+ return new Pair(1, 1);
+ }
+
+ @Override
+ public boolean hasMoreItems()
+ {
+ return false;
+ }
+ }).when(mockedSecurityClearanceService).getUsersSecurityClearance(any(UserQueryParams.class));
+
+ JSONObject response = executeJSONWebScript(new HashMap());
+ assertNotNull(response);
+
+ JSONObject data = response.getJSONObject("data");
+ assertNotNull(data);
+
+ assertEquals(1, data.getInt("total"));
+ assertEquals(0, data.getInt("startIndex"));
+ assertEquals(10, data.getInt("pageSize"));
+ assertEquals(1, data.getInt("itemCount"));
+
+ JSONArray items = data.getJSONArray("items");
+ assertNotNull(items);
+ assertEquals(1, items.length());
+
+ JSONObject securityClearance = items.getJSONObject(0);
+ assertNotNull(securityClearance);
+ assertEquals(userName, securityClearance.getString("userName"));
+ assertEquals(firstName, securityClearance.getString("firstName"));
+ assertEquals(lastName, securityClearance.getString("lastName"));
+ assertEquals(classificationLevelId, securityClearance.getString("classificationId"));
+ assertEquals(classificationLevelDisplayLabel, securityClearance.getString("classificationLabel"));
+ String fullName = firstName + " " + lastName;
+ assertEquals(fullName, securityClearance.getString("fullName"));
+ assertEquals(fullName + " (" + userName + ")", securityClearance.getString("completeName"));
+ }
+
+ /**
+ * Test to get all security clearances (with paging)
+ * @throws Exception
+ */
+ @Test
+ public void getUserSecurityClearancesWithPaging() throws Exception
+ {
+ int startIndex = 0;
+ int pageSize = 5;
+ int numberOfUsers = 25;
+ int fromIndex = startIndex * pageSize;
+ int toIndex = fromIndex + pageSize > numberOfUsers ? numberOfUsers : fromIndex + pageSize;
+ List securityClearances = createSecurityClearances(numberOfUsers);
+ List items = securityClearances.subList(fromIndex, toIndex);
+
+ doReturn(new PagingResults()
+ {
+ @Override
+ public List getPage()
+ {
+ return items;
+ }
+
+ @Override
+ public String getQueryExecutionId()
+ {
+ return anyString();
+ }
+
+ @Override
+ public Pair getTotalResultCount()
+ {
+ return new Pair(numberOfUsers, numberOfUsers);
+ }
+
+ @Override
+ public boolean hasMoreItems()
+ {
+ return true;
+ }
+ }).when(mockedSecurityClearanceService).getUsersSecurityClearance(any(UserQueryParams.class));
+
+ JSONObject response = executeJSONWebScript(buildParameters("pageSize", Integer.toString(pageSize), "startIndex", Integer.toString(startIndex)));
+ assertNotNull(response);
+
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode expected = mapper.readTree(getExpectedResult(numberOfUsers, startIndex, pageSize, fromIndex, toIndex - 1, items.size()));
+ assertEquals(expected, mapper.readTree(response.toString()));
+ }
+
+ private String getExpectedResult(int total, int startIndex, int pageSize, int fromIndex, int toIndex, int itemCount)
+ {
+ return "{" +
+ "\"data\": {" +
+ "\"total\": " + total + "," +
+ "\"startIndex\": " + startIndex + "," +
+ "\"pageSize\": " + pageSize + "," +
+ "\"items\": [" +
+ getItems(fromIndex, toIndex) +
+ "]," +
+ "\"itemCount\": " + itemCount +
+ "}" +
+ "}";
+ }
+
+ private String getItems(int fromIndex, int toIndex)
+ {
+ String items = "";
+ for (; fromIndex <= toIndex; fromIndex++)
+ {
+ items += "{" +
+ "\"firstName\": \"aFirstName" + fromIndex + "\"," +
+ "\"lastName\": \"aLastName" + fromIndex + "\"," +
+ "\"completeName\": \"aFirstName" + fromIndex + " aLastName" + fromIndex + " (aUserName" + fromIndex + ")\"," +
+ "\"fullName\": \"aFirstName" + fromIndex + " aLastName" + fromIndex + "\"," +
+ "\"classificationLabel\": \"displayLabel" + fromIndex + "\"," +
+ "\"userName\": \"aUserName" + fromIndex + "\"," +
+ "\"classificationId\": \"id" + fromIndex + "\"" +
+ "}";
+ if (fromIndex <= toIndex - 1)
+ {
+ items += ",";
+ }
+ }
+ return items;
+ }
+
+ private List createSecurityClearances(int number)
+ {
+ List securityClearances = new ArrayList<>();
+ for (int i = 0; i < number; i++)
+ {
+ PersonInfo personInfo = new PersonInfo(new NodeRef("a://noderef/" + i), "aUserName" + i, "aFirstName" + i, "aLastName" + i);
+ ClassificationLevel classificationLevel = new ClassificationLevel("id" + i, "displayLabel" + i);
+ SecurityClearance securityClearance = new SecurityClearance(personInfo, classificationLevel);
+ securityClearances.add(securityClearance);
+ }
+ return securityClearances;
+ }
+}