diff --git a/tests/bug639/__init__.py b/tests/admin_autodiscover/__init__.py
similarity index 100%
rename from tests/bug639/__init__.py
rename to tests/admin_autodiscover/__init__.py
diff --git a/tests/bug8245/admin.py b/tests/admin_autodiscover/admin.py
similarity index 100%
rename from tests/bug8245/admin.py
rename to tests/admin_autodiscover/admin.py
diff --git a/tests/bug8245/models.py b/tests/admin_autodiscover/models.py
similarity index 100%
rename from tests/bug8245/models.py
rename to tests/admin_autodiscover/models.py
diff --git a/tests/bug8245/tests.py b/tests/admin_autodiscover/tests.py
similarity index 89%
rename from tests/bug8245/tests.py
rename to tests/admin_autodiscover/tests.py
index 7a91d04af14..af5aebcd7f0 100644
--- a/tests/bug8245/tests.py
+++ b/tests/admin_autodiscover/tests.py
@@ -3,12 +3,12 @@ from unittest import TestCase
 from django.contrib import admin
 
 
-class Bug8245Test(TestCase):
+class AdminAutoDiscoverTests(TestCase):
     """
     Test for bug #8245 - don't raise an AlreadyRegistered exception when using
     autodiscover() and an admin.py module contains an error.
     """
-    def test_bug_8245(self):
+    def test_double_call_autodiscover(self):
         # The first time autodiscover is called, we should get our real error.
         with self.assertRaises(Exception) as cm:
             admin.autodiscover()
diff --git a/tests/bug639/models.py b/tests/bug639/models.py
deleted file mode 100644
index db34532025b..00000000000
--- a/tests/bug639/models.py
+++ /dev/null
@@ -1,31 +0,0 @@
-import os
-import tempfile
-
-from django.core.files.storage import FileSystemStorage
-from django.db import models
-from django.forms import ModelForm
-
-
-temp_storage_dir = tempfile.mkdtemp(dir=os.environ['DJANGO_TEST_TEMP_DIR'])
-temp_storage = FileSystemStorage(temp_storage_dir)
-
-
-class Photo(models.Model):
-    title = models.CharField(max_length=30)
-    image = models.FileField(storage=temp_storage, upload_to='tests')
-
-    # Support code for the tests; this keeps track of how many times save()
-    # gets called on each instance.
-    def __init__(self, *args, **kwargs):
-        super(Photo, self).__init__(*args, **kwargs)
-        self._savecount = 0
-
-    def save(self, force_insert=False, force_update=False):
-        super(Photo, self).save(force_insert, force_update)
-        self._savecount += 1
-
-
-class PhotoForm(ModelForm):
-    class Meta:
-        model = Photo
-        fields = '__all__'
diff --git a/tests/bug639/test.jpg b/tests/bug639/test.jpg
deleted file mode 100644
index 391b57a0f32..00000000000
Binary files a/tests/bug639/test.jpg and /dev/null differ
diff --git a/tests/bug639/tests.py b/tests/bug639/tests.py
deleted file mode 100644
index 26e172ab500..00000000000
--- a/tests/bug639/tests.py
+++ /dev/null
@@ -1,45 +0,0 @@
-"""
-Tests for file field behavior, and specifically #639, in which Model.save()
-gets called *again* for each FileField. This test will fail if calling a
-ModelForm's save() method causes Model.save() to be called more than once.
-"""
-
-import os
-import shutil
-import unittest
-
-from django.core.files.uploadedfile import SimpleUploadedFile
-from django.utils._os import upath
-
-from .models import Photo, PhotoForm, temp_storage_dir
-
-
-class Bug639Test(unittest.TestCase):
-
-    def test_bug_639(self):
-        """
-        Simulate a file upload and check how many times Model.save() gets
-        called.
-        """
-        # Grab an image for testing.
-        filename = os.path.join(os.path.dirname(upath(__file__)), "test.jpg")
-        with open(filename, "rb") as fp:
-            img = fp.read()
-
-        # Fake a POST QueryDict and FILES MultiValueDict.
-        data = {'title': 'Testing'}
-        files = {"image": SimpleUploadedFile('test.jpg', img, 'image/jpeg')}
-
-        form = PhotoForm(data=data, files=files)
-        p = form.save()
-
-        # Check the savecount stored on the object (see the model).
-        self.assertEqual(p._savecount, 1)
-
-    def tearDown(self):
-        """
-        Make sure to delete the "uploaded" file to avoid clogging /tmp.
-        """
-        p = Photo.objects.get()
-        p.image.delete(save=False)
-        shutil.rmtree(temp_storage_dir)
diff --git a/tests/bug8245/__init__.py b/tests/bug8245/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/tests/model_forms/models.py b/tests/model_forms/models.py
index 59b18dc39d6..8936a17fc02 100644
--- a/tests/model_forms/models.py
+++ b/tests/model_forms/models.py
@@ -406,3 +406,19 @@ class Character(models.Model):
 class StumpJoke(models.Model):
     most_recently_fooled = models.ForeignKey(Character, limit_choices_to=today_callable_dict, related_name="+")
     has_fooled_today = models.ManyToManyField(Character, limit_choices_to=today_callable_q, related_name="+")
