diff --git a/indexer-cli/src/main/java/org/apache/maven/index/cli/NexusIndexerCli.java b/indexer-cli/src/main/java/org/apache/maven/index/cli/NexusIndexerCli.java
index c140ace..9f33f67 100644
--- a/indexer-cli/src/main/java/org/apache/maven/index/cli/NexusIndexerCli.java
+++ b/indexer-cli/src/main/java/org/apache/maven/index/cli/NexusIndexerCli.java
@@ -415,14 +415,11 @@
 
         long tstart = System.currentTimeMillis();
 
-        final FSDirectory directory = FSDirectory.open( outputFolder );
-
         final List<IndexCreator> indexers = getIndexers( cli, plexus );
 
-        BufferedInputStream is = null;
-        try
+        try (BufferedInputStream is = new BufferedInputStream( new FileInputStream( indexArchive ) ); //
+             FSDirectory directory = FSDirectory.open( outputFolder ))
         {
-            is = new BufferedInputStream( new FileInputStream( indexArchive ) );
             DefaultIndexUpdater.unpackIndexData( is, directory, (IndexingContext) Proxy.newProxyInstance(
                 getClass().getClassLoader(), new Class[] { IndexingContext.class }, new PartialImplementation()
                 {
@@ -434,14 +431,6 @@
 
             );
         }
-        finally
-        {
-            IOUtil.close( is );
-            if ( directory != null )
-            {
-                directory.close();
-            }
-        }
 
         if ( !quiet )
         {
diff --git a/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexer.java b/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexer.java
index 03999bc..fa07aff 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexer.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexer.java
@@ -187,11 +187,9 @@
     public Collection<ArtifactInfo> identify( final File artifact, final Collection<IndexingContext> contexts )
         throws IOException
     {
-        FileInputStream is = null;
-        try
+        try (FileInputStream is = new FileInputStream( artifact ))
         {
             final MessageDigest sha1 = MessageDigest.getInstance( "SHA-1" );
-            is = new FileInputStream( artifact );
             final byte[] buff = new byte[4096];
             int n;
             while ( ( n = is.read( buff ) ) > -1 )
@@ -207,10 +205,6 @@
             ioe.initCause( ex );
             throw ioe;
         }
-        finally
-        {
-            IOUtil.close( is );
-        }
     }
 
     public Collection<ArtifactInfo> identify( Query query, Collection<IndexingContext> contexts )
diff --git a/indexer-core/src/main/java/org/apache/maven/index/artifact/DefaultArtifactPackagingMapper.java b/indexer-core/src/main/java/org/apache/maven/index/artifact/DefaultArtifactPackagingMapper.java
index 04b1b16..dd02e25 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/artifact/DefaultArtifactPackagingMapper.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/artifact/DefaultArtifactPackagingMapper.java
@@ -104,12 +104,8 @@
 
                         Properties userMappings = new Properties();
 
-                        FileInputStream fis = null;
-
-                        try
+                        try (FileInputStream fis= new FileInputStream( propertiesFile ))
                         {
-                            fis = new FileInputStream( propertiesFile );
-
                             userMappings.load( fis );
 
                             if ( userMappings.keySet().size() > 0 )
@@ -131,10 +127,6 @@
                             getLogger().warn(
                                 "Got IO exception during read of file: " + propertiesFile.getAbsolutePath() );
                         }
-                        finally
-                        {
-                            IOUtil.close( fis );
-                        }
 
                     }
                     else
diff --git a/indexer-core/src/main/java/org/apache/maven/index/packer/DefaultIndexPacker.java b/indexer-core/src/main/java/org/apache/maven/index/packer/DefaultIndexPacker.java
index b66cbde..933dd1b 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/packer/DefaultIndexPacker.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/packer/DefaultIndexPacker.java
@@ -221,21 +221,13 @@
             targetArchive.delete();
         }
 
-        OutputStream os = null;
-
-        try
+        try( OutputStream os = new FileOutputStream( targetArchive ) )
         {
-            os = new FileOutputStream( targetArchive );
-
             IndexDataWriter dw = new IndexDataWriter( os );
             dw.write( request.getContext(), request.getIndexReader(), docIndexes );
 
             os.flush();
         }
-        finally
-        {
-            IOUtil.close( os );
-        }
     }
 
     void writeIndexProperties( IndexPackingRequest request, Properties info )
@@ -247,29 +239,15 @@
 
         info.setProperty( IndexingContext.INDEX_ID, request.getContext().getId() );
 
