diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index b5254fa..ec728aa 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -217,6 +217,85 @@ function facetapi_get_settings_path($searcher, $realm_name, $facet_name, $op) {
 }
 
 /**
+ * Returns array of widget definitions available to the facet.
+ *
+ * @param array $realm
+ *   The realm definition.
+ * @param array $facet
+ *   The facet definition.
+ *
+ * @return array
+ *   An array of available widget plugins.
+ */
+function facetapi_get_widgets(array $realm, array $facet) {
+  $plugins = array();
+
+  // Iterates over all defined plugins.
+  foreach (ctools_get_plugins('facetapi', 'widgets') as $id => $plugin) {
+    $append = TRUE;
+
+    // Initializes the requirements if empty.
+    $plugin['handler'] += array(
+      'requirements' => array(
+        'facetapi_requirement_realm_property' => array('element type' => 'links')
+      ),
+    );
+
+    // Iterates over requirements, checks against conditions one at a time.
+    foreach ($plugin['handler']['requirements'] as $callback => $options) {
+      if (!call_user_func($callback, $realm, $facet, $options)) {
+        $append = FALSE;
+        break;
+      }
+    }
+
+    // Append plugins if no requiremetns failed.
+    if ($append) {
+      $plugins[$id] = $plugin;
+    }
+  }
+
+  return $plugins;
+}
+
+/**
+ * Checks realm element requirement.
+ */
+function facetapi_requirement_realm_property(array $realm, array $facet, array $options) {
+  return facetapi_requirement_property($realm, $options);
+}
+
+/**
+ * Checks facet element requirement.
+ */
+function facetapi_requirement_facet_property(array $realm, array $facet, array $options) {
+  return facetapi_requirement_property($facet, $options);
+}
+
+/**
+ * Checks the equality of a property.
+ */
+function facetapi_requirement_property(array $definition, array $options) {
+  $passed = TRUE;
+  foreach ($options as $key => $requirement) {
+    $condition = $definition[$key];
+    if (is_array($requirement)) {
+      if (array_intersect_key($condition, $requirement) != $requirement) {
+        $passed = FALSE;
+        break;
+      }
+    }
+    else {
+      if ($requirement != $condition) {
+        $passed = FALSE;
+        break;
+      }
+    }
+  }
+  return $passed;
+}
+
+/**
  * Facet display settings form.
  *
  * @param $form
@@ -272,7 +351,7 @@ function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adap
 
   // Builds select options for widgets, allows widgets to add settings.
   $widget_options = array();
-  foreach (ctools_get_plugins('facetapi', 'widgets') as $id => $plugin) {
+  foreach (facetapi_get_widgets($realm, $facet) as $id => $plugin) {
     $widget_options[$id] = $plugin['handler']['label'];
     $class = $plugin['handler']['class'];
     $plugin = new $class($id, $realm, $adapter->getFacet($facet), $facet_settings);
diff --git a/facetapi.module b/facetapi.module
index 8ae511b..37282d5 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -373,8 +373,7 @@ function facetapi_get_realm_info() {
         'description' => '',
         'default widget' => '',
         'settings callback' => FALSE,
-        'widget requirements' => array(),
-        'weight' => 0,
+        'element type' => 'links',
         'sortable' => TRUE,
       );
     }
@@ -422,14 +421,6 @@ function facetapi_get_facet_info($searcher) {
         array('display', SORT_ASC),
       ),
     );
-
-    // Checks whether facet is flat or hierarchical, adds to requirements.
-    if (!$facet_info[$facet_name]['hierarchy callback']) {
-      $facet_info[$facet_name]['widget requirements'][] = 'flat';
-    }
-    else {
-      $facet_info[$facet_name]['widget requirements'][] = 'hierarchical';
-    }
   }
 
   // Invokes alter hook, sorts and returns.
@@ -518,19 +509,24 @@ function facetapi_facetapi_realm_info() {
     'weight' => -10,
     'sortable' => FALSE,
     'default widget' => 'facetapi_links',
+    'element type' => 'links',
     'description' => t(
       'The <em>Blocks</em> realm displays each facet in a separate <a href="@block-page">block</a>. Users are able to refine their searches in a drill-down fashion.',
       array('@block-page' => url('admin/structure/block', array('query' => array('destination' => $_GET['q']))))
     ),
   );
-/* // @todo - implement this. http://drupal.org/node/1132744
+
+  /*
+  // @todo - implement this. http://drupal.org/node/1132744
   $realms['fieldset'] = array(
     'label' => t('Fieldset'),
     'weight' => -5,
     'default widget' => 'facetapi_textfield',
+    'element type' => 'form elements',
     'description' => t('The <em>Fieldset</em> realm displays facets as form elements in a fieldset below the search form that is similar in appearance to the core Search module\'s <em>Advanced search</em> fieldset.'),
   );
-*/
+  */
+
   return $realms;
 }
 
