Index: lib/metacat.properties
===================================================================
--- lib/metacat.properties	(revision 6986)
+++ lib/metacat.properties	(revision 6987)
@@ -497,16 +497,16 @@
 ############# DataONE Section #######################################
 D1Client.CN_URL=https://cn-dev.dataone.org/cn
 # Configure the Member Node client certificate location
-D1Client.certificate.file=/etc/dataone/client/certs/METACAT1.pem
+D1Client.certificate.file=/var/metacat/certs/METACAT1.pem
 # Member Node configuration
-dataone.memberNodeId=METACAT1
+dataone.memberNodeId=
 dataone.subject=CN=METACAT1, DC=dataone, DC=org
 dataone.contactSubject=CN=METACAT1, DC=dataone, DC=org
 dataone.nodeName=My Metacat Node
 dataone.nodeType=mn
-dataone.nodeDescription=A DataONE member node implemented in Metacat.
-dataone.nodeSynchronize=true
-dataone.nodeReplicate=true
+dataone.nodeDescription=Describe your Member Node briefly.
+dataone.nodeSynchronize=false
+dataone.nodeReplicate=false
 dataone.serviceName=d1
 
 # the synchronization schedule
@@ -518,6 +518,11 @@
 dataone.nodeSynchronization.schedule.min=0/3
 dataone.nodeSynchronization.schedule.sec=10
 
+# The default replication policy
+dataone.replicationpolicy.default.numreplicas=2
+dataone.replicationpolicy.default.preferredNodeList=
+dataone.replicationpolicy.default.blockedNodeList=
+
 # state which versions of each MN tier service are availalble
 dataone.mnCore.serviceAvailable=true
 dataone.mnCore.serviceVersion=v1
@@ -551,7 +556,7 @@
 
 ############# Global Identifiers Assignment Section ######################
 guid.assignGUIDs=false
-guid.ezid.username=apitest
-guid.ezid.password=apitest
-guid.ezid.doishoulder.1=doi:10.5072/FK2/KNB/
-guid.ezid.doishoulder.2=doi:10.5072/FK2/ESA/
+#guid.ezid.username=apitest
+#guid.ezid.password=apitest
+#guid.ezid.doishoulder.1=doi:10.5072/FK2/KNB/
+#guid.ezid.doishoulder.2=doi:10.5072/FK2/ESA/
Index: lib/admin/dataone-configuration.jsp
===================================================================
--- lib/admin/dataone-configuration.jsp	(revision 6986)
+++ lib/admin/dataone-configuration.jsp	(revision 6987)
@@ -43,22 +43,28 @@
 <img src="<%= request.getContextPath() %>/metacat-logo.png" width="100px" align="right"/> 
 <h2>DataONE Configuration</h2>
 
+<p> 
+    DataONE configuration is optional; choose 'Skip' below to proceed to the next configuration section,
+    unless you want to join the DataONE federation.
+</p>
 <p>
-	Becoming a DataONE Member Node is a means of distributing data and metadata within the broader DataONE infrastructure.
-	Metadata will be synchronized in the network and additional backups of data can be housed among other Member Nodes for 
-	archival safe-keeping. 
-	Optionally, this Member Node can provide backup space for other Member Nodes that wish to share their data in the federation.
+	<a href="http://www.dataone.org" target="_D1">DataONE</a> is a federation of data repositories (called Member Nodes)
+    that work together to create a seamless, interoperable network to store, preserve, discover, and publish scientific data.
+	Becoming a DataONE Member Node is a means of distributing data and metadata using a common set of standards, making it
+	easy to build software systems that can interact with any of the federated repository nodes.  Metacat can be used
+	to join the DataONE federation by configuring Metacat to act as a Member Node and applying with DataONE to become a
+	Member Node.  Once a node's application is approved and Metacat is configured, metadata will be synchronized in the 
+	network for easy discovery, and replicas of data and metadata can be housed on other Member Nodes for 
+	archival safe-keeping. In addition, a Metacat Member Node can optionally provide space to store replicas of data from 
+	other Member Nodes that wish to preserve their data in the federation.
 <p/>
