diff --git a/src/github.com/turt2live/matrix-media-repo/services/media_service.go b/src/github.com/turt2live/matrix-media-repo/services/media_service.go
index 5e65559d89ee23310c2f28572ce3ddc5fd8f7a7e..c983d9b92ea49c6d0a72403434f720c98639de7e 100644
--- a/src/github.com/turt2live/matrix-media-repo/services/media_service.go
+++ b/src/github.com/turt2live/matrix-media-repo/services/media_service.go
@@ -34,23 +34,38 @@ func (s *MediaService) GetMedia(server string, mediaId string) (types.Media, err
 			}
 		}
 
-		s.i.Log.Info("Attempting to download remote media")
-		downloader := &handlers.RemoteMediaDownloader{
-			Info:       s.i,
-			MediaStore: *s.store,
-		}
+		return s.downloadRemoteMedia(server, mediaId)
+	}
 
-		downloaded, err := downloader.Download(server, mediaId)
-		if err != nil {
-			return types.Media{}, err
+	exists, err := util.FileExists(media.Location)
+	if !exists || err != nil {
+		if util.IsServerOurs(server, s.i.Config) {
+			s.i.Log.Error("Media not found in file store when we expected it to")
+			return media, util.ErrMediaNotFound
+		} else {
+			s.i.Log.Warn("Media appears to have been deleted - redownloading")
+			return s.downloadRemoteMedia(server, mediaId)
 		}
-
-		return s.StoreMedia(downloaded.Contents, downloaded.ContentType, downloaded.DesiredFilename, "", server, mediaId)
 	}
 
 	return media, nil
 }
 
+func (s *MediaService) downloadRemoteMedia(server string, mediaId string) (types.Media, error) {
+	s.i.Log.Info("Attempting to download remote media")
+	downloader := &handlers.RemoteMediaDownloader{
+		Info:       s.i,
+		MediaStore: *s.store,
+	}
+
+	downloaded, err := downloader.Download(server, mediaId)
+	if err != nil {
+		return types.Media{}, err
+	}
+
+	return s.StoreMedia(downloaded.Contents, downloaded.ContentType, downloaded.DesiredFilename, "", server, mediaId)
+}
+
 func (s *MediaService) UploadMedia(contents io.Reader, contentType string, filename string, userId string, host string) (types.Media, error) {
 	data := io.LimitReader(contents, s.i.Config.Uploads.MaxSizeBytes)
 	return s.StoreMedia(data, contentType, filename, userId, host, "")
@@ -88,9 +103,6 @@ func (s *MediaService) StoreMedia(contents io.Reader, contentType string, filena
 
 	// If there's at least one record, then we have a duplicate hash - try and process it
 	if len(records) > 0 {
-		// We can delete the file - it's already duplicated at this point
-		defer os.Remove(fileLocation)
-
 		// See if we one of the duplicate records is a match for the host and media ID. We'll otherwise use
 		// the last duplicate (should only be 1 anyways) as our starting point for a new record.
 		var media types.Media
@@ -107,6 +119,7 @@ func (s *MediaService) StoreMedia(contents io.Reader, contentType string, filena
 					log.Info("Match found for media based on host and media ID. Returning unaltered media record.")
 				}
 
+				overwriteExistingOrDeleteTempFile(fileLocation, media)
 				return media, nil
 			}
 
@@ -127,6 +140,7 @@ func (s *MediaService) StoreMedia(contents io.Reader, contentType string, filena
 			return types.Media{}, err
 		}
 
+		overwriteExistingOrDeleteTempFile(fileLocation, media)
 		return media, nil
 	}
 
@@ -169,3 +183,15 @@ func generateMediaId() string {
 
 	return str
 }
+
+func overwriteExistingOrDeleteTempFile(tempFileLocation string, media types.Media) {
+	// If the media's file exists, we'll delete the temp file
+	// If the media's file doesn't exist, we'll move the temp file to where the media expects it to be
+	exists, err := util.FileExists(media.Location)
+	if err != nil || !exists {
+		// We'll assume an error means it doesn't exist
+		os.Rename(tempFileLocation, media.Location)
+	} else {
+		os.Remove(tempFileLocation)
+	}
+}