diff --git tests/templates/views-view--frontpage.tpl.php tests/templates/views-view--frontpage.tpl.php
new file mode 100644
index 0000000..a39fea3
--- /dev/null
+++ tests/templates/views-view--frontpage.tpl.php
@@ -0,0 +1,92 @@
+<?php
+// $Id: views-view.tpl.php,v 1.12.2.3 2010-03-25 20:25:23 merlinofchaos Exp $
+/**
+ * @file views-view.tpl.php
+ * Main view template
+ *
+ * Variables available:
+ * - $classes_array: An array of classes determined in
+ *   template_preprocess_views_view(). Default classes are:
+ *     .view
+ *     .view-[css_name]
+ *     .view-id-[view_name]
+ *     .view-display-id-[display_name]
+ *     .view-dom-id-[dom_id]
+ * - $classes: A string version of $classes_array for use in the class attribute
+ * - $css_name: A css-safe version of the view name.
+ * - $css_class: The user-specified classes names, if any
+ * - $header: The view header
+ * - $footer: The view footer
+ * - $rows: The results of the view query, if any
+ * - $empty: The empty text to display if the view is empty
+ * - $pager: The pager next/prev links to display, if any
+ * - $exposed: Exposed widget form/info to display
+ * - $feed_icon: Feed icon to display, if any
+ * - $more: A link to view more, if any
+ * - $admin_links: A rendered list of administrative links
+ * - $admin_links_raw: A list of administrative links suitable for theme('links')
+ *
+ * @ingroup views_templates
+ */
+?>
+<div class="<?php print $classes; ?>">
+  <?php if ($admin_links): ?>
+    <div class="views-admin-links views-hide">
+      <?php print $admin_links; ?>
+    </div>
+  <?php endif; ?>
+  <?php if ($header): ?>
+    <div class="view-header">
+      <?php print $header; ?>
+    </div>
+  <?php endif; ?>
+
+  <?php if ($exposed): ?>
+    <div class="view-filters">
+      <?php print $exposed; ?>
+    </div>
+  <?php endif; ?>
+
+  <?php if ($attachment_before): ?>
+    <div class="attachment attachment-before">
+      <?php print $attachment_before; ?>
+    </div>
+  <?php endif; ?>
+
+  <?php if ($rows): ?>
+    <div class="view-content">
+      <?php print $rows; ?>
+    </div>
+  <?php elseif ($empty): ?>
+    <div class="view-empty">
+      <?php print $empty; ?>
+    </div>
+  <?php endif; ?>
+
+  <?php if ($pager): ?>
+    <?php print $pager; ?>
+  <?php endif; ?>
+
+  <?php if ($attachment_after): ?>
+    <div class="attachment attachment-after">
+      <?php print $attachment_after; ?>
+    </div>
+  <?php endif; ?>
+
+  <?php if ($more): ?>
+    <?php print $more; ?>
+  <?php endif; ?>
+
+  <?php if ($footer): ?>
+    <div class="view-footer">
+      <?php print $footer; ?>
+    </div>
+  <?php endif; ?>
+
+  <?php if ($feed_icon): ?>
+    <div class="feed-icon">
+      <?php print $feed_icon; ?>
+    </div>
+  <?php endif; ?>
+
+</div> <?php /* class view */ ?>
diff --git tests/views_module.test tests/views_module.test
index e821d42..e7c2cb8 100644
--- tests/views_module.test
+++ tests/views_module.test
@@ -4,16 +4,16 @@ module_load_include('test', 'views', 'tests/views_query');
 class viewsModuleTest extends ViewsSqlTest {
   public static function getInfo() {
     return array(
-    'name' => 'Tests views.module',
-    'description' => 'Tests some basic functions of views.module',
-    'group' => 'Views',
+      'name' => 'Tests views.module',
+      'description' => 'Tests some basic functions of views.module',
+      'group' => 'Views',
     );
   }
-  
+
   public function setUp() {
     parent::setUp();
   }
-  
+
   public function test_views_trim_text() {
     // Test unicode, @see http://drupal.org/node/513396#comment-2839416
     $text = array(
@@ -58,12 +58,22 @@ class viewsModuleTest extends ViewsSqlTest {
       'сд асд',
       'асд асд',
     );
-    
+
     foreach ($text as $key => $line) {
       $result_text = views_trim_text($alter, $line);
-      debug($result_text);
-      debug($expect[$key]);
       $this->assertEqual($result_text, $expect[$key]);
     }
   }
+  
+  /**
+   * Tests the dynamic includes of templates via module feature.
+   */
+  function testModuleTemplates() {
+    $views_status = variable_get('views_defaults', array());
+    $views_status['frontpage'] = FALSE; // false is enabled
+    variable_set('views_defaults', $views_status);
+    
+    $registry = theme_get_registry();
+    $this->assertTrue(isset($registry['views_view__frontpage']));
+  }
 }
diff --git tests/views_test.module tests/views_test.module
index 9dac4f8..5c590a6 100644
--- tests/views_test.module
+++ tests/views_test.module
@@ -14,6 +14,7 @@ function views_test_perm() {
 function views_test_views_api() {
   return array(
     'api' => 3.0,
+    'template path' => drupal_get_path('module', 'views_test') .'/templates',
   );
 }
 
diff --git views.module views.module
index df229ad..2ffe2e4 100644
--- views.module
+++ views.module
@@ -33,7 +33,7 @@ function views_init() {
 /**
  * Implementation of hook_theme(). Register views theming functions.
  */
-function views_theme() {
+function views_theme($existing, $type, $theme, $path) {
   $path = drupal_get_path('module', 'views');
   require_once "./$path/theme/theme.inc";
 
@@ -116,10 +116,86 @@ function views_theme() {
     'pattern' => 'views_more__',
     'arguments' => array('more_url' => NULL, 'link_text' => 'more'),
   );
+
+  // Add theme suggestions which are part of modules.
+  foreach (views_get_module_apis() as $info) {
+    if (isset($info['template path'])) {
+      $hooks += _views_find_module_templates($hooks, $info['template path']);
+    }
+  }
   return $hooks;
 }
 
 /**
+ * Scans a directory of a module for template files.
+ *
+ * @param $cache
+ *   The existing cache of theme hooks to test against.
+ * @param $path
+ *   The path to search.
+ * 
+ * @see drupal_find_theme_templates
+ */
+function _views_find_module_templates($cache, $path) {
+  $regex = '\.tpl\.php' . '$';
+
+  // Because drupal_system_listing works the way it does, we check for real
+  // templates separately from checking for patterns.
+  $files = drupal_system_listing($regex, $path, 'name', 0);
+  foreach ($files as $template => $file) {
+    // Chop off the remaining extensions if there are any. $template already
+    // has the rightmost extension removed, but there might still be more,
+    // such as with .tpl.php, which still has .tpl in $template at this point.
+    if (($pos = strpos($template, '.')) !== FALSE) {
+      $template = substr($template, 0, $pos);
+    }
+    // Transform - in filenames to _ to match function naming scheme
+    // for the purposes of searching.
+    $hook = strtr($template, '-', '_');
+    if (isset($cache[$hook])) {
+      $templates[$hook] = array(
+        'template' => $template,
+        'path' => dirname($file->filename),
+        'include files' => $cache[$hook]['include files'],
+      );
+    }
+    // Ensure that the pattern is maintained from base themes to its sub-themes.
+    // Each sub-theme will have their templates scanned so the pattern must be
+    // held for subsequent runs.
+    if (isset($cache[$hook]['pattern'])) {
+      $templates[$hook]['pattern'] = $cache[$hook]['pattern'];
+    }
+  }
+
+  $patterns = array_keys($files);
+
+  foreach ($cache as $hook => $info) {
+    if (!empty($info['pattern'])) {
+      // Transform _ in pattern to - to match file naming scheme
+      // for the purposes of searching.
+      $pattern = strtr($info['pattern'], '_', '-');
+
+      $matches = preg_grep('/^'. $pattern .'/', $patterns);
+      if ($matches) {
+        foreach ($matches as $match) {
+          $file = substr($match, 0, strpos($match, '.'));
+          // Put the underscores back in for the hook name and register this pattern.
+          $templates[strtr($file, '-', '_')] = array(
+            'template' => $file,
+            'path' => dirname($files[$match]->filename),
+            'arguments' => $info['arguments'],
+            'original hook' => $hook,
+            'include files' => $info['include files'],
+          );
+        }
+      }
+    }
+  }
+
+  return $templates;
+}
+
+/**
  * A theme preprocess function to automatically allow view-based node
  * templates if called from a view.
  *
