Index: src/edu/ucsb/nceas/metacat/dataone/MNodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/MNodeService.java	(revision 8359)
+++ src/edu/ucsb/nceas/metacat/dataone/MNodeService.java	(revision 8360)
@@ -232,6 +232,12 @@
     	// only admin of  the MN or the CN is allowed a full delete
         boolean allowed = false;
         allowed = isAdminAuthorized(session);
+        
+        //check if it is the authoritative member node
+        if(!allowed) {
+            allowed = isAuthoritativeMNodeAdmin(session, pid);
+        }
+        
         if (!allowed) { 
             throw new NotAuthorized("1320", "The provided identity does not have " + "permission to delete objects on the Node.");
         }
Index: src/edu/ucsb/nceas/metacat/dataone/CNodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/CNodeService.java	(revision 8359)
+++ src/edu/ucsb/nceas/metacat/dataone/CNodeService.java	(revision 8360)
@@ -346,6 +346,11 @@
 	  // check that it is CN/admin
 	  boolean allowed = isAdminAuthorized(session);
 	  
+	  // additional check if it is the authoritative node if it is not the admin
+      if(!allowed) {
+          allowed = isAuthoritativeMNodeAdmin(session, pid);
+      }
+	  
 	  if (!allowed) {
 		  String msg = "The subject is not allowed to call delete() on a Coordinating Node.";
 		  logMetacat.info(msg);
@@ -397,6 +402,11 @@
 	  // check that it is CN/admin
 	  boolean allowed = isAdminAuthorized(session);
 	  
+	  //check if it is the authoritative member node
+	  if(!allowed) {
+	      allowed = isAuthoritativeMNodeAdmin(session, pid);
+	  }
+	  
 	  if (!allowed) {
 		  String msg = "The subject is not allowed to call archive() on a Coordinating Node.";
 		  logMetacat.info(msg);
@@ -1345,6 +1355,11 @@
           // are we allowed?
           boolean isAllowed = false;
           isAllowed = isAdminAuthorized(session);
+          
+          // additional check if it is the authoritative node if it is not the admin
+          if(!isAllowed) {
+              isAllowed = isAuthoritativeMNodeAdmin(session, pid);
+          }
 
           // proceed if we're called by a CN
           if ( isAllowed ) {
Index: src/edu/ucsb/nceas/metacat/dataone/D1NodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/D1NodeService.java	(revision 8359)
+++ src/edu/ucsb/nceas/metacat/dataone/D1NodeService.java	(revision 8360)
@@ -715,6 +715,86 @@
         return systemMetadata;
     }
      
+    
+    /**
+     * Test if the specified session represents the authoritative member node for the
+     * given object specified by the identifier. According the the DataONE documentation, 
+     * the authoritative member node has all the rights of the *rightsHolder*.
+     * @param session - the Session object containing the credentials for the Subject
+     * @param pid - the Identifier of the data object
+     * @return true if the session represents the authoritative mn.
+     * @throws ServiceFailure 
+     * @throws NotImplemented 
+     */
+    public boolean isAuthoritativeMNodeAdmin(Session session, Identifier pid) {
+        boolean allowed = false;
+        //check the parameters
+        if(session == null) {
+            logMetacat.debug("D1NodeService.isAuthoritativeMNodeAdmin - the session object is null and return false.");
+            return allowed;
+        } else if (pid == null || pid.getValue() == null || pid.getValue().trim().equals("")) {
+            logMetacat.debug("D1NodeService.isAuthoritativeMNodeAdmin - the Identifier object is null (not being specified) and return false.");
+            return allowed;
+        }
+        
+        //Get the subject from the session
+        Subject subject = session.getSubject();
+        if(subject != null) {
+            //Get the authoritative member node info from the system metadata
+            SystemMetadata sysMeta = HazelcastService.getInstance().getSystemMetadataMap().get(pid);
+            if(sysMeta != null) {
+                NodeReference authoritativeMNode = sysMeta.getAuthoritativeMemberNode();
+                if(authoritativeMNode != null) {
+                        CNode cn = null;
+                        try {
+                            cn = D1Client.getCN();
+                        } catch (ServiceFailure e) {
+                            logMetacat.error("D1NodeService.isAuthoritativeMNodeAdmin - couldn't connect to the CN since "+
+                                            e.getDescription()+ ". The false value will be returned for the AuthoritativeMNodeAdmin.");
+                            return allowed;
+                        }
+                        
+                        if(cn != null) {
+                            List<Node> nodes = null;
+                            try {
+                                nodes = cn.listNodes().getNodeList();
+                            } catch (NotImplemented e) {
+                                logMetacat.error("D1NodeService.isAuthoritativeMNodeAdmin - couldn't get the member nodes list from the CN since "+e.getDescription()+ 
+                                                ". The false value will be returned for the AuthoritativeMNodeAdmin.");
+                                return allowed;
+                            } catch (ServiceFailure ee) {
+                                logMetacat.error("D1NodeService.isAuthoritativeMNodeAdmin - couldn't get the member nodes list from the CN since "+ee.getDescription()+ 
+                                                ". The false value will be returned for the AuthoritativeMNodeAdmin.");
+                                return allowed;
+                            }
+                            if(nodes != null) {
+                                for(Node node : nodes) {
+                                    //find the authoritative node and get its subjects
+                                    if (node.getType() == NodeType.MN && node.getIdentifier() != null && node.getIdentifier().equals(authoritativeMNode)) {
+                                        List<Subject> nodeSubjects = node.getSubjectList();
+                                        if(nodeSubjects != null) {
+                                            // check if the session subject is in the node subject list
+                                            for (Subject nodeSubject : nodeSubjects) {
+                                                logMetacat.debug("D1NodeService.isAuthoritativeMNodeAdmin(), comparing subjects: " +
+                                                    nodeSubject.getValue() + " and " + subject.getValue());
+                                                if ( nodeSubject != null && nodeSubject.equals(subject) ) {
+                                                    allowed = true; // subject of session == target node subject
+                                                    break;
+                                                }
+                                            }              
+                                        }
+                                      
+                                    }
+                                }
+                            }
+                        }
+                }
+            }
+        }
+        return allowed;
+    }
+    
+    
   /**
    * Test if the user identified by the provided token has administrative authorization 
    * 
@@ -868,6 +948,12 @@
         
     }
     
+    // the authoritative member node of the pid always has the access as well.
+    if (isAuthoritativeMNodeAdmin(session, pid)) {
+        allowed = true;
+        return allowed;
+    }
+    
     // get the subject[s] from the session
 	//defer to the shared util for recursively compiling the subjects	
 	Set<Subject> subjects = AuthUtils.authorizedClientSubjects(session);
