diff --git a/src/java/DmWebPortal/Makefile b/src/java/DmWebPortal/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d4bddb4d18470f97634997ba5de642c70364acc4
--- /dev/null
+++ b/src/java/DmWebPortal/Makefile
@@ -0,0 +1,26 @@
+TOP=../../..
+ANT=dm-ant
+ANT_ARGS=-Dlibs.CopyLibs.classpath=lib/org-netbeans-modules-java-j2seproject-copylibstask.jar 
+BUILD_PROPERTIES_FILE=nbproject/private/private.properties
+GENERIC_BUILD_PROPERTIES_FILE=$(BUILD_PROPERTIES_FILE).generic.build
+
+all install: dist
+
+clean clean-all clean-install distclean: ant-clean
+
+.PHONY: propertiesFile
+propertiesFile:
+	if [ ! -f $(BUILD_PROPERTIES_FILE) ]; then cmd="cat $(GENERIC_BUILD_PROPERTIES_FILE) | sed 's?DM_GLASSFISH_DIR?$${DM_GLASSFISH_DIR}?g' > $(BUILD_PROPERTIES_FILE)" && eval $$cmd ; fi
+
+.PHONY: ant-clean
+ant-clean: propertiesFile
+	$(ANT) $(ANT_ARGS)  clean
+
+# For compiling from command line, we have to use generic build properties file
+.PHONY: dist
+dist: propertiesFile
+	if [ -f $(BUILD_PROPERTIES_FILE) ]; then mv $(BUILD_PROPERTIES_FILE) $(BUILD_PROPERTIES_FILE).orig; fi
+	cmd="cat $(GENERIC_BUILD_PROPERTIES_FILE) | sed 's?DM_GLASSFISH_DIR?$${DM_GLASSFISH_DIR}?g' > $(BUILD_PROPERTIES_FILE)" && eval $$cmd
+	$(ANT) $(ANT_ARGS) dist 
+	if [ -f $(BUILD_PROPERTIES_FILE).orig ]; then mv $(BUILD_PROPERTIES_FILE).orig $(BUILD_PROPERTIES_FILE); fi
+
diff --git a/src/java/DmWebPortal/build.xml b/src/java/DmWebPortal/build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b34cfa82c5d34de3710a4eb92fa4c2340a958ecc
--- /dev/null
+++ b/src/java/DmWebPortal/build.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="DmWebPortal" default="default" basedir=".">
+    <description>Builds, tests, and runs the project DmWebPortal.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties 
+      -post-init:                called after initialization of project properties 
+      -pre-compile:              called before javac compilation 
+      -post-compile:             called after javac compilation 
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-dist:                 called before archive building 
+      -post-dist:                called after archive building 
+      -post-clean:               called after cleaning build products 
+      -pre-run-deploy:           called before deploying
+      -post-run-deploy:          called after deploying
+
+    Example of pluging an obfuscator after the compilation could look like 
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Other way how to customize the build is by overriding existing main targets.
+    The target of interest are: 
+
+      init-macrodef-javac:    defines macro for javac compilation
+      init-macrodef-junit:   defines macro for junit execution
+      init-macrodef-debug:    defines macro for class debugging
+      do-dist:                archive building
+      run:                    execution of project 
+      javadoc-build:          javadoc generation 
+
+    Example of overriding the target for project execution could look like 
+
+        <target name="run" depends="<PROJNAME>-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that overridden target depends on jar target and not only on 
+    compile target as regular run target does. Again, for list of available 
+    properties which you can use check the target you are overriding in 
+    nbproject/build-impl.xml file. 
+
+    -->
+</project>
diff --git a/src/java/DmWebPortal/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar b/src/java/DmWebPortal/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar
new file mode 100644
index 0000000000000000000000000000000000000000..1258902c9f594c910911645b0c8a80a986bf7786
Binary files /dev/null and b/src/java/DmWebPortal/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar differ
diff --git a/src/java/DmWebPortal/lib/gson-2.3.1.jar b/src/java/DmWebPortal/lib/gson-2.3.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..250132c197467d7ddef3b7f40a98fdc036163b66
Binary files /dev/null and b/src/java/DmWebPortal/lib/gson-2.3.1.jar differ
diff --git a/src/java/DmWebPortal/lib/itext-2.1.7.jar b/src/java/DmWebPortal/lib/itext-2.1.7.jar
new file mode 100644
index 0000000000000000000000000000000000000000..3f2c188223481f69e6c0aff835aed8f6e1d8b1c2
Binary files /dev/null and b/src/java/DmWebPortal/lib/itext-2.1.7.jar differ
diff --git a/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javaee-doc-api.jar b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javaee-doc-api.jar
new file mode 100644
index 0000000000000000000000000000000000000000..2859e3d63ddaa42deb38c36255782d1144bc291a
Binary files /dev/null and b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javaee-doc-api.jar differ
diff --git a/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javax.annotation-api.jar b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javax.annotation-api.jar
new file mode 100644
index 0000000000000000000000000000000000000000..fb21ffc91c02f52e9de5547863d4c0d083c65b89
Binary files /dev/null and b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javax.annotation-api.jar differ
diff --git a/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javax.xml.soap-api.jar b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javax.xml.soap-api.jar
new file mode 100644
index 0000000000000000000000000000000000000000..38f0389cdcc86504cf35e51daed1c42c838a6e68
Binary files /dev/null and b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/javax.xml.soap-api.jar differ
diff --git a/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jaxb-api-osgi.jar b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jaxb-api-osgi.jar
new file mode 100644
index 0000000000000000000000000000000000000000..cc5878c23e27cc2cc2549eb24642590155e9c069
Binary files /dev/null and b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jaxb-api-osgi.jar differ
diff --git a/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jaxws-api.jar b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jaxws-api.jar
new file mode 100644
index 0000000000000000000000000000000000000000..c3b7a9d84fa27ea96cbc5e7ed32becd9bb21872b
Binary files /dev/null and b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jaxws-api.jar differ
diff --git a/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jsr181-api.jar b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jsr181-api.jar
new file mode 100644
index 0000000000000000000000000000000000000000..3b413018b2c5d38719edada91dbd9ebf5b24fee9
Binary files /dev/null and b/src/java/DmWebPortal/lib/javaee-endorsed-api-7.0/jsr181-api.jar differ
diff --git a/src/java/DmWebPortal/lib/log4j-1.2.17.jar b/src/java/DmWebPortal/lib/log4j-1.2.17.jar
new file mode 100644
index 0000000000000000000000000000000000000000..068867ebfd231db09a7775794eea8127420380ed
Binary files /dev/null and b/src/java/DmWebPortal/lib/log4j-1.2.17.jar differ
diff --git a/src/java/DmWebPortal/lib/nblibraries.properties b/src/java/DmWebPortal/lib/nblibraries.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8b9a043f809640a7dfa7b3469967576a3f26368c
--- /dev/null
+++ b/src/java/DmWebPortal/lib/nblibraries.properties
@@ -0,0 +1,18 @@
+libs.CopyLibs.classpath=\
+    ${base}/org-netbeans-modules-java-j2seproject-copylibstask.jar
+libs.CopyLibs.displayName=CopyLibs Task
+libs.CopyLibs.prop-version=2.0
+libs.javaee-endorsed-api-7.0.classpath=\
+    ${base}/javaee-endorsed-api-7.0/javax.annotation-api.jar:\
+    ${base}/javaee-endorsed-api-7.0/javax.xml.soap-api.jar:\
+    ${base}/javaee-endorsed-api-7.0/jaxb-api-osgi.jar:\
+    ${base}/javaee-endorsed-api-7.0/jaxws-api.jar:\
+    ${base}/javaee-endorsed-api-7.0/jsr181-api.jar
+libs.javaee-endorsed-api-7.0.displayName=Java EE 7 Endorsed API Library
+libs.javaee-endorsed-api-7.0.javadoc=\
+    ${base}/javaee-endorsed-api-7.0/javaee-doc-api.jar
+libs.primefaces.classpath=\
+    ${base}/primefaces-6.0.jar
+libs.primefaces.displayName=PrimeFaces 6.0
+libs.primefaces.prop-maven-dependencies=\n                org.primefaces:primefaces:6.0:jar\n            
+libs.primefaces.prop-maven-repositories=default:http://repository.primefaces.org/
diff --git a/src/java/DmWebPortal/lib/org-netbeans-modules-java-j2seproject-copylibstask.jar b/src/java/DmWebPortal/lib/org-netbeans-modules-java-j2seproject-copylibstask.jar
new file mode 100644
index 0000000000000000000000000000000000000000..1258902c9f594c910911645b0c8a80a986bf7786
Binary files /dev/null and b/src/java/DmWebPortal/lib/org-netbeans-modules-java-j2seproject-copylibstask.jar differ
diff --git a/src/java/DmWebPortal/lib/poi-3.10.jar b/src/java/DmWebPortal/lib/poi-3.10.jar
new file mode 100644
index 0000000000000000000000000000000000000000..8862e217587e06a41c2a5dd8703e683428df8a54
Binary files /dev/null and b/src/java/DmWebPortal/lib/poi-3.10.jar differ
diff --git a/src/java/DmWebPortal/lib/postgresql-9.3-1102.jdbc41.jar b/src/java/DmWebPortal/lib/postgresql-9.3-1102.jdbc41.jar
new file mode 100644
index 0000000000000000000000000000000000000000..4fb1f5bee9a4e6c87ac2b91f14fbeda2017c31aa
Binary files /dev/null and b/src/java/DmWebPortal/lib/postgresql-9.3-1102.jdbc41.jar differ
diff --git a/src/java/DmWebPortal/lib/primefaces-6.0.jar b/src/java/DmWebPortal/lib/primefaces-6.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..34067e91d386ea7a5bc2fee477c6d6701261d5ef
Binary files /dev/null and b/src/java/DmWebPortal/lib/primefaces-6.0.jar differ
diff --git a/src/java/DmWebPortal/nbproject/.svnignore b/src/java/DmWebPortal/nbproject/.svnignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/java/DmWebPortal/nbproject/ant-deploy.xml b/src/java/DmWebPortal/nbproject/ant-deploy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5d33e0d6e743ce97b9b63e4c37346ab71071ce70
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/ant-deploy.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+Copyright (c) 2008, 2016 Oracle and/or its affiliates. All rights reserved.
+
+Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+Other names may be trademarks of their respective owners.
+
+The contents of this file are subject to the terms of either the GNU
+General Public License Version 2 only ("GPL") or the Common
+Development and Distribution License("CDDL") (collectively, the
+"License"). You may not use this file except in compliance with the
+License. You can obtain a copy of the License at
+http://www.netbeans.org/cddl-gplv2.html
+or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+specific language governing permissions and limitations under the
+License.  When distributing the software, include this License Header
+Notice in each file and include the License file at
+nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the GPL Version 2 section of the License file that
+accompanied this code. If applicable, add the following below the
+License Header, with the fields enclosed by brackets [] replaced by
+your own identifying information:
+"Portions Copyrighted [year] [name of copyright owner]"
+
+If you wish your version of this file to be governed by only the CDDL
+or only the GPL Version 2, indicate your decision by adding
+"[Contributor] elects to include this software in this distribution
+under the [CDDL or GPL Version 2] license." If you do not indicate a
+single choice of license, a recipient has the option to distribute
+your version of this file under either the CDDL, the GPL Version 2 or
+to extend the choice of license to its licensees as provided above.
+However, if you add GPL Version 2 code and therefore, elected the GPL
+Version 2 license, then the option applies only if the new code is
+made subject to such option by the copyright holder.
+
+Contributor(s):
+-->
+<project default="-deploy-ant" basedir=".">
+    <target name="-init-cl-deployment-env" if="deploy.ant.enabled">
+        <property file="${deploy.ant.properties.file}" />
+        <available file="${deploy.ant.docbase.dir}/WEB-INF/sun-web.xml" property="sun.web.present"/>
+        <available file="${deploy.ant.docbase.dir}/WEB-INF/glassfish-web.xml" property="glassfish.web.present"/>
+        <available file="${deploy.ant.resource.dir}" property="has.setup"/>
+        <tempfile prefix="gfv3" property="gfv3.password.file" destdir="${java.io.tmpdir}"/>  <!-- do not forget to delete this! -->
+        <echo message="AS_ADMIN_PASSWORD=${gfv3.password}" file="${gfv3.password.file}"/>
+    </target>
+
+    <target name="-parse-sun-web" depends="-init-cl-deployment-env" if="sun.web.present">
+        <tempfile prefix="gfv3" property="temp.sun.web" destdir="${java.io.tmpdir}"/>
+        <copy file="${deploy.ant.docbase.dir}/WEB-INF/sun-web.xml" tofile="${temp.sun.web}"/>
+        <!-- The doctype triggers resolution which can fail -->
+        <replace file="${temp.sun.web}">
+            <replacetoken><![CDATA[<!DOCTYPE]]></replacetoken>
+            <replacevalue><![CDATA[<!-- <!DOCTYPE]]></replacevalue>
+        </replace>
+        <replace file="${temp.sun.web}">
+            <replacetoken><![CDATA[<sun-web-app]]></replacetoken>
+            <replacevalue><![CDATA[--> <sun-web-app]]></replacevalue>
+        </replace>
+        <xmlproperty file="${temp.sun.web}" validate="false">
+        </xmlproperty>    
+        <delete file="${temp.sun.web}"/>
+        <condition property="deploy.ant.client.url" value="${gfv3.url}${sun-web-app.context-root}" else="${gfv3.url}/${ant.project.name}">
+            <isset property="sun-web-app.context-root"/>
+        </condition>
+        <condition property="deploy.context.root.argument" value="&amp;contextroot=${sun-web-app.context-root}" else="/${ant.project.name}">
+            <isset property="sun-web-app.context-root"/>
+        </condition>
+    </target>
+    <target name="-parse-glassfish-web" depends="-init-cl-deployment-env" if="glassfish.web.present">
+        <tempfile prefix="gfv3" property="temp.gf.web" destdir="${java.io.tmpdir}"/>
+        <copy file="${deploy.ant.docbase.dir}/WEB-INF/glassfish-web.xml" tofile="${temp.gf.web}"/>
+        <!-- The doctype triggers resolution which can fail -->
+        <replace file="${temp.gf.web}">
+            <replacetoken><![CDATA[<!DOCTYPE]]></replacetoken>
+            <replacevalue><![CDATA[<!-- <!DOCTYPE]]></replacevalue>
+        </replace>
+        <replace file="${temp.gf.web}">
+            <replacetoken><![CDATA[<glassfish-web-app]]></replacetoken>
+            <replacevalue><![CDATA[--> <glassfish-web-app]]></replacevalue>
+        </replace>
+        <xmlproperty file="${temp.gf.web}" validate="false">
+        </xmlproperty>
+        <delete file="${temp.gf.web}"/>
+        <condition property="deploy.ant.client.url" value="${gfv3.url}${glassfish-web-app.context-root}" else="${gfv3.url}/${ant.project.name}">
+            <isset property="glassfish-web-app.context-root"/>
+        </condition>
+        <condition property="deploy.context.root.argument" value="&amp;contextroot=${glassfish-web-app.context-root}" else="/${ant.project.name}">
+            <isset property="glassfish-web-app.context-root"/>
+        </condition>
+    </target>
+    <target name="-no-parse-sun-web" depends="-init-cl-deployment-env" unless="sun.web.present">
+        <property name="deploy.context.root.argument" value=""/>
+    </target>
+    <target name="-add-resources" depends="-init-cl-deployment-env" if="has.setup">
+        <tempfile prefix="gfv3" property="gfv3.resources.dir" destdir="${java.io.tmpdir}"/>
+        <mkdir dir="${gfv3.resources.dir}"/>
+        <mkdir dir="${gfv3.resources.dir}/META-INF"/>
+        <copy todir="${gfv3.resources.dir}/META-INF">
+            <fileset dir="${deploy.ant.resource.dir}"/>
+        </copy>
+        <jar destfile="${deploy.ant.archive}" update="true">
+            <fileset dir="${gfv3.resources.dir}"/>
+        </jar>
+        <delete dir="${gfv3.resources.dir}"/>
+    </target>
+    <target name="-deploy-ant" depends="-parse-glassfish-web, -parse-sun-web, -no-parse-sun-web,-add-resources" if="deploy.ant.enabled">
+        <antcall target="-deploy-without-pw"/>
+        <antcall target="-deploy-with-pw"/>
+    </target>
+
+    <target name="-deploy-without-pw" unless="gfv3.password">
+        <echo message="Deploying ${deploy.ant.archive}"/>
+        <tempfile prefix="gfv3" property="gfv3.results.file" destdir="${java.io.tmpdir}"/>  <!-- do not forget to delete this! -->
+        <property name="full.deploy.ant.archive" location="${deploy.ant.archive}"/>
+        <get src="${gfv3.admin.url}/__asadmin/deploy?path=${full.deploy.ant.archive}${deploy.context.root.argument}&amp;force=true&amp;name=${ant.project.name}"
+            dest="${gfv3.results.file}"/>
+        <delete file="${gfv3.results.file}"/>    
+    </target>
+    <target name="-deploy-with-pw" if="gfv3.password">
+        <echo message="Deploying ${deploy.ant.archive}"/>
+        <tempfile prefix="gfv3" property="gfv3.results.file" destdir="${java.io.tmpdir}"/>  <!-- do not forget to delete this! -->
+        <property name="full.deploy.ant.archive" location="${deploy.ant.archive}"/>
+        <get username="${gfv3.username}" password="${gfv3.password}" src="${gfv3.admin.url}/__asadmin/deploy?path=${full.deploy.ant.archive}${deploy.context.root.argument}&amp;force=true&amp;name=${ant.project.name}"
+            dest="${gfv3.results.file}"/>
+        <delete file="${gfv3.results.file}"/>
+    </target>
+    <target name="-undeploy-ant" depends="-init-cl-deployment-env" if="deploy.ant.enabled">
+        <antcall target="-undeploy-without-pw"/>
+        <antcall target="-undeploy-with-pw"/>
+    </target>
+
+    <target name="-undeploy-without-pw" unless="gfv3.password">
+        <echo message="Undeploying ${deploy.ant.archive}"/>
+        <tempfile prefix="gfv3" property="gfv3.results.file" destdir="${java.io.tmpdir}"/>  <!-- do not forget to delete this! -->
+        <get src="${gfv3.admin.url}/__asadmin/undeploy?name=${ant.project.name}"
+            dest="${gfv3.results.file}"/>
+        <delete file="${gfv3.results.file}"/>    
+    </target>
+    <target name="-undeploy-with-pw" if="gfv3.password">
+        <echo message="Undeploying ${deploy.ant.archive}"/>
+        <tempfile prefix="gfv3" property="gfv3.results.file" destdir="${java.io.tmpdir}"/>  <!-- do not forget to delete this! -->
+        <get username="${gfv3.username}" password="${gfv3.password}" src="${gfv3.admin.url}/__asadmin/undeploy?name=${ant.project.name}"
+            dest="${gfv3.results.file}"/>
+        <delete file="${gfv3.results.file}"/>
+    </target>
+</project>
diff --git a/src/java/DmWebPortal/nbproject/build-impl.xml b/src/java/DmWebPortal/nbproject/build-impl.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aea36358654f107a676e1d3184351d7f0f293530
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/build-impl.xml
@@ -0,0 +1,1481 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+        *** GENERATED FROM project.xml - DO NOT EDIT  ***
+        ***         EDIT ../build.xml INSTEAD         ***
+
+        For the purpose of easier reading the script
+        is divided into following sections:
+        - initialization
+        - compilation
+        - dist
+        - execution
+        - debugging
+        - javadoc
+        - test compilation
+        - test execution
+        - test debugging
+        - cleanup
+
+        -->
+<project xmlns:webproject1="http://www.netbeans.org/ns/web-project/1" xmlns:webproject2="http://www.netbeans.org/ns/web-project/2" xmlns:webproject3="http://www.netbeans.org/ns/web-project/3" basedir=".." default="default" name="DmWebPortal-impl">
+    <import file="ant-deploy.xml"/>
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="dist,javadoc" description="Build whole project." name="default"/>
+    <!--
+                INITIALIZATION SECTION
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target name="-pre-init-libraries">
+        <property location="./lib/nblibraries.properties" name="libraries.path"/>
+        <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/>
+        <pathconvert dirsep="/" property="libraries.dir">
+            <path path="${libraries.dir.nativedirsep}"/>
+        </pathconvert>
+        <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/>
+        <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/>
+    </target>
+    <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries">
+        <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties">
+            <filterchain>
+                <replacestring from="$${base}" to="${libraries.dir}"/>
+                <escapeunicode/>
+            </filterchain>
+        </loadproperties>
+    </target>
+    <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries">
+        <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}">
+            <filterchain>
+                <replacestring from="$${base}" to="${libraries.dir}"/>
+                <escapeunicode/>
+            </filterchain>
+        </loadproperties>
+    </target>
+    <target depends="-pre-init,-init-private,-init-libraries" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project">
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" if="dist.ear.dir" name="-do-ear-init"/>
+    <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <isfalse value="${javadoc.preview}"/>
+        </condition>
+        <property name="javac.compilerargs" value=""/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <condition property="no.dist.ear.dir">
+            <not>
+                <isset property="dist.ear.dir"/>
+            </not>
+        </condition>
+        <property name="build.web.excludes" value="${build.classes.excludes}"/>
+        <condition property="do.compile.jsps">
+            <istrue value="${compile.jsps}"/>
+        </condition>
+        <condition property="do.debug.server">
+            <or>
+                <not>
+                    <isset property="debug.server"/>
+                </not>
+                <istrue value="${debug.server}"/>
+                <and>
+                    <not>
+                        <istrue value="${debug.server}"/>
+                    </not>
+                    <not>
+                        <istrue value="${debug.client}"/>
+                    </not>
+                </and>
+            </or>
+        </condition>
+        <condition property="do.debug.client">
+            <istrue value="${debug.client}"/>
+        </condition>
+        <condition property="do.display.browser">
+            <istrue value="${display.browser}"/>
+        </condition>
+        <condition property="do.display.browser.debug.old">
+            <and>
+                <isset property="do.display.browser"/>
+                <not>
+                    <isset property="do.debug.client"/>
+                </not>
+                <not>
+                    <isset property="browser.context"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="do.display.browser.debug">
+            <and>
+                <isset property="do.display.browser"/>
+                <not>
+                    <isset property="do.debug.client"/>
+                </not>
+                <isset property="browser.context"/>
+            </and>
+        </condition>
+        <available file="${conf.dir}/MANIFEST.MF" property="has.custom.manifest"/>
+        <available file="${persistence.xml.dir}/persistence.xml" property="has.persistence.xml"/>
+        <condition property="do.war.package.with.custom.manifest">
+            <isset property="has.custom.manifest"/>
+        </condition>
+        <condition property="do.war.package.without.custom.manifest">
+            <not>
+                <isset property="has.custom.manifest"/>
+            </not>
+        </condition>
+        <condition property="do.tmp.war.package.with.custom.manifest">
+            <and>
+                <isset property="has.custom.manifest"/>
+                <or>
+                    <isfalse value="${directory.deployment.supported}"/>
+                    <isset property="dist.ear.dir"/>
+                </or>
+            </and>
+        </condition>
+        <condition property="do.tmp.war.package.without.custom.manifest">
+            <and>
+                <not>
+                    <isset property="has.custom.manifest"/>
+                </not>
+                <or>
+                    <isfalse value="${directory.deployment.supported}"/>
+                    <isset property="dist.ear.dir"/>
+                </or>
+            </and>
+        </condition>
+        <condition property="do.tmp.war.package">
+            <or>
+                <isfalse value="${directory.deployment.supported}"/>
+                <isset property="dist.ear.dir"/>
+            </or>
+        </condition>
+        <property name="build.meta.inf.dir" value="${build.web.dir}/META-INF"/>
+        <condition else="" property="application.args.param" value="${application.args}">
+            <and>
+                <isset property="application.args"/>
+                <not>
+                    <equals arg1="${application.args}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="runmain.jvmargs" value=""/>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <and>
+                <isset property="endorsed.classpath"/>
+                <length length="0" string="${endorsed.classpath}" when="greater"/>
+            </and>
+        </condition>
+        <condition else="false" property="jdkBug6558476">
+            <and>
+                <matches pattern="1\.[56]" string="${java.specification.version}"/>
+                <not>
+                    <os family="unix"/>
+                </not>
+            </and>
+        </condition>
+        <property name="javac.fork" value="${jdkBug6558476}"/>
+        <condition property="junit.available">
+            <or>
+                <available classname="org.junit.Test" classpath="${run.test.classpath}"/>
+                <available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
+            </or>
+        </condition>
+        <condition property="testng.available">
+            <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
+        </condition>
+        <condition property="junit+testng.available">
+            <and>
+                <istrue value="${junit.available}"/>
+                <istrue value="${testng.available}"/>
+            </and>
+        </condition>
+        <condition else="testng" property="testng.mode" value="mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+        <condition else="" property="testng.debug.mode" value="-mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+    </target>
+    <target depends="init" name="-init-cos" unless="deploy.on.save">
+        <condition property="deploy.on.save" value="true">
+            <or>
+                <istrue value="${j2ee.deploy.on.save}"/>
+                <istrue value="${j2ee.compile.on.save}"/>
+            </or>
+        </condition>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="build.web.dir">Must set build.web.dir</fail>
+        <fail unless="build.generated.dir">Must set build.generated.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.war">Must set dist.war</fail>
+        <condition property="missing.j2ee.server.home">
+            <and>
+                <matches pattern="j2ee.server.home" string="${j2ee.platform.classpath}"/>
+                <not>
+                    <isset property="j2ee.server.home"/>
+                </not>
+            </and>
+        </condition>
+        <fail if="missing.j2ee.server.home">
+The Java EE server classpath is not correctly set up - server home directory is missing.
+Either open the project in the IDE and assign the server or setup the server classpath manually.
+For example like this:
+   ant -Dj2ee.server.home=&lt;app_server_installation_directory&gt;
+                </fail>
+        <fail unless="j2ee.platform.classpath">
+The Java EE server classpath is not correctly set up. Your active server type is ${j2ee.server.type}.
+Either open the project in the IDE and assign the server or setup the server classpath manually.
+For example like this:
+   ant -Duser.properties.file=&lt;path_to_property_file&gt; (where you put the property "j2ee.platform.classpath" in a .properties file)
+or ant -Dj2ee.platform.classpath=&lt;server_classpath&gt; (where no properties file is used)
+                </fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/web-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}:${j2ee.platform.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" srcdir="@{srcdir}" target="${javac.target}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}:${j2ee.platform.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" srcdir="@{srcdir}" target="${javac.target}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}:${j2ee.platform.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+                <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+                <delete>
+                    <files includesfile="${javac.includesfile.binary}"/>
+                </delete>
+                <delete file="${javac.includesfile.binary}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-init">
+        <condition else="false" property="nb.junit.batch" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <not>
+                    <isset property="test.method"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="false" property="nb.junit.single" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <isset property="test.method"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-init-test-properties">
+        <property name="test.binaryincludes" value="&lt;nothing&gt;"/>
+        <property name="test.binarytestincludes" value=""/>
+        <property name="test.binaryexcludes" value=""/>
+    </target>
+    <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <junit dir="${basedir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${java.io.tmpdir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="run.jvmargs.ide" value=""/>
+                <junit dir="${basedir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                            <filename name="${test.binarytestincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
+    <target if="${testng.available}" name="-init-macrodef-testng">
+        <macrodef name="testng" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
+                    <isset property="test.method"/>
+                </condition>
+                <union id="test.set">
+                    <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
+                        <filename name="@{testincludes}"/>
+                    </fileset>
+                </union>
+                <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
+                <testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="DmWebPortal" testname="TestNG tests" workingDir="${basedir}">
+                    <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
+                    <propertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </propertyset>
+                    <customize/>
+                </testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-test-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <echo>No tests executed.</echo>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <webproject2:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </webproject2:junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <webproject2:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </webproject2:testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
+        <macrodef name="test" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <sequential>
+                <webproject2:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}:${j2ee.platform.classpath}:${j2ee.platform.embeddableejb.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                        <jvmarg line="${runmain.jvmargs}"/>
+                    </customize>
+                </webproject2:test-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <junit dir="${basedir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${java.io.tmpdir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="run.jvmargs.ide" value=""/>
+                <junit dir="${basedir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                            <filename name="${test.binarytestincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
+        <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <webproject2:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </webproject2:junit-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${testng.available}" name="-init-macrodef-testng-debug">
+        <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element name="customize2" optional="true"/>
+            <sequential>
+                <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
+                    <isset property="test.method"/>
+                </condition>
+                <condition else="-suitename DmWebPortal -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
+                    <matches pattern=".*\.xml" string="@{testClass}"/>
+                </condition>
+                <delete dir="${build.test.results.dir}" quiet="true"/>
+                <mkdir dir="${build.test.results.dir}"/>
+                <webproject1:debug args="${testng.cmd.args}" classname="org.testng.TestNG" classpath="${debug.test.classpath}:${j2ee.platform.embeddableejb.classpath}">
+                    <customize>
+                        <customize2/>
+                        <jvmarg value="-ea"/>
+                        <arg line="${testng.debug.mode}"/>
+                        <arg line="-d ${build.test.results.dir}"/>
+                        <arg line="-listener org.testng.reporters.VerboseReporter"/>
+                    </customize>
+                </webproject1:debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
+        <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element implicit="true" name="customize2" optional="true"/>
+            <sequential>
+                <webproject2:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2/>
+                </webproject2:testng-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <webproject2:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}:${j2ee.platform.classpath}:${j2ee.platform.embeddableejb.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                        <jvmarg line="${runmain.jvmargs}"/>
+                    </customize>
+                </webproject2:test-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/web-project/2">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <webproject2:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2>
+                        <syspropertyset>
+                            <propertyref prefix="test-sys-prop."/>
+                            <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                        </syspropertyset>
+                    </customize2>
+                </webproject2:testng-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/web-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${runmain.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}:${j2ee.platform.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-nbjsdebug">
+        <macrodef name="nbjsdebugstart" uri="http://www.netbeans.org/ns/web-project/1">
+            <attribute default="${client.url}" name="webUrl"/>
+            <sequential>
+                <nbjsdebugstart urlPart="${client.urlPart}" webUrl="@{webUrl}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/web-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}:${j2ee.platform.classpath}" name="classpath"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/web-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdaappreloaded" uri="http://www.netbeans.org/ns/web-project/1">
+            <sequential>
+                <nbjpdaappreloaded/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/web-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}:${j2ee.platform.classpath}" name="classpath"/>
+            <attribute default="${application.args.param}" name="args"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg line="${runmain.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <arg line="@{args}"/>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-taskdefs">
+        <fail unless="libs.CopyLibs.classpath">
+The libs.CopyLibs.classpath property is not set up.
+This property must point to 
+org-netbeans-modules-java-j2seproject-copylibstask.jar file which is part
+of NetBeans IDE installation and is usually located at 
+&lt;netbeans_installation&gt;/java&lt;version&gt;/ant/extra folder.
+Either open the project in the IDE and make sure CopyLibs library
+exists or setup the property manually. For example like this:
+ ant -Dlibs.CopyLibs.classpath=a/path/to/org-netbeans-modules-java-j2seproject-copylibstask.jar
+                </fail>
+        <taskdef classpath="${libs.CopyLibs.classpath}" resource="org/netbeans/modules/java/j2seproject/copylibstask/antlib.xml"/>
+    </target>
+    <target name="-init-ap-cmdline-properties">
+        <property name="annotation.processing.enabled" value="true"/>
+        <property name="annotation.processing.processors.list" value=""/>
+        <property name="annotation.processing.run.all.processors" value="true"/>
+        <property name="javac.processorpath" value="${javac.classpath}"/>
+        <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+        <condition property="ap.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+        <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+            <isfalse value="${annotation.processing.run.all.processors}"/>
+        </condition>
+        <condition else="" property="ap.proc.none.internal" value="-proc:none">
+            <isfalse value="${annotation.processing.enabled}"/>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+        <property name="ap.cmd.line.internal" value=""/>
+    </target>
+    <!--
+                pre NB7.2 profiling section; consider it deprecated
+            -->
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
+    <target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-profile-pre-init, init, -profile-post-init" if="profiler.info.jvmargs.agent" name="-profile-init-check">
+        <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+        <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+    </target>
+    <!--
+                end of pre NB7.2 profiling section
+            -->
+    <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-java,-init-macrodef-nbjpda,-init-macrodef-nbjsdebug,-init-macrodef-debug,-init-taskdefs,-init-ap-cmdline" name="init"/>
+    <!--
+                COMPILATION SECTION
+            -->
+    <target depends="init" if="no.dist.ear.dir" name="deps-module-jar" unless="no.deps"/>
+    <target depends="init" if="dist.ear.dir" name="deps-ear-jar" unless="no.deps"/>
+    <target depends="init, deps-module-jar, deps-ear-jar" name="deps-jar" unless="no.deps"/>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target name="-copy-webdir">
+        <copy todir="${build.web.dir}">
+            <fileset dir="${web.docbase.dir}" excludes="${build.web.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+        <copy todir="${build.web.dir}/WEB-INF">
+            <fileset dir="${webinf.dir}" excludes="${build.web.excludes}"/>
+        </copy>
+    </target>
+    <target depends="init, deps-jar, -pre-pre-compile, -pre-compile, -copy-manifest, -copy-persistence-xml, -copy-webdir, library-inclusion-in-archive,library-inclusion-in-manifest" if="have.sources" name="-do-compile">
+        <webproject2:javac destdir="${build.classes.dir}" gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target if="has.custom.manifest" name="-copy-manifest">
+        <mkdir dir="${build.meta.inf.dir}"/>
+        <copy todir="${build.meta.inf.dir}">
+            <fileset dir="${conf.dir}" includes="MANIFEST.MF"/>
+        </copy>
+    </target>
+    <target if="has.persistence.xml" name="-copy-persistence-xml">
+        <mkdir dir="${build.web.dir}/WEB-INF/classes/META-INF"/>
+        <copy todir="${build.web.dir}/WEB-INF/classes/META-INF">
+            <fileset dir="${persistence.xml.dir}" includes="persistence.xml orm.xml"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <webproject2:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <property name="jspc.schemas" value="/resources/schemas/"/>
+    <property name="jspc.dtds" value="/resources/dtds/"/>
+    <target depends="compile" description="Test compile JSP pages to expose compilation errors." if="do.compile.jsps" name="compile-jsps">
+        <mkdir dir="${build.generated.dir}/src"/>
+        <java classname="org.netbeans.modules.web.project.ant.JspC" failonerror="true" fork="true">
+            <arg value="-uriroot"/>
+            <arg file="${basedir}/${build.web.dir}"/>
+            <arg value="-d"/>
+            <arg file="${basedir}/${build.generated.dir}/src"/>
+            <arg value="-die1"/>
+            <arg value="-schemas ${jspc.schemas}"/>
+            <arg value="-dtds ${jspc.dtds}"/>
+            <arg value="-compilerSourceVM ${javac.source}"/>
+            <arg value="-compilerTargetVM ${javac.target}"/>
+            <arg value="-javaEncoding ${source.encoding}"/>
+            <arg value="-sysClasspath ${libs.jsp-compilation-syscp.classpath}"/>
+            <classpath path="${java.home}/../lib/tools.jar:${libs.jsp-compiler.classpath}:${libs.jsp-compilation.classpath}"/>
+        </java>
+        <mkdir dir="${build.generated.dir}/classes"/>
+        <webproject2:javac classpath="${build.classes.dir}:${libs.jsp-compilation.classpath}:${javac.classpath}:${j2ee.platform.classpath}" destdir="${build.generated.dir}/classes" srcdir="${build.generated.dir}/src"/>
+    </target>
+    <target depends="compile" if="jsp.includes" name="-do-compile-single-jsp">
+        <fail unless="javac.jsp.includes">Must select some files in the IDE or set javac.jsp.includes</fail>
+        <mkdir dir="${build.generated.dir}/src"/>
+        <java classname="org.netbeans.modules.web.project.ant.JspCSingle" failonerror="true" fork="true">
+            <arg value="-uriroot"/>
+            <arg file="${basedir}/${build.web.dir}"/>
+            <arg value="-d"/>
+            <arg file="${basedir}/${build.generated.dir}/src"/>
+            <arg value="-die1"/>
+            <arg value="-schemas ${jspc.schemas}"/>
+            <arg value="-dtds ${jspc.dtds}"/>
+            <arg value="-sysClasspath ${libs.jsp-compilation-syscp.classpath}"/>
+            <arg value="-jspc.files"/>
+            <arg path="${jsp.includes}"/>
+            <arg value="-compilerSourceVM ${javac.source}"/>
+            <arg value="-compilerTargetVM ${javac.target}"/>
+            <arg value="-javaEncoding ${source.encoding}"/>
+            <classpath path="${java.home}/../lib/tools.jar:${libs.jsp-compiler.classpath}:${libs.jsp-compilation.classpath}"/>
+        </java>
+        <mkdir dir="${build.generated.dir}/classes"/>
+        <webproject2:javac classpath="${build.classes.dir}:${libs.jsp-compilation.classpath}:${javac.classpath}:${j2ee.platform.classpath}" destdir="${build.generated.dir}/classes" srcdir="${build.generated.dir}/src">
+            <customize>
+                <patternset includes="${javac.jsp.includes}"/>
+            </customize>
+        </webproject2:javac>
+    </target>
+    <target name="compile-single-jsp">
+        <fail unless="jsp.includes">Must select a file in the IDE or set jsp.includes</fail>
+        <antcall target="-do-compile-single-jsp"/>
+    </target>
+    <!--
+                DIST BUILDING SECTION
+            -->
+    <target name="-pre-dist">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,compile-jsps,-pre-dist" if="do.war.package.without.custom.manifest" name="-do-dist-without-manifest">
+        <dirname file="${dist.war}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+        <jar compress="${jar.compress}" jarfile="${dist.war}">
+            <fileset dir="${build.web.dir}" excludes="WEB-INF/classes/.netbeans_*,${dist.archive.excludes}"/>
+        </jar>
+    </target>
+    <target depends="init,compile,compile-jsps,-pre-dist" if="do.war.package.with.custom.manifest" name="-do-dist-with-manifest">
+        <dirname file="${dist.war}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+        <jar compress="${jar.compress}" jarfile="${dist.war}" manifest="${build.meta.inf.dir}/MANIFEST.MF">
+            <fileset dir="${build.web.dir}" excludes="WEB-INF/classes/.netbeans_*,${dist.archive.excludes}"/>
+        </jar>
+    </target>
+    <target depends="init,compile,compile-jsps,-pre-dist" if="do.tmp.war.package.without.custom.manifest" name="-do-tmp-dist-without-manifest">
+        <dirname file="${dist.war}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+        <jar compress="${jar.compress}" jarfile="${dist.war}">
+            <fileset dir="${build.web.dir}" excludes="WEB-INF/classes/.netbeans_*,${dist.archive.excludes}"/>
+        </jar>
+    </target>
+    <target depends="init,compile,compile-jsps,-pre-dist" if="do.tmp.war.package.with.custom.manifest" name="-do-tmp-dist-with-manifest">
+        <dirname file="${dist.war}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+        <jar compress="${jar.compress}" jarfile="${dist.war}" manifest="${build.meta.inf.dir}/MANIFEST.MF">
+            <fileset dir="${build.web.dir}" excludes="WEB-INF/classes/.netbeans_*,${dist.archive.excludes}"/>
+        </jar>
+    </target>
+    <target depends="init,compile,compile-jsps,-pre-dist,-do-dist-with-manifest,-do-dist-without-manifest" name="do-dist"/>
+    <target depends="init" if="dist.ear.dir" name="library-inclusion-in-manifest">
+        <copyfiles files="${file.reference.gson-2.3.1.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${file.reference.itext-2.1.7.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${file.reference.log4j-1.2.17.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${file.reference.postgresql-9.3-1102.jdbc41.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${file.reference.org-netbeans-modules-java-j2seproject-copylibstask.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${file.reference.poi-3.10.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${file.reference.primefaces-6.0.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <mkdir dir="${build.web.dir}/META-INF"/>
+        <manifest file="${build.web.dir}/META-INF/MANIFEST.MF" mode="update"/>
+    </target>
+    <target depends="init" name="library-inclusion-in-archive" unless="dist.ear.dir">
+        <copyfiles files="${file.reference.gson-2.3.1.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${file.reference.itext-2.1.7.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${file.reference.log4j-1.2.17.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${file.reference.postgresql-9.3-1102.jdbc41.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${file.reference.org-netbeans-modules-java-j2seproject-copylibstask.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${file.reference.poi-3.10.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${file.reference.primefaces-6.0.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+    </target>
+    <target depends="init" if="dist.ear.dir" name="-clean-webinf-lib">
+        <delete dir="${build.web.dir}/WEB-INF/lib"/>
+    </target>
+    <target depends="init,-clean-webinf-lib,compile,compile-jsps,-pre-dist,library-inclusion-in-manifest" if="do.tmp.war.package" name="do-ear-dist">
+        <dirname file="${dist.ear.war}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+        <jar compress="${jar.compress}" jarfile="${dist.ear.war}" manifest="${build.web.dir}/META-INF/MANIFEST.MF">
+            <fileset dir="${build.web.dir}" excludes="WEB-INF/classes/.netbeans_*,${dist.archive.excludes}"/>
+        </jar>
+    </target>
+    <target name="-post-dist">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-dist,do-dist,-post-dist" description="Build distribution (WAR)." name="dist"/>
+    <target depends="init,-clean-webinf-lib,-init-cos,compile,-pre-dist,do-ear-dist,-post-dist" description="Build distribution (WAR) to be packaged into an EAR." name="dist-ear"/>
+    <!--
+                EXECUTION SECTION
+            -->
+    <target depends="run-deploy,run-display-browser" description="Deploy to server and show in browser." name="run"/>
+    <target name="-pre-run-deploy">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target name="-post-run-deploy">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target name="-pre-nbmodule-run-deploy">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- This target can be overriden by NetBeans modules. Don't override it directly, use -pre-run-deploy task instead. -->
+    </target>
+    <target name="-post-nbmodule-run-deploy">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- This target can be overriden by NetBeans modules. Don't override it directly, use -post-run-deploy task instead. -->
+    </target>
+    <target name="-run-deploy-am">
+        <!-- Task to deploy to the Access Manager runtime. -->
+    </target>
+    <target depends="init,-init-cos,compile,compile-jsps,-do-compile-single-jsp,-pre-dist,-do-tmp-dist-with-manifest,-do-tmp-dist-without-manifest,-pre-run-deploy,-pre-nbmodule-run-deploy,-run-deploy-nb,-init-deploy-ant,-deploy-ant,-run-deploy-am,-post-nbmodule-run-deploy,-post-run-deploy,-do-update-breakpoints" name="run-deploy"/>
+    <target if="netbeans.home" name="-run-deploy-nb">
+        <nbdeploy clientUrlPart="${client.urlPart}" debugmode="false" forceRedeploy="${forceRedeploy}"/>
+    </target>
+    <target name="-init-deploy-ant" unless="netbeans.home">
+        <property name="deploy.ant.archive" value="${dist.war}"/>
+        <property name="deploy.ant.docbase.dir" value="${web.docbase.dir}"/>
+        <property name="deploy.ant.resource.dir" value="${resource.dir}"/>
+        <property name="deploy.ant.enabled" value="true"/>
+    </target>
+    <target depends="dist,-run-undeploy-nb,-init-deploy-ant,-undeploy-ant" name="run-undeploy"/>
+    <target if="netbeans.home" name="-run-undeploy-nb">
+        <fail message="Undeploy is not supported from within the IDE"/>
+    </target>
+    <target depends="init,-pre-dist,dist,-post-dist" name="verify">
+        <nbverify file="${dist.war}"/>
+    </target>
+    <target depends="run-deploy,-init-display-browser,-display-browser-nb-old,-display-browser-nb,-display-browser-cl" name="run-display-browser"/>
+    <target if="do.display.browser" name="-init-display-browser">
+        <condition property="do.display.browser.nb.old">
+            <and>
+                <isset property="netbeans.home"/>
+                <not>
+                    <isset property="browser.context"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="do.display.browser.nb">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="browser.context"/>
+            </and>
+        </condition>
+        <condition property="do.display.browser.cl">
+            <isset property="deploy.ant.enabled"/>
+        </condition>
+    </target>
+    <target if="do.display.browser.nb.old" name="-display-browser-nb-old">
+        <nbbrowse url="${client.url}"/>
+    </target>
+    <target if="do.display.browser.nb" name="-display-browser-nb">
+        <nbbrowse context="${browser.context}" url="${client.url}" urlPath="${client.urlPart}"/>
+    </target>
+    <target if="do.display.browser.cl" name="-get-browser" unless="browser">
+        <condition property="browser" value="rundll32">
+            <os family="windows"/>
+        </condition>
+        <condition else="" property="browser.args" value="url.dll,FileProtocolHandler">
+            <os family="windows"/>
+        </condition>
+        <condition property="browser" value="/usr/bin/open">
+            <os family="mac"/>
+        </condition>
+        <property environment="env"/>
+        <condition property="browser" value="${env.BROWSER}">
+            <isset property="env.BROWSER"/>
+        </condition>
+        <condition property="browser" value="/usr/bin/firefox">
+            <available file="/usr/bin/firefox"/>
+        </condition>
+        <condition property="browser" value="/usr/local/firefox/firefox">
+            <available file="/usr/local/firefox/firefox"/>
+        </condition>
+        <condition property="browser" value="/usr/bin/mozilla">
+            <available file="/usr/bin/mozilla"/>
+        </condition>
+        <condition property="browser" value="/usr/local/mozilla/mozilla">
+            <available file="/usr/local/mozilla/mozilla"/>
+        </condition>
+        <condition property="browser" value="/usr/sfw/lib/firefox/firefox">
+            <available file="/usr/sfw/lib/firefox/firefox"/>
+        </condition>
+        <condition property="browser" value="/opt/csw/bin/firefox">
+            <available file="/opt/csw/bin/firefox"/>
+        </condition>
+        <condition property="browser" value="/usr/sfw/lib/mozilla/mozilla">
+            <available file="/usr/sfw/lib/mozilla/mozilla"/>
+        </condition>
+        <condition property="browser" value="/opt/csw/bin/mozilla">
+            <available file="/opt/csw/bin/mozilla"/>
+        </condition>
+    </target>
+    <target depends="-get-browser" if="do.display.browser.cl" name="-display-browser-cl">
+        <fail unless="browser">
+                    Browser not found, cannot launch the deployed application. Try to set the BROWSER environment variable.
+                </fail>
+        <property name="browse.url" value="${deploy.ant.client.url}${client.urlPart}"/>
+        <echo>Launching ${browse.url}</echo>
+        <exec executable="${browser}" spawn="true">
+            <arg line="${browser.args} ${browse.url}"/>
+        </exec>
+    </target>
+    <target depends="init,-init-cos,compile-single" name="run-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <webproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <webproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-do-update-breakpoints">
+        <webproject1:nbjpdaappreloaded/>
+    </target>
+    <!--
+                DEBUGGING SECTION
+            -->
+    <target depends="init,-init-cos,compile,compile-jsps,-do-compile-single-jsp,-pre-dist,-do-tmp-dist-with-manifest,-do-tmp-dist-without-manifest" description="Debug project in IDE." if="netbeans.home" name="debug">
+        <nbstartserver debugmode="true"/>
+        <antcall target="connect-debugger"/>
+        <nbdeploy clientUrlPart="${client.urlPart}" debugmode="true" forceRedeploy="true"/>
+        <antcall target="debug-display-browser-old"/>
+        <antcall target="debug-display-browser"/>
+        <antcall target="connect-client-debugger"/>
+    </target>
+    <target if="do.debug.server" name="connect-debugger" unless="is.debugged">
+        <condition property="listeningcp" value="sourcepath">
+            <istrue value="${j2ee.compile.on.save}"/>
+        </condition>
+        <nbjpdaconnect address="${jpda.address}" host="${jpda.host}" listeningcp="${listeningcp}" name="${name}" transport="${jpda.transport}">
+            <classpath>
+                <path path="${debug.classpath}:${j2ee.platform.classpath}"/>
+            </classpath>
+            <sourcepath>
+                <path path="${web.docbase.dir}"/>
+            </sourcepath>
+        </nbjpdaconnect>
+    </target>
+    <target if="do.display.browser.debug.old" name="debug-display-browser-old">
+        <nbbrowse url="${client.url}"/>
+    </target>
+    <target if="do.display.browser.debug" name="debug-display-browser">
+        <nbbrowse context="${browser.context}" url="${client.url}" urlPath="${client.urlPart}"/>
+    </target>
+    <target if="do.debug.client" name="connect-client-debugger">
+        <webproject1:nbjsdebugstart webUrl="${client.url}"/>
+    </target>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <webproject1:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init,compile,compile-jsps,-do-compile-single-jsp,debug" if="netbeans.home" name="debug-single"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <webproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <webproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <webproject1:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <webproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+            =================
+            PROFILING SECTION
+            =================
+            -->
+    <!--
+                pre NB7.2 profiling section; consider it deprecated
+            -->
+    <target description="Profile a J2EE project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
+        <condition else="start-profiled-server" property="profiler.startserver.target" value="start-profiled-server-extraargs">
+            <isset property="profiler.info.jvmargs.extra"/>
+        </condition>
+        <antcall target="${profiler.startserver.target}"/>
+        <antcall target="run"/>
+        <antcall target="-profile-start-loadgen"/>
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="start-profiled-server">
+        <nbstartprofiledserver forceRestart="${profiler.j2ee.serverForceRestart}" javaPlatform="${profiler.info.javaPlatform}" startupTimeout="${profiler.j2ee.serverStartupTimeout}">
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg value="${profiler.j2ee.agentID}"/>
+        </nbstartprofiledserver>
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="start-profiled-server-extraargs">
+        <nbstartprofiledserver forceRestart="${profiler.j2ee.serverForceRestart}" javaPlatform="${profiler.info.javaPlatform}" startupTimeout="${profiler.j2ee.serverStartupTimeout}">
+            <jvmarg value="${profiler.info.jvmargs.extra}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg value="${profiler.j2ee.agentID}"/>
+        </nbstartprofiledserver>
+    </target>
+    <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+                <path path="${j2ee.platform.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+            <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <test name="${profile.class}"/>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+                <path path="${j2ee.platform.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper from="test-sys-prop.*" to="*" type="glob"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+        </junit>
+    </target>
+    <target if="netbeans.home" name="-profile-check">
+        <condition property="profiler.configured">
+            <or>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
+            </or>
+        </condition>
+    </target>
+    <target depends="init,-init-cos,compile,compile-jsps,-do-compile-single-jsp,-pre-dist,-do-tmp-dist-with-manifest,-do-tmp-dist-without-manifest" name="-do-profile">
+        <startprofiler/>
+        <nbstartserver profilemode="true"/>
+        <nbdeploy clientUrlPart="${client.urlPart}" forceRedeploy="true" profilemode="true"/>
+        <antcall target="debug-display-browser-old"/>
+        <antcall target="debug-display-browser"/>
+        <antcall target="-profile-start-loadgen"/>
+    </target>
+    <target depends="-profile-check,-profile-pre72" description="Profile a J2EE project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
+        <antcall target="-do-profile"/>
+    </target>
+    <target depends="-profile-test-single-pre72" name="profile-test-single"/>
+    <target depends="-profile-check" if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs.agent">
+        <startprofiler/>
+        <antcall target="test-single"/>
+    </target>
+    <target if="profiler.loadgen.path" name="-profile-start-loadgen">
+        <loadgenstart path="${profiler.loadgen.path}"/>
+    </target>
+    <!--
+                JAVADOC SECTION
+            -->
+    <target depends="init" if="have.sources" name="javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}:${j2ee.platform.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+            </fileset>
+        </javadoc>
+        <copy todir="${dist.javadoc.dir}">
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/doc-files/**"/>
+            </fileset>
+        </copy>
+    </target>
+    <target depends="init,javadoc-build" if="netbeans.home" name="javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,javadoc-build,javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                
+                TEST COMPILATION SECTION
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+        <property name="j2ee.platform.embeddableejb.classpath" value=""/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test" if="have.tests" name="-do-compile-test">
+        <webproject2:javac classpath="${javac.test.classpath}:${j2ee.platform.classpath}:${j2ee.platform.embeddableejb.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <webproject2:javac classpath="${javac.test.classpath}:${j2ee.platform.classpath}:${j2ee.platform.embeddableejb.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                
+                TEST EXECUTION SECTION
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <webproject2:test includes="${includes}" testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <webproject2:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
+        <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <webproject2:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
+    <!--
+                
+                TEST DEBUGGING SECTION
+            -->
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <webproject2:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <webproject2:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <webproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <webproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                
+                CLEANUP SECTION
+            -->
+    <target depends="init" name="deps-clean" unless="no.deps"/>
+    <target depends="init" name="do-clean">
+        <condition property="build.dir.to.clean" value="${build.web.dir}">
+            <isset property="dist.ear.dir"/>
+        </condition>
+        <property name="build.dir.to.clean" value="${build.web.dir}"/>
+        <delete includeEmptyDirs="true" quiet="true">
+            <fileset dir="${build.dir.to.clean}/WEB-INF/lib"/>
+        </delete>
+        <delete dir="${build.dir}"/>
+        <available file="${build.dir.to.clean}/WEB-INF/lib" property="status.clean-failed" type="dir"/>
+        <delete dir="${dist.dir}"/>
+    </target>
+    <target depends="do-clean" if="status.clean-failed" name="check-clean">
+        <echo message="Warning: unable to delete some files in ${build.web.dir}/WEB-INF/lib - they are probably locked by the J2EE server. "/>
+        <echo level="info" message="To delete all files undeploy the module from Server Registry in Runtime tab and then use Clean again."/>
+    </target>
+    <target depends="init" if="netbeans.home" name="undeploy-clean">
+        <nbundeploy failOnError="false" startServer="false"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,undeploy-clean,deps-clean,do-clean,check-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target depends="clean" description="Clean build products." name="clean-ear"/>
+</project>
diff --git a/src/java/DmWebPortal/nbproject/faces-config.NavData b/src/java/DmWebPortal/nbproject/faces-config.NavData
new file mode 100644
index 0000000000000000000000000000000000000000..298bfc50a82fc997caae5cb3a3a53656c24b7570
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/faces-config.NavData
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scene Scope="Project" version="2">
+    <Scope Scope="Faces Configuration Only"/>
+    <Scope Scope="Project"/>
+    <Scope Scope="All Faces Configurations"/>
+</Scene>
diff --git a/src/java/DmWebPortal/nbproject/genfiles.properties b/src/java/DmWebPortal/nbproject/genfiles.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9771f8323d27e86d54fc9269d990650dff68ecd5
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=c0fb0cc8
+build.xml.script.CRC32=6f54d92a
+build.xml.stylesheet.CRC32=651128d4@1.77.1.1
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=c0fb0cc8
+nbproject/build-impl.xml.script.CRC32=e39d2e9b
+nbproject/build-impl.xml.stylesheet.CRC32=99ea4b56@1.77.1.1
diff --git a/src/java/DmWebPortal/nbproject/private/.svnignore b/src/java/DmWebPortal/nbproject/private/.svnignore
new file mode 100644
index 0000000000000000000000000000000000000000..2963c1cfca7f43d71b6f86e0d189bae649897e69
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/private/.svnignore
@@ -0,0 +1,2 @@
+private.properties
+private.xml
diff --git a/src/java/DmWebPortal/nbproject/private/private.properties b/src/java/DmWebPortal/nbproject/private/private.properties
new file mode 100644
index 0000000000000000000000000000000000000000..817c2c02d8d510c68178e339cc16cfc4ebf03ca8
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/private/private.properties
@@ -0,0 +1,10 @@
+deploy.ant.properties.file=/home/sveseli/.netbeans/8.2/config/GlassFishEE6/Properties/gfv3-334529135.properties
+j2ee.platform.is.jsr109=true
+j2ee.server.domain=/home/sveseli/Work/netbeans/glassfish-4.1.1/glassfish/domains/domain1
+j2ee.server.home=/home/sveseli/Work/netbeans/glassfish-4.1.1/glassfish
+j2ee.server.instance=[/home/sveseli/Work/netbeans/glassfish-4.1.1/glassfish:/home/sveseli/Work/netbeans/glassfish-4.1.1/glassfish/domains/domain1]deployer:gfv3ee6wc:localhost:4848
+j2ee.server.middleware=/home/sveseli/Work/netbeans/glassfish-4.1.1
+javac.debug=true
+javadoc.preview=true
+selected.browser=default
+user.properties.file=/home/sveseli/.netbeans/8.2/build.properties
diff --git a/src/java/DmWebPortal/nbproject/private/private.properties.generic.build b/src/java/DmWebPortal/nbproject/private/private.properties.generic.build
new file mode 100644
index 0000000000000000000000000000000000000000..0197b3338d1e3d180d92629b35112ec2cb78542d
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/private/private.properties.generic.build
@@ -0,0 +1,2 @@
+j2ee.server.home=DM_GLASSFISH_DIR/glassfish
+j2ee.server.middleware=DM_GLASSFISH_DIR
diff --git a/src/java/DmWebPortal/nbproject/private/private.xml b/src/java/DmWebPortal/nbproject/private/private.xml
new file mode 100644
index 0000000000000000000000000000000000000000..718d5b5ac4219ad2928dad9082f3f0fa7c22101c
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/private/private.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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:/home/sveseli/Work/DM/dev/src/java/DmWebPortal/web/index.xhtml</file>
+        </group>
+    </open-files>
+</project-private>
diff --git a/src/java/DmWebPortal/nbproject/project.properties b/src/java/DmWebPortal/nbproject/project.properties
new file mode 100644
index 0000000000000000000000000000000000000000..493a88077352f0e2f208f03d4306b2a6c1e1b623
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/project.properties
@@ -0,0 +1,107 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=true
+annotation.processing.processor.options=-Aeclipselink.canonicalmodel.use_static_factory=false
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+auxiliary.org-netbeans-modules-projectapi.jsf_2e_language=Facelets
+auxiliary.org-netbeans-modules-web-clientproject-api.js_2e_libs_2e_folder=js/libs
+build.classes.dir=${build.web.dir}/WEB-INF/classes
+build.classes.excludes=**/*.java,**/*.form
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+build.web.dir=${build.dir}/web
+build.web.excludes=${build.classes.excludes}
+client.urlPart=
+compile.jsps=false
+conf.dir=${source.root}/conf
+debug.classpath=${build.classes.dir}:${javac.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+display.browser=true
+# Files to be excluded from distribution war
+dist.archive.excludes=
+dist.dir=dist
+dist.ear.war=${dist.dir}/${war.ear.name}
+dist.javadoc.dir=${dist.dir}/javadoc
+dist.war=${dist.dir}/${war.name}
+endorsed.classpath=\
+    ${libs.javaee-endorsed-api-7.0.classpath}
+excludes=
+file.reference.gson-2.3.1.jar=lib/gson-2.3.1.jar
+file.reference.itext-2.1.7.jar=lib/itext-2.1.7.jar
+file.reference.log4j-1.2.17.jar=lib/log4j-1.2.17.jar
+file.reference.org-netbeans-modules-java-j2seproject-copylibstask.jar=lib/org-netbeans-modules-java-j2seproject-copylibstask.jar
+file.reference.poi-3.10.jar=lib/poi-3.10.jar
+file.reference.postgresql-9.3-1102.jdbc41.jar=lib/postgresql-9.3-1102.jdbc41.jar
+file.reference.primefaces-6.0.jar=lib/primefaces-6.0.jar
+includes=**
+j2ee.compile.on.save=true
+j2ee.copy.static.files.on.save=true
+j2ee.deploy.on.save=true
+j2ee.platform=1.7-web
+j2ee.platform.classpath=${j2ee.server.home}/modules/endorsed/javax.annotation-api.jar:${j2ee.server.home}/modules/endorsed/jaxb-api.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/javax.inject.jar:${j2ee.server.home}/modules/javax.servlet.jsp-api.jar:${j2ee.server.home}/modules/javax.batch-api.jar:${j2ee.server.home}/modules/javax.json.jar:${j2ee.server.home}/modules/javax.security.jacc-api.jar:${j2ee.server.home}/modules/javax.enterprise.concurrent-api.jar:${j2ee.server.home}/modules/bean-validator.jar:${j2ee.server.home}/modules/javax.jms-api.jar:${j2ee.server.home}/modules/javax.el.jar:${j2ee.server.home}/modules/javax.ejb-api.jar:${j2ee.server.home}/modules/javax.transaction-api.jar:${j2ee.server.home}/modules/javax.ws.rs-api.jar:${j2ee.server.home}/modules/weld-osgi-bundle.jar:${j2ee.server.home}/modules/javax.faces.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jstl-api.jar:${j2ee.server.home}/modules/javax.servlet-api.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jstl.jar:${j2ee.server.home}/modules/javax.resource-api.jar:${j2ee.server.home}/modules/javax.mail.jar:${j2ee.server.home}/modules/javax.enterprise.concurrent.jar:${j2ee.server.home}/modules/javax.xml.registry-api.jar:${j2ee.server.home}/modules/javax.persistence.jar:${j2ee.server.home}/modules/javax.management.j2ee-api.jar:${j2ee.server.home}/modules/javax.websocket-api.jar:${j2ee.server.home}/modules/javax.xml.rpc-api.jar:${j2ee.server.home}/modules/javax.enterprise.deploy-api.jar:${j2ee.server.home}/modules/cdi-api.jar:${j2ee.server.home}/modules/webservices-osgi.jar:${j2ee.server.home}/modules/javax.interceptor-api.jar:${j2ee.server.home}/modules/javax.security.auth.message-api.jar:${j2ee.server.home}/modules/jaxb-osgi.jar:${j2ee.server.middleware}/mq/lib/jaxm-api.jar
+j2ee.platform.embeddableejb.classpath=${j2ee.server.home}/lib/embedded/glassfish-embedded-static-shell.jar
+j2ee.platform.wscompile.classpath=${j2ee.server.home}/modules/webservices-osgi.jar
+j2ee.platform.wsgen.classpath=${j2ee.server.home}/modules/webservices-osgi.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/jaxb-osgi.jar:${j2ee.server.home}/modules/endorsed/jaxb-api.jar
+j2ee.platform.wsimport.classpath=${j2ee.server.home}/modules/webservices-osgi.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/jaxb-osgi.jar:${j2ee.server.home}/modules/endorsed/jaxb-api.jar
+j2ee.platform.wsit.classpath=
+j2ee.server.type=gfv3ee6
+jar.compress=false
+javac.classpath=\
+    ${file.reference.gson-2.3.1.jar}:\
+    ${file.reference.itext-2.1.7.jar}:\
+    ${file.reference.log4j-1.2.17.jar}:\
+    ${file.reference.postgresql-9.3-1102.jdbc41.jar}:\
+    ${file.reference.org-netbeans-modules-java-j2seproject-copylibstask.jar}:\
+    ${file.reference.poi-3.10.jar}:\
+    ${file.reference.primefaces-6.0.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.debug=true
+javac.deprecation=false
+javac.processorpath=\
+    ${javac.classpath}:\
+    ${libs.eclipselink.classpath}:\
+    ${libs.eclipselinkmodelgen.classpath}
+javac.source=1.8
+javac.target=1.8
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+javac.test.processorpath=\
+    ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.preview=true
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+lib.dir=${web.docbase.dir}/WEB-INF/lib
+persistence.xml.dir=${conf.dir}
+platform.active=default_platform
+resource.dir=setup
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+# Space-separated list of JVM arguments used when running a class with a main method or a unit test
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value):
+runmain.jvmargs=
+source.encoding=UTF-8
+source.root=src
+src.dir=${source.root}/java
+test.src.dir=test
+war.content.additional=
+war.ear.name=${war.name}
+war.name=DmWebPortal.war
+web.docbase.dir=web
+webinf.dir=web/WEB-INF
diff --git a/src/java/DmWebPortal/nbproject/project.xml b/src/java/DmWebPortal/nbproject/project.xml
new file mode 100644
index 0000000000000000000000000000000000000000..710c25d17160a3614ef219a3f5565f6f45ffa44d
--- /dev/null
+++ b/src/java/DmWebPortal/nbproject/project.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.web.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/web-project/3">
+            <name>DmWebPortal</name>
+            <minimum-ant-version>1.6.5</minimum-ant-version>
+            <web-module-libraries>
+                <library dirs="200">
+                    <file>${file.reference.gson-2.3.1.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+                <library dirs="200">
+                    <file>${file.reference.itext-2.1.7.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+                <library dirs="200">
+                    <file>${file.reference.log4j-1.2.17.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+                <library dirs="200">
+                    <file>${file.reference.postgresql-9.3-1102.jdbc41.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+                <library dirs="200">
+                    <file>${file.reference.org-netbeans-modules-java-j2seproject-copylibstask.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+                <library dirs="200">
+                    <file>${file.reference.poi-3.10.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+                <library dirs="200">
+                    <file>${file.reference.primefaces-6.0.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
+            </web-module-libraries>
+            <web-module-additional-libraries/>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+        <libraries xmlns="http://www.netbeans.org/ns/ant-project-libraries/1">
+            <definitions>./lib/nblibraries.properties</definitions>
+        </libraries>
+        <libraries xmlns="http://www.netbeans.org/ns/cdnjs-libraries/1"/>
+    </configuration>
+</project>
diff --git a/src/java/DmWebPortal/setup/glassfish-resources.xml.template b/src/java/DmWebPortal/setup/glassfish-resources.xml.template
new file mode 100644
index 0000000000000000000000000000000000000000..83f76c7866cf73780fd5cfd463f87de575792e52
--- /dev/null
+++ b/src/java/DmWebPortal/setup/glassfish-resources.xml.template
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
+<resources>
+    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.postgresql.ds.PGSimpleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="postgresql_dm_DbPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
+        <property name="serverName" value="localhost"/>
+        <property name="portNumber" value="11136"/>
+        <property name="databaseName" value="dm"/>
+        <property name="User" value="dm"/>
+        <property name="Password" value="DM_DB_PASSWORD"/>
+        <property name="URL" value="jdbc:postgresql://localhost:11136/dm"/>
+        <property name="driverClass" value="org.postgresql.Driver"/>
+    </jdbc-connection-pool>
+    <jdbc-resource enabled="true" jndi-name="dm_DataSource" object-type="user" pool-name="postgresql_dm_DbPool"/>
+</resources>
diff --git a/src/java/DmWebPortal/src/conf/MANIFEST.MF b/src/java/DmWebPortal/src/conf/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..59499bce4a2bd51cba227b7c00fcf745b19c95a4
--- /dev/null
+++ b/src/java/DmWebPortal/src/conf/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/src/java/DmWebPortal/src/conf/persistence.xml b/src/java/DmWebPortal/src/conf/persistence.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6ed5232894944ed3235354d78c056f4861ec226e
--- /dev/null
+++ b/src/java/DmWebPortal/src/conf/persistence.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+  <persistence-unit name="DmWebPortalPU" transaction-type="JTA">
+    <jta-data-source>dm_DataSource</jta-data-source>
+    <exclude-unlisted-classes>false</exclude-unlisted-classes>
+    <properties/>
+  </persistence-unit>
+</persistence>
diff --git a/src/java/DmWebPortal/src/java/dm.portal.properties b/src/java/DmWebPortal/src/java/dm.portal.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ffee7ae6acc58f319435f9f147e541b384253c45
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/dm.portal.properties
@@ -0,0 +1,10 @@
+# 'USERNAME' string will be replaced by the actual username
+# dm.portal.ldapUrl=ldaps://phoebusldap.aps.anl.gov:636
+# dm.portal.ldapDnString=uid=USERNAME,ou=people,o=aps.anl.gov,dc=aps,dc=anl,dc=gov
+
+dm.portal.ldapUrl=ldaps://dmid-vm.xray.aps.anl.gov:636
+dm.portal.ldapDnString=uid=USERNAME,ou=DM,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov
+
+dm.dsWebService.url=https://xstor-devel:22236/dm
+dm.system.user=dm
+dm.system.passwordFile=DM_INSTALL_DIR/etc/DM_SYSTEM_USER.system.passwd
\ No newline at end of file
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/DmRestApi.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/DmRestApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..f83e55f310de23de2904e77510249c6b7c646e2b
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/DmRestApi.java
@@ -0,0 +1,776 @@
+package gov.anl.aps.dm.api;
+
+import gov.anl.aps.dm.common.constants.DmHttpHeader;
+import gov.anl.aps.dm.common.constants.DmProperty;
+import gov.anl.aps.dm.common.constants.DmRole;
+import gov.anl.aps.dm.common.constants.DmServiceProtocol;
+import gov.anl.aps.dm.common.exceptions.AuthorizationError;
+import gov.anl.aps.dm.common.exceptions.CommunicationError;
+import gov.anl.aps.dm.common.exceptions.ConfigurationError;
+import gov.anl.aps.dm.common.exceptions.InvalidArgument;
+import gov.anl.aps.dm.common.exceptions.InvalidSession;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import gov.anl.aps.dm.common.exceptions.DmExceptionFactory;
+import gov.anl.aps.dm.common.utilities.NoServerVerificationSSLSocketFactory;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.ConnectException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.net.ssl.HttpsURLConnection;
+import org.apache.log4j.Logger;
+
+/**
+ * DM REST Web Service API class.
+ *
+ * This class serves as superclass for all DM web service interface classes. It
+ * handles basic communication with web service (establishing sessions, sending
+ * requests, receiving responses, generating exceptions, etc.).
+ */
+public class DmRestApi {
+
+    /**
+     * Relative path for login requests.
+     */
+    public static final String LOGIN_REQUEST_URL = "/login";
+
+    private static final String DefaultSessionId = "defaultSession";
+
+    private static final boolean httpsInitialized = initializeHttpsConnection();    
+    private static final Logger logger = Logger.getLogger(DmRestApi.class.getName());
+
+    private static boolean initializeHttpsConnection() {
+        HttpsURLConnection.setDefaultSSLSocketFactory(new NoServerVerificationSSLSocketFactory());
+        return true;
+    }
+
+    private URL serviceUrl;
+    private DmSession session = new DmSession();
+    private String loginUsername;
+    private String loginPassword;
+
+    /**
+     * Constructor.
+     *
+     * Initializes web service URL from system properties.
+     *
+     * @throws ConfigurationError if web service URL property is malformed or
+     * null
+     */
+    public DmRestApi() throws ConfigurationError {
+        configureFromProperties();
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param webServiceUrl web service URL
+     * @throws ConfigurationError if web service URL is malformed or null
+     */
+    public DmRestApi(String webServiceUrl) throws ConfigurationError {
+        configureFromString(webServiceUrl);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param webServiceUrl web service URL
+     * @param loginUsername login username
+     * @param loginPassword login password
+     * @throws ConfigurationError if web service URL is malformed or null
+     */
+    public DmRestApi(String webServiceUrl, String loginUsername, String loginPassword) throws ConfigurationError {
+        configureFromString(webServiceUrl);
+        this.loginUsername = loginUsername;
+        this.loginPassword = loginPassword;
+    }
+    
+    /**
+     * Configure web service URL from Java VM properties.
+     *
+     * @throws ConfigurationError if web service URL property is malformed or
+     * null
+     */
+    public final void configureFromProperties() throws ConfigurationError {
+        String webServiceUrl = System.getProperty(DmProperty.DS_WEB_SERVICE_URL_PROPERTY_NAME);
+        configureFromString(webServiceUrl);
+    }
+
+    /**
+     * Configure web service URL from string.
+     *
+     * @param webServiceUrl web service URL
+     * @throws ConfigurationError if web service URL property is malformed or
+     * null
+     */
+    public final void configureFromString(String webServiceUrl) throws ConfigurationError {
+        if (webServiceUrl == null) {
+            throw new ConfigurationError("DM web service url is not specified.");
+        }
+        try {
+            serviceUrl = new URL(webServiceUrl);
+        } catch (MalformedURLException ex) {
+            throw new ConfigurationError("Malformed DM web service url: " + webServiceUrl);
+        }
+
+        DmServiceProtocol protocol = DmServiceProtocol.fromString(serviceUrl.getProtocol());
+        if (protocol == null) {
+            throw new ConfigurationError("Unsupported service protocol specified in " + webServiceUrl);
+        }
+    }
+
+    public void setLoginUsername(String loginUsername) {
+        this.loginUsername = loginUsername;
+    }
+
+    public void setLoginPassword(String loginPassword) {
+        this.loginPassword = loginPassword;
+    }
+    
+    public URL getServiceUrl() {
+        return serviceUrl;
+    }
+
+    public DmSession getSession() {
+        return session;
+    }
+
+    public void setSession(DmSession session) {
+        this.session = session;
+    }
+
+    /**
+     * Check HTTP response for exceptions.
+     *
+     * @param connection HTTP connection
+     * @throws DmException when DM error is detected
+     */
+    public static void checkHttpResponseForDmException(HttpURLConnection connection) throws DmException {
+        String exceptionType = connection.getHeaderField(DmHttpHeader.DM_EXCEPTION_TYPE_HEADER);
+        if (exceptionType != null) {
+            String statusMessage = connection.getHeaderField(DmHttpHeader.DM_STATUS_MESSAGE_HEADER);
+            String statusCode = connection.getHeaderField(DmHttpHeader.DM_STATUS_CODE_HEADER);
+            int code = Integer.parseInt(statusCode);
+            DmExceptionFactory.throwDmException(exceptionType, code, statusMessage);
+        }
+    }
+
+    /**
+     * Convert HTTP error for exceptions.
+     *
+     * @param httpError HTTP error
+     * @param connection HTTP connection
+     * @return generated DM exception
+     */
+    public static DmException convertHttpErrorToDmException(Exception httpError, HttpURLConnection connection) {
+        String exceptionType = connection.getHeaderField(DmHttpHeader.DM_EXCEPTION_TYPE_HEADER);
+        if (exceptionType != null) {
+            String statusMessage = connection.getHeaderField(DmHttpHeader.DM_STATUS_MESSAGE_HEADER);
+            String statusCode = connection.getHeaderField(DmHttpHeader.DM_STATUS_CODE_HEADER);
+            int code = Integer.parseInt(statusCode);
+            return DmExceptionFactory.generateDmException(exceptionType, code, statusMessage);
+        } else {
+            return new DmException(httpError);
+        }
+    }
+
+    /**
+     * Get full request URL.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @return full request URL string, e.g. http://localhost:17524/dm/object
+     */
+    public String getFullRequestUrl(String requestUrl) {
+        String url = serviceUrl + requestUrl;
+        return url;
+    }
+
+    /**
+     * Verify session cookie.
+     *
+     * @return session cookie
+     * @throws InvalidSession if session cookie is expired or null
+     */
+    public String verifySessionCookie() throws InvalidSession {
+        return session.verifyCookie();
+    }
+
+    /*
+     * Get all response headers in a single string.
+     *
+     * @param connection HTTP connection 
+     * @return string containing response headers
+     */
+    private static String getResponseHeaders(HttpURLConnection connection) {
+        String headerString = "";
+        Map<String, List<String>> headerMap = connection.getHeaderFields();
+        for (String key : headerMap.keySet()) {
+            List<String> values = headerMap.get(key);
+            headerString += key + ": " + values + "\n";
+        }
+        return headerString;
+    }
+
+    /**
+     * Prepare post data.
+     *
+     * @param data key/value data map
+     * @return string suitable for HTTP post request
+     * @throws InvalidArgument in case of invalid input data
+     */
+    public static String preparePostData(Map<String, String> data) throws InvalidArgument {
+        try {
+            String postData = "";
+            String separator = "";
+            for (String key : data.keySet()) {
+                postData += separator + key + "=" + URLEncoder.encode(data.get(key), "UTF8");
+                separator = "&";
+            }
+            return postData;
+        } catch (UnsupportedEncodingException ex) {
+            logger.error("Invalid argument: " + ex);
+            throw new InvalidArgument(ex);
+        }
+    }
+
+    /**
+     * Update session cookie from connection's HTTP headers.
+     *
+     * @param connection HTTP connection
+     */
+    private void updateSessionCookie(HttpURLConnection connection) {
+        String cookie = connection.getHeaderField(DmHttpHeader.DM_SET_COOKIE_HEADER);
+        if (cookie != null) {
+            session.setCookie(cookie);
+            logger.debug("Updated session cookie: " + cookie);
+        }
+        String sessionRole = connection.getHeaderField(DmHttpHeader.DM_SESSION_ROLE_HEADER);
+        if (sessionRole != null) {
+            session.setRole(DmRole.fromString(sessionRole));
+            logger.debug("Updated session role: " + sessionRole);
+        }
+    }
+
+    /**
+     * Send post data.
+     *
+     * @param data key/value data map
+     * @param connection HTTP connection
+     * @throws InvalidArgument in case there is a problem with post data
+     * @throws DmException in case of any other error
+     */
+    private static void sendPostData(Map<String, String> data, HttpURLConnection connection) throws InvalidArgument, DmException {
+        String postData = preparePostData(data);
+        try (DataOutputStream dos = new DataOutputStream(connection.getOutputStream())) {
+            dos.writeBytes(postData);
+            dos.flush();
+        } catch (IOException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Read HTTP response.
+     *
+     * @param connection HTTP connection
+     * @return HTTP response as a string
+     * @throws DmException in case of any errors
+     */
+    private static String readHttpResponse(HttpURLConnection connection) throws DmException {
+        try {
+            BufferedReader br = new BufferedReader(new InputStreamReader(
+                    (connection.getInputStream())));
+            StringBuilder sb = new StringBuilder();
+            String output;
+            while ((output = br.readLine()) != null) {
+                sb.append(output);
+                sb.append('\n');
+            }
+            return sb.toString();
+        } catch (IOException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Set session cookie in the request headers.
+     *
+     * @param connection HTTP connection
+     * @param sessionCookie session cookie (may be null)
+     */
+    private static void setCookieRequestHeader(HttpURLConnection connection, String sessionCookie) {
+        if (sessionCookie != null) {
+            connection.setRequestProperty("Cookie", sessionCookie);
+            logger.debug("Setting session cookie to: " + sessionCookie);
+        }
+    }
+
+    /**
+     * Set common POST request headers plus session cookie.
+     *
+     * @param connection HTTP connection
+     * @param sessionCookie session cookie (may be null)
+     * @throws DmException in case of any errors
+     */
+    private static void setPostRequestHeaders(HttpURLConnection connection, String sessionCookie) throws DmException {
+        setPostRequestHeaders(connection);
+        setCookieRequestHeader(connection, sessionCookie);
+    }
+
+    /**
+     * Set common POST request headers.
+     *
+     * @param connection HTTP connection
+     * @throws DmException in case of any errors
+     */
+    private static void setPostRequestHeaders(HttpURLConnection connection) throws DmException {
+        try {
+            connection.setDoOutput(true);
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        } catch (ProtocolException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Set common GET request headers plus session cookie.
+     *
+     * @param connection HTTP connection
+     * @param sessionCookie session cookie (may be null)
+     * @throws DmException in case of any errors
+     */
+    private static void setGetRequestHeaders(HttpURLConnection connection, String sessionCookie) throws DmException {
+        setGetRequestHeaders(connection);
+        setCookieRequestHeader(connection, sessionCookie);
+    }
+
+    /**
+     * Set common GET request headers.
+     *
+     * @param connection HTTP connection
+     * @throws DmException in case of any errors
+     */
+    private static void setGetRequestHeaders(HttpURLConnection connection) throws DmException {
+        try {
+            connection.setRequestMethod("GET");
+        } catch (ProtocolException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Set common PUT request headers plus session cookie.
+     *
+     * @param connection HTTP connection
+     * @param sessionCookie session cookie (may be null)
+     * @throws DmException in case of any errors
+     */
+    private static void setPutRequestHeaders(HttpURLConnection connection, String sessionCookie) throws DmException {
+        setPutRequestHeaders(connection);
+        setCookieRequestHeader(connection, sessionCookie);
+    }
+
+    /**
+     * Set common PUT request headers.
+     *
+     * @param connection HTTP connection
+     * @throws DmException in case of any errors
+     */
+    private static void setPutRequestHeaders(HttpURLConnection connection) throws DmException {
+        try {
+            connection.setDoOutput(true);
+            connection.setRequestMethod("PUT");
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        } catch (ProtocolException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Set common DELETE request headers plus session cookie.
+     *
+     * @param connection HTTP connection
+     * @param sessionCookie session cookie (may be null)
+     * @throws DmException in case of any errors
+     */
+    private static void setDeleteRequestHeaders(HttpURLConnection connection, String sessionCookie) throws DmException {
+        setDeleteRequestHeaders(connection);
+        setCookieRequestHeader(connection, sessionCookie);
+    }
+
+    /**
+     * Set common DELETE request headers.
+     *
+     * @param connection HTTP connection
+     * @throws DmException in case of any errors
+     */
+    private static void setDeleteRequestHeaders(HttpURLConnection connection) throws DmException {
+        try {
+            connection.setRequestMethod("DELETE");
+        } catch (ProtocolException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Login with a given username and password, and with specified session id.
+     *
+     * @param username username
+     * @param password password
+     * @param sessionId session id, can be null
+     * @throws AuthorizationError in case of incorrect username or password
+     * @throws CommunicationError in case service cannot be contacted
+     * @throws DmException in case of any other errors
+     */
+    public void login(String username, String password, String sessionId) throws DmException {
+        HttpURLConnection connection = null;
+        try {
+            String urlString = getFullRequestUrl(LOGIN_REQUEST_URL);
+            URL url = new URL(urlString);
+            connection = (HttpURLConnection) url.openConnection();
+            setPostRequestHeaders(connection);
+            HashMap<String, String> loginData = new HashMap<>();
+            loginData.put("username", username);
+            loginData.put("password", password);
+
+            logger.debug("Establishing session for user: " + username);
+            logger.debug("Service URL: " + serviceUrl);
+            sendPostData(loginData, connection);
+            checkHttpResponseForDmException(connection);
+            session.setUsername(username);
+            session.setId(sessionId);
+            updateSessionCookie(connection);
+        } catch (ConnectException ex) {
+            String errorMsg = "Cannot connect to " + getServiceUrl();
+            logger.error(errorMsg);
+            throw new CommunicationError(errorMsg, ex);
+        } catch (DmException ex) {
+            logger.error(ex);
+            throw ex;
+        } catch (IOException ex) {
+            logger.error(ex);
+            throw new DmException(ex);
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+
+    }
+
+    /**
+     * Login with a given username and password.
+     *
+     * @param username username
+     * @param password password
+     * @throws AuthorizationError in case of incorrect username or password
+     * @throws CommunicationError in case service cannot be contacted
+     * @throws DmException in case of any other errors
+     */
+    public void login(String username, String password) throws DmException {
+        login(username, password, DefaultSessionId);
+    }
+
+    /**
+     * Invoke GET request with login.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String loginAndInvokeSessionGetRequest(String requestUrl) throws DmException {
+        try {
+            // If we have session, simply invoke request.
+            session.verifyCookie();
+            return invokeSessionGetRequest(requestUrl);
+        } catch (InvalidSession ex) {
+            // Session was invalidated, login and try again
+        }
+        login(loginUsername, loginPassword);
+        return invokeSessionGetRequest(requestUrl);
+    }
+     
+    /**
+     * Invoke GET request.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String invokeSessionGetRequest(String requestUrl) throws DmException {
+        String urlString = getFullRequestUrl(requestUrl);
+        HttpURLConnection connection = null;
+        try {
+            logger.debug("Invoking session get request for URL: " + requestUrl);
+            String sessionCookie = session.verifyCookie();
+            URL url = new URL(urlString);
+            connection = (HttpURLConnection) url.openConnection();
+
+            setGetRequestHeaders(connection, sessionCookie);
+            updateSessionCookie(connection);
+            checkHttpResponseForDmException(connection);
+            logger.debug("Response message:\n" + connection.getResponseMessage());
+            return readHttpResponse(connection);
+        } catch (DmException ex) {
+            throw ex;
+        } catch (ConnectException ex) {
+            String errorMsg = "Cannot connect to " + getServiceUrl();
+            logger.error(errorMsg);
+            throw new CommunicationError(errorMsg, ex);
+        } catch (IOException ex) {
+            DmException dmException = convertHttpErrorToDmException(ex, connection);
+            logger.error(ex.getMessage());
+            throw dmException;
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+    /**
+     * Invoke GET request.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String invokeGetRequest(String requestUrl) throws DmException {
+        String urlString = getFullRequestUrl(requestUrl);
+        HttpURLConnection connection = null;
+        try {
+            logger.debug("Invoking get request for URL: " + requestUrl);
+            URL url = new URL(urlString);
+            connection = (HttpURLConnection) url.openConnection();
+            updateSessionCookie(connection);
+            checkHttpResponseForDmException(connection);
+            logger.debug("Response message:\n" + connection.getResponseMessage());
+            return readHttpResponse(connection);
+        } catch (DmException ex) {
+            throw ex;
+        } catch (ConnectException ex) {
+            String errorMsg = "Cannot connect to " + getServiceUrl();
+            logger.error(errorMsg);
+            throw new CommunicationError(errorMsg, ex);
+        } catch (IOException ex) {
+            DmException dmException = convertHttpErrorToDmException(ex, connection);
+            logger.error(ex.getMessage());
+            throw dmException;
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+    /**
+     * Invoke POST request with login.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @param data request data
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String loginAndInvokeSessionPostRequest(String requestUrl, Map<String, String> data) throws DmException {
+        try {
+            // If we have session, simply invoke request.
+            session.verifyCookie();
+            return invokeSessionPostRequest(requestUrl, data);
+        } catch (InvalidSession ex) {
+            // Session was invalidated, login and try again
+        }
+        login(loginUsername, loginPassword);
+        return invokeSessionPostRequest(requestUrl, data);
+    }
+    
+    /**
+     * Invoke POST request.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @param data request data
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String invokeSessionPostRequest(String requestUrl, Map<String, String> data) throws DmException {
+        String urlString = getFullRequestUrl(requestUrl);
+        HttpURLConnection connection = null;
+        try {
+            logger.debug("Invoking session post request for URL: " + requestUrl);
+            String sessionCookie = session.verifyCookie();
+            URL url = new URL(urlString);
+            connection = (HttpURLConnection) url.openConnection();
+
+            setPostRequestHeaders(connection, sessionCookie);
+            sendPostData(data, connection);
+            updateSessionCookie(connection);
+            checkHttpResponseForDmException(connection);
+            logger.debug("Response message:\n" + connection.getResponseMessage());
+            return readHttpResponse(connection);
+        } catch (DmException ex) {
+            throw ex;
+        } catch (ConnectException ex) {
+            String errorMsg = "Cannot connect to " + getServiceUrl();
+            logger.error(errorMsg);
+            throw new CommunicationError(errorMsg, ex);
+        } catch (IOException ex) {
+            DmException dmException = convertHttpErrorToDmException(ex, connection);
+            logger.error(ex.getMessage());
+            throw dmException;
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+    /**
+     * Invoke PUT request with login.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @param data request data
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String loginAndInvokeSessionPutRequest(String requestUrl, Map<String, String> data) throws DmException {
+        try {
+            // If we have session, simply invoke request.
+            session.verifyCookie();
+            return invokeSessionPutRequest(requestUrl, data);
+        } catch (InvalidSession ex) {
+            // Session was invalidated, login and try again
+        }
+        login(loginUsername, loginPassword);
+        return invokeSessionPutRequest(requestUrl, data);
+    }
+    
+    /**
+     * Invoke PUT request.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @param data request data
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String invokeSessionPutRequest(String requestUrl, Map<String, String> data) throws DmException {
+        String urlString = getFullRequestUrl(requestUrl);
+        HttpURLConnection connection = null;
+        try {
+            logger.debug("Invoking session put request for URL: " + requestUrl);
+            String sessionCookie = session.verifyCookie();
+            URL url = new URL(urlString);
+            connection = (HttpURLConnection) url.openConnection();
+
+            setPutRequestHeaders(connection, sessionCookie);
+            sendPostData(data, connection);
+            updateSessionCookie(connection);
+            checkHttpResponseForDmException(connection);
+            logger.debug("Response message:\n" + connection.getResponseMessage());
+            return readHttpResponse(connection);
+        } catch (DmException ex) {
+            throw ex;
+        } catch (ConnectException ex) {
+            String errorMsg = "Cannot connect to " + getServiceUrl();
+            logger.error(errorMsg);
+            throw new CommunicationError(errorMsg, ex);
+        } catch (IOException ex) {
+            DmException dmException = convertHttpErrorToDmException(ex, connection);
+            logger.error(ex.getMessage());
+            throw dmException;
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+    /**
+     * Invoke DELETE request with login.
+     *
+     * @param requestUrl relative request path, e.g. /object
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String loginAndInvokeSessionDeleteRequest(String requestUrl) throws DmException {
+        try {
+            // If we have session, simply invoke request.
+            session.verifyCookie();
+            return invokeSessionDeleteRequest(requestUrl);
+        } catch (InvalidSession ex) {
+            // Session was invalidated, login and try again
+        }
+        login(loginUsername, loginPassword);
+        return invokeSessionDeleteRequest(requestUrl);
+    }
+    
+    /**
+     * Invoke DELETE request.
+     *
+     * @param requestUrl relative request path, e.g. /dm/object
+     * @return service response string
+     * @throws DmException in case of any errors
+     */
+    public String invokeSessionDeleteRequest(String requestUrl) throws DmException {
+        String urlString = getFullRequestUrl(requestUrl);
+        HttpURLConnection connection = null;
+        try {
+            logger.debug("Invoking session post request for URL: " + requestUrl);
+            String sessionCookie = session.verifyCookie();
+            URL url = new URL(urlString);
+            connection = (HttpURLConnection) url.openConnection();
+
+            setDeleteRequestHeaders(connection, sessionCookie);
+            updateSessionCookie(connection);
+            checkHttpResponseForDmException(connection);
+            logger.debug("Response message:\n" + connection.getResponseMessage());
+            return readHttpResponse(connection);
+        } catch (DmException ex) {
+            throw ex;
+        } catch (ConnectException ex) {
+            String errorMsg = "Cannot connect to " + getServiceUrl();
+            logger.error(errorMsg);
+            throw new CommunicationError(errorMsg, ex);
+        } catch (IOException ex) {
+            DmException dmException = convertHttpErrorToDmException(ex, connection);
+            logger.error(ex.getMessage());
+            throw dmException;
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+    }
+
+
+    /*
+     * Main method, used for simple testing.
+     *
+     * @param args main arguments
+     */
+    public static void main(String[] args) {
+        try {
+            DmRestApi client = new DmRestApi("http://zagreb.svdev.net:10232/dm");
+            //client.login("sveseli", "sveseli");
+            HashMap<String, String> data = new HashMap<>();
+            //data.put("parentDirectory", "/");
+            client.invokeGetRequest("/experiment/e1");
+        } catch (DmException ex) {
+            System.out.println("Sorry: " + ex);
+        }
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/DmSession.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/DmSession.java
new file mode 100644
index 0000000000000000000000000000000000000000..41e294838c872d7d6239960aba805cf926cd3b73
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/DmSession.java
@@ -0,0 +1,100 @@
+package gov.anl.aps.dm.api;
+
+import gov.anl.aps.dm.common.constants.DmRole;
+import gov.anl.aps.dm.common.exceptions.InvalidSession;
+import java.io.Serializable;
+import java.net.HttpCookie;
+
+/**
+ * DM session class, used for keeping all session-related information (session
+ * id, username, role, etc.).
+ */
+public class DmSession implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id = null;
+    private String username = null;
+    private String cookie = null;
+    private DmRole role = null;
+
+    public DmSession() {
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getCookie() {
+        return cookie;
+    }
+
+    public void setCookie(String cookie) {
+        this.cookie = cookie;
+    }
+
+    public String verifyCookie() throws InvalidSession {
+        if (cookie == null) {
+            throw new InvalidSession("Valid session has not been established.");
+        } else {
+            HttpCookie httpCookie = HttpCookie.parse(cookie).get(0);
+            if (httpCookie.hasExpired()) {
+                throw new InvalidSession("Session id " + id + " has expired.");
+            }
+        }
+        return cookie;
+    }
+
+    public DmRole getRole() {
+        return role;
+    }
+
+    public void setRole(DmRole role) {
+        this.role = role;
+    }
+
+    public boolean isAdminRole() {
+        if (role != null) {
+            return role.equals(DmRole.ADMIN);
+        }
+        return false;
+    }
+
+    public boolean isUserRole() {
+        if (role != null) {
+            return role.equals(DmRole.USER);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        String result = "{ ";
+        String delimiter = "";
+        if (username != null) {
+            result += "username :" + username;
+            delimiter = "; ";
+        }
+        if (id != null) {
+            result += delimiter + "id : " + id;
+            delimiter = "; ";
+        }
+        if (cookie != null) {
+            result += delimiter + "cookie : " + cookie;
+        }
+        result += " }";
+        return result;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/ExperimentDsApi.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/ExperimentDsApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..a60d2dce1c23aee46dc550a4aa4e8f8e7c891609
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/api/ExperimentDsApi.java
@@ -0,0 +1,90 @@
+/*
+ * 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.api;
+
+import gov.anl.aps.dm.common.exceptions.ConfigurationError;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import gov.anl.aps.dm.common.exceptions.InvalidArgument;
+import gov.anl.aps.dm.common.exceptions.ObjectNotFound;
+import gov.anl.aps.dm.common.objects.DmObjectFactory;
+import gov.anl.aps.dm.common.objects.Experiment;
+import gov.anl.aps.dm.common.utilities.ArgumentUtility;
+import java.util.HashMap;
+
+/**
+ *
+ * @author sveseli
+ */
+public class ExperimentDsApi extends DmRestApi {
+
+    /**
+     * Constructor.
+     *
+     * @throws ConfigurationError if web service URL property is malformed or
+     * null
+     */
+    public ExperimentDsApi() throws ConfigurationError {
+        super();
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param webServiceUrl web service URL
+     * @throws ConfigurationError if web service URL is malformed or null
+     */
+    public ExperimentDsApi(String webServiceUrl) throws ConfigurationError {
+        super(webServiceUrl);
+    }
+
+
+    /**
+     * Constructor.
+     *
+     * @param webServiceUrl web service URL
+     * @param loginUsername login username
+     * @param loginPassword login password
+     * @throws ConfigurationError if web service URL is malformed or null
+     */
+    public ExperimentDsApi(String webServiceUrl, String loginUsername, String loginPassword) throws ConfigurationError {
+        super(webServiceUrl, loginUsername, loginPassword);
+    }
+    
+    /**
+     * Update experiment (group users, etc.).
+     *
+     * @param experimentName experiment name
+     * @return Experiment object
+     * @throws InvalidArgument if provided name is empty or null
+     * @throws ObjectNotFound when specified experiment does not exist
+     * @throws DmException in case of all other errors
+     */
+    public Experiment updateExperiment(String experimentName) throws InvalidArgument, ObjectNotFound, DmException {
+        ArgumentUtility.verifyNonEmptyString("Experiment name", experimentName);
+        String requestUrl = "/experiments/update";
+        HashMap<String, String> requestData = new HashMap<>();
+        requestData.put("name", ArgumentUtility.encode(experimentName));
+        String jsonString = loginAndInvokeSessionPutRequest(requestUrl, requestData);
+        Experiment experiment = (Experiment) DmObjectFactory.createDmObject(jsonString, Experiment.class);
+        return experiment;
+    }
+
+    /*
+     * Main method, used for simple testing.
+     *
+     * @param args main arguments
+     */
+    public static void main(String[] args) {
+        try {
+            ExperimentDsApi client = new ExperimentDsApi("https://dmstorage.svdev.net:22236/dm", "dm", "dm");
+            Experiment experiment = client.updateExperiment("e1");
+            System.out.println("Updated experiment: \n" + experiment);
+        } catch (DmException ex) {
+            System.out.println("Sorry: " + ex);
+        }
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmHttpHeader.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmHttpHeader.java
new file mode 100644
index 0000000000000000000000000000000000000000..93353d26634b8632bd77f20d55a6ed44cbeafcd1
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmHttpHeader.java
@@ -0,0 +1,13 @@
+package gov.anl.aps.dm.common.constants;
+
+/**
+ * HTTP headers specific to DM.
+ */
+public class DmHttpHeader {
+
+    public static final String DM_SET_COOKIE_HEADER = "Set-Cookie";
+    public static final String DM_EXCEPTION_TYPE_HEADER = "Dm-Exception-Type";
+    public static final String DM_STATUS_CODE_HEADER = "Dm-Status-Code";
+    public static final String DM_STATUS_MESSAGE_HEADER = "Dm-Status-Message";
+    public static final String DM_SESSION_ROLE_HEADER = "Dm-Session-Role";
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmProperty.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmProperty.java
new file mode 100644
index 0000000000000000000000000000000000000000..9bacbe4a92498cc42a6a32a411b5d2395a913c23
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmProperty.java
@@ -0,0 +1,11 @@
+package gov.anl.aps.dm.common.constants;
+
+/**
+ * DM property names.
+ */
+public class DmProperty {
+
+    public static final String DS_WEB_SERVICE_URL_PROPERTY_NAME = "dm.dsWebService.url";
+    public static final String SYSTEM_USER_PROPERTY_NAME = "dm.system.user";
+    public static final String SYSTEM_PASSWORD_FILE_PROPERTY_NAME = "dm.system.passwordFile";
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmRole.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmRole.java
new file mode 100644
index 0000000000000000000000000000000000000000..d25537362e8daec54ffb7a5d550fab39cdaa9a1c
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmRole.java
@@ -0,0 +1,34 @@
+package gov.anl.aps.dm.common.constants;
+
+/**
+ * DM role enum.
+ */
+public enum DmRole {
+
+    USER("user"),
+    ADMIN("admin");
+
+    private final String type;
+
+    private DmRole(String type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return type;
+    }
+
+    public static DmRole fromString(String type) {
+        DmRole role = null;
+        switch (type) {
+            case "user":
+                role = USER;
+                break;
+            case "admin":
+                role = ADMIN;
+                break;
+        }
+        return role;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmServiceProtocol.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmServiceProtocol.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc875e89776d8aac7ddcf0dfa727c05c35ed6aa1
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmServiceProtocol.java
@@ -0,0 +1,34 @@
+package gov.anl.aps.dm.common.constants;
+
+/**
+ * DM service protocol enum.
+ */
+public enum DmServiceProtocol {
+
+    HTTP("http"),
+    HTTPS("https");
+
+    private final String type;
+
+    private DmServiceProtocol(String type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return type;
+    }
+
+    public static DmServiceProtocol fromString(String type) {
+        DmServiceProtocol protocol = null;
+        switch (type) {
+            case "http":
+                protocol = HTTP;
+                break;
+            case "https":
+                protocol = HTTPS;
+                break;
+        }
+        return protocol;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmStatus.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..b269968b7777cfc723210d78628ab8abd9dc83ab
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/constants/DmStatus.java
@@ -0,0 +1,26 @@
+package gov.anl.aps.dm.common.constants;
+
+/**
+ * DM status codes.
+ */
+public class DmStatus {
+
+    public static final int DM_OK = 0;
+    public static final int DM_ERROR = 1;
+    public static final int DM_INTERNAL_ERROR = 2;
+    public static final int DM_COMMUNICATION_ERROR = 3;
+    public static final int DM_CONFIGURATION_ERROR = 4;
+    public static final int DM_AUTHORIZATION_ERROR = 5;
+    public static final int DM_AUTHENTICATION_ERROR = 6;
+    public static final int DM_DB_ERROR = 7;
+    public static final int DM_URL_ERROR = 8;
+    public static final int DM_TIMEOUT_ERROR = 9;
+    public static final int DM_INVALID_ARGUMENT = 10;
+    public static final int DM_INVALID_REQUEST = 11;
+    public static final int DM_INVALID_SESSION = 12;
+    public static final int DM_COMMAND_FAILED = 13;
+    public static final int DM_OBJECT_NOT_FOUND = 14;
+    public static final int DM_OBJECT_ALREADY_EXISTS = 15;
+    public static final int DM_INVALID_OBJECT_STATE = 16;
+    public static final int DM_FILE_PROCESSING_ERROR = 17;
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/AuthenticationError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/AuthenticationError.java
new file mode 100644
index 0000000000000000000000000000000000000000..9361d06d69d74213751ae8ca3b4fe5d94fbc074c
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/AuthenticationError.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Authentication error exception.
+ */
+public class AuthenticationError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public AuthenticationError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public AuthenticationError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public AuthenticationError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public AuthenticationError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_AUTHENTICATION_ERROR;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/AuthorizationError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/AuthorizationError.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a6fbab808344816fb82b8ba46dfe5a62c578cfc
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/AuthorizationError.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Authorization error exception.
+ */
+public class AuthorizationError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public AuthorizationError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public AuthorizationError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public AuthorizationError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public AuthorizationError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_AUTHORIZATION_ERROR;
+    }      
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/CommunicationError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/CommunicationError.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd202cef54f0d691f9568b46007328415e5d7f6e
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/CommunicationError.java
@@ -0,0 +1,50 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Communication error exception.
+ */
+public class CommunicationError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public CommunicationError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public CommunicationError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public CommunicationError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public CommunicationError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_COMMUNICATION_ERROR;
+    }     
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ConfigurationError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ConfigurationError.java
new file mode 100644
index 0000000000000000000000000000000000000000..acd8c938071e2e6c85e961638a7257c5cbd73523
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ConfigurationError.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Configuration error exception.
+ */
+public class ConfigurationError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public ConfigurationError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public ConfigurationError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor sing throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public ConfigurationError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public ConfigurationError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_CONFIGURATION_ERROR;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DbError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DbError.java
new file mode 100644
index 0000000000000000000000000000000000000000..a07885db9ea31e2c3ccb932db03385c3ab8202b5
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DbError.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * DB error exception.
+ */
+public class DbError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public DbError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public DbError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public DbError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public DbError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_DB_ERROR;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DmException.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DmException.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae88da18e66f6e254caeee6a0ebc4ec2f7f95662
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DmException.java
@@ -0,0 +1,84 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Generic DM exception, used as base class for all DM exceptions.
+ */
+public class DmException extends Exception {
+
+    /**
+     * Exception keys.
+     */
+    public static final String SIGNATURE_KEY = "__dm_exception__";
+    public static final String TYPE_KEY = "type";
+    public static final String CODE_KEY = "code";
+    public static final String ARGS_KEY = "args";
+
+    private String error = null;
+
+    /**
+     * Default constructor.
+     */
+    public DmException() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public DmException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public DmException(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public DmException(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    public int getErrorCode() {
+        return DmStatus.DM_ERROR;
+    }
+
+    public void setErrorMessage(String error) {
+        this.error = error;
+    }
+
+    public String getErrorMessage() {
+        if (error != null) {
+            return error;
+        }
+        return super.getMessage();
+    }
+
+    /**
+     * Convert exception to string, overriding string output if error message is
+     * set.
+     *
+     * @return exception string
+     */
+    @Override
+    public String toString() {
+        if (error != null) {
+            return error;
+        } else {
+            return super.toString();
+        }
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DmExceptionFactory.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DmExceptionFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..d067c3a7cc389f9051f091ef1fe45a801a5cc1b5
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/DmExceptionFactory.java
@@ -0,0 +1,92 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+import org.apache.log4j.Logger;
+
+/**
+ * DM exception factory class.
+ *
+ */
+public class DmExceptionFactory {
+
+    private static final Logger logger
+            = Logger.getLogger(DmExceptionFactory.class.getName());
+
+    /**
+     * Generate DM exception.
+     *
+     * @param type exception type
+     * @param code exception code
+     * @param error exception error message
+     * @return generated DM exception
+     */
+    public static DmException generateDmException(String type, int code, String error) {
+        DmException exc = new DmException();
+        try {
+            String fullType = "gov.anl.aps.dm.common.exceptions." + type;
+            // Having trouble getting code below to work in all cases, so
+            // use code for now.
+            // exc = (DmException) Class.forName(fullType).newInstance();
+            switch (code) {
+
+                case DmStatus.DM_AUTHORIZATION_ERROR:
+                    exc = new AuthorizationError();
+                    break;
+                case DmStatus.DM_COMMUNICATION_ERROR:
+                    exc = new CommunicationError();
+                    break;
+                case DmStatus.DM_CONFIGURATION_ERROR:
+                    exc = new ConfigurationError();
+                    break;
+                case DmStatus.DM_INTERNAL_ERROR:
+                    exc = new InternalError();
+                    break;
+               case DmStatus.DM_DB_ERROR:
+                    exc = new DbError();
+                    break;
+                case DmStatus.DM_INVALID_ARGUMENT:
+                    exc = new InvalidArgument();
+                    break;
+                case DmStatus.DM_INVALID_REQUEST:
+                    exc = new InvalidRequest();
+                    break;
+                case DmStatus.DM_INVALID_SESSION:
+                    exc = new InvalidSession();
+                    break;
+                case DmStatus.DM_OBJECT_ALREADY_EXISTS:
+                    exc = new ObjectAlreadyExists();
+                    break;
+                case DmStatus.DM_OBJECT_NOT_FOUND:
+                    exc = new ObjectNotFound();
+                    break;
+                case DmStatus.DM_INVALID_OBJECT_STATE:
+                    exc = new InvalidObjectState();
+                    break;
+                case DmStatus.DM_TIMEOUT_ERROR:
+                    exc = new TimeoutError();
+                    break;                    
+                default:
+                    exc = (DmException) Class.forName(fullType).newInstance();
+            }
+        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
+            String err = "Cannot generate exception of type " + type + ": " + ex;
+            logger.error(err);
+        }
+        exc.setErrorMessage(error);
+        return exc;
+    }
+
+    /**
+     * Throw DM exception.
+     *
+     * @param type exception type
+     * @param code exception code
+     * @param error exception error message
+     * @throws DmException generated DM exception whenever this method is
+     * called
+     */
+    public static void throwDmException(String type, int code, String error) throws DmException {
+        DmException exc = generateDmException(type, code, error);
+        throw exc;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InternalError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InternalError.java
new file mode 100644
index 0000000000000000000000000000000000000000..955b18b66e098d910e250d47d39058147977aafa
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InternalError.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Internal error exception.
+ */
+public class InternalError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public InternalError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public InternalError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public InternalError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public InternalError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+    
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_INTERNAL_ERROR;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidArgument.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidArgument.java
new file mode 100644
index 0000000000000000000000000000000000000000..feb1990d9ebe43116afdecc7d764663ec42d92c1
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidArgument.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Invalid argument exception.
+ */
+public class InvalidArgument extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public InvalidArgument() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public InvalidArgument(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public InvalidArgument(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public InvalidArgument(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_INVALID_ARGUMENT;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidObjectState.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidObjectState.java
new file mode 100644
index 0000000000000000000000000000000000000000..97700d6847b77a031f525bf00fec8827f7526ed3
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidObjectState.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Invalid object state exception.
+ */
+public class InvalidObjectState extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public InvalidObjectState() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public InvalidObjectState(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public InvalidObjectState(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public InvalidObjectState(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_INVALID_OBJECT_STATE;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidRequest.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fccb3c6eee1d363a1a7053553de78ad88a4d8ec8
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidRequest.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Invalid request exception.
+ */
+public class InvalidRequest extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public InvalidRequest() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public InvalidRequest(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public InvalidRequest(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public InvalidRequest(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_INVALID_REQUEST;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidSession.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidSession.java
new file mode 100644
index 0000000000000000000000000000000000000000..569fe7897cadf90f840172b6449092331c0fc2f8
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/InvalidSession.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Invalid session exception.
+ */
+public class InvalidSession extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public InvalidSession() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public InvalidSession(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public InvalidSession(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public InvalidSession(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_INVALID_SESSION;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ObjectAlreadyExists.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ObjectAlreadyExists.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e5edf45d512d127f92b72d168abe6e158ef2c71
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ObjectAlreadyExists.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Object already exists exception.
+ */
+public class ObjectAlreadyExists extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public ObjectAlreadyExists() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public ObjectAlreadyExists(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public ObjectAlreadyExists(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public ObjectAlreadyExists(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_OBJECT_ALREADY_EXISTS;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ObjectNotFound.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ObjectNotFound.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ad72872968912155f5d70a3085b9c1862149ffe
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/ObjectNotFound.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Object not found exception.
+ */
+public class ObjectNotFound extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public ObjectNotFound() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public ObjectNotFound(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public ObjectNotFound(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public ObjectNotFound(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_OBJECT_NOT_FOUND;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/TimeoutError.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/TimeoutError.java
new file mode 100644
index 0000000000000000000000000000000000000000..446ee6d25cf6d686bbee7a3fa585f2405b9d7297
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/exceptions/TimeoutError.java
@@ -0,0 +1,49 @@
+package gov.anl.aps.dm.common.exceptions;
+
+import gov.anl.aps.dm.common.constants.DmStatus;
+
+/**
+ * Timeout error.
+ */
+public class TimeoutError extends DmException {
+
+    /**
+     * Default constructor.
+     */
+    public TimeoutError() {
+        super();
+    }
+
+    /**
+     * Constructor using error message.
+     *
+     * @param message error message
+     */
+    public TimeoutError(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor using throwable object.
+     *
+     * @param throwable throwable object
+     */
+    public TimeoutError(Throwable throwable) {
+        super(throwable);
+    }
+
+    /**
+     * Constructor using error message and throwable object.
+     *
+     * @param message error message
+     * @param throwable throwable object
+     */
+    public TimeoutError(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    @Override
+    public int getErrorCode() {
+        return DmStatus.DM_TIMEOUT_ERROR;
+    }    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/DmObject.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/DmObject.java
new file mode 100644
index 0000000000000000000000000000000000000000..82c9d1b2915547f60257e0f50d36cbbdc6f5e92b
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/DmObject.java
@@ -0,0 +1,69 @@
+package gov.anl.aps.dm.common.objects;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import java.io.Serializable;
+
+/**
+ * Base DM object class.
+ */
+public class DmObject implements Serializable {
+
+    protected Long id = null;
+    protected String name = null;
+    protected String description = null;
+
+    public DmObject() {
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Conversion to JSON string representation.
+     *
+     * @return JSON string
+     */
+    public String toJson() {
+        Gson gson = new GsonBuilder().create();
+        return gson.toJson(this);
+    }
+
+    /**
+     * Encode object.
+     *
+     * @throws DmException in case of any errors
+     */
+    public void encode() throws DmException {
+    }
+
+    /**
+     * Decode object.
+     *
+     * @throws DmException in case of any errors
+     */
+    public void decode() throws DmException {
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/DmObjectFactory.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/DmObjectFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..f003a16daf5872ef033e473d4961713e3984bad5
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/DmObjectFactory.java
@@ -0,0 +1,81 @@
+package gov.anl.aps.dm.common.objects;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import java.lang.reflect.Type;
+import java.util.LinkedList;
+import java.util.List;
+import org.apache.log4j.Logger;
+
+/**
+ * DM object factory class.
+ */
+public class DmObjectFactory {
+
+    private static final Logger logger = Logger.getLogger(DmObjectFactory.class.getName());
+    private static final Gson gson = new GsonBuilder().create();
+
+    /**
+     * Create object from JSON string.
+     *
+     * @param <T> template class
+     * @param jsonString JSON string
+     * @param objectClass object class
+     * @return generated object
+     */
+    public static <T extends Object> T createObject(String jsonString, Class<T> objectClass) {
+        logger.debug("Converting JSON string to object " + objectClass + ": " + jsonString);
+        T object = gson.fromJson(jsonString, objectClass);
+        return object;
+    }
+
+    /**
+     * Create DM object from JSON string.
+     *
+     * @param <T> template class
+     * @param jsonString JSON string
+     * @param dmClass DM object class
+     * @return generated DM object
+     * @throws DmException in case of any errors
+     */
+    public static <T extends DmObject> T createDmObject(String jsonString, Class<T> dmClass) throws DmException {
+        logger.debug("Converting JSON string to DM object " + dmClass + ": " + jsonString);
+        T dmObject = gson.fromJson(jsonString, dmClass);
+        dmObject.decode();
+        return dmObject;
+    }
+
+    /**
+     * Create list of DM objects from JSON string.
+     *
+     * @param <T> template class
+     * @param jsonString DM string
+     * @return generated list of DM objects
+     */
+    public static <T extends DmObject> List<T> createDmObjectList(String jsonString) {
+        // This method does not appear to work as template, so we have
+        // to write specific methods for each object type.
+        logger.debug("Converting JSON string to dm object list: " + jsonString);
+        Type dmType = new TypeToken<LinkedList<T>>() {
+        }.getType();
+        List<T> dmObjectList = gson.fromJson(jsonString, dmType);
+        return dmObjectList;
+    }
+
+    /**
+     * Create list of string objects from JSON string.
+     *
+     * @param jsonString JSON string
+     * @return generated list of string objects
+     */
+    public static List<String> createStringObjectList(String jsonString) {
+        logger.debug("Converting JSON string to string object list: " + jsonString);
+        Type dmType = new TypeToken<LinkedList<String>>() {
+        }.getType();
+        List<String> dmObjectList = gson.fromJson(jsonString, dmType);
+        return dmObjectList;
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/Experiment.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/Experiment.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf334be86cfea04490c54ccba1dcbf5813b90d54
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/objects/Experiment.java
@@ -0,0 +1,17 @@
+/*
+ * 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.common.objects;
+
+/**
+ * Experiment class.
+ */
+public class Experiment extends DmObject {
+
+    public Experiment() {
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/ArgumentUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/ArgumentUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..eca2ae81414350156f500e968d64d09a77c1931e
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/ArgumentUtility.java
@@ -0,0 +1,181 @@
+package gov.anl.aps.dm.common.utilities;
+
+import gov.anl.aps.dm.common.exceptions.InvalidArgument;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import java.util.Map;
+import javax.xml.bind.DatatypeConverter;
+
+/**
+ * Utility class for processing and checking function arguments.
+ */
+public class ArgumentUtility {
+
+    /**
+     * Check that input string is not null and not empty.
+     *
+     * @param arg input argument to be checked
+     * @return true if input string is not null and not empty, false otherwise
+     */
+    public static boolean isNonEmptyString(String arg) {
+        return arg != null && !arg.isEmpty();
+    }
+
+    /**
+     * Convert input argument to string.
+     *
+     * @param arg input argument to be checked
+     * @return original argument string representation, or empty string if
+     * argument is null
+     */
+    public static String toNonNullString(Object arg) {
+        if (arg == null) {
+            return "";
+        }
+        return arg.toString();
+    }
+
+    /**
+     * Verify that input string is not null and not empty.
+     *
+     * @param argName name of the argument to be verified; used for error
+     * message
+     * @param arg input argument to be checked
+     * @throws InvalidArgument if input string is null or empty
+     */
+    public static void verifyNonEmptyString(String argName, String arg) throws InvalidArgument {
+        if (arg == null || arg.isEmpty()) {
+            throw new InvalidArgument(argName + " must be non-empty string.");
+        }
+    }
+
+    /**
+     * Verify that input string contains given pattern.
+     *
+     * @param argName name of the argument to be verified; used for error
+     * message
+     * @param arg input argument to be checked
+     * @param pattern string that must be contained in the input argument
+     * @throws InvalidArgument if input string is null or empty, or if it does
+     * not contain specified pattern
+     */
+    public static void verifyStringContainsPattern(String argName, String arg, String pattern) throws InvalidArgument {
+        verifyNonEmptyString(argName, arg);
+        verifyNonEmptyString("Pattern", pattern);
+        if (!arg.contains(pattern)) {
+            throw new InvalidArgument(argName + " must contain pattern " + pattern + ".");
+        }
+    }
+
+    /**
+     * Verify that input integer is not null and greater than zero.
+     *
+     * @param argName name of the argument to be verified; used for error
+     * message
+     * @param arg input argument to be checked
+     * @throws InvalidArgument if input number is null or not positive
+     */
+    public static void verifyPositiveInteger(String argName, Integer arg) throws InvalidArgument {
+        if (arg == null || arg <= 0) {
+            throw new InvalidArgument(argName + " must be a positive number.");
+        }
+    }
+
+    /**
+     * Verify that input double is not null and greater than zero.
+     *
+     * @param argName name of the argument to be verified; used for error
+     * message
+     * @param arg input argument to be checked
+     * @throws InvalidArgument if input number is null or not positive
+     */
+    public static void verifyPositiveDouble(String argName, Double arg) throws InvalidArgument {
+        if (arg == null || arg <= 0) {
+            throw new InvalidArgument(argName + " must be a positive number.");
+        }
+    }
+
+    /**
+     * Verify that input object is not null.
+     *
+     * @param argName name of the argument to be verified; used for error
+     * message
+     * @param arg input argument to be checked
+     * @throws InvalidArgument if input string is null or empty
+     */
+    public static void verifyNonNullObject(String argName, Object arg) throws InvalidArgument {
+        if (arg == null) {
+            throw new InvalidArgument(argName + " cannot be null.");
+        }
+    }
+
+    /**
+     * Add (key,value) pair to map if value is not null or empty.
+     *
+     * @param map target map
+     * @param key key
+     * @param value string that will be added to map if it is not null or empty
+     */
+    public static void addNonEmptyKeyValuePair(Map<String, String> map, String key, String value) {
+        if (value != null && !value.isEmpty()) {
+            map.put(key, value);
+        }
+    }
+
+    /**
+     * Add (key,value) pair to map if value is not null or empty.
+     *
+     * @param map target map
+     * @param key key
+     * @param valueObject object that will be added to map if it has non-empty
+     * string representation
+     */
+    public static void addNonEmptyKeyValuePair(Map<String, String> map, String key, Object valueObject) {
+        if (valueObject != null) {
+            String value = valueObject.toString();
+            if (!value.isEmpty()) {
+                map.put(key, value);
+            }
+        }
+    }
+
+    /**
+     * Base 64 encode.
+     *
+     * @param input input string
+     * @return base 64 encoded string
+     * @throws DmException in case of any errors
+     */
+    public static String encode(String input) throws DmException {
+        try {
+            // Input is twice encoded in order to avoid issues like
+            // '+' being interpreted as space
+            if (input == null) {
+                return input;
+            }
+            String s1 = DatatypeConverter.printBase64Binary(input.getBytes());
+            String s2 = DatatypeConverter.printBase64Binary(s1.getBytes());
+            return s2;
+        } catch (Exception ex) {
+            throw new DmException(ex);
+        }
+    }
+
+    /**
+     * Base 64 decode.
+     *
+     * @param input base 64 encoded string
+     * @return decoded string
+     * @throws DmException in case of any errors
+     */
+    public static String decode(String input) throws DmException {
+        try {
+            // Input is twice encoded in order to avoid issues like
+            // '+' being interpreted as space
+            byte[] ba1 = DatatypeConverter.parseBase64Binary(input);
+            byte[] ba2 = DatatypeConverter.parseBase64Binary(new String(ba1));
+            return new String(ba2);
+        } catch (Exception ex) {
+            throw new DmException(ex);
+        }
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/CollectionUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/CollectionUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6138960ebbf40f55f5b7432cc7edae5ccac1397
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/CollectionUtility.java
@@ -0,0 +1,101 @@
+package gov.anl.aps.dm.common.utilities;
+
+import java.util.List;
+import java.util.ListIterator;
+import javax.faces.model.SelectItem;
+
+/**
+ * Utility class for manipulating collections.
+ */
+public class CollectionUtility {
+
+    /**
+     * Prepare array of SelectItem objects for menus
+     *
+     * @param entities list of objects
+     * @param selectOne true if resulting array should contain "Select" string
+     * @return array of SelectItem objects
+     */
+    public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
+        int size = selectOne ? entities.size() + 1 : entities.size();
+        SelectItem[] items = new SelectItem[size];
+        int i = 0;
+        if (selectOne) {
+            items[0] = new SelectItem("", "Select");
+            i++;
+        }
+        for (Object x : entities) {
+            items[i++] = new SelectItem(x, x.toString());
+        }
+        return items;
+    }
+
+    /**
+     * Prepare display string for a list of objects.
+     *
+     * @param list object list
+     * @param beginDelimiter beginning delimiter
+     * @param itemDelimiter item delimiter
+     * @param endDelimiter ending delimiter
+     * @return list display string
+     */
+    public static String displayItemList(List<?> list, String beginDelimiter, String itemDelimiter, String endDelimiter) {
+        String result = beginDelimiter;
+        boolean addItemDelimiter = false;
+        if (list != null) {
+            for (Object item : list) {
+                if (!addItemDelimiter) {
+                    addItemDelimiter = true;
+                } else {
+                    result += itemDelimiter;
+                }
+                result += item.toString();
+            }
+        }
+        result += endDelimiter;
+        return result;
+    }
+
+    /**
+     * Prepare display string for a list of objects without outside delimiters.
+     *
+     * @param list object list
+     * @param itemDelimiter item delimiter
+     * @return list display string
+     */
+    public static String displayItemListWithoutOutsideDelimiters(List<?> list, String itemDelimiter) {
+        String beginDelimiter = "";
+        String endDelimiter = "";
+        return displayItemList(list, beginDelimiter, itemDelimiter, endDelimiter);
+    }
+
+    /**
+     * Prepare display string for a list of objects with spaces as delimiters.
+     *
+     * @param list object list
+     * @return list display string
+     */
+    public static String displayItemListWithoutDelimiters(List<?> list) {
+        String beginDelimiter = "";
+        String itemDelimiter = "";
+        String endDelimiter = "";
+        return displayItemList(list, beginDelimiter, itemDelimiter, endDelimiter);
+    }
+
+    /**
+     * Remove null references from list of objects.
+     *
+     * @param list object list
+     */
+    public static void removeNullReferencesFromList(List<?> list) {
+        if (list == null) {
+            return;
+        }
+        ListIterator iterator = list.listIterator();
+        while (iterator.hasNext()) {
+            if (iterator.next() == null) {
+                iterator.remove();
+            }
+        }
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/CryptUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/CryptUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..426fc8574d3b34262d734c8d7017ef376ce35e63
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/CryptUtility.java
@@ -0,0 +1,110 @@
+package gov.anl.aps.dm.common.utilities;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Random;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import org.apache.log4j.Logger;
+import org.primefaces.util.Base64;
+
+/**
+ * Utility class for encrypting and verifying passwords.
+ */
+public class CryptUtility {
+
+    private static final String SecretKeyFactoryType = "PBKDF2WithHmacSHA1";
+    private static final int Pbkdf2Iterations = 1003;
+    private static final int Pbkdf2KeyLengthInBits = 192;
+    private static final int SaltLengthInBytes = 4;
+    private static final char[] SaltCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
+    private static final String SaltDelimiter = "$";
+
+    private static final Logger logger = Logger.getLogger(CryptUtility.class.getName());
+
+    /**
+     * Generate random string.
+     *
+     * @param characterSet set to draw characters from
+     * @param length string length
+     * @return generated string
+     */
+    public static String randomString(char[] characterSet, int length) {
+        Random random = new SecureRandom();
+        char[] result = new char[length];
+        for (int i = 0; i < result.length; i++) {
+            // picks a random index out of character set > random character
+            int randomCharIndex = random.nextInt(characterSet.length);
+            result[i] = characterSet[randomCharIndex];
+        }
+        return new String(result);
+    }
+
+    /**
+     * Encrypt password using PBKDF2 key derivation function.
+     *
+     * @param password input password
+     * @return encrypted password
+     */
+    public static String cryptPasswordWithPbkdf2(String password) {
+        String salt = randomString(SaltCharset, SaltLengthInBytes);
+        return saltAndCryptPasswordWithPbkdf2(password, salt);
+    }
+
+    /**
+     * Apply salt string and encrypt password using PBKDF2 standard.
+     *
+     * @param password input password
+     * @param salt salt string
+     * @return encrypted password
+     */
+    public static String saltAndCryptPasswordWithPbkdf2(String password, String salt) {
+        char[] passwordChars = password.toCharArray();
+        byte[] saltBytes = salt.getBytes();
+
+        PBEKeySpec spec = new PBEKeySpec(
+                passwordChars,
+                saltBytes,
+                Pbkdf2Iterations,
+                Pbkdf2KeyLengthInBits
+        );
+        SecretKeyFactory key;
+        try {
+            key = SecretKeyFactory.getInstance(SecretKeyFactoryType);
+            byte[] hashedPassword = key.generateSecret(spec).getEncoded();
+            String encodedPassword = Base64.encodeToString(hashedPassword, true);
+            return salt + SaltDelimiter + encodedPassword;
+        } catch (NoSuchAlgorithmException | InvalidKeySpecException ex) {
+            // Should not happen
+            logger.error("Password cannot be crypted: " + ex);
+        }
+        return null;
+    }
+
+    /**
+     * Verify encrypted password.
+     *
+     * @param password password to be verified
+     * @param cryptedPassword original encrypted password
+     * @return true if passwords match, false otherwise
+     */
+    public static boolean verifyPasswordWithPbkdf2(String password, String cryptedPassword) {
+        int saltEnd = cryptedPassword.indexOf(SaltDelimiter);
+        String salt = cryptedPassword.substring(0, saltEnd);
+        return cryptedPassword.equals(saltAndCryptPasswordWithPbkdf2(password, salt));
+    }
+
+    /*
+     * Main method, used for simple testing.
+     * 
+     * @param args main arguments
+     */
+    public static void main(String[] args) {
+        String password = "dm";
+        System.out.println("Original password: " + password);
+        String cryptedPassword = cryptPasswordWithPbkdf2(password);
+        System.out.println("Crypted password: " + cryptedPassword);
+        System.out.println("Verified: " + verifyPasswordWithPbkdf2(password, cryptedPassword));
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/DateUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/DateUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1a063fda016fbce291460f4a5ace57e41dc16b6
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/DateUtility.java
@@ -0,0 +1,21 @@
+package gov.anl.aps.dm.common.utilities;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Utility class for manipulating dates.
+ */
+public class DateUtility {
+
+    private static final SimpleDateFormat DateTimeFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * Format current date.
+     *
+     * @return formatted date string
+     */
+    public static String getCurrentDateTime() {
+        return DateTimeFormat.format(new Date());
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/FileUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/FileUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..669dd712c6da59bb666bd88adb4edddb9a60e0d5
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/FileUtility.java
@@ -0,0 +1,26 @@
+package gov.anl.aps.dm.common.utilities;
+
+/**
+ * Utility class for manipulating files.
+ */
+public class FileUtility {
+
+    /**
+     * Get file extension.
+     *
+     * @param fileName file name
+     * @return file extension
+     */
+    public static String getFileExtension(String fileName) {
+        String extension = "";
+        if (fileName != null && !fileName.isEmpty()) {
+            int extIndex = fileName.lastIndexOf('.');
+            int dirIndex = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
+            if (extIndex > dirIndex) {
+                extension = fileName.substring(extIndex + 1);
+            }
+        }
+        return extension.toLowerCase();
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/LdapUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/LdapUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..336caf28fe78130d79f49219b0125c9da739ddbd
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/LdapUtility.java
@@ -0,0 +1,63 @@
+package gov.anl.aps.dm.common.utilities;
+
+import gov.anl.aps.dm.portal.utilities.ConfigurationUtility;
+import java.util.Hashtable;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+import org.apache.log4j.Logger;
+
+/**
+ * LDAP utility class for verifying user credentials.
+ *
+ * @see NoServerVerificationSSLSocketFactory
+ */
+public class LdapUtility {
+
+    private static final String LdapUrlPropertyName = "dm.portal.ldapUrl";
+    private static final String LdapDnStringPropertyName = "dm.portal.ldapDnString";
+    private static final String ldapUrl = ConfigurationUtility.getPortalProperty(LdapUrlPropertyName);
+    private static final String ldapDnString = ConfigurationUtility.getPortalProperty(LdapDnStringPropertyName);
+
+    private static final Logger logger = Logger.getLogger(LdapUtility.class.getName());
+
+    /**
+     * Validate user credentials.
+     *
+     * Use username and password to attempt initial connection and bind with
+     * LDAP server. Successful connection implies that credentials are accepted.
+     *
+     * @param username username
+     * @param password password
+     *
+     * @return true if credentials are valid, false otherwise
+     */
+    public static boolean validateCredentials(String username, String password) {
+
+        // dump out immediately if not given password
+        if (password.isEmpty()) {
+            return false;
+        }
+
+        boolean validated = false;
+        Hashtable env = new Hashtable();
+        String dn = ldapDnString.replace("USERNAME", username);
+        logger.debug("Authenticating: " + dn);
+        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, ldapUrl);
+        env.put(Context.SECURITY_AUTHENTICATION, "simple");
+        env.put(Context.SECURITY_PRINCIPAL, dn);
+        env.put(Context.SECURITY_CREDENTIALS, password);
+        // the below property allows us to circumvent server certificate checks
+        env.put("java.naming.ldap.factory.socket", "gov.anl.aps.dm.common.utilities.NoServerVerificationSSLSocketFactory");
+        try {
+            DirContext ctx = new InitialDirContext(env);
+            validated = true;
+        } catch (NamingException ex) {
+            logger.error(ex);
+        }
+        return validated;
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/NoOpTrustManager.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/NoOpTrustManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0a4936240b064bdc5ac76c4547d14bea1e82808
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/NoOpTrustManager.java
@@ -0,0 +1,30 @@
+package gov.anl.aps.dm.common.utilities;
+
+import java.security.cert.X509Certificate;
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * Dummy trust manager class.
+ *
+ * A trivial implementation of <code>X509TrustManager</code> that doesn't
+ * actually check the validity of a certificate. This allows us to make SSL
+ * connections to internal servers without requiring the installation and
+ * maintenance of certificates in the client keystore.
+ *
+ * @see NoServerVerificationSSLSocketFactory
+ */
+public class NoOpTrustManager implements X509TrustManager {
+
+    @Override
+    public void checkClientTrusted(X509Certificate[] cert, String authType) {
+    }
+
+    @Override
+    public void checkServerTrusted(X509Certificate[] cert, String authType) {
+    }
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return new X509Certificate[0];
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/NoServerVerificationSSLSocketFactory.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/NoServerVerificationSSLSocketFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..96088b175ebd41a7f3bdf769e2bcf230f80be2e8
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/NoServerVerificationSSLSocketFactory.java
@@ -0,0 +1,153 @@
+package gov.anl.aps.dm.common.utilities;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import javax.net.SocketFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import org.apache.log4j.Logger;
+
+/**
+ * SSL socket factory that does not verify server credentials.
+ *
+ * A minor extension of <code>SSLSocketFactory</code> that installs a dummy
+ * trust manager. This allows creation of SSL sockets that don't verify the
+ * server certificates.
+ *
+ * @see NoOpTrustManager
+ */
+public class NoServerVerificationSSLSocketFactory extends SSLSocketFactory {
+
+    private static final Logger logger = Logger.getLogger(NoServerVerificationSSLSocketFactory.class.getName());
+
+    private SSLSocketFactory factory;
+
+    /**
+     * Default constructor.
+     */
+    public NoServerVerificationSSLSocketFactory() {
+        try {
+            TrustManager tm = new NoOpTrustManager();
+            SSLContext sslcontext = SSLContext.getInstance("TLS");
+            sslcontext.init(null, // No KeyManager required
+                    new TrustManager[]{tm},
+                    new java.security.SecureRandom());
+
+            factory = (SSLSocketFactory) sslcontext.getSocketFactory();
+        } catch (KeyManagementException | NoSuchAlgorithmException ex) {
+            logger.error(ex);
+        }
+    }
+
+    /**
+     * Get default (no server verification) socket factory.
+     *
+     * @return socket factory
+     */
+    public static SocketFactory getDefault() {
+        return new NoServerVerificationSSLSocketFactory();
+    }
+
+    /**
+     * Create SSL socket layered over an existing socket connected to the named
+     * host, at a given port.
+     *
+     * @param socket existing socket
+     * @param host
+     * @param port
+     * @param autoClose
+     * @return created socket
+     * @throws IOException in case of IO errors
+     */
+    @Override
+    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
+            throws IOException {
+        return factory.createSocket(socket, host, port, autoClose);
+    }
+
+    /**
+     * Create a socket and connect it to the specified remote address/port, and
+     * bind it to the specified local address/port.
+     *
+     * @param address server network address
+     * @param port server port
+     * @param localAddress client network address
+     * @param localPort client port
+     * @return created socket
+     * @throws IOException in case of IO errors
+     */
+    @Override
+    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
+            throws IOException {
+        return factory.createSocket(address, port, localAddress, localPort);
+    }
+
+    /**
+     * Create a socket and connect it to the specified remote address/port.
+     *
+     * @param address server network address
+     * @param port server port
+     * @return created socket
+     * @throws IOException in case of IO errors
+     */
+    @Override
+    public Socket createSocket(InetAddress address, int port) throws IOException {
+        return factory.createSocket(address, port);
+    }
+
+    /**
+     * Create a socket and connect it to the specified remote host/port, and
+     * bind it to the specified local address/port.
+     *
+     * @param host server host
+     * @param port server port
+     * @param localAddress client network address
+     * @param localPort client port
+     * @return created socket
+     * @throws IOException in case of IO errors
+     */
+    @Override
+    public Socket createSocket(String host, int port, InetAddress localAddress, int localPort)
+            throws IOException {
+        return factory.createSocket(host, port, localAddress, localPort);
+    }
+
+    /**
+     * Create a socket and connect it to the specified remote host/port, and
+     * bind it to the specified local address/port.
+     *
+     * @param host server host
+     * @param port server port
+     * @return created socket
+     * @throws IOException in case of IO errors
+     */
+    @Override
+    public Socket createSocket(String host, int port) throws IOException {
+        return factory.createSocket(host, port);
+    }
+
+    /**
+     * Get default cipher suites from socket factory.
+     *
+     * @return list of default ciphers
+     */
+    @Override
+    public String[] getDefaultCipherSuites() {
+        return factory.getSupportedCipherSuites();
+    }
+
+    /**
+     * Get supported cipher suites from socket factory.
+     *
+     * @return list of supported ciphers
+     */
+    @Override
+    public String[] getSupportedCipherSuites() {
+        return factory.getSupportedCipherSuites();
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/ObjectUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/ObjectUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..41788da35bc4004910a997881ef4d9d9447c5736
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/ObjectUtility.java
@@ -0,0 +1,27 @@
+package gov.anl.aps.dm.common.utilities;
+
+/**
+ * Object utility class.
+ */
+public class ObjectUtility {
+
+    /**
+     * Verify that two objects are the same.
+     *
+     * Object references can be null.
+     *
+     * @param <Type> template type of given objects
+     * @param object1 first object
+     * @param object2 second object
+     * @return true if objects are equal, false otherwise
+     */
+    public static <Type> boolean equals(Type object1, Type object2) {
+        if (object1 == null && object2 == null) {
+            return true;
+        }
+        if (object1 == null || object2 == null) {
+            return false;
+        }
+        return object1.equals(object2);
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/StringUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/StringUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..e418496b9351999c34169e14f40de0b4e7bdc7da
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/common/utilities/StringUtility.java
@@ -0,0 +1,36 @@
+package gov.anl.aps.dm.common.utilities;
+
+/**
+ * String utility class.
+ */
+public class StringUtility {
+
+    /**
+     * Verify that two char sequences are the same.
+     *
+     * Input string references can be null.
+     *
+     * @param cs1 first sequence
+     * @param cs2 second sequence
+     * @return true if char sequences are the same, false otherwise
+     */
+    public static boolean equals(CharSequence cs1, CharSequence cs2) {
+        if (cs1 == null && cs2 == null) {
+            return true;
+        }
+        if (cs1 == null || cs2 == null) {
+            return false;
+        }
+        return cs1.equals(cs2);
+    }
+
+    /**
+     * Capitalize first letter of a given string.
+     *
+     * @param input input string
+     * @return capitalized string
+     */
+    public static String capitalize(String input) {
+        return input.substring(0, 1).toUpperCase() + input.substring(1);
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2bdc586f2d45cbc420757dff64dc9a18e0555f0
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java
@@ -0,0 +1,19 @@
+
+package gov.anl.aps.dm.portal.constants;
+
+/**
+ * Status codes.
+ */
+public class DmStatus
+{
+    public static final int DM_OK = 0;
+    public static final int DM_ERROR = 1;
+    public static final int DM_DB_ERROR = 2;
+    public static final int DM_TIMEOUT = 3;
+    public static final int DM_INVALID_ARGUMENT = 4;
+    public static final int DM_INVALID_OBJECT_STATE = 5;
+    public static final int DM_OBJECT_ALREADY_EXISTS = 6;
+    public static final int DM_OBJECT_NOT_FOUND = 7;
+    public static final int DM_INVALID_DATE = 8;
+    public static final int DM_MISSING_PROPERTY = 9;
+}
\ No newline at end of file
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/RoleTypeName.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/RoleTypeName.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a3a809eee711561383d3be44fc9838b7a917a6a
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/RoleTypeName.java
@@ -0,0 +1,19 @@
+/*
+ * 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.constants;
+
+/**
+ *
+ * @author bfrosik
+ */
+public class RoleTypeName {
+        public static final String ADMIN = "Administrator";
+        public static final String EXPERIMENT_ADMIN = "Experiment_Administrator";
+        public static final String MANAGER = "Manager";
+        public static final String PI = "PI";
+        public static final String USER = "User";         
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/AllowedPolicyValueController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/AllowedPolicyValueController.java
new file mode 100644
index 0000000000000000000000000000000000000000..42b87fab8a25ae26d6c088bb4622c2ac805a8bef
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/AllowedPolicyValueController.java
@@ -0,0 +1,96 @@
+
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.portal.model.beans.AllowedPolicyValueFacade;
+import gov.anl.aps.dm.portal.model.entities.AllowedPolicyValue;
+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("allowedPolicyValueController")
+@SessionScoped
+public class AllowedPolicyValueController extends DmEntityController<AllowedPolicyValue, AllowedPolicyValueFacade>
+{
+    private static final Logger logger = Logger.getLogger(AllowedPolicyValueController.class.getName());
+
+    @EJB
+    private AllowedPolicyValueFacade allowedPolicyValueFacade;
+
+    public AllowedPolicyValueController() {
+    }
+    
+    @Override
+    protected AllowedPolicyValueFacade getFacade() {
+        return allowedPolicyValueFacade;
+    }
+
+    @Override
+    protected AllowedPolicyValue createEntityInstance() {
+        return new AllowedPolicyValue();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "allowedPolicyValue";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        return "";
+    }
+
+     @Override
+     protected String getObjectAlreadyExistMessage(AllowedPolicyValue allowedPolicyValue)  {
+        if (allowedPolicyValue == null) {
+            return null;
+        }
+        return "Allowed policy value already exists."; 
+    }
+     
+    @FacesConverter(forClass = AllowedPolicyValue.class)
+    public static class AllowedPolicyValueControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            AllowedPolicyValueController controller = (AllowedPolicyValueController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "allowedPolicyValueController");
+            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 AllowedPolicyValue) {
+                AllowedPolicyValue o = (AllowedPolicyValue) object;
+                return getStringKey(o.getId());
+            }
+            else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + AllowedPolicyValue.class.getName());
+            }
+        }
+
+    }
+   
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DmEntityController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DmEntityController.java
new file mode 100644
index 0000000000000000000000000000000000000000..4594fdb249538dfc4273b9d68ee70cd04653aba7
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DmEntityController.java
@@ -0,0 +1,339 @@
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.common.exceptions.DmException;
+import gov.anl.aps.dm.portal.model.beans.AbstractFacade;
+import gov.anl.aps.dm.portal.model.entities.CloneableEntity;
+import gov.anl.aps.dm.common.utilities.CollectionUtility;
+import gov.anl.aps.dm.portal.utilities.SessionUtility;
+
+import java.io.Serializable;
+import java.util.HashMap;
+
+import java.util.List;
+import java.util.Map;
+import javax.annotation.PostConstruct;
+import javax.faces.model.DataModel;
+import javax.faces.model.ListDataModel;
+import javax.faces.model.SelectItem;
+import org.apache.log4j.Logger;
+import org.primefaces.component.datatable.DataTable;
+import org.primefaces.event.data.FilterEvent;
+
+public abstract class DmEntityController<EntityType extends CloneableEntity, FacadeType extends AbstractFacade<EntityType>> implements Serializable
+{
+
+    private static final Logger logger = Logger.getLogger(DmEntityController.class.getName());
+    private static final int NUMBER_OF_ROWS = 25;
+
+    protected EntityType current = null;
+
+    private DataModel listDataModel = null;
+    private List<EntityType> filteredObjectList = null;
+    protected Map<String, Object> filterState = new HashMap<>();
+
+    private DataModel selectDataModel = null;
+    private List<EntityType> selectedObjectList = null;
+    protected Map<String, Object> selectFilterState = new HashMap<>();
+
+    private int displayNumberOfItemsPerPage = NUMBER_OF_ROWS;
+   
+    
+    public DmEntityController() {
+    }
+
+    @PostConstruct
+    public void initialize() {
+    }
+
+    protected abstract FacadeType getFacade();
+
+    protected abstract EntityType createEntityInstance();
+
+    public abstract String getEntityTypeName();
+
+    public String getDisplayEntityTypeName() {
+        return getEntityTypeName();
+    }
+
+    public abstract String getCurrentEntityInstanceName();
+
+    public EntityType getCurrent() {
+        return current;
+    }
+
+    public void setCurrent(EntityType current) {
+        this.current = current;
+    }
+
+    public void selectByRequestParams() {
+    }
+
+    public EntityType getSelected() {
+        if (current == null) {
+            current = createEntityInstance();
+        }
+        return current;
+    }
+
+    public boolean isEntitySelected() {
+        return (current != null);
+    }
+    
+    public void onFilterChange(FilterEvent filterEvent) {
+        filterState = filterEvent.getFilters();
+    }
+
+    public Object filterState(String key) {
+        return filterState.get(key);
+    }
+ 
+    public Object selectFilterState(String key) {
+        return selectFilterState.get(key);
+    }
+    
+
+    
+/**
+     * Clear entity list filters.
+     *
+     * This method should be overridden in any derived controller class that has
+     * its own filters.
+     */
+    public void clearListFilters() {
+        filterState.clear();
+    }
+
+    /**
+     * Clear entity selection list filters.
+     *
+     * This method should be overridden in any derived controller class that has
+     * its own select filters.
+     */
+    public void clearSelectFilters() {
+        selectFilterState.clear();
+    }
+    
+    public String resetList() {
+        logger.debug("Resetting list data model for " + getDisplayEntityTypeName());
+        clearListFilters();
+        resetListDataModel();
+        return prepareList();
+    }
+
+    public String prepareList() {
+        logger.debug("Preparing list data model for " + getDisplayEntityTypeName());
+        current = null;
+        return "list?faces-redirect=true";
+    }
+
+    public String prepareView(EntityType entity) {
+        logger.debug("Preparing view for " + entity.toString());
+        current = entity;
+        prepareEntityView(entity);
+        return view();
+    }
+
+    protected void prepareEntityView(EntityType entity) {
+    }
+    
+    public void clear() {       
+    }
+
+    public String view() {
+        return "view?faces-redirect=true";
+    }
+
+    public String prepareCreate() {
+        current = createEntityInstance();
+        return "create?faces-redirect=true";
+    }
+    
+    protected void prepareEntityInsert(EntityType entity) throws DmException {
+    }
+
+    public String create() {
+        try {
+            EntityType newEntity = current;
+            prepareEntityInsert(current);
+            getFacade().create(current);
+            SessionUtility.addInfoMessage("Success", "Created " + getDisplayEntityTypeName() + " " + getCurrentEntityInstanceName() + ".");
+            resetListDataModel();
+            current = newEntity;
+            return prepareList();
+        }
+        catch (DmException | RuntimeException ex) {
+            SessionUtility.addErrorMessage("Error", "Could not create " + getDisplayEntityTypeName() + ": " + ex.getMessage());
+            return null;
+        }
+    }
+
+    public String prepareEdit(EntityType entity) {
+        current = entity;
+        return edit();
+    }
+
+    public String edit() {
+        resetSelectDataModel();
+        return "edit?faces-redirect=true";
+    }
+
+    protected void prepareEntityUpdate(EntityType entity) throws DmException {
+    }
+
+    public String update() {
+        try {
+            logger.debug("Updating " + getDisplayEntityTypeName() + " " + getCurrentEntityInstanceName());
+            EntityType updatedEntity = current;
+            prepareEntityUpdate(updatedEntity);
+            getFacade().edit(updatedEntity);
+            SessionUtility.addInfoMessage("Success", "Updated " + getDisplayEntityTypeName() + " " + getCurrentEntityInstanceName() + ".");
+            resetListDataModel();
+            current = updatedEntity;
+            return view();
+        }
+        catch (DmException ex) {
+            SessionUtility.addErrorMessage("Error", "Could not update " + getDisplayEntityTypeName() + ": " + ex.getMessage());
+            return null;
+        }
+        catch (RuntimeException ex) {
+            SessionUtility.addErrorMessage("Error", "Could not update " + getDisplayEntityTypeName() + ": " + getObjectAlreadyExistMessage(current));
+            return null;
+        }
+    }
+    
+    abstract protected String getObjectAlreadyExistMessage(EntityType entity);
+
+    public void destroy(EntityType entity) {
+        current = entity;
+        destroy();
+    }
+
+    public String destroy() {
+        if (current == null) {
+            logger.warn("Current item is not set");
+            // Do nothing if current item is not set.
+            return null;
+        }
+        try {
+            logger.debug("Destroying " + getCurrentEntityInstanceName());
+            getFacade().remove(current);
+            SessionUtility.addInfoMessage("Success", "Deleted " + getDisplayEntityTypeName() + " " + getCurrentEntityInstanceName() + ".");
+            resetListDataModel();
+            return prepareList();
+        }
+        catch (Exception ex) {
+            SessionUtility.addErrorMessage("Error", "Could not delete " + getDisplayEntityTypeName() + ": " + ex.getMessage());
+            return null;
+        }
+    }
+
+    public DataModel createListDataModel() {
+        return new ListDataModel(getFacade().findAll());
+    }
+
+    public DataModel getListDataModel() {
+        if (listDataModel == null) {
+            listDataModel = createListDataModel();
+        }
+        return listDataModel;
+    }
+
+    public void prepareEntityListForSelection(List<EntityType> selectEntityList) {
+    }
+
+    public DataModel createSelectDataModel() {
+        List<EntityType> selectEntityList = getFacade().findAll();
+        prepareEntityListForSelection(selectEntityList);
+        return new ListDataModel(selectEntityList);
+    }
+
+    public DataModel getSelectDataModel() {
+        if (selectDataModel == null) {
+            selectDataModel = createSelectDataModel();
+        }
+        return selectDataModel;
+    }
+
+    public DataModel getItems() {
+        return getListDataModel();
+    }
+
+    public List<EntityType> getSelectedObjectListAndResetSelectDataModel() {
+        List<EntityType> returnList = selectedObjectList;
+        resetSelectDataModel();
+        return returnList;
+    }
+
+    public List<EntityType> getSelectedObjectList() {
+        return selectedObjectList;
+    }
+
+    public List<EntityType> getFilteredObjectList() {
+        return filteredObjectList;
+    }
+
+    public List<EntityType> getFilteredItems() {
+        return filteredObjectList;
+    }
+
+    public void resetSelectedObjectList() {
+        selectedObjectList = null;
+    }
+
+    public void setSelectedObjectList(List<EntityType> selectedObjectList) {
+        this.selectedObjectList = selectedObjectList;
+    }
+
+    public void setFilteredObjectList(List<EntityType> filteredObjectList) {
+        this.filteredObjectList = filteredObjectList;
+    }
+
+    public void setFilteredItems(List<EntityType> filteredItems) {
+        this.filteredObjectList = filteredItems;
+    }
+
+    public void resetListDataModel() {
+        listDataModel = null;
+        filteredObjectList = null;
+        current = null;
+    }
+
+    public void resetSelectDataModel() {
+        selectDataModel = null;
+        selectedObjectList = null;
+    }
+
+    public List<EntityType> getAvailableItems() {
+        return getFacade().findAll();
+    }
+
+    public EntityType getEntity(Integer id) {
+        return getFacade().find(id);
+    }
+
+    public SelectItem[] getAvailableItemsForSelectMany() {
+        return CollectionUtility.getSelectItems(getFacade().findAll(), false);
+    }
+
+    public SelectItem[] getAvailableItemsForSelectOne() {
+        return CollectionUtility.getSelectItems(getFacade().findAll(), true);
+    }
+
+    public String getCurrentViewId() {
+        return SessionUtility.getCurrentViewId();
+    }
+
+    public static String displayEntityList(List<?> entityList) {
+        String itemDelimiter = ", ";
+        return CollectionUtility.displayItemListWithoutOutsideDelimiters(entityList, itemDelimiter);
+    }
+
+    public int getDisplayNumberOfItemsPerPage() {
+        return displayNumberOfItemsPerPage;
+    }
+
+    public void setDisplayNumberOfItemsPerPage(int displayNumberOfItemsPerPage) {
+        this.displayNumberOfItemsPerPage = displayNumberOfItemsPerPage;
+    }
+  
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ce4813abffe419c1bbcd0aa37468b73c56dbf7e
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
@@ -0,0 +1,154 @@
+
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.api.ExperimentDsApi;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import gov.anl.aps.dm.common.exceptions.ObjectAlreadyExists;
+import gov.anl.aps.dm.common.exceptions.InvalidRequest;
+import gov.anl.aps.dm.portal.model.entities.Experiment;
+import gov.anl.aps.dm.portal.model.beans.ExperimentFacade;
+import gov.anl.aps.dm.portal.utilities.DmApiFactory;
+import gov.anl.aps.dm.portal.utilities.SessionUtility;
+
+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("experimentController")
+@SessionScoped
+public class ExperimentController extends DmEntityController<Experiment, ExperimentFacade>
+{
+    private static final Logger logger = Logger.getLogger(ExperimentController.class.getName());
+
+    @EJB
+    private ExperimentFacade experimentFacade;
+
+    public ExperimentController() {
+    }
+    
+    @Override
+    protected ExperimentFacade getFacade() {
+        return experimentFacade;
+    }
+
+    @Override
+    protected Experiment createEntityInstance() {
+        Experiment newExperiment = new Experiment();
+        return newExperiment;
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "experiment";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        if (getCurrent() != null) {
+            return getCurrent().getName();
+        }
+        return "";
+    }
+
+    @Override
+    public void prepareEntityInsert(Experiment experiment) throws DmException {
+        if ((experiment.getName() == null) || (experiment.getName().length() == 0)) {
+            throw new InvalidRequest("Experiment name is missing.");
+        }
+        Experiment existingExperiment = experimentFacade.findByName(experiment.getName());
+        if (existingExperiment != null) {
+            throw new ObjectAlreadyExists("Experiment " + experiment.getName() + " already exists.");
+        }
+        verifyExperiment(experiment);
+        logger.debug("Inserting new experiment " + experiment.getName());
+    }
+
+    @Override
+    public void prepareEntityUpdate(Experiment experiment) throws DmException {
+        if ((experiment.getName() == null) || (experiment.getName().length() == 0)) {
+            throw new InvalidRequest("Experiment name is missing.");
+        }
+        verifyExperiment(experiment);        
+        logger.debug("Updating experiment " + experiment.getName()); 
+    }
+
+     @Override
+     protected String getObjectAlreadyExistMessage(Experiment experiment)  {
+        if (experiment == null) {
+            return null;
+        }
+        return "Experiment " + experiment.getName() + " already exists."; 
+    }
+     
+    private void verifyExperiment(Experiment experiment) throws DmException {       
+        if (experiment.getExperimentType() == null) {
+            throw new InvalidRequest("Experiment type is missing.");
+        }
+        
+        if ((experiment.getStartDate() != null) && (experiment.getEndDate() != null) && (experiment.getEndDate().before(experiment.getStartDate()))) {
+            throw new InvalidRequest("Experiment end date is before start date.");
+        }
+    }
+   
+    @Override
+    public String update() {
+        // Notify DS Web Service
+        try {
+            ExperimentDsApi api = DmApiFactory.getExperimentDsApi();
+            api.updateExperiment(getCurrent().getName());
+        }
+        catch (DmException ex) {
+            logger.error("Could not notify Data Storage Service: " + ex);
+            SessionUtility.addErrorMessage("Error", "Unable to notify Data Storage Service: " + ex.getErrorMessage());
+        }
+        clear();
+        return super.update();
+    }
+    
+    @FacesConverter(forClass = Experiment.class)
+    public static class ExperimentControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            ExperimentController controller = (ExperimentController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "experimentController");
+            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 Experiment) {
+                Experiment o = (Experiment) object;
+                return getStringKey(o.getId());
+            }
+            else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Experiment.class.getName());
+            }
+        }
+
+    }
+   
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentPolicyController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentPolicyController.java
new file mode 100644
index 0000000000000000000000000000000000000000..26c6d690b1ce3e795cc3041d73aacae25eb0f62e
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentPolicyController.java
@@ -0,0 +1,96 @@
+
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.portal.model.beans.ExperimentPolicyFacade;
+import gov.anl.aps.dm.portal.model.entities.ExperimentPolicy;
+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("experimentPolicyController")
+@SessionScoped
+public class ExperimentPolicyController extends DmEntityController<ExperimentPolicy, ExperimentPolicyFacade>
+{
+    private static final Logger logger = Logger.getLogger(ExperimentPolicyController.class.getName());
+
+    @EJB
+    private ExperimentPolicyFacade experimentPolicyFacade;
+
+    public ExperimentPolicyController() {
+    }
+    
+    @Override
+    protected ExperimentPolicyFacade getFacade() {
+        return experimentPolicyFacade;
+    }
+
+    @Override
+    protected ExperimentPolicy createEntityInstance() {
+        return new ExperimentPolicy();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "experimentPolicy";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        return "";
+    }
+
+     @Override
+     protected String getObjectAlreadyExistMessage(ExperimentPolicy experimentPolicy)  {
+        if (experimentPolicy == null) {
+            return null;
+        }
+        return "Experiment policy already exists."; 
+    }
+     
+    @FacesConverter(forClass = ExperimentPolicy.class)
+    public static class ExperimentPolicyControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            ExperimentPolicyController controller = (ExperimentPolicyController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "experimentPolicyController");
+            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 ExperimentPolicy) {
+                ExperimentPolicy o = (ExperimentPolicy) object;
+                return getStringKey(o.getId());
+            }
+            else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ExperimentPolicy.class.getName());
+            }
+        }
+
+    }
+   
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..f9a1349cff44a9ccabbd3a74600eac224c4d0fd1
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentStationController.java
@@ -0,0 +1,120 @@
+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.ExperimentStationFacade;
+import gov.anl.aps.dm.portal.model.entities.ExperimentStation;
+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("experimentStationController")
+@SessionScoped
+public class ExperimentStationController extends DmEntityController<ExperimentStation, ExperimentStationFacade> {
+
+    private static final Logger logger = Logger.getLogger(ExperimentStationController.class.getName());
+
+    @EJB
+    private ExperimentStationFacade experimentStationFacade;
+
+    public ExperimentStationController() {
+    }
+
+    @Override
+    protected ExperimentStationFacade getFacade() {
+        return experimentStationFacade;
+    }
+
+    @Override
+    protected ExperimentStation createEntityInstance() {
+        return new ExperimentStation();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "experimentStation";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        if (getCurrent() != null) {
+            return getCurrent().getName();
+        }
+        return "";
+    }
+
+    @Override
+    public void prepareEntityInsert(ExperimentStation experimentStation) throws DmException {
+        if ((experimentStation.getName() == null) || (experimentStation.getName().length() == 0)) {
+            throw new InvalidRequest("Experiment station name is missing.");
+        }
+        ExperimentStation existingExperimentStation = experimentStationFacade.findByName(experimentStation.getName());
+        if (existingExperimentStation != null) {
+            throw new ObjectAlreadyExists("Experiment station " + experimentStation.getName() + " already exists.");
+        }
+        logger.debug("Inserting new experiment type " + experimentStation.getName());
+    }
+
+    @Override
+    public void prepareEntityUpdate(ExperimentStation experimentStation) throws DmException {
+        if ((experimentStation.getName() == null) || (experimentStation.getName().length() == 0)) {
+            throw new InvalidRequest("Experiment type name is missing.");
+        }
+        logger.debug("Updating experiment type " + experimentStation.getName());
+    }
+
+    @Override
+    protected String getObjectAlreadyExistMessage(ExperimentStation experimentStation) {
+        if (experimentStation == null) {
+            return null;
+        }
+        return "Experiment station " + experimentStation.getName() + " already exists.";
+    }
+
+    @FacesConverter(forClass = ExperimentStation.class)
+    public static class ExperimentStationControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            ExperimentStationController controller = (ExperimentStationController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "experimentStationController");
+            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 ExperimentStation) {
+                ExperimentStation o = (ExperimentStation) object;
+                return getStringKey(o.getId());
+            } else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ExperimentStation.class.getName());
+            }
+        }
+
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentTypeController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentTypeController.java
new file mode 100644
index 0000000000000000000000000000000000000000..469e62e5a43885f8bb0ab9910fcb92a43c1d246f
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentTypeController.java
@@ -0,0 +1,120 @@
+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.ExperimentTypeFacade;
+import gov.anl.aps.dm.portal.model.entities.ExperimentType;
+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("experimentTypeController")
+@SessionScoped
+public class ExperimentTypeController extends DmEntityController<ExperimentType, ExperimentTypeFacade> {
+
+    private static final Logger logger = Logger.getLogger(ExperimentTypeController.class.getName());
+
+    @EJB
+    private ExperimentTypeFacade experimentTypeFacade;
+
+    public ExperimentTypeController() {
+    }
+
+    @Override
+    protected ExperimentTypeFacade getFacade() {
+        return experimentTypeFacade;
+    }
+
+    @Override
+    protected ExperimentType createEntityInstance() {
+        return new ExperimentType();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "experimentType";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        if (getCurrent() != null) {
+            return getCurrent().getName();
+        }
+        return "";
+    }
+
+    @Override
+    public void prepareEntityInsert(ExperimentType experimentType) throws DmException {
+        if ((experimentType.getName() == null) || (experimentType.getName().length() == 0)) {
+            throw new InvalidRequest("Experiment type name is missing.");
+        }
+        ExperimentType existingExperimentType = experimentTypeFacade.findByName(experimentType.getName());
+        if (existingExperimentType != null) {
+            throw new ObjectAlreadyExists("Experiment type " + experimentType.getName() + " already exists.");
+        }
+        logger.debug("Inserting new experiment type " + experimentType.getName());
+    }
+
+    @Override
+    public void prepareEntityUpdate(ExperimentType experimentType) throws DmException {
+        if ((experimentType.getName() == null) || (experimentType.getName().length() == 0)) {
+            throw new InvalidRequest("Experiment type name is missing.");
+        }
+        logger.debug("Updating experiment type " + experimentType.getName());
+    }
+
+    @Override
+    protected String getObjectAlreadyExistMessage(ExperimentType experimentType) {
+        if (experimentType == null) {
+            return null;
+        }
+        return "Experiment type " + experimentType.getName() + " already exists.";
+    }
+
+    @FacesConverter(forClass = ExperimentType.class)
+    public static class ExperimentTypeControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            ExperimentTypeController controller = (ExperimentTypeController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "experimentTypeController");
+            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 ExperimentType) {
+                ExperimentType o = (ExperimentType) object;
+                return getStringKey(o.getId());
+            } else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ExperimentType.class.getName());
+            }
+        }
+
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java
new file mode 100644
index 0000000000000000000000000000000000000000..0208cf9c1d504d610c983879bd8b5560756d03e9
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java
@@ -0,0 +1,194 @@
+/*
+ * 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.controllers;
+
+import gov.anl.aps.dm.portal.model.beans.UserInfoFacade;
+import gov.anl.aps.dm.portal.model.entities.UserInfo;
+import gov.anl.aps.dm.common.utilities.CryptUtility;
+import gov.anl.aps.dm.common.utilities.LdapUtility;
+import gov.anl.aps.dm.portal.utilities.AuthorizationUtility;
+import gov.anl.aps.dm.portal.utilities.SessionUtility;
+import java.io.Serializable;
+import java.util.Objects;
+import javax.ejb.EJB;
+import javax.enterprise.context.SessionScoped;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.inject.Named;
+import org.apache.log4j.Logger;
+
+/**
+ * Login controller.
+ */
+@Named("loginController")
+@SessionScoped
+public class LoginController implements Serializable
+{
+
+    @EJB
+    private UserInfoFacade userInfoFacade;
+    
+    private String username = null;
+    private String password = null;
+    private boolean loggedIn = false;
+    private UserInfo user = null;
+    private boolean isAdmin;
+
+    private static final Logger logger = Logger.getLogger(LoginController.class.getName());
+
+    /**
+     * Constructor.
+     */
+    public LoginController() {
+    }
+
+    /**
+     * Get password.
+     *
+     * @return login password
+     */
+    public String getPassword() {
+        return password;
+    }
+
+    /**
+     * Set password.
+     *
+     * @param password login password
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    /**
+     * Get username.
+     *
+     * @return login username
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * Set username.
+     *
+     * @param username login username
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * Check if user is logged in.
+     *
+     * @return true if admin is logged in, false otherwise
+     */
+    public boolean isLoggedIn() {
+        return loggedIn;
+    }
+
+    /**
+     * Login action.
+     *
+     * @return url to service home page if login is successful, or null in case
+     * of errors
+     */
+    public String login() {
+        loggedIn = false;
+        if (username == null || password == null || username.isEmpty() || password.isEmpty()) {
+           SessionUtility.addWarningMessage(null, "Incomplete Input. Please enter both username and password.");
+           return (username = password = null);
+        }
+
+        user = userInfoFacade.findByUsername(username);
+        if (user == null) {
+            SessionUtility.addErrorMessage(null, "Username " + username + " is not registered. Contact administrator.");
+            return (username = password = null);
+        }
+
+        boolean validCredentials = false;
+        if (user.getPassword() != null && CryptUtility.verifyPasswordWithPbkdf2(password, user.getPassword())) {
+            logger.debug("User " + username + " is authorized by DM DB");
+            validCredentials = true;
+        }
+        else if (LdapUtility.validateCredentials(username, password)) {
+            logger.debug("User " + username + " is authorized by DM LDAP");
+            validCredentials = true;
+        }
+        else {
+            logger.debug("User " + username + " is not authorized.");
+        }
+
+        if (validCredentials) {
+            SessionUtility.setUser(user);
+
+            loggedIn = true;
+            SessionUtility.addInfoMessage("Successful Login", "User " + username + " is logged in.");
+            isAdmin = AuthorizationUtility.isAdmin(user);
+            return getLandingPage();
+        }
+        else {
+             SessionUtility.addErrorMessage(null, "Invalid Credentials. Username/password combination could not be verified.");
+             SessionUtility.addErrorMessage(null, "If you are having difficulty logging in, please see our <a href=\"/dm/views/loginHelp.xhtml\">login help</a> page.");
+            return (username = password = null);
+        }
+
+    }
+    
+    public String getLandingPage() {
+        String landingPage = SessionUtility.getCurrentViewId() + "?faces-redirect=true";
+        if (landingPage.contains("login")) {
+            landingPage = "/views/home?faces-redirect=true";
+        }
+        logger.debug("Landing page: " + landingPage);
+        return landingPage;
+    }
+    
+    public String displayUsername() {
+        if (isLoggedIn()) {
+            return username;
+        }
+        else {
+            return "Not Logged In";
+        }
+    }
+
+    public String displayRole() {
+        if (isAdmin()) {
+            return "Administrator";
+        }
+        else {
+            return "User";
+        }
+    }
+    
+    public boolean isUserWriteable(UserInfo user) {
+        if (!isLoggedIn()) {
+            return false;
+        }
+        return isLoggedIn() || Objects.equals(this.user.getId(), user.getId());
+    }
+
+    /**
+     * Logout action.
+     *
+     * @return url to logout page
+     */
+    public String logout() {
+        SessionUtility.clearSession();
+        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
+        context.invalidateSession();
+        loggedIn = false;
+        user = null;
+        return "/views/login?faces-redirect=true";
+    }
+
+        public boolean isAdmin() {
+            return isAdmin;
+    }
+
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java
new file mode 100644
index 0000000000000000000000000000000000000000..a79fc52bc2aeb5027e925a82343edace111132bd
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java
@@ -0,0 +1,176 @@
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.common.exceptions.InvalidRequest;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import gov.anl.aps.dm.common.exceptions.ObjectAlreadyExists;
+import gov.anl.aps.dm.portal.model.entities.UserInfo;
+import gov.anl.aps.dm.portal.model.beans.UserInfoFacade;
+import gov.anl.aps.dm.common.utilities.CryptUtility;
+import gov.anl.aps.dm.portal.utilities.SessionUtility;
+
+import java.util.List;
+import java.util.Map;
+import javax.ejb.EJB;
+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 javax.inject.Named;
+import org.apache.log4j.Logger;
+import org.primefaces.component.datatable.DataTable;
+
+@Named("userInfoController")
+@SessionScoped
+public class UserInfoController extends DmEntityController<UserInfo, UserInfoFacade> {
+
+    private static final Logger logger = Logger.getLogger(UserInfoController.class.getName());
+
+    @EJB
+    private UserInfoFacade userInfoFacade;
+
+    private String passwordEntry = null;
+
+    public UserInfoController() {
+    }
+
+    @Override
+    protected UserInfoFacade getFacade() {
+        return userInfoFacade;
+    }
+
+    @Override
+    protected UserInfo createEntityInstance() {
+        return new UserInfo();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "userInfo";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        if (getCurrent() != null) {
+            return getCurrent().getUsername();
+        }
+        return "";
+    }
+    
+    @Override
+    public List<UserInfo> getAvailableItems() {
+        return super.getAvailableItems();
+    }
+    
+    @Override
+    public String prepareEdit(UserInfo user) {
+        passwordEntry = null;
+        return super.prepareEdit(user);
+    }
+
+    @Override
+    public void prepareEntityInsert(UserInfo user) throws DmException {
+        checkMandatoryParameters(user);
+        UserInfo existingUser = userInfoFacade.findByUsername(user.getUsername());
+        if (existingUser != null) {
+            throw new ObjectAlreadyExists("User " + user.getUsername() + " already exists.");
+        }
+        if (passwordEntry != null && !passwordEntry.isEmpty()) {
+            logger.debug("Will crypt provided password for user " + user.getUsername());
+            String cryptedPassword = CryptUtility.cryptPasswordWithPbkdf2(passwordEntry);
+            user.setPassword(cryptedPassword);
+        }
+        passwordEntry = null;
+        user.setIsLocalUser(true);
+        logger.debug("Inserting new user " + user.getUsername());
+    }
+
+    private void checkMandatoryParameters(UserInfo user) throws InvalidRequest {
+        if ((user.getUsername() == null) || (user.getUsername().length() == 0)) {
+            throw new InvalidRequest("Missing username.");
+        }
+        if ((user.getLastName() == null) || (user.getLastName().length() == 0)) {
+            throw new InvalidRequest("Missing user last name.");
+        }
+        if ((user.getFirstName() == null) || (user.getFirstName().length() == 0)) {
+            throw new InvalidRequest("Missing user first name.");
+        }
+    }
+
+    @Override
+    public void prepareEntityUpdate(UserInfo user) throws DmException {
+        checkMandatoryParameters(user);
+        if (passwordEntry != null && !passwordEntry.isEmpty()) {
+            logger.debug("Will crypt provided password for user " + user.getUsername());
+            String cryptedPassword = CryptUtility.cryptPasswordWithPbkdf2(passwordEntry);
+            user.setPassword(cryptedPassword);
+        }
+        passwordEntry = null;
+    }
+
+    @Override
+    protected String getObjectAlreadyExistMessage(UserInfo user) {
+        if (user == null) {
+            return null;
+        }
+        return "User " + user.getUsername() + " already exists.";
+    }
+
+    public String prepareSessionUserEdit(String viewPath) {
+        UserInfo sessionUser = (UserInfo) SessionUtility.getUser();
+        if (sessionUser == null) {
+            return null;
+        }
+        prepareEdit(sessionUser);
+        return viewPath + "?faces-redirect=true";
+    }
+
+    public String getPasswordEntry() {
+        return passwordEntry;
+    }
+
+    public void setPasswordEntry(String passwordEntry) {
+        this.passwordEntry = passwordEntry;
+    }
+    
+    @FacesConverter(forClass = UserInfo.class)
+    public static class UserInfoControllerConverter implements Converter {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            UserInfoController controller = (UserInfoController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "userInfoController");
+            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 UserInfo) {
+                UserInfo o = (UserInfo) object;
+                return getStringKey(o.getId());
+            } else {
+                throw new IllegalArgumentException("Object " + object + " is of type " + object.getClass().getName() + "; expected type: " + UserInfo.class.getName());
+            }
+        }
+
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AbstractFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AbstractFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..7fb625a13eb321dca32ce3b34cc69ec479005b0a
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AbstractFacade.java
@@ -0,0 +1,65 @@
+/*
+ * 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 java.util.List;
+import javax.persistence.EntityManager;
+
+/**
+ *
+ * @author sveseli
+ */
+public abstract class AbstractFacade<T>
+{
+    private Class<T> entityClass;
+
+    public AbstractFacade(Class<T> entityClass) {
+        this.entityClass = entityClass;
+    }
+
+    protected abstract EntityManager getEntityManager();
+
+    public void create(T entity) {
+        getEntityManager().persist(entity);
+    }
+
+    public void edit(T entity) {
+        getEntityManager().merge(entity);
+    }    
+
+    public void remove(T entity) {
+        getEntityManager().remove(getEntityManager().merge(entity));
+    }
+
+    public T find(Object id) {
+        return getEntityManager().find(entityClass, id);
+    }
+
+    public List<T> findAll() {
+        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
+        cq.select(cq.from(entityClass));
+        return getEntityManager().createQuery(cq).getResultList();
+    }
+
+    public List<T> findRange(int[] range) {
+        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
+        cq.select(cq.from(entityClass));
+        javax.persistence.Query q = getEntityManager().createQuery(cq);
+        q.setMaxResults(range[1] - range[0] + 1);
+        q.setFirstResult(range[0]);
+        return q.getResultList();
+    }
+
+    public int count() {
+        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
+        javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
+        cq.select(getEntityManager().getCriteriaBuilder().count(rt));
+        javax.persistence.Query q = getEntityManager().createQuery(cq);
+        return ((Long) q.getSingleResult()).intValue();
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AllowedPolicyValueFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AllowedPolicyValueFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e325004dc4381c92ba79789274a6c85b29ddb77
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AllowedPolicyValueFacade.java
@@ -0,0 +1,65 @@
+/*
+ * 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.AllowedPolicyValue;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class AllowedPolicyValueFacade extends AbstractFacade<AllowedPolicyValue>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public AllowedPolicyValueFacade() {
+        super(AllowedPolicyValue.class);
+    }
+    
+    public AllowedPolicyValue findByName(String name) {
+        try {
+            return (AllowedPolicyValue) em.createNamedQuery("AllowedPolicyValue.findByPolicyValue")
+                    .setParameter("policyValue", name)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public AllowedPolicyValue findById(int id) {
+        try {
+            return (AllowedPolicyValue) em.createNamedQuery("AllowedPolicyValue.findById")
+                    .setParameter("id", id)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public List<AllowedPolicyValue> findByPolicyPropertyId(int id) {
+        try {
+            return (List<AllowedPolicyValue>) em.createNamedQuery("AllowedPolicyValue.findByPolicyPropertyId")
+                    .setParameter("policyPropertyId", id)
+                    .getResultList();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AllowedSettingValueFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AllowedSettingValueFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..2430b80703cd4325f7c270a70d9a9909a29bcc89
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/AllowedSettingValueFacade.java
@@ -0,0 +1,33 @@
+/*
+ * 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.AllowedSettingValue;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class AllowedSettingValueFacade extends AbstractFacade<AllowedSettingValue>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public AllowedSettingValueFacade() {
+        super(AllowedSettingValue.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/DataFolderFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/DataFolderFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..76be7494f44619fabf94d8cc89379e9ce36d6f2b
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/DataFolderFacade.java
@@ -0,0 +1,33 @@
+/*
+ * 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.DataFolder;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class DataFolderFacade extends AbstractFacade<DataFolder>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public DataFolderFacade() {
+        super(DataFolder.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/DataFolderPermissionFacade.java.deleted b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/DataFolderPermissionFacade.java.deleted
new file mode 100644
index 0000000000000000000000000000000000000000..bdcb44d5963ef4787a4aeaa929915dd0716def70
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/DataFolderPermissionFacade.java.deleted
@@ -0,0 +1,33 @@
+/*
+ * 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.DataFolderPermission;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class DataFolderPermissionFacade extends AbstractFacade<DataFolderPermission>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public DataFolderPermissionFacade() {
+        super(DataFolderPermission.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/EndpointFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/EndpointFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..620b735cba0ad5e77618a01f4518d73594af229c
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/EndpointFacade.java
@@ -0,0 +1,32 @@
+/*
+ * 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.Endpoint;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class EndpointFacade extends AbstractFacade<Endpoint> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public EndpointFacade() {
+        super(Endpoint.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebf51d3f6bf4901e7a7c2b727fe6351bf32c7a95
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java
@@ -0,0 +1,49 @@
+/*
+ * 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.Experiment;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class ExperimentFacade extends AbstractFacade<Experiment>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public ExperimentFacade() {
+        super(Experiment.class);
+    }
+    
+    public Experiment findByName(String name) {
+        try {
+            return (Experiment) em.createNamedQuery("Experiment.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public boolean checkIfNameExists(String name) {
+        return findByName(name) != null;
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentPolicyFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentPolicyFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..758d6979d4b6507b828973d1f5d54fd9ae454f01
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentPolicyFacade.java
@@ -0,0 +1,57 @@
+/*
+ * 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.ExperimentPolicy;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class ExperimentPolicyFacade extends AbstractFacade<ExperimentPolicy>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public ExperimentPolicyFacade() {
+        super(ExperimentPolicy.class);
+    }
+    
+    public ExperimentPolicy findById(int id) {
+        try {
+            return (ExperimentPolicy) em.createNamedQuery("ExperimentPolicy.findById")
+                    .setParameter("id", id)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+        
+    public List<ExperimentPolicy> findByExperimentId(int id) {
+        try {
+            return (List<ExperimentPolicy>) em.createNamedQuery("ExperimentPolicy.findByExperimentId")
+                    .setParameter("experimentId", id)
+                    .getResultList();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+                
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentPolicyPropertyValueFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentPolicyPropertyValueFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1a539d1bc876362107fabce99e19b11b377fc7d
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentPolicyPropertyValueFacade.java
@@ -0,0 +1,58 @@
+/*
+ * 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.ExperimentPolicyPropertyValue;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author bfrosik
+ */
+@Stateless
+public class ExperimentPolicyPropertyValueFacade extends AbstractFacade<ExperimentPolicyPropertyValue>
+{
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public ExperimentPolicyPropertyValueFacade() {
+        super(ExperimentPolicyPropertyValue.class);
+    }
+    
+    public ExperimentPolicyPropertyValue findById(int id) {
+        try {
+            return (ExperimentPolicyPropertyValue) em.createNamedQuery("ExperimentPolicyPropertyValue.findById")
+                    .setParameter("id", id)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+    
+    public List<ExperimentPolicyPropertyValue> findByExperimentPolicyId(int id) {
+        try {
+            return (List<ExperimentPolicyPropertyValue>) em.createNamedQuery("ExperimentPolicyPropertyValue.findByExperimentPolicyId")
+                    .setParameter("experimentPolicyId", id)
+                    .getResultList();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+        
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentRoleTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentRoleTypeFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..19e82fa88a9774fda42c95299322275bbba47924
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentRoleTypeFacade.java
@@ -0,0 +1,32 @@
+/*
+ * 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.ExperimentRoleType;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class ExperimentRoleTypeFacade extends AbstractFacade<ExperimentRoleType> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public ExperimentRoleTypeFacade() {
+        super(ExperimentRoleType.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentStationFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentStationFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..3149168687f9be13d91d0e1d0c7af09f05115d9c
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentStationFacade.java
@@ -0,0 +1,42 @@
+/*
+ * 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.ExperimentStation;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class ExperimentStationFacade extends AbstractFacade<ExperimentStation> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public ExperimentStationFacade() {
+        super(ExperimentStation.class);
+    }
+
+    public ExperimentStation findByName(String name) {
+        try {
+            return (ExperimentStation) em.createNamedQuery("ExperimentStation.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentTypeFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7e3bfa56c37f212f5374630621292c1a0835a76
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentTypeFacade.java
@@ -0,0 +1,45 @@
+/*
+ * 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.ExperimentType;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class ExperimentTypeFacade extends AbstractFacade<ExperimentType>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public ExperimentTypeFacade() {
+        super(ExperimentType.class);
+    }
+
+    public ExperimentType findByName(String name) {
+        try {
+            return (ExperimentType) em.createNamedQuery("ExperimentType.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/PolicyPropertyFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/PolicyPropertyFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..86ed4daa483922bddb6af94c26839084d98469c0
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/PolicyPropertyFacade.java
@@ -0,0 +1,73 @@
+/*
+ * 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.PolicyProperty;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author bfrosik
+ */
+@Stateless
+public class PolicyPropertyFacade extends AbstractFacade<PolicyProperty>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+    
+//    @Override
+//    public void remove(PolicyProperty entity) {
+//        Object o = em.merge(entity);
+//        em.remove(o);
+//    }
+
+
+    public PolicyPropertyFacade() {
+        super(PolicyProperty.class);
+    }
+    
+    public PolicyProperty findByName(String name) {
+        try {
+            return (PolicyProperty) em.createNamedQuery("PolicyProperty.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public PolicyProperty findById(int id) {
+        try {
+            return (PolicyProperty) em.createNamedQuery("PolicyProperty.findById")
+                    .setParameter("id", id)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+    
+    public List<PolicyProperty> findByPolicyTypeId(int id) {
+        try {
+            return (List<PolicyProperty>) em.createNamedQuery("PolicyProperty.findByPolicyTypeId")
+                    .setParameter("policyTypeId", id)
+                    .getResultList();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+                   
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/PolicyTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/PolicyTypeFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..05668708f03cae6fdbf2a71c5606f6ad9adfc570
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/PolicyTypeFacade.java
@@ -0,0 +1,54 @@
+/*
+ * 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.PolicyType;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class PolicyTypeFacade extends AbstractFacade<PolicyType>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public PolicyTypeFacade() {
+        super(PolicyType.class);
+    }
+    
+    public PolicyType findByName(String name) {
+        try {
+            return (PolicyType) em.createNamedQuery("PolicyType.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public PolicyType findById(int id) {
+        try {
+            return (PolicyType) em.createNamedQuery("PolicyType.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/RoleTypeFacade.java.deleted b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java.deleted
new file mode 100644
index 0000000000000000000000000000000000000000..1ccb9885bfacb5d434b65a06ab49efdf468191cf
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java.deleted
@@ -0,0 +1,59 @@
+/*
+ * 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.RoleType;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class RoleTypeFacade extends AbstractFacade<RoleType>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public RoleTypeFacade() {
+        super(RoleType.class);
+    }
+
+    public RoleType findByName(String name) {
+        try {
+            return (RoleType) em.createNamedQuery("RoleType.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public RoleType findById(int id) {
+        try {
+            return (RoleType) em.createNamedQuery("RoleType.findById")
+                    .setParameter("id", id)
+                    .getSingleResult();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public boolean checkIfNameExists(String name) {
+        return findByName(name) != null;
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/SettingTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/SettingTypeFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..058668044a4986051b8908a79dd897d7bc18618f
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/SettingTypeFacade.java
@@ -0,0 +1,33 @@
+/*
+ * 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.SettingType;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class SettingTypeFacade extends AbstractFacade<SettingType>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public SettingTypeFacade() {
+        super(SettingType.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..a8baf6705ab3b761cb5c42a547e1b1046f9ab8e8
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/StorageFacade.java
@@ -0,0 +1,32 @@
+/*
+ * 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.Storage;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class StorageFacade extends AbstractFacade<Storage> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public StorageFacade() {
+        super(Storage.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/SystemRoleTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/SystemRoleTypeFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..f55f1b8df2e0afddebb382af9075e55bb9afb3e4
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/SystemRoleTypeFacade.java
@@ -0,0 +1,32 @@
+/*
+ * 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.SystemRoleType;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class SystemRoleTypeFacade extends AbstractFacade<SystemRoleType> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public SystemRoleTypeFacade() {
+        super(SystemRoleType.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d223067b891a5ac3cb11be0209498a07d67254a
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java
@@ -0,0 +1,46 @@
+/*
+ * 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.UserExperimentRole;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class UserExperimentRoleFacade extends AbstractFacade<UserExperimentRole>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public UserExperimentRoleFacade() {
+        super(UserExperimentRole.class);
+    }
+    
+    public UserExperimentRole findByUserExperimentRole(int userId, int experimentId, int roleId) {
+        try {
+            return (UserExperimentRole) em.createNamedQuery("UserExperimentRole.findByUserExperimentRole")
+                    .setParameter("userId", userId)
+                    .setParameter("experimentId", experimentId)
+                    .setParameter("roleTypeId", roleId)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..57ec1bcb363a48bba943fe85dbc7996828f8aa27
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
@@ -0,0 +1,103 @@
+/*
+ * 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.Experiment;
+import gov.anl.aps.dm.portal.model.entities.UserInfo;
+import java.util.List;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class UserInfoFacade extends AbstractFacade<UserInfo>
+{
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public UserInfoFacade() {
+        super(UserInfo.class);
+    }
+
+    public UserInfo findByUsername(String username) {
+        try {
+            return (UserInfo) em.createNamedQuery("UserInfo.findByUsername")
+                    .setParameter("username", username)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public boolean checkIfUsernameExists(String username) {
+        return findByUsername(username) != null;
+    }
+
+    public List<UserInfo> findNoSystemRoleUsers(Integer roleTypeId) {
+        try {
+            return (List<UserInfo>) em.createNamedQuery("UserInfo.findNonAdmins")
+                .setParameter("roleTypeId", roleTypeId)
+                .getResultList();
+        }
+        catch (NoResultException ex) {            
+        }
+        return null;
+    }
+
+    public List<UserInfo> findSystemRoleUsers(int roleTypeId) {
+        try {
+            return (List<UserInfo>) em.createNamedQuery("UserInfo.findUsersInRole")
+                .setParameter("roleTypeId", roleTypeId)
+                .getResultList();
+        }
+        catch (NoResultException ex) {            
+        }
+        return null;
+    }
+
+    public List<UserInfo> findUsersInExperiment(int experimentId) {
+        try {
+            return (List<UserInfo>) em.createNamedQuery("UserInfo.findUsersInExperiment")
+                    .setParameter("experimentId", experimentId)
+                    .getResultList();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public List<UserInfo> findNoUsersInExperiment(int experimentId) {
+        try {
+            return (List<UserInfo>) em.createNamedQuery("UserInfo.findNoUsersInExperiment")
+                    .setParameter("experimentId", experimentId)
+                    .getResultList();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public List<Experiment> findExperimentsInUser(int userId) {
+        try {
+            return (List<Experiment>) em.createNamedQuery("UserInfo.findExperimentsInUser")
+                    .setParameter("userId", userId)
+                    .getResultList();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserSettingFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserSettingFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..6d4a00e2a98de265e6e0fc3edecf7a9b945135cf
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserSettingFacade.java
@@ -0,0 +1,33 @@
+/*
+ * 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.UserSetting;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class UserSettingFacade extends AbstractFacade<UserSetting>
+{
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public UserSettingFacade() {
+        super(UserSetting.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserSystemRoleFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserSystemRoleFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..caea3bebe670bcca973555215cba8263bcb3cf4b
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserSystemRoleFacade.java
@@ -0,0 +1,32 @@
+/*
+ * 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.UserSystemRole;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+/**
+ *
+ * @author sveseli
+ */
+@Stateless
+public class UserSystemRoleFacade extends AbstractFacade<UserSystemRole> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public UserSystemRoleFacade() {
+        super(UserSystemRole.class);
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UsersLastUpdateFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UsersLastUpdateFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..7bc51050d6a10de37697605be000286ef2cfad6a
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UsersLastUpdateFacade.java
@@ -0,0 +1,32 @@
+/*
+ * 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 UsersLastUpdateFacade extends AbstractFacade<UsersLastUpdate> {
+
+    @PersistenceContext(unitName = "DmWebPortalPU")
+    private EntityManager em;
+
+    @Override
+    protected EntityManager getEntityManager() {
+        return em;
+    }
+
+    public UsersLastUpdateFacade() {
+        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
new file mode 100644
index 0000000000000000000000000000000000000000..36b1ac95a0ee243651ba573e01f20ddef73defa9
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedPolicyValue.java
@@ -0,0 +1,122 @@
+/*
+ * 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.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "allowed_policy_value")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "AllowedPolicyValue.findAll", query = "SELECT a FROM AllowedPolicyValue a")
+    , @NamedQuery(name = "AllowedPolicyValue.findById", query = "SELECT a FROM AllowedPolicyValue a WHERE a.id = :id")
+    , @NamedQuery(name = "AllowedPolicyValue.findByPolicyValue", query = "SELECT a FROM AllowedPolicyValue a WHERE a.policyValue = :policyValue")
+    , @NamedQuery(name = "AllowedPolicyValue.findByDescription", query = "SELECT a FROM AllowedPolicyValue a WHERE a.description = :description")})
+public class AllowedPolicyValue extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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)
+    private PolicyProperty policyPropertyId;
+
+    public AllowedPolicyValue() {
+    }
+
+    public AllowedPolicyValue(Integer id) {
+        this.id = id;
+    }
+
+    public AllowedPolicyValue(Integer id, String policyValue) {
+        this.id = id;
+        this.policyValue = policyValue;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getPolicyValue() {
+        return policyValue;
+    }
+
+    public void setPolicyValue(String policyValue) {
+        this.policyValue = policyValue;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public PolicyProperty getPolicyPropertyId() {
+        return policyPropertyId;
+    }
+
+    public void setPolicyPropertyId(PolicyProperty policyPropertyId) {
+        this.policyPropertyId = policyPropertyId;
+    }
+
+    @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 AllowedPolicyValue)) {
+            return false;
+        }
+        AllowedPolicyValue other = (AllowedPolicyValue) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..449d5867b5534341bb29586ab6c72a10d22cd991
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/AllowedSettingValue.java
@@ -0,0 +1,114 @@
+/*
+ * 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.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "allowed_setting_value")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "AllowedSettingValue.findAll", query = "SELECT a FROM AllowedSettingValue a")
+    , @NamedQuery(name = "AllowedSettingValue.findById", query = "SELECT a FROM AllowedSettingValue a WHERE a.id = :id")
+    , @NamedQuery(name = "AllowedSettingValue.findBySettingValue", query = "SELECT a FROM AllowedSettingValue a WHERE a.settingValue = :settingValue")
+    , @NamedQuery(name = "AllowedSettingValue.findByDescription", query = "SELECT a FROM AllowedSettingValue a WHERE a.description = :description")})
+public class AllowedSettingValue extends CloneableEntity {
+
+    @Id
+    @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)
+    private SettingType settingTypeId;
+
+    public AllowedSettingValue() {
+    }
+
+    public AllowedSettingValue(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getSettingValue() {
+        return settingValue;
+    }
+
+    public void setSettingValue(String settingValue) {
+        this.settingValue = settingValue;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public SettingType getSettingTypeId() {
+        return settingTypeId;
+    }
+
+    public void setSettingTypeId(SettingType settingTypeId) {
+        this.settingTypeId = settingTypeId;
+    }
+
+    @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 AllowedSettingValue)) {
+            return false;
+        }
+        AllowedSettingValue other = (AllowedSettingValue) 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.AllowedSettingValue[ id=" + id + " ]";
+    }
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/CloneableEntity.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/CloneableEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..c66ccbccf8cc7fe415aefc8696283aaa2dcc1dcf
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/CloneableEntity.java
@@ -0,0 +1,29 @@
+/*
+ * 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 gov.anl.aps.dm.portal.utilities.SearchResult;
+import java.io.Serializable;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author sveseli
+ */
+public class CloneableEntity implements Serializable, Cloneable
+{
+    protected static final long serialVersionUID = 1L;
+    @Override
+    public Object clone() throws CloneNotSupportedException {
+        return super.clone();
+    }
+    
+    public SearchResult search(Pattern searchPattern) {
+        return null;
+    }
+    
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..6b7604431c826afbbd4df1a7fbec625026060911
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/DataFolder.java
@@ -0,0 +1,133 @@
+/*
+ * 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.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "data_folder")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "DataFolder.findAll", query = "SELECT d FROM DataFolder d")
+    , @NamedQuery(name = "DataFolder.findById", query = "SELECT d FROM DataFolder d WHERE d.id = :id")
+    , @NamedQuery(name = "DataFolder.findByDataPath", query = "SELECT d FROM DataFolder d WHERE d.dataPath = :dataPath")
+    , @NamedQuery(name = "DataFolder.findByDescription", query = "SELECT d FROM DataFolder d WHERE d.description = :description")})
+public class DataFolder extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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)
+    private Experiment experimentId;
+    @JoinColumn(name = "storage_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private Storage storageId;
+
+    public DataFolder() {
+    }
+
+    public DataFolder(Integer id) {
+        this.id = id;
+    }
+
+    public DataFolder(Integer id, String dataPath) {
+        this.id = id;
+        this.dataPath = dataPath;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getDataPath() {
+        return dataPath;
+    }
+
+    public void setDataPath(String dataPath) {
+        this.dataPath = dataPath;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Experiment getExperimentId() {
+        return experimentId;
+    }
+
+    public void setExperimentId(Experiment experimentId) {
+        this.experimentId = experimentId;
+    }
+
+    public Storage getStorageId() {
+        return storageId;
+    }
+
+    public void setStorageId(Storage storageId) {
+        this.storageId = storageId;
+    }
+
+    @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 DataFolder)) {
+            return false;
+        }
+        DataFolder other = (DataFolder) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..8a5429a1aa374c5fe022cad3a5540a088c211392
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Endpoint.java
@@ -0,0 +1,134 @@
+/*
+ * 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.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "Endpoint.findAll", query = "SELECT e FROM Endpoint e")
+    , @NamedQuery(name = "Endpoint.findById", query = "SELECT e FROM Endpoint e WHERE e.id = :id")
+    , @NamedQuery(name = "Endpoint.findByName", query = "SELECT e FROM Endpoint e WHERE e.name = :name")
+    , @NamedQuery(name = "Endpoint.findByAccessUrl", query = "SELECT e FROM Endpoint e WHERE e.accessUrl = :accessUrl")
+    , @NamedQuery(name = "Endpoint.findByDescription", query = "SELECT e FROM Endpoint e WHERE e.description = :description")})
+public class Endpoint extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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)
+    private Storage storageId;
+
+    public Endpoint() {
+    }
+
+    public Endpoint(Integer id) {
+        this.id = id;
+    }
+
+    public Endpoint(Integer id, String name, String accessUrl) {
+        this.id = id;
+        this.name = name;
+        this.accessUrl = accessUrl;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAccessUrl() {
+        return accessUrl;
+    }
+
+    public void setAccessUrl(String accessUrl) {
+        this.accessUrl = accessUrl;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Storage getStorageId() {
+        return storageId;
+    }
+
+    public void setStorageId(Storage storageId) {
+        this.storageId = storageId;
+    }
+
+    @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 Endpoint)) {
+            return false;
+        }
+        Endpoint other = (Endpoint) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..3b60aef71fd4f8b74418673bdc846f5e5927fae5
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
@@ -0,0 +1,191 @@
+/*
+ * 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 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;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "Experiment.findAll", query = "SELECT e FROM Experiment e")
+    , @NamedQuery(name = "Experiment.findById", query = "SELECT e FROM Experiment e WHERE e.id = :id")
+    , @NamedQuery(name = "Experiment.findByName", query = "SELECT e FROM Experiment e WHERE e.name = :name")
+    , @NamedQuery(name = "Experiment.findByDescription", query = "SELECT e FROM Experiment e WHERE e.description = :description")
+    , @NamedQuery(name = "Experiment.findByStartDate", query = "SELECT e FROM Experiment e WHERE e.startDate = :startDate")
+    , @NamedQuery(name = "Experiment.findByEndDate", query = "SELECT e FROM Experiment e WHERE e.endDate = :endDate")})
+public class Experiment extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    private Integer id;
+    @Basic(optional = false)
+    @NotNull
+    private String name;
+    private String description;
+    @Column(name = "start_date")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date startDate;
+    @Column(name = "end_date")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date endDate;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "experiment")
+    private List<UserExperimentRole> userExperimentRoleList;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentId")
+    private List<DataFolder> dataFolderList;
+    @JoinColumn(name = "experiment_station_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private ExperimentStation experimentStation;
+    @JoinColumn(name = "experiment_type_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private ExperimentType experimentType;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentId")
+    private List<ExperimentPolicy> experimentPolicyList;
+
+    public Experiment() {
+    }
+
+    public Experiment(Integer id) {
+        this.id = id;
+    }
+
+    public Experiment(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    @XmlTransient
+    public List<UserExperimentRole> getUserExperimentRoleList() {
+        return userExperimentRoleList;
+    }
+
+    public void setUserExperimentRoleList(List<UserExperimentRole> userExperimentRoleList) {
+        this.userExperimentRoleList = userExperimentRoleList;
+    }
+
+    @XmlTransient
+    public List<DataFolder> getDataFolderList() {
+        return dataFolderList;
+    }
+
+    public void setDataFolderList(List<DataFolder> dataFolderList) {
+        this.dataFolderList = dataFolderList;
+    }
+
+    public ExperimentStation getExperimentStation() {
+        return experimentStation;
+    }
+
+    public void setExperimentStation(ExperimentStation experimentStation) {
+        this.experimentStation = experimentStation;
+    }
+
+    public ExperimentType getExperimentType() {
+        return experimentType;
+    }
+
+    public void setExperimentType(ExperimentType experimentType) {
+        this.experimentType = experimentType;
+    }
+
+    @XmlTransient
+    public List<ExperimentPolicy> getExperimentPolicyList() {
+        return experimentPolicyList;
+    }
+
+    public void setExperimentPolicyList(List<ExperimentPolicy> experimentPolicyList) {
+        this.experimentPolicyList = experimentPolicyList;
+    }
+
+    @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 Experiment)) {
+            return false;
+        }
+        Experiment other = (Experiment) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..b8fb2fc3c3306afd099e6d212fd2134be086595f
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicy.java
@@ -0,0 +1,115 @@
+/*
+ * 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.io.Serializable;
+import java.util.List;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "experiment_policy")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "ExperimentPolicy.findAll", query = "SELECT e FROM ExperimentPolicy e")
+    , @NamedQuery(name = "ExperimentPolicy.findById", query = "SELECT e FROM ExperimentPolicy e WHERE e.id = :id")})
+public class ExperimentPolicy extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    private Integer id;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentPolicyId")
+    private List<ExperimentPolicyPropertyValue> experimentPolicyPropertyValueList;
+    @JoinColumn(name = "experiment_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private Experiment experimentId;
+    @JoinColumn(name = "policy_type_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private PolicyType policyTypeId;
+
+    public ExperimentPolicy() {
+    }
+
+    public ExperimentPolicy(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @XmlTransient
+    public List<ExperimentPolicyPropertyValue> getExperimentPolicyPropertyValueList() {
+        return experimentPolicyPropertyValueList;
+    }
+
+    public void setExperimentPolicyPropertyValueList(List<ExperimentPolicyPropertyValue> experimentPolicyPropertyValueList) {
+        this.experimentPolicyPropertyValueList = experimentPolicyPropertyValueList;
+    }
+
+    public Experiment getExperimentId() {
+        return experimentId;
+    }
+
+    public void setExperimentId(Experiment experimentId) {
+        this.experimentId = experimentId;
+    }
+
+    public PolicyType getPolicyTypeId() {
+        return policyTypeId;
+    }
+
+    public void setPolicyTypeId(PolicyType policyTypeId) {
+        this.policyTypeId = policyTypeId;
+    }
+
+    @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 ExperimentPolicy)) {
+            return false;
+        }
+        ExperimentPolicy other = (ExperimentPolicy) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..1da548de74fbd4f863b7232121eb6cb103cac45f
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentPolicyPropertyValue.java
@@ -0,0 +1,151 @@
+/*
+ * 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.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+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.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "experiment_policy_property_value")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "ExperimentPolicyPropertyValue.findAll", query = "SELECT e FROM ExperimentPolicyPropertyValue e")
+    , @NamedQuery(name = "ExperimentPolicyPropertyValue.findById", query = "SELECT e FROM ExperimentPolicyPropertyValue e WHERE e.id = :id")
+    , @NamedQuery(name = "ExperimentPolicyPropertyValue.findByModifiedBy", query = "SELECT e FROM ExperimentPolicyPropertyValue e WHERE e.modifiedBy = :modifiedBy")
+    , @NamedQuery(name = "ExperimentPolicyPropertyValue.findByModifiedDate", query = "SELECT e FROM ExperimentPolicyPropertyValue e WHERE e.modifiedDate = :modifiedDate")
+    , @NamedQuery(name = "ExperimentPolicyPropertyValue.findByPolicyPropertyValue", query = "SELECT e FROM ExperimentPolicyPropertyValue e WHERE e.policyPropertyValue = :policyPropertyValue")})
+public class ExperimentPolicyPropertyValue extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    private Integer id;
+    @Basic(optional = false)
+    @NotNull
+    @Size(min = 1, max = 2147483647)
+    @Column(name = "modified_by")
+    private String modifiedBy;
+    @Basic(optional = false)
+    @NotNull
+    @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")
+    @ManyToOne(optional = false)
+    private ExperimentPolicy experimentPolicyId;
+    @JoinColumn(name = "policy_property_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private PolicyProperty policyPropertyId;
+
+    public ExperimentPolicyPropertyValue() {
+    }
+
+    public ExperimentPolicyPropertyValue(Integer id) {
+        this.id = id;
+    }
+
+    public ExperimentPolicyPropertyValue(Integer id, String modifiedBy, Date modifiedDate) {
+        this.id = id;
+        this.modifiedBy = modifiedBy;
+        this.modifiedDate = modifiedDate;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getModifiedBy() {
+        return modifiedBy;
+    }
+
+    public void setModifiedBy(String modifiedBy) {
+        this.modifiedBy = modifiedBy;
+    }
+
+    public Date getModifiedDate() {
+        return modifiedDate;
+    }
+
+    public void setModifiedDate(Date modifiedDate) {
+        this.modifiedDate = modifiedDate;
+    }
+
+    public String getPolicyPropertyValue() {
+        return policyPropertyValue;
+    }
+
+    public void setPolicyPropertyValue(String policyPropertyValue) {
+        this.policyPropertyValue = policyPropertyValue;
+    }
+
+    public ExperimentPolicy getExperimentPolicyId() {
+        return experimentPolicyId;
+    }
+
+    public void setExperimentPolicyId(ExperimentPolicy experimentPolicyId) {
+        this.experimentPolicyId = experimentPolicyId;
+    }
+
+    public PolicyProperty getPolicyPropertyId() {
+        return policyPropertyId;
+    }
+
+    public void setPolicyPropertyId(PolicyProperty policyPropertyId) {
+        this.policyPropertyId = policyPropertyId;
+    }
+
+    @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 ExperimentPolicyPropertyValue)) {
+            return false;
+        }
+        ExperimentPolicyPropertyValue other = (ExperimentPolicyPropertyValue) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..b6615ea3ea99af8dc08744c89adf09012848c953
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentRoleType.java
@@ -0,0 +1,121 @@
+/*
+ * 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.List;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "experiment_role_type")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "ExperimentRoleType.findAll", query = "SELECT e FROM ExperimentRoleType e")
+    , @NamedQuery(name = "ExperimentRoleType.findById", query = "SELECT e FROM ExperimentRoleType e WHERE e.id = :id")
+    , @NamedQuery(name = "ExperimentRoleType.findByName", query = "SELECT e FROM ExperimentRoleType e WHERE e.name = :name")
+    , @NamedQuery(name = "ExperimentRoleType.findByDescription", query = "SELECT e FROM ExperimentRoleType e WHERE e.description = :description")})
+public class ExperimentRoleType extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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;
+
+    public ExperimentRoleType() {
+    }
+
+    public ExperimentRoleType(Integer id) {
+        this.id = id;
+    }
+
+    public ExperimentRoleType(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<UserExperimentRole> getUserExperimentRoleList() {
+        return userExperimentRoleList;
+    }
+
+    public void setUserExperimentRoleList(List<UserExperimentRole> userExperimentRoleList) {
+        this.userExperimentRoleList = userExperimentRoleList;
+    }
+
+    @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 ExperimentRoleType)) {
+            return false;
+        }
+        ExperimentRoleType other = (ExperimentRoleType) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..4c9a73d676b52be906920128fb413fd0562a3781
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentStation.java
@@ -0,0 +1,147 @@
+/*
+ * 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.List;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "experiment_station")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "ExperimentStation.findAll", query = "SELECT e FROM ExperimentStation e")
+    , @NamedQuery(name = "ExperimentStation.findById", query = "SELECT e FROM ExperimentStation e WHERE e.id = :id")
+    , @NamedQuery(name = "ExperimentStation.findByName", query = "SELECT e FROM ExperimentStation e WHERE e.name = :name")
+    , @NamedQuery(name = "ExperimentStation.findByDescription", query = "SELECT e FROM ExperimentStation e WHERE e.description = :description")})
+public class ExperimentStation extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    private Integer id;
+    @Basic(optional = false)
+    @NotNull
+    private String name;
+    private String description;
+    @JoinTable(name = "allowed_experiment_station_experiment_type", joinColumns = {
+        @JoinColumn(name = "experiment_station_id", referencedColumnName = "id")}, inverseJoinColumns = {
+        @JoinColumn(name = "experiment_type_id", referencedColumnName = "id")})
+    @ManyToMany
+    private List<ExperimentType> experimentTypeList;
+    @OneToMany(mappedBy = "experimentStationId")
+    private List<UserSystemRole> userSystemRoleList;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentStation")
+    private List<Experiment> experimentList;
+
+    public ExperimentStation() {
+    }
+
+    public ExperimentStation(Integer id) {
+        this.id = id;
+    }
+
+    public ExperimentStation(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<ExperimentType> getExperimentTypeList() {
+        return experimentTypeList;
+    }
+
+    public void setExperimentTypeList(List<ExperimentType> experimentTypeList) {
+        this.experimentTypeList = experimentTypeList;
+    }
+
+    @XmlTransient
+    public List<UserSystemRole> getUserSystemRoleList() {
+        return userSystemRoleList;
+    }
+
+    public void setUserSystemRoleList(List<UserSystemRole> userSystemRoleList) {
+        this.userSystemRoleList = userSystemRoleList;
+    }
+
+    @XmlTransient
+    public List<Experiment> getExperimentList() {
+        return experimentList;
+    }
+
+    public void setExperimentList(List<Experiment> experimentList) {
+        this.experimentList = experimentList;
+    }
+
+    @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 ExperimentStation)) {
+            return false;
+        }
+        ExperimentStation other = (ExperimentStation) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..1f600d9c610d270a60dc7c08dfde4e514a0eaaa4
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/ExperimentType.java
@@ -0,0 +1,131 @@
+/*
+ * 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.List;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "experiment_type")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "ExperimentType.findAll", query = "SELECT e FROM ExperimentType e")
+    , @NamedQuery(name = "ExperimentType.findById", query = "SELECT e FROM ExperimentType e WHERE e.id = :id")
+    , @NamedQuery(name = "ExperimentType.findByName", query = "SELECT e FROM ExperimentType e WHERE e.name = :name")
+    , @NamedQuery(name = "ExperimentType.findByDescription", query = "SELECT e FROM ExperimentType e WHERE e.description = :description")})
+public class ExperimentType extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    private Integer id;
+    @Basic(optional = false)
+    @NotNull
+    private String name;
+    private String description;
+    @ManyToMany(mappedBy = "experimentTypeList")
+    private List<ExperimentStation> experimentStationList;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "experimentType")
+    private List<Experiment> experimentList;
+
+    public ExperimentType() {
+    }
+
+    public ExperimentType(Integer id) {
+        this.id = id;
+    }
+
+    public ExperimentType(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<ExperimentStation> getExperimentStationList() {
+        return experimentStationList;
+    }
+
+    public void setExperimentStationList(List<ExperimentStation> experimentStationList) {
+        this.experimentStationList = experimentStationList;
+    }
+
+    @XmlTransient
+    public List<Experiment> getExperimentList() {
+        return experimentList;
+    }
+
+    public void setExperimentList(List<Experiment> experimentList) {
+        this.experimentList = experimentList;
+    }
+
+    @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 ExperimentType)) {
+            return false;
+        }
+        ExperimentType other = (ExperimentType) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..874d7608258c3c3de352ee9658292219dc01c1a8
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyProperty.java
@@ -0,0 +1,193 @@
+/*
+ * 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.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;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "policy_property")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "PolicyProperty.findAll", query = "SELECT p FROM PolicyProperty p")
+    , @NamedQuery(name = "PolicyProperty.findById", query = "SELECT p FROM PolicyProperty p WHERE p.id = :id")
+    , @NamedQuery(name = "PolicyProperty.findByName", query = "SELECT p FROM PolicyProperty p WHERE p.name = :name")
+    , @NamedQuery(name = "PolicyProperty.findByUnits", query = "SELECT p FROM PolicyProperty p WHERE p.units = :units")
+    , @NamedQuery(name = "PolicyProperty.findByLowerLimit", query = "SELECT p FROM PolicyProperty p WHERE p.lowerLimit = :lowerLimit")
+    , @NamedQuery(name = "PolicyProperty.findByUpperLimit", query = "SELECT p FROM PolicyProperty p WHERE p.upperLimit = :upperLimit")
+    , @NamedQuery(name = "PolicyProperty.findByDefaultValue", query = "SELECT p FROM PolicyProperty p WHERE p.defaultValue = :defaultValue")
+    , @NamedQuery(name = "PolicyProperty.findByDescription", query = "SELECT p FROM PolicyProperty p WHERE p.description = :description")})
+public class PolicyProperty extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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;
+    @JoinColumn(name = "policy_type_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private PolicyType policyTypeId;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "policyPropertyId")
+    private List<AllowedPolicyValue> allowedPolicyValueList;
+
+    public PolicyProperty() {
+    }
+
+    public PolicyProperty(Integer id) {
+        this.id = id;
+    }
+
+    public PolicyProperty(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUnits() {
+        return units;
+    }
+
+    public void setUnits(String units) {
+        this.units = units;
+    }
+
+    public String getLowerLimit() {
+        return lowerLimit;
+    }
+
+    public void setLowerLimit(String lowerLimit) {
+        this.lowerLimit = lowerLimit;
+    }
+
+    public String getUpperLimit() {
+        return upperLimit;
+    }
+
+    public void setUpperLimit(String upperLimit) {
+        this.upperLimit = upperLimit;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<ExperimentPolicyPropertyValue> getExperimentPolicyPropertyValueList() {
+        return experimentPolicyPropertyValueList;
+    }
+
+    public void setExperimentPolicyPropertyValueList(List<ExperimentPolicyPropertyValue> experimentPolicyPropertyValueList) {
+        this.experimentPolicyPropertyValueList = experimentPolicyPropertyValueList;
+    }
+
+    public PolicyType getPolicyTypeId() {
+        return policyTypeId;
+    }
+
+    public void setPolicyTypeId(PolicyType policyTypeId) {
+        this.policyTypeId = policyTypeId;
+    }
+
+    @XmlTransient
+    public List<AllowedPolicyValue> getAllowedPolicyValueList() {
+        return allowedPolicyValueList;
+    }
+
+    public void setAllowedPolicyValueList(List<AllowedPolicyValue> allowedPolicyValueList) {
+        this.allowedPolicyValueList = allowedPolicyValueList;
+    }
+
+    @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 PolicyProperty)) {
+            return false;
+        }
+        PolicyProperty other = (PolicyProperty) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..a6cf651ea543c928370f3dc65eea0dddfedd63c4
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/PolicyType.java
@@ -0,0 +1,132 @@
+/*
+ * 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.List;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "policy_type")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "PolicyType.findAll", query = "SELECT p FROM PolicyType p")
+    , @NamedQuery(name = "PolicyType.findById", query = "SELECT p FROM PolicyType p WHERE p.id = :id")
+    , @NamedQuery(name = "PolicyType.findByName", query = "SELECT p FROM PolicyType p WHERE p.name = :name")
+    , @NamedQuery(name = "PolicyType.findByDescription", query = "SELECT p FROM PolicyType p WHERE p.description = :description")})
+public class PolicyType extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "policyTypeId")
+    private List<ExperimentPolicy> experimentPolicyList;
+
+    public PolicyType() {
+    }
+
+    public PolicyType(Integer id) {
+        this.id = id;
+    }
+
+    public PolicyType(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<PolicyProperty> getPolicyPropertyList() {
+        return policyPropertyList;
+    }
+
+    public void setPolicyPropertyList(List<PolicyProperty> policyPropertyList) {
+        this.policyPropertyList = policyPropertyList;
+    }
+
+    @XmlTransient
+    public List<ExperimentPolicy> getExperimentPolicyList() {
+        return experimentPolicyList;
+    }
+
+    public void setExperimentPolicyList(List<ExperimentPolicy> experimentPolicyList) {
+        this.experimentPolicyList = experimentPolicyList;
+    }
+
+    @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 PolicyType)) {
+            return false;
+        }
+        PolicyType other = (PolicyType) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..cccd26333b7c105ae92f2198111cd3caa334116c
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SettingType.java
@@ -0,0 +1,156 @@
+/*
+ * 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.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;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "setting_type")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "SettingType.findAll", query = "SELECT s FROM SettingType s")
+    , @NamedQuery(name = "SettingType.findById", query = "SELECT s FROM SettingType s WHERE s.id = :id")
+    , @NamedQuery(name = "SettingType.findByName", query = "SELECT s FROM SettingType s WHERE s.name = :name")
+    , @NamedQuery(name = "SettingType.findByDescription", query = "SELECT s FROM SettingType s WHERE s.description = :description")
+    , @NamedQuery(name = "SettingType.findByDefaultValue", query = "SELECT s FROM SettingType s WHERE s.defaultValue = :defaultValue")
+    , @NamedQuery(name = "SettingType.findByIsUserModifiable", query = "SELECT s FROM SettingType s WHERE s.isUserModifiable = :isUserModifiable")})
+public class SettingType extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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")
+    private Boolean isUserModifiable;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "settingTypeId")
+    private List<AllowedSettingValue> allowedSettingValueList;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "settingTypeId")
+    private List<UserSetting> userSettingList;
+
+    public SettingType() {
+    }
+
+    public SettingType(Integer id) {
+        this.id = id;
+    }
+
+    public SettingType(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public Boolean getIsUserModifiable() {
+        return isUserModifiable;
+    }
+
+    public void setIsUserModifiable(Boolean isUserModifiable) {
+        this.isUserModifiable = isUserModifiable;
+    }
+
+    @XmlTransient
+    public List<AllowedSettingValue> getAllowedSettingValueList() {
+        return allowedSettingValueList;
+    }
+
+    public void setAllowedSettingValueList(List<AllowedSettingValue> allowedSettingValueList) {
+        this.allowedSettingValueList = allowedSettingValueList;
+    }
+
+    @XmlTransient
+    public List<UserSetting> getUserSettingList() {
+        return userSettingList;
+    }
+
+    public void setUserSettingList(List<UserSetting> userSettingList) {
+        this.userSettingList = userSettingList;
+    }
+
+    @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 SettingType)) {
+            return false;
+        }
+        SettingType other = (SettingType) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..65891a5e49661df6d75bf9a683ea32a458adb852
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Storage.java
@@ -0,0 +1,146 @@
+/*
+ * 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.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;
+import javax.persistence.Id;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@XmlRootElement
+@NamedQueries({
+    @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 CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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;
+
+    public Storage() {
+    }
+
+    public Storage(Integer id) {
+        this.id = id;
+    }
+
+    public Storage(Integer id, String name, String defaultScheme) {
+        this.id = id;
+        this.name = name;
+        this.defaultScheme = defaultScheme;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDefaultScheme() {
+        return defaultScheme;
+    }
+
+    public void setDefaultScheme(String defaultScheme) {
+        this.defaultScheme = defaultScheme;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<DataFolder> getDataFolderList() {
+        return dataFolderList;
+    }
+
+    public void setDataFolderList(List<DataFolder> dataFolderList) {
+        this.dataFolderList = dataFolderList;
+    }
+
+    @XmlTransient
+    public List<Endpoint> getEndpointList() {
+        return endpointList;
+    }
+
+    public void setEndpointList(List<Endpoint> endpointList) {
+        this.endpointList = endpointList;
+    }
+
+    @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 Storage)) {
+            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;
+    }
+
+    @Override
+    public String toString() {
+        return "gov.anl.aps.dm.portal.model.entities2.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
new file mode 100644
index 0000000000000000000000000000000000000000..5622b8695fc07035bc138beb80ef7fead088ab90
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/SystemRoleType.java
@@ -0,0 +1,121 @@
+/*
+ * 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.List;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "system_role_type")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "SystemRoleType.findAll", query = "SELECT s FROM SystemRoleType s")
+    , @NamedQuery(name = "SystemRoleType.findById", query = "SELECT s FROM SystemRoleType s WHERE s.id = :id")
+    , @NamedQuery(name = "SystemRoleType.findByName", query = "SELECT s FROM SystemRoleType s WHERE s.name = :name")
+    , @NamedQuery(name = "SystemRoleType.findByDescription", query = "SELECT s FROM SystemRoleType s WHERE s.description = :description")})
+public class SystemRoleType extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    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;
+
+    public SystemRoleType() {
+    }
+
+    public SystemRoleType(Integer id) {
+        this.id = id;
+    }
+
+    public SystemRoleType(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    public List<UserSystemRole> getUserSystemRoleList() {
+        return userSystemRoleList;
+    }
+
+    public void setUserSystemRoleList(List<UserSystemRole> userSystemRoleList) {
+        this.userSystemRoleList = userSystemRoleList;
+    }
+
+    @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 SystemRoleType)) {
+            return false;
+        }
+        SystemRoleType other = (SystemRoleType) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..b55668062d0cb6d43933310c3aec77674cf03278
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
@@ -0,0 +1,115 @@
+/*
+ * 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 gov.anl.aps.dm.portal.model.entities.Experiment;
+import gov.anl.aps.dm.portal.model.entities.ExperimentRoleType;
+import java.io.Serializable;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "user_experiment_role")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserExperimentRole.findAll", query = "SELECT u FROM UserExperimentRole u")
+    , @NamedQuery(name = "UserExperimentRole.findByUserId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.userId = :userId")
+    , @NamedQuery(name = "UserExperimentRole.findByExperimentId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.experimentId = :experimentId")
+    , @NamedQuery(name = "UserExperimentRole.findByRoleTypeId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.roleTypeId = :roleTypeId")})
+public class UserExperimentRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    @EmbeddedId
+    protected UserExperimentRolePK userExperimentRolePK;
+    @JoinColumn(name = "experiment_id", referencedColumnName = "id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private Experiment experiment;
+    @JoinColumn(name = "role_type_id", referencedColumnName = "id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private ExperimentRoleType experimentRoleType;
+    @JoinColumn(name = "user_id", referencedColumnName = "id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private UserInfo userInfo;
+
+    public UserExperimentRole() {
+    }
+
+    public UserExperimentRole(UserExperimentRolePK userExperimentRolePK) {
+        this.userExperimentRolePK = userExperimentRolePK;
+    }
+
+    public UserExperimentRole(int userId, int experimentId, int roleTypeId) {
+        this.userExperimentRolePK = new UserExperimentRolePK(userId, experimentId, roleTypeId);
+    }
+
+    public UserExperimentRolePK getUserExperimentRolePK() {
+        return userExperimentRolePK;
+    }
+
+    public void setUserExperimentRolePK(UserExperimentRolePK userExperimentRolePK) {
+        this.userExperimentRolePK = userExperimentRolePK;
+    }
+
+    public Experiment getExperiment() {
+        return experiment;
+    }
+
+    public void setExperiment(Experiment experiment) {
+        this.experiment = experiment;
+    }
+
+    public ExperimentRoleType getExperimentRoleType() {
+        return experimentRoleType;
+    }
+
+    public void setExperimentRoleType(ExperimentRoleType experimentRoleType) {
+        this.experimentRoleType = experimentRoleType;
+    }
+
+    public UserInfo getUserInfo() {
+        return userInfo;
+    }
+
+    public void setUserInfo(UserInfo userInfo) {
+        this.userInfo = userInfo;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (userExperimentRolePK != null ? userExperimentRolePK.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 UserExperimentRole)) {
+            return false;
+        }
+        UserExperimentRole other = (UserExperimentRole) object;
+        if ((this.userExperimentRolePK == null && other.userExperimentRolePK != null) || (this.userExperimentRolePK != null && !this.userExperimentRolePK.equals(other.userExperimentRolePK))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "gov.anl.aps.dm.portal.model.entities2.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
new file mode 100644
index 0000000000000000000000000000000000000000..5e69b1dbead8a87dc3eaaf86991f3a4a91ba6ebb
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRolePK.java
@@ -0,0 +1,100 @@
+/*
+ * 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.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author sveseli
+ */
+@Embeddable
+public class UserExperimentRolePK implements Serializable {
+
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "user_id")
+    private int userId;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "experiment_id")
+    private int experimentId;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "role_type_id")
+    private int roleTypeId;
+
+    public UserExperimentRolePK() {
+    }
+
+    public UserExperimentRolePK(int userId, int experimentId, int roleTypeId) {
+        this.userId = userId;
+        this.experimentId = experimentId;
+        this.roleTypeId = roleTypeId;
+    }
+
+    public int getUserId() {
+        return userId;
+    }
+
+    public void setUserId(int userId) {
+        this.userId = userId;
+    }
+
+    public int getExperimentId() {
+        return experimentId;
+    }
+
+    public void setExperimentId(int experimentId) {
+        this.experimentId = experimentId;
+    }
+
+    public int getRoleTypeId() {
+        return roleTypeId;
+    }
+
+    public void setRoleTypeId(int roleTypeId) {
+        this.roleTypeId = roleTypeId;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (int) userId;
+        hash += (int) experimentId;
+        hash += (int) roleTypeId;
+        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 UserExperimentRolePK)) {
+            return false;
+        }
+        UserExperimentRolePK other = (UserExperimentRolePK) object;
+        if (this.userId != other.userId) {
+            return false;
+        }
+        if (this.experimentId != other.experimentId) {
+            return false;
+        }
+        if (this.roleTypeId != other.roleTypeId) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "gov.anl.aps.dm.portal.model.entities2.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
new file mode 100644
index 0000000000000000000000000000000000000000..0b7d66dea295d198d4d50bc91850fdef90e07b13
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
@@ -0,0 +1,253 @@
+/*
+ * 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 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;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+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;
+import javax.xml.bind.annotation.XmlTransient;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "user_info")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserInfo.findAll", query = "SELECT u FROM UserInfo u")
+    , @NamedQuery(name = "UserInfo.findById", query = "SELECT u FROM UserInfo u WHERE u.id = :id")
+    , @NamedQuery(name = "UserInfo.findByUsername", query = "SELECT u FROM UserInfo u WHERE u.username = :username")
+    , @NamedQuery(name = "UserInfo.findByFirstName", query = "SELECT u FROM UserInfo u WHERE u.firstName = :firstName")
+    , @NamedQuery(name = "UserInfo.findByLastName", query = "SELECT u FROM UserInfo u WHERE u.lastName = :lastName")
+    , @NamedQuery(name = "UserInfo.findByMiddleName", query = "SELECT u FROM UserInfo u WHERE u.middleName = :middleName")
+    , @NamedQuery(name = "UserInfo.findByEmail", query = "SELECT u FROM UserInfo u WHERE u.email = :email")
+    , @NamedQuery(name = "UserInfo.findByBadge", query = "SELECT u FROM UserInfo u WHERE u.badge = :badge")
+    , @NamedQuery(name = "UserInfo.findByGlobusUsername", query = "SELECT u FROM UserInfo u WHERE u.globusUsername = :globusUsername")
+    , @NamedQuery(name = "UserInfo.findByDescription", query = "SELECT u FROM UserInfo u WHERE u.description = :description")
+    , @NamedQuery(name = "UserInfo.findByPassword", query = "SELECT u FROM UserInfo u WHERE u.password = :password")
+    , @NamedQuery(name = "UserInfo.findByIsLocalUser", query = "SELECT u FROM UserInfo u WHERE u.isLocalUser = :isLocalUser")
+    , @NamedQuery(name = "UserInfo.findByLastUpdate", query = "SELECT u FROM UserInfo u WHERE u.lastUpdate = :lastUpdate")})
+public class UserInfo extends CloneableEntity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    private Integer id;
+    @Basic(optional = false)
+    @NotNull
+    private String username;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "first_name")
+    private String firstName;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "last_name")
+    private String lastName;
+    @Column(name = "middle_name")
+    private String middleName;
+    // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
+    private String email;
+    private String badge;
+    @Column(name = "globus_username")
+    private String globusUsername;
+    private String description;
+    private String password;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "is_local_user")
+    private boolean isLocalUser;
+    @Column(name = "last_update")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date lastUpdate;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userInfo")
+    private List<UserExperimentRole> userExperimentRoleList;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userInfo")
+    private List<UserSystemRole> userSystemRoleList;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
+    private List<UserSetting> userSettingList;
+
+    public UserInfo() {
+    }
+
+    public UserInfo(Integer id) {
+        this.id = id;
+    }
+
+    public UserInfo(Integer id, String username, String firstName, String lastName, boolean isLocalUser) {
+        this.id = id;
+        this.username = username;
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.isLocalUser = isLocalUser;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getMiddleName() {
+        return middleName;
+    }
+
+    public void setMiddleName(String middleName) {
+        this.middleName = middleName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getBadge() {
+        return badge;
+    }
+
+    public void setBadge(String badge) {
+        this.badge = badge;
+    }
+
+    public String getGlobusUsername() {
+        return globusUsername;
+    }
+
+    public void setGlobusUsername(String globusUsername) {
+        this.globusUsername = globusUsername;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public boolean getIsLocalUser() {
+        return isLocalUser;
+    }
+
+    public void setIsLocalUser(boolean isLocalUser) {
+        this.isLocalUser = isLocalUser;
+    }
+
+    public boolean isLocalUser() {
+        return isLocalUser;
+    }
+    
+    public Date getLastUpdate() {
+        return lastUpdate;
+    }
+
+    public void setLastUpdate(Date lastUpdate) {
+        this.lastUpdate = lastUpdate;
+    }
+
+    @XmlTransient
+    public List<UserExperimentRole> getUserExperimentRoleList() {
+        return userExperimentRoleList;
+    }
+
+    public void setUserExperimentRoleList(List<UserExperimentRole> userExperimentRoleList) {
+        this.userExperimentRoleList = userExperimentRoleList;
+    }
+
+    @XmlTransient
+    public List<UserSystemRole> getUserSystemRoleList() {
+        return userSystemRoleList;
+    }
+
+    public void setUserSystemRoleList(List<UserSystemRole> userSystemRoleList) {
+        this.userSystemRoleList = userSystemRoleList;
+    }
+
+    @XmlTransient
+    public List<UserSetting> getUserSettingList() {
+        return userSettingList;
+    }
+
+    public void setUserSettingList(List<UserSetting> userSettingList) {
+        this.userSettingList = userSettingList;
+    }
+
+    @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 UserInfo)) {
+            return false;
+        }
+        UserInfo other = (UserInfo) object;
+        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.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
new file mode 100644
index 0000000000000000000000000000000000000000..696a4615945648fdd6951dffa0a05e0e8f2ef463
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSetting.java
@@ -0,0 +1,113 @@
+/*
+ * 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 javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+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;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "user_setting")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserSetting.findAll", query = "SELECT u FROM UserSetting u")
+    , @NamedQuery(name = "UserSetting.findById", query = "SELECT u FROM UserSetting u WHERE u.id = :id")
+    , @NamedQuery(name = "UserSetting.findBySettingValue", query = "SELECT u FROM UserSetting u WHERE u.settingValue = :settingValue")})
+public class UserSetting extends CloneableEntity {
+
+    @Id
+    @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")
+    @ManyToOne(optional = false)
+    private SettingType settingTypeId;
+    @JoinColumn(name = "user_id", referencedColumnName = "id")
+    @ManyToOne(optional = false)
+    private UserInfo userId;
+
+    public UserSetting() {
+    }
+
+    public UserSetting(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getSettingValue() {
+        return settingValue;
+    }
+
+    public void setSettingValue(String settingValue) {
+        this.settingValue = settingValue;
+    }
+
+    public SettingType getSettingTypeId() {
+        return settingTypeId;
+    }
+
+    public void setSettingTypeId(SettingType settingTypeId) {
+        this.settingTypeId = settingTypeId;
+    }
+
+    public UserInfo getUserId() {
+        return userId;
+    }
+
+    public void setUserId(UserInfo userId) {
+        this.userId = userId;
+    }
+
+    @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 UserSetting)) {
+            return false;
+        }
+        UserSetting other = (UserSetting) 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.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
new file mode 100644
index 0000000000000000000000000000000000000000..089cc4bbed1cd55262b725b5c9b66e90ac6016e2
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRole.java
@@ -0,0 +1,110 @@
+/*
+ * 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 javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ *
+ * @author sveseli
+ */
+@Entity
+@Table(name = "user_system_role")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserSystemRole.findAll", query = "SELECT u FROM UserSystemRole u")
+    , @NamedQuery(name = "UserSystemRole.findByUserId", query = "SELECT u FROM UserSystemRole u WHERE u.userSystemRolePK.userId = :userId")
+    , @NamedQuery(name = "UserSystemRole.findByRoleTypeId", query = "SELECT u FROM UserSystemRole u WHERE u.userSystemRolePK.roleTypeId = :roleTypeId")})
+public class UserSystemRole extends CloneableEntity {
+
+    @EmbeddedId
+    protected UserSystemRolePK userSystemRolePK;
+    @JoinColumn(name = "experiment_station_id", referencedColumnName = "id")
+    @ManyToOne
+    private ExperimentStation experimentStationId;
+    @JoinColumn(name = "role_type_id", referencedColumnName = "id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private SystemRoleType systemRoleType;
+    @JoinColumn(name = "user_id", referencedColumnName = "id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private UserInfo userInfo;
+
+    public UserSystemRole() {
+    }
+
+    public UserSystemRole(UserSystemRolePK userSystemRolePK) {
+        this.userSystemRolePK = userSystemRolePK;
+    }
+
+    public UserSystemRole(int userId, int roleTypeId) {
+        this.userSystemRolePK = new UserSystemRolePK(userId, roleTypeId);
+    }
+
+    public UserSystemRolePK getUserSystemRolePK() {
+        return userSystemRolePK;
+    }
+
+    public void setUserSystemRolePK(UserSystemRolePK userSystemRolePK) {
+        this.userSystemRolePK = userSystemRolePK;
+    }
+
+    public ExperimentStation getExperimentStationId() {
+        return experimentStationId;
+    }
+
+    public void setExperimentStationId(ExperimentStation experimentStationId) {
+        this.experimentStationId = experimentStationId;
+    }
+
+    public SystemRoleType getSystemRoleType() {
+        return systemRoleType;
+    }
+
+    public void setSystemRoleType(SystemRoleType systemRoleType) {
+        this.systemRoleType = systemRoleType;
+    }
+
+    public UserInfo getUserInfo() {
+        return userInfo;
+    }
+
+    public void setUserInfo(UserInfo userInfo) {
+        this.userInfo = userInfo;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (userSystemRolePK != null ? userSystemRolePK.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 UserSystemRole)) {
+            return false;
+        }
+        UserSystemRole other = (UserSystemRole) object;
+        if ((this.userSystemRolePK == null && other.userSystemRolePK != null) || (this.userSystemRolePK != null && !this.userSystemRolePK.equals(other.userSystemRolePK))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "gov.anl.aps.dm.portal.model.entities2.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
new file mode 100644
index 0000000000000000000000000000000000000000..6a5c324ca129f05fddb25d6f5708adec4c30c6f7
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserSystemRolePK.java
@@ -0,0 +1,83 @@
+/*
+ * 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.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author sveseli
+ */
+@Embeddable
+public class UserSystemRolePK implements Serializable {
+
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "user_id")
+    private int userId;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "role_type_id")
+    private int roleTypeId;
+
+    public UserSystemRolePK() {
+    }
+
+    public UserSystemRolePK(int userId, int roleTypeId) {
+        this.userId = userId;
+        this.roleTypeId = roleTypeId;
+    }
+
+    public int getUserId() {
+        return userId;
+    }
+
+    public void setUserId(int userId) {
+        this.userId = userId;
+    }
+
+    public int getRoleTypeId() {
+        return roleTypeId;
+    }
+
+    public void setRoleTypeId(int roleTypeId) {
+        this.roleTypeId = roleTypeId;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (int) userId;
+        hash += (int) roleTypeId;
+        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 UserSystemRolePK)) {
+            return false;
+        }
+        UserSystemRolePK other = (UserSystemRolePK) object;
+        if (this.userId != other.userId) {
+            return false;
+        }
+        if (this.roleTypeId != other.roleTypeId) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "gov.anl.aps.dm.portal.model.entities2.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
new file mode 100644
index 0000000000000000000000000000000000000000..2597d3ac36a0bfeaa30742c3576370868319d86d
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UsersLastUpdate.java
@@ -0,0 +1,90 @@
+/*
+ * 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 CloneableEntity {
+
+    @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/src/java/gov/anl/aps/dm/portal/utilities/AuthorizationUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/AuthorizationUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ca630dfe82ffb01313855cb89c794d16fee15e3
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/AuthorizationUtility.java
@@ -0,0 +1,22 @@
+/*
+ * 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.utilities;
+
+import gov.anl.aps.dm.portal.model.entities.UserInfo;
+
+/**
+ *
+ * @author sveseli
+ */
+public class AuthorizationUtility {
+    public static final int ADMIN_SYSTEM_ROLE_ID = 1;
+    
+    public static boolean isAdmin(UserInfo user) {
+        return user.getUserSystemRoleList().stream().anyMatch((userSystemRole) -> (userSystemRole.getSystemRoleType().getId() == ADMIN_SYSTEM_ROLE_ID));
+    }
+    
+    
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/ConfigurationUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/ConfigurationUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..23b2b0c758ae6d7467b1f9ad970dac747a9420f4
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/ConfigurationUtility.java
@@ -0,0 +1,103 @@
+package gov.anl.aps.dm.portal.utilities;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import org.apache.log4j.Logger;
+
+public class ConfigurationUtility {
+
+    public static final String PropertiesPath = "dm.portal.properties";
+    public static final String PropertiesDelimiter = ",";
+   
+    private static final Logger logger = Logger.getLogger(ConfigurationUtility.class.getName());
+    private static final Properties portalProperties = loadProperties(PropertiesPath);
+
+    public Properties getPortalProperties() {
+        return portalProperties;
+    }
+
+    public static String getPortalProperty(String propertyName) {
+        return portalProperties.getProperty(propertyName, "");
+    }
+    
+    public static String getPortalProperty(String propertyName, String defaultValue) {
+        return portalProperties.getProperty(propertyName, defaultValue);
+    }
+
+    public static List<String> getPortalPropertyList(String propertyName) {
+        return getPortalPropertyList(propertyName, "");
+    }
+    
+    public static List<String> getPortalPropertyList(String propertyName, String defaultValue) {
+        String[] propertyArray = portalProperties.getProperty(propertyName, defaultValue).split(PropertiesDelimiter);
+        logger.debug("Looking for property " + propertyName);
+        ArrayList propertyList = new ArrayList();
+        for (String property : propertyArray) {
+            String p = property.trim();
+            if (p.length() > 0) {
+                propertyList.add(property.trim());
+            }
+        }
+        logger.debug("Resulting property list: " + propertyList);
+        return propertyList;
+    }    
+    
+    /**
+     * Load properties.
+     *
+     * @param path
+     * @return loaded properties
+     */
+    public static Properties loadProperties(String path) {
+        Properties properties = new Properties();
+        if (path != null) {
+            try {
+                logger.debug("Loading properties from " + path);
+                InputStream inputStream = ConfigurationUtility.class.getClassLoader().getResourceAsStream(path);
+                properties.load(inputStream);
+            } catch (IOException ex) {
+                logger.warn("Could not load properties from file " + path + ": " + ex);
+            }
+        } else {
+            logger.warn("Properties path not specified.");
+        }
+        return properties;
+    }
+
+    /**
+     * Get system property.
+     *
+     * @param propertyName property name
+     * @return property value
+     */
+    public static String getSystemProperty(String propertyName) {
+        Properties p = System.getProperties();
+        return p.getProperty(propertyName);
+    }
+
+    /**
+     * Get system property.
+     *
+     * @param propertyName property name
+     * @param defaultValue default property value
+     * @return property value
+     */
+    public static String getSystemProperty(String propertyName, String defaultValue) {
+        Properties p = System.getProperties();
+        return p.getProperty(propertyName, defaultValue);
+    }
+
+    /**
+     * Get environment variable.
+     *
+     * @param name Environment variable name
+     * @return environment variable value, or null if it is not defined
+     */
+    public static String getEnvVar(String name) {
+        return System.getenv(name);
+    }
+
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DmApiFactory.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DmApiFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..efd7fe283f8830c69e72dd561ba7d127a0e61d44
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DmApiFactory.java
@@ -0,0 +1,27 @@
+package gov.anl.aps.dm.portal.utilities;
+
+import gov.anl.aps.dm.api.ExperimentDsApi;
+import gov.anl.aps.dm.common.constants.DmProperty;
+import gov.anl.aps.dm.common.exceptions.ConfigurationError;
+import gov.anl.aps.dm.common.exceptions.DmException;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+import org.apache.log4j.Logger;
+
+public class DmApiFactory {
+    private static final Logger logger = Logger.getLogger(DmApiFactory.class.getName());
+
+    public static ExperimentDsApi getExperimentDsApi() throws DmException {
+        String webServiceUrl = ConfigurationUtility.getPortalProperty(DmProperty.DS_WEB_SERVICE_URL_PROPERTY_NAME);
+        String loginUsername = ConfigurationUtility.getPortalProperty(DmProperty.SYSTEM_USER_PROPERTY_NAME);
+        String loginPasswordFileName = ConfigurationUtility.getPortalProperty(DmProperty.SYSTEM_PASSWORD_FILE_PROPERTY_NAME);
+        try {
+            String loginPassword = new Scanner(new File(loginPasswordFileName)).useDelimiter("\\Z").next();
+            return new ExperimentDsApi(webServiceUrl, loginUsername, loginPassword);
+        } catch (FileNotFoundException ex) {
+            logger.error("Cannot find system password file: " + loginPasswordFileName);
+            throw new ConfigurationError(ex);
+        }   
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/SearchResult.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/SearchResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..0529a8cfd266d0db71774fe82a2ba9e6e48c1e61
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/SearchResult.java
@@ -0,0 +1,72 @@
+/*
+ * 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.utilities;
+
+import java.util.HashMap;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author sveseli
+ */
+public class SearchResult
+{
+
+    private final Integer objectId;
+    private final String objectName;
+    private HashMap<String, String> objectAttributeMatchMap = new HashMap();
+
+    public SearchResult(Integer objectId, String objectName) {
+        this.objectId = objectId;
+        this.objectName = objectName;
+    }
+
+    public Integer getObjectId() {
+        return objectId;
+    }
+
+    public String getObjectName() {
+        return objectName;
+    }
+
+    public void addAttributeMatch(String key, String value) {
+        objectAttributeMatchMap.put(key, value);
+    }
+
+    public HashMap<String, String> getObjectAttributeMatchMap() {
+        return objectAttributeMatchMap;
+    }
+
+    public void setObjectAttributeMatchMap(HashMap<String, String> objectAttributeMatchMap) {
+        this.objectAttributeMatchMap = objectAttributeMatchMap;
+    }
+
+    public boolean isEmpty() {
+        return objectAttributeMatchMap.isEmpty();
+    }
+
+    public boolean doesValueContainPattern(String key, String value, Pattern searchPattern) {
+        if (value == null || value.isEmpty()) {
+            return false;
+        }
+        boolean searchResult = searchPattern.matcher(value).find();
+        if (searchResult) {
+            addAttributeMatch(key, value);
+        }
+        return searchResult;
+    }
+
+    public String getDisplay() {
+        String result = "";
+        String keyDelimiter = ": ";
+        String entryDelimiter = "";
+        for (String key : objectAttributeMatchMap.keySet()) {
+            result += entryDelimiter + key + keyDelimiter + objectAttributeMatchMap.get(key);
+            entryDelimiter = "; ";
+        }
+        return result;
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/SessionUtility.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/SessionUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf59cb2c40e2f0852d87960bed6bfbcb2531cd0f
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/SessionUtility.java
@@ -0,0 +1,133 @@
+package gov.anl.aps.dm.portal.utilities;
+
+import java.util.Map;
+import java.util.Stack;
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+
+/**
+ * Session utility class.
+ */
+public class SessionUtility
+{
+
+    /**
+     * Keys.
+     */
+    public static final String MessagesKey = "messages";
+    public static final String UserKey = "user";
+    public static final String ViewStackKey = "viewStack";
+
+    /**
+     * Constructor.
+     */
+    public SessionUtility() {
+    }
+
+    /**
+     * Add error message.
+     *
+     * @param summary message summary
+     * @param detail detailed message
+     */
+    public static void addErrorMessage(String summary, String detail) {
+        FacesContext context = FacesContext.getCurrentInstance();
+        context.getExternalContext().getFlash().setKeepMessages(true);
+        context.addMessage(MessagesKey, new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));
+    }
+
+    /**
+     * Add warning message.
+     *
+     * @param summary message summary
+     * @param detail detailed message
+     */
+    public static void addWarningMessage(String summary, String detail) {
+        FacesContext context = FacesContext.getCurrentInstance();
+        context.getExternalContext().getFlash().setKeepMessages(true);
+        context.addMessage(MessagesKey, new FacesMessage(FacesMessage.SEVERITY_WARN, summary, detail));
+    }
+
+    /**
+     * Add info message.
+     *
+     * @param summary message summary
+     * @param detail detailed message
+     */
+    public static void addInfoMessage(String summary, String detail) {
+        FacesContext context = FacesContext.getCurrentInstance();
+        context.getExternalContext().getFlash().setKeepMessages(true);
+        context.addMessage(MessagesKey, new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail));
+    }
+
+    /**
+     * Get request parameter value.
+     *
+     * @param parameterName parameter name
+     * @return parameter value
+     */
+    public static String getRequestParameterValue(String parameterName) {
+        Map parameterMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
+        return (String) parameterMap.get(parameterName);
+    }
+
+    /**
+     * Set user.
+     *
+     * @param user user
+     */
+    public static void setUser(Object user) {
+        Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
+        sessionMap.put(UserKey, user);
+    }
+
+    /**
+     * Get user.
+     *
+     * @return user
+     */
+    public static Object getUser() {
+        Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
+        return sessionMap.get(UserKey);
+    }
+
+    public static void pushViewOnStack(String viewId) {
+        Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
+        Stack<String> viewStack = (Stack) sessionMap.get(ViewStackKey);
+        if (viewStack == null) {
+            viewStack = new Stack<>();
+            sessionMap.put(ViewStackKey, viewStack);
+        }
+        viewStack.push(viewId);
+    }
+
+    public static String popViewFromStack() {
+        Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
+        Stack<String> viewStack = (Stack) sessionMap.get(ViewStackKey);
+        if (viewStack != null && !viewStack.empty()) {
+            return viewStack.pop();
+        }
+        return null;
+    }
+    
+    public static String getCurrentViewId() {
+        FacesContext context = FacesContext.getCurrentInstance();
+        return context.getViewRoot().getViewId();
+    }
+    
+    public static String getReferrerViewId() {
+        String referrer = FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("referer");
+        if (referrer != null) {
+            int beginViewId = referrer.indexOf("/views");
+            if (beginViewId >= 0) {
+                return referrer.substring(beginViewId);
+            }
+        }
+        return null;
+    }
+
+    public static void clearSession() {
+        Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
+        sessionMap.clear();
+    }
+}
diff --git a/src/java/DmWebPortal/src/java/log4j.properties b/src/java/DmWebPortal/src/java/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4fbd9dde38f2d565e9560f3055c5dae18601041d
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/log4j.properties
@@ -0,0 +1,11 @@
+# Root logger option
+log4j.rootCategory=ERROR,stdout
+ 
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+#log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss,SSS} %-5p %c{1} [%t]: %m%n
+
+# Log levels
+log4j.category.gov.anl.aps.dm=DEBUG
diff --git a/src/java/DmWebPortal/src/java/resources.properties b/src/java/DmWebPortal/src/java/resources.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d165d4847740cd4b4a1fa4d190e8db4ac0f82108
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/resources.properties
@@ -0,0 +1,932 @@
+DatePattern=MM/dd/yyyy 
+DateTimePattern=MM/dd/yyyy hh:mm a
+DateTimeZonePattern=MM/dd/yyyy hh:mm a z
+Timezone=America/Chicago
+PersistenceErrorOccured=A persistence error occurred.
+Previous=Previous
+Next=Next
+
+AllowedPolicyValueCreated=AllowedPolicyValue was successfully created.
+AllowedPolicyValueUpdated=AllowedPolicyValue was successfully updated.
+AllowedPolicyValueDeleted=AllowedPolicyValue was successfully deleted.
+CreateAllowedPolicyValueTitle=Create New AllowedPolicyValue
+CreateAllowedPolicyValueSaveLink=Save
+CreateAllowedPolicyValueShowAllLink=Show All AllowedPolicyValue Items
+CreateAllowedPolicyValueIndexLink=Index
+CreateAllowedPolicyValueLabel_id=Id:
+CreateAllowedPolicyValueRequiredMessage_id=The Id field is required.
+CreateAllowedPolicyValueTitle_id=Id
+CreateAllowedPolicyValueLabel_value=Value:
+CreateAllowedPolicyValueTitle_value=Value
+CreateAllowedPolicyValueLabel_description=Description:
+CreateAllowedPolicyValueTitle_description=Description
+CreateAllowedPolicyValueLabel_policyTypeId=PolicyTypeId:
+CreateAllowedPolicyValueRequiredMessage_policyTypeId=The PolicyTypeId field is required.
+CreateAllowedPolicyValueTitle_policyTypeId=PolicyTypeId
+EditAllowedPolicyValueTitle=Edit AllowedPolicyValue
+EditAllowedPolicyValueSaveLink=Save
+EditAllowedPolicyValueViewLink=View
+EditAllowedPolicyValueShowAllLink=Show All AllowedPolicyValue Items
+EditAllowedPolicyValueIndexLink=Index
+EditAllowedPolicyValueLabel_id=Id:
+EditAllowedPolicyValueRequiredMessage_id=The Id field is required.
+EditAllowedPolicyValueTitle_id=Id
+EditAllowedPolicyValueLabel_value=Value:
+EditAllowedPolicyValueTitle_value=Value
+EditAllowedPolicyValueLabel_description=Description:
+EditAllowedPolicyValueTitle_description=Description
+EditAllowedPolicyValueLabel_policyTypeId=PolicyTypeId:
+EditAllowedPolicyValueRequiredMessage_policyTypeId=The PolicyTypeId field is required.
+EditAllowedPolicyValueTitle_policyTypeId=PolicyTypeId
+ViewAllowedPolicyValueTitle=View
+ViewAllowedPolicyValueDestroyLink=Destroy
+ViewAllowedPolicyValueEditLink=Edit
+ViewAllowedPolicyValueCreateLink=Create New AllowedPolicyValue
+ViewAllowedPolicyValueShowAllLink=Show All AllowedPolicyValue Items
+ViewAllowedPolicyValueIndexLink=Index
+ViewAllowedPolicyValueLabel_id=Id:
+ViewAllowedPolicyValueTitle_id=Id
+ViewAllowedPolicyValueLabel_value=Value:
+ViewAllowedPolicyValueTitle_value=Value
+ViewAllowedPolicyValueLabel_description=Description:
+ViewAllowedPolicyValueTitle_description=Description
+ViewAllowedPolicyValueLabel_policyTypeId=PolicyTypeId:
+ViewAllowedPolicyValueTitle_policyTypeId=PolicyTypeId
+ListAllowedPolicyValueTitle=List
+ListAllowedPolicyValueEmpty=(No AllowedPolicyValue Items Found)
+ListAllowedPolicyValueDestroyLink=Destroy
+ListAllowedPolicyValueEditLink=Edit
+ListAllowedPolicyValueViewLink=View
+ListAllowedPolicyValueCreateLink=Create New AllowedPolicyValue
+ListAllowedPolicyValueIndexLink=Index
+ListAllowedPolicyValueTitle_id=Id
+ListAllowedPolicyValueTitle_value=Value
+ListAllowedPolicyValueTitle_description=Description
+ListAllowedPolicyValueTitle_policyTypeId=PolicyTypeId
+AllowedSettingValueCreated=AllowedSettingValue was successfully created.
+AllowedSettingValueUpdated=AllowedSettingValue was successfully updated.
+AllowedSettingValueDeleted=AllowedSettingValue was successfully deleted.
+CreateAllowedSettingValueTitle=Create New AllowedSettingValue
+CreateAllowedSettingValueSaveLink=Save
+CreateAllowedSettingValueShowAllLink=Show All AllowedSettingValue Items
+CreateAllowedSettingValueIndexLink=Index
+CreateAllowedSettingValueLabel_id=Id:
+CreateAllowedSettingValueRequiredMessage_id=The Id field is required.
+CreateAllowedSettingValueTitle_id=Id
+CreateAllowedSettingValueLabel_value=Value:
+CreateAllowedSettingValueTitle_value=Value
+CreateAllowedSettingValueLabel_description=Description:
+CreateAllowedSettingValueTitle_description=Description
+CreateAllowedSettingValueLabel_settingTypeId=SettingTypeId:
+CreateAllowedSettingValueRequiredMessage_settingTypeId=The SettingTypeId field is required.
+CreateAllowedSettingValueTitle_settingTypeId=SettingTypeId
+EditAllowedSettingValueTitle=Edit AllowedSettingValue
+EditAllowedSettingValueSaveLink=Save
+EditAllowedSettingValueViewLink=View
+EditAllowedSettingValueShowAllLink=Show All AllowedSettingValue Items
+EditAllowedSettingValueIndexLink=Index
+EditAllowedSettingValueLabel_id=Id:
+EditAllowedSettingValueRequiredMessage_id=The Id field is required.
+EditAllowedSettingValueTitle_id=Id
+EditAllowedSettingValueLabel_value=Value:
+EditAllowedSettingValueTitle_value=Value
+EditAllowedSettingValueLabel_description=Description:
+EditAllowedSettingValueTitle_description=Description
+EditAllowedSettingValueLabel_settingTypeId=SettingTypeId:
+EditAllowedSettingValueRequiredMessage_settingTypeId=The SettingTypeId field is required.
+EditAllowedSettingValueTitle_settingTypeId=SettingTypeId
+ViewAllowedSettingValueTitle=View
+ViewAllowedSettingValueDestroyLink=Destroy
+ViewAllowedSettingValueEditLink=Edit
+ViewAllowedSettingValueCreateLink=Create New AllowedSettingValue
+ViewAllowedSettingValueShowAllLink=Show All AllowedSettingValue Items
+ViewAllowedSettingValueIndexLink=Index
+ViewAllowedSettingValueLabel_id=Id:
+ViewAllowedSettingValueTitle_id=Id
+ViewAllowedSettingValueLabel_value=Value:
+ViewAllowedSettingValueTitle_value=Value
+ViewAllowedSettingValueLabel_description=Description:
+ViewAllowedSettingValueTitle_description=Description
+ViewAllowedSettingValueLabel_settingTypeId=SettingTypeId:
+ViewAllowedSettingValueTitle_settingTypeId=SettingTypeId
+ListAllowedSettingValueTitle=List
+ListAllowedSettingValueEmpty=(No AllowedSettingValue Items Found)
+ListAllowedSettingValueDestroyLink=Destroy
+ListAllowedSettingValueEditLink=Edit
+ListAllowedSettingValueViewLink=View
+ListAllowedSettingValueCreateLink=Create New AllowedSettingValue
+ListAllowedSettingValueIndexLink=Index
+ListAllowedSettingValueTitle_id=Id
+ListAllowedSettingValueTitle_value=Value
+ListAllowedSettingValueTitle_description=Description
+ListAllowedSettingValueTitle_settingTypeId=SettingTypeId
+DataFolderCreated=DataFolder was successfully created.
+DataFolderUpdated=DataFolder was successfully updated.
+DataFolderDeleted=DataFolder was successfully deleted.
+CreateDataFolderTitle=Create New DataFolder
+CreateDataFolderSaveLink=Save
+CreateDataFolderShowAllLink=Show All DataFolder Items
+CreateDataFolderIndexLink=Index
+CreateDataFolderLabel_id=Id:
+CreateDataFolderRequiredMessage_id=The Id field is required.
+CreateDataFolderTitle_id=Id
+CreateDataFolderLabel_path=Path:
+CreateDataFolderRequiredMessage_path=The Path field is required.
+CreateDataFolderTitle_path=Path
+CreateDataFolderLabel_description=Description:
+CreateDataFolderTitle_description=Description
+CreateDataFolderLabel_parentDataFolderId=ParentDataFolderId:
+CreateDataFolderTitle_parentDataFolderId=ParentDataFolderId
+EditDataFolderTitle=Edit DataFolder
+EditDataFolderSaveLink=Save
+EditDataFolderViewLink=View
+EditDataFolderShowAllLink=Show All DataFolder Items
+EditDataFolderIndexLink=Index
+EditDataFolderLabel_id=Id:
+EditDataFolderRequiredMessage_id=The Id field is required.
+EditDataFolderTitle_id=Id
+EditDataFolderLabel_path=Path:
+EditDataFolderRequiredMessage_path=The Path field is required.
+EditDataFolderTitle_path=Path
+EditDataFolderLabel_description=Description:
+EditDataFolderTitle_description=Description
+EditDataFolderLabel_parentDataFolderId=ParentDataFolderId:
+EditDataFolderTitle_parentDataFolderId=ParentDataFolderId
+ViewDataFolderTitle=View
+ViewDataFolderDestroyLink=Destroy
+ViewDataFolderEditLink=Edit
+ViewDataFolderCreateLink=Create New DataFolder
+ViewDataFolderShowAllLink=Show All DataFolder Items
+ViewDataFolderIndexLink=Index
+ViewDataFolderLabel_id=Id:
+ViewDataFolderTitle_id=Id
+ViewDataFolderLabel_path=Path:
+ViewDataFolderTitle_path=Path
+ViewDataFolderLabel_description=Description:
+ViewDataFolderTitle_description=Description
+ViewDataFolderLabel_parentDataFolderId=ParentDataFolderId:
+ViewDataFolderTitle_parentDataFolderId=ParentDataFolderId
+ListDataFolderTitle=List
+ListDataFolderEmpty=(No DataFolder Items Found)
+ListDataFolderDestroyLink=Destroy
+ListDataFolderEditLink=Edit
+ListDataFolderViewLink=View
+ListDataFolderCreateLink=Create New DataFolder
+ListDataFolderIndexLink=Index
+ListDataFolderTitle_id=Id
+ListDataFolderTitle_path=Path
+ListDataFolderTitle_description=Description
+ListDataFolderTitle_parentDataFolderId=ParentDataFolderId
+DataFolderPermissionCreated=DataFolderPermission was successfully created.
+DataFolderPermissionUpdated=DataFolderPermission was successfully updated.
+DataFolderPermissionDeleted=DataFolderPermission was successfully deleted.
+CreateDataFolderPermissionTitle=Create New DataFolderPermission
+CreateDataFolderPermissionSaveLink=Save
+CreateDataFolderPermissionShowAllLink=Show All DataFolderPermission Items
+CreateDataFolderPermissionIndexLink=Index
+CreateDataFolderPermissionLabel_id=Id:
+CreateDataFolderPermissionRequiredMessage_id=The Id field is required.
+CreateDataFolderPermissionTitle_id=Id
+CreateDataFolderPermissionLabel_value=Value:
+CreateDataFolderPermissionRequiredMessage_value=The Value field is required.
+CreateDataFolderPermissionTitle_value=Value
+CreateDataFolderPermissionLabel_description=Description:
+CreateDataFolderPermissionTitle_description=Description
+CreateDataFolderPermissionLabel_dataFolderId=DataFolderId:
+CreateDataFolderPermissionRequiredMessage_dataFolderId=The DataFolderId field is required.
+CreateDataFolderPermissionTitle_dataFolderId=DataFolderId
+EditDataFolderPermissionTitle=Edit DataFolderPermission
+EditDataFolderPermissionSaveLink=Save
+EditDataFolderPermissionViewLink=View
+EditDataFolderPermissionShowAllLink=Show All DataFolderPermission Items
+EditDataFolderPermissionIndexLink=Index
+EditDataFolderPermissionLabel_id=Id:
+EditDataFolderPermissionRequiredMessage_id=The Id field is required.
+EditDataFolderPermissionTitle_id=Id
+EditDataFolderPermissionLabel_value=Value:
+EditDataFolderPermissionRequiredMessage_value=The Value field is required.
+EditDataFolderPermissionTitle_value=Value
+EditDataFolderPermissionLabel_description=Description:
+EditDataFolderPermissionTitle_description=Description
+EditDataFolderPermissionLabel_dataFolderId=DataFolderId:
+EditDataFolderPermissionRequiredMessage_dataFolderId=The DataFolderId field is required.
+EditDataFolderPermissionTitle_dataFolderId=DataFolderId
+ViewDataFolderPermissionTitle=View
+ViewDataFolderPermissionDestroyLink=Destroy
+ViewDataFolderPermissionEditLink=Edit
+ViewDataFolderPermissionCreateLink=Create New DataFolderPermission
+ViewDataFolderPermissionShowAllLink=Show All DataFolderPermission Items
+ViewDataFolderPermissionIndexLink=Index
+ViewDataFolderPermissionLabel_id=Id:
+ViewDataFolderPermissionTitle_id=Id
+ViewDataFolderPermissionLabel_value=Value:
+ViewDataFolderPermissionTitle_value=Value
+ViewDataFolderPermissionLabel_description=Description:
+ViewDataFolderPermissionTitle_description=Description
+ViewDataFolderPermissionLabel_dataFolderId=DataFolderId:
+ViewDataFolderPermissionTitle_dataFolderId=DataFolderId
+ListDataFolderPermissionTitle=List
+ListDataFolderPermissionEmpty=(No DataFolderPermission Items Found)
+ListDataFolderPermissionDestroyLink=Destroy
+ListDataFolderPermissionEditLink=Edit
+ListDataFolderPermissionViewLink=View
+ListDataFolderPermissionCreateLink=Create New DataFolderPermission
+ListDataFolderPermissionIndexLink=Index
+ListDataFolderPermissionTitle_id=Id
+ListDataFolderPermissionTitle_value=Value
+ListDataFolderPermissionTitle_description=Description
+ListDataFolderPermissionTitle_dataFolderId=DataFolderId
+ExperimentCreated=Experiment was successfully created.
+ExperimentUpdated=Experiment was successfully updated.
+ExperimentDeleted=Experiment was successfully deleted.
+CreateExperimentTitle=Create New Experiment
+CreateExperimentSaveLink=Save
+CreateExperimentShowAllLink=Show All Experiment Items
+CreateExperimentIndexLink=Index
+CreateExperimentLabel_id=Id:
+CreateExperimentRequiredMessage_id=The Id field is required.
+CreateExperimentTitle_id=Id
+CreateExperimentLabel_name=Name:
+CreateExperimentRequiredMessage_name=The Name field is required.
+CreateExperimentTitle_name=Name
+CreateExperimentLabel_description=Description:
+CreateExperimentTitle_description=Description
+CreateExperimentLabel_startDate=StartDate:
+CreateExperimentTitle_startDate=StartDate
+CreateExperimentLabel_endDate=EndDate:
+CreateExperimentTitle_endDate=EndDate
+CreateExperimentLabel_experimentTypeId=ExperimentTypeId:
+CreateExperimentRequiredMessage_experimentTypeId=The ExperimentTypeId field is required.
+CreateExperimentTitle_experimentTypeId=ExperimentTypeId
+EditExperimentTitle=Edit Experiment
+EditExperimentSaveLink=Save
+EditExperimentViewLink=View
+EditExperimentShowAllLink=Show All Experiment Items
+EditExperimentIndexLink=Index
+EditExperimentLabel_id=Id:
+EditExperimentRequiredMessage_id=The Id field is required.
+EditExperimentTitle_id=Id
+EditExperimentLabel_name=Name:
+EditExperimentRequiredMessage_name=The Name field is required.
+EditExperimentTitle_name=Name
+EditExperimentLabel_description=Description:
+EditExperimentTitle_description=Description
+EditExperimentLabel_startDate=StartDate:
+EditExperimentTitle_startDate=StartDate
+EditExperimentLabel_endDate=EndDate:
+EditExperimentTitle_endDate=EndDate
+EditExperimentLabel_experimentTypeId=ExperimentTypeId:
+EditExperimentRequiredMessage_experimentTypeId=The ExperimentTypeId field is required.
+EditExperimentTitle_experimentTypeId=ExperimentTypeId
+ViewExperimentTitle=View
+ViewExperimentDestroyLink=Destroy
+ViewExperimentEditLink=Edit
+ViewExperimentCreateLink=Create New Experiment
+ViewExperimentShowAllLink=Show All Experiment Items
+ViewExperimentIndexLink=Index
+ViewExperimentLabel_id=Id:
+ViewExperimentTitle_id=Id
+ViewExperimentLabel_name=Name:
+ViewExperimentTitle_name=Name
+ViewExperimentLabel_description=Description:
+ViewExperimentTitle_description=Description
+ViewExperimentLabel_startDate=StartDate:
+ViewExperimentTitle_startDate=StartDate
+ViewExperimentLabel_endDate=EndDate:
+ViewExperimentTitle_endDate=EndDate
+ViewExperimentLabel_experimentTypeId=ExperimentTypeId:
+ViewExperimentTitle_experimentTypeId=ExperimentTypeId
+ListExperimentTitle=List
+ListExperimentEmpty=(No Experiment Items Found)
+ListExperimentDestroyLink=Destroy
+ListExperimentEditLink=Edit
+ListExperimentViewLink=View
+ListExperimentCreateLink=Create New Experiment
+ListExperimentIndexLink=Index
+ListExperimentTitle_id=Id
+ListExperimentTitle_name=Name
+ListExperimentTitle_description=Description
+ListExperimentTitle_startDate=StartDate
+ListExperimentTitle_endDate=EndDate
+ListExperimentTitle_experimentTypeId=ExperimentTypeId
+ExperimentPolicyCreated=ExperimentPolicy was successfully created.
+ExperimentPolicyUpdated=ExperimentPolicy was successfully updated.
+ExperimentPolicyDeleted=ExperimentPolicy was successfully deleted.
+CreateExperimentPolicyTitle=Create New ExperimentPolicy
+CreateExperimentPolicySaveLink=Save
+CreateExperimentPolicyShowAllLink=Show All ExperimentPolicy Items
+CreateExperimentPolicyIndexLink=Index
+CreateExperimentPolicyLabel_id=Id:
+CreateExperimentPolicyRequiredMessage_id=The Id field is required.
+CreateExperimentPolicyTitle_id=Id
+CreateExperimentPolicyLabel_value=Value:
+CreateExperimentPolicyRequiredMessage_value=The Value field is required.
+CreateExperimentPolicyTitle_value=Value
+CreateExperimentPolicyLabel_description=Description:
+CreateExperimentPolicyTitle_description=Description
+CreateExperimentPolicyLabel_policyTypeId=PolicyTypeId:
+CreateExperimentPolicyRequiredMessage_policyTypeId=The PolicyTypeId field is required.
+CreateExperimentPolicyTitle_policyTypeId=PolicyTypeId
+CreateExperimentPolicyLabel_experimentId=ExperimentId:
+CreateExperimentPolicyRequiredMessage_experimentId=The ExperimentId field is required.
+CreateExperimentPolicyTitle_experimentId=ExperimentId
+EditExperimentPolicyTitle=Edit ExperimentPolicy
+EditExperimentPolicySaveLink=Save
+EditExperimentPolicyViewLink=View
+EditExperimentPolicyShowAllLink=Show All ExperimentPolicy Items
+EditExperimentPolicyIndexLink=Index
+EditExperimentPolicyLabel_id=Id:
+EditExperimentPolicyRequiredMessage_id=The Id field is required.
+EditExperimentPolicyTitle_id=Id
+EditExperimentPolicyLabel_value=Value:
+EditExperimentPolicyRequiredMessage_value=The Value field is required.
+EditExperimentPolicyTitle_value=Value
+EditExperimentPolicyLabel_description=Description:
+EditExperimentPolicyTitle_description=Description
+EditExperimentPolicyLabel_policyTypeId=PolicyTypeId:
+EditExperimentPolicyRequiredMessage_policyTypeId=The PolicyTypeId field is required.
+EditExperimentPolicyTitle_policyTypeId=PolicyTypeId
+EditExperimentPolicyLabel_experimentId=ExperimentId:
+EditExperimentPolicyRequiredMessage_experimentId=The ExperimentId field is required.
+EditExperimentPolicyTitle_experimentId=ExperimentId
+ViewExperimentPolicyTitle=View
+ViewExperimentPolicyDestroyLink=Destroy
+ViewExperimentPolicyEditLink=Edit
+ViewExperimentPolicyCreateLink=Create New ExperimentPolicy
+ViewExperimentPolicyShowAllLink=Show All ExperimentPolicy Items
+ViewExperimentPolicyIndexLink=Index
+ViewExperimentPolicyLabel_id=Id:
+ViewExperimentPolicyTitle_id=Id
+ViewExperimentPolicyLabel_value=Value:
+ViewExperimentPolicyTitle_value=Value
+ViewExperimentPolicyLabel_description=Description:
+ViewExperimentPolicyTitle_description=Description
+ViewExperimentPolicyLabel_policyTypeId=PolicyTypeId:
+ViewExperimentPolicyTitle_policyTypeId=PolicyTypeId
+ViewExperimentPolicyLabel_experimentId=ExperimentId:
+ViewExperimentPolicyTitle_experimentId=ExperimentId
+ListExperimentPolicyTitle=List
+ListExperimentPolicyEmpty=(No ExperimentPolicy Items Found)
+ListExperimentPolicyDestroyLink=Destroy
+ListExperimentPolicyEditLink=Edit
+ListExperimentPolicyViewLink=View
+ListExperimentPolicyCreateLink=Create New ExperimentPolicy
+ListExperimentPolicyIndexLink=Index
+ListExperimentPolicyTitle_id=Id
+ListExperimentPolicyTitle_value=Value
+ListExperimentPolicyTitle_description=Description
+ListExperimentPolicyTitle_policyTypeId=PolicyTypeId
+ListExperimentPolicyTitle_experimentId=ExperimentId
+ExperimentTypeCreated=ExperimentType was successfully created.
+ExperimentTypeUpdated=ExperimentType was successfully updated.
+ExperimentTypeDeleted=ExperimentType was successfully deleted.
+CreateExperimentTypeTitle=Create New ExperimentType
+CreateExperimentTypeSaveLink=Save
+CreateExperimentTypeShowAllLink=Show All ExperimentType Items
+CreateExperimentTypeIndexLink=Index
+CreateExperimentTypeLabel_id=Id:
+CreateExperimentTypeRequiredMessage_id=The Id field is required.
+CreateExperimentTypeTitle_id=Id
+CreateExperimentTypeLabel_name=Name:
+CreateExperimentTypeRequiredMessage_name=The Name field is required.
+CreateExperimentTypeTitle_name=Name
+CreateExperimentTypeLabel_description=Description:
+CreateExperimentTypeTitle_description=Description
+CreateExperimentTypeLabel_rootDataPath=RootDataPath:
+CreateExperimentTypeTitle_rootDataPath=RootDataPath
+EditExperimentTypeTitle=Edit ExperimentType
+EditExperimentTypeSaveLink=Save
+EditExperimentTypeViewLink=View
+EditExperimentTypeShowAllLink=Show All ExperimentType Items
+EditExperimentTypeIndexLink=Index
+EditExperimentTypeLabel_id=Id:
+EditExperimentTypeRequiredMessage_id=The Id field is required.
+EditExperimentTypeTitle_id=Id
+EditExperimentTypeLabel_name=Name:
+EditExperimentTypeRequiredMessage_name=The Name field is required.
+EditExperimentTypeTitle_name=Name
+EditExperimentTypeLabel_description=Description:
+EditExperimentTypeTitle_description=Description
+EditExperimentTypeLabel_rootDataPath=RootDataPath:
+EditExperimentTypeTitle_rootDataPath=RootDataPath
+ViewExperimentTypeTitle=View
+ViewExperimentTypeDestroyLink=Destroy
+ViewExperimentTypeEditLink=Edit
+ViewExperimentTypeCreateLink=Create New ExperimentType
+ViewExperimentTypeShowAllLink=Show All ExperimentType Items
+ViewExperimentTypeIndexLink=Index
+ViewExperimentTypeLabel_id=Id:
+ViewExperimentTypeTitle_id=Id
+ViewExperimentTypeLabel_name=Name:
+ViewExperimentTypeTitle_name=Name
+ViewExperimentTypeLabel_description=Description:
+ViewExperimentTypeTitle_description=Description
+ViewExperimentTypeLabel_rootDataPath=RootDataPath:
+ViewExperimentTypeTitle_rootDataPath=RootDataPath
+ListExperimentTypeTitle=List
+ListExperimentTypeEmpty=(No ExperimentType Items Found)
+ListExperimentTypeDestroyLink=Destroy
+ListExperimentTypeEditLink=Edit
+ListExperimentTypeViewLink=View
+ListExperimentTypeCreateLink=Create New ExperimentType
+ListExperimentTypeIndexLink=Index
+ListExperimentTypeTitle_id=Id
+ListExperimentTypeTitle_name=Name
+ListExperimentTypeTitle_description=Description
+ListExperimentTypeTitle_rootDataPath=RootDataPath
+PolicyTypeCreated=PolicyType was successfully created.
+PolicyTypeUpdated=PolicyType was successfully updated.
+PolicyTypeDeleted=PolicyType was successfully deleted.
+CreatePolicyTypeTitle=Create New PolicyType
+CreatePolicyTypeSaveLink=Save
+CreatePolicyTypeShowAllLink=Show All PolicyType Items
+CreatePolicyTypeIndexLink=Index
+CreatePolicyTypeLabel_id=Id:
+CreatePolicyTypeRequiredMessage_id=The Id field is required.
+CreatePolicyTypeTitle_id=Id
+CreatePolicyTypeLabel_name=Name:
+CreatePolicyTypeRequiredMessage_name=The Name field is required.
+CreatePolicyTypeTitle_name=Name
+CreatePolicyTypeLabel_description=Description:
+CreatePolicyTypeTitle_description=Description
+CreatePolicyTypeLabel_handlerName=HandlerName:
+CreatePolicyTypeTitle_handlerName=HandlerName
+CreatePolicyTypeLabel_defaultValue=DefaultValue:
+CreatePolicyTypeTitle_defaultValue=DefaultValue
+EditPolicyTypeTitle=Edit PolicyType
+EditPolicyTypeSaveLink=Save
+EditPolicyTypeViewLink=View
+EditPolicyTypeShowAllLink=Show All PolicyType Items
+EditPolicyTypeIndexLink=Index
+EditPolicyTypeLabel_id=Id:
+EditPolicyTypeRequiredMessage_id=The Id field is required.
+EditPolicyTypeTitle_id=Id
+EditPolicyTypeLabel_name=Name:
+EditPolicyTypeRequiredMessage_name=The Name field is required.
+EditPolicyTypeTitle_name=Name
+EditPolicyTypeLabel_description=Description:
+EditPolicyTypeTitle_description=Description
+EditPolicyTypeLabel_handlerName=HandlerName:
+EditPolicyTypeTitle_handlerName=HandlerName
+EditPolicyTypeLabel_defaultValue=DefaultValue:
+EditPolicyTypeTitle_defaultValue=DefaultValue
+ViewPolicyTypeTitle=View
+ViewPolicyTypeDestroyLink=Destroy
+ViewPolicyTypeEditLink=Edit
+ViewPolicyTypeCreateLink=Create New PolicyType
+ViewPolicyTypeShowAllLink=Show All PolicyType Items
+ViewPolicyTypeIndexLink=Index
+ViewPolicyTypeLabel_id=Id:
+ViewPolicyTypeTitle_id=Id
+ViewPolicyTypeLabel_name=Name:
+ViewPolicyTypeTitle_name=Name
+ViewPolicyTypeLabel_description=Description:
+ViewPolicyTypeTitle_description=Description
+ViewPolicyTypeLabel_handlerName=HandlerName:
+ViewPolicyTypeTitle_handlerName=HandlerName
+ViewPolicyTypeLabel_defaultValue=DefaultValue:
+ViewPolicyTypeTitle_defaultValue=DefaultValue
+ListPolicyTypeTitle=List
+ListPolicyTypeEmpty=(No PolicyType Items Found)
+ListPolicyTypeDestroyLink=Destroy
+ListPolicyTypeEditLink=Edit
+ListPolicyTypeViewLink=View
+ListPolicyTypeCreateLink=Create New PolicyType
+ListPolicyTypeIndexLink=Index
+ListPolicyTypeTitle_id=Id
+ListPolicyTypeTitle_name=Name
+ListPolicyTypeTitle_description=Description
+ListPolicyTypeTitle_handlerName=HandlerName
+ListPolicyTypeTitle_defaultValue=DefaultValue
+RoleTypeCreated=RoleType was successfully created.
+RoleTypeUpdated=RoleType was successfully updated.
+RoleTypeDeleted=RoleType was successfully deleted.
+CreateRoleTypeTitle=Create New RoleType
+CreateRoleTypeSaveLink=Save
+CreateRoleTypeShowAllLink=Show All RoleType Items
+CreateRoleTypeIndexLink=Index
+CreateRoleTypeLabel_id=Id:
+CreateRoleTypeRequiredMessage_id=The Id field is required.
+CreateRoleTypeTitle_id=Id
+CreateRoleTypeLabel_name=Name:
+CreateRoleTypeRequiredMessage_name=The Name field is required.
+CreateRoleTypeTitle_name=Name
+CreateRoleTypeLabel_description=Description:
+CreateRoleTypeTitle_description=Description
+EditRoleTypeTitle=Edit RoleType
+EditRoleTypeSaveLink=Save
+EditRoleTypeViewLink=View
+EditRoleTypeShowAllLink=Show All RoleType Items
+EditRoleTypeIndexLink=Index
+EditRoleTypeLabel_id=Id:
+EditRoleTypeRequiredMessage_id=The Id field is required.
+EditRoleTypeTitle_id=Id
+EditRoleTypeLabel_name=Name:
+EditRoleTypeRequiredMessage_name=The Name field is required.
+EditRoleTypeTitle_name=Name
+EditRoleTypeLabel_description=Description:
+EditRoleTypeTitle_description=Description
+ViewRoleTypeTitle=View
+ViewRoleTypeDestroyLink=Destroy
+ViewRoleTypeEditLink=Edit
+ViewRoleTypeCreateLink=Create New RoleType
+ViewRoleTypeShowAllLink=Show All RoleType Items
+ViewRoleTypeIndexLink=Index
+ViewRoleTypeLabel_id=Id:
+ViewRoleTypeTitle_id=Id
+ViewRoleTypeLabel_name=Name:
+ViewRoleTypeTitle_name=Name
+ViewRoleTypeLabel_description=Description:
+ViewRoleTypeTitle_description=Description
+ListRoleTypeTitle=List
+ListRoleTypeEmpty=(No RoleType Items Found)
+ListRoleTypeDestroyLink=Destroy
+ListRoleTypeEditLink=Edit
+ListRoleTypeViewLink=View
+ListRoleTypeCreateLink=Create New RoleType
+ListRoleTypeIndexLink=Index
+ListRoleTypeTitle_id=Id
+ListRoleTypeTitle_name=Name
+ListRoleTypeTitle_description=Description
+SettingTypeCreated=SettingType was successfully created.
+SettingTypeUpdated=SettingType was successfully updated.
+SettingTypeDeleted=SettingType was successfully deleted.
+CreateSettingTypeTitle=Create New SettingType
+CreateSettingTypeSaveLink=Save
+CreateSettingTypeShowAllLink=Show All SettingType Items
+CreateSettingTypeIndexLink=Index
+CreateSettingTypeLabel_id=Id:
+CreateSettingTypeRequiredMessage_id=The Id field is required.
+CreateSettingTypeTitle_id=Id
+CreateSettingTypeLabel_name=Name:
+CreateSettingTypeRequiredMessage_name=The Name field is required.
+CreateSettingTypeTitle_name=Name
+CreateSettingTypeLabel_description=Description:
+CreateSettingTypeTitle_description=Description
+CreateSettingTypeLabel_defaultValue=DefaultValue:
+CreateSettingTypeTitle_defaultValue=DefaultValue
+CreateSettingTypeLabel_isUserModifiable=IsUserModifiable:
+CreateSettingTypeTitle_isUserModifiable=IsUserModifiable
+EditSettingTypeTitle=Edit SettingType
+EditSettingTypeSaveLink=Save
+EditSettingTypeViewLink=View
+EditSettingTypeShowAllLink=Show All SettingType Items
+EditSettingTypeIndexLink=Index
+EditSettingTypeLabel_id=Id:
+EditSettingTypeRequiredMessage_id=The Id field is required.
+EditSettingTypeTitle_id=Id
+EditSettingTypeLabel_name=Name:
+EditSettingTypeRequiredMessage_name=The Name field is required.
+EditSettingTypeTitle_name=Name
+EditSettingTypeLabel_description=Description:
+EditSettingTypeTitle_description=Description
+EditSettingTypeLabel_defaultValue=DefaultValue:
+EditSettingTypeTitle_defaultValue=DefaultValue
+EditSettingTypeLabel_isUserModifiable=IsUserModifiable:
+EditSettingTypeTitle_isUserModifiable=IsUserModifiable
+ViewSettingTypeTitle=View
+ViewSettingTypeDestroyLink=Destroy
+ViewSettingTypeEditLink=Edit
+ViewSettingTypeCreateLink=Create New SettingType
+ViewSettingTypeShowAllLink=Show All SettingType Items
+ViewSettingTypeIndexLink=Index
+ViewSettingTypeLabel_id=Id:
+ViewSettingTypeTitle_id=Id
+ViewSettingTypeLabel_name=Name:
+ViewSettingTypeTitle_name=Name
+ViewSettingTypeLabel_description=Description:
+ViewSettingTypeTitle_description=Description
+ViewSettingTypeLabel_defaultValue=DefaultValue:
+ViewSettingTypeTitle_defaultValue=DefaultValue
+ViewSettingTypeLabel_isUserModifiable=IsUserModifiable:
+ViewSettingTypeTitle_isUserModifiable=IsUserModifiable
+ListSettingTypeTitle=List
+ListSettingTypeEmpty=(No SettingType Items Found)
+ListSettingTypeDestroyLink=Destroy
+ListSettingTypeEditLink=Edit
+ListSettingTypeViewLink=View
+ListSettingTypeCreateLink=Create New SettingType
+ListSettingTypeIndexLink=Index
+ListSettingTypeTitle_id=Id
+ListSettingTypeTitle_name=Name
+ListSettingTypeTitle_description=Description
+ListSettingTypeTitle_defaultValue=DefaultValue
+ListSettingTypeTitle_isUserModifiable=IsUserModifiable
+TemplatePolicyCreated=TemplatePolicy was successfully created.
+TemplatePolicyUpdated=TemplatePolicy was successfully updated.
+TemplatePolicyDeleted=TemplatePolicy was successfully deleted.
+CreateTemplatePolicyTitle=Create New TemplatePolicy
+CreateTemplatePolicySaveLink=Save
+CreateTemplatePolicyShowAllLink=Show All TemplatePolicy Items
+CreateTemplatePolicyIndexLink=Index
+CreateTemplatePolicyLabel_id=Id:
+CreateTemplatePolicyRequiredMessage_id=The Id field is required.
+CreateTemplatePolicyTitle_id=Id
+CreateTemplatePolicyLabel_value=Value:
+CreateTemplatePolicyRequiredMessage_value=The Value field is required.
+CreateTemplatePolicyTitle_value=Value
+CreateTemplatePolicyLabel_description=Description:
+CreateTemplatePolicyTitle_description=Description
+CreateTemplatePolicyLabel_templatePolicySetId=TemplatePolicySetId:
+CreateTemplatePolicyRequiredMessage_templatePolicySetId=The TemplatePolicySetId field is required.
+CreateTemplatePolicyTitle_templatePolicySetId=TemplatePolicySetId
+CreateTemplatePolicyLabel_policyTypeId=PolicyTypeId:
+CreateTemplatePolicyRequiredMessage_policyTypeId=The PolicyTypeId field is required.
+CreateTemplatePolicyTitle_policyTypeId=PolicyTypeId
+EditTemplatePolicyTitle=Edit TemplatePolicy
+EditTemplatePolicySaveLink=Save
+EditTemplatePolicyViewLink=View
+EditTemplatePolicyShowAllLink=Show All TemplatePolicy Items
+EditTemplatePolicyIndexLink=Index
+EditTemplatePolicyLabel_id=Id:
+EditTemplatePolicyRequiredMessage_id=The Id field is required.
+EditTemplatePolicyTitle_id=Id
+EditTemplatePolicyLabel_value=Value:
+EditTemplatePolicyRequiredMessage_value=The Value field is required.
+EditTemplatePolicyTitle_value=Value
+EditTemplatePolicyLabel_description=Description:
+EditTemplatePolicyTitle_description=Description
+EditTemplatePolicyLabel_templatePolicySetId=TemplatePolicySetId:
+EditTemplatePolicyRequiredMessage_templatePolicySetId=The TemplatePolicySetId field is required.
+EditTemplatePolicyTitle_templatePolicySetId=TemplatePolicySetId
+EditTemplatePolicyLabel_policyTypeId=PolicyTypeId:
+EditTemplatePolicyRequiredMessage_policyTypeId=The PolicyTypeId field is required.
+EditTemplatePolicyTitle_policyTypeId=PolicyTypeId
+ViewTemplatePolicyTitle=View
+ViewTemplatePolicyDestroyLink=Destroy
+ViewTemplatePolicyEditLink=Edit
+ViewTemplatePolicyCreateLink=Create New TemplatePolicy
+ViewTemplatePolicyShowAllLink=Show All TemplatePolicy Items
+ViewTemplatePolicyIndexLink=Index
+ViewTemplatePolicyLabel_id=Id:
+ViewTemplatePolicyTitle_id=Id
+ViewTemplatePolicyLabel_value=Value:
+ViewTemplatePolicyTitle_value=Value
+ViewTemplatePolicyLabel_description=Description:
+ViewTemplatePolicyTitle_description=Description
+ViewTemplatePolicyLabel_templatePolicySetId=TemplatePolicySetId:
+ViewTemplatePolicyTitle_templatePolicySetId=TemplatePolicySetId
+ViewTemplatePolicyLabel_policyTypeId=PolicyTypeId:
+ViewTemplatePolicyTitle_policyTypeId=PolicyTypeId
+ListTemplatePolicyTitle=List
+ListTemplatePolicyEmpty=(No TemplatePolicy Items Found)
+ListTemplatePolicyDestroyLink=Destroy
+ListTemplatePolicyEditLink=Edit
+ListTemplatePolicyViewLink=View
+ListTemplatePolicyCreateLink=Create New TemplatePolicy
+ListTemplatePolicyIndexLink=Index
+ListTemplatePolicyTitle_id=Id
+ListTemplatePolicyTitle_value=Value
+ListTemplatePolicyTitle_description=Description
+ListTemplatePolicyTitle_templatePolicySetId=TemplatePolicySetId
+ListTemplatePolicyTitle_policyTypeId=PolicyTypeId
+TemplatePolicySetCreated=TemplatePolicySet was successfully created.
+TemplatePolicySetUpdated=TemplatePolicySet was successfully updated.
+TemplatePolicySetDeleted=TemplatePolicySet was successfully deleted.
+CreateTemplatePolicySetTitle=Create New TemplatePolicySet
+CreateTemplatePolicySetSaveLink=Save
+CreateTemplatePolicySetShowAllLink=Show All TemplatePolicySet Items
+CreateTemplatePolicySetIndexLink=Index
+CreateTemplatePolicySetLabel_id=Id:
+CreateTemplatePolicySetRequiredMessage_id=The Id field is required.
+CreateTemplatePolicySetTitle_id=Id
+CreateTemplatePolicySetLabel_name=Name:
+CreateTemplatePolicySetRequiredMessage_name=The Name field is required.
+CreateTemplatePolicySetTitle_name=Name
+CreateTemplatePolicySetLabel_description=Description:
+CreateTemplatePolicySetTitle_description=Description
+EditTemplatePolicySetTitle=Edit TemplatePolicySet
+EditTemplatePolicySetSaveLink=Save
+EditTemplatePolicySetViewLink=View
+EditTemplatePolicySetShowAllLink=Show All TemplatePolicySet Items
+EditTemplatePolicySetIndexLink=Index
+EditTemplatePolicySetLabel_id=Id:
+EditTemplatePolicySetRequiredMessage_id=The Id field is required.
+EditTemplatePolicySetTitle_id=Id
+EditTemplatePolicySetLabel_name=Name:
+EditTemplatePolicySetRequiredMessage_name=The Name field is required.
+EditTemplatePolicySetTitle_name=Name
+EditTemplatePolicySetLabel_description=Description:
+EditTemplatePolicySetTitle_description=Description
+ViewTemplatePolicySetTitle=View
+ViewTemplatePolicySetDestroyLink=Destroy
+ViewTemplatePolicySetEditLink=Edit
+ViewTemplatePolicySetCreateLink=Create New TemplatePolicySet
+ViewTemplatePolicySetShowAllLink=Show All TemplatePolicySet Items
+ViewTemplatePolicySetIndexLink=Index
+ViewTemplatePolicySetLabel_id=Id:
+ViewTemplatePolicySetTitle_id=Id
+ViewTemplatePolicySetLabel_name=Name:
+ViewTemplatePolicySetTitle_name=Name
+ViewTemplatePolicySetLabel_description=Description:
+ViewTemplatePolicySetTitle_description=Description
+ListTemplatePolicySetTitle=List
+ListTemplatePolicySetEmpty=(No TemplatePolicySet Items Found)
+ListTemplatePolicySetDestroyLink=Destroy
+ListTemplatePolicySetEditLink=Edit
+ListTemplatePolicySetViewLink=View
+ListTemplatePolicySetCreateLink=Create New TemplatePolicySet
+ListTemplatePolicySetIndexLink=Index
+ListTemplatePolicySetTitle_id=Id
+ListTemplatePolicySetTitle_name=Name
+ListTemplatePolicySetTitle_description=Description
+UserExperimentRoleCreated=UserExperimentRole was successfully created.
+UserExperimentRoleUpdated=UserExperimentRole was successfully updated.
+UserExperimentRoleDeleted=UserExperimentRole was successfully deleted.
+CreateUserExperimentRoleTitle=Create New UserExperimentRole
+CreateUserExperimentRoleSaveLink=Save
+CreateUserExperimentRoleShowAllLink=Show All UserExperimentRole Items
+CreateUserExperimentRoleIndexLink=Index
+CreateUserExperimentRoleLabel_userInfo=UserInfo:
+CreateUserExperimentRoleRequiredMessage_userInfo=The UserInfo field is required.
+CreateUserExperimentRoleTitle_userInfo=UserInfo
+CreateUserExperimentRoleLabel_roleType=RoleType:
+CreateUserExperimentRoleRequiredMessage_roleType=The RoleType field is required.
+CreateUserExperimentRoleTitle_roleType=RoleType
+CreateUserExperimentRoleLabel_experiment=Experiment:
+CreateUserExperimentRoleRequiredMessage_experiment=The Experiment field is required.
+CreateUserExperimentRoleTitle_experiment=Experiment
+EditUserExperimentRoleTitle=Edit UserExperimentRole
+EditUserExperimentRoleSaveLink=Save
+EditUserExperimentRoleViewLink=View
+EditUserExperimentRoleShowAllLink=Show All UserExperimentRole Items
+EditUserExperimentRoleIndexLink=Index
+EditUserExperimentRoleLabel_userInfo=UserInfo:
+EditUserExperimentRoleRequiredMessage_userInfo=The UserInfo field is required.
+EditUserExperimentRoleTitle_userInfo=UserInfo
+EditUserExperimentRoleLabel_roleType=RoleType:
+EditUserExperimentRoleRequiredMessage_roleType=The RoleType field is required.
+EditUserExperimentRoleTitle_roleType=RoleType
+EditUserExperimentRoleLabel_experiment=Experiment:
+EditUserExperimentRoleRequiredMessage_experiment=The Experiment field is required.
+EditUserExperimentRoleTitle_experiment=Experiment
+ViewUserExperimentRoleTitle=View
+ViewUserExperimentRoleDestroyLink=Destroy
+ViewUserExperimentRoleEditLink=Edit
+ViewUserExperimentRoleCreateLink=Create New UserExperimentRole
+ViewUserExperimentRoleShowAllLink=Show All UserExperimentRole Items
+ViewUserExperimentRoleIndexLink=Index
+ViewUserExperimentRoleLabel_userInfo=UserInfo:
+ViewUserExperimentRoleTitle_userInfo=UserInfo
+ViewUserExperimentRoleLabel_roleType=RoleType:
+ViewUserExperimentRoleTitle_roleType=RoleType
+ViewUserExperimentRoleLabel_experiment=Experiment:
+ViewUserExperimentRoleTitle_experiment=Experiment
+ListUserExperimentRoleTitle=List
+ListUserExperimentRoleEmpty=(No UserExperimentRole Items Found)
+ListUserExperimentRoleDestroyLink=Destroy
+ListUserExperimentRoleEditLink=Edit
+ListUserExperimentRoleViewLink=View
+ListUserExperimentRoleCreateLink=Create New UserExperimentRole
+ListUserExperimentRoleIndexLink=Index
+ListUserExperimentRoleTitle_userInfo=UserInfo
+ListUserExperimentRoleTitle_roleType=RoleType
+ListUserExperimentRoleTitle_experiment=Experiment
+UserInfoCreated=UserInfo was successfully created.
+UserInfoUpdated=UserInfo was successfully updated.
+UserInfoDeleted=UserInfo was successfully deleted.
+CreateUserInfoTitle=Create New UserInfo
+CreateUserInfoSaveLink=Save
+CreateUserInfoShowAllLink=Show All UserInfo Items
+CreateUserInfoIndexLink=Index
+CreateUserInfoLabel_id=Id:
+CreateUserInfoRequiredMessage_id=The Id field is required.
+CreateUserInfoTitle_id=Id
+CreateUserInfoLabel_username=Username:
+CreateUserInfoRequiredMessage_username=The Username field is required.
+CreateUserInfoTitle_username=Username
+CreateUserInfoLabel_firstName=FirstName:
+CreateUserInfoRequiredMessage_firstName=The FirstName field is required.
+CreateUserInfoTitle_firstName=FirstName
+CreateUserInfoLabel_lastName=LastName:
+CreateUserInfoRequiredMessage_lastName=The LastName field is required.
+CreateUserInfoTitle_lastName=LastName
+CreateUserInfoLabel_middleName=MiddleName:
+CreateUserInfoTitle_middleName=MiddleName
+CreateUserInfoLabel_email=Email:
+CreateUserInfoTitle_email=Email
+CreateUserInfoLabel_description=Description:
+CreateUserInfoTitle_description=Description
+CreateUserInfoLabel_password=Password:
+CreateUserInfoTitle_password=Password
+EditUserInfoTitle=Edit UserInfo
+EditUserInfoSaveLink=Save
+EditUserInfoViewLink=View
+EditUserInfoShowAllLink=Show All UserInfo Items
+EditUserInfoIndexLink=Index
+EditUserInfoLabel_id=Id:
+EditUserInfoRequiredMessage_id=The Id field is required.
+EditUserInfoTitle_id=Id
+EditUserInfoLabel_username=Username:
+EditUserInfoRequiredMessage_username=The Username field is required.
+EditUserInfoTitle_username=Username
+EditUserInfoLabel_firstName=FirstName:
+EditUserInfoRequiredMessage_firstName=The FirstName field is required.
+EditUserInfoTitle_firstName=FirstName
+EditUserInfoLabel_lastName=LastName:
+EditUserInfoRequiredMessage_lastName=The LastName field is required.
+EditUserInfoTitle_lastName=LastName
+EditUserInfoLabel_middleName=MiddleName:
+EditUserInfoTitle_middleName=MiddleName
+EditUserInfoLabel_email=Email:
+EditUserInfoTitle_email=Email
+EditUserInfoLabel_description=Description:
+EditUserInfoTitle_description=Description
+EditUserInfoLabel_password=Password:
+EditUserInfoTitle_password=Password
+ViewUserInfoTitle=View
+ViewUserInfoDestroyLink=Destroy
+ViewUserInfoEditLink=Edit
+ViewUserInfoCreateLink=Create New UserInfo
+ViewUserInfoShowAllLink=Show All UserInfo Items
+ViewUserInfoIndexLink=Index
+ViewUserInfoLabel_id=Id:
+ViewUserInfoTitle_id=Id
+ViewUserInfoLabel_username=Username:
+ViewUserInfoTitle_username=Username
+ViewUserInfoLabel_firstName=FirstName:
+ViewUserInfoTitle_firstName=FirstName
+ViewUserInfoLabel_lastName=LastName:
+ViewUserInfoTitle_lastName=LastName
+ViewUserInfoLabel_middleName=MiddleName:
+ViewUserInfoTitle_middleName=MiddleName
+ViewUserInfoLabel_email=Email:
+ViewUserInfoTitle_email=Email
+ViewUserInfoLabel_description=Description:
+ViewUserInfoTitle_description=Description
+ViewUserInfoLabel_password=Password:
+ViewUserInfoTitle_password=Password
+ListUserInfoTitle=List
+ListUserInfoEmpty=(No UserInfo Items Found)
+ListUserInfoDestroyLink=Destroy
+ListUserInfoEditLink=Edit
+ListUserInfoViewLink=View
+ListUserInfoCreateLink=Create New UserInfo
+ListUserInfoIndexLink=Index
+ListUserInfoTitle_id=Id
+ListUserInfoTitle_username=Username
+ListUserInfoTitle_firstName=FirstName
+ListUserInfoTitle_lastName=LastName
+ListUserInfoTitle_middleName=MiddleName
+ListUserInfoTitle_email=Email
+ListUserInfoTitle_description=Description
+ListUserInfoTitle_password=Password
+UserSettingCreated=UserSetting was successfully created.
+UserSettingUpdated=UserSetting was successfully updated.
+UserSettingDeleted=UserSetting was successfully deleted.
+CreateUserSettingTitle=Create New UserSetting
+CreateUserSettingSaveLink=Save
+CreateUserSettingShowAllLink=Show All UserSetting Items
+CreateUserSettingIndexLink=Index
+CreateUserSettingLabel_id=Id:
+CreateUserSettingRequiredMessage_id=The Id field is required.
+CreateUserSettingTitle_id=Id
+CreateUserSettingLabel_value=Value:
+CreateUserSettingTitle_value=Value
+CreateUserSettingLabel_userId=UserId:
+CreateUserSettingRequiredMessage_userId=The UserId field is required.
+CreateUserSettingTitle_userId=UserId
+CreateUserSettingLabel_settingTypeId=SettingTypeId:
+CreateUserSettingRequiredMessage_settingTypeId=The SettingTypeId field is required.
+CreateUserSettingTitle_settingTypeId=SettingTypeId
+EditUserSettingTitle=Edit UserSetting
+EditUserSettingSaveLink=Save
+EditUserSettingViewLink=View
+EditUserSettingShowAllLink=Show All UserSetting Items
+EditUserSettingIndexLink=Index
+EditUserSettingLabel_id=Id:
+EditUserSettingRequiredMessage_id=The Id field is required.
+EditUserSettingTitle_id=Id
+EditUserSettingLabel_value=Value:
+EditUserSettingTitle_value=Value
+EditUserSettingLabel_userId=UserId:
+EditUserSettingRequiredMessage_userId=The UserId field is required.
+EditUserSettingTitle_userId=UserId
+EditUserSettingLabel_settingTypeId=SettingTypeId:
+EditUserSettingRequiredMessage_settingTypeId=The SettingTypeId field is required.
+EditUserSettingTitle_settingTypeId=SettingTypeId
+ViewUserSettingTitle=View
+ViewUserSettingDestroyLink=Destroy
+ViewUserSettingEditLink=Edit
+ViewUserSettingCreateLink=Create New UserSetting
+ViewUserSettingShowAllLink=Show All UserSetting Items
+ViewUserSettingIndexLink=Index
+ViewUserSettingLabel_id=Id:
+ViewUserSettingTitle_id=Id
+ViewUserSettingLabel_value=Value:
+ViewUserSettingTitle_value=Value
+ViewUserSettingLabel_userId=UserId:
+ViewUserSettingTitle_userId=UserId
+ViewUserSettingLabel_settingTypeId=SettingTypeId:
+ViewUserSettingTitle_settingTypeId=SettingTypeId
+ListUserSettingTitle=List
+ListUserSettingEmpty=(No UserSetting Items Found)
+ListUserSettingDestroyLink=Destroy
+ListUserSettingEditLink=Edit
+ListUserSettingViewLink=View
+ListUserSettingCreateLink=Create New UserSetting
+ListUserSettingIndexLink=Index
+ListUserSettingTitle_id=Id
+ListUserSettingTitle_value=Value
+ListUserSettingTitle_userId=UserId
+ListUserSettingTitle_settingTypeId=SettingTypeId
diff --git a/src/java/DmWebPortal/web/WEB-INF/faces-config.xml b/src/java/DmWebPortal/web/WEB-INF/faces-config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b8e4f061fb5737b0fd1748305200da1ec2622008
--- /dev/null
+++ b/src/java/DmWebPortal/web/WEB-INF/faces-config.xml
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<faces-config version="2.2"
+    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
+    <application>
+        <resource-bundle>
+            <base-name>/resources</base-name>
+            <var>resources</var>
+        </resource-bundle>
+    </application>
+</faces-config>
diff --git a/src/java/DmWebPortal/web/WEB-INF/glassfish-web.xml b/src/java/DmWebPortal/web/WEB-INF/glassfish-web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9b1c973fd9542dbfdf60cd64a1af5126cbee1945
--- /dev/null
+++ b/src/java/DmWebPortal/web/WEB-INF/glassfish-web.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
+<glassfish-web-app error-url="">
+  <context-root>/dm</context-root>
+  <class-loader delegate="true"/>
+  <jsp-config>
+    <property name="keepgenerated" value="true">
+      <description>Keep a copy of the generated servlet class' java code.</description>
+    </property>
+  </jsp-config>
+</glassfish-web-app>
diff --git a/src/java/DmWebPortal/web/WEB-INF/web.xml b/src/java/DmWebPortal/web/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f183b15e54072c5d3afaac6a188555a42b031e97
--- /dev/null
+++ b/src/java/DmWebPortal/web/WEB-INF/web.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
+    <context-param>
+        <param-name>javax.faces.PROJECT_STAGE</param-name>
+        <param-value>Development</param-value>
+    </context-param>
+    <servlet>
+        <servlet-name>Faces Servlet</servlet-name>
+        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>Faces Servlet</servlet-name>
+        <url-pattern>*.xhtml</url-pattern>
+    </servlet-mapping>
+    <session-config>
+        <session-timeout>
+            30
+        </session-timeout>
+    </session-config>
+    <welcome-file-list>
+        <welcome-file>index.xhtml</welcome-file>
+    </welcome-file-list>
+    <error-page>
+        <exception-type>javax.faces.application.ViewExpiredException</exception-type>
+        <location>/views/login.xhtml</location>
+    </error-page>
+
+    <error-page>
+        <exception-type>com.sun.faces.context.FacesFileNotFoundException</exception-type>
+        <location>/views/error/pageNotFound.xhtml</location>
+    </error-page>
+
+    <error-page>
+        <error-code>401</error-code>
+        <location>/views/error/accessDenied.xhtml</location>
+    </error-page>
+
+    <error-page>
+        <error-code>403</error-code>
+        <location>/views/error/accessDenied.xhtml</location>
+    </error-page>
+
+    <error-page>
+        <error-code>404</error-code>
+        <location>/views/error/pageNotFound.xhtml</location>
+    </error-page>
+
+    <security-constraint>
+        <display-name>Restrict Private Files</display-name>
+        <web-resource-collection>
+            <web-resource-name>Restricted Files</web-resource-name>
+            <url-pattern>/templates/*</url-pattern>
+            <url-pattern>/views/common/*</url-pattern>
+            <url-pattern>/views/experiment/private/*</url-pattern>
+            <url-pattern>/views/experimentType/private/*</url-pattern>
+            <url-pattern>/views/userInfo/private/*</url-pattern>
+        </web-resource-collection>
+        <auth-constraint/>                              
+    </security-constraint>
+</web-app>
diff --git a/src/java/DmWebPortal/web/index.xhtml b/src/java/DmWebPortal/web/index.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..f959accc1dc57c107ff93b91df97a2058bf1aaab
--- /dev/null
+++ b/src/java/DmWebPortal/web/index.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">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="http://java.sun.com/jsf/html">
+    <h:head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link href="./resources/css/portal.css" rel="stylesheet" type="text/css" />
+        <link rel="icon" type="image/png" href="./resources/images/anl.ico" />
+        <title>Data Management Portal</title>
+    </h:head>
+
+    <h:body>
+        <script type="text/javascript">
+            document.location = "views/home.xhtml";
+        </script>
+    </h:body>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</html>
+
diff --git a/src/java/DmWebPortal/web/resources/css/jsfcrud.css b/src/java/DmWebPortal/web/resources/css/jsfcrud.css
new file mode 100644
index 0000000000000000000000000000000000000000..811a960478318559204a1fd5cbe1df2cd16e743c
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/css/jsfcrud.css
@@ -0,0 +1,82 @@
+root { 
+    display: block;
+}
+
+body {
+    font-family: Arial, Helvetica, sans-serif;
+    color: #3a4f54;
+    background-color: #f2f4f7;
+    font-size: small;
+}
+
+a {
+    color: #e33b06;
+}
+
+table {
+    empty-cells: show;
+}
+
+form.jsfcrud_list_form th, td th {
+    font-size: x-small;
+    color: #4e6a71;
+    border-top-style: solid;
+    border-bottom-style: solid;
+    border-left-style: solid;
+    border-right-style: solid;
+    border-top-width: 1px;
+    border-bottom-width: 1px;
+    border-left-width: 1px;
+    border-right-width: 1px;
+    border-top-color: #b2d5d6;
+    border-bottom-color: #b2d5d6;
+    border-left-color: #90b4bd;
+    border-right-color: #90b4bd;
+    letter-spacing: 3px;
+    text-align: left;
+    padding-top: 6px;
+    padding-bottom: 6px;
+    padding-left: 6px;
+    padding-right: 6px;
+    background-color: #b2d5d6;
+}
+
+td {
+    vertical-align: top;
+    padding-bottom: 8px;
+    font-size: small;
+}
+
+form.jsfcrud_list_form td, td td {
+    border-top-style: solid;
+    border-bottom-style: solid;
+    border-left-style: solid;
+    border-right-style: solid;
+    border-top-width: 1px;
+    border-bottom-width: 1px;
+    border-left-width: 1px;
+    border-right-width: 1px;
+    border-top-color: #b2d5d6;
+    border-bottom-color: #b2d5d6;
+    border-left-color: #b2d5d6;
+    border-right-color: #b2d5d6;
+    vertical-align: baseline;
+    padding-bottom: 0px;
+}
+
+tr.jsfcrud_odd_row {
+    background-color: #fefeff;
+    color: #4e6a71;
+}
+
+
+tr.jsfcrud_even_row {
+    background-color: #eff5fa;
+    color: #4e6a71;
+}
+
+#busyImage {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+}
diff --git a/src/java/DmWebPortal/web/resources/css/login.css b/src/java/DmWebPortal/web/resources/css/login.css
new file mode 100644
index 0000000000000000000000000000000000000000..1b5bebfd53903c550c6516cd198fc9b057050ae7
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/css/login.css
@@ -0,0 +1,161 @@
+body {
+    background-color: #f2f4f7;
+    font-size: 12px;
+    font-family: Verdana, "Verdana CE",  Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    color: #000000;
+    margin: 0px;
+}
+
+a:link, a:visited {
+    color: #4e80b6;
+    font-weight: bold;
+}
+
+a:link:hover, a:visited:hover  {
+    color: #6da5d8;
+    font-weight: bold;
+}
+
+ #top {
+     position: relative;
+     color: white;
+
+     /* IE10 */
+     background-image: -ms-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+     /* Mozilla Firefox */
+     background-image: -moz-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+     /* Opera */
+     background-image: -o-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+     /* Webkit (Safari/Chrome 10) */
+     background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #4e80b6), color-stop(1, #6da5d8));
+     /* Webkit (Chrome 11+) */
+     background-image: -webkit-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+     /* Proposed W3C Markup */
+     background-image: linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+     /* IE6-9 */
+     filter:  progid:DXImageTransform.Microsoft.gradient(startColorstr='#4e80b6', endColorstr='#6da5d8');
+     padding: 15px;
+     margin: 0px 0px 0px 0px;
+     height: 75px;
+ }
+
+#middle {
+    position: relative;
+    background-color: #f2f4f7;
+    padding: 5px;
+    margin: 0px 0px 0px 0px;
+    height: 100%;
+}
+
+#bottom {
+    position: relative;
+    background-color: #f2f4f7;
+    padding: 5px;
+    margin: 10px 0px 0px 10px;
+    height: 100%;
+    float: left;
+}
+
+.middleLeftContent {
+    float: left;
+    margin-left: 35px;
+    vertical-align: central;
+    text-align: center;
+}
+
+.middleRightContent {
+    font-size: 14px;
+    font-weight: normal;
+    vertical-align: central;
+    margin-top: 100px;
+    background-color: #f2f4f7;
+    color: saddlebrown;
+    size: auto;
+}
+
+.topLeftContent {
+    float: left;
+    width: 150px;
+    margin-left: 35px;
+    vertical-align: central;
+    text-align: center;
+}
+
+.topCenterContent {
+    position: relative;
+    vertical-align: central;
+    text-align: center;
+    margin: 0px 170px 0px 170px;
+}
+
+.topRightContent {
+    float: right;
+    width: 170px;
+    vertical-align: central;
+    text-align: center;
+    font-size: 10px;
+}
+
+.login {
+    vertical-align: central;
+    text-align: center;
+    margin-left: auto;
+    margin-right: auto;
+    background: #f2f4f7;
+    padding: 100px;
+}
+
+input {
+    background: #f2f4f7;
+    box-shadow: 0px 3px 5px #d5d5d5;
+}
+
+
+h1 {
+    font-family: Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    font-size:  24px;
+    font-weight: bold;
+    margin: 20px;
+    padding-bottom: 0px;
+    color: #f2f4f7;
+    vertical-align: middle;
+}
+
+.pageTitle h2 {
+    font-family: Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    font-size:  20px;
+    font-weight: bold;
+    margin: 0px;
+    padding-bottom: 40px;
+    color: #4e80b6;
+    vertical-align: middle;
+    text-align: left;
+}
+
+.sectionText {
+    font-size: 14px;
+    font-weight: normal;
+    color: #4e80b6;
+}
+
+.ui-messages-info, .ui-message-info {
+    background-color: #f2f4f7;
+    color: saddlebrown;
+    border: #f2f4f7;
+    size: auto;
+}
+
+.ui-messages-warn, .ui-message-warn {
+    background-color: #f2f4f7;
+    color: saddlebrown;
+    border: #f2f4f7;
+    size: auto;
+    drop-initial-size: auto;
+}
+
+.ui-messages-error, .ui-message-error {
+    background-color: #f2f4f7;
+    color: saddlebrown;
+    border: #f2f4f7;
+    size: auto;
+}
diff --git a/src/java/DmWebPortal/web/resources/css/portal.css b/src/java/DmWebPortal/web/resources/css/portal.css
new file mode 100644
index 0000000000000000000000000000000000000000..662b6d02939f91c617e00ef54e6b75aa9fb82a2a
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/css/portal.css
@@ -0,0 +1,481 @@
+body {
+    background-color: #f2f4f7;
+    font-size: 12px;
+    font-family: Verdana, "Verdana CE",  Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    color: #000000;
+    margin: 0px;
+}
+
+a:link, a:visited {
+    color: #4e80b6;
+    font-weight: bold;
+}
+
+a:link:hover, a:visited:hover  {
+    color: #6da5d8;
+    font-weight: bold;
+}
+
+#top {
+    position: relative;
+    color: white;
+
+    /* IE10 */
+    background-image: -ms-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+    /* Mozilla Firefox */
+    background-image: -moz-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+    /* Opera */
+    background-image: -o-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+    /* Webkit (Safari/Chrome 10) */
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #4e80b6), color-stop(1, #6da5d8));
+    /* Webkit (Chrome 11+) */
+    background-image: -webkit-linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+    /* Proposed W3C Markup */
+    background-image: linear-gradient(top, #4e80b6 0%, #6da5d8 100%);
+    /* IE6-9 */
+    filter:  progid:DXImageTransform.Microsoft.gradient(startColorstr='#4e80b6', endColorstr='#6da5d8');
+
+    padding: 15px;
+    margin: 0px 0px 0px 0px;
+    height: 75px;
+}
+
+#menu {
+    background-color: #6da5d8;
+}
+
+#middle {
+}
+
+#bottom {
+    position: relative;
+    background-color: #6da5d8;
+    padding: 0px;
+    margin: 0px 0px 0px 0px;
+    height: 100%
+}
+
+.topLeftContent {
+    float: left;
+    width: 170px;
+    vertical-align: central;
+    text-align: center;
+    margin-left: 35px;
+}
+
+.topCenterContent {
+    position: relative;
+    vertical-align: central;
+    text-align: center;
+    margin: 0px 170px 0px 170px;
+}
+
+.topRightContent {
+    float: right;
+    width: 170px;
+    vertical-align: central;
+    text-align: left;
+    font-size: 10px;
+}
+
+.menubar {
+    background: #6da5d8;
+}
+
+.menuContent {
+    position: relative;
+    vertical-align: central;
+    text-align: left;
+    margin: 0px 0px 0px 0px;
+    color: white;
+    background-color: #6da5d8;
+}
+
+.menuLeftContent {
+    float: left;
+    width: 50px;
+    height: fit-content;
+    text-align: center;
+    background-color: #6da5d8;
+}
+
+.menuCenterContent {
+    position: relative;
+    vertical-align: central;
+    text-align: left;
+    margin: 0px 0px 0px 0px;
+    color: white;
+    background-color: #6da5d8;
+}
+
+.menuRightContent {
+    float: right;
+    width: 50px;
+    vertical-align: central;
+    text-align: center;
+    background-color: #6da5d8;
+}
+
+.middleLeftContent {
+    float: left;
+    width: 50px;
+    height: fit-content;
+    text-align: center;
+    background-color: #6da5d8;
+}
+
+.middleCenterContent {
+    position: relative;
+    vertical-align: central;
+    text-align: left;
+    margin: 50px;
+    color: white;
+}
+
+.middleCenterLeftContent {
+    float: left;
+    margin-right: 2%;
+    margin-bottom: 2%;
+}
+
+.middleCenterRightContent {
+    float: left;
+    margin-bottom: 2%;
+}
+
+.middleRightContent {
+    float: right;
+    width: 50px;
+    vertical-align: central;
+    text-align: center;
+    background-color: #6da5d8;
+}
+
+.userNotification h3 {
+    color: red;
+    margin-bottom: 50px;
+}
+
+.actionButton {
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 5px;
+    border: 0px;
+}
+
+.actionButtonRight {
+    float: right;
+    margin-right: 0px;
+    margin-left: 5px;
+}
+
+.actionLink {
+    display: none;
+}
+
+.entityDataLabel {
+    font-weight: bold;
+}
+
+.entityDataEmphasizedLabel {
+    font-weight: bold;
+    font-size: 105%;
+}
+
+.entityDataInputText {
+    font-weight: normal;
+    float: left;
+    background: white;
+}
+
+.entityDataInputTextShort {
+    font-weight: normal;
+    float: left;
+    width: 150px;
+    background: white;
+}
+
+.entityDataEmphasizedInputText {
+    font-weight: bold;
+    font-size: 105%;
+    background: white;
+}
+
+.entityDataText {
+    font-weight: normal;
+    float: left;
+}
+
+.entityDataTextShort {
+    font-weight: normal;
+    float: left;
+    width: 150px;
+}
+
+.entityDataEmphasizedText {
+    font-weight: bold;
+    font-size: 105%;
+}
+
+.entityDataSelectOne {
+    font-weight: normal;
+}
+
+.entityDataSelectMany {
+    font-weight: normal;
+    height: 75px;
+}
+
+.entityDataError {
+    font-weight: bold;
+}
+
+.createEntityDetails td:nth-child(1) {
+    vertical-align: top;
+}
+
+.createEntityDetails td:nth-child(2) {
+    width: 300px;
+}
+
+.viewEntityDetails td:nth-child(1) {
+    vertical-align: top;
+    width: 125px;
+}
+
+.viewEntityDetails td:nth-child(2) {
+    vertical-align: top;
+    width: 300px;
+}
+
+.editEntityDetails td:nth-child(1) {
+    vertical-align: top;
+}
+
+.editEntityDetails td:nth-child(2) {
+    width: 300px;
+}
+
+.entityLogList td:last-child {
+    width: 195px;
+}
+
+.commandLink {
+
+}
+
+tr:hover .actionLink {
+    display: inline-block;
+}
+
+.objectPanel {
+    display: inline-block;
+}
+
+.statusPanel {
+    display: inline-block;
+    white-space: pre;
+}
+
+.queryPanel {
+    width: 100%;
+}
+
+.queryInput {
+    width: 200px;
+}
+
+.queryColumn {
+    text-align: center;
+}
+
+.dialog {
+    background: #6da5d8;
+    box-shadow: 0px 3px 5px #d5d5d5;    
+    vertical-align: central;
+    text-align: center;
+    margin: 0;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+.dialogDataLabel {
+    float: left
+}
+
+.htmlPreserve {
+    white-space: pre;
+}
+
+input, textarea {
+    background: #f2f4f7;
+    box-shadow: 0px 3px 5px #d5d5d5;
+    width: 300px;
+}
+
+.loginInput input {
+    width: 200px;
+}
+
+.cellSelect {
+    width: 150px;
+}
+
+.longCellSelect {
+    width: 300px;
+}
+
+.veryLongCellSelect {
+    width: 450px;
+}
+
+.cellInput {
+    width: 125px;
+}
+
+.shortCellInput {
+    width: 75px;
+}
+
+.longCellInput {
+    width: 250px;
+}
+
+.threeDigitCellInput {
+    width: 20px;
+}
+
+.fourDigitCellInput {
+    width: 30px;
+}
+
+select {
+    width: 150px;
+}
+
+h1 {
+    font-family: Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    font-size:  24px;
+    font-weight: bold;
+    margin: 20px;
+    padding-bottom: 0px;
+    color: #f2f4f7;
+    vertical-align: middle;
+}
+
+.pageTitle h1 {
+    font-family: Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    font-size:  20px;
+    font-weight: bold;
+    margin: 0px;
+    padding-bottom: 40px;
+    color: #4e80b6;
+    vertical-align: middle;
+    text-align: left;
+}
+
+.sectionTitle h2 {
+    font-family: Arial, "Arial CE", "Lucida Grande CE", lucida, "Helvetica CE", sans-serif;
+    font-size:  16px;
+    font-weight: bold;
+    margin: 0px;
+    padding-top: 20px;
+    padding-bottom: 20px;
+    color: #4e80b6;
+    vertical-align: middle;
+    text-align: left;
+}
+
+.sectionText {
+    font-size: 14px;
+    font-weight: normal;
+    color: #4e80b6;
+}
+
+h2 {
+    font-size:  20px;
+    font-weight: bold;
+    color: #4e80b6;
+}
+
+.shortFilterColumn {
+    width: 40px;
+}
+
+.ui-accordion .ui-accordion-content {
+    background: #f2f4f7;    
+}
+
+.ui-panelgrid tr, .ui-panelgrid td {
+    background: #f2f4f7;
+    border: none;
+    font-weight: bold;
+}
+
+.ui-menu, .ui-menuitem, .ui-menu .ui-menu-child {
+    background: #6da5d8;
+    color: white;
+    margin-top: 0px;
+}
+
+.ui-menuitem-text {
+    color: white;
+    font-weight: bold;
+}
+
+.ui-growl-item-container {
+    vertical-align: middle;
+}
+
+.ui-tooltip {
+    text-wrap: normal;
+}
+
+.ui-icon {
+    display: inline-block;
+}
+
+.ui-dialog-footer, .ui-dialog-buttonpane, .ui-dialog .ui-dialog-buttonpane {
+    background: #6da5d8;
+    text-align: center;
+}
+
+.ui-confirm-dialog-message {
+    color: white;
+}
+
+.ui-column-dnd-bottom {
+    display: none;
+}
+
+.ui-icon-excel {
+    background-image: url(../../resources/images/excel.ico) !important;
+    background-repeat: no-repeat;
+    background-position: left
+}
+
+.ui-icon-pdf {
+    background-image: url(../../resources/images/pdf.ico) !important;
+    background-repeat: no-repeat;
+    background-position: left
+}
+
+.ui-datatable-resizable {
+    table-layout: auto !important;
+}
+
+.ui-datatable {
+    table-layout: auto !important;
+}
+
+.ui-datatable-scrollable {
+    table-layout: fixed !important;
+}
+
+.ui-datatable table, .ui-datatable-resizable table {
+    table-layout: auto !important;
+}
+
+.ui-datatable-scrollable table {
+    table-layout: fixed !important;
+}
diff --git a/src/java/DmWebPortal/web/resources/images/AnlLogo167x75.png b/src/java/DmWebPortal/web/resources/images/AnlLogo167x75.png
new file mode 100644
index 0000000000000000000000000000000000000000..369682cf138a5ead2fb29f92d0fb53ada7e6287a
Binary files /dev/null and b/src/java/DmWebPortal/web/resources/images/AnlLogo167x75.png differ
diff --git a/src/java/DmWebPortal/web/resources/images/ApsStorageRing.png b/src/java/DmWebPortal/web/resources/images/ApsStorageRing.png
new file mode 100644
index 0000000000000000000000000000000000000000..97b5f6f23990d5869ba986ed24f58c63b6ff66dd
Binary files /dev/null and b/src/java/DmWebPortal/web/resources/images/ApsStorageRing.png differ
diff --git a/src/java/DmWebPortal/web/resources/js/common/forwardFromHome.js b/src/java/DmWebPortal/web/resources/js/common/forwardFromHome.js
new file mode 100644
index 0000000000000000000000000000000000000000..3e5512f70a1e9562b7820651ffe45ff5a73a9679
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/common/forwardFromHome.js
@@ -0,0 +1 @@
+  window.location = "login.xhtml";
diff --git a/src/java/DmWebPortal/web/resources/js/common/forwardHome.js b/src/java/DmWebPortal/web/resources/js/common/forwardHome.js
new file mode 100644
index 0000000000000000000000000000000000000000..3928772223d52b2d23c5bdcaa425d5aad6016f32
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/common/forwardHome.js
@@ -0,0 +1 @@
+window.location = "/dm/views/home.xhtml";
diff --git a/src/java/DmWebPortal/web/resources/js/common/forwardNotAuthorized.js b/src/java/DmWebPortal/web/resources/js/common/forwardNotAuthorized.js
new file mode 100644
index 0000000000000000000000000000000000000000..47afe4b1d77312d25dc51dba84b70e880b83a9fb
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/common/forwardNotAuthorized.js
@@ -0,0 +1,2 @@
+ window.location = "list.xhtml";
+
diff --git a/src/java/DmWebPortal/web/resources/js/common/forwardNotLoggedIn.js b/src/java/DmWebPortal/web/resources/js/common/forwardNotLoggedIn.js
new file mode 100644
index 0000000000000000000000000000000000000000..c2cf6f087d932492df8d5d71da2c91b157018816
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/common/forwardNotLoggedIn.js
@@ -0,0 +1 @@
+window.location = "/dm/views/login.xhtml";
diff --git a/src/java/DmWebPortal/web/resources/js/common/noBack.js b/src/java/DmWebPortal/web/resources/js/common/noBack.js
new file mode 100644
index 0000000000000000000000000000000000000000..18b4332fa5f553dfb1c8df6dda6f6be079bc6eb7
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/common/noBack.js
@@ -0,0 +1,2 @@
+  window.history.forward();
+
diff --git a/src/java/DmWebPortal/web/resources/js/experiment/loadFilters.js b/src/java/DmWebPortal/web/resources/js/experiment/loadFilters.js
new file mode 100644
index 0000000000000000000000000000000000000000..711fc5d981832bcb23909cf93cee1e1f82d22870
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/experiment/loadFilters.js
@@ -0,0 +1,3 @@
+jQuery(document).ready(function() {
+    PF('experimentListWidget').filter();   
+});
diff --git a/src/java/DmWebPortal/web/resources/js/experimentStation/loadFilters.js b/src/java/DmWebPortal/web/resources/js/experimentStation/loadFilters.js
new file mode 100644
index 0000000000000000000000000000000000000000..2de141853db4417804926698f4e446e084d3c0d6
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/experimentStation/loadFilters.js
@@ -0,0 +1,3 @@
+jQuery(document).ready(function() {
+    PF('experimentStationListWidget').filter();   
+});
diff --git a/src/java/DmWebPortal/web/resources/js/experimentType/loadFilters.js b/src/java/DmWebPortal/web/resources/js/experimentType/loadFilters.js
new file mode 100644
index 0000000000000000000000000000000000000000..df99ada6d83ba43155697170eb7b674a8662a2dc
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/experimentType/loadFilters.js
@@ -0,0 +1,3 @@
+jQuery(document).ready(function() {
+    PF('experimentTypeListWidget').filter();   
+});
diff --git a/src/java/DmWebPortal/web/resources/js/jsfcrud.js b/src/java/DmWebPortal/web/resources/js/jsfcrud.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb1c8c63b012282c326b83b4ff6a95f48706687f
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/jsfcrud.js
@@ -0,0 +1,8 @@
+function handleSubmit(args, dialog) {
+    var jqDialog = jQuery('#' + dialog);
+    if (args.validationFailed) {
+        jqDialog.effect('shake', {times: 3}, 100);
+    } else {
+        PF(dialog).hide();
+    }
+}
diff --git a/src/java/DmWebPortal/web/resources/js/userInfo/loadFilters.js b/src/java/DmWebPortal/web/resources/js/userInfo/loadFilters.js
new file mode 100644
index 0000000000000000000000000000000000000000..b5fab9c4130fccb429f0962829777e40fee9962d
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/userInfo/loadFilters.js
@@ -0,0 +1,3 @@
+jQuery(document).ready(function() {
+    PF('userInfoListWidget').filter();   
+});
diff --git a/src/java/DmWebPortal/web/templates/dmViewTemplate.xhtml b/src/java/DmWebPortal/web/templates/dmViewTemplate.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..8aceeae51b6a690c34e367c09380a802f9a98ee0
--- /dev/null
+++ b/src/java/DmWebPortal/web/templates/dmViewTemplate.xhtml
@@ -0,0 +1,113 @@
+<!--<?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">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:ui="http://java.sun.com/jsf/facelets"
+      xmlns:p="http://primefaces.org/ui"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:f="http://xmlns.jcp.org/jsf/core">
+
+
+
+    <h:head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link href="/dm/resources/css/portal.css" rel="stylesheet" type="text/css" />
+
+    </h:head>
+
+    <h:body>
+
+        <div id="top" class="topContent">
+            <div id="topLeft" class="topLeftContent">
+                <ui:insert name="topLeft">
+                    <h:graphicImage alt="ANL Logo" url="/resources/images/AnlLogo167x75.png"/>
+                </ui:insert>
+            </div>
+            <div>
+                <div id="topRight" class="topRightContent">
+                    <ui:insert name="topRight">
+
+                        <h:outputText value="Username: #{loginController.displayUsername()}"/>
+                        <br/>
+
+                        <h:outputText value="Role: #{loginController.displayRole()}"/>
+                    </ui:insert>
+                </div>
+                <div id="topCenter" class="topCenterContent">
+                    <ui:insert name="topCenter">
+                        <h1>Data Management Portal</h1>
+                    </ui:insert>
+                </div>
+            </div>
+        </div>
+
+        <ui:fragment>
+            <div id="menu" class="menuContent">
+                <div id="menuLeft" class="menuLeftContent">
+                    <ui:insert name="menuLeft">
+                        <p:menubar/>
+                    </ui:insert>
+                </div>
+                <div>
+                    <div id="menuRight" class="menuRightContent">
+                        <ui:insert name="menuRight">
+                        </ui:insert>
+                    </div>
+                    <div id="menuCenter" class="menuCenterContent">
+                        <ui:insert name="menuCenter">
+                            <h:form prependId="false">
+                                <ui:include src="/templates/menubarTemplate.xhtml"/>
+                            </h:form>
+                        </ui:insert>
+                    </div>
+                </div>
+            </div>
+
+            <div id="middle" class="middleContent">
+                <div id="middleLeft" class="middleLeftContent">
+                    <ui:insert name="middleLeft">
+                    </ui:insert>
+                </div>
+
+                <div id="middleRight" class="middleRightContent">
+                    <ui:insert name="middleRight">
+                    </ui:insert>
+                </div>
+                <div id="middleCenter" class="middleCenterContent">
+                    <ui:insert name="middleCenter">
+                    </ui:insert>
+                </div>
+
+            </div>
+        </ui:fragment>
+
+        <ui:fragment>
+            <div id="bottom" class="bottomContent">
+                <ui:insert name="bottom">
+                    <h:form prependId="false">
+                        <p:growl id="messages" showDetail="true" autoUpdate="true"/>
+                    </h:form>
+                </ui:insert>
+            </div>
+        </ui:fragment>
+
+        <h:form id="loginForm">
+            <p:dialog id="loginDialog" styleClass="dialog" header="Login" widgetVar="loginDialog">
+                <h:panelGrid styleClass="loginInput">
+                    <div class="dialog">
+                        <div>
+                            <p:inputText id="username" value="#{loginController.username}" title="Username"/>
+                            <p:watermark for="username" value="Username"/>
+                            <p:password id="password" value="#{loginController.password}" title="Password"/>
+                            <p:watermark for="password" value="Password"/>
+                        </div>
+
+                        <f:facet name="footer">
+                            <p:commandButton id="loginButton" value="Login" action="#{loginController.login}" oncomplete="loginDialog.hide()"/>
+                        </f:facet>
+                    </div>
+                </h:panelGrid>
+            </p:dialog>
+        </h:form>
+    </h:body>
+
+</html>
\ No newline at end of file
diff --git a/src/java/DmWebPortal/web/templates/errorViewTemplate.xhtml b/src/java/DmWebPortal/web/templates/errorViewTemplate.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..c464f801e67a388260fd57fa50aa979ba10baebe
--- /dev/null
+++ b/src/java/DmWebPortal/web/templates/errorViewTemplate.xhtml
@@ -0,0 +1,106 @@
+<?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">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:ui="http://java.sun.com/jsf/facelets"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:f="http://java.sun.com/jsf/core"
+      xmlns:p="http://primefaces.org/ui">
+
+    <h:head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <h:outputStylesheet name="portal.css" library="css" />
+        <link rel="icon" type="image/png" href="../../resources/images/anl.ico" />
+        <title>Data Management System Portal<ui:insert name="pageTitle"></ui:insert></title>
+    </h:head>
+
+    <h:body>
+
+        <div id="contentContainer">
+            <div id="top" class="topContent">
+                <div id="topLeft" class="topLeftContent">
+                    <ui:insert name="topLeft">
+                        <h:graphicImage alt="ANL Logo" url="/resources/images/AnlLogo167x75.png"/>
+                    </ui:insert>
+                </div>
+                <div>
+                    <div id="topRight" class="topRightContent">
+                        <ui:insert name="topRight">
+                            <h:outputText value="Username: #{loginController.displayUsername()}"/>
+                            <br/>
+
+                            <h:outputText value="Role: #{loginController.displayRole()}"/>
+
+                        </ui:insert>
+                    </div>
+                    <div id="topCenter" class="topCenterContent">
+                        <ui:insert name="topCenter">
+                            <h1 class="title">Data Management System Portal</h1>
+                        </ui:insert>
+                    </div>
+                </div>
+            </div>
+
+            <ui:fragment>
+                <div id="menu" class="menuContent">
+                    <div id="menuLeft" class="menuLeftContent">
+                        <ui:insert name="menuLeft">
+                            <p:menubar/>
+                        </ui:insert>
+                    </div>
+                    <div>
+                        <div id="menuRight" class="menuRightContent">
+                            <ui:insert name="menuRight">
+                            </ui:insert>
+                        </div>
+                        <div id="menuCenter" class="menuCenterContent">
+                            <ui:insert name="menuCenter">
+                                <h:form prependId="false">
+                                    <ui:include src="/templates/menubarTemplate.xhtml"/>
+                                </h:form>
+                            </ui:insert>
+                        </div>
+                    </div>
+                </div>
+
+                <div id="middle" class="middleContent">
+                    <div id="middleLeft" class="middleLeftContent">
+                        <ui:insert name="middleLeft">
+                        </ui:insert>
+                    </div>
+                    <div>
+                        <div id="middleRight" class="middleRightContent">
+                            <ui:insert name="middleRight">
+                            </ui:insert>
+                        </div>
+                        <div id="middleCenter" class="middleCenterContent">
+                            <ui:insert name="middleCenter">
+                            </ui:insert>
+                            <div class="actionButton">
+                                <p:button id="okButton" href="/views/home.xhtml" alt="OK" value="OK"/>
+                                <p:tooltip for="okButton" value="Return to home page"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </ui:fragment>
+        </div>
+
+
+
+        <h:form id="loginForm">
+            <p:dialog id="loginDialog" styleClass="dialog" header="Login" widgetVar="loginDialogWidget">
+                <h:panelGrid styleClass="loginInput">
+                    <p:inputText id="username" value="#{loginController.username}" title="Username"/>
+                    <p:watermark for="username" value="Username"/>
+                    <p:password id="password" value="#{loginController.password}" title="Password"/>
+                    <p:watermark for="password" value="Password"/>
+
+                    <f:facet name="footer">
+                        <p:commandButton id="loginButton" value="Login" action="#{loginController.login}" oncomplete="PF('loginDialogWidget').hide()"/>
+                    </f:facet>
+                </h:panelGrid>
+            </p:dialog>
+        </h:form>
+    </h:body>
+
+</html>
diff --git a/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml b/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..cfe50a34718b2d05afb5a315c8c835392c850dbc
--- /dev/null
+++ b/src/java/DmWebPortal/web/templates/menubarTemplate.xhtml
@@ -0,0 +1,16 @@
+<?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">
+
+    <p:menubar>
+        <p:menuitem value="Home" url="/views/home.xhtml" icon="ui-icon-home"/>
+        <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="Users" url="/views/userInfo/list.xhtml"/>
+        <p:menuitem value="Logout" action="#{loginController.logout()}" icon="ui-icon-close"/>
+    </p:menubar>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml b/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..3c3cc596ce6f021dd386c9a34a7f50aa0fa0eb04
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml
@@ -0,0 +1,25 @@
+<?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"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
+
+    <ui:param name="entityTypeName" value="#{entityController.entityTypeName}"/>
+
+    <div class="actionButton">
+        <p:commandButton id="#{entityTypeName}AddButton" action="#{entityController.prepareCreate()}" rendered="#{loginController.admin}" value="Add" alt="Add new #{entityTypeName}" icon="ui-icon-plus">
+            <p:tooltip for="#{entityTypeName}AddButton" value="Create new #{entityController.displayEntityTypeName}."/>
+        </p:commandButton>
+        
+        <p:commandButton id="#{entityTypeName}ResetFiltersButton" action="#{entityController.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight">
+            <p:tooltip for="#{entityTypeName}ResetFiltersButton" value="Reset list filters."/>
+        </p:commandButton>
+
+        <p:commandButton id="#{entityTypeName}NoOp" style="visibility:hidden" value="NoOp"/>
+        <p:defaultCommand target="#{entityTypeName}NoOp"/>
+    </div>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/error/accessDenied.xhtml b/src/java/DmWebPortal/web/views/error/accessDenied.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..75edc4fc9440ffb9b5da890fe4c45f3ddebb7715
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/error/accessDenied.xhtml
@@ -0,0 +1,13 @@
+<?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"
+                template="../../templates/errorViewTemplate.xhtml">
+    <ui:define name="pageTitle">: Access Denied</ui:define>        
+    <ui:define name="middleCenter">
+        <div class="userNotification">
+            <h3>Error: Access Denied</h3>
+        </div>
+    </ui:define>
+</ui:composition>
+
diff --git a/src/java/DmWebPortal/web/views/error/invalidRequest.xhtml b/src/java/DmWebPortal/web/views/error/invalidRequest.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..f205054f076c3e046aa67410c7ff768a992afbaf
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/error/invalidRequest.xhtml
@@ -0,0 +1,13 @@
+<?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"
+                template="../../templates/errorViewTemplate.xhtml">
+    <ui:define name="pageTitle">: Invalid Request</ui:define>        
+    <ui:define name="middleCenter">
+        <div class="userNotification">
+            <h3>Invalid Request: #{errorBean.error}</h3>
+        </div>
+    </ui:define>
+</ui:composition>
+
diff --git a/src/java/DmWebPortal/web/views/error/pageNotFound.xhtml b/src/java/DmWebPortal/web/views/error/pageNotFound.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..48f0438bb2ea72c6ddd6e47c5d68a05725c41f77
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/error/pageNotFound.xhtml
@@ -0,0 +1,13 @@
+<?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"
+                template="../../templates/errorViewTemplate.xhtml">
+    <ui:define name="pageTitle">: Page Not Found</ui:define>        
+    <ui:define name="middleCenter">
+        <div class="userNotification">
+            <h3>Error: Page Not Found</h3>
+        </div>
+    </ui:define>
+</ui:composition>
+
diff --git a/src/java/DmWebPortal/web/views/experiment/create.xhtml b/src/java/DmWebPortal/web/views/experiment/create.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..047613c244a149d7e4fec0779913994879167fed
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/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>Experiment Create</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Add Experiment</h1>
+            </div>
+
+            <h:form id="addExperimentForm">
+
+                <ui:include src="private/experimentCreatePanelGrid.xhtml"/>
+
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton action="#{experimentController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton action="#{experimentController.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/experiment/edit.xhtml b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..f8516edf751a42ca2fb6e4d23aa700fbaa00fa0d
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/edit.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">
+
+    <title>Experiment Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml" >
+        <ui:define name="middleCenter" >
+            <h:form id="editExperimentForm">
+
+                <div class="pageTitle">
+                    <h1>Edit Experiment #{experimentController.current.name}</h1>
+                </div>
+
+                <p:accordionPanel multiple="true" dynamic="true" cache="false" activeIndex="0,1,2"  >
+                    <p:tab title="Experiment Properties" id="detailsTab" >
+
+                        <div class="middleCenterLeftContent">
+                            <ui:include src="private/experimentEditPanelGrid.xhtml"/>
+                        </div>
+                    </p:tab>
+
+                </p:accordionPanel>
+
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton  action="#{experimentController.update()}" actionListener="#{experimentController.updateRemovedExperimentRoles()}" value="Save" alt="Save" icon="ui-icon-check"/>
+                    <p:commandButton action="#{experimentController.prepareList()}" immediate="true" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                </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="#{!experimentController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/list.xhtml b/src/java/DmWebPortal/web/views/experiment/list.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..bed56d3d56fd2452d0893e7fe3ac971f3a21708b
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/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>Experiments List</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Experiments</h1>
+            </div>
+
+            <h:form id="viewExperimentListForm">
+                <ui:param name="entityController" value="#{experimentController}"/>
+                <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+                <h:panelGroup>  
+                    <ui:include src="private/experimentListDataTable.xhtml"/>
+                </h:panelGroup>
+
+                <ui:include src="private/experimentDestroyDialog.xhtml"/>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="experiment/loadFilters.js"/>
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..d4a4bf1e31bb3374e1019cf8dfb6f64921f6c337
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentCreatePanelGrid.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:f="http://java.sun.com/jsf/core"        
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <ui:param name="experimentObject" value="#{experimentController.selected}"/>
+    
+    <p:panelGrid columns="2" >
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="name" value="#{experimentObject.name}" title="Name" styleClass="entityDataEmphasizedInputText"/>
+
+        <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="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.getAvailableItems()}" 
+                           var="experimentStation"
+                           itemValue="#{experimentStation}"
+                           itemLabel="#{experimentStation.name}"
+                           itemDescription="#{experimentStation.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="startDate" value="Start Date"/>
+        <p:calendar id="startDate" value="#{experimentObject.startDate}" mode="popup" showOn="button" pattern="#{resources.DateTimePattern}" />
+        
+        <h:outputLabel for="endDate" value="End Date" />
+        <p:calendar id="endDate" value="#{experimentObject.endDate}" mode="popup" showOn="button" pattern="#{resources.DateTimePattern}" />
+        
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentDestroyDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..643b556a9b1d6676fd0aa733683bc2f8de2fbea7
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentDestroyDialog.xhtml
@@ -0,0 +1,14 @@
+<?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="experimentDestroyDialog" message="Delete experiment #{experimentController.getCurrentEntityInstanceName()}?"
+                     header="Delete Experiment" severity="alert" widgetVar="experimentDestroyDialogWidget"
+                     styleClass="dialog">
+        <p:commandButton value="Yes" oncomplete="experimentDestroyDialogWidget.hide()" action="#{experimentController.destroy()}"/>
+        <p:commandButton value="No" onclick="PF('experimentDestroyDialogWidget').hide()" type="button" />
+    </p:confirmDialog>  
+</ui:composition>
+
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..0048fa4ca9ddfe8f36b5cb4ab57a97e15fafecd0
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentEditPanelGrid.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:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:f="http://xmlns.jcp.org/jsf/core">
+
+    <ui:param name="experimentObject" value="#{experimentController.current}"/>
+
+    <p:panelGrid columns="2" > 
+
+        <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="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentObject.description}" title="Description" 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}" />
+        
+        <h:outputLabel for="endDate" value="End Date" styleClass="entityDataLabel"/>
+        <p:calendar id="endDate" value="#{experimentObject.endDate}" mode="popup" showOn="button" pattern="#{resources.DateTimePattern}" />
+
+    </p:panelGrid>
+
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentListDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentListDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..037fe0478909249f45aef2765a17b470b68fab09
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentListDataTable.xhtml
@@ -0,0 +1,76 @@
+<?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"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
+
+    <p:dataTable id="experimentListDataTable"                              
+                 var="experimentObject" 
+                 value="#{experimentController.listDataModel}" 
+                 filteredValue="#{experimentController.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="#{experimentController.displayNumberOfItemsPerPage}"
+                 widgetVar="experimentListWidget" 
+                 emptyMessage="No experiments found.">
+
+        <p:column sortBy="#{experimentObject.id}" headerText="Id" >
+            <h:outputText value="#{experimentObject.id}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.name}" headerText="Name" 
+                  filterBy="#{experimentObject.name}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentObject.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.experimentType.name}" headerText="Type" 
+                  filterBy="#{experimentObject.experimentType.name}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentObject.experimentType.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.experimentStation.name}" headerText="Station" 
+                  filterBy="#{experimentObject.experimentStation.name}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentObject.experimentStation.name}"/>
+        </p:column>
+        
+        <p:column sortBy="#{experimentObject.description}" headerText="Description" 
+                  filterBy="#{experimentObject.description}" filterMatchMode="contains">
+            <h:outputText value="#{experimentObject.description}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.startDate}" headerText="Start Date" 
+                  filterBy="#{experimentObject.startDate}" filterMatchMode="contains" >
+
+            <h:outputText value="#{experimentObject.startDate}">
+                          <f:convertDateTime pattern="#{resources.DateTimeZonePattern}" type="both" timeZone="#{resources.Timezone}"/>
+            </h:outputText>
+        </p:column>
+        
+        <p:column sortBy="#{experimentObject.endDate}" headerText="End Date" 
+                  filterBy="#{experimentObject.endDate}" filterMatchMode="contains" >
+
+            <h:outputText value="#{experimentObject.endDate}">
+                <f:convertDateTime pattern="#{resources.DateTimeZonePattern}" type="both" timeZone="#{resources.Timezone}"/>
+            </h:outputText>
+        </p:column>
+
+        <p:column headerText="Actions" >
+            <div class="actionLink">
+                <p:commandLink action="#{experimentController.prepareView(experimentObject)}" styleClass="ui-icon ui-icon-info" title="View">
+                </p:commandLink>
+    
+                <p:commandLink action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit">
+                    <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
+                </p:commandLink>
+
+                <p:commandLink oncomplete="PF('experimentDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                    <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
+                </p:commandLink>
+            </div>
+        </p:column>
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..bc35404c9f67d0c06aa5e3d23521aed39a98226a
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/private/experimentViewPanelGrid.xhtml
@@ -0,0 +1,39 @@
+<?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"
+                xmlns:f="http://xmlns.jcp.org/jsf/core">
+
+    <ui:param name="experimentObject" value="#{experimentController.current}"/>
+
+    <p:panelGrid columns="2" styleClass="viewEntityDetails">
+
+        <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="description" value="Description" styleClass="entityDataLabel"/>
+        <h:outputText id="description" value="#{experimentObject.description}" title="Description" 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}" />
+        </h:outputText>
+        
+        <h:outputLabel for="endDate" value="End Date" styleClass="entityDataLabel"/>
+        <h:outputText  id="endDate" value="#{experimentObject.endDate}" styleClass="entityDataText">
+            <f:convertDateTime pattern="#{resources.DateTimeZonePattern}" type="both" timeZone="#{resources.Timezone}" />
+        </h:outputText>
+       
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/view.xhtml b/src/java/DmWebPortal/web/views/experiment/view.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..a6ee84774ddd49d1192e7584ec4645e66b25a2ff
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/view.xhtml
@@ -0,0 +1,46 @@
+<?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>Experiment View</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="viewExperimentForm">
+                <div class="pageTitle">
+                    <h1>Experiment #{experimentController.current.name}</h1>
+                </div>
+
+                <ui:param name="experimentObject" value="#{experimentController.current}"/>
+                <p:accordionPanel multiple="true" activeIndex="0,1,2" >
+                    <p:tab title="Experiment Properties">
+                        <div class="middleCenterLeftContent">
+                            <ui:include src="private/experimentViewPanelGrid.xhtml"/>
+                        </div>
+                    </p:tab>
+
+                </p:accordionPanel>
+
+                <p/>
+
+                <div class="actionButton">
+                    <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.admin or experimentController.canEditExperiment(experimentObject)}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                    <p:commandButton action="#{experimentController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                </div>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="common/forwardHome.js" rendered="#{!experimentController.entitySelected}"/>    
+
+        </ui:define>
+
+    </ui:composition>
+</ui:composition>
+
+
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/create.xhtml b/src/java/DmWebPortal/web/views/experimentStation/create.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..9dab273fa239d2f4d55800a2299a89bb8a6b8488
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/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>Experiment Station Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Add Experiment Station</h1>
+            </div>
+
+            <h:form id="addExperimentStationForm">
+
+                <ui:include src="private/experimentStationCreatePanelGrid.xhtml"/>
+
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton action="#{experimentStationController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton action="#{experimentStationController.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/experimentStation/edit.xhtml b/src/java/DmWebPortal/web/views/experimentStation/edit.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..cd6f0162551206b9f8a68ae25911f22f4209dc8e
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/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>Experiment Station Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="editExperimentStationForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Edit Experiment Station</h1>
+                    </div>
+
+                    <ui:include src="private/experimentStationEditPanelGrid.xhtml"/>
+                    <p/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{experimentStationController.update()}" value="Save" alt="Save" icon="ui-icon-check"/>
+                        <p:commandButton action="#{experimentStationController.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="#{!experimentStationController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/list.xhtml b/src/java/DmWebPortal/web/views/experimentStation/list.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..8ea2012d514956eb6c85b876d0620b0a0bca8e20
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/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>Experiment Stations List</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+    <ui:define name="middleCenter">
+        <div class="pageTitle">
+            <h1>Experiment Stations</h1>
+        </div>
+
+        <h:form id="viewExperimentStationListForm">
+            <ui:param name="entityController" value="#{experimentStationController}"/>
+            <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+            <h:panelGroup>  
+                <ui:include src="private/experimentStationListDataTable.xhtml"/>
+            </h:panelGroup>
+
+            <ui:include src="private/experimentStationDestroyDialog.xhtml"/>
+
+        </h:form>
+        <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+        <h:outputScript library="js" name="experimentStation/loadFilters.js"/>
+
+    </ui:define>
+    </ui:composition>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationCreatePanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..9d0dd59df2af55d96de4aa63a1dd13696c29985d
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationCreatePanelGrid.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="experimentStationObject" value="#{experimentStationController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="createEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="name" value="#{experimentStationObject.name}" title="Name" styleClass="entityDataEmphasizedInputText"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentStationObject.description}" title="Description" styleClass="entityDataInputText"/>        
+
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationDestroyDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..aba8d3e9d36054701904d43a7b31a781e7b7ae23
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationDestroyDialog.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="experimentStationDestroyDialog" message="Delete experiment type #{experimentStationController.getCurrentEntityInstanceName()}?"
+                     header="Delete Experiment Station" severity="alert" widgetVar="experimentStationDestroyDialogWidget"
+                     styleClass="dialog">
+        <p:commandButton value="Yes" oncomplete="experimentStationDestroyDialogWidget.hide()" action="#{experimentStationController.destroy()}"/>
+        <p:commandButton value="No" onclick="PF('experimentStationDestroyDialogWidget').hide()" type="button" />
+    </p:confirmDialog>  
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationEditPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..6bf7dee4483f06977cf098cbd90969ff0817b203
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationEditPanelGrid.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="experimentStationObject" value="#{experimentStationController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="editEntityDetails"> 
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{experimentStationObject.name}" title="Name" styleClass="entityDataEmphasizedText"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentStationObject.description}" title="Description" styleClass="entityDataInputText"/>     
+        
+    </p:panelGrid>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationListDataTable.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationListDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..d5eeaae4c3ed8ddba1e683efaca2b5e2f80b04a6
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationListDataTable.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="experimentStationListDataTable"                              
+                 var="experimentStationObject" 
+                 value="#{experimentStationController.listDataModel}" 
+                 filteredValue="#{experimentStationController.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="#{experimentStationController.displayNumberOfItemsPerPage}"
+                 widgetVar="experimentStationListWidget" 
+                 emptyMessage="No experiment types found.">
+
+        <p:column sortBy="#{experimentStationObject.id}" headerText="Id" >
+            <h:outputText value="#{experimentStationObject.id}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentStationObject.name}" headerText="Name" 
+                  filterBy="#{experimentStationObject.name}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentStationObject.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentStationObject.description}" headerText="Description" 
+                  filterBy="#{experimentStationObject.description}" filterMatchMode="contains">
+            <h:outputText value="#{experimentStationObject.description}"/>
+        </p:column>
+        
+        <p:column headerText="Actions" >
+            <div class="actionLink">
+                <p:commandLink action="#{experimentStationController.prepareView(experimentStationObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
+                <p:commandLink action="#{experimentStationController.prepareEdit(experimentStationObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('experimentStationDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                    <f:setPropertyActionListener value="#{experimentStationObject}" target="#{experimentStationController.current}"/>
+                </p:commandLink>
+            </div>
+        </p:column>
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationViewPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..a125303855191952ae334aec28161f09fa4ef305
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/private/experimentStationViewPanelGrid.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="experimentStationObject" value="#{experimentStationController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="viewEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{experimentStationObject.name}" title="Name" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:outputText id="description" value="#{experimentStationObject.description}" title="Description" styleClass="entityDataText"/>
+
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentStation/view.xhtml b/src/java/DmWebPortal/web/views/experimentStation/view.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..27a16428809cb50fbd437eebc4d7931d4fef4908
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentStation/view.xhtml
@@ -0,0 +1,45 @@
+<?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>Experiment Station View</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="viewExperimentStationForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Experiment Station Details</h1>
+                    </div>
+
+                    <ui:include src="private/experimentStationViewPanelGrid.xhtml"/>
+
+                    <p/>
+                    <ui:param name="experimentStationObject" value="#{experimentStationController.selected}"/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{experimentStationController.prepareEdit(experimentStationObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                        <p:commandButton onclick="PF('experimentStationDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                            <f:setPropertyActionListener value="#{experimentStationObject}" target="#{experimentStationController.current}"/>
+                        </p:commandButton>  
+                        <p:commandButton action="#{experimentStationController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                    </div>
+
+                    <ui:include src="private/experimentStationDestroyDialog.xhtml"/>
+
+                </div>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="common/forwardHome.js" rendered="#{!experimentStationController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentType/create.xhtml b/src/java/DmWebPortal/web/views/experimentType/create.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..2cecb416e3b8e6b862e7bcf34b02c8773394fbce
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/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>Experiment Type Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Add Experiment Type</h1>
+            </div>
+
+            <h:form id="addExperimentTypeForm">
+
+                <ui:include src="private/experimentTypeCreatePanelGrid.xhtml"/>
+
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton action="#{experimentTypeController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton action="#{experimentTypeController.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/experimentType/edit.xhtml b/src/java/DmWebPortal/web/views/experimentType/edit.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..53405a0fde716695efaccc99972c2ad4ac13afed
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/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>Experiment Type Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="editExperimentTypeForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Edit Experiment Type</h1>
+                    </div>
+
+                    <ui:include src="private/experimentTypeEditPanelGrid.xhtml"/>
+                    <p/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{experimentTypeController.update()}" value="Save" alt="Save" icon="ui-icon-check"/>
+                        <p:commandButton action="#{experimentTypeController.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="#{!experimentTypeController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentType/list.xhtml b/src/java/DmWebPortal/web/views/experimentType/list.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..cabc2d389262727f4c5ba853ca7df4f5f482b80a
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/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>Experiment Types List</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+    <ui:define name="middleCenter">
+        <div class="pageTitle">
+            <h1>Experiment Types</h1>
+        </div>
+
+        <h:form id="viewExperimentTypeListForm">
+            <ui:param name="entityController" value="#{experimentTypeController}"/>
+            <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+            <h:panelGroup>  
+                <ui:include src="private/experimentTypeListDataTable.xhtml"/>
+            </h:panelGroup>
+
+            <ui:include src="private/experimentTypeDestroyDialog.xhtml"/>
+
+        </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="experimentType/loadFilters.js"/>
+
+    </ui:define>
+    </ui:composition>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeCreatePanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..02feac7fcfad3a622c0e8abcc8392f3ca67d2605
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeCreatePanelGrid.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="experimentTypeObject" value="#{experimentTypeController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="createEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="name" value="#{experimentTypeObject.name}" title="Name" styleClass="entityDataEmphasizedInputText"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentTypeObject.description}" title="Description" styleClass="entityDataInputText"/>        
+
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeDestroyDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..11cd4b8f8d02243150ad3f2b6133c8b57f9eefff
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeDestroyDialog.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="experimentTypeDestroyDialog" message="Delete experiment type #{experimentTypeController.getCurrentEntityInstanceName()}?"
+                     header="Delete Experiment Type" severity="alert" widgetVar="experimentTypeDestroyDialogWidget"
+                     styleClass="dialog">
+        <p:commandButton value="Yes" oncomplete="experimentTypeDestroyDialogWidget.hide()" action="#{experimentTypeController.destroy()}"/>
+        <p:commandButton value="No" onclick="PF('experimentTypeDestroyDialogWidget').hide()" type="button" />
+    </p:confirmDialog>  
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeEditPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..58e26f770888f63be974040a644b0fc51a97ce3c
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeEditPanelGrid.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="experimentTypeObject" value="#{experimentTypeController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="editEntityDetails"> 
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{experimentTypeObject.name}" title="Name" styleClass="entityDataEmphasizedText"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentTypeObject.description}" title="Description" styleClass="entityDataInputText"/>     
+        
+    </p:panelGrid>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeListDataTable.xhtml b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeListDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..dc9743916e68bfec42e92609ef701c21c62ddbe7
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeListDataTable.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="experimentTypeListDataTable"                              
+                 var="experimentTypeObject" 
+                 value="#{experimentTypeController.listDataModel}" 
+                 filteredValue="#{experimentTypeController.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="#{experimentTypeController.displayNumberOfItemsPerPage}"
+                 widgetVar="experimentTypeListWidget" 
+                 emptyMessage="No experiment types found.">
+
+        <p:column sortBy="#{experimentTypeObject.id}" headerText="Id" >
+            <h:outputText value="#{experimentTypeObject.id}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentTypeObject.name}" headerText="Name" 
+                  filterBy="#{experimentTypeObject.name}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentTypeObject.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentTypeObject.description}" headerText="Description" 
+                  filterBy="#{experimentTypeObject.description}" filterMatchMode="contains">
+            <h:outputText value="#{experimentTypeObject.description}"/>
+        </p:column>
+        
+        <p:column headerText="Actions" >
+            <div class="actionLink">
+                <p:commandLink action="#{experimentTypeController.prepareView(experimentTypeObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
+                <p:commandLink action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('experimentTypeDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                    <f:setPropertyActionListener value="#{experimentTypeObject}" target="#{experimentTypeController.current}"/>
+                </p:commandLink>
+            </div>
+        </p:column>
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeViewPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..c8a61f6c345ea0ba18e57d2a38382ee4fcaee5ce
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/private/experimentTypeViewPanelGrid.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="experimentTypeObject" value="#{experimentTypeController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="viewEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{experimentTypeObject.name}" title="Name" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:outputText id="description" value="#{experimentTypeObject.description}" title="Description" styleClass="entityDataText"/>
+
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experimentType/view.xhtml b/src/java/DmWebPortal/web/views/experimentType/view.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..cf9db4d30be87b4cf1a4a4a93209b62506c42ee8
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experimentType/view.xhtml
@@ -0,0 +1,45 @@
+<?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>Experiment Type View</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="viewExperimentTypeForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Experiment Type Details</h1>
+                    </div>
+
+                    <ui:include src="private/experimentTypeViewPanelGrid.xhtml"/>
+
+                    <p/>
+                    <ui:param name="experimentTypeObject" value="#{experimentTypeController.selected}"/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                        <p:commandButton onclick="PF('experimentTypeDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                            <f:setPropertyActionListener value="#{experimentTypeObject}" target="#{experimentTypeController.current}"/>
+                        </p:commandButton>  
+                        <p:commandButton action="#{experimentTypeController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                    </div>
+
+                    <ui:include src="private/experimentTypeDestroyDialog.xhtml"/>
+
+                </div>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="common/forwardHome.js" rendered="#{!experimentTypeController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/home.xhtml b/src/java/DmWebPortal/web/views/home.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..8e68d74b0ea4107f90ac154a88e9322e4dc54f26
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/home.xhtml
@@ -0,0 +1,56 @@
+<!--<?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"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
+
+
+    <title>Data Management System Portal Home</title>
+
+    <h:outputScript library="js/common" name="forwardFromHome.js" rendered="#{!loginController.loggedIn}" />
+
+    <ui:composition template="../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+
+            <div class="homePage">
+
+                <div class="pageTitle">
+                    <h1>Data Management Portal Home</h1>
+                </div>
+
+                <div class="sectionText"> 
+                    Welcome to the Advanced Photon Source’s prototype data management portal. Registered users can view and set access permissions for their experiment data using this system.
+                    <p/>
+                </div>
+
+                <div class="sectionTitle">
+                    <h2>System At A Glance</h2>
+                </div>    
+
+                <h:form id="systemSummaryForm">
+                    <p:growl id="messages" showDetail="true" autoUpdate="true"/>
+                    <p:panelGrid columns="2">
+                        <h:outputLabel for="nRegisteredUsers" value="Number of Registered Users" styleClass="entityDataLabel"/>
+                        <h:outputText id="nRegisteredUsers" value="#{userInfoController.items.getRowCount()}" title="Number of Registered Users" styleClass="entityDataText"/>
+
+                        <h:outputLabel for="nExperiments" value="Number of Experiments" styleClass="entityDataLabel"/>
+                        <h:outputText id="nExperiments" value="#{experimentController.items.getRowCount()}" title="Number of Experiments" styleClass="entityDataText"/>
+
+                        <h:outputLabel for="nExperimentStations" value="Number of Experiment Stations" styleClass="entityDataLabel"/>
+                        <h:outputText id="nExperimentStations" value="#{experimentStationController.items.getRowCount()}" title="Number of Experiment Stations" styleClass="entityDataText"/>
+                        
+                    </p:panelGrid>
+                </h:form>
+                <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            </div>
+
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/login.xhtml b/src/java/DmWebPortal/web/views/login.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..82f994e16cbbc27f167e6b5a2b79b6d7b22ed4f0
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/login.xhtml
@@ -0,0 +1,67 @@
+<?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">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:ui="http://java.sun.com/jsf/facelets"
+      xmlns:p="http://primefaces.org/ui"
+      xmlns:h="http://java.sun.com/jsf/html">
+
+    <h:head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link href="../resources/css/login.css" rel="stylesheet" type="text/css" />
+        <title>Data Management System Login</title>
+
+    </h:head>
+
+    <h:body>
+        <div id="top" class="topContent">
+            <div id="topLeft" class="topLeftContent">
+                <ui:insert name="topLeft">
+                    <h:graphicImage alt="ANL Logo" url="../resources/images/AnlLogo167x75.png"/>
+                </ui:insert>
+            </div>
+            <div>
+                <div id="topRight" class="topRightContent">
+                    <ui:insert name="topRight"/>
+                </div>
+                <div id="topCenter" class="topCenterContent">
+                    <ui:insert name="topCenter">
+                        <h1>Data Management System Portal</h1>
+                    </ui:insert>
+                </div>
+            </div>
+        </div>
+
+        <div id="middle" class="middleContent">
+            <div id="middleLeft" class="middleLeftContent">
+                <h:form id="loginForm">
+                    <div class="login">
+                        <div>
+                            <p:inputText id="username" value="#{loginController.username}" title="Username"/>
+                            <p:watermark for="username" value="Username"/>
+                        </div>
+                        <p/>
+                        <div>
+                            <p:password id="password" value="#{loginController.password}" title="Password"/>
+                            <p:watermark for="password" value="Password"/>
+                        </div>
+                        <p/>
+                        <div>
+                            <p:commandButton value="Login" action="#{loginController.login()}" />
+                        </div>
+                    </div>
+                </h:form>
+            </div>
+
+            <div id="middleRight" class="middleRightContent" >
+                <p:messages id="messages" escape="false" showDetail="true" autoUpdate="true" closable="false" showIcon="false" />
+            </div>
+        </div>
+
+        <div id="bottom" class="sectionText"> 
+            <p>
+                Welcome to the Advanced Photon Source’s prototype data management portal. Registered users can view and set access permissions for their experiment data using this system.
+            </p>
+        </div>
+    </h:body>
+
+</html>
diff --git a/src/java/DmWebPortal/web/views/loginHelp.xhtml b/src/java/DmWebPortal/web/views/loginHelp.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..2b297a8d8ce8e95900f36abf129e3938392e428a
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/loginHelp.xhtml
@@ -0,0 +1,73 @@
+<!--<?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">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:ui="http://java.sun.com/jsf/facelets"
+      xmlns:h="http://java.sun.com/jsf/html">
+
+    <h:head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link href="../resources/css/login.css" rel="stylesheet" type="text/css" />
+        <title>Data Management System Login Help</title>
+
+    </h:head>
+
+    <h:body>
+        <div id="top" class="topContent">
+            <div id="topLeft" class="topLeftContent">
+                <ui:insert name="topLeft">
+                    <h:graphicImage alt="ANL Logo" url="../resources/images/AnlLogo167x75.png"/>
+                </ui:insert>
+            </div>
+            <div>
+                <div id="topRight" class="topRightContent">
+                    <ui:insert name="topRight"/>
+                </div>
+                <div id="topCenter" class="topCenterContent">
+                    <ui:insert name="topCenter">
+                        <h1>Data Management System Portal</h1>
+                    </ui:insert>
+                </div>
+            </div>
+        </div>
+
+        <div id="middle" class="middleContent">
+            <p/>
+            <div class="pageTitle">
+                <h2>Data Management Portal Login Help</h2>
+            </div> 
+        </div>
+
+        <div id="bottom" class="sectionText"> 
+            Login Help
+            <p/>
+
+            SharePoint
+            <p/>
+            Are you remembering to enter your username like this: anl\username? The "anl\" prefix is required.
+
+            <p/>
+
+            Internet Explorer
+            <p/>
+            If your Argonne account has been renamed (that is, your username has been changed), and you are using Internet Explorer as your browser, you may need to delete an existing, outdated security certificate as follows:
+            <p/>
+            In Internet Explorer, go to Tools -> Internet Options -> Content -> Certificates -> Personal.
+            <p/>
+            Select the certificate with the old username (issued by ANLIssuingCAv010) and click the "Remove" button.
+            <p/>
+            Clear the browser cache, close all browser windows, and restart the browser.
+            <p/>
+            Firefox
+            <p/>
+            In Firefox, clear the browser cache and cookies, close all browser windows, and restart the browser.
+
+            <p/>
+            Password Problems
+            <p/>
+            Passwords can be changed and reset, and accounts can be unlocked via a set of self-service tools available online.
+
+        </div>
+    </h:body>
+
+</html>
diff --git a/src/java/DmWebPortal/web/views/userInfo/create.xhtml b/src/java/DmWebPortal/web/views/userInfo/create.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..fbfd969a8dd04df15e4e5e05fe7ac74175c3548f
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/create.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:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <title>User Create</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Add User</h1>
+            </div>
+
+            <h:form id="addUserInfoForm">
+
+                <ui:include src="private/userInfoCreatePanelGrid.xhtml"/>
+
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton action="#{userInfoController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton action="#{userInfoController.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/userInfo/edit.xhtml b/src/java/DmWebPortal/web/views/userInfo/edit.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..9b2a8c7442646bd38b7aba63afed656a8a323bec
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/edit.xhtml
@@ -0,0 +1,39 @@
+<?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>User Edit</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="editUserInfoForm">
+
+                <div class="middleCenterLeftContent">
+                    <div class="pageTitle">
+                        <h1>Edit User #{userInfoController.current.username}</h1>
+                    </div>
+
+                    <ui:include src="private/userInfoEditPanelGrid.xhtml"/>
+                    <p/>
+                    <div class="actionButton">
+                        <p:commandButton action="#{userInfoController.update()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                        <p:commandButton action="#{userInfoController.prepareList()}" immediate="true" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                    </div>
+                </div>
+                <div class="middleCenterRightContent">
+
+                </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="#{!userInfoController.entitySelected}"/>    
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/userInfo/list.xhtml b/src/java/DmWebPortal/web/views/userInfo/list.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..ea0285a2cee7427b8c3eee0e034ef1a327c93d05
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/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:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <title>Users List</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <div class="pageTitle">
+                <h1>Registered Users</h1>
+            </div>
+
+            <h:form id="viewUserInfoListForm">
+
+                <ui:param name="entityController" value="#{userInfoController}"/>
+                <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+                <h:panelGroup>  
+                    <ui:include src="private/userInfoListDataTable.xhtml"/>
+                </h:panelGroup>
+
+                <ui:include src="private/userInfoDestroyDialog.xhtml"/>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="userInfo/loadFilters.js"/>
+
+        </ui:define>
+    </ui:composition>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/userInfo/private/userInfoCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/userInfo/private/userInfoCreatePanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..54d501f7ceb06251eaa5ecb1e25b71f36948965f
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/private/userInfoCreatePanelGrid.xhtml
@@ -0,0 +1,43 @@
+<?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="userInfoObject" value="#{userInfoController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="createEntityDetails">
+
+        <h:outputLabel for="badge" value="Badge" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="badge" value="#{userInfoObject.badge}" title="Badge" styleClass="entityDataEmphasizedInputText"/>
+                     
+        <h:outputLabel for="username" value="Username" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="username" value="#{userInfoObject.username}" title="Username" styleClass="entityDataEmphasizedInputText"/>
+
+        <h:outputLabel for="lastName" value="Last Name" styleClass="entityDataLabel"/>
+        <h:inputText id="lastName" value="#{userInfoObject.lastName}" title="Last Name" styleClass="entityDataInputText"/>
+
+        <h:outputLabel for="firstName" value="First Name" styleClass="entityDataLabel"/>
+        <h:inputText id="firstName" value="#{userInfoObject.firstName}" title="First Name" styleClass="entityDataInputText"/> 
+
+        <h:outputLabel for="middleName" value="Middle Name" styleClass="entityDataLabel"/>
+        <h:inputText id="middleName" value="#{userInfoObject.middleName}" title="Middle Name" styleClass="entityDataInputText"/>
+
+        <h:outputLabel for="email" value="Email" styleClass="entityDataLabel"/>
+        <h:inputText id="email" value="#{userInfoObject.email}" title="Email" styleClass="entityDataInputText"/>
+
+        <h:outputLabel for="password" value="Password" styleClass="entityDataLabel"/>
+        <p:password id="password" value="#{userInfoController.passwordEntry}" title="Password" feedback="true" styleClass="entityDataInputText"/>
+        
+        <h:outputLabel for="globusUsername" value="Globus Username" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="globusUsername" value="#{userInfoObject.globusUsername}" title="Globus Username" styleClass="entityDataEmphasizedInputText"/>
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{userInfoObject.description}" title="Description" styleClass="entityDataInputText"/>        
+        
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/userInfo/private/userInfoDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/userInfo/private/userInfoDestroyDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..39998e9fe36edf2782714910cd9057bb7ce9c683
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/private/userInfoDestroyDialog.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="userInfoDestroyDialog" message="Delete user #{userInfoController.getCurrentEntityInstanceName()}?"
+                     header="Delete User" severity="alert" widgetVar="userInfoDestroyDialogWidget"
+                     styleClass="dialog">
+        <p:commandButton value="Yes" oncomplete="userInfoDestroyDialogWidget.hide()" action="#{userInfoController.destroy()}"/>
+        <p:commandButton value="No" onclick="PF('userInfoDestroyDialogWidget').hide()" type="button" />
+    </p:confirmDialog>  
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/userInfo/private/userInfoEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/userInfo/private/userInfoEditPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..830bc22849e03f497499092cc05ca219eceaef70
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/private/userInfoEditPanelGrid.xhtml
@@ -0,0 +1,48 @@
+<?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="userInfoObject" value="#{userInfoController.selected}"/>
+    <ui:param name="isFieldWriteable" value="#{loginController.loggedIn}"/>
+
+    <p:panelGrid columns="2" styleClass="editEntityDetails"> 
+
+
+        <h:outputLabel for="badge" value="Badge" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="badge" value="#{userInfoObject.badge}" title="Badge" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="username" value="Username" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="username" value="#{userInfoObject.username}" rendered="#{isFieldWriteable}" title="Username" styleClass="entityDataEmphasizedInputText"/>
+        <h:outputText id="usernameOutput" value="#{userInfoObject.username}" rendered="#{!isFieldWriteable}" title="Username" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="lastName" value="Last Name" styleClass="entityDataLabel"/>
+        <h:inputText id="lastName" value="#{userInfoObject.lastName}" rendered="#{isFieldWriteable}" title="Last Name" styleClass="entityDataInputText"/>
+        <h:outputText id="lastNameOutput" value="#{userInfoObject.lastName}" rendered="#{!isFieldWriteable}" title="Last Name" styleClass="entityDataText"/>
+
+        <h:outputLabel for="firstName" value="First Name" styleClass="entityDataLabel"/>
+        <h:inputText id="firstName" value="#{userInfoObject.firstName}" rendered="#{isFieldWriteable}" title="First Name" styleClass="entityDataInputText"/>
+        <h:outputText id="firstNameOutput" value="#{userInfoObject.firstName}" rendered="#{!isFieldWriteable}" title="First Name" styleClass="entityDataText"/> 
+
+        <h:outputLabel for="middleName" value="Middle Name" styleClass="entityDataLabel"/>
+        <h:inputText id="middleName" value="#{userInfoObject.middleName}" title="Middle Name" rendered="#{isFieldWriteable}" styleClass="entityDataInputText"/>
+        <h:outputText id="middleNameOutput" value="#{userInfoObject.middleName}" title="Middle Name" rendered="#{!isFieldWriteable}" styleClass="entityDataText"/>
+
+        <h:outputLabel for="email" value="Email" styleClass="entityDataLabel"/>
+        <h:inputText id="email" value="#{userInfoObject.email}" title="Email" styleClass="entityDataInputText"/>
+
+        <h:outputLabel for="password" value="Password" styleClass="entityDataLabel" rendered="#{userInfoObject.isLocalUser()}"/>
+        <p:password id="password" rendered="#{userInfoObject.isLocalUser()}" value="#{userInfoController.passwordEntry}" title="Password" feedback="true" styleClass="entityDataInputText"/>
+
+        <h:outputLabel for="globusUsername" value="Globus Username" styleClass="entityDataLabel"/>
+        <h:inputText id="globusUsername" value="#{userInfoObject.globusUsername}" title="Globus Username" styleClass="entityDataInputText"/>
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{userInfoObject.description}" title="Description" styleClass="entityDataInputText"/>     
+
+    </p:panelGrid>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/userInfo/private/userInfoListDataTable.xhtml b/src/java/DmWebPortal/web/views/userInfo/private/userInfoListDataTable.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..c3235db5ebfca81a79939f935dc15acdf2102145
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/private/userInfoListDataTable.xhtml
@@ -0,0 +1,80 @@
+<?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="userInfoListDataTable"                              
+                 var="userInfoObject" 
+                 value="#{userInfoController.listDataModel}" 
+                 filteredValue="#{userInfoController.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="#{userInfoController.displayNumberOfItemsPerPage}"
+                 widgetVar="userInfoListWidget" 
+                 emptyMessage="No users found.">
+
+        <p:ajax event="filter" listener="#{userInfoController.onFilterChange}"/>
+
+        <p:column sortBy="#{userInfoObject.id}" headerText="Id" >
+            <h:outputText value="#{userInfoObject.id}"/>
+        </p:column>
+
+        <p:column sortBy="#{userInfoObject.badge}" headerText="ANL Badge" 
+                  filterBy="#{userInfoObject.badge}" filterMatchMode="contains"
+                  filterValue="#{userInfoController.filterState('badge')}" >
+            <h:outputText value="#{userInfoObject.badge}"/>
+        </p:column>
+
+        <p:column sortBy="#{userInfoObject.username}" headerText="Username" 
+                  filterBy="#{userInfoObject.username}" filterMatchMode="contains" 
+                  filterValue="#{userInfoController.filterState('username')}" >
+            <h:outputText value="#{userInfoObject.username}"/>
+        </p:column>
+
+        <p:column sortBy="#{userInfoObject.lastName}" headerText="Last Name" 
+                  filterBy="#{userInfoObject.lastName}" filterMatchMode="contains" 
+                  filterValue="#{userInfoController.filterState('lastName')}" >
+            <h:outputText value="#{userInfoObject.lastName}"/>
+        </p:column>                  
+
+        <p:column sortBy="#{userInfoObject.firstName}" headerText="First, Middle Name" 
+                  filterBy="#{userInfoObject.firstName}" filterMatchMode="contains"
+                  filterValue="#{userInfoController.filterState('middleName')}" >
+            <h:outputText value="#{userInfoObject.firstName} #{userInfoObject.middleName}"/>
+        </p:column> 
+
+        <p:column sortBy="#{userInfoObject.email}" headerText="Email" 
+                  filterBy="#{userInfoObject.email}" filterMatchMode="contains" 
+                  filterValue="#{userInfoController.filterState('email')}" >
+            <h:outputText value="#{userInfoObject.email}"/>
+        </p:column>
+
+        <p:column sortBy="#{userInfoObject.globusUsername}" headerText="Globus Username" 
+                  filterBy="#{userInfoObject.globusUsername}" filterMatchMode="contains"
+                  filterValue="#{userInfoController.filterState('globusUsername')}" >
+            <h:outputText value="#{userInfoObject.globusUsername}"/>
+        </p:column>
+
+        <p:column sortBy="#{userInfoObject.description}" headerText="Description" 
+                  filterBy="#{userInfoObject.description}" filterMatchMode="contains"
+                  filterValue="#{userInfoController.filterState('description')}" >
+            <h:outputText value="#{userInfoObject.description}"/>
+        </p:column>
+
+        <p:column headerText="Actions" >
+            <div class="actionLink">
+                <p:commandLink action="#{userInfoController.prepareView(userInfoObject)}" styleClass="ui-icon ui-icon-info" title="View">
+                    <f:setPropertyActionListener value="#{userInfoObject}" target="#{userInfoController.current}"/>
+                </p:commandLink>
+                <p:commandLink action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('userInfoDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                    <f:setPropertyActionListener value="#{userInfoObject}" target="#{userInfoController.current}"/>
+                </p:commandLink>
+            </div>
+        </p:column>
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/userInfo/private/userInfoViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/userInfo/private/userInfoViewPanelGrid.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..8958a438ba1916d8ee44e4bb1798083e85ea5a5d
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/private/userInfoViewPanelGrid.xhtml
@@ -0,0 +1,39 @@
+<?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="userInfoObject" value="#{userInfoController.selected}"/>
+    <p:panelGrid columns="2" styleClass="viewEntityDetails">
+        
+        <h:outputLabel for="badge" value="Badge" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="badge" value="#{userInfoObject.badge}" title="Badge" styleClass="entityDataEmphasizedText"/>
+        
+        <h:outputLabel for="username" value="Username" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="username" value="#{userInfoObject.username}" title="Username" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="lastName" value="Last Name" styleClass="entityDataLabel"/>
+        <h:outputText id="lastName" value="#{userInfoObject.lastName}" title="Last Name" styleClass="entityDataText"/>
+
+        <h:outputLabel for="firstName" value="First Name" styleClass="entityDataLabel"/>
+        <h:outputText id="firstName" value="#{userInfoObject.firstName}" title="First Name" styleClass="entityDataText"/>
+
+        <h:outputLabel for="middleName" value="Middle Name" styleClass="entityDataLabel"/>
+        <h:outputText id="middleName" value="#{userInfoObject.middleName}" title="Middle Name" styleClass="entityDataText"/>
+
+        <h:outputLabel for="email" value="Email" styleClass="entityDataLabel"/>
+        <h:outputText id="email" value="#{userInfoObject.email}" title="Email" styleClass="entityDataText"/>
+        
+        <h:outputLabel for="globusUsername" value="Globus Username" styleClass="entityDataLabel"/>
+        <h:outputText id="globusUsername" value="#{userInfoObject.globusUsername}" title="Globus Username" styleClass="entityDataText"/>
+        
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:outputText id="description" value="#{userInfoObject.description}" title="Description" styleClass="entityDataText"/>
+        
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/userInfo/view.xhtml b/src/java/DmWebPortal/web/views/userInfo/view.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..ef2234ea0d6deb54d2a79ea9f137c49c1c71cddb
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/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">
+
+    <title>User View</title>
+
+    <ui:composition template="../../templates/dmViewTemplate.xhtml">
+        <ui:define name="middleCenter">
+            <h:form id="viewUserInfoForm" rendered="#{userInfoController.entitySelected}">
+                <div class="pageTitle">
+                    <h1>User #{userInfoController.current.username}</h1>
+                </div>
+
+                <ui:param name="userInfoObject" value="#{userInfoController.current}"/>
+                <p:accordionPanel multiple="true" activeIndex="0,1" >
+                    <p:tab title="User Properties">
+                        <div class="middleCenterLeftContent">
+                            <ui:include src="private/userInfoViewPanelGrid.xhtml"/>
+                        </div>
+                    </p:tab>
+
+                </p:accordionPanel>
+
+                <p/>
+
+                <div class="actionButton">
+                    <p:commandButton action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                    <p:commandButton onclick="PF('userInfoDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                        <f:setPropertyActionListener value="#{userInfoObject}" target="#{userInfoController.current}"/>
+                    </p:commandButton>  
+                    <p:commandButton action="#{userInfoController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
+                </div>
+
+                <ui:include src="private/userInfoDestroyDialog.xhtml"/>
+
+            </h:form>
+            <h:outputScript library="js" name="common/forwardNotLoggedIn.js" rendered="#{!loginController.loggedIn}"/>    
+            <h:outputScript library="js" name="common/forwardHome.js" rendered="#{!userInfoController.entitySelected}"/>    
+
+        </ui:define>
+
+    </ui:composition>
+</ui:composition>
+
+