-<p>
-	In order to become a Member Node, the registration must be reviewed and verified. 
-	A unique Member Node Id will be assigned and 
-	should only be used for this node and never shared or altered.
+<p> To configure Metacat as a Member Node, you must first obtain a Member Node X.509 certificate that will
+    be used to authenticate this node, and you must have a registered and verified account with DataONE that can
+    be used as the point of contact for the candidate Member Node.  Once you have this information, fill out
+    the form below with the proper configuration information, and then click 'Register', which will send the
+    registration data to DataONE. A unique Member Node ID will be assigned and should only be used for this 
+    node and never shared or altered.
 <p/>
-<p>
-	A client certificate can be requested from the DataONE Certificate Authority and will be used by this node when communicating with 
-	the Coordinating Node and other participating Member Nodes. 
-	This certificate should be properly protected so that nefarious entities cannot pose as this Member Node.
-</p>
 <br clear="right"/>
 
 <%@ include file="page-message-section.jsp"%>
@@ -67,6 +73,9 @@
                                         onsubmit="return submitForm(this);">
 
 	<h3>Member Node Configuration</h3>
+	General information identifiying this node, its owner, and contents.  You will need
+	   a certificate to identify the node, and a DataONE account to act as a node contact.
+	
 	<hr class="config-line">
 	
 	<div class="form-row">
@@ -73,7 +82,7 @@
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
 		<div class="textinput-label">
-			<label for="dataone.nodeName" title="Node Name">Node Name</label>
+			<label for="dataone.nodeName" title="A short, human-readable name for this node">Node Name</label>
 		</div>
 		<input class="textinput" 
 			id="dataone.nodeName" 
@@ -84,7 +93,7 @@
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
 		<div class="textinput-label">
-			<label for="dataone.nodeDescription" title="Node Description">Node Description</label>
+			<label for="dataone.nodeDescription" title="A brief description of the node and its holdings">Node Description</label>
 		</div>
 		<input class="textinput" 
 			id="dataone.nodeDescription" 
@@ -91,24 +100,22 @@
 			name="dataone.nodeDescription" 	             		    	    	           		    	             			
 			value="<%= request.getAttribute("dataone.nodeDescription") %>"/> 
 	</div>
-	<!--
 	<div class="form-row">
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
 		<div class="textinput-label">
-			<label for="dataone.memberNodeId" title="Node Identifier">Node Identifier</label>
+			<label for="dataone.memberNodeId" title="The DataONE-assigned unique identifier for this node">Node Identifier</label>
 		</div>
-		<input class="textinput" 
+		<span class="textinput" 
 			id="dataone.memberNodeId" 
-			name="dataone.memberNodeId" 	             		    	    	           		    	             			
-			value="<%= request.getAttribute("dataone.memberNodeId") %>"/> 
+			name="dataone.memberNodeId"> 	             		    	    	           		    	             			
+			<%= request.getAttribute("dataone.memberNodeId") %></span> 
 	</div>
-	-->
 	<div class="form-row">
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
 		<div class="textinput-label">
-			<label for="dataone.subject" title="Node Subject">Node Subject</label>
+			<label for="dataone.subject" title="The account in Distinguished Name (DN) format that represents this node in all service interactions">Node Subject</label>
 		</div>
 		<input class="textinput" 
 			id="dataone.subject" 
@@ -119,7 +126,7 @@
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
 		<div class="textinput-label">
-			<label for="dataone.contactSubject" title="Contact Subject">Contact Subject</label>
+			<label for="dataone.contactSubject" title="A verified account in DN format to be used as the primary node contact for this node">Contact Subject</label>
 		</div>
 		<input class="textinput" 
 			id="dataone.contactSubject" 
@@ -130,7 +137,7 @@
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
 		<div class="textinput-label">
-			<label for="D1Client.certificate.file" title="Node Certificate Path">Node Certificate Path</label>
+			<label for="D1Client.certificate.file" title="The absolute path to the X.509 certificate used to authenticate this node">Node Certificate Path</label>
 		</div>
 		<input class="textinput" 
 			id="D1Client.certificate.file" 