-        OutputStream os = null;
-
-        try
+        try (OutputStream os = new FileOutputStream( propertyFile ))
         {
-            os = new FileOutputStream( propertyFile );
-
             info.store( os, null );
         }
-        finally
-        {
-            IOUtil.close( os );
-        }
 
-        try
+        try (OutputStream os = new FileOutputStream( targetPropertyFile ))
         {
-            os = new FileOutputStream( targetPropertyFile );
-
             info.store( os, null );
         }
-        finally
-        {
-            IOUtil.close( os );
-        }
 
         if ( request.isCreateChecksumFiles() )
         {
diff --git a/indexer-core/src/main/java/org/apache/maven/index/packer/DigesterUtils.java b/indexer-core/src/main/java/org/apache/maven/index/packer/DigesterUtils.java
index 9c9c874..be98346 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/packer/DigesterUtils.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/packer/DigesterUtils.java
@@ -42,7 +42,7 @@
      * Calculates a digest for a String user the requested algorithm.
      * 
      * @param alg
-     * @param content
+     * @param is
      * @return
      * @throws NoSuchAlgorithmException
      */
@@ -119,7 +119,7 @@
     /**
      * Calculates a SHA1 digest for a stream.
      * 
-     * @param content
+     * @param is
      * @return
      */
     public static String getSha1Digest( InputStream is )
@@ -138,17 +138,14 @@
     /**
      * Calculates a SHA1 digest for a file.
      * 
-     * @param content
+     * @param file
      * @return
      */
     public static String getSha1Digest( File file )
+        throws IOException
     {
-        FileInputStream fis = null;
-
-        try
+        try (FileInputStream fis = new FileInputStream( file ))
         {
-            fis = new FileInputStream( file );
-
             return getDigest( "SHA1", fis );
         }
         catch ( NoSuchAlgorithmException e )
@@ -161,10 +158,6 @@
             // will not happen
             return null;
         }
-        finally
-        {
-            IOUtil.close( fis );
-        }
     }
 
     // MD5
@@ -198,7 +191,7 @@
     /**
      * Calculates a SHA1 digest for a stream.
      * 
-     * @param content
+     * @param is
      * @return
      */
     public static String getMd5Digest( InputStream is )
@@ -217,17 +210,15 @@
     /**
      * Calculates a SHA1 digest for a file.
      * 
-     * @param content
+     * @param file
      * @return
      */
     public static String getMd5Digest( File file )
+        throws IOException
     {
-        FileInputStream fis = null;
 
-        try
+        try (InputStream fis = new FileInputStream( file ))
         {
-            fis = new FileInputStream( file );
-
             return getDigest( "MD5", fis );
         }
         catch ( NoSuchAlgorithmException e )
@@ -240,10 +231,6 @@
             // will not happen
             return null;
         }
-        finally
-        {
-            IOUtil.close( fis );
-        }
     }
 
     // --
diff --git a/indexer-core/src/main/java/org/apache/maven/index/updater/DefaultIndexUpdater.java b/indexer-core/src/main/java/org/apache/maven/index/updater/DefaultIndexUpdater.java
index 2c1067c..7f90ee1 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/updater/DefaultIndexUpdater.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/updater/DefaultIndexUpdater.java
@@ -200,14 +200,9 @@
         indexDir.delete();
         indexDir.mkdirs();
 
