diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DmApiFactory.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DmApiFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..efd7fe283f8830c69e72dd561ba7d127a0e61d44
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DmApiFactory.java
@@ -0,0 +1,27 @@
+package gov.anl.aps.dm.portal.utilities;
+
+import gov.anl.aps.dm.api.ExperimentDsApi;
+import gov.anl.aps.dm.common.constants.DmProperty;
+import gov.anl.aps.dm.common.exceptions.ConfigurationError;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+import org.apache.log4j.Logger;
+
+public class DmApiFactory {
+    private static final Logger logger = Logger.getLogger(DmApiFactory.class.getName());
+
+    public static ExperimentDsApi getExperimentDsApi() throws DmException {
+        String webServiceUrl = ConfigurationUtility.getPortalProperty(DmProperty.DS_WEB_SERVICE_URL_PROPERTY_NAME);
+        String loginUsername = ConfigurationUtility.getPortalProperty(DmProperty.SYSTEM_USER_PROPERTY_NAME);
+        String loginPasswordFileName = ConfigurationUtility.getPortalProperty(DmProperty.SYSTEM_PASSWORD_FILE_PROPERTY_NAME);
+        try {
+            String loginPassword = new Scanner(new File(loginPasswordFileName)).useDelimiter("\\Z").next();
+            return new ExperimentDsApi(webServiceUrl, loginUsername, loginPassword);
+        } catch (FileNotFoundException ex) {
+            logger.error("Cannot find system password file: " + loginPasswordFileName);
+            throw new ConfigurationError(ex);
+        }   
+    }
+}