@@ -137,11 +144,10 @@
 			name="D1Client.certificate.file" 	             		    	    	           		    	             			
 			value="<%= request.getAttribute("D1Client.certificate.file") %>"/> 
 	</div>
-	<hr class="config-line">
 	<div class="form-row">
 		<img class="question-mark" src="style/images/question-mark.gif" 
 			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
-		<div class="textinput-label"><label for="dataone.nodeSynchronize" title="Share metadata with DataONE">Share with DataONE</label></div>
+		<div class="textinput-label"><label for="dataone.nodeSynchronize" title="Enable DataONE services by synchronizing metadata">Enable DataONE Services</label></div>
 
 		<%
 		
@@ -168,36 +174,10 @@
 		<% } %>
 
 	</div>
-	<div class="form-row">
-		<img class="question-mark" src="style/images/question-mark.gif" 
-			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
-		<div class="textinput-label"><label for="dataone.nodeReplicate" title="Accept Replicas from other Member Nodes">Accept Replicas</label></div>
-
-		<%
-		boolean replicate = false;
-		String nodeReplicate = (String) request.getAttribute("dataone.nodeReplicate");
-		if (nodeReplicate != null) {
-			replicate = Boolean.parseBoolean(nodeReplicate);
-		}
-		if (replicate) { 
-		%>
-		<input type="checkbox" 
-				class="textinput" 
-				id="dataone.nodeReplicate" 
-				name="dataone.nodeReplicate" 	             		    	    	           		    	             			
-				value="true"
-				checked="checked"/>
-		<% } else {%>
-		<input type="checkbox" 
-				class="textinput" 
-				id="dataone.nodeReplicate" 
-				name="dataone.nodeReplicate" 	             		    	    	           		    	             			
-				value="true"/>
-		<% } %>
-
-	</div>
-
+    <p>&nbsp;</p>
+    
 	<h3>Synchronization Schedule</h3>
+	The schedule on which metadata should be synchronized with DataONE, expressed as a crontab entry.
 	<hr class="config-line">
 	<div class="form-row">
 		<img class="question-mark" src="style/images/question-mark.gif" 
@@ -277,6 +257,75 @@
 			value="<%= request.getAttribute("dataone.nodeSynchronization.schedule.sec") %>"/> 
 	</div>
 
+	<h3>Replication</h3>
+	Configuration for replication, including whether this node can be used to house replicas of
+	objects from other nodes, as well as default replication policies for the objects originating
+	on this Member Node.
+	<hr class="config-line">
+	<div class="form-row">
+		<img class="question-mark" src="style/images/question-mark.gif" 
+			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
+		<div class="textinput-label"><label for="dataone.nodeReplicate" title="Store replicas from other Member Nodes">Accept and Store Replicas</label></div>
+
+		<%
+		boolean replicate = false;
+		String nodeReplicate = (String) request.getAttribute("dataone.nodeReplicate");
+		if (nodeReplicate != null) {
+			replicate = Boolean.parseBoolean(nodeReplicate);
+		}
+		if (replicate) { 
+		%>
+		<input type="checkbox" 
+				class="textinput" 
+				id="dataone.nodeReplicate" 
+				name="dataone.nodeReplicate" 	             		    	    	           		    	             			
+				value="true"
+				checked="checked"/>
+		<% } else {%>
+		<input type="checkbox" 
+				class="textinput" 
+				id="dataone.nodeReplicate" 
+				name="dataone.nodeReplicate" 	             		    	    	           		    	             			
+				value="true"/>
+		<% } %>
+	</div>
+	
+	<hr class="config-line">
+
+ 	<div class="form-row">
+		<img class="question-mark" src="style/images/question-mark.gif" 
+			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
+		<div class="textinput-label">
+			<label for="dataone.replicationpolicy.default.numreplicas" title="Default Number of Replicas to be created for local objects">Default Number of Replicas</label>
+		</div>
+		<input class="textinput" 
+			id="dataone.replicationpolicy.default.numreplicas" 
+			name="dataone.replicationpolicy.default.numreplicas" 	             		    	    	           		    	             			
+			value="<%= request.getAttribute("dataone.replicationpolicy.default.numreplicas") %>"/> 
+	</div>
+  	<div class="form-row">
+		<img class="question-mark" src="style/images/question-mark.gif" 
+			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
+		<div class="textinput-label">
+			<label for="dataone.replicationpolicy.default.preferredNodeList" title="A comma-separated list of preferred nodes to house replicas">Default Preferred Nodes</label>
+		</div>
+		<input class="textinput" 
+			id="dataone.replicationpolicy.default.preferredNodeList" 
+			name="dataone.replicationpolicy.default.preferredNodeList" 	             		    	    	           		    	             			
+			value="<%= request.getAttribute("dataone.replicationpolicy.default.preferredNodeList") %>"/> 
+	</div>
+   	<div class="form-row">
+		<img class="question-mark" src="style/images/question-mark.gif" 
+			onClick="helpWindow('<%= request.getContextPath() %>','metacat-configure.html#dataone')"/>
+		<div class="textinput-label">
+			<label for="dataone.replicationpolicy.default.blockedNodeList" title="A comma-separated list of blocked nodes never to house replicas">Default Blocked Nodes</label>
+		</div>
+		<input class="textinput" 
+			id="dataone.replicationpolicy.default.blockedNodeList" 
+			name="dataone.replicationpolicy.default.blockedNodeList" 	             		    	    	           		    	             			
+			value="<%= request.getAttribute("dataone.replicationpolicy.default.blockedNodeList") %>"/> 
+	</div>
+ 
 	<input type="hidden" name="configureType" value="dataone"/>
 	<input type="hidden" name="processForm" value="true"/>
 	<input class=button type="submit" value="Register"/>
