Index: quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py
===================================================================
--- quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py	(revision 3437)
+++ quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py	(revision 3563)
@@ -7,5 +7,14 @@
 from zope.interface import implements
 from zope.component import getMultiAdapter
-from zope.app.container.interfaces import INameChooser
+
+# BBB: compatibility with older plone versions
+try:
+     # Plone < 4.3
+     from zope.app.container import interfaces
+     INameChooser = interfaces.INameChooser
+except ImportError:
+     # Plone >= 4.3 
+     from zope.container.interfaces import INameChooser
+     
 from zope.viewlet.interfaces import IViewletManager, IViewlet
 
@@ -25,4 +34,5 @@
 
 from quintagroup.plonetabs.config import PROPERTY_SHEET, FIELD_NAME
+from quintagroup.plonetabs.utils import setupViewletByName
 from quintagroup.plonetabs import messageFactory as _
 from interfaces import IPloneTabsControlPanel
@@ -444,7 +454,21 @@
     def selected_portal_tab(self):
         """See global-sections viewlet"""
-        selectedTabs = self.context.restrictedTraverse('selectedTabs')
-        selected_tabs = selectedTabs('index_html', self.context,
-            self.portal_tabs())
+        # BBB: compatibility with older plone versions.
+        # ``selectedTabs`` Python script was merged into the 
+        # GlobalSectionsViewlet.
+        section_viewlet = setupViewletByName(self,
+                                             self.context,
+                                             self.request,
+                                             'plone.global_sections')
+        if section_viewlet:
+            # Plone >= 4.3
+            selected_tabs = section_viewlet.selectedTabs(
+                default_tab='index_html', 
+                portal_tabs=self.portal_tabs())
+        else:
+            # Plone < 4.3
+            selectedTabs = self.context.restrictedTraverse('selectedTabs')
+            selected_tabs = selectedTabs('index_html', self.context,
+                self.portal_tabs())
 
         return selected_tabs['portal']
Index: quintagroup.plonetabs/trunk/quintagroup/plonetabs/tests/test_erase.py
===================================================================
--- quintagroup.plonetabs/trunk/quintagroup/plonetabs/tests/test_erase.py	(revision 3437)
+++ quintagroup.plonetabs/trunk/quintagroup/plonetabs/tests/test_erase.py	(revision 3563)
@@ -6,5 +6,13 @@
 from Testing import ZopeTestCase as ztc
 
-from zope.app.component.hooks import setHooks, setSite
+# BBB: compatibility with older plone versions
+try:
+    # Plone < 4.3
+    from zope.app.component import hooks 
+    setSite = hooks.setSite
+    setHooks = hooks.setHooks
+except ImportError:
+    # Plone >= 4.3 
+    from zope.component.hooks import setSite, setHooks
 
 from plone.browserlayer.utils import registered_layers
Index: quintagroup.plonetabs/trunk/quintagroup/plonetabs/utils.py
===================================================================
--- quintagroup.plonetabs/trunk/quintagroup/plonetabs/utils.py	(revision 3563)
+++ quintagroup.plonetabs/trunk/quintagroup/plonetabs/utils.py	(revision 3563)
@@ -0,0 +1,63 @@
+""" This module dedicated to work with viewlets. """
+from Acquisition import aq_inner
+
+from plone.app.customerize import registration
+
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.viewlet.interfaces import IViewlet
+
+
+# TODO: Methods 'getViewletByName' and 'setupViewletByName' were copied 
+# from https://github.com/collective/collective.developermanual/blob/master/source/views/viewlets.rst#what-viewlets-do
+# Better solution would be to use collective.fastview 
+# (http://svn.plone.org/svn/collective/collective.fastview/trunk/) 
+# which has not yet included in plone.
+
+def getViewletByName(name):
+    """ Viewlets allow through-the-web customizations.
+
+    Through-the-web customization magic is managed by five.customerize.
+    We need to think of this when looking up viewlets.
+
+    @return: Viewlet registration object
+    """
+    views = registration.getViews(IBrowserRequest)
+
+    for v in views:
+
+        if v.provided == IViewlet:
+            # Note that we might have conflicting BrowserView with the same name,
+            # thus we need to check for provided
+            if v.name == name:
+                return v
+
+    return None
+
+
+def setupViewletByName(view, context, request, name):
+    """ Constructs a viewlet instance by its name.
+
+    Viewlet update() and render() method are not called.
+
+    @return: Viewlet instance of None if viewlet with name does not exist
+    """
+    context = aq_inner(context)
+
+    # Perform viewlet regisration look-up
+    # from adapters registry
+    reg = getViewletByName(name)
+    if reg == None:
+        return None
+
+    # factory method is responsible for creating the viewlet instance
+    factory = reg.factory
+
+    # Create viewlet and put it to the acquisition chain
+    # Viewlet need initialization parameters: context, request, view
+    try:
+        viewlet = factory(context, request, view, None).__of__(context)
+    except TypeError:
+        # Bad constructor call parameters
+        raise RuntimeError("Unable to initialize viewlet %s. Factory method %s call failed." % (name, str(factory)))
+
+    return viewlet
