--- panels_tabs.module
+++ panels_tabs.module
@@ -20,6 +20,47 @@ function panels_tabs_ctools_plugin_directory($module, $plugin) {
 }
 
 /**
+* Implements hook_ctools_plugin_api().
+*/
+function  panels_tabs_ctools_plugin_api($module, $api) {
+  if ($module == 'panels' && $api == 'styles') {
+    // Check and return correct style version
+    return array('version' => panels_tabs_style_version());
+  }
+}
+
+/**
+* Implements hook_panels_pre_render().
+*/
+function panels_tabs_panels_pre_render($display, $renderer) {
+  // Don't run if we are using legacy mode
+  if (panels_tabs_style_version() == 2) {
+    $renderer->prepare();
+    foreach ($renderer->prepared['regions'] as $id => $region) {
+      if ($region['style']['name'] == 'tabs') {
+        foreach ($region['pids'] as $pid) {
+          $renderer->prepared['panes'][$pid]->region_style = 'tabs';
+        }
+      }
+    }
+  }
+}
+
+/**
+* Implements hook_panels_pane_content_alter().
+*/
+function panels_tabs_panels_pane_content_alter($content, $pane, $args, $context) {
+  // Don't run if we are using legacy mode
+  if (panels_tabs_style_version() == 2) {
+    if ($pane->region_style == 'tabs') {
+      $pane->tab_title = $content->title;
+      unset($content->title);
+    }
+  }
+}
+
+
+/**
  * Implementation of hook_theme()
  */
 function panels_tabs_theme() {
@@ -31,6 +72,15 @@ function panels_tabs_theme() {
 }
 
 /**
+ * Determine which style version we shoud declare.
+ */
+function panels_tabs_style_version() {
+  // If ctools api version is greater than 1.7 then we should return version 2
+  $new = version_compare(PANELS_REQUIRED_CTOOLS_API, 1.7, '>=');
+  return $new ? 2 : 1;
+}
+
+/**
  * Return rendered title.
  *
  * @themable

--- plugins/styles/tabs.inc
+++ plugins/styles/tabs.inc
@@ -10,6 +10,8 @@
 $plugin = array(
   'title' => t('Tabs'),
   'description' => t('Presents the panes in tabs.'),
+  'render region' => 'panels_tabs_style_render_region',
+  // Deprecated legacy callback
   'render panel' => 'panels_tabs_style_render_panel',
   'settings form'     => 'panels_tabs_style_settings_form',
   'settings validate' => 'panels_tabs_style_settings_validate',
@@ -20,7 +22,49 @@ $plugin = array(
 // Panels style plugin callbacks.
 
 /**
- * Render callback.
+ * Render region callback.
+ */
+function theme_panels_tabs_style_render_region($display, $owner_id, $panes, $settings) {
+  $output = '';
+
+  // Generate a unique id based on the CSS ID and the name of the panel in the
+  // layout.
+  $pane_id = reset(array_keys($panes));
+  $panel = $display->content[$pane_id]->panel;
+  $id = "$display->css_id-$panel";
+
+  // Add the Javascript to the page, and save the settings for this panel.
+  _panels_tabs_add_js($id, $settings['filling_tabs']);
+
+  $tabs = array();
+  $tabs[$id] = array(
+    '#type' => 'tabset',
+  );
+  $index = 0;
+  foreach ($panes as $pane_id => $pane_content) {
+    if (!empty($pane_content)) {
+      $tabs[$id][$pane_id] = array(
+        '#type'    => 'tabpage',
+        '#title'   => $display->content[$pane_id]->tab_title,
+        '#content' => $pane_content,
+        '#weight'  => $index,
+      );
+      $index++;
+    }
+  }
+
+  // See if an optional title was added.
+  if (!empty($settings['title'])) {
+    $output .= theme('panels_tabs_title', $settings['title']);
+  }
+
+  $output .= tabs_render($tabs);
+
+  return $output;
+}
+
+/**
+ * Render panel callback (legacy).
  */
 function theme_panels_tabs_style_render_panel($display, $owner_id, $panes, $settings) {
   $output = '';
