diff --git a/apachesolr.module b/apachesolr.module
index ddc096a..6ac9b73 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -1222,6 +1222,100 @@ function apachesolr_load_all_environments() {
 
  }
 
+ /**
+ * Function that loads all the search types
+ *
+ * @return $search_types
+ */
+function apachesolr_load_all_search_types() {
+
+  $search_types = &drupal_static(__FUNCTION__);
+
+  if (isset($search_types)) {
+    return $search_types;
+  }
+  // Use cache_get to avoid DB when using memcache, etc.
+  $cache = cache_get('apachesolr:search_types', 'cache_apachesolr');
+  if (isset($cache->data)) {
+    $search_types = $cache->data;
+  }
+  else {
+    $search_types = array(
+        'tid' => array(
+          'name' => apachesolr_field_name_map('tid'),
+          'default menu' => 'taxonomy/term/%',
+          'title callback' => 'apachesolr_get_taxonomy_term_title',
+        ),
+        'is_uid' => array(
+          'name' => apachesolr_field_name_map('is_uid'),
+          'default menu' => 'search/user/%',
+          'title callback' => 'apachesolr_get_user_title',
+        ),
+        'bundle' => array(
+          'name' => apachesolr_field_name_map('bundle'),
+          'default menu' => 'search/type/%',
+          'title callback' => 'apachesolr_get_bundle_title',
+        ),
+        'ss_language' => array(
+          'name' => apachesolr_field_name_map('ss_language'),
+          'default menu' => 'search/language/%',
+          'title callback' => 'apachesolr_get_language_title',
+        ),
+    );
+
+    module_invoke_all('apachesolr_search_types', $search_types);
+    cache_set('apachesolr:search_types', $search_types, 'cache_apachesolr');
+  }
+  return $search_types;
+
+ }
+
+ function apachesolr_get_taxonomy_term_title($search_page_id = null, $value = null) {
+   //add dynamic title posibility
+   $title = '%term';
+   $search_page = apachesolr_search_page_load($search_page_id);
+
+   if(isset($value)) {
+     $term = taxonomy_term_load($value);
+     $title = $term->title;
+   }
+   return t('Search Results for Term @term', array('@term' => $title));
+ }
+
+ function apachesolr_get_user_title($search_page_id = null, $value = null) {
+   //add dynamic title posibility
+   $title = '%user';
+   $search_page = apachesolr_search_page_load($search_page_id);
+
+   if(isset($value)) {
+     $user = user_load($value);
+     $title = $user->name;
+   }
+   return t('Search Results for User @user', array('@user' => $title));
+ }
+
+ function apachesolr_get_bundle_title($search_page_id = null, $value = null) {
+   //add dynamic title posibility
+   $title = '%bundle';
+   $search_page = apachesolr_search_page_load($search_page_id);
+
+   if(isset($value)) {
+     $title = $value;
+   }
+   return t('Search Results for Bundle @bundle', array('@bundle' => $title));
+ }
+
+ function apachesolr_get_language_title($search_page_id = null, $value = null) {
+   //add dynamic title posibility
+   $title = '%language';
+   $search_page = apachesolr_search_page_load($search_page_id);
+
+   if(isset($value)) {
+     $term = taxonomy_term_load($value);
+     $title = $term->title;
+   }
+   return t('Search Results for Language @language', array('@language' => $title));
+ }
 /**
  * Function that loads an environment
  *
@@ -1664,6 +1758,10 @@ function apachesolr_field_name_map($field_name) {
       'tags_inline' => t('Body text in inline tags like EM or STRONG'),
       'tags_a' => t('Body text inside links (A tags)'),
       'tid' => t('Taxonomy term IDs'),
+      'is_uid' => t('User IDs'),
+      'bundle' => t('Content type names eg. article'),
+      'entity_type' => t('Entity type names eg. node'),
+      'ss_language' => t('Language type eg. en or und (undefinded)'),
     );
     if (module_exists('taxonomy')) {
       foreach (taxonomy_get_vocabularies() as $vocab) {
diff --git a/apachesolr_search.admin.inc b/apachesolr_search.admin.inc
index 4c8daae..2c00c01 100644
--- a/apachesolr_search.admin.inc
+++ b/apachesolr_search.admin.inc
@@ -110,6 +110,32 @@ function apachesolr_search_page_settings_form($form, &$form_state, $search_page
     '#default_value' => !empty($search_page->label) ? $search_page->label : '',
   );
 
+  $form['search_page'] = array(
+      '#type' => 'value',
+      '#value' => $search_page,
+  );
+
+
+
+  $environments = apachesolr_load_all_environments();
+  $options = array('' => t('<Disabled>'));
+  foreach ($environments as $id => $environment) {
+    $options[$id] = $environment['name'];
+  }
+  // Validate the env_id.
+  if (!empty($search_page->env_id) && !apachesolr_environment_load($search_page->env_id)) {
+    $search_page->env_id = '';
+  }
+
+  $form['info']['env_id'] = array(
+    '#title' => t('Search environment'),
+    '#type' => 'select',
+    '#options' => $options,
+    '#default_value' => !empty($search_page->env_id) ? $search_page->env_id : '',
+    '#description' => t('The environment that is used by this search page. If no environment is selected, this page will be disabled.'),
+    '#weight' => -30,
+  );
+
   $form['page_id'] = array(
     '#type' => 'machine_name',
     '#maxlength' => 32,
@@ -133,16 +159,47 @@ function apachesolr_search_page_settings_form($form, &$form_state, $search_page
     '#default_value' => !empty($search_page->description) ? $search_page->description : '',
   );
 
-  $form['info']['search_path'] = array(
+  $form['info']['setup'] = array(
+    '#title' => t('Dynamic Search Options'),
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#prefix' => '<div id="dynamic-search-page">',
+    '#suffix' => '</div>',
+  );
+
+  $search_types = apachesolr_load_all_search_types();
+  $options = array('' => t('<none>'));
+  foreach ($search_types as $id => $search_type) {
+    $options[$id] = $search_type['name'];
+  }
+
+  $form['info']['setup']['search_type'] = array(
+    '#title' => t('Search Type'),
+    '#type' => 'select',
+    '#options' => $options,
+    '#default_value' => !empty($search_page->search_type) ? $search_page->search_type : '',
+    '#description' => t('Use this only when using a dynamic filter in the search path.
+      Example you would selecting Taxonomy Term if you search needs a dynamic search path on TIDs (search/taxonomy/%).'),
+    '#weight' => -30,
+    '#ajax' => array(
+      'callback' => 'apachesolr_search_ajax_search_page_default',
+      'wrapper' => 'dynamic-search-page',
+      'method' => 'replace',
+    ),
+  );
+
+  // Token element validate is added to validate the specific
+  // tokens that are allowed
+  $form['info']['setup']['search_path'] = array(
     '#title' => t('Path'),
     '#type' => 'textfield',
     '#required' => TRUE,
     '#maxlength' => 255,
-    '#description' => t('For example: search/my-search-page. Search keywords will appear at the end of the path.'),
+    '#description' => t('For example: search/my-search-page. Search keywords will appear at the end of the path. You can use token [node:nid], [term:tid] or [user:uid] to make the search page dynamic.'),
     '#default_value' => !empty($search_page->search_path) ? $search_page->search_path : '',
   );
 
-  $form['info']['filters'] = array(
+  $form['info']['setup']['filters'] = array(
     '#title' => t('Default filters'),
     '#type' => 'textfield',
     '#required' => FALSE,
@@ -151,7 +208,7 @@ function apachesolr_search_page_settings_form($form, &$form_state, $search_page
     '#default_value' => !empty($search_page->settings['fq'])  ? implode(', ', $search_page->settings['fq']) : '',
   );
 
-  $form['info']['page_title'] = array(
+  $form['info']['setup']['page_title'] = array(
     '#title' => t('Title'),
     '#type' => 'textfield',
     '#required' => TRUE,
@@ -159,35 +216,42 @@ function apachesolr_search_page_settings_form($form, &$form_state, $search_page
     '#description' => '',
     '#default_value' => !empty($search_page->page_title) ? $search_page->page_title : '',
   );
+  $form['info']['advanced'] = array(
+    '#title' => t('Advanced Search Page Options'),
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+
+  // Results per page per search page
+  $default_value = isset($search_page->settings['apachesolr_search_per_page']) ? $search_page->settings['apachesolr_search_per_page'] : TRUE;
+  $form['info']['advanced']['apachesolr_search_per_page'] = array(
+    '#type' => 'select',
+    '#title' => t('Results per page'),
+    '#description' => t('Select how many items will be displayed on one page of the search result.'),
+    '#options' => drupal_map_assoc(array(5, 10, 20, 30, 40, 50, 60, 80, 100)),
+    '#default_value' => 10,
+  );
+
+  // Enable/disable spellcheck on pages
+  $default_value = isset($search_page->settings['apachesolr_search_spellcheck']) ? $search_page->settings['apachesolr_search_spellcheck'] : TRUE;
+  $form['info']['advanced']['apachesolr_search_spellcheck'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable spell check'),
+    '#description' => t('Display "Did you mean … ?" above search results.'),
+    '#default_value' => $default_value,
+  );
+
+  //@todo : Add display mode to it? Or does something like Display suite handle that for us
 
   // Sets the descriptions and button text.
   $form['label']['#description'] = t('The human-readable name of the search page configuration.');
   $form['page_id']['#description'] = t('A unique machine-readable identifier for the search page configuration. It must only contain lowercase letters, numbers, and underscores.');
   $form['info']['description']['#description'] = t('The description of the search page configuration.');
 
-  $environments = apachesolr_load_all_environments();
-
-  $options = array('' => t('<Disabled>'));
-  foreach ($environments as $id => $environment) {
-    $options[$id] = $environment['name'];
-  }
-  // Validate the env_id.
-  if (!empty($search_page->env_id) && !apachesolr_environment_load($search_page->env_id)) {
-    $search_page->env_id = '';
-  }
-
-  $form['info']['env_id'] = array(
-    '#title' => t('Search environment'),
-    '#type' => 'select',
-    '#options' => $options,
-    '#default_value' => !empty($search_page->env_id) ? $search_page->env_id : '',
-    '#description' => t('The environment that is used by this search page. If no environment is selected, this page will be disabled.'),
-    '#weight' => -30,
-  );
-
   // Use the main search page setting as the default for new pages.
   $default_value = isset($search_page->settings['apachesolr_search_browse']) ? $search_page->settings['apachesolr_search_browse'] : variable_get('apachesolr_search_browse', 'browse');
-  $form['info']['apachesolr_search_browse'] = _apachesolr_search_browse_form($default_value);
+  $form['info']['advanced']['apachesolr_search_browse'] = _apachesolr_search_browse_form($default_value);
 
   $form['actions'] = array(
     '#type' => 'actions',
@@ -210,6 +274,39 @@ function apachesolr_search_page_settings_form($form, &$form_state, $search_page
   return $form;
 }
 
+/**
+ * Callback element needs only select the portion of the form to be updated.
+ * Since #ajax['callback'] return can be HTML or a renderable array (or an
+ * array of commands), we can just return a piece of the form.
+ */
+function apachesolr_search_ajax_search_page_default($form, $form_state, $search_page = NULL) {
+
+  $search_page = $form_state['values']['search_page'];
+  $search_types = apachesolr_load_all_search_types();
+
+  // Helping with sensible defaults for the search path
+  $default_search_path = '';
+
+  if(!empty($form_state['values']['search_type'])) {
+    $default_search_path = $search_types[$form_state['values']['search_type']]['default menu'];
+    $form['info']['setup']['search_path']['#value'] = $default_search_path;
+
+  }
+
+  // Helping with sensible defaults for the search title
+  $default_search_title = '';
+
+  if(!empty($form_state['values']['page_title'])) {
+    $default_search_title_callback = $search_types[$form_state['values']['search_type']]['title callback'];
+    $default_search_title = $default_search_title_callback();
+    $form['info']['setup']['page_title']['#value'] = $default_search_title;
+  }
+
+
+
+  return $form['info']['setup'];
+}
+
 function apachesolr_search_page_settings_form_validate($form, &$form_state) {
   // Performs basic validation of the menu path.
   if (url_is_external($form_state['values']['search_path'])) {
@@ -235,8 +332,10 @@ function apachesolr_search_page_settings_form_submit($form, &$form_state) {
       }
     }
   }