-        final Directory directory = updateRequest.getFSDirectoryFactory().open( indexDir );
-
-        BufferedInputStream is = null;
-
-        try
+        try(BufferedInputStream is = new BufferedInputStream( fetcher.retrieve( remoteIndexFile ) ); //
+            Directory directory = updateRequest.getFSDirectoryFactory().open( indexDir ))
         {
-            is = new BufferedInputStream( fetcher.retrieve( remoteIndexFile ) );
-
             Date timestamp = null;
 
             if ( remoteIndexFile.endsWith( ".gz" ) )
@@ -247,13 +242,6 @@
         }
         finally
         {
-            IOUtil.close( is );
-
-            if ( directory != null )
-            {
-                directory.close();
-            }
-
             try
             {
                 FileUtils.deleteDirectory( indexDir );
@@ -321,14 +309,10 @@
     {
         File indexProperties = new File( indexDirectoryFile, remoteIndexPropertiesName );
 
-        FileInputStream fis = null;
-
-        try
+        try ( FileInputStream fis = new FileInputStream( indexProperties ))
         {
             Properties properties = new Properties();
 
-            fis = new FileInputStream( indexProperties );
-
             properties.load( fis );
 
             return properties;
@@ -337,11 +321,6 @@
         {
             getLogger().debug( "Unable to read remote properties stored locally", e );
         }
-        finally
-        {
-            IOUtil.close( fis );
-        }
-
         return null;
     }
 
@@ -352,15 +331,10 @@
 
         if ( properties != null )
         {
-            OutputStream os = new BufferedOutputStream( new FileOutputStream( file ) );
-            try
+            try (OutputStream os = new BufferedOutputStream( new FileOutputStream( file ) ))
             {
                 properties.store( os, null );
             }
-            finally
-            {
-                IOUtil.close( os );
-            }
         }
         else
         {
@@ -371,9 +345,7 @@
     private Properties downloadIndexProperties( final ResourceFetcher fetcher )
         throws IOException
     {
-        InputStream fis = fetcher.retrieve( IndexingContext.INDEX_REMOTE_PROPERTIES_FILE );
-
-        try
+        try (InputStream fis = fetcher.retrieve( IndexingContext.INDEX_REMOTE_PROPERTIES_FILE ))
         {
             Properties properties = new Properties();
 
@@ -381,10 +353,6 @@
 
             return properties;
         }
-        finally
-        {
-            IOUtil.close( fis );
-        }
     }
 
     public Date getTimestamp( final Properties properties, final String key )
@@ -643,9 +611,8 @@
             throws IOException
         {
             File chunksFile = new File( dir, CHUNKS_FILENAME );
-            BufferedOutputStream os = new BufferedOutputStream( new FileOutputStream( chunksFile, true ) );
-            Writer w = new OutputStreamWriter( os, CHUNKS_FILE_ENCODING );
-            try
+            try (BufferedOutputStream os = new BufferedOutputStream( new FileOutputStream( chunksFile, true ) ); //
+                 Writer w = new OutputStreamWriter( os, CHUNKS_FILE_ENCODING ))
             {
                 for ( String filename : newChunks )
                 {
@@ -653,11 +620,6 @@
                 }
                 w.flush();
             }
-            finally
-            {
-                IOUtil.close( w );
-                IOUtil.close( os );
-            }
             super.commit();
         }
 
@@ -667,9 +629,8 @@
             ArrayList<String> chunks = new ArrayList<String>();
 
             File chunksFile = new File( dir, CHUNKS_FILENAME );
-            BufferedReader r =
-                new BufferedReader( new InputStreamReader( new FileInputStream( chunksFile ), CHUNKS_FILE_ENCODING ) );
-            try
+            try (BufferedReader r =
+                     new BufferedReader( new InputStreamReader( new FileInputStream( chunksFile ), CHUNKS_FILE_ENCODING ) ))
             {
                 String str;
                 while ( ( str = r.readLine() ) != null )
@@ -677,10 +638,6 @@
                     chunks.add( str );
                 }
             }
-            finally
-            {
-                IOUtil.close( r );
-            }
             return chunks;
         }
 
diff --git a/indexer-core/src/test/java/org/apache/maven/index/updater/DefaultIndexUpdaterTest.java b/indexer-core/src/test/java/org/apache/maven/index/updater/DefaultIndexUpdaterTest.java
index d3f739a..cdf6d71 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/updater/DefaultIndexUpdaterTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/updater/DefaultIndexUpdaterTest.java
@@ -923,18 +923,13 @@
         {
             Properties properties = getProperties();
 
-            ByteArrayOutputStream buf = new ByteArrayOutputStream();
-            try
+            try (ByteArrayOutputStream buf = new ByteArrayOutputStream())
             {
                 properties.store( buf, null );
                 buf.flush();
-            }
-            finally
-            {
-                IOUtil.close( buf );
+                return new ByteArrayInputStream( buf.toByteArray() );
             }
 
-            return new ByteArrayInputStream( buf.toByteArray() );
         }
 
         abstract Properties getProperties();
@@ -952,17 +947,10 @@
 
             this.file = new File( basedir, IndexingContext.INDEX_UPDATER_PROPERTIES_FILE );
 
-            FileOutputStream fos = null;
-            try
+            try ( FileOutputStream fos = new FileOutputStream( this.file ))
             {
-                fos = new FileOutputStream( this.file );
-
                 properties.store( fos, "" );
             }
-            finally
-            {
-                IOUtil.close( fos );
-            }
         }
 
         @Override