+
+
+# Model for #639
+class Photo(models.Model):
+    title = models.CharField(max_length=30)
+    image = models.FileField(storage=temp_storage, upload_to='tests')
+
+    # Support code for the tests; this keeps track of how many times save()
+    # gets called on each instance.
+    def __init__(self, *args, **kwargs):
+        super(Photo, self).__init__(*args, **kwargs)
+        self._savecount = 0
+
+    def save(self, force_insert=False, force_update=False):
+        super(Photo, self).save(force_insert, force_update)
+        self._savecount += 1
diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py
index dc912c0cd6e..f05307851fd 100644
--- a/tests/model_forms/tests.py
+++ b/tests/model_forms/tests.py
@@ -22,7 +22,7 @@ from django.utils import six
 from .models import (Article, ArticleStatus, Author, Author1, BetterWriter, BigInt, Book,
     Category, CommaSeparatedInteger, CustomFF, CustomFieldForExclusionModel,
     DerivedBook, DerivedPost, Document, ExplicitPK, FilePathModel, FlexibleDatePost, Homepage,
-    ImprovedArticle, ImprovedArticleWithParentLink, Inventory, Person, Post, Price,
+    ImprovedArticle, ImprovedArticleWithParentLink, Inventory, Person, Photo, Post, Price,
     Product, Publication, TextFile, Triple, Writer, WriterProfile,
     Colour, ColourfulItem, ArticleStatusNote, DateTimePost, CustomErrorMessage,
     test_images, StumpJoke, Character)
@@ -1838,6 +1838,36 @@ class FileAndImageFieldTests(TestCase):
         form = CFFForm(data={'f': None})
         form.save()
 
+    def test_file_field_multiple_save(self):
+        """
+        Simulate a file upload and check how many times Model.save() gets
+        called. Test for bug #639.
+        """
+        class PhotoForm(forms.ModelForm):
+            class Meta:
+                model = Photo
+                fields = '__all__'
+
+        # Grab an image for testing.
+        filename = os.path.join(os.path.dirname(upath(__file__)), "test.png")
+        with open(filename, "rb") as fp:
+            img = fp.read()
+
+        # Fake a POST QueryDict and FILES MultiValueDict.
+        data = {'title': 'Testing'}
+        files = {"image": SimpleUploadedFile('test.png', img, 'image/png')}
+
+        form = PhotoForm(data=data, files=files)
+        p = form.save()
+
+        try:
+            # Check the savecount stored on the object (see the model).
+            self.assertEqual(p._savecount, 1)
+        finally:
+            # Delete the "uploaded" file to avoid clogging /tmp.
+            p = Photo.objects.get()
+            p.image.delete(save=False)
+
     def test_file_path_field_blank(self):
         """
         Regression test for #8842: FilePathField(blank=True)