diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
index 2711f6edbd..1bc9237751 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
@@ -988,4 +988,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${server.transaction.mode.default}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java
new file mode 100644
index 0000000000..6b1cd590c9
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java
@@ -0,0 +1,27 @@
+package org.alfresco.module.org_alfresco_module_rm.dataset;
+
+public interface DataSet
+{
+
+ /**
+ * Gets the label of the data set
+ *
+ * @return String the label of the data set
+ */
+ String getLabel();
+
+ /**
+ * Gets the id of the data set
+ *
+ * @return String the id of the data set
+ */
+ String getId();
+
+ /**
+ * Gets the path of the data set
+ *
+ * @return String the path of the data set
+ */
+ String getPath();
+
+}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java
new file mode 100644
index 0000000000..6ae54279b7
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java
@@ -0,0 +1,90 @@
+package org.alfresco.module.org_alfresco_module_rm.dataset;
+
+public class DataSetBase implements DataSet
+{
+
+ /** Data set service */
+ private DataSetService dataSetService;
+
+ /** Data set label */
+ private String label;
+
+ /** Data set id */
+ private String id;
+
+ /** Data set path */
+ private String path;
+
+ /**
+ * Sets the data set service
+ *
+ * @param dataSetService the data set service
+ */
+ public void setDataSetService(DataSetService dataSetService)
+ {
+ this.dataSetService = dataSetService;
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSet#getLabel()
+ */
+ public String getLabel()
+ {
+ return this.label;
+ }
+
+ /**
+ * Sets the label of the data set service
+ *
+ * @param label the label
+ */
+ public void setLabel(String label)
+ {
+ this.label = label;
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSet#getId()
+ */
+ public String getId()
+ {
+ return this.id;
+ }
+
+ /**
+ * Sets the id of the data set service
+ *
+ * @param id the id
+ */
+ public void setId(String id)
+ {
+ this.id = id;
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSet#getPath()
+ */
+ public String getPath()
+ {
+ return this.path;
+ }
+
+ /**
+ * Sets the path of the data set service
+ *
+ * @param path the path
+ */
+ public void setPath(String path)
+ {
+ this.path = path;
+ }
+
+ /**
+ * Registers the data set implementation with the data set service.
+ */
+ public void register()
+ {
+ this.dataSetService.register(this);
+ }
+
+}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java
new file mode 100644
index 0000000000..eaf93db240
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java
@@ -0,0 +1,32 @@
+package org.alfresco.module.org_alfresco_module_rm.dataset;
+
+import java.util.Map;
+
+import org.alfresco.service.cmr.repository.NodeRef;
+
+public interface DataSetService
+{
+
+ /**
+ * Register a data set implementation with the service
+ *
+ * @param dataSet the data set
+ */
+ void register(DataSet dataSet);
+
+ /**
+ * Gets the details of all available data sets.
+ *
+ * @return Map details of all available data sets
+ */
+ Map getDataSets();
+
+ /**
+ * Loads the data set with the specified id into the specified file plan
+ *
+ * @param dataSetId the id of the data set which will be imported
+ * @param filePlan the file plan which the data set will load into
+ */
+ void loadDataSet(String dataSetId, NodeRef filePlan);
+
+}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java
new file mode 100644
index 0000000000..e1a2e9dbff
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java
@@ -0,0 +1,368 @@
+package org.alfresco.module.org_alfresco_module_rm.dataset;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.alfresco.error.AlfrescoRuntimeException;
+import org.alfresco.model.ContentModel;
+import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
+import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
+import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
+import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
+import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
+import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
+import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
+import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
+import org.alfresco.module.org_alfresco_module_rm.security.Role;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.cmr.search.ResultSet;
+import org.alfresco.service.cmr.search.SearchService;
+import org.alfresco.service.cmr.security.AuthorityService;
+import org.alfresco.service.cmr.security.AuthorityType;
+import org.alfresco.service.cmr.security.PermissionService;
+import org.alfresco.service.cmr.view.ImporterService;
+import org.alfresco.service.cmr.view.Location;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class DataSetServiceImpl implements DataSetService, RecordsManagementModel
+{
+
+ /** Logger */
+ private static Log logger = LogFactory.getLog(DataSetServiceImpl.class);
+
+ /** Registered data set implementations */
+ private Map dataSets = new HashMap();
+
+ /** Spaces store */
+ private static final StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE,
+ "SpacesStore");
+
+ /** Importer service */
+ private ImporterService importerService;
+
+ /** Search service */
+ private SearchService searchService;
+
+ /** Node service */
+ private NodeService nodeService;
+
+ /** Records management service */
+ private RecordsManagementService recordsManagementService;
+
+ /** Records management action service */
+ private RecordsManagementActionService recordsManagementActionService;
+
+ /** Permission service */
+ private PermissionService permissionService;
+
+ /** Authority service */
+ private AuthorityService authorityService;
+
+ /** Records management security service */
+ private RecordsManagementSecurityService recordsManagementSecurityService;
+
+ /** Records management search behaviour */
+ private RecordsManagementSearchBehaviour recordsManagementSearchBehaviour;
+
+ /** Disposition service */
+ private DispositionService dispositionService;
+
+ /**
+ * Set importer service
+ *
+ * @param importerService the importer service
+ */
+ public void setImporterService(ImporterService importerService)
+ {
+ this.importerService = importerService;
+ }
+
+ /**
+ * Set search service
+ *
+ * @param searchService the search service
+ */
+ public void setSearchService(SearchService searchService)
+ {
+ this.searchService = searchService;
+ }
+
+ /**
+ * Set node service
+ *
+ * @param nodeService the node service
+ */
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ /**
+ * Set records management service
+ *
+ * @param recordsManagementService the records management service
+ */
+ public void setRecordsManagementService(RecordsManagementService recordsManagementService)
+ {
+ this.recordsManagementService = recordsManagementService;
+ }
+
+ /**
+ * Set records management action service
+ *
+ * @param recordsManagementActionService the records management action
+ * service
+ */
+ public void setRecordsManagementActionService(
+ RecordsManagementActionService recordsManagementActionService)
+ {
+ this.recordsManagementActionService = recordsManagementActionService;
+ }
+
+ /**
+ * Set permission service
+ *
+ * @param permissionService the permission service
+ */
+ public void setPermissionService(PermissionService permissionService)
+ {
+ this.permissionService = permissionService;
+ }
+
+ /**
+ * Set authority service
+ *
+ * @param authorityService the authority service
+ */
+ public void setAuthorityService(AuthorityService authorityService)
+ {
+ this.authorityService = authorityService;
+ }
+
+ /**
+ * Set records management security service
+ *
+ * @param recordsManagementSecurityService the records management security
+ * service
+ */
+ public void setRecordsManagementSecurityService(
+ RecordsManagementSecurityService recordsManagementSecurityService)
+ {
+ this.recordsManagementSecurityService = recordsManagementSecurityService;
+ }
+
+ /**
+ * Set records management search behaviour
+ *
+ * @param recordsManagementSearchBehaviour the records management search
+ * behaviour
+ */
+ public void setRecordsManagementSearchBehaviour(
+ RecordsManagementSearchBehaviour recordsManagementSearchBehaviour)
+ {
+ this.recordsManagementSearchBehaviour = recordsManagementSearchBehaviour;
+ }
+
+ /**
+ * Set disposition service
+ *
+ * @param dispositionService the disposition service
+ */
+ public void setDispositionService(DispositionService dispositionService)
+ {
+ this.dispositionService = dispositionService;
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#register(org.alfresco.module.org_alfresco_module_rm.dataset.DataSet)
+ */
+ @Override
+ public void register(DataSet dataSet)
+ {
+ this.dataSets.put(dataSet.getId(), dataSet);
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#getDataSets()
+ */
+ @Override
+ public Map getDataSets()
+ {
+ return this.dataSets;
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#loadDataSet(java.lang.String,
+ * org.alfresco.service.cmr.repository.NodeRef)
+ */
+ @Override
+ public void loadDataSet(String dataSetId, NodeRef filePlan)
+ {
+ // Get the data set
+ DataSet dataSet = getDataSets().get(dataSetId);
+
+ // Import the RM test data ACP into the the provided file plan node reference
+ InputStream is = DataSetServiceImpl.class.getClassLoader().getResourceAsStream(
+ dataSet.getPath());
+ if (is == null)
+ {
+ throw new AlfrescoRuntimeException("The '" + dataSet.getLabel()
+ + "' import file could not be found!");
+ }
+
+ // Import view
+ Reader viewReader = new InputStreamReader(is);
+ Location location = new Location(filePlan);
+ importerService.importView(viewReader, location, null, null);
+
+ // Patch data
+ DataSetServiceImpl.patchLoadedData(searchService, nodeService, recordsManagementService,
+ recordsManagementActionService, permissionService, authorityService,
+ recordsManagementSecurityService, recordsManagementSearchBehaviour,
+ dispositionService);
+ }
+
+ /**
+ * Temp method to patch AMP'ed data
+ *
+ * @param searchService
+ * @param nodeService
+ * @param recordsManagementService
+ * @param recordsManagementActionService
+ */
+ private static void patchLoadedData(final SearchService searchService,
+ final NodeService nodeService, final RecordsManagementService recordsManagementService,
+ final RecordsManagementActionService recordsManagementActionService,
+ final PermissionService permissionService, final AuthorityService authorityService,
+ final RecordsManagementSecurityService recordsManagementSecurityService,
+ final RecordsManagementSearchBehaviour recordManagementSearchBehaviour,
+ final DispositionService dispositionService)
+ {
+ AuthenticationUtil.RunAsWork