Index: src/edu/ucsb/nceas/metacat/restservice/MNResourceHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/restservice/MNResourceHandler.java	(revision 7854)
+++ src/edu/ucsb/nceas/metacat/restservice/MNResourceHandler.java	(revision 7855)
@@ -139,6 +139,7 @@
     protected static final String RESOURCE_ERROR = "error";
     protected static final String RESOURCE_META_CHANGED = "dirtySystemMetadata";
     protected static final String RESOURCE_GENERATE_ID = "generate";
+    protected static final String RESOURCE_PACKAGE = "package";
 
     
     // shared executor
@@ -369,7 +370,17 @@
                         generateIdentifier();
                         status = true;
                     }
-                }
+                } else if (resource.startsWith(RESOURCE_PACKAGE)) {
+                    logMetacat.debug("Using resource: " + RESOURCE_PACKAGE);
+                    // get
+                    if (httpVerb == GET) {
+                    	// after the command
+                        extra = parseTrailing(resource, RESOURCE_META);
+                        getPackage(extra);
+                        status = true;
+                    }
+                    
+                } 
                 
                 if (!status) {
                 	throw new ServiceFailure("0000", "Unknown error, status = " + status);
@@ -1173,6 +1184,30 @@
     
 
     /**
+     * Retrieve data package as Bagit zip
+     * @param pid
+     * @throws NotImplemented 
+     * @throws NotFound 
+     * @throws NotAuthorized 
+     * @throws ServiceFailure 
+     * @throws InvalidToken 
+     * @throws IOException 
+     */
+    protected void getPackage(String pid) throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, IOException {
+
+        Identifier id = new Identifier();
+        id.setValue(pid);
+        InputStream is = MNodeService.getInstance(request).getPackage(session, id);
+        
+        response.setContentType("application/zip");
+        response.setStatus(200);
+        OutputStream out = response.getOutputStream();
+        
+        // write it to the output stream
+        IOUtils.copyLarge(is, out);
+   }
+    
+    /**
      * Retrieve System Metadata
      * @param pid
      * @throws InvalidToken
Index: src/edu/ucsb/nceas/metacat/dataone/MNodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/MNodeService.java	(revision 7854)
+++ src/edu/ucsb/nceas/metacat/dataone/MNodeService.java	(revision 7855)
@@ -1635,17 +1635,14 @@
 	/**
 	 * Packages the given package in a Bagit collection for download
 	 * @param pid
-	 * @throws IOException 
 	 * @throws NotImplemented 
 	 * @throws NotFound 
 	 * @throws NotAuthorized 
 	 * @throws ServiceFailure 
 	 * @throws InvalidToken 
-	 * @throws OREParserException 
-	 * @throws URISyntaxException 
-	 * @throws OREException 
 	 */
-	public InputStream getPackage(Session session, Identifier pid) throws IOException, InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, OREException, URISyntaxException, OREParserException {
+	public InputStream getPackage(Session session, Identifier pid) throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented {
+		
 		InputStream bagInputStream = null;
 		BagFactory bagFactory = new BagFactory();
 		Bag bag = bagFactory.createBag();
@@ -1656,59 +1653,83 @@
 		// the pids to include in the package
 		List<Identifier> packagePids = new ArrayList<Identifier>();
 		
-		// find the package contents
-		SystemMetadata sysMeta = this.getSystemMetadata(session, pid);
-		if (ObjectFormatService.getInstance().getFormat(sysMeta.getFormatId()).getFormatType().equals("RESOURCE")) {
-			InputStream oreInputStream = this.get(session, pid);
-			Map<Identifier, Map<Identifier, List<Identifier>>> resourceMapStructure = ResourceMapFactory.getInstance().parseResourceMap(oreInputStream);
-			packagePids.addAll(resourceMapStructure.keySet());
-			for (Map<Identifier, List<Identifier>> entries: resourceMapStructure.values()) {
-				packagePids.addAll(entries.keySet());
-				for (List<Identifier> dataPids: entries.values()) {
-					packagePids.addAll(dataPids);
+		// catch non-D1 service errors and throw as ServiceFailures
+		try {
+			
+			// find the package contents
+			SystemMetadata sysMeta = this.getSystemMetadata(session, pid);
+			if (ObjectFormatService.getInstance().getFormat(sysMeta.getFormatId()).getFormatType().equals("RESOURCE")) {
+				InputStream oreInputStream = this.get(session, pid);
+				Map<Identifier, Map<Identifier, List<Identifier>>> resourceMapStructure = ResourceMapFactory.getInstance().parseResourceMap(oreInputStream);
+				packagePids.addAll(resourceMapStructure.keySet());
+				for (Map<Identifier, List<Identifier>> entries: resourceMapStructure.values()) {
+					packagePids.addAll(entries.keySet());
+					for (List<Identifier> dataPids: entries.values()) {
+						packagePids.addAll(dataPids);
+					}
 				}
+			} else {
+				// just the lone pid in this package
+				packagePids.add(pid);
 			}
-		} else {
-			// just the lone pid in this package
-			packagePids.add(pid);
+	
+			// track the pid-to-file mapping
+			StringBuffer pidMapping = new StringBuffer();
+			// loop through the package contents
+			for (Identifier entryPid: packagePids) {
+				SystemMetadata entrySysMeta = this.getSystemMetadata(session, entryPid);
+				String extension = ObjectFormatInfo.instance().getExtension(entrySysMeta.getFormatId().getValue());
+		        String prefix = entryPid.getValue();
+		        prefix = "entry";
+				File tempFile = File.createTempFile(prefix + ".", extension);
+				tempFiles.add(tempFile);
+				InputStream entryInputStream = this.get(session, entryPid);
+				IOUtils.copy(entryInputStream, new FileOutputStream(tempFile));
+				bag.addFileToPayload(tempFile);
+				pidMapping.append(entryPid.getValue() + "\t" + "data/" + tempFile.getName() + "\n");
+			}
+			
+			//add the the pid to data file map
+			File pidMappingFile = File.createTempFile("pid-mapping.", ".txt");
+			IOUtils.write(pidMapping.toString(), new FileOutputStream(pidMappingFile));
+			bag.addFileAsTag(pidMappingFile);
+	
+			bag = bag.makeComplete();
+			File bagFile = File.createTempFile("bag.", ".zip");
+			// TODO: delete more confidently
+			bagFile.deleteOnExit();
+			bag.setFile(bagFile);
+			Writer zipWriter = new ZipWriter(bagFactory);
+			bag.write(zipWriter, bagFile);
+			bagFile = bag.getFile();
+			bagInputStream = new FileInputStream(bagFile);
+			
+			// clean up temp entry files
+			for (File tf: tempFiles) {
+				tf.delete();
+			}
+		} catch (IOException e) {
+			// report as service failure
+			ServiceFailure sf = new ServiceFailure("1030", e.getMessage());
+			sf.initCause(e);
+			throw sf;
+		} catch (OREException e) {
+			// report as service failure
+			ServiceFailure sf = new ServiceFailure("1030", e.getMessage());
+			sf.initCause(e);
+			throw sf;
+		} catch (URISyntaxException e) {
+			// report as service failure
+			ServiceFailure sf = new ServiceFailure("1030", e.getMessage());
+			sf.initCause(e);
+			throw sf;
+		} catch (OREParserException e) {
+			// report as service failure
+			ServiceFailure sf = new ServiceFailure("1030", e.getMessage());
+			sf.initCause(e);
+			throw sf;
 		}
-
-		// track the pid-to-file mapping
-		StringBuffer pidMapping = new StringBuffer();
-		// loop through the package contents
-		for (Identifier entryPid: packagePids) {
-			SystemMetadata entrySysMeta = this.getSystemMetadata(session, entryPid);
-			String extension = ObjectFormatInfo.instance().getExtension(entrySysMeta.getFormatId().getValue());
-	        String prefix = entryPid.getValue();
-	        prefix = "entry";
-			File tempFile = File.createTempFile(prefix + ".", extension);
-			tempFiles.add(tempFile);
-			InputStream entryInputStream = this.get(session, entryPid);
-			IOUtils.copy(entryInputStream, new FileOutputStream(tempFile));
-			bag.addFileToPayload(tempFile);
-			pidMapping.append(entryPid.getValue() + "\t" + "data/" + tempFile.getName() + "\n");
-		}
 		
-		//add the the pid to data file map
-		File pidMappingFile = File.createTempFile("pid-mapping.", ".txt");
-		IOUtils.write(pidMapping.toString(), new FileOutputStream(pidMappingFile));
-		bag.addFileAsTag(pidMappingFile);
-
-		bag = bag.makeComplete();
-		File bagFile = File.createTempFile("bag.", ".zip");
-		// TODO: delete more confidently
-		bagFile.deleteOnExit();
-		bag.setFile(bagFile);
-		Writer zipWriter = new ZipWriter(bagFactory);
-		bag.write(zipWriter, bagFile);
-		bagFile = bag.getFile();
-		bagInputStream = new FileInputStream(bagFile);
-		
-		// clean up temp entry files
-		for (File tf: tempFiles) {
-			tf.delete();
-		}
-		
 		return bagInputStream;
 
 	}
