diff --git a/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java b/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java
index 0095c3b..62bfeb8 100644
--- a/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java
+++ b/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java
@@ -220,13 +220,11 @@
             return null;
         }
 
-        ObjectInputStream in = null;
         Map<AppData, File> serialData = null;
 
-        try
+        try (FileInputStream fin = new FileInputStream(serialDataFile);
+             ObjectInputStream in = new ObjectInputStream(fin))
         {
-        	FileInputStream fin = new FileInputStream(serialDataFile);
-            in = new ObjectInputStream(fin);
             Object o = in.readObject();
 
             if (o instanceof Map)
@@ -238,10 +236,9 @@
             else
             {
                 // This could be old file from intake. Try to delete it
-                getLogger().info("serialized object is not an intake map, ignoring");
+                getLogger().info("Serialized object is not an intake map, ignoring");
                 in.close();
-                in = null;
-                
+
                 // Try to delete the file
                 boolean result = serialDataFile.delete();
                 if ( result == false )
@@ -266,22 +263,6 @@
             // Null out serialData to be sure
             serialData = null;
         }
-        finally
-        {
-            // Could be null if we opened a file, didn't find it to be a
-            // Map object and then nuked it away.
-            try
-            {
-                if (in != null)
-                {
-                    in.close();
-                }
-            }
-            catch (IOException e)
-            {
-                getLogger().error("Exception while closing file", e);
-            }
-        }
 
         // Recreate transient loggers
         if (serialData != null)
@@ -350,7 +331,7 @@
             {
             	getLogger().error("Serialized file could not be removed");
             }
-            
+
         }
         catch (IOException e)
         {
@@ -360,21 +341,17 @@
             return;
         }
 
-        ObjectOutputStream out = null;
-        ObjectInputStream in = null;
-
-        try
+        try (FileOutputStream fout = new FileOutputStream(serialDataPath);
+             ObjectOutputStream out = new ObjectOutputStream(fout);
+             FileInputStream fin = new FileInputStream(serialDataPath);
+             ObjectInputStream in = new ObjectInputStream(fin))
         {
             // write the appData file out
-        	FileOutputStream fout = new FileOutputStream(serialDataPath);
-            out = new ObjectOutputStream(fout);
             out.writeObject(appDataElements);
             out.flush();
 
             // read the file back in. for some reason on OSX 10.1
             // this is necessary.
-            FileInputStream fin = new FileInputStream(serialDataPath);
-            in = new ObjectInputStream(fin);
             /* Map dummy = (Map) */ in.readObject();
 
             getLogger().debug("Serializing successful");
@@ -390,31 +367,6 @@
             getLogger().info(
                     "Could not re-read serialized file from " + serialDataPath, e);
         }
-        finally
-        {
-            try
-            {
-                if (out != null)
-                {
-                    out.close();
-                }
-            }
-            catch (IOException e)
-            {
-                getLogger().error("Exception while closing file", e);
-            }
-            try
-            {
-                if (in != null)
-                {
-                    in.close();
-                }
-            }
-            catch (IOException e)
-            {
-                getLogger().error("Exception while closing file", e);
-            }
-        }
 
         getLogger().debug("Saving took " + (System.currentTimeMillis() - timer));
     }
@@ -490,7 +442,7 @@
             }
             catch (Exception e)
             {
-                throw new IntakeException("Could not get group " + groupName, e);
+                throw new IntakeException("Could not release group " + groupName, e);
             }
         }
     }
@@ -736,7 +688,7 @@
         Set<File> xmlFiles = new HashSet<File>();
 
         long timeStamp = 0;
-        
+
         getLogger().debug("logger is " + getLogger().getClass().getSimpleName());
 
         for (String xmlPath : xmlPathes)
@@ -748,11 +700,8 @@
 
             if (!xmlFile.canRead())
             {
-                String READ_ERR = "Could not read input file with path "
-                        + xmlPath + ".  Looking for file " + xmlFile;
-
-                getLogger().error(READ_ERR);
-                throw new Exception(READ_ERR);
+                throw new Exception("Could not read input file with path "
+                        + xmlPath + ".  Looking for file " + xmlFile);
             }
 
             xmlFiles.add(xmlFile);
@@ -797,29 +746,12 @@
             for (File xmlFile : xmlFiles)
             {
                 getLogger().debug("Now parsing: " + xmlFile);
-                FileInputStream fis = null;
-                try
+                try (FileInputStream fis = new FileInputStream(xmlFile))
                 {
-                    fis = new FileInputStream(xmlFile);
                     AppData appData = (AppData) um.unmarshal(fis);
-
                     appDataElements.put(appData, xmlFile);
                     getLogger().debug("Saving AppData for " + xmlFile);
                 }
-                finally
-                {
-                    if (fis != null)
-                    {
-                        try
-                        {
-                            fis.close();
-                        }
-                        catch (IOException e)
-                        {
-                            getLogger().warn("Could not close file " + xmlFile);
-                        }
-                    }
-                }
             }
 
             getLogger().debug("Parsing took " + (System.currentTimeMillis() - timer));
@@ -834,7 +766,7 @@
         	// Set the entry pair
         	appData = entry.getKey();
         	dataFile = entry.getValue();
-        	
+
             int maxPooledGroups = 0;
             List<Group> glist = appData.getGroups();
 
@@ -904,11 +836,11 @@
     }
 
     /**
-     * Note that the avalon.entry key="urn:avalon:home" 
+     * Note that the avalon.entry key="urn:avalon:home"
      * and the type is {@link java.io.File}
-     * 
+     *
      * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
-     * 
+     *
      * @param context the Context to use
      * @throws ContextException if the context is not found
      */
@@ -922,9 +854,9 @@
      * Avalon component lifecycle method
      *
      * avalon.dependency type="org.apache.fulcrum.localization.LocalizationService"
-     * 
+     *
      * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
-     * 
+     *
      * @param manager the service manager
      * @throws ServiceException generic exception
      */
