diff --git a/drafty.module b/drafty.module
index e844072..509db56 100644
--- a/drafty.module
+++ b/drafty.module
@@ -20,7 +20,7 @@ function drafty_module_implements_alter(&$implementations) {
  */
 function drafty_entity_presave($entity, $type) {
   $recursion_level = &drupal_static('drafty_recursion_level', 0);
-  if (!$recursion_level && empty($entity->is_new) && !empty($entity->is_draft_revision)) {
+  if (!$recursion_level && !drafty_entity_is_new($entity, $type) && !empty($entity->is_draft_revision)) {
     // Since this is a draft revision, after saving we want the current,
     // published revision to remain in place in the base entity table and
     // field_data_*() tables. Set the revision to publish once the draft entity
@@ -92,6 +92,24 @@ function drafty() {
 }
 
 /**
+ * Helper function to determine if an entity is new or not.
+ *
+ * The $is_new property cannot be relied on, as not all entities use this. E.g.
+ * files.
+ *
+ * @param mixed $entity
+ *   The entity to check.
+ * @param string $entity_type
+ *   The entity type being passed in.
+ *
+ * @return bool
+ */
+function drafty_entity_is_new($entity, $entity_type) {
+  list($id) = entity_extract_ids($entity_type, $entity);
+  return empty($id);
+}
+
+/**
  * Handles tracking, selecting and publishing revisions.
  */
 class Drafty {
diff --git a/modules/drafty_enforce/drafty_enforce.module b/modules/drafty_enforce/drafty_enforce.module
index 55942ea..edc97fd 100644
--- a/modules/drafty_enforce/drafty_enforce.module
+++ b/modules/drafty_enforce/drafty_enforce.module
@@ -9,9 +9,8 @@
  */
 function drafty_enforce_field_attach_submit($entity_type, $entity, $form, &$form_state) {
   // Only force a draft revision when the entity form is submitted.
-  list($id) = entity_extract_ids($entity_type, $entity);
   $info = entity_get_info();
-  if (!empty($info[$entity_type]['entity keys']['revision']) && !empty($id)) {
+  if (!empty($info[$entity_type]['entity keys']['revision']) && drafty_entity_is_new($entity, $entity_type)) {
     $entity->is_draft_revision = TRUE;
   }
 }