Index: src/edu/ucsb/nceas/metacat/admin/D1Admin.java
===================================================================
--- src/edu/ucsb/nceas/metacat/admin/D1Admin.java	(revision 6986)
+++ src/edu/ucsb/nceas/metacat/admin/D1Admin.java	(revision 6987)
@@ -107,7 +107,6 @@
 				String nodeDescription = PropertyService.getProperty("dataone.nodeDescription");
 				String memberNodeId = PropertyService.getProperty("dataone.memberNodeId");
 				String nodeSynchronize = PropertyService.getProperty("dataone.nodeSynchronize");
-				String nodeReplicate = PropertyService.getProperty("dataone.nodeReplicate");
 				String subject = PropertyService.getProperty("dataone.subject");
 				String contactSubject = PropertyService.getProperty("dataone.contactSubject");
 				String certpath = PropertyService.getProperty("D1Client.certificate.file");
@@ -121,6 +120,12 @@
 				String min = PropertyService.getProperty("dataone.nodeSynchronization.schedule.min");
 				String sec = PropertyService.getProperty("dataone.nodeSynchronization.schedule.sec");
 				
+				// the replication policies
+                String nodeReplicate = PropertyService.getProperty("dataone.nodeReplicate");
+                String numReplicas = PropertyService.getProperty("dataone.replicationpolicy.default.numreplicas");
+                String preferredNodeList = PropertyService.getProperty("dataone.replicationpolicy.default.preferredNodeList");
+                String blockedNodeList = PropertyService.getProperty("dataone.replicationpolicy.default.blockedNodeList");
+
 				/**
 				dataone.nodeSynchronization.schedule.year=*
 				dataone.nodeSynchronization.schedule.mon=*
@@ -144,7 +149,6 @@
 				request.setAttribute("dataone.nodeDescription", nodeDescription);
 				request.setAttribute("dataone.memberNodeId", memberNodeId);
 				request.setAttribute("dataone.nodeSynchronize", Boolean.toString(synchronize));
-				request.setAttribute("dataone.nodeReplicate", Boolean.toString(replicate));
 				request.setAttribute("dataone.subject", subject);
 				request.setAttribute("dataone.contactSubject", contactSubject);
 				request.setAttribute("D1Client.certificate.file", certpath);
@@ -158,6 +162,13 @@
 				request.setAttribute("dataone.nodeSynchronization.schedule.min", min);
 				request.setAttribute("dataone.nodeSynchronization.schedule.sec", sec);
 
+				// replication policies
+                request.setAttribute("dataone.nodeReplicate", Boolean.toString(replicate));
+                request.setAttribute("dataone.replicationpolicy.default.numreplicas", numReplicas);
+                request.setAttribute("dataone.replicationpolicy.default.preferredNodeList", preferredNodeList);
+                request.setAttribute("dataone.replicationpolicy.default.blockedNodeList", blockedNodeList);
+
+
 				// try the backup properties
 				SortedProperties backupProperties = null;
 				if ((backupProperties = 
@@ -235,7 +246,6 @@
 				String nodeDescription = (String)request.getParameter("dataone.nodeDescription");
 				String memberNodeId = (String)request.getParameter("dataone.memberNodeId");
 				String nodeSynchronize = (String)request.getParameter("dataone.nodeSynchronize");
-				String nodeReplicate = (String)request.getParameter("dataone.nodeReplicate");
 				String subject = (String)request.getParameter("dataone.subject");
 				String contactSubject = (String)request.getParameter("dataone.contactSubject");
 				String certpath = (String)request.getParameter("D1Client.certificate.file");
@@ -249,6 +259,12 @@
 				String min = (String) request.getParameter("dataone.nodeSynchronization.schedule.min");
 				String sec = (String) request.getParameter("dataone.nodeSynchronization.schedule.sec");
 				
+				// the replication policies
+                String nodeReplicate = (String)request.getParameter("dataone.nodeReplicate");
+                String numReplicas = (String)request.getParameter("dataone.replicationpolicy.default.numreplicas");
+                String preferredNodeList = (String)request.getParameter("dataone.replicationpolicy.default.preferredNodeList");
+                String blockedNodeList = (String)request.getParameter("dataone.replicationpolicy.default.blockedNodeList");
+
 				boolean synchronize = false;
 				if (nodeSynchronize != null) {
 					synchronize = Boolean.parseBoolean(nodeSynchronize);
@@ -264,19 +280,8 @@
 				} else {
 					
 					PropertyService.setPropertyNoPersist("dataone.nodeName", nodeName);
-					PropertyService.setPropertyNoPersist("dataone.nodeDescription", nodeDescription);
-					
-					// check if we have updated the memberNodeId
-//					String existingMemberNodeId = PropertyService.getProperty("dataone.memberNodeId");
-//					if (!existingMemberNodeId.equals(memberNodeId)) {
-//						// update all existing system Metadata for this node id
-//						IdentifierManager.getInstance().updateAuthoritativeMemberNodeId(existingMemberNodeId, memberNodeId);
-//					}
-//					// TODO: persist in DB?
-//					PropertyService.setPropertyNoPersist("dataone.memberNodeId", memberNodeId);
-					
+					PropertyService.setPropertyNoPersist("dataone.nodeDescription", nodeDescription);					
 					PropertyService.setPropertyNoPersist("dataone.nodeSynchronize", Boolean.toString(synchronize));
-					PropertyService.setPropertyNoPersist("dataone.nodeReplicate", Boolean.toString(replicate));
 					PropertyService.setPropertyNoPersist("dataone.subject", subject);
 					PropertyService.setPropertyNoPersist("dataone.contactSubject", contactSubject);
 					PropertyService.setPropertyNoPersist("D1Client.certificate.file", certpath);
@@ -290,6 +295,13 @@
 					PropertyService.setPropertyNoPersist("dataone.nodeSynchronization.schedule.min", min);
 					PropertyService.setPropertyNoPersist("dataone.nodeSynchronization.schedule.sec", sec);
 					
+					// the replication policies
+	                PropertyService.setPropertyNoPersist("dataone.nodeReplicate", Boolean.toString(replicate));
+	                PropertyService.setPropertyNoPersist("dataone.replicationpolicy.default.numreplicas", numReplicas);
+                    PropertyService.setPropertyNoPersist("dataone.replicationpolicy.default.preferredNodeList", preferredNodeList);
+                    PropertyService.setPropertyNoPersist("dataone.replicationpolicy.default.blockedNodeList", blockedNodeList);
+
+
 					PropertyService.persistProperties();
 					
 			        // Register/update as a DataONE Member Node					
