diff --git a/multifield.module b/multifield.module
index 1de21b6..2fa8a16 100644
--- a/multifield.module
+++ b/multifield.module
@@ -248,7 +248,7 @@ function multifield_type_get_fields($machine_name) {
 function multifield_get_subfields() {
   $subfields = &drupal_static(__FUNCTION__);
 
-  if (!isset($fields)) {
+  if (!isset($subfields)) {
     if ($cached = cache_get('field_info:multifield:subfields', 'cache_field')) {
       $subfields = $cached->data;
     }
@@ -256,7 +256,7 @@ function multifield_get_subfields() {
       $subfields = array();
       $results = db_query("SELECT fci.bundle, fci.field_name FROM {field_config_instance} fci INNER JOIN {field_config} fc ON fc.id = fci.field_id WHERE fc.active = 1 AND fc.storage_active = 1 AND fc.deleted = 0 AND fci.deleted = 0 AND fci.entity_type = 'multifield'")->fetchAll();
       foreach ($results as $result) {
-        if (isset($subfields[$result->bundle])) {
+        if (!isset($subfields[$result->bundle])) {
           $subfields[$result->bundle] = array();
         }
         $subfields[$result->bundle][] = $result->field_name;
@@ -296,6 +296,24 @@ function multifield_type_get_subfields($machine_name) {
   return isset($subfields[$machine_name]) ? $subfields[$machine_name] : array();
 }
 
+/**
+ * Implements hook_field_create_field().
+ */
+function multifield_field_create_field($field) {
+  if ($field['module'] == 'multifield') {
+    multifield_cache_clear();
+  }
+}
+
+/**
+ * Implements hook_field_create_instance().
+ */
+function multifield_field_create_instance($instance) {
+  if ($instance['entity_type'] == 'multifield') {
+    multifield_cache_clear();
+  }
+}
+
 function _multifield_field_item_to_entity($machine_name, array $item, array $additional = array()) {
   $pseudo_entity = new stdClass();
   $pseudo_entity->id = !empty($item['id']) ? $item['id'] : NULL;
diff --git a/tests/MultifieldUnitTestCase.test b/tests/MultifieldUnitTestCase.test
index 3bb8297..25a3090 100644
--- a/tests/MultifieldUnitTestCase.test
+++ b/tests/MultifieldUnitTestCase.test
@@ -12,7 +12,7 @@ class MultifieldUnitTestCase extends DrupalWebTestCase {
   }
 
   public function setUp() {
-    parent::setUp(array('multifield'));
+    parent::setUp(array('field_test', 'multifield'));
   }
 
   public function testApis() {
@@ -22,7 +22,7 @@ class MultifieldUnitTestCase extends DrupalWebTestCase {
     $this->assertIdentical(multifield_get_subfields(), array());
     $this->assertIdentical(multifield_type_has_subfields('test'), FALSE);
     $this->assertIdentical(multifield_type_get_subfields('test'), array());
-    $this->assertIdentical(field_info_field_types('test'), NULL);
+    $this->assertFalse(field_info_field_types('test'), NULL);
     $schema = module_invoke('multifield', 'field_schema', array('type' => 'test'));
     $this->assertIdentical($schema, array());
 
@@ -39,10 +39,124 @@ class MultifieldUnitTestCase extends DrupalWebTestCase {
     $this->assertIdentical(multifield_get_subfields(), array());
     $this->assertIdentical(multifield_type_has_subfields('test'), FALSE);
     $this->assertIdentical(multifield_type_get_subfields('test'), array());
-    $this->assertIdentical(field_info_field_types('test'), NULL);
+    $this->assertFalse(field_info_field_types('test'), NULL);
     $schema = module_invoke('multifield', 'field_schema', array('type' => 'test'));
     $this->assertIdentical($schema, array());
 
+    $field_name1 = 'field_test_field_1';
+    $field1 = array(
+      'field_name' => $field_name1,
+      'type' => 'test_field',
+      'cardinality' => 4,
+    );
+    $field1 = field_create_field($field1);
+    $instance1 = array(
+      'field_name' => $field_name1,
+      'entity_type' => 'multifield',
+      'bundle' => 'test',
+      'label' => $field_name1 . '_label',
+      'description' => $field_name1 . '_description',
+      'weight' => mt_rand(0, 127),
+      'settings' => array(
+        'test_instance_setting' => $this->randomName(),
+      ),
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'label' => 'Test Field',
+        'settings' => array(
+          'test_widget_setting' => $this->randomName(),
+        ),
+      ),
+    );
+    field_create_instance($instance1);
+
+    $this->assertIdentical(multifield_get_fields(), array());
+    $this->assertIdentical(multifield_type_has_fields('test'), FALSE);
+    $this->assertIdentical(multifield_type_get_fields('test'), array());
+    $this->assertIdentical(multifield_get_subfields(), array('test' => array($field_name1)));
+    $this->assertIdentical(multifield_type_has_subfields('test'), TRUE);
+    $this->assertIdentical(multifield_type_get_subfields('test'), array($field_name1));
+    $this->assertTrue(field_info_field_types('test'));
+    $schema = module_invoke('multifield', 'field_schema', array('type' => 'test'));
+    $this->assertIdentical($schema, array(
+      'columns' => array(
+        $field_name1 . '_value' => array(
+          'type' => 'int',
+          'size' => 'medium',
+          'not null' => FALSE,
+        ),
+        'id' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+      ),
+      'indexes' => array(
+        $field_name1 . '_value' => array($field_name1 . '_value'),
+        'id' => array('id'),
+      ),
+    ));
+
+    $field_name2 = 'field_test_field_2';
+    $field2 = array(
+      'field_name' => $field_name2,
+      'type' => 'test_field',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    );
+    $field2 = field_create_field($field2);
+    $instance2 = array(
+      'field_name' => $field_name2,
+      'entity_type' => 'multifield',
+      'bundle' => 'test',
+      'label' => $field_name2 . '_label',
+      'description' => $field_name2 . '_description',
+      'weight' => mt_rand(0, 127),
+      'settings' => array(
+        'test_instance_setting' => $this->randomName(),
+      ),
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'label' => 'Test Field',
+        'settings' => array(
+          'test_widget_setting' => $this->randomName(),
+        ),
+      ),
+    );
+    field_create_instance($instance2);
+
+    $this->assertIdentical(multifield_get_fields(), array());
+    $this->assertIdentical(multifield_type_has_fields('test'), FALSE);
+    $this->assertIdentical(multifield_type_get_fields('test'), array());
+    $this->assertIdentical(multifield_get_subfields(), array('test' => array($field_name1, $field_name2)));
+    $this->assertIdentical(multifield_type_has_subfields('test'), TRUE);
+    $this->assertIdentical(multifield_type_get_subfields('test'), array($field_name1, $field_name2));
+    $this->assertTrue(field_info_field_types('test'));
+    $schema = module_invoke('multifield', 'field_schema', array('type' => 'test'));
+    $this->assertIdentical($schema, array(
+      'columns' => array(
+        $field_name1 . '_value' => array(
+          'type' => 'int',
+          'size' => 'medium',
+          'not null' => FALSE,
+        ),
+        $field_name2 . '_value' => array(
+          'type' => 'int',
+          'size' => 'medium',
+          'not null' => FALSE,
+        ),
+        'id' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+      ),
+      'indexes' => array(
+        $field_name1 . '_value' => array($field_name1 . '_value'),
+        $field_name2 . '_value' => array($field_name2 . '_value'),
+        'id' => array('id'),
+      ),
+    ));
+
     multifield_delete($multifield);
 
     $this->assertIdentical(multifield_get_fields(), array());
@@ -51,7 +165,7 @@ class MultifieldUnitTestCase extends DrupalWebTestCase {
     $this->assertIdentical(multifield_get_subfields(), array());
     $this->assertIdentical(multifield_type_has_subfields('test'), FALSE);
     $this->assertIdentical(multifield_type_get_subfields('test'), array());
-    $this->assertIdentical(field_info_field_types('test'), NULL);
+    $this->assertFalse(field_info_field_types('test'));
     $schema = module_invoke('multifield', 'field_schema', array('type' => 'test'));
     $this->assertIdentical($schema, array());
   }
