diff --git a/.gitignore b/.gitignore
index fbfa7d1b9607eb7020d58fd24e867b984bb41d0f..07a4e83768add5d50d539a4061ed6b02298fdfc5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
 **/*.pyc
+**/build
+**/dist
+**/glassfish-resources.xml
diff --git a/.svnignore b/.svnignore
deleted file mode 100644
index 186857b9e8394de95b93f45f32aa9038714f5b42..0000000000000000000000000000000000000000
--- a/.svnignore
+++ /dev/null
@@ -1 +0,0 @@
-var
diff --git a/doc/.svnignore b/doc/.svnignore
deleted file mode 100644
index 1936cc1d441e479bc8fb17da77ec6f06e477f286..0000000000000000000000000000000000000000
--- a/doc/.svnignore
+++ /dev/null
@@ -1 +0,0 @@
-html
diff --git a/doc/RELEASE_NOTES.txt b/doc/RELEASE_NOTES.txt
index 34b67f5b6db0a0a0d8e8f5acef62b61118bee779..72ae398fe62cb21927feb99d076e4941c12fa75d 100644
--- a/doc/RELEASE_NOTES.txt
+++ b/doc/RELEASE_NOTES.txt
@@ -1,3 +1,12 @@
+Release 3.0.0 (07/26/2019)
+=============================
+- Added python web service API for downloading files 
+- Updated DB schema for experiment data archival support
+- Web Portal changes:
+  - Added storage views
+  - Added connection between station and experiment types
+  - Updated experiment views with storage and root path fields
+
 Release 2.6.0 (07/15/2019)
 =============================
 - Moved code repo to gitlab
diff --git a/doc/dm_test_system_deployment_notes.txt b/doc/dm_test_system_deployment_notes.txt
index d5316f4f7d092e98d06a89424df0bbce082f836a..90aba406e563171ee845ef310ee86412d75f3ae8 100644
--- a/doc/dm_test_system_deployment_notes.txt
+++ b/doc/dm_test_system_deployment_notes.txt
@@ -1,25 +1,29 @@
-***************
-
 Prerequisites:
-
-========
-- required OS packages are listed here https://confluence.aps.anl.gov/display/DMGT/DM+Station+System+Requirements
-
+======================
+- required OS packages are listed here:
+  https://confluence.aps.anl.gov/display/DMGT/DM+Station+System+Requirements
+- make sure that user ssh login keys are setup and work for both 127.0.0.1 
+  interface, as well as for the short/full installation machine name 
+- installing DM support software and deploying test system should not
+  require elevated privileges
+- instructions below assume that user's git ssh keys have been setup
 
 Installing DM Support
-=============
+======================
 1) mkdir -p DM_INSTALL_DIR && cd DM_INSTALL_DIR
-2) svn co https://subversion.xray.aps.anl.gov/DataManagement/support
+2) git clone git@git.aps.anl.gov:DM/dm-support support
 3) cd support
 4) ./sbin/install_support_all.sh
-  - you will need to enter two passwords of your choice for glassfish (master and admin password); each password needs to be entered only once, as expect scripts handle repeated requests
-
+  - you will need to enter two passwords of your choice for glassfish 
+    (master and admin password) 
+  - each password needs to be entered only once, as expect scripts handle 
+    repeated requests
 
 Deploying Test System
-==============
+======================
 1) cd DM_INSTALL_DIR
-2) svn co https://subversion.xray.aps.anl.gov/DataManagement/trunk dev
-3) cd dev
+2) git clone git@git.aps.anl.gov:DM/dm
+3) cd dm
 4) ./sbin/dm_deploy_test_system.sh
   - passwords needed:
     * postgres admin password (your choice)
@@ -28,9 +32,11 @@ Deploying Test System
     * dmadmin LDAP password (existing)
     * dmadmin BSS login password (existing)
     * dmadmin ESAF DB password (existing)
-  - scripts also require entry for the data storage directory (e.g, DM_INSTALL_DIR/data), etc; for most of those entries the defaults, if given, are fine
+  - scripts also require entry for the data storage directory 
+    (e.g, DM_INSTALL_DIR/data), etc
+  - for most of the required entries the defaults, if given, are fine
 
 Removing Test System
-==============
+======================
 1) DM_INSTALL_DIR/dev/sbin/dm_remove_test_system.sh 
 
diff --git a/doc/sphinx/.svnignore b/doc/sphinx/.svnignore
deleted file mode 100644
index 9ef96044faba86acfbf59bd0deb4545625df837f..0000000000000000000000000000000000000000
--- a/doc/sphinx/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-
diff --git a/sbin/dm_remove_catalog_duplicates.sh b/sbin/dm_remove_catalog_duplicates.sh
old mode 100644
new mode 100755
index 080599ced66e798ea1850e79a543cca1cf5d604e..fbede229fd4d0874ea26eae54d76d278ee5c0c0d
--- a/sbin/dm_remove_catalog_duplicates.sh
+++ b/sbin/dm_remove_catalog_duplicates.sh
@@ -1,8 +1,92 @@
-e=Cycle2018_2_Axalta; for f in `cat $e.diff`; do echo ; echo
-"*******************************" ; echo $f; efp=`echo $f | sed
-'s?Cycle2018_2_Axalta/??'`; echo $efp; dm-stat-file --experiment=$e
---relative-path=$efp; echo ; echo LIST; dm-list-experiment-files
---experiment=$e experimentFilePath:$efp; echo ; read -p "Enter file id
-to be deleted: " fileId; dm-delete-file --keep-in-storage
---experiment=$e --file-id=$fileId; done
+#!/bin/bash
 
+# Script for removing duplicate/bad entries from DM Catalog
+
+usage() {
+    echo "Usage:"
+    echo "    $0 <experiment name> [<work dir>]"
+    echo ""
+}
+EXPERIMENT_NAME=$1
+if [ -z "$EXPERIMENT_NAME" ]; then
+    usage
+    exit 1
+fi
+WORK_DIR=${2:-/tmp}
+mkdir -p $WORK_DIR || exit 1
+echo "Using work directory $WORK_DIR for experiment $EXPERIMENT_NAME"
+
+FULL_LIST_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.all`
+UNIQUE_LIST_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.unique`
+STAT_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.stat`
+GOOD_LIST_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.good`
+DELETED_LIST_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.deleted`
+BAD_LIST_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.bad`
+DUPLICATE_LIST_FILE=`realpath $WORK_DIR/$EXPERIMENT_NAME.duplicate`
+rm -f $GOOD_LIST_FILE $BAD_LIST_FILE $DELETED_LIST_FILE $DUPLICATE_LIST_FILE
+touch $GOOD_LIST_FILE $BAD_LIST_FILE $DELETED_LIST_FILE $DUPLICATE_LIST_FILE
+
+echo "Retrieving list of all catalog entries"
+dm-list-experiment-files --experiment=$EXPERIMENT_NAME --display-keys=id,experimentFilePath,fileSize,md5Sum > $FULL_LIST_FILE || exit 1
+echo "Retrieving list of unique file paths"
+dm-list-experiment-files --experiment=$EXPERIMENT_NAME --display-keys=experimentFilePath | sort -u | sed 's?experimentFilePath=??' | awk '{print $0}' > $UNIQUE_LIST_FILE || exit 1
+
+nUnique=`wc -l $UNIQUE_LIST_FILE | awk '{print $1}'`
+nFiles=`wc -l $FULL_LIST_FILE | awk '{print $1}'`
+echo "Total number of catalog entries: $nFiles"
+echo "Total number of unique files: $nUnique"
+
+storageHost=`dm-get-experiment --experiment=$EXPERIMENT_NAME --display-keys=storageHost | sed 's?storageHost=??'`
+storageDirectory=`dm-get-experiment --experiment=$EXPERIMENT_NAME --display-keys=storageDirectory | sed 's?storageDirectory=??'`
+nFilesInStorage=`ssh $storageHost "find $storageDirectory -type f | wc -l"`
+echo "Total number of files in storage: $nFilesInStorage $storageDirectory"
+echo
+
+OLD_IFS=$IFS
+IFS=
+fCount=0
+while read -r f; do
+    fCount=`expr $fCount + 1`
+    IFS=$OLD_IFS
+    f=`echo $f | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'`
+    echo "**********"
+    echo "Working on file: \"$f\" ($fCount / $nUnique)"
+    dm-stat-file --experiment=$EXPERIMENT_NAME --relative-path=$f --md5sum > $STAT_FILE || exit 1
+    fileSize=`cat $STAT_FILE | sed -e '1,/STAT INFO/d' | awk '{print $2}' | sed 's?fileSize=??'`
+    md5Sum=`cat $STAT_FILE | sed -e '1,/STAT INFO/d' | awk '{print $3}' | sed 's?md5Sum=??'`
+    echo "File size: $fileSize, md5Sum: $md5Sum"
+    nEntries=`cat $FULL_LIST_FILE | grep "experimentFilePath=$f " | wc -l`
+    echo "There are $nEntries catalog entries"
+    goodId=""
+    idList=`cat $FULL_LIST_FILE | grep "experimentFilePath=$f " | awk '{print $1}'`
+    for id in $idList; do
+        catFileSize=`cat $FULL_LIST_FILE | grep "$id" | awk '{print $3}' | sed 's?fileSize=??' `
+        catMd5Sum=`cat $FULL_LIST_FILE | grep "$id" | awk '{print $4}' | sed 's?md5Sum=??' `
+        if [ "$catFileSize" = "$fileSize" -a "$catMd5Sum" = "$md5Sum" ]; then
+            echo "Catalog info is correct for $f, $id"
+            if [ "x$goodId" = "x" ]; then
+                echo "File $id is marked as good"
+                echo "$f $id" >> $GOOD_LIST_FILE
+                goodId=$id
+            else
+                echo "File $id is marked as duplicate of $goodId"
+                echo "$f $id" >> $DUPLICATE_LIST_FILE
+                echo dm-delete-file --keep-in-storage --experiment=$EXPERIMENT_NAME --file-$id >> $DELETED_LIST_FILE
+            fi
+        else
+            echo "Catalog info is not correct for $f, file size: $catFileSize, md5Sum: $catMd5Sum"
+            echo "$f $id" >> $BAD_LIST_FILE
+            echo dm-delete-file --keep-in-storage --experiment=$EXPERIMENT_NAME --file-$id >> $DELETED_LIST_FILE
+        fi
+    done
+done < "$UNIQUE_LIST_FILE"
+
+echo
+echo "**********"
+echo
+echo "Total number of files in storage  : $nFilesInStorage $storageDirectory"
+echo "Number of all catalog entries     : `wc -l $FULL_LIST_FILE`"
+echo "Number of unique catalog entries  : `wc -l $UNIQUE_LIST_FILE`"
+echo "Number of good catalog entries    : `wc -l $GOOD_LIST_FILE`"
+echo "Number of bad catalog entries     : `wc -l $BAD_LIST_FILE`"
+echo "Number of deleted catalog entries : `wc -l $DELETED_LIST_FILE`"
diff --git a/src/c++/configure/.svnignore b/src/c++/configure/.svnignore
deleted file mode 100644
index e99473fc97b66eccbc1b64a0346e66ecec19e122..0000000000000000000000000000000000000000
--- a/src/c++/configure/.svnignore
+++ /dev/null
@@ -1,3 +0,0 @@
-O.*
-*.local
-*.support
diff --git a/src/c++/iocBoot/iocDmInt/.svnignore b/src/c++/iocBoot/iocDmInt/.svnignore
deleted file mode 100644
index a3818ccc6d3d079c7b5aca12f6bf7a23ebb8567a..0000000000000000000000000000000000000000
--- a/src/c++/iocBoot/iocDmInt/.svnignore
+++ /dev/null
@@ -1,5 +0,0 @@
-O.*
-.svnignore
-cdCommands.debug
-cdCommands
-envPaths
diff --git a/src/java/DmApi/.svnignore b/src/java/DmApi/.svnignore
deleted file mode 100644
index 9d0b71a3c79d2d3afbfa99269fea4280f5e73344..0000000000000000000000000000000000000000
--- a/src/java/DmApi/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-dist
diff --git a/src/java/DmBase/.svnignore b/src/java/DmBase/.svnignore
deleted file mode 100644
index 9d0b71a3c79d2d3afbfa99269fea4280f5e73344..0000000000000000000000000000000000000000
--- a/src/java/DmBase/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-dist
diff --git a/src/java/DmWebPortal/nbproject/.svnignore b/src/java/DmWebPortal/nbproject/.svnignore
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/java/DmWebPortal/nbproject/private/.svnignore b/src/java/DmWebPortal/nbproject/private/.svnignore
deleted file mode 100644
index 2963c1cfca7f43d71b6f86e0d189bae649897e69..0000000000000000000000000000000000000000
--- a/src/java/DmWebPortal/nbproject/private/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-private.properties
-private.xml
diff --git a/src/java/DmWebPortal/nbproject/private/private.properties b/src/java/DmWebPortal/nbproject/private/private.properties
index 15be446691ee08ef097a133eb1076ea5c0b4acf9..1501f22e2fd36a8536d26a4e15c3b449ea5576f4 100644
--- a/src/java/DmWebPortal/nbproject/private/private.properties
+++ b/src/java/DmWebPortal/nbproject/private/private.properties
@@ -1,2 +1,7 @@
-j2ee.server.home=/glassfish
-j2ee.server.middleware=
+deploy.ant.properties.file=/home/oxygen/SVESELI/.netbeans/8.2/config/GlassFishEE6/Properties/gfv3700118484.properties
+j2ee.platform.is.jsr109=true
+j2ee.server.domain=/local/sveseli/DM/git-support/opt/netbeans/glassfish-4.1.1/glassfish/domains/domain1
+j2ee.server.home=/local/sveseli/DM/git-support/opt/netbeans/glassfish-4.1.1/glassfish
+j2ee.server.instance=[/local/sveseli/DM/git-support/opt/netbeans/glassfish-4.1.1/glassfish:/local/sveseli/DM/git-support/opt/netbeans/glassfish-4.1.1/glassfish/domains/domain1]deployer:gfv3ee6wc:localhost:4848
+j2ee.server.middleware=/local/sveseli/DM/git-support/opt/netbeans/glassfish-4.1.1
+user.properties.file=/home/oxygen/SVESELI/.netbeans/8.2/build.properties
diff --git a/src/java/DmWebPortal/nbproject/private/private.xml b/src/java/DmWebPortal/nbproject/private/private.xml
index 489683004e63175b3d3d3361f022897e671352e0..6807a2ba1902a255b464065dd83188d73fbe6d01 100644
--- a/src/java/DmWebPortal/nbproject/private/private.xml
+++ b/src/java/DmWebPortal/nbproject/private/private.xml
@@ -2,9 +2,6 @@
 <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
     <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
     <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
