--- modules/field/field.crud.inc
+++ modules/field/field.crud.inc
@@ -524,13 +524,18 @@ function field_read_fields($params = array(), $include_additional = array()) {
   foreach ($params as $key => $value) {
     $query->condition($key, $value);
   }
-  if (!isset($include_additional['include_inactive']) || !$include_additional['include_inactive']) {
+  /* When a module gets disabled, all its defined fields gets inactive and the
+   * cache get cleared. So field_read_field gets cleared and rebuild which
+   * sets the module fields as deleted
+   *
+   * This way, a field could be deleted AND inactive, so we should not add
+   * an inactive = 1 condition if include_deleted is setted */
+  if (empty($include_additional['include_inactive']) && empty($include_additional['include_deleted'])) {
     $query
       ->condition('fc.active', 1)
       ->condition('fc.storage_active', 1);
   }
-  $include_deleted = (isset($include_additional['include_deleted']) && $include_additional['include_deleted']);
-  if (!$include_deleted) {
+  if (empty($include_additional['include_deleted'])) {
     $query->condition('fc.deleted', 0);
   }

@@ -560,7 +565,7 @@ function field_read_fields($params = array(), $include_additional = array()) {
     $field['columns'] = $schema['columns'];

     $field_name = $field['field_name'];
-    if ($include_deleted) {
+    if (!empty($include_additional['include_deleted'])){
       $field_name = $field['id'];
     }
     $fields[$field_name] = $field;
--- modules/field/tests/field.test
+++ modules/field/tests/field.test
@@ -2118,6 +2118,32 @@ class FieldCrudTestCase extends FieldTestCase {
   }

   /**
+   * Test create field on module install.
+   */
+  function testCreateInstallField() {
+    $web_user = $this->drupalCreateUser(array('bypass node access', 'administer content types', 'administer modules'));
+    $this->drupalLogin($web_user);
+    $field_test_key = 'modules[Testing][field_test][enable]';
+    $field_test_enable = array($field_test_key => "1");
+    $field_test_disable = array($field_test_key => FALSE);
+
+    // Enable poll and verify that the node type is in the DB and is not
+    // disabled.
+    $this->drupalPost('admin/modules', $field_test_enable, t('Save configuration'));
+
+    // Then we should disable/uninstall it
+    $this->drupalPost('admin/modules', $field_test_disable, t('Save configuration'));
+    $edit = array('uninstall[field_test]' => 'field_test');
+    $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
+    $this->drupalPost(NULL, array(), t('Uninstall'));
+
+    // Then we should reenable it
+    $this->drupalPost('admin/modules', $field_test_enable, t('Save configuration'));
+    // The full error is :"DatabaseSchemaObjectExistsException: Table <em class="placeholder">field_data_field_test_test_field</em> already exists. in DatabaseSchema->createTable() (line __LINE__ of __FILE__)."
+    $this->assertNoText('DatabaseSchemaObjectExistsException', t('The field has correctly been deleted then reinserted'));
+  }
+
+  /**
    * Test field type modules forbidding an update.
    */
   function testUpdateFieldForbid() {
--- modules/field/tests/field_test.install
+++ modules/field/tests/field_test.install
@@ -15,6 +15,11 @@ function field_test_install() {
     ->fields(array('weight' => 1))
     ->condition('name', 'field_test')
     ->execute();
+
+  field_associate_fields('field_test');
+  foreach (_field_test_installed_fields() as $field) {
+    field_create_field($field);
+  }
 }

 /**
@@ -142,3 +147,26 @@ function field_test_field_schema($field) {
     );
   }
 }
+
+function _field_test_installed_fields() {
+  return array(
+    'field_test_test_field' => array(
+      'field_name'  => 'field_test_test_field',
+      'label'       => 'No Name',
+      'cardinality' => 1,
+      'type'        => 'test_field',
+      'settings'    => array(
+        'max_length' => 12,
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function field_test_uninstall() {
+  foreach (_field_test_installed_fields() as $field) {
+    field_delete_field($field['field_name']);
+  }
+}
