diff --git includes/flag_plugin_argument_validate_flaggability.inc includes/flag_plugin_argument_validate_flaggability.inc
index 2f6de5f..ebe6de7 100644
--- includes/flag_plugin_argument_validate_flaggability.inc
+++ includes/flag_plugin_argument_validate_flaggability.inc
@@ -7,8 +7,18 @@
  */
 
 /**
+ * Returns TRUE if we're running under Views 3 and higher. FALSE otherwise.
+ */
+function _flag_is_views3() {
+  // We just test the first character (and dodge the complexity of version_compare()).
+  return views_api_version() >= '3';
+}
+
+/**
  * Validates whether an argument is a flaggable/flagged object.
  *
+ * Note: This code, for Drupal 6, is designed to work under both Views 3 and Views 2.
+ *
  * @ingroup views
  */
 class flag_plugin_argument_validate_flaggability extends views_plugin_argument_validate {
@@ -18,21 +28,25 @@ class flag_plugin_argument_validate_flaggability extends views_plugin_argument_v
     $this->flag_type = $this->definition['flag type'];
   }
 
-  function validate_form(&$form, &$form_state) {
+  // Views 3.
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['flag_name'] = array('default' => '*relationship*');
+    $options['flag_test'] = array('default' => 'flaggable');
+    $options['flag_id_type'] = array('default' => 'id');
+    return $options;
+  }
+
+  // Views 3.
+  function options_form(&$form, &$form_state) {
     $options = $this->flags_options();
 
     $form[$this->_option_name('flag_name')] = array(
       '#type' => 'radios',
-       // Add an ID to the surrounding div because radios don't get IDs
-       // as a whole group. This is needed for #dependency.
-      '#prefix' => '<div><div id="edit-options-' . views_css_safe($this->_option_name('flag_name')) . '">',
-      '#suffix' => '</div></div>',
       '#title' => t('Flag'),
       '#options' => $options,
       '#default_value' => $this->_get_option('flag_name', '*relationship*'),
       '#description' => t('Select the flag to validate against.'),
-      '#process' => array('expand_radios', 'views_process_dependency'),
-      '#dependency' => array('edit-options-validate-type' => array($this->id)),
     );
     if (!$options) {
       $form[$this->_option_name('flag_name')]['#description'] = '<p class="warning">' . t('No %type flags exist. You must first <a href="@create-url">create a %type flag</a> before being able to use one.', array('%type' => $this->flag_type, '@create-url' => 'admin/build/flags')) . '</p>';
@@ -43,8 +57,6 @@ class flag_plugin_argument_validate_flaggability extends views_plugin_argument_v
       '#title' => t('Validate the @type only if', array('@type' => $this->flag_type)),
       '#options' => $this->tests_options(),
       '#default_value' => $this->_get_option('flag_test', 'flaggable'),
-      '#process' => array('views_process_dependency'),
-      '#dependency' => array('edit-options-validate-type' => array($this->id)),
     );
 
     // This validator supports the "multiple IDs" syntax. It may not be
@@ -58,11 +70,31 @@ class flag_plugin_argument_validate_flaggability extends views_plugin_argument_v
         'ids' => t('IDs separated by , or +'),
       ),
       '#default_value' => $this->_get_option('flag_id_type', 'id'),
-      '#process' => array('views_process_dependency'),
-      '#dependency' => array('edit-options-validate-type' => array($this->id)),
     );
   }
 
+  // Views 2.
+  function validate_form(&$form, &$form_state) {
+    // We call the Views 3 version and add to it the #dependency settings.
+
+    $this->options_form($form, $form_state);
+
+    $form[$this->_option_name('flag_name')] += array(
+       // Add an ID to the surrounding div because radios don't get IDs
+       // as a whole group. This is needed for #dependency.
+      '#prefix' => '<div><div id="edit-options-' . views_css_safe($this->_option_name('flag_name')) . '">',
+      '#suffix' => '</div></div>',
+      '#process' => array('expand_radios', 'views_process_dependency'),
+    );
+
+    foreach(array('flag_name', 'flag_test', 'flag_id_type') as $option) {
+      $form[$this->_option_name($option)] += array(
+        '#dependency' => array('edit-options-validate-type' => array($this->id)),
+        '#process' => array('views_process_dependency'),
+      );
+    }
+  }
+
   /**
    * Returns form #options for the flags. Returns empty array if no flags were
    * found.
@@ -82,20 +114,53 @@ class flag_plugin_argument_validate_flaggability extends views_plugin_argument_v
   }
 
   /**
-   * Validator arguments are stored in the argument object, not here, so we
-   * define a convenience method for fetching them.
+   * Returns an option's value.
+   *
+   * Purpose: insulate us from the difference between Views 3 and Views 2.
    */
   function _get_option($option, $default) {
-    $option = $this->_option_name($option);
-    return isset($this->argument->options[$option]) ? $this->argument->options[$option] : $default;
+    if (_flag_is_views3()) {
+      return $this->options[$option];
+    }
+    else {
+      // Views 2.
+      //
+      // Validator arguments are stored in the argument object, not here.
+      $option = $this->_option_name($option);
+      return isset($this->argument->options[$option]) ? $this->argument->options[$option] : $default;
+    }
   }
 
+  /**
+   * Returns an option's name.
+   *
+   * Purpose: insulate us from the difference between Views 3 and Views 2.
+   */
   function _option_name($option) {
-    // We must embed the flag type in the option name or else validators of
-    // different types will clash with each other. It's a trait of Views that all
-    // validators on the system get their settings lumped onto the argument.
-    // Examine the view's 'Export' output to understand.
-    return 'validate_argument_' . $this->flag_type . '_' . $option;
+    if (_flag_is_views3()) {
+      return $option;
+    }
+    else {
+      // Views 2.
+      //
+      // We must embed the flag type in the option name or else validators of
+      // different types will clash with each other. It's a trait of Views that all
+      // validators on the system get their settings lumped onto the argument.
+      // Examine the view's 'Export' output to understand.
+      return 'validate_argument_' . $this->flag_type . '_' . $option;
+    }
+  }
+
+  /**
+   * Migrate existing Views 2 options to Views 3.
+   */
+  function convert_options(&$options) {
+    $prefix = 'validate_argument_' . $this->flag_type . '_';
+    if (!isset($options['flag_name']) && !empty($this->argument->options[$prefix . 'flag_name'])) {
+      $options['flag_name'] = $this->argument->options[$prefix . 'flag_name'];
+      $options['flag_test'] = $this->argument->options[$prefix . 'flag_test'];
+      $options['flag_id_type'] = $this->argument->options[$prefix . 'flag_id_type'];
+    }
   }
 
   /**