-
+  $settings['apachesolr_search_search_type'] = $form_state['values']['search_type'];
+  $settings['apachesolr_search_per_page'] = $form_state['values']['apachesolr_search_per_page'];
   $settings['apachesolr_search_browse'] = $form_state['values']['apachesolr_search_browse'];
+  $settings['apachesolr_search_spellcheck'] = $form_state['values']['apachesolr_search_spellcheck'];
 
   db_merge('apachesolr_search_page')
     ->key(array('page_id' => $form_state['values']['page_id']))
diff --git a/apachesolr_search.module b/apachesolr_search.module
index 0466753..20b43c4 100644
--- a/apachesolr_search.module
+++ b/apachesolr_search.module
@@ -86,7 +86,7 @@ function apachesolr_search_menu() {
     // Gets search pages directly from the index.
     // @todo Honor "enabled" settings?
     $result = db_select('apachesolr_search_page', 's')
-      ->fields('s', array('page_id', 'search_path', 'page_title', 'env_id'))
+      ->fields('s', array('page_id'))
       ->condition('env_id', '', '<>')
       ->execute();
   }
@@ -97,43 +97,67 @@ function apachesolr_search_menu() {
 
   // Gets default search information.
   $default_info = search_get_default_module_info();
+  $search_types = apachesolr_load_all_search_types();
 
   // Iterates over search pages, builds menu items.
   foreach ($result as $record) {
+
+    $search_page = apachesolr_search_page_load($record->page_id);
     // Validate the environemnt ID in case of import or missed deletion.
-    $environment = apachesolr_environment_load($record->env_id);
+    $environment = apachesolr_environment_load($search_page->env_id);
     if (!$environment) {
       continue;
     }
+    // If title has a % in the string we use the callback,
+    // otherwise we use the complete string
+
+
+
     // Parses search path into it's various parts, builds menu items dependent
     // on whether %keys is in the path.
-    $parts = explode('/', $record->search_path);
+    $parts = explode('/', $search_page->search_path);
     $keys_pos = count($parts);
     // Tests whether we are simulating a core search tab.
     $core_search = ($parts[0] == 'search');
+    $position = array_search('%', $parts);
+
+    // Replace possible tokens [term:tid], [node:nid], [user:uid] with their
+    // menu-specific variant
 
-    $items[$record->search_path] = array(
-      'title' => $record->page_title,
+    $items[$search_page->search_path] = array(
+      'title' => 'Search Results',
       'page callback' => 'apachesolr_search_user_defined_search_page',
-      'page arguments' => array($record->page_id, ''),
+      'page arguments' => array($search_page->page_id, '', $position),
       'access arguments' => array('search content'),
       'type' => ($core_search) ? MENU_LOCAL_TASK : MENU_SUGGESTED_ITEM,
       'file' => 'apachesolr_search.pages.inc',
     );
 
-    $items[$record->search_path . '/%menu_tail'] = array(
-      'title' => $record->page_title,
+    $items[$search_page->search_path . '/%menu_tail'] = array(
+      'title' => 'Search Results',
       'load arguments' => array('%map', '%index'),
       'page callback' => 'apachesolr_search_user_defined_search_page',
-      'page arguments' => array($record->page_id, $keys_pos),
+      'page arguments' => array($search_page->page_id, $keys_pos, $position),
       'access arguments' => array('search content'),
       'type' => MENU_LOCAL_TASK,
       'file' => 'apachesolr_search.pages.inc',
     );
+
+
+    if((isset($search_types[$search_page->settings['apachesolr_search_search_type']]['title callback'])) && strpos($search_page->page_title, '%')) {
+      $title_callback = $search_types[$search_page->settings['apachesolr_search_search_type']]['title callback'];
+      dsm($title_callback);
+      $items[$search_page->search_path]['title callback'] = $title_callback;
+      $items[$search_page->search_path]['title arguments'] = array($search_page->page_id, $position);
+      $items[$search_page->search_path . '/%menu_tail']['title callback'] = $title_callback;
+      $items[$search_page->search_path . '/%menu_tail']['title arguments'] = array($search_page->page_id, $position);
+    }
+
     if ($core_search) {
-      $items[$record->search_path . '/%menu_tail']['tab_root'] = 'search/' . $default_info['path'] . '/%';
-      $items[$record->search_path . '/%menu_tail']['tab_parent'] = 'search/' . $default_info['path'];
+      $items[$search_page->search_path . '/%menu_tail']['tab_root'] = 'search/' . $default_info['path'] . '/%';
+      $items[$search_page->search_path . '/%menu_tail']['tab_parent'] = 'search/' . $default_info['path'];
     }
+    dsm($items[$search_page->search_path]);
   }
 
   return $items;
@@ -144,7 +168,7 @@ function apachesolr_search_page_load($page_id) {
   if ($page) {
     $page->settings = unserialize($page->settings);
   }
-  return $page; 
+  return $page;
 }
 
 /**
@@ -369,6 +393,7 @@ function apachesolr_search_run($name, array $params = array(), $solrsort = '', $
   $query = apachesolr_drupal_query($name, $params, $solrsort, $base_path, $solr);
 
   apachesolr_search_basic_params($query);
+
   apachesolr_search_add_boost_params($query);
   if ($query->getParam('q')) {
     apachesolr_search_highlighting_params($query);
@@ -656,7 +681,7 @@ function apachesolr_search_node_result($doc, &$result, &$extra) {
 }
 
 /**
- * Returns whether a search page exists. 
+ * Returns whether a search page exists.
  */
 function apachesolr_search_page_exists($search_page_id) {
   return db_query('SELECT 1 FROM {apachesolr_search_page} WHERE page_id = :page_id', array(':page_id' => $search_page_id))->fetchField();
diff --git a/apachesolr_search.pages.inc b/apachesolr_search.pages.inc
index 4929287..5cfa3ef 100644
--- a/apachesolr_search.pages.inc
+++ b/apachesolr_search.pages.inc
@@ -1,18 +1,33 @@
 <?php
 
-/**   
+/**
  * @file
  *   Provides the page callback for user defined search pages.
- */ 
+ */
 
 /**
  * Returns search results on user defined search pages.
  */
-function apachesolr_search_user_defined_search_page($page_id, $keys = '') {
+function apachesolr_search_user_defined_search_page($page_id, $keys = '', $value) {
+
+  // This logic looks for any supported token in the menu item and matches it
+  // with the menu object loader
+  // Currently the logic supports unlimited depth with the restriction that
+  // the software becomes slower depending on how manu objects are added
+  // as tokens
+  // TODO: Optimize this logic bu using regular expressions or existing functionality
   $search_page = apachesolr_search_page_load($page_id);
+  $search_type = $search_page->settings['apachesolr_search_search_type'];
+
+
   $build = array();
   $filters = isset($search_page->settings['fq']) ? $search_page->settings['fq'] : array();
+  if(!empty($search_type) && !empty($value)) {
+    $filters[] = $search_type. ':' .$value;
+  }
+
   $solrsort = isset($_GET['solrsort']) ? $_GET['solrsort'] : '';
+
   // We may also have filters added by facet API module. The 'f'
   // is determined by constant FacetapiAdapter::FILTER_KEY. Hard
   // coded here to avoid extra class loading.
@@ -27,12 +42,14 @@ function apachesolr_search_user_defined_search_page($page_id, $keys = '') {
 
   try {
     $solr = apachesolr_get_solr($search_page->env_id);
+
     // Adds the search form to the page.
     $build['search_form'] = drupal_get_form('apachesolr_search_user_defined_search_form', $search_page, $keys);
 
     if (!$keys && empty($conditions) && ($empty_search_behavior == 'browse' || $empty_search_behavior == 'blocks')) {
       // Pass empty search behavior as string on to apachesolr_search_search_page()
       $results = apachesolr_search_run('apachesolr', array('fq' => $filters), '', $search_page->search_path, 0, $solr);
+
       if ($empty_search_behavior == 'browse') {
         // Hide sidebar blocks for content-area browsing instead.
         apachesolr_suppress_blocks(TRUE);
@@ -76,7 +93,7 @@ function apachesolr_search_user_defined_search_form($form, &$form_state, $search
 
   $form['basic']['keys'] = array(
     '#type' => 'textfield',
-    '#title' => t('Enter terms'), 
+    '#title' => t('Enter terms'),
     '#default_value' => $keys,
     '#size' => 20,
     '#maxlength' => 255,