-        <group>
-            <file>file:/local/sveseli/Work/DM/dev/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml</file>
-            <file>file:/local/sveseli/Work/DM/dev/src/java/DmWebPortal/web/views/home.xhtml</file>
-        </group>
+        <group/>
     </open-files>
 </project-private>
diff --git a/src/java/DmWebPortal/setup/.svnignore b/src/java/DmWebPortal/setup/.svnignore
deleted file mode 100644
index 2772c3847bb4d84aa086773d20c9676620f6bd0b..0000000000000000000000000000000000000000
--- a/src/java/DmWebPortal/setup/.svnignore
+++ /dev/null
@@ -1 +0,0 @@
-glassfish-resources.xml
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentStationController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentStationController.java
index 8e7b125914d27a3192286e87292489180a056bb7..c3b02b8abb41ff80ef59acbb436f003dadc5388c 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentStationController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentStationController.java
@@ -7,6 +7,7 @@ import gov.anl.aps.dm.portal.model.beans.ExperimentStationDbFacade;
 import gov.anl.aps.dm.portal.model.beans.SystemRoleTypeDbFacade;
 import gov.anl.aps.dm.portal.model.beans.UserSystemRoleDbFacade;
 import gov.anl.aps.dm.portal.model.entities.ExperimentStation;
+import gov.anl.aps.dm.portal.model.entities.ExperimentType;
 import gov.anl.aps.dm.portal.model.entities.SystemRoleType;
 import gov.anl.aps.dm.portal.model.entities.UserInfo;
 import gov.anl.aps.dm.portal.model.entities.UserSystemRole;
@@ -38,6 +39,7 @@ public class ExperimentStationController extends DmEntityController<ExperimentSt
     private UserSystemRoleDbFacade userSystemRoleDbFacade;
      
     UserSystemRole currentUserSystemRole;
+    ExperimentType currentExperimentType;
 
     public ExperimentStationController() {
     }
@@ -120,7 +122,7 @@ public class ExperimentStationController extends DmEntityController<ExperimentSt
     public void setCurrentUserSystemRole(UserSystemRole currentUserSystemRole) {
         this.currentUserSystemRole = currentUserSystemRole;
     }
-
+   
     public void prepareAddManager(ExperimentStation experimentStation) {
         UserSystemRole userSystemRole = getCurrentUserSystemRole();
         userSystemRole.setSystemRoleType(systemRoleTypeDbFacade.findManagerRoleType());
@@ -159,6 +161,42 @@ public class ExperimentStationController extends DmEntityController<ExperimentSt
         updateOnRemoval();
     }
 
+    public ExperimentType getCurrentExperimentType() {
+        if (currentExperimentType == null) {
+            currentExperimentType = new ExperimentType();
+        }
+        return currentExperimentType;
+    }
+
+    public void setCurrentExperimentType(ExperimentType currentExperimentType) {
+        this.currentExperimentType = currentExperimentType;
+    }    
+    public void prepareAddExperimentType(ExperimentType experimentType) {
+        setCurrentExperimentType(experimentType);
+    }
+
+    public void addExperimentType() {
+        ExperimentStation experimentStation = getCurrent();
+        List<ExperimentType> experimentTypeList = experimentStation.getExperimentTypeList();
+        if (experimentTypeList.contains(currentExperimentType)) {
+            SessionUtility.addErrorMessage("Error", "Experiment type "
+                    + currentExperimentType.getName()
+                    + " can already be used at "
+                    + experimentStation.getName() + " station.");
+            return;
+        }
+        experimentTypeList.add(0, currentExperimentType);
+        update();
+        currentExperimentType = null;
+    }
+    
+    public void deleteExperimentType(ExperimentType experimentType) {
+        ExperimentStation experimentStation = getCurrent();
+        List<ExperimentType> experimentTypeList = experimentStation.getExperimentTypeList();
+        experimentTypeList.remove(experimentType);
+        updateOnRemoval();
+    }
+    
     @FacesConverter(forClass = ExperimentStation.class)
     public static class ExperimentStationControllerConverter implements Converter {
 
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/StorageController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/StorageController.java
new file mode 100644
index 0000000000000000000000000000000000000000..7efadfe8cef6bd73920e8640ea6ea8b556ba919c
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/StorageController.java
@@ -0,0 +1,125 @@
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.common.exceptions.DmException;
+import gov.anl.aps.dm.common.exceptions.InvalidRequest;
+import gov.anl.aps.dm.common.exceptions.ObjectAlreadyExists;
+import gov.anl.aps.dm.portal.model.beans.StorageDbFacade;
+import gov.anl.aps.dm.portal.model.entities.Storage;
+import javax.ejb.EJB;
+import javax.inject.Named;
+import javax.enterprise.context.SessionScoped;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.FacesConverter;
+import org.apache.log4j.Logger;
+
+@Named("storageController")
+@SessionScoped
+public class StorageController extends DmEntityController<Storage, StorageDbFacade> {
+
+    private static final Logger logger = Logger.getLogger(StorageController.class.getName());
+
+    @EJB
+    private StorageDbFacade storageDbFacade;
+
+    public StorageController() {
+    }
+
+    @Override
+    protected StorageDbFacade getFacade() {
+        return storageDbFacade;
+    }
+
+    @Override
+    protected Storage createEntityInstance() {
+        return new Storage();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "storage";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        if (getCurrent() != null) {
+            return getCurrent().getName();
+        }
+        return "";
+    }
+
+    @Override
+    public Storage findById(Integer id) {
+        return storageDbFacade.findById(id);
+    }
+    
+    @Override
+    public void prepareEntityInsert(Storage storage) throws DmException {
+        if ((storage.getName() == null) || (storage.getName().length() == 0)) {
+            throw new InvalidRequest("Storage name is missing.");
+        }
+        Storage existingStorage = storageDbFacade.findByName(storage.getName());
+        if (existingStorage != null) {
+            throw new ObjectAlreadyExists("Storage " + storage.getName() + " already exists.");
+        }
+        logger.debug("Inserting new storage " + storage.getName());
+    }
+
+    @Override
+    public void prepareEntityUpdate(Storage storage) throws DmException {
+        if ((storage.getName() == null) || (storage.getName().length() == 0)) {
+            throw new InvalidRequest("Storage name is missing.");
+        }
+        logger.debug("Updating storage " + storage.getName());
+    }
+
+    @Override
+    protected String getObjectAlreadyExistMessage(Storage storage) {
+        if (storage == null) {
+            return null;
+        }
+        return "Storage system " + storage.getName() + " already exists.";
+    }
+
+    @FacesConverter(forClass = Storage.class)
+    public static class StorageControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            StorageController controller = (StorageController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "storageController");
+            return controller.getEntity(getKey(value));
+        }
+
+        java.lang.Integer getKey(String value) {
+            java.lang.Integer key;
+            key = Integer.valueOf(value);
+            return key;
+        }
+
+        String getStringKey(java.lang.Integer value) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(value);
+            return sb.toString();
+        }
+
+        @Override
+        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
+            if (object == null) {
+                return null;
+            }
+            if (object instanceof Storage) {
+                Storage o = (Storage) object;
+                return getStringKey(o.getId());
+            } else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Storage.class.getName());
+            }
+        }
+
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageDbFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageDbFacade.java
index f9b9bee0a119eadf177b07cdc2c7a67c8242ab70..81be7ebc89f8739f3ac06c76b075d47313f06ee6 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageDbFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageDbFacade.java
@@ -8,6 +8,7 @@ package gov.anl.aps.dm.portal.model.beans;
 import gov.anl.aps.dm.portal.model.entities.Storage;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
 
 /**
@@ -28,5 +29,25 @@ public class StorageDbFacade extends DmEntityDbFacade<Storage> {
     public StorageDbFacade() {
         super(Storage.class);
     }
-    
+
+    public Storage findByName(String name) {
+        try {
+            return (Storage) em.createNamedQuery("Storage.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public Storage findById(Integer id) {
+        try {
+            return (Storage) em.createNamedQuery("Storage.findById")
+                    .setParameter("id", id)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }        
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UsersLastUpdateDbFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UsersLastUpdateDbFacade.java
deleted file mode 100644
index 8d2da0bfc9a12be0df3791fb21e46698f7e51c8b..0000000000000000000000000000000000000000
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UsersLastUpdateDbFacade.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-package gov.anl.aps.dm.portal.model.beans;
-
-import gov.anl.aps.dm.portal.model.entities.UsersLastUpdate;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-/**
- *
- * @author sveseli
- */
-@Stateless
-public class UsersLastUpdateDbFacade extends DmEntityDbFacade<UsersLastUpdate> {
-
-    @PersistenceContext(unitName = "DmWebPortalPU")
-    private EntityManager em;
-
-    @Override
-    protected EntityManager getEntityManager() {
-        return em;
-    }
-
-    public UsersLastUpdateDbFacade() {
-        super(UsersLastUpdate.class);
-    }
-    
-}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedPolicyValue.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedPolicyValue.java
index 09660de78c3466f23f074c708db9ae4e17bc0609..161c40a28692e934f9a38bd79d34dbfe7d911a3c 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedPolicyValue.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedPolicyValue.java
@@ -5,7 +5,6 @@
  */
 package gov.anl.aps.dm.portal.model.entities;
 
