diff --git views2inc/node_gallery.views.inc views2inc/node_gallery.views.inc
index 624d1f2..8133c4c 100644
--- views2inc/node_gallery.views.inc
+++ views2inc/node_gallery.views.inc
@@ -39,6 +39,14 @@ function node_gallery_views_data() {
       'handler' => 'views_handler_sort',
     ),
   );
+  $data['node_gallery_images']['gallery_selector'] = array(
+    'title' => t("Current user galleries selector"),
+    'help' => t("Select images from current user galleries."),
+    'real field' => 'gid',
+    'filter' => array(
+      'handler' => 'node_gallery_handler_filter_gallery_selector',
+    ),
+  );
   $data['node_gallery_images']['weight'] = array(
     'title' => t('Image weight'),
     'help' => t('The weight assigned to the image. Used for sorting within a gallery.'),
@@ -194,6 +202,9 @@ function node_gallery_views_handlers() {
       'node_gallery_views_handler_image_navigator' => array(
         'parent' => 'views_handler_field',
       ),
+      'node_gallery_handler_filter_gallery_selector' => array(
+        'parent' => 'views_handler_filter',
+      ),
     ),
   );
 }
\ No newline at end of file
diff --git views2inc/node_gallery_handler_filter_gallery_selector.inc views2inc/node_gallery_handler_filter_gallery_selector.inc
new file mode 100644
index 0000000..4f803be
--- /dev/null
+++ views2inc/node_gallery_handler_filter_gallery_selector.inc
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Exposed filter to choose gallery for browsing images.
+ *
+ */
+class node_gallery_handler_filter_gallery_selector extends views_handler_filter {
+  var $no_single = TRUE;
+  
+  function init(&$view, $options) {
+    parent::init($view, $options);
+    // Set initial gallery to the first found gallery of the user.
+    $nids = array_keys($this->gallery_options());
+    if (!empty($nids)) {
+      $this->value = $nids[0];
+    }
+    else {
+      // When there are no galleries to choose from, hide the selector completely 
+      // and disable filtering.
+      $this->value = '';
+      $this->options['exposed'] = FALSE;
+    }
+  }
+  
+  /**
+   * Prepare filtered options array for the gallery select element.
+   */
+  function gallery_options() {
+    global $user;
+    static $options;
+    
+    if (!isset($options)) {
+      $options = array();
+      $query = "SELECT n.nid, n.title FROM {node} n
+                WHERE n.type IN (
+                  SELECT gallery_type FROM {node_gallery_relationships}
+                ) AND n.uid = %d ORDER BY n.title";
+      $res = db_query(db_rewrite_sql($query), $user->uid);
+      while ($row = db_fetch_object($res)) {
+        $options[$row->nid] = check_plain($row->title);
+      }
+    }
+    
+    return $options;
+  }
+  
+  function value_form(&$form, &$form_state) {
+    $options = $this->gallery_options();
+    if (empty($options)) {
+      return;
+    }
+    $form['value'] = array(
+      '#type' => 'select',
+      '#options' => $options,
+      '#default_value' => $this->value, 
+    );
+    $identifier = $this->options['expose']['identifier'];
+    if (!isset($form_state['input'][$identifier])) {
+      $form_state['input'][$identifier] = $this->value;
+    }
+  }
+  
+  function option_definition() {
+    global $user;
+    $options = parent::option_definition();
+    // Because we don't render expose button, we may need to take care about 
+    // default values for options that would be processed by 
+    // views_ui_config_item_form_expose() submit callback otherwise.
+    $options['exposed'] = array('default' => TRUE);
+    $options['expose']['contains']['label'] = array(
+      'default' => 'Gallery', 
+      'translatable' => TRUE,
+    );
+    $options['expose']['contains']['identifier'] = array(
+      'default' => 'gid', 
+      'translatable' => FALSE,
+    );
+    return $options;
+  }
+  
+  function options_form(&$form, &$form_state) {
+    // This filter is always exposed and has no default values.
+    $this->options['exposed'] = TRUE;
+    $this->show_expose_form($form, $form_state);
+  }
+  
+  /**
+   * Special version of validation callback that works without expose button.
+   */
+  function expose_validate($form, &$form_state) {
+    if (empty($form_state['values']['options']['expose']['identifier'])) {
+      form_error($form['expose']['identifier'], t('The identifier is required if the filter is exposed.'));
+    }
+
+    if (!empty($form_state['values']['options']['expose']['identifier']) && $form_state['values']['options']['expose']['identifier'] == 'value') {
+      form_error($form['expose']['identifier'], t('This identifier is not allowed.'));
+    }
+
+    if (!$this->view->display_handler->is_identifier_unique($form_state['id'], $form_state['values']['options']['expose']['identifier'])) {
+      form_error($form['expose']['identifier'], t('This identifier is used by another handler.'));
+    }
+  }
+  
+  function admin_summary() {
+    return '';
+  }
+  
+  function query() {
+    if (!empty($this->value)) {
+      $this->ensure_my_table();
+      $this->query->add_where($this->options['group'], "$this->table_alias.$this->real_field = %d", $this->value);
+    }
+  }
+}
