diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 34d8904..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,97 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: contributing-md-template.md                           |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:contributing-md                    |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.jira.id  (required, alphabetic, upper case)             |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.jira.id>MATH</commons.jira.id>                           |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Contributing to Apache Commons FileUpload
-======================
-
-You have found a bug or you have an idea for a cool new feature? Contributing code is a great way to give something back to
-the open source community. Before you dig right into the code there are a few guidelines that we need contributors to
-follow so that we can have a chance of keeping on top of things.
-
-Getting Started
----------------
-
-+ Make sure you have a [JIRA account](https://issues.apache.org/jira/).
-+ Make sure you have a [GitHub account](https://github.com/signup/free).
-+ If you're planning to implement a new feature it makes sense to discuss you're changes on the [dev list](https://commons.apache.org/mail-lists.html) first. This way you can make sure you're not wasting your time on something that isn't considered to be in Apache Commons FileUpload's scope.
-+ Submit a ticket for your issue, assuming one does not already exist.
-  + Clearly describe the issue including steps to reproduce when it is a bug.
-  + Make sure you fill in the earliest version that you know has the issue.
-+ Fork the repository on GitHub.
-
-Making Changes
---------------
-
-+ Create a topic branch from where you want to base your work (this is usually the master/trunk branch).
-+ Make commits of logical units.
-+ Respect the original code style:
-  + Only use spaces for indentation.
-  + Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change.
-  + Check for unnecessary whitespace with git diff --check before committing.
-+ Make sure your commit messages are in the proper format. Your commit message should contain the key of the JIRA issue.
-+ Make sure you have added the necessary tests for your changes.
-+ Run all the tests with `mvn clean verify` to assure nothing else was accidentally broken.
-
-Making Trivial Changes
-----------------------
-
-For changes of a trivial nature to comments and documentation, it is not always necessary to create a new ticket in JIRA.
-In this case, it is appropriate to start the first line of a commit with '(doc)' instead of a ticket number.
-
-Submitting Changes
-------------------
-
-+ Sign the [Contributor License Agreement][cla] if you haven't already.
-+ Push your changes to a topic branch in your fork of the repository.
-+ Submit a pull request to the repository in the apache organization.
-+ Update your JIRA ticket and include a link to the pull request in the ticket.
-
-Additional Resources
---------------------
-
-+ [Contributing patches](https://commons.apache.org/patches.html)
-+ [Apache Commons FileUpload JIRA project page](https://issues.apache.org/jira/browse/FILEUPLOAD)
-+ [Contributor License Agreement][cla]
-+ [General GitHub documentation](https://help.github.com/)
-+ [GitHub pull request documentation](https://help.github.com/send-pull-requests/)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ #apachecommons IRC channel on freenode.org
-
-[cla]:https://www.apache.org/licenses/#clas
diff --git a/README.md b/README.md
deleted file mode 100644
index cb76d89..0000000
--- a/README.md
+++ /dev/null
@@ -1,99 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: readme-md-template.md                                 |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:readme-md                          |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |    - commons.release.version (required)                              |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |    <commons.release.version>1.2</commons.release.version>            |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Apache Commons FileUpload
-===================
-
-The Apache Commons FileUpload component provides a simple yet flexible means of adding support for multipart
-    file upload functionality to servlets and web applications.
-
-Documentation
--------------
-
-More information can be found on the [homepage](https://commons.apache.org/proper/commons-fileupload).
-The [JavaDoc](https://commons.apache.org/proper/commons-fileupload/apidocs) can be browsed.
-Questions related to the usage of Apache Commons FileUpload should be posted to the [user mailing list][ml].
-
-Where can I get the latest release?
------------------------------------
-You can download source and binaries from our [download page](https://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi).
-
-Alternatively you can pull it from the central Maven repositories:
-
-```xml
-<dependency>
-  <groupId>commons-fileupload</groupId>
-  <artifactId>commons-fileupload</artifactId>
-  <version>1.3.1</version>
-</dependency>
-```
-
-Contributing
-------------
-
-We accept PRs via github. The [developer mailing list][ml] is the main channel of communication for contributors.
-There are some guidelines which will make applying PRs easier for us:
-+ No tabs! Please use spaces for indentation.
-+ Respect the code style.
-+ Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change.
-+ Provide JUnit tests for your changes and make sure your changes don't break any existing tests by running ```mvn clean test```.
-
-If you plan to contribute on a regular basis, please consider filing a [contributor license agreement](https://www.apache.org/licenses/#clas).
-You can learn more about contributing via GitHub in our [contribution guidelines](CONTRIBUTING.md).
-
-License
--------
-Code is under the [Apache Licence v2](https://www.apache.org/licenses/LICENSE-2.0.txt).
-
-Donations
----------
-You like Apache Commons FileUpload? Then [donate back to the ASF](https://www.apache.org/foundation/contributing.html) to support the development.
-
-Additional Resources
---------------------
-
-+ [Apache Commons Homepage](https://commons.apache.org/)
-+ [Apache Bugtracker (JIRA)](https://issues.apache.org/jira/)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ #apachecommons IRC channel on freenode.org
-
-[ml]:https://commons.apache.org/mail-lists.html
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 2c34603..bc33acb 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -1,3 +1,25 @@
+              Apache Commons FileUpload 1.3.2 RELEASE NOTES
+
+The Apache Commons FileUpload team is pleased to announce the release of Apache Commons FileUpload 1.3.2.
+
+The Apache Commons FileUpload component provides a simple yet flexible means of
+adding support for multipart file upload functionality to servlets and web
+applications. Version 1.3 onwards requires Java 5 or later.
+
+No client code changes are required to migrate from version 1.3.1 to 1.3.2.
+
+Changes in version 1.3.2 include:
+
+o FILEUPLOAD-272:  Performance Improvement in MultipartStream
+
+
+For complete information on Apache Commons FileUpload, including instructions on how to submit bug reports,
+patches, or suggestions for improvement, see the Apache Apache Commons FileUpload website:
+
+http://commons.apache.org/proper/commons-fileupload/
+
+------------------------------------------------------------------------------
+
               Apache Commons FileUpload 1.3.1 RELEASE NOTES
 
 The Apache Commons FileUpload team is pleased to announce the release of Apache Commons FileUpload 1.3.1.
@@ -31,3 +53,4 @@
 patches, or suggestions for improvement, see the Apache Apache Commons FileUpload website:
 
 http://commons.apache.org/proper/commons-fileupload/
+
diff --git a/build.properties b/build.properties
index 185a280..6325561 100644
--- a/build.properties
+++ b/build.properties
@@ -47,7 +47,7 @@
 sonar.host.url=https\://analysis.apache.org/
 commons.rc.version=RC1
 commons.cobertura.version=2.5.2
-commons.release.name=commons-fileupload-1.4
+commons.release.name=commons-fileupload-1.3
 minSeverity=info
 maven.build.testOutputDir=${maven.build.dir}/test-classes
 project.reporting.outputEncoding=iso-8859-1
diff --git a/doap_fileupload.rdf b/doap_fileupload.rdf
new file mode 100644
index 0000000..29fd6e3
--- /dev/null
+++ b/doap_fileupload.rdf
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<rdf:RDF xmlns="http://usefulinc.com/ns/doap#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:asfext="http://projects.apache.org/ns/asfext#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:doap="http://usefulinc.com/ns/doap#" xml:lang="en">
+  <Project rdf:about="http://commons.apache.org/fileupload/">
+    <name>Apache Commons FileUpload</name>
+    <homepage rdf:resource="http://commons.apache.org/fileupload/"/>
+    <programming-language>Java</programming-language>
+    <category rdf:resource="http://projects.apache.org/category/library"/>
+    <license rdf:resource="http://usefulinc.com/doap/licenses/asl20"/>
+    <bug-database rdf:resource="http://issues.apache.org/jira/browse/FILEUPLOAD"/>
+    <download-page rdf:resource="http://commons.apache.org/fileupload/download_fileupload.cgi"/>
+    <asfext:pmc rdf:resource="http://commons.apache.org/"/>
+    <shortdesc xml:lang="en">File upload component for Java servlets</shortdesc>
+    <description xml:lang="en">
+    The FileUpload component provides a simple yet flexible means of adding
+    support for multipart file upload functionality to servlets and web
+    applications.
+  </description>
+    <repository>
+      <SVNRepository>
+        <browse rdf:resource="http://svn.apache.org/repos/asf"/>
+        <location rdf:resource="http://svn.apache.org/repos/asf/commons/proper/fileupload"/>
+      </SVNRepository>
+    </repository>
+    <release>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2013-03-27</created>
+        <revision>1.3</revision>
+      </Version>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2010-07-29</created>
+        <revision>1.2.2</revision>
+      </Version>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2008-01-18</created>
+        <revision>1.2.1</revision>
+      </Version>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2007-02-13</created>
+        <revision>1.2</revision>
+      </Version>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2006-06-08</created>
+        <revision>1.1.1</revision>
+      </Version>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2005-12-23</created>
+        <revision>1.1</revision>
+      </Version>
+      <Version>
+        <name>commons-fileupload</name>
+        <created>2003-06-24</created>
+        <revision>1.0</revision>
+      </Version>
+    </release>
+    <mailing-list rdf:resource="http://commons.apache.org/mail-lists.html"/>
+  </Project>
+</rdf:RDF>
diff --git a/pom.xml b/pom.xml
index 6baa153..b90e789 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
 
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
-  <version>1.4-SNAPSHOT</version>
+  <version>1.3.2</version>
 
   <name>Apache Commons FileUpload</name>
   <description>
@@ -167,9 +167,9 @@
   </contributors>
 
   <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/fileupload/trunk</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/fileupload/trunk</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/fileupload/trunk</url>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/fileupload/tags/commons-fileupload-1.3.2</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/fileupload/tags/commons-fileupload-1.3.2</developerConnection>
+    <url>http://svn.apache.org/viewvc/commons/proper/fileupload/tags/commons-fileupload-1.3.2</url>
   </scm>
   <issueManagement>
     <system>jira</system>
@@ -179,9 +179,9 @@
   <properties>
     <maven.compiler.source>1.5</maven.compiler.source>
     <maven.compiler.target>1.5</maven.compiler.target>
+    <maven.compile.encoding>ISO-8859-1</maven.compile.encoding>
     <commons.componentid>fileupload</commons.componentid>
-    <commons.release.version>1.4</commons.release.version>
-    <commons.release.desc>(requires Java ${maven.compiler.target} or later)</commons.release.desc>
+    <commons.release.version>1.3.2</commons.release.version>
     <commons.rc.version>RC1</commons.rc.version>
     <commons.jira.id>FILEUPLOAD</commons.jira.id>
     <commons.jira.pid>12310476</commons.jira.pid>
@@ -236,6 +236,46 @@
         </configuration>
       </plugin>
     </plugins>
+    <pluginManagement>
+    	<plugins>
+    	    <plugin>
+    	      <groupId>org.apache.maven.plugins</groupId>
+    	      <artifactId>maven-release-plugin</artifactId>
+    	      <configuration>
+    	        <tagBase>https://svn.apache.org/repos/asf/commons/proper/fileupload/tags</tagBase>
+    	      </configuration>
+    	    </plugin>
+    		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+    		<plugin>
+    			<groupId>org.eclipse.m2e</groupId>
+    			<artifactId>lifecycle-mapping</artifactId>
+    			<version>1.0.0</version>
+    			<configuration>
+    				<lifecycleMappingMetadata>
+    					<pluginExecutions>
+    						<pluginExecution>
+    							<pluginExecutionFilter>
+    								<groupId>
+    									org.apache.maven.plugins
+    								</groupId>
+    								<artifactId>
+    									maven-antrun-plugin
+    								</artifactId>
+    								<versionRange>[1.7,)</versionRange>
+    								<goals>
+    									<goal>run</goal>
+    								</goals>
+    							</pluginExecutionFilter>
+    							<action>
+    								<ignore />
+    							</action>
+    						</pluginExecution>
+    					</pluginExecutions>
+    				</lifecycleMappingMetadata>
+    			</configuration>
+    		</plugin>
+    	</plugins>
+    </pluginManagement>
   </build>
 
   <reporting>
@@ -264,7 +304,6 @@
           <configLocation>${basedir}/src/checkstyle/fileupload_checks.xml</configLocation>
           <suppressionsLocation>${basedir}/src/checkstyle/checkstyle-suppressions.xml</suppressionsLocation>
           <enableRulesSummary>false</enableRulesSummary>
-          <headerLocation>${basedir}/src/checkstyle/license-header.txt</headerLocation>
         </configuration>
       </plugin>
       <plugin>
@@ -283,16 +322,9 @@
         <artifactId>clirr-maven-plugin</artifactId>
         <version>${commons.clirr.version}</version>
         <configuration>
-          <comparisonArtifacts>
-            <comparisonArtifact>
-              <groupId>commons-fileupload</groupId>
-              <artifactId>commons-fileupload</artifactId>
-              <version>1.3</version>
-            </comparisonArtifact>
-          </comparisonArtifacts>
+          <comparisonVersion>1.3</comparisonVersion>
         </configuration>
       </plugin>
     </plugins>
   </reporting>
-
 </project>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index fdcf43e..bc1b921 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -43,20 +43,10 @@
   </properties>
 
   <body>
-    <release version="1.4" date="TBA" description="TBA">
-      <action issue="FILEUPLOAD-252" dev="tn" type="fix">DiskFileItem#write() could lose original IO exception</action>
-      <action issue="FILEUPLOAD-258" dev="tn" type="fix">DiskFileItem#getStoreLocation() wrongly returned a File object for items stored in memory</action>
-      <action issue="FILEUPLOAD-242" dev="tn" type="fix">FileUploadBase - should not silently catch and ignore all Throwables</action>
-      <action issue="FILEUPLOAD-257" dev="tn" type="fix">Fix Javadoc 1.8.0 errors</action>
-      <action issue="FILEUPLOAD-234" dev="tn" type="fix">Fix section "Resource cleanup" of the user guide</action>
-      <action issue="FILEUPLOAD-237" dev="tn" type="fix">Fix streaming example: use FileItem.getInputStream() instead of openStream()</action>
-      <action issue="FILEUPLOAD-248" dev="ecki" type="fix">DiskFileItem might suppress critical IOExceptions on rename - use FileUtil.move instead</action>
-      <action issue="FILEUPLOAD-251" dev="sebb" type="fix">DiskFileItem#getTempFile() is broken</action>
-      <action issue="FILEUPLOAD-250" dev="sebb" type="fix">FileUploadBase - potential resource leak - InputStream not closed on exception</action>
-      <action issue="FILEUPLOAD-244" dev="sebb" type="fix">DiskFileItem.readObject fails to close FileInputStream</action>
-      <action issue="FILEUPLOAD-246" dev="sebb" type="update">FileUpload should use IOUtils.closeQuietly where relevant</action>
-      <action issue="FILEUPLOAD-245" dev="sebb" type="fix">DiskFileItem.get() may not fully read the data</action>
-      <action issue="FILEUPLOAD-243" dev="sebb" type="update" due-to="Ville Skyttä">Make some MultipartStream private fields final</action>
+    <release version="1.3.2" description="Bugfix release for 1.3.1" date="tba">
+      <action issue="FILEUPLOAD-272" dev="jochen" type="update">
+        Performance Improvement in MultipartStream
+      </action>
     </release>
 
     <release version="1.3.1" description=
diff --git a/src/checkstyle/fileupload_checks.xml b/src/checkstyle/fileupload_checks.xml
index b49a4f4..77699c3 100644
--- a/src/checkstyle/fileupload_checks.xml
+++ b/src/checkstyle/fileupload_checks.xml
@@ -74,12 +74,6 @@
     <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
     <module name="Translation"/>
 
-    <!-- Following interprets the header file as regular expressions. -->
-    <!-- <module name="RegexpHeader"/>                                -->
-    <module name="RegexpHeader">
-        <property name="headerFile" value="${checkstyle.header.file}"/>
-    </module>
-
     <!-- Checks for Size Violations.                    -->
     <!-- See http://checkstyle.sf.net/config_sizes.html -->
     <module name="FileLength"/>
diff --git a/src/checkstyle/license-header.txt b/src/checkstyle/license-header.txt
deleted file mode 100644
index 290c957..0000000
--- a/src/checkstyle/license-header.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-/\*\s*
- \*\s*Licensed to the Apache Software Foundation \(ASF\) under one or more
- \*\s*contributor license agreements.  See the NOTICE file distributed with
- \*\s*this work for additional information regarding copyright ownership\.
- \*\s*The ASF licenses this file to You under the Apache License, Version 2\.0
- \*\s*\(the "License"\); you may not use this file except in compliance with
- \*\s*the License\.  You may obtain a copy of the License at
- \*\s*
- \*\s*http://www\.apache\.org/licenses/LICENSE\-2\.0
- \*\s*
- \*\s*Unless required by applicable law or agreed to in writing, software
- \*\s*distributed under the License is distributed on an "AS IS" BASIS,
- \*\s*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
- \*\s*See the License for the specific language governing permissions and
- \*\s*limitations under the License\.
- \*/\s*
diff --git a/src/main/java/org/apache/commons/fileupload/DefaultFileItemFactory.java b/src/main/java/org/apache/commons/fileupload/DefaultFileItemFactory.java
index 58c9c7f..6fecb37 100644
--- a/src/main/java/org/apache/commons/fileupload/DefaultFileItemFactory.java
+++ b/src/main/java/org/apache/commons/fileupload/DefaultFileItemFactory.java
@@ -28,7 +28,7 @@
  * disk, is configurable, as is the directory in which temporary files will be
  * created.</p>
  *
- * <p>If not otherwise configured, the default configuration values are as
+ * If not otherwise configured, the default configuration values are as
  * follows:
  * <ul>
  *   <li>Size threshold is 10KB.</li>
diff --git a/src/main/java/org/apache/commons/fileupload/FileItem.java b/src/main/java/org/apache/commons/fileupload/FileItem.java
index 99203b3..484719f 100644
--- a/src/main/java/org/apache/commons/fileupload/FileItem.java
+++ b/src/main/java/org/apache/commons/fileupload/FileItem.java
@@ -46,7 +46,7 @@
  * @version $Id$
  * @since 1.3 additionally implements FileItemHeadersSupport
  */
-public interface FileItem extends FileItemHeadersSupport {
+public interface FileItem extends Serializable, FileItemHeadersSupport {
 
     // ------------------------------- Methods from javax.activation.DataSource
 
diff --git a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java
index 1795b3d..b567bd9 100644
--- a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java
+++ b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java
@@ -38,7 +38,6 @@
 import org.apache.commons.fileupload.util.FileItemHeadersImpl;
 import org.apache.commons.fileupload.util.LimitedInputStream;
 import org.apache.commons.fileupload.util.Streams;
-import org.apache.commons.io.IOUtils;
 
 /**
  * <p>High level API for processing file uploads.</p>
@@ -366,8 +365,8 @@
                 for (FileItem fileItem : items) {
                     try {
                         fileItem.delete();
-                    } catch (Exception ignored) {
-                        // ignored TODO perhaps add to tracker delete failure list somehow?
+                    } catch (Throwable e) {
+                        // ignore it
                     }
                 }
             }
@@ -950,6 +949,7 @@
                                MULTIPART_FORM_DATA, MULTIPART_MIXED, contentType));
             }
 
+            InputStream input = ctx.getInputStream();
 
             @SuppressWarnings("deprecation") // still has to be backward compatible
             final int contentLengthInt = ctx.getContentLength();
@@ -960,7 +960,6 @@
                                      : contentLengthInt;
                                      // CHECKSTYLE:ON
 
-            InputStream input; // N.B. this is eventually closed in MultipartStream processing
             if (sizeMax >= 0) {
                 if (requestSize != -1 && requestSize > sizeMax) {
                     throw new SizeLimitExceededException(
@@ -968,8 +967,7 @@
                                 Long.valueOf(requestSize), Long.valueOf(sizeMax)),
                                requestSize, sizeMax);
                 }
-                // N.B. this is eventually closed in MultipartStream processing
-                input = new LimitedInputStream(ctx.getInputStream(), sizeMax) {
+                input = new LimitedInputStream(input, sizeMax) {
                     @Override
                     protected void raiseError(long pSizeMax, long pCount)
                             throws IOException {
@@ -980,8 +978,6 @@
                         throw new FileUploadIOException(ex);
                     }
                 };
-            } else {
-                input = ctx.getInputStream();
             }
 
             String charEncoding = headerEncoding;
@@ -991,7 +987,6 @@
 
             boundary = getBoundary(contentType);
             if (boundary == null) {
-                IOUtils.closeQuietly(input); // avoid possible resource leak
                 throw new FileUploadException("the request was rejected because no multipart boundary was found");
             }
 
@@ -999,7 +994,6 @@
             try {
                 multi = new MultipartStream(input, boundary, notifier);
             } catch (IllegalArgumentException iae) {
-                IOUtils.closeQuietly(input); // avoid possible resource leak
                 throw new InvalidContentTypeException(
                         format("The boundary specified in the %s header is too long", CONTENT_TYPE), iae);
             }
@@ -1367,7 +1361,7 @@
 
         /**
          * @deprecated 1.2 Replaced by
-         * {@link #SizeLimitExceededException(String, long, long)}
+         * {@code SizeLimitExceededException(String, long, long)}
          */
         @Deprecated
         public SizeLimitExceededException() {
@@ -1376,7 +1370,7 @@
 
         /**
          * @deprecated 1.2 Replaced by
-         * {@link #SizeLimitExceededException(String, long, long)}
+         * {@code #SizeLimitExceededException(String, long, long)}
          * @param message The exceptions detail message.
          */
         @Deprecated
diff --git a/src/main/java/org/apache/commons/fileupload/MultipartStream.java b/src/main/java/org/apache/commons/fileupload/MultipartStream.java
index 0d05b71..045dac3 100644
--- a/src/main/java/org/apache/commons/fileupload/MultipartStream.java
+++ b/src/main/java/org/apache/commons/fileupload/MultipartStream.java
@@ -222,12 +222,12 @@
      * The amount of data, in bytes, that must be kept in the buffer in order
      * to detect delimiters reliably.
      */
-    private final int keepRegion;
+    private int keepRegion;
 
     /**
      * The byte sequence that partitions the stream.
      */
-    private final byte[] boundary;
+    private byte[] boundary;
 
     /**
      * The length of the buffer used for processing the request.
@@ -334,7 +334,7 @@
         }
 
         this.input = input;
-        this.bufSize = Math.max(bufSize, boundaryLength*2);
+        this.bufSize = Math.max(bufSize, boundaryLength * 2);
         this.buffer = new byte[this.bufSize];
         this.notifier = pNotifier;
 
@@ -589,7 +589,8 @@
      */
     public int readBodyData(OutputStream output)
             throws MalformedStreamException, IOException {
-        return (int) Streams.copy(newInputStream(), output, false); // N.B. Streams.copy closes the input stream
+        final InputStream istream = newInputStream();
+        return (int) Streams.copy(istream, output, false);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/fileupload/ParameterParser.java b/src/main/java/org/apache/commons/fileupload/ParameterParser.java
index 30676e8..3db521a 100644
--- a/src/main/java/org/apache/commons/fileupload/ParameterParser.java
+++ b/src/main/java/org/apache/commons/fileupload/ParameterParser.java
@@ -78,8 +78,8 @@
     /**
      * Are there any characters left to parse?
      *
-     * @return {@code true} if there are unparsed characters,
-     *         {@code false} otherwise.
+     * @return <tt>true</tt> if there are unparsed characters,
+     *         <tt>false</tt> otherwise.
      */
     private boolean hasChar() {
         return this.pos < this.len;
@@ -90,8 +90,8 @@
      * leading and trailing blanks as well as enclosing quotation marks,
      * when necessary.
      *
-     * @param quoted {@code true} if quotation marks are expected,
-     *               {@code false} otherwise.
+     * @param quoted <tt>true</tt> if quotation marks are expected,
+     *               <tt>false</tt> otherwise.
      * @return the token
      */
     private String getToken(boolean quoted) {
@@ -124,8 +124,8 @@
      * @param ch the character to test for presense in the array of characters
      * @param charray the array of characters to test against
      *
-     * @return {@code true} if the character is present in the array of
-     *   characters, {@code false} otherwise.
+     * @return <tt>true</tt> if the character is present in the array of
+     *   characters, <tt>false</tt> otherwise.
      */
     private boolean isOneOf(char ch, final char[] charray) {
         boolean result = false;
@@ -195,12 +195,12 @@
     }
 
     /**
-     * Returns {@code true} if parameter names are to be converted to lower
+     * Returns <tt>true</tt> if parameter names are to be converted to lower
      * case when name/value pairs are parsed.
      *
-     * @return {@code true} if parameter names are to be
+     * @return <tt>true</tt> if parameter names are to be
      * converted to lower case when name/value pairs are parsed.
-     * Otherwise returns {@code false}
+     * Otherwise returns <tt>false</tt>
      */
     public boolean isLowerCaseNames() {
         return this.lowerCaseNames;
@@ -210,9 +210,9 @@
      * Sets the flag if parameter names are to be converted to lower case when
      * name/value pairs are parsed.
      *
-     * @param b {@code true} if parameter names are to be
+     * @param b <tt>true</tt> if parameter names are to be
      * converted to lower case when name/value pairs are parsed.
-     * {@code false} otherwise.
+     * <tt>false</tt> otherwise.
      */
     public void setLowerCaseNames(boolean b) {
         this.lowerCaseNames = b;
diff --git a/src/main/java/org/apache/commons/fileupload/disk/DiskFileItem.java b/src/main/java/org/apache/commons/fileupload/disk/DiskFileItem.java
index 3cc45a0..779e47b 100644
--- a/src/main/java/org/apache/commons/fileupload/disk/DiskFileItem.java
+++ b/src/main/java/org/apache/commons/fileupload/disk/DiskFileItem.java
@@ -16,8 +16,10 @@
  */
 package org.apache.commons.fileupload.disk;
 
-import static java.lang.String.*;
+import static java.lang.String.format;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -37,7 +39,6 @@
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.ParameterParser;
 import org.apache.commons.fileupload.util.Streams;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.DeferredFileOutputStream;
 
@@ -296,12 +297,11 @@
      * contents of the file were not yet cached in memory, they will be
      * loaded from the disk storage and cached.
      *
-     * @return The contents of the file as an array of bytes
-     * or {@code null} if the data cannot be read
+     * @return The contents of the file as an array of bytes.
      */
     public byte[] get() {
         if (isInMemory()) {
-            if (cachedContent == null && dfos != null) {
+            if (cachedContent == null) {
                 cachedContent = dfos.getData();
             }
             return cachedContent;
@@ -311,12 +311,18 @@
         InputStream fis = null;
 
         try {
-            fis = new FileInputStream(dfos.getFile());
-            IOUtils.readFully(fis, fileData);
+            fis = new BufferedInputStream(new FileInputStream(dfos.getFile()));
+            fis.read(fileData);
         } catch (IOException e) {
             fileData = null;
         } finally {
-            IOUtils.closeQuietly(fis);
+            if (fis != null) {
+                try {
+                    fis.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
         }
 
         return fileData;
@@ -387,9 +393,10 @@
             try {
                 fout = new FileOutputStream(file);
                 fout.write(get());
-                fout.close();
             } finally {
-            	IOUtils.closeQuietly(fout);
+                if (fout != null) {
+                    fout.close();
+                }
             }
         } else {
             File outputFile = getStoreLocation();
@@ -401,7 +408,32 @@
                  * in a temporary location so move it to the
                  * desired file.
                  */
-                FileUtils.moveFile(outputFile, file);
+                if (!outputFile.renameTo(file)) {
+                    BufferedInputStream in = null;
+                    BufferedOutputStream out = null;
+                    try {
+                        in = new BufferedInputStream(
+                            new FileInputStream(outputFile));
+                        out = new BufferedOutputStream(
+                                new FileOutputStream(file));
+                        IOUtils.copy(in, out);
+                    } finally {
+                        if (in != null) {
+                            try {
+                                in.close();
+                            } catch (IOException e) {
+                                // ignore
+                            }
+                        }
+                        if (out != null) {
+                            try {
+                                out.close();
+                            } catch (IOException e) {
+                                // ignore
+                            }
+                        }
+                    }
+                }
             } else {
                 /*
                  * For whatever reason we cannot write the
@@ -486,7 +518,7 @@
      * be used for storing the contents of the file.
      *
      * @return An {@link java.io.OutputStream OutputStream} that can be used
-     *         for storing the contents of the file.
+     *         for storing the contensts of the file.
      *
      * @throws IOException if an error occurs.
      */
@@ -518,9 +550,6 @@
         if (dfos == null) {
             return null;
         }
-        if (isInMemory()) {
-        	return null;
-        }
         return dfos.getFile();
     }
 
@@ -531,9 +560,6 @@
      */
     @Override
     protected void finalize() {
-        if (dfos == null) {
-            return;
-        }
         File outputFile = dfos.getFile();
 
         if (outputFile != null && outputFile.exists()) {
@@ -546,9 +572,6 @@
      * named temporary file in the configured repository path. The lifetime of
      * the file is tied to the lifetime of the <code>FileItem</code> instance;
      * the file will be deleted when the instance is garbage collected.
-     * <p>
-     * <b>Note: Subclasses that override this method must ensure that they return the
-     * same File each time.</b>
      *
      * @return The {@link java.io.File File} to be used for temporary storage.
      */
@@ -570,7 +593,7 @@
 
     /**
      * Returns an identifier that is unique within the class loader used to
-     * load this class, but does not have random-like appearance.
+     * load this class, but does not have random-like apearance.
      *
      * @return A String with the non-random looking instance identifier.
      */
@@ -599,6 +622,75 @@
                       Boolean.valueOf(isFormField()), getFieldName());
     }
 
+    // -------------------------------------------------- Serialization methods
+
+    /**
+     * Writes the state of this object during serialization.
+     *
+     * @param out The stream to which the state should be written.
+     *
+     * @throws IOException if an error occurs.
+     */
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        // Read the data
+        if (dfos.isInMemory()) {
+            cachedContent = get();
+        } else {
+            cachedContent = null;
+            dfosFile = dfos.getFile();
+        }
+
+        // write out values
+        out.defaultWriteObject();
+    }
+
+    /**
+     * Reads the state of this object during deserialization.
+     *
+     * @param in The stream from which the state should be read.
+     *
+     * @throws IOException if an error occurs.
+     * @throws ClassNotFoundException if class cannot be found.
+     */
+    private void readObject(ObjectInputStream in)
+            throws IOException, ClassNotFoundException {
+        // read values
+        in.defaultReadObject();
+
+        /* One expected use of serialization is to migrate HTTP sessions
+         * containing a DiskFileItem between JVMs. Particularly if the JVMs are
+         * on different machines It is possible that the repository location is
+         * not valid so validate it.
+         */
+        if (repository != null) {
+            if (repository.isDirectory()) {
+                // Check path for nulls
+                if (repository.getPath().contains("\0")) {
+                    throw new IOException(format(
+                            "The repository [%s] contains a null character",
+                            repository.getPath()));
+                }
+            } else {
+                throw new IOException(format(
+                        "The repository [%s] is not a directory",
+                        repository.getAbsolutePath()));
+            }
+        }
+
+        OutputStream output = getOutputStream();
+        if (cachedContent != null) {
+            output.write(cachedContent);
+        } else {
+            FileInputStream input = new FileInputStream(dfosFile);
+            IOUtils.copy(input, output);
+            dfosFile.delete();
+            dfosFile = null;
+        }
+        output.close();
+
+        cachedContent = null;
+    }
+
     /**
      * Returns the file item headers.
      * @return The file items headers.
diff --git a/src/site/resources/download_fileupload.cgi b/src/site/resources/download_fileupload.cgi
old mode 100755
new mode 100644
diff --git a/src/site/xdoc/download_fileupload.xml b/src/site/xdoc/download_fileupload.xml
index 90bdaf8..ae4a5e6 100644
--- a/src/site/xdoc/download_fileupload.xml
+++ b/src/site/xdoc/download_fileupload.xml
@@ -31,10 +31,21 @@
  | 2) Set the following properties in the component's pom:              |
  |    - commons.componentid (required, alphabetic, lower case)          |
  |    - commons.release.version (required)                              |
- |    - commons.binary.suffix (optional)                                |
+ |    - commons.release.name    (required)                              |
+ |    - commons.binary.suffix   (optional)                              |
  |      (defaults to "-bin", set to "" for pre-maven2 releases)         |
+ |    - commons.release.desc    (optional)                              |
+ |    - commons.release.subdir  (optional)                              |
+ |                                                                      |
+ |    - commons.release.2/3.version       (conditional)                 |
+ |    - commons.release.2/3.name          (conditional)                 |
+ |    - commons.release.2/3.binary.suffix (optional)                    |
+ |    - commons.release.2/3.desc          (optional)                    |
+ |    - commons.release.2/3.subdir        (optional)                    |
  |                                                                      |
  | 3) Example Properties                                                |
+ |    (commons.release.name inherited by parent:                        |
+ |     ${project.artifactId}-${commons.release.version}                 |
  |                                                                      |
  |  <properties>                                                        |
  |    <commons.componentid>math</commons.componentid>                   |
@@ -46,17 +57,17 @@
 <document>
   <properties>
     <title>Download Apache Commons FileUpload</title>
-    <author email="dev@commons.apache.org">Commons Documentation Team</author>
+    <author email="dev@commons.apache.org">Apache Commons Documentation Team</author>
   </properties>
   <body>
     <section name="Download Apache Commons FileUpload">
     <subsection name="Using a Mirror">
       <p>
         We recommend you use a mirror to download our release
-        builds, but you <strong>must</strong> verify the integrity of
+        builds, but you <strong>must</strong> <a href="http://www.apache.org/info/verification.html">verify the integrity</a> of
         the downloaded files using signatures downloaded from our main
         distribution directories. Recent releases (48 hours) may not yet
-        be available from the mirrors.
+        be available from all the mirrors.
       </p>
 
       <p>
@@ -88,39 +99,44 @@
       </form>
 
       <p>
-        The <a href="http://www.apache.org/dist/commons/KEYS">KEYS</a>
-        link links to the code signing keys used to sign the product.
-        The <code>PGP</code> link downloads the OpenPGP compatible signature from our main site.
-        The <code>MD5</code> link downloads the checksum from the main site.
+        It is essential that you
+        <a href="https://www.apache.org/info/verification.html">verify the integrity</a>
+        of downloaded files, preferably using the <code>PGP</code> signature (<code>*.asc</code> files);
+        failing that using the <code>MD5</code> hash (<code>*.md5</code> checksum files).
+      </p>
+      <p>
+        The <a href="https://www.apache.org/dist/commons/KEYS">KEYS</a>
+        file contains the public PGP keys used by Apache Commons developers
+        to sign releases.
       </p>
     </subsection>
     </section>
-    <section name="Apache Commons FileUpload 1.3.1 (requires Java 1.5 or later)">
+    <section name="Apache Commons FileUpload 1.3.2 ">
       <subsection name="Binaries">
         <table>
           <tr>
-              <td><a href="[preferred]/commons/fileupload/binaries/commons-fileupload-1.3.1-bin.tar.gz">commons-fileupload-1.3.1-bin.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.1-bin.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.1-bin.tar.gz.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/fileupload/binaries/commons-fileupload-1.3.2-bin.tar.gz">commons-fileupload-1.3.2-bin.tar.gz</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.2-bin.tar.gz.md5">md5</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.2-bin.tar.gz.asc">pgp</a></td>
           </tr>
           <tr>
-              <td><a href="[preferred]/commons/fileupload/binaries/commons-fileupload-1.3.1-bin.zip">commons-fileupload-1.3.1-bin.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.1-bin.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.1-bin.zip.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/fileupload/binaries/commons-fileupload-1.3.2-bin.zip">commons-fileupload-1.3.2-bin.zip</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.2-bin.zip.md5">md5</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/binaries/commons-fileupload-1.3.2-bin.zip.asc">pgp</a></td>
           </tr>
         </table>
       </subsection>
       <subsection name="Source">
         <table>
           <tr>
-              <td><a href="[preferred]/commons/fileupload/source/commons-fileupload-1.3.1-src.tar.gz">commons-fileupload-1.3.1-src.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.1-src.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.1-src.tar.gz.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/fileupload/source/commons-fileupload-1.3.2-src.tar.gz">commons-fileupload-1.3.2-src.tar.gz</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.2-src.tar.gz.md5">md5</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.2-src.tar.gz.asc">pgp</a></td>
           </tr>
           <tr>
-              <td><a href="[preferred]/commons/fileupload/source/commons-fileupload-1.3.1-src.zip">commons-fileupload-1.3.1-src.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.1-src.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.1-src.zip.asc">pgp</a></td>
+              <td><a href="[preferred]/commons/fileupload/source/commons-fileupload-1.3.2-src.zip">commons-fileupload-1.3.2-src.zip</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.2-src.zip.md5">md5</a></td>
+              <td><a href="https://www.apache.org/dist/commons/fileupload/source/commons-fileupload-1.3.2-src.zip.asc">pgp</a></td>
           </tr>
         </table>
       </subsection>
@@ -131,7 +147,7 @@
         </p>
         <ul>
           <li class="download"><a href="[preferred]/commons/fileupload/">browse download area</a></li>
-          <li><a href="http://archive.apache.org/dist/commons/fileupload/">archives...</a></li>
+          <li><a href="https://archive.apache.org/dist/commons/fileupload/">archives...</a></li>
         </ul>
     </section>
   </body>
diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml
index b4315de..1a99d22 100644
--- a/src/site/xdoc/index.xml
+++ b/src/site/xdoc/index.xml
@@ -67,22 +67,16 @@
 
     <section name="Downloading">
       <subsection name="Full Releases">
-        <p><strong>FileUpload 1.3.1</strong> - 7 February 2014</p>
+        <p><strong>FileUpload 1.3</strong> - 27 March 2013</p>
         <ul>
           <li>Download the binary and source distributions from a mirror site
             <a href="http://commons.apache.org/fileupload/download_fileupload.cgi">here</a>
           </li>
         </ul>
-        <p><strong>FileUpload 1.3</strong> - 27 March 2013</p>
-        <ul>
-          <li>Download the binary and source distributions from the archive site
-            <a href="http://archive.apache.org/dist/commons/fileupload/">here</a>
-          </li>
-        </ul>
         <p><strong>FileUpload 1.2.2</strong> - 29 July 2010</p>
         <ul>
-          <li>Download the binary and source distributions from the archive site
-            <a href="http://archive.apache.org/dist/commons/fileupload/">here</a>
+          <li>Download the binary and source distributions from a mirror site
+            <a href="http://commons.apache.org/fileupload/download_fileupload.cgi">here</a>
           </li>
         </ul>
         <p><strong>FileUpload 1.2.1</strong> - 18 January 2008</p>
diff --git a/src/site/xdoc/streaming.xml b/src/site/xdoc/streaming.xml
index 5f2dd86..2c2cd10 100644
--- a/src/site/xdoc/streaming.xml
+++ b/src/site/xdoc/streaming.xml
@@ -68,7 +68,7 @@
 while (iter.hasNext()) {
     FileItemStream item = iter.next();
     String name = item.getFieldName();
-    InputStream stream = item.getInputStream();
+    InputStream stream = item.openStream();
     if (item.isFormField()) {
         System.out.println("Form field " + name + " with value "
             + Streams.asString(stream) + " detected.");
diff --git a/src/site/xdoc/using.xml b/src/site/xdoc/using.xml
index 410ea57..8e2113b 100644
--- a/src/site/xdoc/using.xml
+++ b/src/site/xdoc/using.xml
@@ -284,8 +284,8 @@
       </p>
       <p>
         Such temporary files are deleted automatically, if they are no longer
-        used (more precisely, if the corresponding instance of <code>DiskFileItem</code>
-        is garbage collected. This is done silently by the <code>org.apache.commons.io.FileCleanerTracker</code>
+        used (more precisely, if the corresponding instance of <code>java.io.File</code>
+        is garbage collected. This is done silently by the <code>org.apache.commons.io.FileCleaner</code>
         class, which starts a reaper thread.
       </p>
       <p>
diff --git a/src/test/java/org/apache/commons/fileupload/DiskFileItemSerializeTest.java b/src/test/java/org/apache/commons/fileupload/DiskFileItemSerializeTest.java
index e296d73..e823f74 100644
--- a/src/test/java/org/apache/commons/fileupload/DiskFileItemSerializeTest.java
+++ b/src/test/java/org/apache/commons/fileupload/DiskFileItemSerializeTest.java
@@ -31,10 +31,6 @@
 import java.io.OutputStream;
 
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -45,27 +41,6 @@
  */
 public class DiskFileItemSerializeTest {
 
-    // Use a private repo to catch any files left over by tests
-    private static final File REPO = new File(System.getProperty("java.io.tmpdir"), "diskfileitemrepo");
-
-    @Before
-    public void setUp() throws Exception {
-        if (REPO.exists()) {
-            FileUtils.deleteDirectory(REPO);
-        }
-        assertFalse("Must not exist", REPO.exists());
-        REPO.mkdir();
-    }
-
-    @After
-    public void tearDown() {
-        for(File file : FileUtils.listFiles(REPO, null, true)) {
-            System.out.println("Found leftover file " + file);
-        }
-        REPO.delete();
-        assertFalse(REPO + " is not empty", REPO.exists());
-    }
-
     /**
      * Content type for regular form items.
      */
@@ -102,7 +77,7 @@
      * Helper method to test creation of a field.
      */
     private void testInMemoryObject(byte[] testFieldValueBytes) {
-        testInMemoryObject(testFieldValueBytes, REPO);
+        testInMemoryObject(testFieldValueBytes, null);
     }
     
     /**
@@ -150,10 +125,7 @@
         compareBytes("Check", testFieldValueBytes, newItem.get());
 
         // Compare FileItem's (except byte[])
-        compareFileItems(item, newItem); 
-        
-        item.delete();
-        newItem.delete();
+        compareFileItems(item, newItem);
     }
     
     /**
@@ -163,7 +135,8 @@
     public void testValidRepository() throws Exception {
         // Create the FileItem
         byte[] testFieldValueBytes = createContentBytes(threshold);
-        testInMemoryObject(testFieldValueBytes, REPO);
+        File repository = new File(System.getProperty("java.io.tmpdir"));
+        testInMemoryObject(testFieldValueBytes, repository);
     }
     
     /**
@@ -173,7 +146,7 @@
     public void testInvalidRepository() throws Exception {
         // Create the FileItem
         byte[] testFieldValueBytes = createContentBytes(threshold);
-        File repository = new File(System.getProperty("java.io.tmpdir"), "file");
+        File repository = new File(System.getProperty("java.io.tmpdir") + "file");
         FileItem item = createFileItem(testFieldValueBytes, repository);
         deserialize(serialize(item));
     }
@@ -185,7 +158,7 @@
     public void testInvalidRepositoryWithNullChar() throws Exception {
         // Create the FileItem
         byte[] testFieldValueBytes = createContentBytes(threshold);
-        File repository = new File(System.getProperty("java.io.tmpdir"), "\0");
+        File repository = new File(System.getProperty("java.io.tmpdir") + "\0");
         FileItem item = createFileItem(testFieldValueBytes, repository);
         deserialize(serialize(item));
     }
@@ -258,7 +231,7 @@
      * Create a FileItem with the specfied content bytes.
      */
     private FileItem createFileItem(byte[] contentBytes) {
-        return createFileItem(contentBytes, REPO);
+        return createFileItem(contentBytes, null);
     }
     
     /**
@@ -306,7 +279,7 @@
         } catch (Exception e) {
             fail("Exception during deserialization: " + e);
         }
-        IOUtils.closeQuietly(baos);
+        
         return result;
     }
 
diff --git a/src/test/java/org/apache/commons/fileupload/ProgressListenerTest.java b/src/test/java/org/apache/commons/fileupload/ProgressListenerTest.java
index 6de848d..884f8f8 100644
--- a/src/test/java/org/apache/commons/fileupload/ProgressListenerTest.java
+++ b/src/test/java/org/apache/commons/fileupload/ProgressListenerTest.java
@@ -120,7 +120,6 @@
                 }
             }
             assertEquals(-1, istream.read());
-            istream.close();
         }
         assertTrue(!iter.hasNext());
         listener.checkFinished();
diff --git a/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java b/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java
index 09a4454..27c1ec8 100644
--- a/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java
+++ b/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java
@@ -396,43 +396,6 @@
         assertEquals(2, mappedParameters.get("multi").size());
     }
 
-    /**
-     * Test for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-239">FILEUPLOAD-239</a>
-     */
-    @Test
-    public void testContentTypeAttachment()
-            throws IOException, FileUploadException {
-        List<FileItem> fileItems = parseUpload(
-        		"-----1234\r\n" +
-        		"content-disposition: form-data; name=\"field1\"\r\n" +
-        		"\r\n" +
-        		"Joe Blow\r\n" +
-        		"-----1234\r\n" +
-        		"content-disposition: form-data; name=\"pics\"\r\n" +
-        		"Content-type: multipart/mixed, boundary=---9876\r\n" +
-        		"\r\n" +
-        		"-----9876\r\n" +
-        		"Content-disposition: attachment; filename=\"file1.txt\"\r\n" +
-        		"Content-Type: text/plain\r\n" +
-        		"\r\n" + 
-        		"... contents of file1.txt ...\r\n" +
-        		"-----9876--\r\n" +
-        		"-----1234--\r\n");        				
-        assertEquals(2, fileItems.size());
-
-        FileItem field = fileItems.get(0);
-        assertEquals("field1", field.getFieldName());
-        assertTrue(field.isFormField());
-        assertEquals("Joe Blow", field.getString());
-
-        FileItem file = fileItems.get(1);
-        assertEquals("pics", file.getFieldName());
-        assertFalse(file.isFormField());
-        assertEquals("... contents of file1.txt ...", file.getString());
-        assertEquals("text/plain", file.getContentType());
-        assertEquals("file1.txt", file.getName());
-    }
-
     private void assertHeaders(String[] pHeaderNames, String[] pHeaderValues,
                                FileItem pItem, int pIndex) {
         for (int i = 0;  i < pHeaderNames.length;  i++) {
diff --git a/src/test/java/org/apache/commons/fileupload/SizesTest.java b/src/test/java/org/apache/commons/fileupload/SizesTest.java
index 064f413..a2a6536 100644
--- a/src/test/java/org/apache/commons/fileupload/SizesTest.java
+++ b/src/test/java/org/apache/commons/fileupload/SizesTest.java
@@ -255,11 +255,12 @@
         assertEquals("file1", item.getFieldName());
         assertEquals("foo1.tab", item.getName());
 
-        {
-            @SuppressWarnings("resource") // Streams.copy closes the input file
+        try {
             InputStream stream = item.openStream();
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             Streams.copy(stream, baos, true);
+        } catch (FileUploadIOException e) {
+            fail(e.getMessage());
         }
 
         // the second item is over the size max, thus we expect an error
@@ -273,7 +274,6 @@
         item = it.next();
 
         try {
-            @SuppressWarnings("resource") // Streams.copy closes the input file
             InputStream stream = item.openStream();
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             Streams.copy(stream, baos, true);