-import java.io.Serializable;
 import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -18,7 +17,6 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -41,10 +39,8 @@ public class AllowedPolicyValue extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     @Column(name = "policy_value")
     private String policyValue;
-    @Size(max = 2147483647)
     private String description;
     @JoinColumn(name = "policy_property_id", referencedColumnName = "id")
     @ManyToOne(optional = false)
@@ -116,7 +112,7 @@ public class AllowedPolicyValue extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.AllowedPolicyValue[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.AllowedPolicyValue[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedSettingValue.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedSettingValue.java
index 66e09c5fade122f0d26d2dcc559e4575fed8b14e..8d195f126ec74d49dad7bc38c9c295766ba99713 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedSettingValue.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedSettingValue.java
@@ -5,7 +5,6 @@
  */
 package gov.anl.aps.dm.portal.model.entities;
 
-import java.io.Serializable;
 import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -17,7 +16,6 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -38,10 +36,8 @@ public class AllowedSettingValue extends DmEntity {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
     private Integer id;
-    @Size(max = 2147483647)
     @Column(name = "setting_value")
     private String settingValue;
-    @Size(max = 2147483647)
     private String description;
     @JoinColumn(name = "setting_type_id", referencedColumnName = "id")
     @ManyToOne(optional = false)
@@ -108,7 +104,7 @@ public class AllowedSettingValue extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.AllowedSettingValue[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.AllowedSettingValue[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/DataFolder.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/DataFolder.java
index a927ab3b5925947235f32274b0ae90842891bd2a..709ca74bb241fdf88a7749512b713b382047ea7f 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/DataFolder.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/DataFolder.java
@@ -5,7 +5,6 @@
  */
 package gov.anl.aps.dm.portal.model.entities;
 
-import java.io.Serializable;
 import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -18,7 +17,6 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -41,10 +39,8 @@ public class DataFolder extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     @Column(name = "data_path")
     private String dataPath;
-    @Size(max = 2147483647)
     private String description;
     @JoinColumn(name = "experiment_id", referencedColumnName = "id")
     @ManyToOne(optional = false)
@@ -127,7 +123,7 @@ public class DataFolder extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.DataFolder[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.DataFolder[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Endpoint.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Endpoint.java
index 9446157cf1a76192dec2efd38bdfe3b43191c2ca..fbc97818c8efefbbabf5ee919e047db42cef9e81 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Endpoint.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Endpoint.java
@@ -5,7 +5,6 @@
  */
 package gov.anl.aps.dm.portal.model.entities;
 
-import java.io.Serializable;
 import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -17,7 +16,6 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -40,14 +38,11 @@ public class Endpoint extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     @Column(name = "access_url")
     private String accessUrl;
-    @Size(max = 2147483647)
     private String description;
     @JoinColumn(name = "storage_id", referencedColumnName = "id")
     @ManyToOne(optional = false)
@@ -128,7 +123,7 @@ public class Endpoint extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.Endpoint[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.Endpoint[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
index e4dc43df4e9f7372e2145e4c3e53bc88268d448b..8855721230970038b41df28e260e28b5d8e1a24e 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
@@ -54,6 +54,8 @@ public class Experiment extends DmEntity {
     @Column(name = "end_date")
     @Temporal(TemporalType.TIMESTAMP)
     private Date endDate;
+    @Column(name = "root_path")
+    private String rootPath;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "experiment")
     private List<UserExperimentRole> userExperimentRoleList;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentId")
@@ -66,7 +68,10 @@ public class Experiment extends DmEntity {
     private ExperimentType experimentType;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentId")
     private List<ExperimentPolicy> experimentPolicyList;
-
+    @JoinColumn(name = "primary_storage_id", referencedColumnName = "id")
+    @ManyToOne
+    private Storage primaryStorage;
+    
     public Experiment() {
     }
 
@@ -120,6 +125,14 @@ public class Experiment extends DmEntity {
         this.endDate = endDate;
     }
 
+    public String getRootPath() {
+        return rootPath;
+    }
+
+    public void setRootPath(String rootPath) {
+        this.rootPath = rootPath;
+    }
+    
     @XmlTransient
     public List<UserExperimentRole> getUserExperimentRoleList() {
         return userExperimentRoleList;
@@ -154,6 +167,14 @@ public class Experiment extends DmEntity {
         this.experimentType = experimentType;
     }
 
+    public Storage getPrimaryStorage() {
+        return primaryStorage;
+    }
+
+    public void setPrimaryStorage(Storage primaryStorage) {
+        this.primaryStorage = primaryStorage;
+    }
+    
     @XmlTransient
     public List<ExperimentPolicy> getExperimentPolicyList() {
         return experimentPolicyList;
@@ -182,7 +203,7 @@ public class Experiment extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.Experiment[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.Experiment[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicy.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicy.java
index 48615df6043246f0c4086af4c44813460b7a3190..dfa341f8fc693f42997b4835592fe43fecaef953 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicy.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicy.java
@@ -109,7 +109,7 @@ public class ExperimentPolicy extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.ExperimentPolicy[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.ExperimentPolicy[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicyPropertyValue.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicyPropertyValue.java
index 9c05d032561c01ed553df20ec6659f3c8ffcc900..44a2d8f969304af846290329baf66e7d087c5e08 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicyPropertyValue.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicyPropertyValue.java
@@ -20,7 +20,6 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -44,7 +43,6 @@ public class ExperimentPolicyPropertyValue extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     @Column(name = "modified_by")
     private String modifiedBy;
     @Basic(optional = false)
@@ -52,7 +50,6 @@ public class ExperimentPolicyPropertyValue extends DmEntity {
     @Column(name = "modified_date")
     @Temporal(TemporalType.DATE)
     private Date modifiedDate;
-    @Size(max = 2147483647)
     @Column(name = "policy_property_value")
     private String policyPropertyValue;
     @JoinColumn(name = "experiment_policy_id", referencedColumnName = "id")
@@ -145,7 +142,7 @@ public class ExperimentPolicyPropertyValue extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.ExperimentPolicyPropertyValue[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.ExperimentPolicyPropertyValue[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentRoleType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentRoleType.java
index 2bcf520b4f9674dc794b3222353283fa662f297c..a12b9f88187d6b569bfe0e1201a5f7fc849abec5 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentRoleType.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentRoleType.java
@@ -17,7 +17,6 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -42,9 +41,7 @@ public class ExperimentRoleType extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
-    @Size(max = 2147483647)
     private String description;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentRoleType")
     private List<UserExperimentRole> userExperimentRoleList;
@@ -114,7 +111,7 @@ public class ExperimentRoleType extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.ExperimentRoleType[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.ExperimentRoleType[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentStation.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentStation.java
index e925e7f13e3581f327401c582b02e99ecede4a00..6875f8cd43fcdb872d7077fa3ef19648c9edee72 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentStation.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentStation.java
@@ -8,6 +8,7 @@ package gov.anl.aps.dm.portal.model.entities;
 import java.util.List;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
@@ -41,11 +42,16 @@ public class ExperimentStation extends DmEntity {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
+    @Column(name = "id")
     private Integer id;
     @Basic(optional = false)
     @NotNull
+    @Column(name = "name")
     private String name;
+    @Column(name = "description")
     private String description;
+    @Column(name = "default_root_path")
+    private String defaultRootPath;
     @JoinTable(name = "allowed_experiment_station_experiment_type", joinColumns = {
         @JoinColumn(name = "experiment_station_id", referencedColumnName = "id")}, inverseJoinColumns = {
         @JoinColumn(name = "experiment_type_id", referencedColumnName = "id")})
@@ -93,6 +99,14 @@ public class ExperimentStation extends DmEntity {
         this.description = description;
     }
 
+    public String getDefaultRootPath() {
+        return defaultRootPath;
+    }
+
+    public void setDefaultRootPath(String defaultRootPath) {
+        this.defaultRootPath = defaultRootPath;
+    }       
+       
     @XmlTransient
     public List<ExperimentType> getExperimentTypeList() {
         return experimentTypeList;
@@ -139,7 +153,8 @@ public class ExperimentStation extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.ExperimentStation[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.ExperimentStation[ id=" + id + " ]";
     }
+
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentType.java
index 589bc72e93c0f9213fa21692d476e18808535f66..74594e5bfa11d8ed7dc7a1bac07aea4de9f380b3 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentType.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentType.java
@@ -8,6 +8,7 @@ package gov.anl.aps.dm.portal.model.entities;
 import java.util.List;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
@@ -38,10 +39,13 @@ public class ExperimentType extends DmEntity {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
+    @Column(name = "id")
     private Integer id;
     @Basic(optional = false)
     @NotNull
+    @Column(name = "name")
     private String name;
+    @Column(name = "description")
     private String description;
     @ManyToMany(mappedBy = "experimentTypeList")
     private List<ExperimentStation> experimentStationList;
@@ -122,7 +126,8 @@ public class ExperimentType extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.ExperimentType[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.ExperimentType[ id=" + id + " ]";
     }
+
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyProperty.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyProperty.java
index ce8d207ecb51b33f864dba6e4306b271ce32d033..5d1add8b7260cc666bb078a0c32dc6deb1f46992 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyProperty.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyProperty.java
@@ -20,7 +20,6 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -48,20 +47,14 @@ public class PolicyProperty extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
-    @Size(max = 2147483647)
     private String units;
-    @Size(max = 2147483647)
     @Column(name = "lower_limit")
     private String lowerLimit;
-    @Size(max = 2147483647)
     @Column(name = "upper_limit")
     private String upperLimit;
-    @Size(max = 2147483647)
     @Column(name = "default_value")
     private String defaultValue;
-    @Size(max = 2147483647)
     private String description;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "policyPropertyId")
     private List<ExperimentPolicyPropertyValue> experimentPolicyPropertyValueList;
@@ -187,7 +180,7 @@ public class PolicyProperty extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.PolicyProperty[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.PolicyProperty[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyType.java
index 814a87d667d9d7563d897af72d177f83fd3eb111..2d8a70152293929bea85d0bf4a01dc550f3a3c8e 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyType.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyType.java
@@ -17,7 +17,6 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -41,9 +40,7 @@ public class PolicyType extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
-    @Size(max = 2147483647)
     private String description;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "policyTypeId")
     private List<PolicyProperty> policyPropertyList;
@@ -126,7 +123,7 @@ public class PolicyType extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.PolicyType[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.PolicyType[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SettingType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SettingType.java
index 86fad96f274dbb85d0be42de8a2df697e9572e07..1c5ffb1b3421fc469d3f596cd85235a6e75a49d2 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SettingType.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SettingType.java
@@ -18,7 +18,6 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -44,11 +43,8 @@ public class SettingType extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
-    @Size(max = 2147483647)
     private String description;
-    @Size(max = 2147483647)
     @Column(name = "default_value")
     private String defaultValue;
     @Column(name = "is_user_modifiable")
@@ -150,7 +146,7 @@ public class SettingType extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.SettingType[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.SettingType[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Storage.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Storage.java
index 71aded635d2b65b2650d004cbdffc4a73260cce5..efda905b0288c33464581c5f3f816d28258d9239 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Storage.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Storage.java
@@ -17,7 +17,6 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -31,7 +30,6 @@ import javax.xml.bind.annotation.XmlTransient;
     @NamedQuery(name = "Storage.findAll", query = "SELECT s FROM Storage s")
     , @NamedQuery(name = "Storage.findById", query = "SELECT s FROM Storage s WHERE s.id = :id")
     , @NamedQuery(name = "Storage.findByName", query = "SELECT s FROM Storage s WHERE s.name = :name")
-    , @NamedQuery(name = "Storage.findByDefaultScheme", query = "SELECT s FROM Storage s WHERE s.defaultScheme = :defaultScheme")
     , @NamedQuery(name = "Storage.findByDescription", query = "SELECT s FROM Storage s WHERE s.description = :description")})
 public class Storage extends DmEntity {
 
@@ -41,20 +39,15 @@ public class Storage extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
-    @Basic(optional = false)
-    @NotNull
-    @Size(min = 1, max = 2147483647)
-    @Column(name = "default_scheme")
-    private String defaultScheme;
-    @Size(max = 2147483647)
     private String description;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "storageId")
     private List<DataFolder> dataFolderList;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "storageId")
     private List<Endpoint> endpointList;
-
+    @OneToMany(mappedBy = "primaryStorage")
+    private List<Experiment> experimentList;
+    
     public Storage() {
     }
 
@@ -62,12 +55,12 @@ public class Storage extends DmEntity {
         this.id = id;
     }
 
-    public Storage(Integer id, String name, String defaultScheme) {
+    public Storage(Integer id, String name) {
         this.id = id;
         this.name = name;
-        this.defaultScheme = defaultScheme;
     }
 
+    @Override
     public Integer getId() {
         return id;
     }
@@ -84,14 +77,6 @@ public class Storage extends DmEntity {
         this.name = name;
     }
 
-    public String getDefaultScheme() {
-        return defaultScheme;
-    }
-
-    public void setDefaultScheme(String defaultScheme) {
-        this.defaultScheme = defaultScheme;
-    }
-
     public String getDescription() {
         return description;
     }
@@ -118,6 +103,15 @@ public class Storage extends DmEntity {
         this.endpointList = endpointList;
     }
 
+    @XmlTransient
+    public List<Experiment> getExperimentList() {
+        return experimentList;
+    }
+
+    public void setExperimentList(List<Experiment> experimentList) {
+        this.experimentList = experimentList;
+    }
+
     @Override
     public int hashCode() {
         int hash = 0;
@@ -132,15 +126,12 @@ public class Storage extends DmEntity {
             return false;
         }
         Storage other = (Storage) object;
-        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
-            return false;
-        }
-        return true;
+        return !((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id)));
     }
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.Storage[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.Storage[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SystemRoleType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SystemRoleType.java
index 6b67085c96f9de12b886f99cb1059a2fe37ffeb0..463f4d86d00743fa85ad5e7938fb0df89db26eab 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SystemRoleType.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SystemRoleType.java
@@ -17,7 +17,6 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -42,9 +41,7 @@ public class SystemRoleType extends DmEntity {
     private Integer id;
     @Basic(optional = false)
     @NotNull
-    @Size(min = 1, max = 2147483647)
     private String name;
-    @Size(max = 2147483647)
     private String description;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "systemRoleType")
     private List<UserSystemRole> userSystemRoleList;
@@ -114,7 +111,7 @@ public class SystemRoleType extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.SystemRoleType[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.SystemRoleType[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
index 97e89509edbcfb12cf9e52ff6f10a13e5d9693f6..2968c150e5774fbb20c2bd8856379d1485d48b7d 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
@@ -105,7 +105,7 @@ public class UserExperimentRole extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UserExperimentRole[ userExperimentRolePK=" + userExperimentRolePK + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.UserExperimentRole[ userExperimentRolePK=" + userExperimentRolePK + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRolePK.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRolePK.java
index a27224697092f747a17da9b54cb722b613be2480..a7ce1e1b01dea5e61e96c857d0d5bb039ef5d8cc 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRolePK.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRolePK.java
@@ -91,7 +91,7 @@ public class UserExperimentRolePK implements Serializable {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UserExperimentRolePK[ userId=" + userId + ", experimentId=" + experimentId + ", roleTypeId=" + roleTypeId + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.UserExperimentRolePK[ userId=" + userId + ", experimentId=" + experimentId + ", roleTypeId=" + roleTypeId + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
index 62760b33c164656d3fef1645156d000aafd34c5f..2584dc692c0abeb11870175c80e7d291bb16b631 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
@@ -248,7 +248,7 @@ public class UserInfo extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UserInfo[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.UserInfo[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSetting.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSetting.java
index 1229b7f8aa963a18906b41ab68fb1a279dc9cf02..6f035060940e1ace2ef2b77aba1af016038de000 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSetting.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSetting.java
@@ -16,7 +16,6 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
-import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
@@ -36,7 +35,6 @@ public class UserSetting extends DmEntity {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Basic(optional = false)
     private Integer id;
-    @Size(max = 2147483647)
     @Column(name = "setting_value")
     private String settingValue;
     @JoinColumn(name = "setting_type_id", referencedColumnName = "id")
@@ -107,7 +105,7 @@ public class UserSetting extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UserSetting[ id=" + id + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.UserSetting[ id=" + id + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRole.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRole.java
index 88a46ec70944413a3e7e90659e91c4eb7d3c74db..211e3b5286ffff769718cc09e485dc7ecb346dbb 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRole.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRole.java
@@ -103,7 +103,7 @@ public class UserSystemRole extends DmEntity {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UserSystemRole[ userSystemRolePK=" + userSystemRolePK + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.UserSystemRole[ userSystemRolePK=" + userSystemRolePK + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRolePK.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRolePK.java
index b8b08c19c0463685f9c8d6548fc78b3778f68499..683cb20f4bdf2706ee13f02098fa065140f3fa6e 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRolePK.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRolePK.java
@@ -74,7 +74,7 @@ public class UserSystemRolePK implements Serializable {
 
     @Override
     public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UserSystemRolePK[ userId=" + userId + ", roleTypeId=" + roleTypeId + " ]";
+        return "gov.anl.aps.dm.portal.model.entities.UserSystemRolePK[ userId=" + userId + ", roleTypeId=" + roleTypeId + " ]";
     }
     
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UsersLastUpdate.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UsersLastUpdate.java
deleted file mode 100644
index b8b01f87cc736fb282a6a1c4a4e4819605ed2142..0000000000000000000000000000000000000000
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UsersLastUpdate.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-package gov.anl.aps.dm.portal.model.entities;
-
-import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.constraints.NotNull;
-import javax.xml.bind.annotation.XmlRootElement;
-
-/**
- *
- * @author sveseli
- */
-@Entity
-@Table(name = "users_last_update")
-@XmlRootElement
-@NamedQueries({
-    @NamedQuery(name = "UsersLastUpdate.findAll", query = "SELECT u FROM UsersLastUpdate u")
-    , @NamedQuery(name = "UsersLastUpdate.findById", query = "SELECT u FROM UsersLastUpdate u WHERE u.id = :id")
-    , @NamedQuery(name = "UsersLastUpdate.findByLastUpdate", query = "SELECT u FROM UsersLastUpdate u WHERE u.lastUpdate = :lastUpdate")})
-public class UsersLastUpdate extends DmEntity {
-
-    @Id
-    @Basic(optional = false)
-    @NotNull
-    private Integer id;
-    @Column(name = "last_update")
-    @Temporal(TemporalType.DATE)
-    private Date lastUpdate;
-
-    public UsersLastUpdate() {
-    }
-
-    public UsersLastUpdate(Integer id) {
-        this.id = id;
-    }
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public Date getLastUpdate() {
-        return lastUpdate;
-    }
-
-    public void setLastUpdate(Date lastUpdate) {
-        this.lastUpdate = lastUpdate;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 0;
-        hash += (id != null ? id.hashCode() : 0);
-        return hash;
-    }
-
-    @Override
-    public boolean equals(Object object) {
-        // TODO: Warning - this method won't work in the case the id fields are not set
-        if (!(object instanceof UsersLastUpdate)) {
-            return false;
-        }
-        UsersLastUpdate other = (UsersLastUpdate) object;
-        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "gov.anl.aps.dm.portal.model.entities2.UsersLastUpdate[ id=" + id + " ]";
-    }
-    
-}
diff --git a/src/java/DmWebPortal/web/resources/js/storage/loadFilters.js b/src/java/DmWebPortal/web/resources/js/storage/loadFilters.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc1b29014e2cb0b82dde93aa0aca638068e4664e
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/storage/loadFilters.js
@@ -0,0 +1,3 @@
+jQuery(document).ready(function() {
+    PF('storageListWidget').filter();   
+});
diff --git a/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml b/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml
index ddb5bce0bb179779ef00329eab0f114e26edea6a..8ed3ab976833d22a985aa7581a04ef13c8f82fdc 100644
--- a/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml
+++ b/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml
@@ -9,6 +9,7 @@
         <p:menuitem value="Experiments" url="/views/experiment/list.xhtml"/> 
         <p:menuitem value="Experiment Stations" url="/views/experimentStation/list.xhtml"/>
         <p:menuitem value="Experiment Types" url="/views/experimentType/list.xhtml"/>
+        <p:menuitem value="Storage Systems" url="/views/storage/list.xhtml"/>
         <p:menuitem value="Role Types" url="/views/roleType/list.xhtml"/>
         <p:menuitem value="Users" url="/views/userInfo/list.xhtml"/>
         <p:menuitem value="Logout" action="#{loginController.logout()}" icon="ui-icon-close"/>
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.xhtml
index e0fd590174a92a00320c955b5ea86f13b96b000c..207ea9de0ef128b61b95a1e6f671b3c656298a55 100644
--- a/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.xhtml
@@ -13,6 +13,16 @@
         <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
         <h:inputText id="name" value="#{experimentObject.name}" title="Name" styleClass="entityDataEmphasizedInputText"/>
 
+        <h:outputLabel for="experimentStation" value="Experiment Station" styleClass="entityDataLabel"/>
+        <p:selectOneMenu id="experimentStation" value="#{experimentObject.experimentStation}" styleClass="entityDataInputText">
+            <f:selectItem itemLabel="Select Station" itemValue="" noSelectionOption="true" />
+            <f:selectItems value="#{experimentStationController.getAvailableExperimentStations()}" 
+                           var="experimentStation"
+                           itemValue="#{experimentStation}"
+                           itemLabel="#{experimentStation.name}"
+                           itemDescription="#{experimentStation.description}" />
+        </p:selectOneMenu>
+
         <h:outputLabel for="experimentType" value="Experiment Type" styleClass="entityDataLabel"/>
         <p:selectOneMenu id="experimentType" value="#{experimentObject.experimentType}" styleClass="entityDataInputText">
             <f:selectItem itemLabel="Select Type" itemValue="" noSelectionOption="true" />
@@ -22,20 +32,23 @@
                            itemLabel="#{experimentType.name}"
                            itemDescription="#{experimentType.description}" />
         </p:selectOneMenu>
-
-        <h:outputLabel for="experimentStation" value="Experiment Station" styleClass="entityDataLabel"/>
-        <p:selectOneMenu id="experimentStation" value="#{experimentObject.experimentStation}" styleClass="entityDataInputText">
-            <f:selectItem itemLabel="Select Station" itemValue="" noSelectionOption="true" />
-            <f:selectItems value="#{experimentStationController.getAvailableExperimentStations()}" 
-                           var="experimentStation"
-                           itemValue="#{experimentStation}"
-                           itemLabel="#{experimentStation.name}"
-                           itemDescription="#{experimentStation.description}" />
+        
+        <h:outputLabel for="primaryStorage" value="Primary Storage" styleClass="entityDataLabel"/>
+        <p:selectOneMenu id="primaryStorage" value="#{experimentObject.primaryStorage}" styleClass="entityDataInputText">
+            <f:selectItem itemLabel="Select Type" itemValue="" noSelectionOption="true" />
+            <f:selectItems value="#{storageController.getAvailableItems()}" 
+                           var="storage"
+                           itemValue="#{storage}"
+                           itemLabel="#{storage.name}"
+                           itemDescription="#{storage.description}" />
         </p:selectOneMenu>
         
         <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
         <h:inputText id="description" value="#{experimentObject.description}" title="Description" styleClass="entityDataInputText"/>      
 
+        <h:outputLabel for="rootPath" value="Storage Root Path" styleClass="entityDataLabel"/>
+        <h:inputText id="rootPath" value="#{experimentObject.rootPath}" title="Storage Root Path" styleClass="entityDataInputText"/>      
+        
         <h:outputLabel for="startDate" value="Start Date"/>
         <p:calendar id="startDate" value="#{experimentObject.startDate}" mode="popup" showOn="button" pattern="#{resources.DateTimePattern}" />
         
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.xhtml
index cfa2fc3d58cff6e60d0c779c62a114bb8978113e..47e1eca0e1dbce44a87dbd00f981af9d0b9ce5c0 100644
--- a/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.xhtml
@@ -3,6 +3,7 @@
 <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                 xmlns:h="http://java.sun.com/jsf/html"
                 xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"        
                 xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
 
     <ui:param name="experimentObject" value="#{experimentController.current}"/>
@@ -11,16 +12,36 @@
 
         <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
         <h:outputText id="name" value="#{experimentObject.name}" title="Name" styleClass="entityDataEmphasizedText"/>
-
-        <h:outputLabel for="experimentType" value="Type" styleClass="entityDataLabel"/>
-        <h:outputText id="experimentType" value="#{experimentObject.experimentType.name}" title="Type" styleClass="entityDataText"/>
-
+        
         <h:outputLabel for="experimentStation" value="Station" styleClass="entityDataLabel"/>
         <h:outputText id="experimentStation" value="#{experimentObject.experimentStation.name}" title="Station" styleClass="entityDataText"/>
+ 
+        <h:outputLabel for="experimentType" value="Experiment Type" styleClass="entityDataLabel"/>
+        <p:selectOneMenu id="experimentType" value="#{experimentObject.experimentType}" styleClass="entityDataInputText">
+            <f:selectItem itemLabel="Select Type" itemValue="" noSelectionOption="true" />
+            <f:selectItems value="#{experimentTypeController.getAvailableItems()}" 
+                           var="experimentType"
+                           itemValue="#{experimentType}"
+                           itemLabel="#{experimentType.name}"
+                           itemDescription="#{experimentType.description}" />
+        </p:selectOneMenu>
+        
+        <h:outputLabel for="primaryStorage" value="Primary Storage" styleClass="entityDataLabel"/>
+        <p:selectOneMenu id="primaryStorage" value="#{experimentObject.primaryStorage}" styleClass="entityDataInputText">
+            <f:selectItem itemLabel="Select Type" itemValue="" noSelectionOption="true" />
+            <f:selectItems value="#{storageController.getAvailableItems()}" 
+                           var="storage"
+                           itemValue="#{storage}"
+                           itemLabel="#{storage.name}"
+                           itemDescription="#{storage.description}" />
+        </p:selectOneMenu>
         
         <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
         <h:inputText id="description" value="#{experimentObject.description}" title="Description" styleClass="entityDataInputText"/>  
-        
+
+        <h:outputLabel for="rootPath" value="Storage Root Path" styleClass="entityDataLabel"/>
+        <h:inputText id="rootPath" value="#{experimentObject.rootPath}" title="Storage Root Path" styleClass="entityDataInputText"/>      
+         
         <h:outputLabel for="startDate" value="Start Date" styleClass="entityDataLabel"/>
         <p:calendar id="startDate" value="#{experimentObject.startDate}" mode="popup" showOn="button" pattern="#{resources.DateTimePattern}" />
         
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml
index bc35404c9f67d0c06aa5e3d23521aed39a98226a..071d68010b08afa9bd9b8e5af73a837664d93d78 100644
--- a/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml
@@ -18,10 +18,16 @@
 
         <h:outputLabel for="experimentStation" value="Station" styleClass="entityDataLabel"/>
         <h:outputText id="experimentStation" value="#{experimentObject.experimentStation.name}" title="Station" styleClass="entityDataText"/>
+
+        <h:outputLabel for="primaryStorage" value="Primary Storage" styleClass="entityDataLabel"/>
+        <h:outputText id="primaryStorage" value="#{experimentObject.primaryStorage.name}" title="Primary Storage" styleClass="entityDataText"/>
         
         <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
         <h:outputText id="description" value="#{experimentObject.description}" title="Description" styleClass="entityDataText"/>
- 
+
+        <h:outputLabel for="rootPath" value="Storage Root Path" styleClass="entityDataLabel"/>
+        <h:outputText id="rootPath" value="#{experimentObject.rootPath}" title="Storage Root Path" styleClass="entityDataText"/>
+        
         <h:outputLabel for="startDate" value="Start Date" styleClass="entityDataLabel"/>
         <h:outputText  id="startDate" value="#{experimentObject.startDate}" styleClass="entityDataText">
             <f:convertDateTime pattern="#{resources.DateTimeZonePattern}" type="both" timeZone="#{resources.Timezone}" />
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeAddDialog.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeAddDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..5096ff7b4b803dbac09d51e870113b4ebfb3857c
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeAddDialog.xhtml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:p="http://primefaces.org/ui">
+
+    <p:dialog id="stationExperimentTypeAddDialog" 
+              widgetVar="stationExperimentTypeAddDialogWidget" 
+              header="Select Experiment Type" 
+              styleClass="dialog">
+        <div class="dialog">
+            <ui:include src="stationExperimentTypeSelectDataTable.xhtml"/>
+            <f:facet name="footer" class="dialog">
+                <div class="actionButton" align="center">
+                    <p:commandButton value="Add" alt="Add" 
+                                     action="#{experimentStationController.addExperimentType()}"
+                                     onclick="PF('stationExperimentTypeSelectDataTableWidget').filter()"
+                                     oncomplete="PF('stationExperimentTypeAddDialogWidget').hide()"
+                                     update="@form"
+                                     immediate="true"
+                                     icon="ui-icon-arrowreturnthick-1-w"
+                                     styleClass="dialog">
+                    </p:commandButton>  
+                    <p:commandButton value="Cancel" alt="Cancel" 
+                                     onclick="PF('stationExperimentTypeAddDialogWidget').hide()"
+                                     update="@form"
+                                     immediate="true"
+                                     icon="ui-icon-close"
+                                     styleClass="dialog">
+                    </p:commandButton> 
+                </div>
+            </f:facet>
+        </div>
+    </p:dialog>
+</ui:composition>
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeListDataTable.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeListDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..2de2c8b3ede7024bde636d00bec4860a8e753fc0
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeListDataTable.xhtml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <div class="actionButton">
+        <p:commandButton id="stationExperimentTypeAddButton" 
+                         action="#{experimentStationController.prepareAddExperimentType(stationObject)}" 
+                         oncomplete="PF('stationExperimentTypeAddDialogWidget').show()"
+                         rendered="#{loginController.admin}" 
+                         value="Add" alt="Add station experiment type." icon="ui-icon-plus">
+            <p:tooltip for="stationExperimentTypeAddButton" value="Add station experiment type."/>
+        </p:commandButton>
+    </div>
+
+    <ui:include src="stationExperimentTypeAddDialog.xhtml"/>
+
+    <ui:param name="breadcrumb" value="#{experimentStationController.currentViewId}"/>
+    <ui:param name="breadcrumbObjectId" value="#{stationObject.id}"/>
+
+    <p:dataTable id="stationExperimentTypeListDataTable"
+                 var="stationExperimentTypeObject" 
+                 value="#{stationObject.experimentTypeList}" 
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="#{experimentStationController.displayNumberOfItemsPerPage}"
+                 widgetVar="stationExperimentTypeListWidget" 
+                 emptyMessage="No experiment types found.">
+
+        <p:column sortBy="#{stationExperimentTypeObject.name}" headerText="Username" 
+                  filterBy="#{stationExperimentTypeObject.name}" filterMatchMode="contains" >
+            <h:outputLink value="../stationExperimentType/view.xhtml?id=#{stationExperimentTypeObject.id}&amp;breadcrumb=#{breadcrumb}&amp;breadcrumbObjectId=#{breadcrumbObjectId}" 
+                          title="Experiment Type: #{stationExperimentTypeObject.name}">
+                <h:outputText value="#{stationExperimentTypeObject.name}"/>
+            </h:outputLink>
+        </p:column>
+
+        <p:column headerText="Actions" >
+            <div class="actionLink">
+                <p:commandLink action="#{experimentStationController.deleteExperimentType(stationExperimentTypeObject)}"
+                               styleClass="ui-icon ui-icon-trash" title="Delete" 
+                               update="stationExperimentTypeListDataTable"
+                               rendered="#{loginController.admin}" 
+                               immediate="true"/>
+            </div>
+        </p:column>
+
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeSelectDataTable.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeSelectDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..7251b33f2f41955a0df418da665c489db5406b0f
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/stationExperimentTypeSelectDataTable.xhtml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:h="http://xmlns.jcp.org/jsf/html">
+
+    <ui:fragment>
+        <p:dataTable id="stationExperimentTypeSelectDataTable" 
+                     widgetVar="stationExperimentTypeSelectDataTableWidget"
+                     var="experimentTypeObject" 
+                     value="#{experimentTypeController.selectDataModel}" 
+                     rowKey="#{experimentTypeObject.name}"
+                     selectionMode="single"
+                     selection="#{experimentStationController.currentExperimentType}"
+                     paginator="true"
+                     paginatorAlwaysVisible="true"
+                     rows="#{experimentTypeController.selectNumberOfItemsPerPage}"
+                     emptyMessage="No available records found.">
+            
+            <p:column sortBy="#{experimentTypeObject.name}" headerText="Name"
+                      filterBy="#{experimentTypeObject.name}">
+                <h:outputText value="#{experimentTypeObject.name}"/>
+            </p:column>
+
+        </p:dataTable>
+    </ui:fragment>
+</ui:composition>
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/view.xhtml b/src/java/DmWebPortal/web/views/experimentStation/view.xhtml
index f98394ec02df751daec2fb2e962af9b45b42659e..d67b82a82127b27e9cb21454fbee4a782b691064 100644
--- a/src/java/DmWebPortal/web/views/experimentStation/view.xhtml
+++ b/src/java/DmWebPortal/web/views/experimentStation/view.xhtml
@@ -35,9 +35,9 @@
                         </div>
                     </p:tab>
 
-                    <p:tab title="Station Experiments">
+                    <p:tab title="Experiment Types">
                         <div class="middleCenterLeftContent">
-                            <ui:include src="private/stationExperimentListDataTable.xhtml"/>
+                            <ui:include src="private/stationExperimentTypeListDataTable.xhtml"/>
                         </div>
                     </p:tab>
                     
@@ -46,6 +46,13 @@
                             <ui:include src="private/stationManagerListDataTable.xhtml"/>
                         </div>
                     </p:tab>
+                    
+                    <p:tab title="Station Experiments">
+                        <div class="middleCenterLeftContent">
+                            <ui:include src="private/stationExperimentListDataTable.xhtml"/>
+                        </div>
+                    </p:tab>
+                    
                 </p:accordionPanel>
 
                 <div class="actionButton">
diff --git a/src/java/DmWebPortal/web/views/storage/create.xhtml b/src/java/DmWebPortal/web/views/storage/create.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..1298e9c1496c715deec11b42cb22be6b86c67443
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/create.xhtml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <title>Storage Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Add Storage</h1>
+            </div>
+
+            <h:form id="addStorageForm">
+
+                <ui:include src="private/storageCreatePanelGrid.xhtml"/>
+
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton action="#{storageController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton action="#{storageController.prepareList()}" immediate="true" value="Cancel" alt="Cancel" icon="ui-icon-cancel"/>
+                </div>
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedin.js" rendered="#{!loginController.loggedIn}"/>
+            <h:outputScript library="js" name="common/forwardNotAuthorized.js" rendered="#{!loginController.admin}"/>
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/storage/edit.xhtml b/src/java/DmWebPortal/web/views/storage/edit.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..2039c34b521d5b9bbd921d4e0ec4d34a5931a824
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/edit.xhtml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <title>Storage Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="editStorageForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Edit Storage</h1>
+                    </div>
+
+                    <ui:include src="private/storageEditPanelGrid.xhtml"/>
+                    <p/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{storageController.update()}" value="Save" alt="Save" icon="ui-icon-check"/>
+                        <p:commandButton action="#{storageController.prepareList()}" immediate="true" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                    </div>
+                </div>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedin.js" rendered="#{!loginController.loggedIn}"/>
+            <h:outputScript library="js" name="common/forwardNotAuthorized.js" rendered="#{!loginController.admin}"/>
+            <h:outputScript library="js" name="common/forwardHome.js" rendered="#{!storageController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/storage/list.xhtml b/src/java/DmWebPortal/web/views/storage/list.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..fc20483e183f65ec8075909967cb8ae9405d144a
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/list.xhtml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <title>Storages List</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+    <ui:define name="middleCenter">
+        <div class="pageTitle">
+            <h1>Storages</h1>
+        </div>
+
+        <h:form id="viewStorageListForm">
+            <ui:param name="entityController" value="#{storageController}"/>
+            <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+            <h:panelGroup>  
+                <ui:include src="private/storageListDataTable.xhtml"/>
+            </h:panelGroup>
+
+            <ui:include src="private/storageDestroyDialog.xhtml"/>
+
+        </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="storage/loadFilters.js"/>
+
+    </ui:define>
+    </ui:composition>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/storage/private/storageCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/storage/private/storageCreatePanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..334e89352aa155adf5d9ebeca0e9e7bc665192f0
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/private/storageCreatePanelGrid.xhtml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <ui:param name="storageObject" value="#{storageController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="createEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="name" value="#{storageObject.name}" title="Name" styleClass="entityDataEmphasizedInputText"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{storageObject.description}" title="Description" styleClass="entityDataInputText"/>        
+
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/storage/private/storageDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/storage/private/storageDestroyDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..ca31aa4f26e050553bbd63f9369c55dfb053ae9e
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/private/storageDestroyDialog.xhtml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <p:confirmDialog id="storageDestroyDialog" message="Delete storage #{storageController.getCurrentEntityInstanceName()}?"
+                     header="Delete Experiment Type" severity="alert" widgetVar="storageDestroyDialogWidget"
+                     styleClass="dialog">
+        <p:commandButton value="Yes" oncomplete="storageDestroyDialogWidget.hide()" action="#{storageController.destroy()}"/>
+        <p:commandButton value="No" onclick="PF('storageDestroyDialogWidget').hide()" type="button" />
+    </p:confirmDialog>  
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/storage/private/storageEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/storage/private/storageEditPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..ce277adc06f0e818a2ba272717dd4b2387497cd1
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/private/storageEditPanelGrid.xhtml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <ui:param name="storageObject" value="#{storageController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="editEntityDetails"> 
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{storageObject.name}" title="Name" styleClass="entityDataEmphasizedText"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{storageObject.description}" title="Description" styleClass="entityDataInputText"/>     
+        
+    </p:panelGrid>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/storage/private/storageListDataTable.xhtml b/src/java/DmWebPortal/web/views/storage/private/storageListDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..c1ffa5f2437be55d3a9078cfc4dbddfd4ad1e133
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/private/storageListDataTable.xhtml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <p:dataTable id="storageListDataTable"                              
+                 var="storageObject" 
+                 value="#{storageController.listDataModel}" 
+                 filteredValue="#{storageController.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="#{storageController.displayNumberOfItemsPerPage}"
+                 widgetVar="storageListWidget" 
+                 emptyMessage="No storage systems found.">
+
+        <p:column sortBy="#{storageObject.id}" headerText="Id" >
+            <h:outputText value="#{storageObject.id}"/>
+        </p:column>
+
+        <p:column sortBy="#{storageObject.name}" headerText="Name" 
+                  filterBy="#{storageObject.name}" filterMatchMode="contains" >
+            <h:outputText value="#{storageObject.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{storageObject.description}" headerText="Description" 
+                  filterBy="#{storageObject.description}" filterMatchMode="contains">
+            <h:outputText value="#{storageObject.description}"/>
+        </p:column>
+        
+        <p:column headerText="Actions" >
+            <div class="actionLink">
+                <p:commandLink action="#{storageController.prepareView(storageObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
+                <p:commandLink action="#{storageController.prepareEdit(storageObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('storageDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                    <f:setPropertyActionListener value="#{storageObject}" target="#{storageController.current}"/>
+                </p:commandLink>
+            </div>
+        </p:column>
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/storage/private/storageViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/storage/private/storageViewPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..5798915a2454b5c1304ffe5aee27695636698639
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/private/storageViewPanelGrid.xhtml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <ui:param name="storageObject" value="#{storageController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="viewEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{storageObject.name}" title="Name" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:outputText id="description" value="#{storageObject.description}" title="Description" styleClass="entityDataText"/>
+
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/storage/view.xhtml b/src/java/DmWebPortal/web/views/storage/view.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..ae704949c175b699747b42a8efe2bbdcd60136e2
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/storage/view.xhtml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <f:metadata>
+        <f:event type="preRenderComponent" listener="#{storageController.processViewRequestParams}"/>
+    </f:metadata>
+    
+    <title>Storage View</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="viewStorageForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Storage Details</h1>
+                    </div>
+
+                    <ui:include src="private/storageViewPanelGrid.xhtml"/>
+
+                    <p/>
+                    <ui:param name="storageObject" value="#{storageController.selected}"/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{storageController.prepareEdit(storageObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                        <p:commandButton onclick="PF('storageDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                            <f:setPropertyActionListener value="#{storageObject}" target="#{storageController.current}"/>
+                        </p:commandButton>  
+                        <p:commandButton action="#{storageController.followBreadcrumbOrPrepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                    </div>
+
+                    <ui:include src="private/storageDestroyDialog.xhtml"/>
+
+                </div>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="common/forwardHome.js" rendered="#{!storageController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+
+</ui:composition>
+
+
diff --git a/src/python/dm/.svnignore b/src/python/dm/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_bss/.svnignore b/src/python/dm/aps_bss/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_bss/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_bss/api/.svnignore b/src/python/dm/aps_bss/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_bss/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_bss/impl/.svnignore b/src/python/dm/aps_bss/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_bss/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_db_web_service/.svnignore b/src/python/dm/aps_db_web_service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_db_web_service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_db_web_service/api/.svnignore b/src/python/dm/aps_db_web_service/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_db_web_service/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_db_web_service/service/.svnignore b/src/python/dm/aps_db_web_service/service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_db_web_service/service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_db_web_service/service/impl/.svnignore b/src/python/dm/aps_db_web_service/service/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_db_web_service/service/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_esaf_db/.svnignore b/src/python/dm/aps_esaf_db/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_esaf_db/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_esaf_db/api/.svnignore b/src/python/dm/aps_esaf_db/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_esaf_db/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_esaf_db/entities/.svnignore b/src/python/dm/aps_esaf_db/entities/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_esaf_db/entities/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/aps_esaf_db/impl/.svnignore b/src/python/dm/aps_esaf_db/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/aps_esaf_db/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/cat_web_service/.svnignore b/src/python/dm/cat_web_service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/cat_web_service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/cat_web_service/api/.svnignore b/src/python/dm/cat_web_service/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/cat_web_service/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/.svnignore b/src/python/dm/common/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/api/.svnignore b/src/python/dm/common/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/cli/.svnignore b/src/python/dm/common/cli/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/cli/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/client/.svnignore b/src/python/dm/common/client/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/client/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/constants/.svnignore b/src/python/dm/common/constants/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/constants/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/exceptions/.svnignore b/src/python/dm/common/exceptions/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/exceptions/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/mongodb/.svnignore b/src/python/dm/common/mongodb/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/mongodb/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/mongodb/api/.svnignore b/src/python/dm/common/mongodb/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/mongodb/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/mongodb/impl/.svnignore b/src/python/dm/common/mongodb/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/mongodb/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/objects/.svnignore b/src/python/dm/common/objects/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/objects/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/processing/.svnignore b/src/python/dm/common/processing/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/processing/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/processing/plugins/.svnignore b/src/python/dm/common/processing/plugins/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/processing/plugins/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/processing/plugins/cdbProcessingPlugin.py b/src/python/dm/common/processing/plugins/cdbProcessingPlugin.py
index b5ac0a151d4c1c96215589799cbcf5a5c93c8210..dc1d76a466716f8bb96c4bf30b6869b2803a03c3 100755
--- a/src/python/dm/common/processing/plugins/cdbProcessingPlugin.py
+++ b/src/python/dm/common/processing/plugins/cdbProcessingPlugin.py
@@ -110,7 +110,7 @@ class CdbProcessingPlugin(FileProcessor):
                 self.__cdbLock.release()
 
             # Add metadata
-            fileUrl = 'dm://extrepid/%s/%s' % (experimentName, fileName)
+            fileUrl = 'dm://voyager/%s/%s' % (experimentName, fileName)
 
             fileProperty = self.itemRestApi.addPropertyValueToItemWithId(itemId=fileItem['id'],propertyTypeName=self.CDB_FILE_PROPERTY_TYPE, tag=None, value=fileUrl, units=None,description=None,isUserWriteable=None, isDynamic=None)
             fileMetadata = fileInfo.get('metadata', {})
diff --git a/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py b/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py
index 277c797b504a25d6dcbb07c89cc5f61322a2e509..ce42abe32e3bfd6f8b1bd471c7a7c0a6a925ed69 100755
--- a/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py
+++ b/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py
@@ -63,8 +63,8 @@ class MongoDbFileCatalogPlugin(FileProcessor):
         self.logger.debug('Before releasing Mongo DB API instance semaphore count is %s ' % (self.mongoApiSemaphore.__dict__.get('_Semaphore__value')))
         self.mongoApiSemaphore.release()
 
-    def getInitialCollectionSize(self, fileMongoDbApi, experimentName, uploadOrDaqId):
-        key = '%s-%s' % (experimentName, uploadOrDaqId)
+    def getInitialCollectionSize(self, fileMongoDbApi, experimentName, uploadId):
+        key = '%s-%s' % (experimentName, uploadId)
         self.lock.acquire()
         try:
             nFiles = self.initialCollectionSizeMap.get(key)
@@ -78,35 +78,35 @@ class MongoDbFileCatalogPlugin(FileProcessor):
     def processFile(self, fileInfo):
         experimentFilePath = fileInfo.get('experimentFilePath')
         experimentName = fileInfo.get('experimentName')
-        uploadOrDaqId = fileInfo.get('uploadId') or fileInfo.get('daqId') 
+        uploadId = fileInfo.get('uploadId') 
         self.logger.debug('Processing file "%s" for experiment %s' % (experimentFilePath, experimentName))
 
         fileMetadata = self.metadataCollector.processMetadata(fileInfo, self.statUtility)
         self.logger.debug('File "%s" catalog entry: %s' % (experimentFilePath, str(fileMetadata)))
         fileInfo['metadata'] = fileMetadata
         fileMongoDbApi = self.acquireMongoApi()
-        if self.getInitialCollectionSize(fileMongoDbApi, experimentName, uploadOrDaqId) == 0:
-            self.logger.debug('Initial collection size is zero, adding file %s' % (experimentFilePath))
+        if uploadId and self.getInitialCollectionSize(fileMongoDbApi, experimentName, uploadId) == 0:
+            self.logger.debug('Initial collection size is zero for upload %s, adding file %s' % (uploadId, experimentFilePath))
             fileMongoDbApi.addExperimentFileUnchecked(fileMetadata)
         else:
-            self.logger.debug('Initial collection size is not zero, updating file %s' % (experimentFilePath))
+            self.logger.debug('Updating file %s' % (experimentFilePath))
             fileMongoDbApi.updateOrAddExperimentFile(fileMetadata)
         self.releaseMongoApi(fileMongoDbApi)
 
     def processFile2(self, fileInfo, fileMongoDbApi):
         experimentFilePath = fileInfo.get('experimentFilePath')
         experimentName = fileInfo.get('experimentName')
-        uploadOrDaqId = fileInfo.get('uploadId') or fileInfo.get('daqId') 
+        uploadId = fileInfo.get('uploadId') 
         self.logger.debug('Processing file "%s" for experiment %s' % (experimentFilePath, experimentName))
 
         fileMetadata = self.metadataCollector.processMetadata(fileInfo, self.statUtility)
         self.logger.debug('File "%s" catalog entry: %s' % (experimentFilePath, str(fileMetadata)))
         fileInfo['metadata'] = fileMetadata
-        if self.getInitialCollectionSize(fileMongoDbApi, experimentName, uploadOrDaqId) == 0:
-            self.logger.debug('Initial collection size is zero, adding file %s' % (experimentFilePath))
+        if uploadId and self.getInitialCollectionSize(fileMongoDbApi, experimentName, uploadId) == 0:
+            self.logger.debug('Initial collection size is zero for upload %s, adding file %s' % (uploadId, experimentFilePath))
             fileMongoDbApi.addExperimentFileUnchecked(fileMetadata)
         else:
-            self.logger.debug('Initial collection size is not zero, updating file %s' % (experimentFilePath))
+            self.logger.debug('Updating file %s' % (experimentFilePath))
             fileMongoDbApi.updateOrAddExperimentFile(fileMetadata)
 
     def processFilePath(self, fileMongoDbApi, filePath, filePathDict, experiment, dataDirectory, destDirectory, daqInfo, uploadId, processDirectoryInfo):
@@ -162,3 +162,8 @@ class MongoDbFileCatalogPlugin(FileProcessor):
             processingTimer = threading.Timer(self.PROCESSING_TIMER_DELAY_PERIOD, self.processFilePath, args=[fileMongoDbApi, filePath, filePathDict, experiment, dataDirectory, destDirectory, daqInfo, uploadId, processDirectoryInfo])
             processingTimer.start()
                    
+
+#######################################################################
+# Testing.
+if __name__ == '__main__':
+    pass 
diff --git a/src/python/dm/common/service/.svnignore b/src/python/dm/common/service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/service/auth/.svnignore b/src/python/dm/common/service/auth/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/service/auth/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/utility/.svnignore b/src/python/dm/common/utility/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/utility/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/common/zeromq/.svnignore b/src/python/dm/common/zeromq/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/common/zeromq/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/daq_web_service/.svnignore b/src/python/dm/daq_web_service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/daq_web_service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/daq_web_service/api/.svnignore b/src/python/dm/daq_web_service/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/daq_web_service/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/daq_web_service/cli/.svnignore b/src/python/dm/daq_web_service/cli/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/daq_web_service/cli/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/daq_web_service/service/.svnignore b/src/python/dm/daq_web_service/service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/daq_web_service/service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/daq_web_service/service/impl/.svnignore b/src/python/dm/daq_web_service/service/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/daq_web_service/service/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/ds_web_service/.svnignore b/src/python/dm/ds_web_service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/ds_web_service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/ds_web_service/api/.svnignore b/src/python/dm/ds_web_service/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/ds_web_service/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/ds_web_service/api/experimentDsApi.py b/src/python/dm/ds_web_service/api/experimentDsApi.py
index 1308106b752a7d6515b73305d8c091bca0e525ac..106bf8283143fd14819183037f199547aef5f999 100755
--- a/src/python/dm/ds_web_service/api/experimentDsApi.py
+++ b/src/python/dm/ds_web_service/api/experimentDsApi.py
@@ -376,7 +376,7 @@ class ExperimentDsApi(DsRestApi):
         response = self.sendSessionRequest(url=url, method='POST', rawOutput=True)
         fileName = os.path.basename(experimentFilePath)
         filePath = os.path.join(destDirectory, fileName)
-        open(filePath, 'w').write(response)
+        open(filePath, 'w').write(str(response))
         return FileMetadata({'experimentName' : experimentName, 'experimentFilePath' : experimentFilePath, 'fileName' : fileName, 'localFilePath' : filePath})
 
 
diff --git a/src/python/dm/ds_web_service/cli/.svnignore b/src/python/dm/ds_web_service/cli/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/ds_web_service/cli/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/ds_web_service/service/.svnignore b/src/python/dm/ds_web_service/service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/ds_web_service/service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/ds_web_service/service/auth/.svnignore b/src/python/dm/ds_web_service/service/auth/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/ds_web_service/service/auth/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/ds_web_service/service/impl/.svnignore b/src/python/dm/ds_web_service/service/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/ds_web_service/service/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/img_pva_service/.svnignore b/src/python/dm/img_pva_service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/img_pva_service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/img_pva_service/cli/.svnignore b/src/python/dm/img_pva_service/cli/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/img_pva_service/cli/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/img_pva_service/service/.svnignore b/src/python/dm/img_pva_service/service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/img_pva_service/service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/img_pva_service/service/impl/.svnignore b/src/python/dm/img_pva_service/service/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/img_pva_service/service/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/proc_web_service/.svnignore b/src/python/dm/proc_web_service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/proc_web_service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/proc_web_service/api/.svnignore b/src/python/dm/proc_web_service/api/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/proc_web_service/api/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/proc_web_service/api/workflowProcApi.py b/src/python/dm/proc_web_service/api/workflowProcApi.py
index 86693717d50888fbb3960c9d7b35a4d772311852..34ca6ff42088e07a5c4b4eef5663ea699db44048 100755
--- a/src/python/dm/proc_web_service/api/workflowProcApi.py
+++ b/src/python/dm/proc_web_service/api/workflowProcApi.py
@@ -24,7 +24,7 @@ class WorkflowProcApi(ProcRestApi):
 
         :param username: DM username (it may be omitted if environment variable DM_LOGIN_FILE points to a file containing the "<username>|<password>" pair)
         :type username: str
-
+        
         :param password: DM password (it may be omitted if environment variable DM_LOGIN_FILE points to a file containing the "<username>|<password>" pair)
         :type password: str
 
@@ -41,7 +41,7 @@ class WorkflowProcApi(ProcRestApi):
         Add workflow to the DM workflow database. Workflows are defined 
         using dictionaries, and they serve as templates for running 
         processing jobs.
-         
+
         Workflow keys:
           - name (required)
           - owner (required)
@@ -52,7 +52,7 @@ class WorkflowProcApi(ProcRestApi):
          
         Stage dictionary keys can be anything; they will get sorted, 
         and stages will get executed in the sorted order
-         
+
         Stage keys:
           - command (required; may use $variable strings that would get 
             their values at runtime, via <key>:<value> arguments)
@@ -64,6 +64,7 @@ class WorkflowProcApi(ProcRestApi):
             subsequent workflow stages)    
           - repeatPeriod, repeatUntil, maxRepeats (optional; must be 
             used together):
+
               - repeatPeriod: 
                   - defines period in seconds after which the stage command 
                     will be repeated 
@@ -78,12 +79,11 @@ class WorkflowProcApi(ProcRestApi):
               - maxRepeats: 
                   - defines maximum number of repeats; if this 
                     number is reached, stage will fail
-             
+
         Reserved keys that cannot be used in a stage definition:
           - workflow: processing job workflow specification
-         
-        Reserved keys that may be used in a stage definition as command input 
-        variables:
+        
+        Reserved keys that may be used in a stage definition as command input variables:
           - id: processing job id 
           - stage: processing job workflow stage 
           - status: processing job status 
@@ -101,59 +101,53 @@ class WorkflowProcApi(ProcRestApi):
           - nFailedFiles: number of failed files
           - nSkippedFiles: number of skipped files
           - nAbortedFiles: number of aborted files
-          - nCompletedFiles: number of completed input files 
-              - sum of processed, failed, skipped and aborted files
+          - nCompletedFiles: number of completed input files (sum of processed,  failed, skipped and aborted files)
           - processedFiles: list of processed files
           - failedFiles: list of failed files
           - skippedFiles: list of skipped files
           - abortedFiles: list of aborted files
         
-        Reserved keys designated for specifying processing job input
-        files that may be used in a stage definition as command input 
-        variables:
-          - filePath: input file path
-              - if filePath is specified as one of the stage command 
-                input variables, the workflow stage will iterate over 
-                all job input files 
+        Reserved keys designated for specifying processing job input files that may be used in a stage definition as command input variables:
+          - filePath: input file path (if filePath is specified as one of the stage command input variables, the workflow stage will iterate over all job input files)
           - filePathList: list of all input file paths
           - filePathPattern: glob pattern for input file paths
-          - fileQueryDict: metadata catalog query dictionary 
-              - not yet implemented (reserved for future use)
+          - fileQueryDict: metadata catalog query dictionary (not yet implemented)
           - dataDir: directory containing data files 
          
         Any keys that are not reserved may be used in a stage
         definition as command input or output variables. Stage output
         variables can be used as input for any of the subsequent stages.
-       
+      
         Example workflow definition:
-        
-        {
-          'name'        : 'example-01'
-          'owner'       : 'anOwner', 
-          'stages'      : { 
-            '01-START'  : { 
-              'command' : '/bin/date +%Y%m%d%H%M%S', 
-              'outputVariableRegexList' : ['(?P<timeStamp>.*)']
-            },
-            '02-MKDIR'  : {
-              'command' : '/bin/mkdir -p /tmp/workflow.$timeStamp'
-            },
-            '03-ECHO'   : {
-              'command' : '/bin/echo "START JOB ID: $id" > /tmp/workflow.$timeStamp/$id.out'
-            },
-            '04-MD5SUM' : {
-              'command' : '/bin/md5sum $filePath | cut -f1 -d" "', 
-              'outputVariableRegexList' : ['(?P<md5Sum>.*)']
-            },
-            '05-ECHO'   : {
-              'command' : 'echo "FILE $filePath MD5 SUM: $md5Sum" >> /tmp/workflow.$timeStamp/$id.out'
-            },
-            '06-DONE'   : {
-              'command' : '/bin/echo "STOP JOB ID: $id" >> /tmp/workflow.$timeStamp/$id.out'
-            },
-          },
-          'description' : 'Workflow Example 01'
-        }
+
+            {
+                'name'        : 'example-01',
+                'owner'       : 'anOwner', 
+                'stages'      : { 
+                    '01-START'  : { 
+                        'command' : '/bin/date +%Y%m%d%H%M%S', 
+                        'outputVariableRegexList' : ['(?P<timeStamp>.*)']
+                    },
+                    '02-MKDIR'  : {
+                        'command' : '/bin/mkdir -p /tmp/workflow.$timeStamp'
+                    },
+                    '03-ECHO'   : {
+                        'command' : '/bin/echo "START JOB ID: $id" > /tmp/workflow.$timeStamp/$id.out'
+                    },
+                    '04-MD5SUM' : {
+                        'command' : '/bin/md5sum $filePath | cut -f1 -d" "', 
+                        'outputVariableRegexList' : ['(?P<md5Sum>.*)']
+                    },
+                    '05-ECHO'   : {
+                        'command' : 'echo "FILE $filePath MD5 SUM: $md5Sum" >> /tmp/workflow.$timeStamp/$id.out'
+                    },
+                    '06-DONE'   : {
+                        'command' : '/bin/echo "STOP JOB ID: $id" >> /tmp/workflow.$timeStamp/$id.out'
+                    },
+                },
+                'description' : 'Workflow Example 01'
+            }
+
 
         :param workflow: Workflow description
         :type workflow: Workflow or dict
@@ -430,15 +424,13 @@ class WorkflowProcApi(ProcRestApi):
           - nFailedFiles: number of failed files
           - nSkippedFiles: number of skipped files
           - nAbortedFiles: number of aborted files
-          - nCompletedFiles: number of completed input files 
-              - sum of processed, failed, skipped and aborted files
+          - nCompletedFiles: number of completed input files (sum of processed, failed, skipped and aborted files)
           - processedFiles: list of processed files
           - failedFiles: list of failed files
           - skippedFiles: list of skipped files
           - abortedFiles: list of aborted files
         
-        Reserved keys designated for specifying processing job input
-        files that may be passed as job input at runtime:
+        Reserved keys designated for specifying processing job input files that may be passed as job input at runtime:
           - filePath: input file path
               - if filePath:<aPath> is specified as part of job input, the 
                 job input file list will consist of a single file 
diff --git a/src/python/dm/proc_web_service/service/.svnignore b/src/python/dm/proc_web_service/service/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/proc_web_service/service/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/src/python/dm/proc_web_service/service/impl/.svnignore b/src/python/dm/proc_web_service/service/impl/.svnignore
deleted file mode 100644
index a295864e354f25c935ea5453ab7ec97813b11bd2..0000000000000000000000000000000000000000
--- a/src/python/dm/proc_web_service/service/impl/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.pyc
-__pycache__
diff --git a/tools/conda/aps-dm-api/meta.yaml.template b/tools/conda/aps-dm-api/meta.yaml.template
index 49f0e173745c42149bbd7e80d66a9a58a7d832f5..cb1b951133593a13aa97a3048ccbd96b266e6570 100644
--- a/tools/conda/aps-dm-api/meta.yaml.template
+++ b/tools/conda/aps-dm-api/meta.yaml.template
@@ -3,7 +3,9 @@ package:
   version: DM_SOFTWARE_VERSION
 
 source:
-  path: ../../..
+#  path: ../../..
+  git_rev: DM_SOFTWARE_VERSION
+  git_url: git@git.aps.anl.gov:DM/dm
 
 build:
   number: 1
diff --git a/tools/conda/aps-dm/meta.yaml.template b/tools/conda/aps-dm/meta.yaml.template
index 50626feb318c9d610a5302f22e2b8bd1986bcf24..d60d18260459ac21dfa858908f0be751161df134 100644
--- a/tools/conda/aps-dm/meta.yaml.template
+++ b/tools/conda/aps-dm/meta.yaml.template
@@ -3,7 +3,9 @@ package:
   version: DM_SOFTWARE_VERSION
 
 source:
-  path: ../../..
+#  path: ../../..
+  git_rev: DM_SOFTWARE_VERSION
+  git_url: git@git.aps.anl.gov:DM/dm
 
 build:
   number: 1
diff --git a/tools/pip/aps-dm-api/.svnignore b/tools/pip/aps-dm-api/.svnignore
deleted file mode 100644
index de1d56a210d4d7d2cc179295cb6bd1418abf2eca..0000000000000000000000000000000000000000
--- a/tools/pip/aps-dm-api/.svnignore
+++ /dev/null
@@ -1,5 +0,0 @@
-LICENSE
-build
-dist
-doc
-