[SCM] framework for TANGO control system client applications branch, master, updated. debian/3.0.0-2-27-gf14e774

Picca Frédéric-Emmanuel picca at debian.org
Thu Jul 25 20:24:54 UTC 2013


The following commit has been merged in the master branch:
commit 0110f7def108658b193012aa4a0233cd9217fb62
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date:   Thu Jul 25 21:09:35 2013 +0200

    Imported Upstream version 3.1.0

diff --git a/PKG-INFO b/PKG-INFO
index 5f15af1..eef8eef 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,10 +1,10 @@
 Metadata-Version: 1.1
 Name: taurus
-Version: 3.0.1
+Version: 3.1.0
 Summary: A library designed to provide an abstraction layer over PyTango.
 Home-page: http://packages.python.org/taurus
-Author: Tiago Coutinho
-Author-email: tcoutinho at cells.es
+Author: Carlos Pascual-Izarra
+Author-email: cpascual at cells.es
 License: LGPL
 Download-URL: http://pypi.python.org/packages/source/t/taurus
 Description: Taurus stands for TAngo User interface 'R' US. It
diff --git a/doc/auto_rst4api.py b/doc/auto_rst4api.py
index 9d885b2..0757dee 100644
--- a/doc/auto_rst4api.py
+++ b/doc/auto_rst4api.py
@@ -27,9 +27,14 @@
 ''' Creates a tree of dirs and restructured text stub files for documenting 
 the API of a python module with sphinx'''
 
-import sys, os, inspect, glob, re
+import sys, os
 from jinja2 import Environment, FileSystemLoader
 
+#import ModuleExplorer from "../tests/modulexplorer.py"
+from imp import load_source
+mpath = os.path.abspath(os.path.join(os.path.dirname(__file__),os.path.pardir,'tests','moduleexplorer.py'))
+ModuleExplorer = load_source('moduleexplorer', mpath).ModuleExplorer
+
 
 class Auto_rst4API_Creator(object):
     AUTOGEN_SIGNATURE = '.. AUTO_RST4API'
@@ -42,49 +47,18 @@ class Auto_rst4API_Creator(object):
         :param moduletemplate: (str) name of the template to be used for module pages
         :param classtemplate: (str) name of the template to be used for class pages
         :param classindextemplate: (str) name of the template to be used for class index page
-        :param exclude_patterns: (seq<str>) sequence of strings containing regexp
-                                 patterns. Each candidate to be documented will be 
-                                 matched against these patterns and will be excluded
-                                 from documentation if it matches any of them.
         :param verbose: (bool) If True (default) status messages will be printed to stdout
         '''
+        
+        self.verbose = verbose
+        self.exclude_patterns = exclude_patterns
+        
         self.env = Environment(loader=FileSystemLoader(templatespath))
         self.moduletemplate = self.env.get_template(moduletemplate)
         self.classtemplate = self.env.get_template(classtemplate)
         self.classindextemplate = self.env.get_template(classindextemplate)
-        self.exclude_patterns = [re.compile(p) for p in exclude_patterns]
-        self.verbose = verbose
         self.overwrite_old = overwrite_old
     
-    def _matchesAnyPattern(self, name, paterns):
-        for p in paterns:
-            if re.match(p,name) is not None:
-                if self.verbose: print 'excluding "%s"'%name
-                return True
-        return False
-    
-    def _getlocalmembernames(self, module, predicate=None):
-        ret =[]
-        modulepath, tail = os.path.split(inspect.getabsfile(module))
-        for n,v in inspect.getmembers(module, predicate):
-            if inspect.isbuiltin(v): 
-                continue #ignore builtin functions
-            try: 
-                memberpath, tail = os.path.split(inspect.getabsfile(v))
-            except TypeError: 
-                continue #ignore builtin modules
-            if memberpath == modulepath: 
-                ret.append(n)
-        return ret
-    
-    def _getSubmodulesFromPath(self, modulepath):
-        g = glob.glob(os.path.join(modulepath,'*','__init__.py'))
-        ret = [re.findall(r".+\/(.*)\/__init__.py", s)[0] for s in g]
-        return ret
-    
-    def _isclass_with_init(self, obj):
-        return inspect.isclass(obj) and hasattr(obj,'__init__')
-    
     def _isautogeneratedfile(self, fname):
         ret = False
         f = open(fname,'r')
@@ -97,10 +71,6 @@ class Auto_rst4API_Creator(object):
         
         return ret
     
-    def _isenumeration(self, obj):
-#        return isinstance(obj, taurus.core.util)
-        return False #@todo
-    
     def cleanAutogenerated(self, apipath):
         '''Removes any previously autogenerated rst file in the given path 
         or its subdirectories
@@ -117,16 +87,6 @@ class Auto_rst4API_Creator(object):
                             os.remove(fullname)
                     except Exception, e:
                         print 'Error accessing %s:%s'%(fullname,repr(e))
-
-    def getAll(self, info, key):
-        mname = info['modulename']
-        try:
-            ret = [(mname,el) for el in info[key]]
-        except KeyError:
-            return []
-        for sminfo in info['submodules'].itervalues():
-            ret += self.getAll(sminfo,key)
-        return ret
         
     def createClassIndex(self, info, ofname ):
         '''
@@ -137,7 +97,7 @@ class Auto_rst4API_Creator(object):
                      :meth:`exploreModule`
         :param ofname: (str) output file name       
         '''
-        classes = self.getAll(info, 'localclassnames') #this is a list of tuples of (modulename,class)
+        classes = ModuleExplorer.getAll(info, 'localclassnames') #this is a list of tuples of (modulename,class)
         classes = sorted(classes, key=lambda item: item[1]) #sort it by class name
         classes = ['.'.join((m,c)) for m,c in classes] # make a full classname 
         if self.verbose: print 'creating "%s" ...'%ofname, 
@@ -149,68 +109,6 @@ class Auto_rst4API_Creator(object):
             if self.verbose: print ' ok.'
         else:
             if self.verbose: print ' skipping (file already exists)'
-            
-            
-    def exploreModule(self, modulename):
-        '''Recursive function that gathers info on a module and all its submodules.
-        
-        :param modulename: the name of the module to explore
-        
-        :return: (dict<str,object>) a dictionary containing submodulenames, 
-                 localclassnames, localfunctionnames, localenumerationnames,
-                 externalmembernames, submodules, warnings
-        '''
-        if self.verbose: print "Exploring %s..."%modulename  
-        warnings = []
-        try:
-          module = __import__(modulename, fromlist = [''])
-        except Exception,e:
-          msg = 'exploreModule: WARNING: skipping documentation for %s. Reason: %s'%(modulename,repr(e))
-          warnings.append(msg)
-          if self.verbose: print msg
-          return dict(modulename = modulename,
-                    basemodulename = modulename.split('.')[-1],
-                    modulepath = None,
-                    submodulenames = [], 
-                    localclassnames = [], 
-                    localfunctionnames = [],
-                    localenumerationnames = [],
-                    externalmembernames = [],
-                    submodules = {},
-                    warnings = warnings)
-        modulepath, tail = os.path.split(inspect.getabsfile(module))
-        
-        submodulenames = sorted(self._getSubmodulesFromPath(modulepath))
-        localclassnames =  sorted(self._getlocalmembernames(module, self._isclass_with_init)) 
-        localfunctionnames = sorted(self._getlocalmembernames(module, inspect.isfunction))
-        localenumerationnames = sorted([])#@todo
-        externalmembernames = sorted([]) #@todo
-#        localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
-#        externalmembers = [n for n,v in inspect.getmembers(object) if (n not in localmembers and not n.startswith('_'))]
-        
-        #filter out excluded members
-        submodulenames = [n for n in submodulenames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-        localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-        localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-        localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-        externalmembernames = [n for n in externalmembernames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-        
-        #recurse
-        submodules = {}
-        for n in submodulenames:
-            sm_name = '.'.join((modulename, n))
-            submodules[n] = self.exploreModule(sm_name)
-        
-        return dict(modulename = modulename,
-                    basemodulename = modulename.split('.')[-1],
-                    modulepath = modulepath,
-                    submodulenames = submodulenames, 
-                    localclassnames = localclassnames, 
-                    localfunctionnames = localfunctionnames,
-                    localenumerationnames = localenumerationnames,
-                    externalmembernames = externalmembernames,
-                    submodules = submodules,
-                    warnings = warnings)
     
     def createStubs(self, info, docparentpath):
         '''creates rst stub files for modules and classes according to the
@@ -253,7 +151,7 @@ class Auto_rst4API_Creator(object):
         for sminfo in info['submodules'].itervalues():
             self.createStubs(sminfo, absdocpath)
     
-    def documentModule(self, modulename, docparentpath):
+    def documentModule(self, modulename, docparentpath, exclude_patterns=()):
         '''
         recursive function that walks on the module structure and generates
         documentation files for the given module and its submodules. It also
@@ -262,95 +160,20 @@ class Auto_rst4API_Creator(object):
         :param modulename: (str) name of the module to document
         :docparentpath: (str) path to the directory in which the documentation 
                         files will be written
+        :param exclude_patterns: (seq<str>) sequence of strings containing regexp
+                 patterns. Each candidate to be documented will be 
+                 matched against these patterns and will be excluded
+                 if it matches any of them.
                         
         :return: (list<str>) list of warning messages 
         '''
-        if self.verbose: print "\nDocumenting %s..."%modulename  
-        moduleinfo = self.exploreModule(modulename)
+        if self.verbose: print "\nDocumenting %s..."%modulename
+        moduleinfo, w = ModuleExplorer.explore(modulename, exclude_patterns=self.exclude_patterns, verbose=self.verbose)
         self.createStubs(moduleinfo, docparentpath)
         self.createClassIndex(moduleinfo, os.path.join(docparentpath,"%s_AllClasses.rst"%modulename))
-        w=self.getAll(moduleinfo, 'warnings')
         if len (w) == 0: return []
         else: return zip(*w)[1]
-        
-
-        
-#    def document_module_OLD(self, modulename, docparentpath):
-#        '''
-#        recursive function that walks on the module structure and generates 
-#        documentation files for the given module and its submodules
-#        
-#        :param modulename: (str) name of the module to document
-#        :docparentpath: (str) path to the directory in which the documentation 
-#                        files will be written
-#                        
-#        :return: (list<str>) list of warning messages 
-#        '''
-#        if self.verbose: print "\nDocumenting %s..."%modulename  
-#        try:
-#          module = __import__(modulename, fromlist = [''])
-#        except Exception,e:
-#          msg = 'WARNING: skipping documentation for %s. Reason: %s'%(modulename,repr(e))
-#          self.warnings.append(msg)
-#          if self.verbose: print msg
-#          return self.warnings
-#        modulepath, tail = os.path.split(inspect.getabsfile(module))
-#        basemodulename = modulename.split('.')[-1]
-#        absdocpath = os.path.join(docparentpath, basemodulename)
-#        
-#        submodules = self._getSubmodulesFromPath(modulepath)
-#        localclassnames =  self._getlocalmembernames(module, self._isclass_with_init)  
-#        localfunctionnames = self._getlocalmembernames(module, inspect.isfunction)
-#        localenumerationnames = []#@todo
-#        externalmembers = [] #@todo
-##        localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
-##        externalmembers = [n for n,v in inspect.getmembers(object) if (n not in localmembers and not n.startswith('_'))]
-#        
-#        #filter out excluded members
-#        submodules = [n for n in submodules if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-#        localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-#        localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-#        localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-#        externalmembers = [n for n in externalmembers if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
-#        
-#        #create the module doc dir if it didn't exist
-#        if not os.path.exists(absdocpath):
-#            os.makedirs(absdocpath, mode=0755)
-#        #create module index stub in doc parent dir
-#        text = self.moduletemplate.render(modulename=modulename,
-#                                 basemodulename=basemodulename,
-#                                 submodules=submodules,
-#                                 localclassnames=localclassnames,
-#                                 localfunctionnames=localfunctionnames,
-#                                 localenumerationnames=localenumerationnames,
-#                                 externalmembers = externalmembers
-#                                 )
-#        ofname = os.path.join(docparentpath,"%s.rst"%basemodulename)
-#        if self.verbose: print 'creating "%s" ...'%ofname, 
-#        if os.path.exists(ofname) and self._isautogeneratedfile(ofname):
-#            if self.verbose: print ' skipping (manually edited file already exists)'
-#        else:
-#            f = open(ofname, "w")
-#            f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
-#            f.close()
-#            if self.verbose: print ' ok.'
-#        #create class stubs
-#        for name in localclassnames:
-#            text = self.classtemplate.render(classname=name, modulename=modulename)
-#            ofname = os.path.join(absdocpath,"_%s.rst"%name)
-#            if self.verbose: print 'creating "%s" ...'%ofname, 
-#            if os.path.exists(ofname) and self._isautogeneratedfile(ofname):
-#                if self.verbose: print ' skipping (manually edited file already exists)'
-#            else:
-#                f = open(ofname, "w")
-#                f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
-#                f.close()
-#                if self.verbose: print ' ok.'
-#        #recurse for submodules
-#        for sm in submodules:
-#        	sm_name = '.'.join((modulename, sm))
-#        	self.documentModule(sm_name, absdocpath)
-#        return self.warnings
+              
         
 def main():    
     import sys
@@ -358,12 +181,12 @@ def main():
         print 'Usage:\n\t%s modulename docpreffix\n\n'%sys.argv[0]
         sys.exit(1)            
     modulename, docparentpath = sys.argv[1:]
-    creator = Auto_rst4API_Creator(exclude_patterns = ['.*/ui'], verbose=True)
-    r = creator.documentModule(modulename, docparentpath)
+    creator = Auto_rst4API_Creator(verbose=True)
+    r = creator.documentModule(modulename, docparentpath, exclude_patterns = ['.*/ui'])
     print '\n\n'+'*'*50
     print "Auto Creation of API docs for %s Finished with %i warnings:"%(modulename,len(r))
     print '\n'.join(r)
     print '*'*50+'\n'
     
-if __name__ == "__main__":
+if __name__ == "__main__":    
     main() 
\ No newline at end of file
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 6498c64..adc3fea 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -244,6 +244,6 @@ intersphinx_mapping = {
     'http://docs.scipy.org/doc/scipy/reference' : None,
     'http://docs.scipy.org/doc/numpy' : None,
     'http://www.tango-controls.org/static/PyTango/latest/doc/html' : None,
-    'http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html' : None,
+    'http://pyqt.sourceforge.net/Docs/PyQt4/' : None,
 }
 
diff --git a/doc/source/devel/coding_guide.rst b/doc/source/devel/coding_guide.rst
index 2bfd2b1..f514bbc 100644
--- a/doc/source/devel/coding_guide.rst
+++ b/doc/source/devel/coding_guide.rst
@@ -14,21 +14,32 @@ development of taurus. So if you want to help out, read on!
 How to contribute to taurus
 ----------------------------
 
-Taurus development is done using SVN. Because taurus is part of Tango_, it uses
-its `tango-cs sourceforge project <https://sourceforge.net/projects/tango-cs/>`_
-to host the source code. This makes it easy for people to contribute to the 
-development of taurus.
+Taurus is part of Tango_ and, more specifically, part of Sardana_. Until release
+3.1 (included) the development of Taurus was managed within the `tango-cs
+sourceforge project <https://sourceforge.net/projects/tango-cs/>`_  and its
+source code was hosted in the Tango SVN repository. Starting from right after
+the Taurus 3.1 release, the source code hosting and general project management
+(tickets, mailing list, etc) will be managed within the Sardana `Sardana
+sourceforge project <https://sourceforge.net/projects/sardana/>`_. The Sardana
+project itself is in the process of migrating its source code hosting from SVN
+to Git and consequently, Taurus code will be hosted on a Git repository after
+the release of Taurus 3.1.
+
 
 How to checkout taurus from SVN
 -------------------------------
 
+.. warning:: These instructions will become obsolete as soon as Taurus 3.1 
+             is released because the code development will be moved from SVN to
+             Git. Updated instructions for using Git will be posted ASAP.
+
 **For read-only**::
 
-    svn co https://tango-cs.svn.sourceforge.net/svnroot/tango-cs/taurus/trunk taurus
+    svn co https://svn.code.sf.net/p/tango-cs/code/gui/taurus/trunk taurus
 
 **To being able to commit**::
 
-    svn co https://<user name>@tango-cs.svn.sourceforge.net/svnroot/tango-cs/taurus/trunk taurus
+    svn co https://<user name>@svn.code.sf.net/p/tango-cs/code/gui/taurus/trunk taurus
 
 .. note::
     
@@ -195,6 +206,7 @@ PyQt4/PySide versions.
    :func:`~taurus.qt.Qt.from_qvariant`.)
 
 .. _Tango: http://www.tango-controls.org/
+.. _Sardana: http://www.sardana-controls.org/
 .. _tango_cs: https://sourceforge.net/projects/tango-cs/
 .. _reStructuredText:  http://docutils.sourceforge.net/rst.html
 .. _Sphinx: http://sphinx.pocoo.org/
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 07ef451..2354fd8 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -10,15 +10,16 @@ Welcome to Taurus's |version| documentation!
 
 .. sidebar:: Latest news
 
+
+    2013-07-25
+        Taurus 3.1.0 released!
+
     2012-04-24
         Taurus 3.0.0 released!
 
     2011-03-23
         Taurus 2.1.1 released!
 
-    2011-03-22:
-        Taurus 2.1.0 released!
-
 
 Taurus is a python framework for both CLI and GUI tango applications. It is
 build on top of PyTango_ and PyQt_. Taurus stands for TAngo User interface 'R' US.
diff --git a/doc/source/users/getting_started.rst b/doc/source/users/getting_started.rst
index c8a953a..c4c7507 100644
--- a/doc/source/users/getting_started.rst
+++ b/doc/source/users/getting_started.rst
@@ -10,8 +10,21 @@ Getting started
 Installing
 ----------
 
-Linux
-~~~~~
+Linux (Debian-based)
+~~~~~~~~~~~~~~~~~~~~
+
+Since v3.0, Taurus is part of the official repositories of Debian (and Ubuntu
+and other Debian-based distros). You can install it and all its dependencies by
+doing (as root)::
+
+       aptitude install python-taurus
+       
+(see more detailed instructions in `this step-by-step howto
+<https://sourceforge.net/p/sardana/wiki/Howto-SardanaFromScratch/>`__)
+
+
+Linux (generic)
+~~~~~~~~~~~~~~~
 
 #. Download the latest version of taurus from http://pypi.python.org/pypi/taurus
 #. Extract the downloaded tar.gz into a temporary directory
@@ -56,9 +69,13 @@ necessary to run taurus on your windows machine
 Working from SVN
 ----------------
 
+.. warning:: These instructions will become obsolete as soon as Taurus 3.1 
+             is released because the code development will be moved from SVN to
+             Git. Updated instructions for using Git will be posted ASAP.
+             
 You can checkout taurus from SVN from the following location::
 
-    svn co http://tango-cs.svn.sourceforge.net/svnroot/tango-cs/gui/taurus/trunk taurus
+    svn co https://svn.code.sf.net/p/tango-cs/code/gui/taurus/trunk taurus taurus
 
 Afterward, if you decide to work directly from SVN code (without installing):
 
@@ -135,18 +152,17 @@ Optional packages
 
       python -c 'import PyQt4.Qwt5; print PyQt4.Qwt5.QWT_VERSION_STR'
 
-- The image widgets are only available if you have Qub_. Qub_ is a graphical
-  library provided by the BLISS group in ESRF_.
-  You may already have Qub_ installed. You will need Qub for qt4.
-  You can check it by doing::
-
-      python -c 'import Qub'
+- The image widgets are provided by the guiqwt_ library. The widgets based on
+  this library replace the previously used Qub_-based image widget which is now
+  considered deprecated in Taurus
     
 - The Gauge widgets are only available if you have the python extension of
   qtcontrols. qtcontrols is part of QTango_.
 
 - The JDraw synoptics widgets are only available if you have the :mod:`ply` 
   package installed.
+  
+- The NeXus browser widget is only available if you have PyMca_ installed
 
 
 .. _numpy: http://numpy.scipy.org/
@@ -159,6 +175,7 @@ Optional packages
 .. _Qt: http://qt.nokia.com/products/
 .. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/
 .. _PyQwt: http://pyqwt.sourceforge.net/
+.. _guiqwt: http://code.google.com/p/guiqwt/
 .. _IPython: http://ipython.scipy.org/
 .. _Qub: http://www.blissgarden.org/projects/qub/
-.. _ESRF: http://www.esrf.eu/
+.. _PyMca: http://pymca.sourceforge.net/
diff --git a/doc/source/users/introduction.rst b/doc/source/users/introduction.rst
index 7a72cf6..df1536f 100644
--- a/doc/source/users/introduction.rst
+++ b/doc/source/users/introduction.rst
@@ -4,16 +4,31 @@
 Introduction
 ============
 
-taurus is a library for connecting client side applications (CLIs and GUIs) to 
-Tango_ device servers. It is built on top of PyTango_ which is a python binding 
-for the Tango_ library. It provides an abstraction layer that allows Tango to 
-be accessed in a pythonic, object oriented way. For the GUI part, taurus is built
+taurus was originally conceived as a library for connecting client side
+applications (CLIs and GUIs) to Tango_ device servers. 
+
+.. note:: More recently, the scope of Taurus
+          has been broadened and it is moving towards supporting pluggins for
+          other control systems (e.g. Epics_, Spec_...). While many concepts of
+          Taurus Design are heavily influenced by the Tango philosophy, the goal
+          is to eventually provide a control-system agnostic API allowing
+          different control systems to be used even simultaneously.
+          Nevertheless, due to its Tango roots, this documentation may assume
+          that you are using Tango.
+
+Taurus is developed as a part of the Sardana_ project, which aims to provide an
+integrated SCADA, but it can be used independently of the rest of Sardana.
+
+For its Tango interface, Taurus uses PyTango_ which is a python binding
+for the Tango_ library. It provides an abstraction layer that allows Tango to be
+accessed in a pythonic, object oriented way. For the GUI part, taurus is built
 on top of the graphical library PyQt_ which is a python binding for Qt_.
 
 The goals of this library are:
- - provide a simple Tango API to the end-user application
- - speed up development of tango based applications
+ - provide a simple Tango (and other control systems) API to the end-user application
+ - speed up development of tango (and other control systems) based applications
  - provide a standardized look-and-feel
+ 
 
 For example, to display the values of four attributes (state, position, velocity, acceleration)
 of a device (motor/icepap/01)::
@@ -51,7 +66,7 @@ Throughout the documentation we will assume that you have a basic knowledge of
 Tango_/PyTango_ and Qt_/PyQt_.
 
 Although taurus is written primarily in pure python, it makes heavy use of 
-PyTango_, numpy_, Qub_, PyQt_ and PyQwt_ to provide good performance even when 
+PyTango_, numpy_, PyQt_ and PyQwt_ to provide good performance even when 
 large amounts of data are involved.
 
 taurus is designed with the philosophy that you should be able to create simple 
@@ -67,12 +82,16 @@ find many concepts familiar.
   :scale: 80
   :align: center
 
-The taurus library is divided into two parts: the core module which handles all 
-interaction with PyTango_ (:ref:`taurus-core-tutorial`) and the widget module which 
-provides a collection of widgets that can be used inside any PyQt_ based GUI
-(:ref:`taurus-widget-tutorial`).
+The taurus library provides a core module that does not depend on PyQt and which
+is in charge of abstracting the lower level comunication with the control system
+(:ref:`taurus-core-tutorial`). On top of the core, the qt module provides a
+collection of widgets that can be used inside any PyQt_ based GUI
+(:ref:`examples`). Recently, the proof-of-concept web module is being
+implemented for providing web widgets.
 
+.. _Sardana: http://www.sardana-controls.org/
 .. _Tango: http://www.tango-controls.org/
+.. _Epics: http://www.aps.anl.gov/epics/
 .. _PyTango: http://packages.python.org/PyTango/
 .. _QTango: http://www.tango-controls.org/download/index_html#qtango3
 .. _`PyTango installation steps`: http://packages.python.org/PyTango/start.html#getting-started
diff --git a/doc/source/users/ui/experimentconfiguration.rst b/doc/source/users/ui/experimentconfiguration.rst
index 9e48153..a17af25 100644
--- a/doc/source/users/ui/experimentconfiguration.rst
+++ b/doc/source/users/ui/experimentconfiguration.rst
@@ -10,6 +10,6 @@ Experiment Configuration user interface
 .. contents::
 
 .. todo:: 
-    Documentation to be written  
+    Experiment Configuration documentation to be written  
 
  
\ No newline at end of file
diff --git a/doc/source/users/ui/index.rst b/doc/source/users/ui/index.rst
index 8e87f7b..44b9111 100644
--- a/doc/source/users/ui/index.rst
+++ b/doc/source/users/ui/index.rst
@@ -19,6 +19,9 @@ User's Interface
     Synoptics <synoptics>
     Macros <macros/index>
     TaurusGui <taurusgui>
+    Experiment Configuration <experimentconfiguration>
+    Sardana Editor <sardanaeditor>
+    
     
 
 This section explains some features that are common to most applications built
diff --git a/doc/source/users/ui/sardanaeditor.rst b/doc/source/users/ui/sardanaeditor.rst
index 26094b9..56873dc 100644
--- a/doc/source/users/ui/sardanaeditor.rst
+++ b/doc/source/users/ui/sardanaeditor.rst
@@ -10,6 +10,6 @@ Sardana Editor's interface
 .. contents::
 
 .. todo:: 
-    Documentation to be written  
+    Sardana Editor documentation to be written  
 
  
\ No newline at end of file
diff --git a/lib/taurus/TaurusCustomSettings.py b/lib/taurus/TaurusCustomSettings.py
index d22dfdb..10f14e1 100644
--- a/lib/taurus/TaurusCustomSettings.py
+++ b/lib/taurus/TaurusCustomSettings.py
@@ -24,25 +24,6 @@
 #############################################################################
 
 """
-This module contains some Taurus-wide default configurations.
-
-The idea is that the final user may edit the values here to customize certain
-aspects of Taurus.
+Deprecation Note: This module has been renamed to "tauruscustomsettings.py
 """
-
-# A map for using custom widgets for certain devices in TaurusForms. It is a
-# dictionary with the following structure: 
-# device_class_name:(classname_with_full_module_path, args, kwargs)
-# where the args and kwargs will be passed to the constructor of the class
-T_FORM_CUSTOM_WIDGET_MAP = \
-    {'SimuMotor':('taurus.qt.qtgui.extra_pool.PoolMotorTV',(),{}),
-     'Motor':('taurus.qt.qtgui.extra_pool.PoolMotorTV',(),{}),
-     'PseudoMotor':('taurus.qt.qtgui.extra_pool.PoolMotorTV',(),{}),
-     'PseudoCounter':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
-     'CTExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
-     'ZeroDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
-     'OneDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
-     'TwoDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
-     'IORegister':('taurus.qt.qtgui.extra_pool.PoolIORegisterTV',(),{})
-    }
-    
+raise DeprecationWarning('"TaurusCustomSettings" module has been renamed. Use "tauruscustomsettings" instead')    
diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py
index 5412f5f..6862570 100644
--- a/lib/taurus/__init__.py
+++ b/lib/taurus/__init__.py
@@ -26,7 +26,7 @@
 """The main taurus module. It contains a reduced set of wrappers around the
 real taurus model classes and information regarding the current release."""
 
-from .core import Release as __R
+from .core import release as __R
 
 class Release:
     pass
diff --git a/lib/taurus/console/enums.py b/lib/taurus/console/enums.py
index 4e0955b..4621895 100644
--- a/lib/taurus/console/enums.py
+++ b/lib/taurus/console/enums.py
@@ -29,7 +29,7 @@ __all__ = ["Alignment"]
 
 __docformat__ = "restructuredtext"
 
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
 
 #: Flaggable alignment for both horizontal and vertical text
 #: Conflicting combinations of flags have undefined meanings.
diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/__init__.py
index 1010874..6677cbb 100644
--- a/lib/taurus/core/__init__.py
+++ b/lib/taurus/core/__init__.py
@@ -27,25 +27,11 @@
 
 __docformat__ = "restructuredtext"
 
-import release as Release
-from .enums import *
-from .taurusbasetypes import *
-from .taurusexception import *
-from .taurusmodel import *
-from .tauruslistener import *
-from .taurusdevice import *
-from .taurusattribute import *
-from .taurusconfiguration import *
-from .taurusdatabase import *
-from .taurusfactory import *
-from .taurusmanager import *
-from .taurusoperation import *
-from .tauruspollingtimer import *
-from .taurusvalidator import *
+import taurus.tauruscustomsettings
 
-# enable compatibility code with tau V1 if tauv1 package is present
-try:
-    from .tauv1 import *
-except:
-    pass
+LIGHTWEIGHT_IMPORTS = getattr(taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False)
 
+if LIGHTWEIGHT_IMPORTS:
+    from init_lightweight import *
+else:
+    from init_bkcomp import *
\ No newline at end of file
diff --git a/lib/taurus/core/enums.py b/lib/taurus/core/enums.py
deleted file mode 100644
index c548893..0000000
--- a/lib/taurus/core/enums.py
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus, a Tango User Interface Library
-## 
-## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-## 
-## Taurus is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-## 
-## Taurus is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU Lesser General Public License for more details.
-## 
-## You should have received a copy of the GNU Lesser General Public License
-## along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
-##
-#############################################################################
-
-"""This module contains all basic taurus enumerations"""
-
-__all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode",
-           "TaurusSerializationMode", "SubscriptionState", "TaurusEventType",
-           "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat",
-           "AttrQuality", "AttrAccess", "DisplayLevel", "ManagerState"]
-
-__docformat__ = "restructuredtext"
-
-import util
-
-TaurusSWDevState = util.Enumeration(
-'TaurusSWDevState', (
-    'Uninitialized',
-    'Running', 
-    'Shutdown', 
-    'Crash', 
-    'EventSystemShutdown'
-))
-
-TaurusSWDevHealth = util.Enumeration(
-'TaurusSWDevHealth', (
-    'Exported',           # device reported exported
-    'ExportedAlive',      # device reported exported and confirmed connection
-    'ExportedNotAlive',   # device reported exported but connection failed!!
-    'NotExported',        # device didn't report exported
-    'NotExportedAlive',   # device didn't report exported but connection confirmed!
-    'NotExportedNotAlive' # device didn't report exported and connection failed
-))
-
-OperationMode = util.Enumeration(
-'OperationMode', (
-    'OFFLINE',
-    'ONLINE'
-))
-
-TaurusSerializationMode = util.Enumeration(
-'TaurusSerializationMode', (
-    'Serial',
-    'Concurrent'
-))
-
-TaurusEventType = util.Enumeration(
-'TaurusEventType', (
-    'Change',
-    'Config',
-    'Periodic',
-    'Error'
-))
-
-MatchLevel = util.Enumeration(
-'MatchLevel', (
-    'ANY', 
-    'SHORT', 
-    'NORMAL', 
-    'COMPLETE', 
-    'SHORT_NORMAL', 
-    'NORMAL_COMPLETE'
-))
-
-TaurusElementType = util.Enumeration(
-'TaurusElementType', (
-    'Unknown',
-    'Name',
-    'DeviceClass',
-    'Device',
-    'DeviceAlias',
-    'Domain',
-    'Family',
-    'Member',
-    'Server',
-    'ServerName',
-    'ServerInstance',
-    'Exported',
-    'Host',
-    'Attribute',
-    'AttributeAlias',
-    'Command',
-    'Property',
-    'Configuration',
-    'Database',
-))
-
-LockStatus = util.Enumeration(
-'LockStatus', (
-    'Unlocked',
-    'Locked',
-    'LockedMaster',
-    'Unknown',
-))
-
-DataFormat = util.Enumeration(
-'DataFormat', (
-    '_0D',
-    '_1D',
-    '_2D'
-))
-
-DataType = util.Enumeration(
-'DataType', (
-    'Integer',
-    'Float',
-    'String',
-    'Boolean',
-))
-
-SubscriptionState = util.Enumeration(
-"SubscriptionState", (
-    "Unsubscribed",
-    "Subscribing",
-    "Subscribed", 
-    "PendingSubscribe"
-))
-
-#################
-# Not in use yet:
-
-AttrQuality = util.Enumeration(
-'AttrQuality', (
-    'ATTR_VALID', 
-    'ATTR_INVALID', 
-    'ATTR_ALARM'
-))
-
-AttrAccess = util.Enumeration(
-'AttrAccess', (
-    'READ', 
-    'READ_WITH_WRITE', 
-    'WRITE', 
-    'READ_WRITE' 
-))
-
-DisplayLevel = util.Enumeration(
-'DisplayLevel', (
-    'OPERATOR', 
-    'EXPERT', 
-    'DEVELOPER'
-))
-
-ManagerState =  util.Enumeration(
-'ManagerState', (
-    'UNINITIALIZED', 
-    'INITED', 
-    'CLEANED'
-)) 
-
-    
diff --git a/lib/taurus/core/epics/__init__.py b/lib/taurus/core/epics/__init__.py
index 2480adf..56dd24a 100644
--- a/lib/taurus/core/epics/__init__.py
+++ b/lib/taurus/core/epics/__init__.py
@@ -38,8 +38,8 @@ The Epics extension implements :mod:`taurus.core` objects that connect to Epics
 objects. The scheme prefix for epics objects is 'epics://'.
 
 You should never create objects of epics classes directly. Instead you
-should use the :class:`taurus.core.TaurusManager` and :class:`taurus.core.TaurusFactory` APIs
-to access all elements.
+should use the :class:`taurus.core.taurusmanager.TaurusManager` and 
+:class:`taurus.core.taurusmanager.TaurusFactory` APIs to access all elements.
 
 For example, to get a reference to the epics process variable (PV) "my:example.RBV" you
 should do something like::
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/epics/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/epics/__taurus_plugin__
diff --git a/lib/taurus/core/epics/epicsfactory.py b/lib/taurus/core/epics/epicsfactory.py
index 6d6a29f..b6922ea 100644
--- a/lib/taurus/core/epics/epicsfactory.py
+++ b/lib/taurus/core/epics/epicsfactory.py
@@ -34,17 +34,29 @@ __all__ = ['EpicsFactory', 'EpicsDatabase', 'EpicsDevice',
 
 import time, re, weakref
 import numpy
-import taurus.core
-from taurus.core.taurusexception import TaurusException
-import taurus.core.util
-from taurus.core import MatchLevel, TaurusSWDevState, SubscriptionState, TaurusEventType
+
+from taurus import Factory
+from taurus.core.taurusexception import TaurusException, DoubleRegistration
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.log import Logger
+from taurus.core.taurusbasetypes import MatchLevel, TaurusSWDevState, \
+    SubscriptionState, TaurusEventType, TaurusAttrValue, TaurusTimeVal, \
+    AttrQuality
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from taurus.core.tauruspollingtimer import TaurusPollingTimer
+
 try:
     import epics 
 except ImportError: #note that if epics is not installed the factory will not be available
-    taurus.core.util.debug('cannot import epics module. Taurus will not support the "epics" scheme')
-    raise
+    from taurus.core.util.log import debug
+    debug('cannot import epics module. Taurus will not support the "epics" scheme')
+    #raise
 
-class AbstractEpicsNameValidator(taurus.core.util.Singleton):
+class AbstractEpicsNameValidator(Singleton):
     #@todo: provide a mechanism to make base_sep configurable at installation time. 
     base_sep = ':' #the following characters need to be escaped with "\":  ^$()<>[{\|.*+?
     name_pattern = ''
@@ -185,7 +197,7 @@ class EpicsConfigurationNameValidator(AbstractEpicsNameValidator):
         return names[0].rsplit('?configuration')[0]#remove the "?configuration..." substring from the fullname 
         
 
-class EpicsDatabase(taurus.core.TaurusDatabase):
+class EpicsDatabase(TaurusDatabase):
     '''
     Dummy database class for Epics (the Database concept is not used in the Epics scheme)
     
@@ -199,7 +211,7 @@ class EpicsDatabase(taurus.core.TaurusDatabase):
         return "EpicsDatabase object calling %s" % name
 
 
-class EpicsDevice(taurus.core.TaurusDevice):
+class EpicsDevice(TaurusDevice):
     '''
     An Epics device object. 
     @todo: For the moment is a dummy object. Eventually we may map it to an epics record.
@@ -219,7 +231,7 @@ class EpicsDevice(taurus.core.TaurusDevice):
     @classmethod
     def factory(cls):
         if cls._factory is None:
-            cls._factory = taurus.Factory(scheme='epics')
+            cls._factory = Factory(scheme='epics')
         return cls._factory
     
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -244,12 +256,12 @@ class EpicsDevice(taurus.core.TaurusDevice):
         else:
             self.info("Unexpected value to decode: %s" % str(event_value))
             new_sw_state = TaurusSWDevState.Crash
-        value = taurus.core.TaurusAttrValue() 
+        value = TaurusAttrValue() 
         value.value = new_sw_state
         return value
     
 
-class EpicsAttribute(taurus.core.TaurusAttribute):
+class EpicsAttribute(TaurusAttribute):
     '''
     A :class:`TaurusAttribute` that gives access to an Epics Process Variable.
     
@@ -260,7 +272,7 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
     '''
     
     def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(taurus.core.TaurusAttribute, name, parent, storeCallback=storeCallback)
+        self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
                
         self.__attr_config = None
         self.__pv = epics.PV(self.getNormalName(), callback=self.onEpicsEvent)
@@ -270,7 +282,7 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
             self._value = self.decode_pv(self.__pv)
         else:
             self.info('connection to epics PV failed')
-            self._value = taurus.core.TaurusAttrValue()
+            self._value = TaurusAttrValue()
         
         #print "INIT",self.__pv, connected
         
@@ -322,37 +334,37 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
     def decode_pv(self, pv):
         """Decodes an epics pv into the expected taurus representation"""
         #@todo: This is a very basic implementation, and things like quality may not be correct
-        attr_value = taurus.core.TaurusAttrValue()
+        attr_value = TaurusAttrValue()
         attr_value.value = pv.value
         if pv.write_access:
             attr_value.w_value = pv.value
         if pv.timestamp is None: 
-            attr_value.time = taurus.core.TaurusTimeVal.now()
+            attr_value.time = TaurusTimeVal.now()
         else:
-            attr_value.time = taurus.core.TaurusTimeVal.fromtimestamp(pv.timestamp)
+            attr_value.time = TaurusTimeVal.fromtimestamp(pv.timestamp)
         if pv.severity > 0:
-            attr_value.quality = taurus.core.AttrQuality.ATTR_ALARM
+            attr_value.quality = AttrQuality.ATTR_ALARM
         else:
-            attr_value.quality = taurus.core.AttrQuality.ATTR_VALID
+            attr_value.quality = AttrQuality.ATTR_VALID
         attr_value.config.data_format = len(numpy.shape(attr_value.value))
         return attr_value
     
     def decode_epics_evt(self, evt):
         """Decodes an epics event (a callback keywords dict) into the expected taurus representation"""
         #@todo: This is a very basic implementation, and things like quality may not be correct
-        attr_value = taurus.core.TaurusAttrValue()
+        attr_value = TaurusAttrValue()
         attr_value.value = evt.get('value')
         if evt.get('write_access', False):
             attr_value.w_value = attr_value.value
         timestamp =  evt.get('timestamp', None)
         if timestamp is None: 
-            attr_value.time = taurus.core.TaurusTimeVal.now()
+            attr_value.time = TaurusTimeVal.now()
         else:
-            attr_value.time = taurus.core.TaurusTimeVal.fromtimestamp(timestamp)
+            attr_value.time = TaurusTimeVal.fromtimestamp(timestamp)
         if evt.get('severity', 1) > 0:
-            attr_value.quality = taurus.core.AttrQuality.ATTR_ALARM
+            attr_value.quality = AttrQuality.ATTR_ALARM
         else:
-            attr_value.quality = taurus.core.AttrQuality.ATTR_VALID
+            attr_value.quality = AttrQuality.ATTR_VALID
         attr_value.config.data_format = len(numpy.shape(attr_value.value))
         return attr_value
 
@@ -410,7 +422,7 @@ class EpicsAttribute(taurus.core.TaurusAttribute):
 
     
 
-class EpicsConfiguration(taurus.core.TaurusConfiguration):
+class EpicsConfiguration(TaurusConfiguration):
     '''
     A :class:`TaurusConfiguration` 
     
@@ -420,7 +432,7 @@ class EpicsConfiguration(taurus.core.TaurusConfiguration):
                  Instead it should be done via the :meth:`EpicsFactory.getConfig`
     '''
     def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback=storeCallback)
+        self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
         
         #fill the attr info
         i = parent.read().config
@@ -457,7 +469,7 @@ class EpicsConfiguration(taurus.core.TaurusConfiguration):
         return self._attr_info   
     
     
-class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+class EpicsFactory(Singleton, TaurusFactory, Logger):
     """
     A Singleton class that provides Epics related objects.
     """
@@ -472,8 +484,8 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
     def init(self, *args, **kwargs):
         """Singleton instance initialization."""
         name = self.__class__.__name__
-        self.call__init__(taurus.core.util.Logger, name)
-        self.call__init__(taurus.core.TaurusFactory)
+        self.call__init__(Logger, name)
+        self.call__init__(TaurusFactory)
         self.epics_attrs = weakref.WeakValueDictionary()
         self.epics_devs = weakref.WeakValueDictionary()
         self.epics_configs = weakref.WeakValueDictionary()
@@ -553,15 +565,15 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         return a
 
     def getConfiguration(self, param):
-        """getConfiguration(param) -> taurus.core.TaurusConfiguration
+        """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
 
         Obtain the object corresponding to the given attribute or full name.
         If the corresponding configuration already exists, the existing instance
         is returned. Otherwise a new instance is stored and returned.
 
-        @param[in] param taurus.core.TaurusAttribute object or full configuration name
+        @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
            
-        @return a taurus.core.TaurusAttribute object
+        @return a taurus.core.taurusattribute.TaurusAttribute object
         @throws TaurusException if the given name is invalid.
         """
         if isinstance(param, str):
@@ -594,10 +606,10 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         if exists is not None:
             if exists == dev: 
                 self.debug("%s has already been registered before" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
             else:
                 self.debug("%s has already been registered before with a different object!" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
         self.epics_devs[name] = dev
     
     def _storeAttr(self, attr):
@@ -606,10 +618,10 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         if exists is not None:
             if exists == attr: 
                 self.debug("%s has already been registered before" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
             else:
                 self.debug("%s has already been registered before with a different object!" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
         self.epics_attrs[name] = attr
         
     def _storeConfig(self, fullname, config):
@@ -619,10 +631,10 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         if exists is not None:
             if exists == config: 
                 self.debug("%s has already been registered before" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
             else:
                 self.debug("%s has already been registered before with a different object!" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
         self.epics_configs[name] = config
         
     def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
@@ -633,7 +645,7 @@ class EpicsFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
            :param period: (float) polling period (in seconds)
            :param unsubscribe_evts: (bool) whether or not to unsubscribe from events
         """
-        tmr = self.polling_timers.get(period,taurus.core.TaurusPollingTimer(period))
+        tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
         self.polling_timers[period] = tmr
         tmr.addAttribute(attribute, self.isPollingEnabled())
         
@@ -678,7 +690,8 @@ def test1():
     
 
 def test2():
-    a=taurus.Attribute('epics://mp49t:sim1.RBV')
+    from taurus import Attribute
+    a = Attribute('epics://mp49t:sim1.RBV')
     class Dummy:
         n=0
         def eventReceived(self, s,t,v):
diff --git a/lib/taurus/core/evaluation/__init__.py b/lib/taurus/core/evaluation/__init__.py
index e4ed11d..baf1402 100644
--- a/lib/taurus/core/evaluation/__init__.py
+++ b/lib/taurus/core/evaluation/__init__.py
@@ -113,7 +113,7 @@ Some examples of valid evaluation models are:
         `eval://2*{tango://a/b/c/d}`
         
     - An attribute that adds two tango attributes together (note we can omit the `tango://` part
-      because tango is the default schema in taurus)
+      because tango is the default scheme in taurus)
       
         `eval://{a/b/c/d}+{f/g/h/i}`
     
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/evaluation/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/evaluation/__taurus_plugin__
diff --git a/lib/taurus/core/evaluation/dev_example.py b/lib/taurus/core/evaluation/dev_example.py
index 5e48bba..65773ff 100644
--- a/lib/taurus/core/evaluation/dev_example.py
+++ b/lib/taurus/core/evaluation/dev_example.py
@@ -57,7 +57,7 @@ class FreeSpaceDevice(EvaluationDevice):
 #===============================================================================
 
 def test1():
-    import taurus.core
+    import taurus
     a = taurus.Attribute('eval://dev=taurus.core.evaluation.dev_example.FreeSpaceDevice;getFreeSpace("/")/1024/1024') #calculates free space in Mb
     print "Free space: %iMb"%a.read().value
     
diff --git a/lib/taurus/core/evaluation/evalfactory.py b/lib/taurus/core/evaluation/evalfactory.py
index 77844f6..f2e3636 100644
--- a/lib/taurus/core/evaluation/evalfactory.py
+++ b/lib/taurus/core/evaluation/evalfactory.py
@@ -35,10 +35,21 @@ __all__ = ['EvaluationFactory', 'EvaluationDatabase', 'EvaluationDevice',
 import time, re, weakref
 import numpy
 
+import taurus
 from taurus.core.taurusexception import TaurusException
-import taurus.core
-from taurus.core import MatchLevel, TaurusSWDevState, SubscriptionState, TaurusEventType
-from taurus.core.util import SafeEvaluator, Singleton, Logger
+from taurus.core.tauruspollingtimer import TaurusPollingTimer
+from taurus.core.taurusbasetypes import MatchLevel, TaurusSWDevState, \
+    SubscriptionState, TaurusEventType, TaurusAttrValue, TaurusTimeVal, \
+    AttrQuality
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.safeeval import SafeEvaluator
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
+
 
 class AbstractEvaluationNameValidator(Singleton):
     #the object name class. *must* be implemented in subclasses
@@ -242,7 +253,7 @@ class EvaluationConfigurationNameValidator(AbstractEvaluationNameValidator):
             transf = re.sub(k,v, transf)
         return transf
 
-class EvaluationDatabase(taurus.core.TaurusDatabase):
+class EvaluationDatabase(TaurusDatabase):
     '''
     Dummy database class for Evaluation (the Database concept is not used in the Evaluation scheme)
     
@@ -256,7 +267,7 @@ class EvaluationDatabase(taurus.core.TaurusDatabase):
         return "EvaluationDatabase object calling %s" % name
 
 
-class EvaluationDevice(taurus.core.TaurusDevice, SafeEvaluator):
+class EvaluationDevice(TaurusDevice, SafeEvaluator):
     '''
     The evaluator object. It is a :class:`TaurusDevice` and is used as the
     parent of :class:`EvaluationAttribute` objects for which it performs the
@@ -271,7 +282,7 @@ class EvaluationDevice(taurus.core.TaurusDevice, SafeEvaluator):
     
     def __init__(self, name, **kw):
         """Object initialization."""
-        self.call__init__(taurus.core.TaurusDevice, name, **kw)
+        self.call__init__(TaurusDevice, name, **kw)
         safedict = {}
         for s in self._symbols:
             if hasattr(self,s):
@@ -312,12 +323,12 @@ class EvaluationDevice(taurus.core.TaurusDevice, SafeEvaluator):
         else:
             self.info("Unexpected value to decode: %s" % str(event_value))
             new_sw_state = TaurusSWDevState.Crash
-        value = taurus.core.TaurusAttrValue() 
+        value = TaurusAttrValue() 
         value.value = new_sw_state
         return value
     
 
-class EvaluationAttribute(taurus.core.TaurusAttribute):
+class EvaluationAttribute(TaurusAttribute):
     '''
     A :class:`TaurusAttribute` that can be used to perform mathematical
     operations involving other arbitrary Taurus attributes. The mathematical
@@ -335,15 +346,15 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
     cref_RegExp = re.compile("\{(.+?)\}") #regexp for references to other taurus models within operation model names
 
     def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(taurus.core.TaurusAttribute, name, parent, storeCallback=storeCallback)
+        self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
         
-        self._value = taurus.core.TaurusAttrValue()
+        self._value = TaurusAttrValue()
         self._value.config.writable = False #Evaluation Attributes are always read-only (at least for now)
         self._references = [] 
         self._validator= self.getNameValidator()
         self._transformation = None
         # reference to the configuration object
-        self.__attr_config = None#taurus.core.TaurusConfiguration()
+        self.__attr_config = None#taurus.core.configuration.TaurusConfiguration()
         self.__subscription_state = SubscriptionState.Unsubscribed
 
         
@@ -475,11 +486,11 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
         try:
             evaluator = self.getParentObj() 
             self._value.value = evaluator.eval(self._transformation)
-            self._value.time = taurus.core.TaurusTimeVal.now()
-            self._value.quality = taurus.core.AttrQuality.ATTR_VALID
+            self._value.time = TaurusTimeVal.now()
+            self._value.quality = AttrQuality.ATTR_VALID
             self._value.config.data_format = len(numpy.shape(self._value.value))
         except Exception, e:
-            self._value.quality = taurus.core.AttrQuality.ATTR_INVALID
+            self._value.quality = AttrQuality.ATTR_INVALID
             self.warning("the function '%s' could not be evaluated. Reason: %s"%(self._transformation, repr(e)))
             #self.traceback(taurus.Warning)
             
@@ -566,7 +577,7 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
         
         initial_subscription_state = self.__subscription_state
         
-        ret = taurus.core.TaurusAttribute.addListener(self, listener)
+        ret = TaurusAttribute.addListener(self, listener)
 
         if not ret:
             return ret
@@ -586,7 +597,7 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
         """ Remove a TaurusListener from the listeners list. If polling enabled 
             and it is the last element then stop the polling timer.
             If the listener is not registered nothing happens."""
-        ret = taurus.core.TaurusAttribute.removeListener(self, listener)
+        ret = TaurusAttribute.removeListener(self, listener)
 
         cfg = self._getRealConfig()
         cfg.removeListener(listener)
@@ -597,7 +608,7 @@ class EvaluationAttribute(taurus.core.TaurusAttribute):
         return ret
     
 
-class EvaluationConfiguration(taurus.core.TaurusConfiguration):
+class EvaluationConfiguration(TaurusConfiguration):
     '''
     A :class:`TaurusConfiguration` 
     
@@ -607,7 +618,7 @@ class EvaluationConfiguration(taurus.core.TaurusConfiguration):
                  Instead it should be done via the :meth:`EvaluationFactory.getConfig`
     '''
     def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback=storeCallback)
+        self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
         
         #fill the attr info
         i = parent.read().config
@@ -643,7 +654,7 @@ class EvaluationConfiguration(taurus.core.TaurusConfiguration):
         """ Returns the current configuration for the attribute."""
         return self._attr_info   
     
-class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
+class EvaluationFactory(Singleton, TaurusFactory, Logger):
     """
     A Singleton class that provides Evaluation related objects.
     """
@@ -659,7 +670,7 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
         """Singleton instance initialization."""
         name = self.__class__.__name__
         self.call__init__(Logger, name)
-        self.call__init__(taurus.core.TaurusFactory)
+        self.call__init__(TaurusFactory)
         self.eval_attrs = weakref.WeakValueDictionary()
         self.eval_devs = weakref.WeakValueDictionary()
         self.eval_configs = weakref.WeakValueDictionary()
@@ -752,15 +763,15 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
         return a
 
     def getConfiguration(self, param):
-        """getConfiguration(param) -> taurus.core.TaurusConfiguration
+        """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
 
         Obtain the object corresponding to the given attribute or full name.
         If the corresponding configuration already exists, the existing instance
         is returned. Otherwise a new instance is stored and returned.
 
-        @param[in] param taurus.core.TaurusAttribute object or full configuration name
+        @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
            
-        @return a taurus.core.TaurusAttribute object
+        @return a taurus.core.taurusattribute.TaurusAttribute object
         @throws TaurusException if the given name is invalid.
         """
         if isinstance(param, str):
@@ -793,10 +804,10 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
         if exists is not None:
             if exists == dev: 
                 self.debug("%s has already been registered before" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
             else:
                 self.debug("%s has already been registered before with a different object!" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
         self.eval_devs[name] = dev
     
     def _storeAttr(self, attr):
@@ -805,10 +816,10 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
         if exists is not None:
             if exists == attr: 
                 self.debug("%s has already been registered before" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
             else:
                 self.debug("%s has already been registered before with a different object!" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
         self.eval_attrs[name] = attr
         
     def _storeConfig(self, fullname, config):
@@ -818,10 +829,10 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
         if exists is not None:
             if exists == config: 
                 self.debug("%s has already been registered before" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
             else:
                 self.debug("%s has already been registered before with a different object!" % name)
-                raise taurus.core.DoubleRegistration
+                raise DoubleRegistration
         self.eval_configs[name] = config
         
     def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
@@ -832,7 +843,7 @@ class EvaluationFactory(Singleton, taurus.core.TaurusFactory, Logger):
            :param period: (float) polling period (in seconds)
            :param unsubscribe_evts: (bool) whether or not to unsubscribe from events
         """
-        tmr = self.polling_timers.get(period,taurus.core.TaurusPollingTimer(period))
+        tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
         self.polling_timers[period] = tmr
         tmr.addAttribute(attribute, self.isPollingEnabled())
         
diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/init_bkcomp.py
similarity index 94%
copy from lib/taurus/core/__init__.py
copy to lib/taurus/core/init_bkcomp.py
index 1010874..cd6f900 100644
--- a/lib/taurus/core/__init__.py
+++ b/lib/taurus/core/init_bkcomp.py
@@ -28,7 +28,7 @@
 __docformat__ = "restructuredtext"
 
 import release as Release
-from .enums import *
+#from .enums import * #note: all the enums from enums.py were moved to taurusbasetypes.py
 from .taurusbasetypes import *
 from .taurusexception import *
 from .taurusmodel import *
diff --git a/lib/taurus/console/enums.py b/lib/taurus/core/init_lightweight.py
similarity index 69%
copy from lib/taurus/console/enums.py
copy to lib/taurus/core/init_lightweight.py
index 4e0955b..994f2d4 100644
--- a/lib/taurus/console/enums.py
+++ b/lib/taurus/core/init_lightweight.py
@@ -23,21 +23,21 @@
 ##
 #############################################################################
 
-""" """
-
-__all__ = ["Alignment"]
+"""The core module"""
 
 __docformat__ = "restructuredtext"
 
-from taurus.core.util import Enumeration
-
-#: Flaggable alignment for both horizontal and vertical text
-#: Conflicting combinations of flags have undefined meanings.
-Alignment = Enumeration("Alignment", ( \
-    ("Left",    0x0001),
-    ("Right",   0x0002),
-    ("HCenter", 0x0004),
-    ("Top",     0x0020),
-    ("Bottom",  0x0040),
-    ("VCenter", 0x0080),
-    ("Center",  0x0004 | 0x0080 ) ) )
\ No newline at end of file
+#import release as Release
+from .taurusbasetypes import *
+# from .taurusexception import *
+# from .taurusmodel import *
+# from .tauruslistener import *
+# from .taurusdevice import *
+# from .taurusattribute import *
+# from .taurusconfiguration import *
+# from .taurusdatabase import *
+# from .taurusfactory import *
+# from .taurusmanager import *
+# from .taurusoperation import *
+# from .tauruspollingtimer import *
+# from .taurusvalidator import *
diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py
index aa12ca3..17cbea0 100644
--- a/lib/taurus/core/release.py
+++ b/lib/taurus/core/release.py
@@ -53,7 +53,7 @@ name = 'taurus'
 # bdist_deb does not accept underscores (a Debian convention).
 
 
-version_info = (3,0,1,'dev',0)
+version_info = (3,1,0,'rc',0)
 version = '.'.join(map(str, version_info[:3]))
 revision = str(version_info[4])
 
@@ -65,7 +65,7 @@ It is build on top of PyTango and PyQt."""
 
 license = 'LGPL'
 
-authors = {'Tiago'          : ('Tiago Coutinho','tcoutinho at cells.es'),
+authors = {'Tiago'          : ('Tiago Coutinho','tiago.coutinho at esrf.fr'),
            'Pascual-Izarra' : ('Carlos Pascual-Izarra','cpascual at cells.es') }
             
 
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/resource/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/resource/__taurus_plugin__
diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py
index f2565d3..d815ebb 100644
--- a/lib/taurus/core/resource/resfactory.py
+++ b/lib/taurus/core/resource/resfactory.py
@@ -29,9 +29,17 @@ simfactory.py:
 
 import os, imp, operator, types
 
-import taurus.core
-import taurus.core.util
-from taurus.core import OperationMode, MatchLevel
+from taurus import Factory, Database, Manager
+from taurus.core.taurusexception import TaurusException
+from taurus.core.taurusbasetypes import OperationMode, MatchLevel, \
+    TaurusAttrValue, TaurusEventType
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.log import Logger
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
 
 class ModuleDict(dict):
     def __init__(self, mod):
@@ -40,7 +48,7 @@ class ModuleDict(dict):
     def __getitem__(self, name):
         return self.__mod.__getattribute__(name)
 
-class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+class ResourcesFactory(Singleton, TaurusFactory, Logger):
     """A Singleton class designed to provide Simulation related objects."""
 
     #: the list of schemes that this factory supports. For this factory: 'res' 
@@ -61,8 +69,8 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
         """Singleton instance initialization.
            **For internal usage only**"""
         name = self.__class__.__name__
-        self.call__init__(taurus.core.util.Logger, name)
-        self.call__init__(taurus.core.TaurusFactory)
+        self.call__init__(Logger, name)
+        self.call__init__(TaurusFactory)
         
         self._resource_map = {}
         self._resource_priority = {}
@@ -159,7 +167,7 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
                 return i, c, alias.split(c, 1)
         return None, '', [alias]
     
-    def __splitSchema(self, alias):
+    def __splitScheme(self, alias):
         try:
             i = alias.index('://')
             return alias[:i], alias[i+3:]
@@ -173,7 +181,7 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
            
            :return: (str) the value for the given key
         """
-        alias = self.__splitSchema(key)
+        alias = self.__splitScheme(key)
         if alias[0] and not alias[0] in ResourcesFactory.schemes:
             return None
         i, c, alias = self.__splitResourceName(alias[1])
@@ -186,8 +194,8 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
            
         :param absolute_name: (str) the object absolute name string
 
-        :return: (taurus.core.TaurusModel) a class object that should be a subclass of a taurus.core.TaurusModel
-        :raise: (taurus.core.TaurusException) if the given name is invalid.
+        :return: (taurus.core.taurusmodel.TaurusModel) a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
+        :raise: (taurus.core.taurusexception.TaurusException) if the given name is invalid.
         """
         objType = None
 
@@ -203,18 +211,18 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
         :param alias: (str) database name string alias. If None, the 
                      default database is used
                            
-        :return: (taurus.core.TaurusDatabase) database object
+        :return: (taurus.core.taurusdatabase.TaurusDatabase) database object
         :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.TaurusException) if the given alias is invalid.
+        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         if alias is None:
-            return taurus.Database()
+            return Database()
         
         alias = self.getValue(alias)
         if not alias:
             raise NameError(alias)
         
-        return taurus.Manager().getDatabase(alias)
+        return Manager().getDatabase(alias)
 
     def getDevice(self, alias):
         """
@@ -224,14 +232,14 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
            
         :param alias: device name string alias.
         
-        :return: (taurus.core.TaurusDevice) device object
+        :return: (taurus.core.taurusdevice.TaurusDevice) device object
         :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.TaurusException) if the given alias is invalid.
+        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         alias = self.getValue(alias)
         if not alias:
             raise NameError(alias)
-        return taurus.Manager().getDevice(alias)
+        return Manager().getDevice(alias)
         
     def getAttribute(self, alias):
         """
@@ -241,14 +249,14 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
 
         :param alias: (str) attribute name string alias
              
-        :return: (taurus.core.TaurusAttribute) attribute object
+        :return: (taurus.core.taurusattribute.TaurusAttribute) attribute object
         :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.TaurusException) if the given alias is invalid.
+        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         alias = self.getValue(alias)
         if not alias:
             raise NameError(alias)
-        return taurus.Manager().getAttribute(alias)
+        return Manager().getAttribute(alias)
 
     def getConfiguration(self, alias):
         """
@@ -258,12 +266,12 @@ class ResourcesFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, ta
 
         :param alias: (str) configuration name string alias
              
-        :return: (taurus.core.TaurusConfiguration) configuration object
+        :return: (taurus.core.taurusconfiguration.TaurusConfiguration) configuration object
         :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.TaurusException) if the given alias is invalid.
+        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         alias = self.getValue(alias)
         if not alias:
             raise NameError(alias)
-        return taurus.Manager().getConfiguration(alias)
+        return Manager().getConfiguration(alias)
 
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/simulation/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/simulation/__taurus_plugin__
diff --git a/lib/taurus/core/simulation/simfactory.py b/lib/taurus/core/simulation/simfactory.py
index 1d534cf..ea62fca 100644
--- a/lib/taurus/core/simulation/simfactory.py
+++ b/lib/taurus/core/simulation/simfactory.py
@@ -36,14 +36,20 @@ scheme     userinfo         hostname  port  path  filename extension parameter(s
                     authority
 """
 
-import os
-
-import taurus.core 
-import taurus.core.util
-from taurus.core import OperationMode, MatchLevel
-
-
-class SimulationDatabase(taurus.core.TaurusDatabase):
+from taurus import Factory
+from taurus.core.taurusexception import TaurusException
+from taurus.core.taurusbasetypes import OperationMode, MatchLevel, \
+    TaurusAttrValue, TaurusEventType
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusconfiguration import TaurusConfiguration
+
+
+class SimulationDatabase(TaurusDatabase):
     def factory(self):
         return SimulationFactory()
         
@@ -54,13 +60,13 @@ class SimulationDatabase(taurus.core.TaurusDatabase):
         return "a/b/c"
     
     def cache(self):
-        return taurus.Factory('tango').getDatabase().cache()
+        return Factory('tango').getDatabase().cache()
         
     def __getattr__(self, name):
         return "SimulationDatabase object calling %s" % name
     
    
-class SimulationDevice(taurus.core.TaurusDevice):
+class SimulationDevice(TaurusDevice):
     def _createHWObject(self):
         return "Simulation"
 
@@ -73,7 +79,7 @@ class SimulationDevice(taurus.core.TaurusDevice):
 class D:
     pass
     
-class SimulationConfiguration(taurus.core.TaurusConfiguration):
+class SimulationConfiguration(TaurusConfiguration):
     
     def __init__(self, name, parent, storeCallback = None):
         i = D()
@@ -116,7 +122,7 @@ class SimulationConfiguration(taurus.core.TaurusConfiguration):
         i.attr_name = attr.getSimpleName()
         i.attr_fullname = attr.getNormalName()
         self.attr_info = i
-        self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback=storeCallback)
+        self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
 
     def factory(self):
         return SimulationFactory()
@@ -159,16 +165,16 @@ class SimulationConfiguration(taurus.core.TaurusConfiguration):
         return value
 
     
-class SimulationAttribute(taurus.core.TaurusAttribute):
+class SimulationAttribute(TaurusAttribute):
 
     def __init__(self, name, parent, storeCallback = None):
-        self._value = taurus.core.TaurusAttrValue()
+        self._value = TaurusAttrValue()
         self._config = None
         self._value.value = 123.45
         self._value.w_value = 123.45
         self._value.quality = "ATTR_VALID"
         self._value.time_stamp = 1
-        self.call__init__(taurus.core.TaurusAttribute, name, parent, storeCallback=storeCallback)
+        self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
         
     def __getattr__(self,name):
         return getattr(self.getConfig(), name)
@@ -218,18 +224,18 @@ class SimulationAttribute(taurus.core.TaurusAttribute):
             If it is the first element and Polling is enabled starts the 
             polling mechanism.
             If the listener is already registered nothing happens."""
-        ret = taurus.core.TaurusAttribute.addListener(self, listener)
+        ret = TaurusAttribute.addListener(self, listener)
         if not ret:
             return ret
 
         #fire a first configuration event
         cfg_val, val = self.getConfig().getValueObj(), self.read()
-        self.fireEvent(taurus.core.TaurusEventType.Config, cfg_val, listener)
+        self.fireEvent(TaurusEventType.Config, cfg_val, listener)
         #fire a first change event
-        self.fireEvent(taurus.core.TaurusEventType.Change, val, listener)
+        self.fireEvent(TaurusEventType.Change, val, listener)
         return ret
 
-class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+class SimulationFactory(Singleton, TaurusFactory, Logger):
     """A Singleton class designed to provide Simulation related objects."""
 
     schemes = ("simulation",)
@@ -241,17 +247,17 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
     def init(self, *args, **kwargs):
         """Singleton instance initialization."""
         name = self.__class__.__name__
-        self.call__init__(taurus.core.util.Logger, name)
-        self.call__init__(taurus.core.TaurusFactory)
+        self.call__init__(Logger, name)
+        self.call__init__(TaurusFactory)
         
     def findObjectClass(self, absolute_name):
-        """findObjectClass(string absolute_name) -> taurus.core.TaurusModel subclass
+        """findObjectClass(string absolute_name) -> taurus.core.taurusmodel.TaurusModel subclass
            
         Obtain the class object corresponding to the given name.
            
         @param[in] absolute_name the object absolute name string
 
-        @return a class object that should be a subclass of a taurus.core.TaurusModel
+        @return a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
         @throws TaurusException if the given name is invalid.
         """
         objType = None
@@ -270,7 +276,7 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
         return objType
 
     def getDatabase(self, db_name=None):
-        """getDatabase(string db_name) -> taurus.core.TaurusDatabase
+        """getDatabase(string db_name) -> taurus.core.taurusdatabase.TaurusDatabase
            
         Obtain the object corresponding to the given database name or the 
         default database if db_name is None.
@@ -278,43 +284,43 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
         instance is returned. Otherwise a new instance is stored and returned.
            
         @param[in] db_name database name string. It should be formed like: 
-                           <schema>://<authority>. If <schema> is ommited then 
-                           it will use the default schema. if db_name is None, 
+                           <scheme>://<authority>. If <scheme> is ommited then 
+                           it will use the default scheme. if db_name is None, 
                            the default database is used
                            
-        @return a taurus.core.TaurusDatabase object 
+        @return a taurus.core.taurusdatabase.TaurusDatabase object 
         @throws TaurusException if the given name is invalid.
         """
         if not db_name is None:
             validator = SimulationDatabase.getNameValidator()
             params = validator.getParams(db_name)
             if params is None:
-                raise taurus.core.TaurusException("Invalid database name %s." % db_name)
+                raise TaurusException("Invalid database name %s." % db_name)
         
         if not hasattr(self, "_db"):
             self._db = SimulationDatabase("sim:01")
         return self._db
 
     def getDevice(self, dev_name):
-        """getDevice(string dev_name) -> taurus.core.TaurusDevice
+        """getDevice(string dev_name) -> taurus.core.taurusdevice.TaurusDevice
            
         Obtain the object corresponding to the given device name. If the 
         corresponding device already exists, the existing instance is returned. 
         Otherwise a new instance is stored and returned.
            
         @param[in] dev_name the device name string. It should be formed like:
-                            <schema>://<authority>/<device name>. If <schema> 
-                            is ommited then it will use the default schema. 
+                            <scheme>://<authority>/<device name>. If <scheme> 
+                            is ommited then it will use the default scheme. 
                             If authority is ommited then it will use the 
-                            default authority for the schema.
+                            default authority for the scheme.
         
-        @return a taurus.core.TaurusDevice object 
+        @return a taurus.core.taurusdevice.TaurusDevice object 
         @throws TaurusException if the given name is invalid.
         """
         validator = SimulationDevice.getNameValidator()
         params = validator.getParams(dev_name)
         if params is None:
-            raise taurus.core.TaurusException("Invalid device name %s." % dev_name)
+            raise TaurusException("Invalid device name %s." % dev_name)
 
         if not hasattr(self, "_dev"):
             db = self.getDatabase("sim:01")
@@ -322,7 +328,7 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
         return self._dev
         
     def getAttribute(self, attr_name):
-        """getAttribute(string attr_name) -> taurus.core.TaurusAttribute
+        """getAttribute(string attr_name) -> taurus.core.taurusattribute.TaurusAttribute
 
         Obtain the object corresponding to the given attribute name.
         If the corresponding attribute already exists, the existing instance
@@ -330,14 +336,14 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
 
         @param[in] attr_name string attribute name
              
-        @return a taurus.core.TaurusAttribute object 
+        @return a taurus.core.taurusattribute.TaurusAttribute object 
         @throws TaurusException if the given name is invalid.
         """
         validator = SimulationAttribute.getNameValidator()
         params = validator.getParams(attr_name)
         
         if params is None:
-            raise taurus.core.TaurusException("Invalid attribute name %s." % attr_name)
+            raise TaurusException("Invalid attribute name %s." % attr_name)
         
         if not hasattr(self, "_attr"):
             dev = self.getDevice("sim:01/a/b/c")
@@ -345,15 +351,15 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
         return self._attr
 
     def getConfiguration(self, param):
-        """getConfiguration(param) -> taurus.core.TaurusConfiguration
+        """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
 
         Obtain the object corresponding to the given attribute or full name.
         If the corresponding configuration already exists, the existing instance
         is returned. Otherwise a new instance is stored and returned.
 
-        @param[in] param taurus.core.TaurusAttribute object or full configuration name
+        @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
            
-        @return a taurus.core.TaurusAttribute object
+        @return a taurus.core.taurusattribute.TaurusAttribute object
         @throws TaurusException if the given name is invalid.
         """
         if isinstance(param, str):
@@ -365,7 +371,7 @@ class SimulationFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, t
         params = validator.getParams(name)
                 
         if params is None:
-            raise taurus.core.TaurusException("Invalid configuration name %s." % name)
+            raise taurus.core.taurusexception.TaurusException("Invalid configuration name %s." % name)
 
         if not hasattr(self, "_conf"):
             name = "sim:01/a/b/c/d?configuration"
diff --git a/lib/taurus/core/tango/__init__.py b/lib/taurus/core/tango/__init__.py
index b2ec715..2938c66 100644
--- a/lib/taurus/core/tango/__init__.py
+++ b/lib/taurus/core/tango/__init__.py
@@ -31,7 +31,7 @@ taurus scheme, when specifing a tango model name, the scheme prefix ('tango://')
 be omited.
 
 You should never create objects of tango classes directly. Instead you
-should use the :class:`taurus.core.TaurusManager` and :class:`taurus.core.TaurusFactory` APIs
+should use the :class:`taurus.core.taurusmanager.TaurusManager` and :class:`taurus.core.taurusfactory.TaurusFactory` APIs
 to access all elements.
 
 For example, to get a reference to the Tango attribute my/tango/device/state you
diff --git a/lib/taurus/core/util/decorator/__init__.py b/lib/taurus/core/tango/__taurus_plugin__
similarity index 100%
copy from lib/taurus/core/util/decorator/__init__.py
copy to lib/taurus/core/tango/__taurus_plugin__
diff --git a/lib/taurus/core/tango/enums.py b/lib/taurus/core/tango/enums.py
index d6c5a19..adcd55a 100644
--- a/lib/taurus/core/tango/enums.py
+++ b/lib/taurus/core/tango/enums.py
@@ -30,15 +30,14 @@ __all__ = ["TangoObjectType", "EVENT_TO_POLLING_EXCEPTIONS",
 
 __docformat__ = "restructuredtext"
 
-import taurus.core.util
+from taurus.core.taurusbasetypes import SubscriptionState
+from taurus.core.util.enumeration import Enumeration
 
-TangoObjectType = taurus.core.util.Enumeration("TangoObjectType", 
+TangoObjectType = Enumeration("TangoObjectType", 
                               ["Database", "Server", "Class", "Device", 
                                "Attribute","Property","Configuration",
                                "Object"])
 
-SubscriptionState = taurus.core.SubscriptionState #moved from here to taurus.core. Copied here for backwards compatibility
-
 import numpy
 import PyTango
 
diff --git a/lib/taurus/core/tango/img/img.py b/lib/taurus/core/tango/img/img.py
index c643a86..1e30e0f 100644
--- a/lib/taurus/core/tango/img/img.py
+++ b/lib/taurus/core/tango/img/img.py
@@ -31,15 +31,16 @@ __all__ = ['ImageDevice', 'ImageCounterDevice', 'PyImageViewer', 'ImgGrabber',
 
 __docformat__ = 'restructuredtext'
 
-import taurus.core
-import taurus.core.tango
-import taurus.core.util
 
-class ImageDevice(taurus.core.tango.TangoDevice):
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.tango import TangoDevice
+from taurus.core.util.containers import CaselessDict
+
+class ImageDevice(TangoDevice):
     """A class encapsulating a generic image device"""
     
     def __init__(self, name, image_name='image', **kw):
-        self.call__init__(taurus.core.tango.TangoDevice, name, **kw)
+        self.call__init__(TangoDevice, name, **kw)
         self.setImageAttrName(image_name)
 
     def addImageAttrName(self, attr_name):
@@ -48,7 +49,7 @@ class ImageDevice(taurus.core.tango.TangoDevice):
         self._image_attr_names.append(attr_name)
             
     def setImageAttrName(self, attr_name):
-        self._image_attr_names = taurus.core.util.CaselessList()
+        self._image_attr_names = CaselessList()
         self.addImageAttrName(attr_name)
         
     def getImageAttrName(self, idx=0):
@@ -56,13 +57,14 @@ class ImageDevice(taurus.core.tango.TangoDevice):
     
     def getImageAttrNames(self):
         return self._image_attr_names
-        
+
+
 class ImageCounterDevice(ImageDevice):
     """A class encapsulating a generic image device that has an image counter
     attribute"""
     
     def __init__(self, name, image_name='image', **kw):
-        self._image_data = taurus.core.util.CaselessDict()
+        self._image_data = CaselessDict()
         self.call__init__(ImageDevice, name, **kw)
         self._image_id_attr = self.getAttribute(self.getImageIDAttrName())
         self._image_id_attr.addListener(self)
@@ -87,7 +89,7 @@ class ImageCounterDevice(ImageDevice):
     
     def eventReceived(self, evt_src, evt_type, evt_value):
         if evt_src == self._image_id_attr:
-            if evt_type == taurus.core.TaurusEventType.Change:
+            if evt_type == TaurusEventType.Change:
                 self._setDirty()
                 self.fireEvent(evt_type, evt_value)
         else:
@@ -123,7 +125,7 @@ class Falcon(ImageCounterDevice):
     
     def eventReceived(self, evt_src, evt_type, evt_value):
         if evt_src == self.getAttribute("imageformat"):
-            if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+            if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
                 self._color = evt_value.value.lower() == "rgb24"
                 return
         ImageCounterDevice.eventReceived(self, evt_src, evt_type, evt_value)
diff --git a/lib/taurus/core/tango/sardana/macro.py b/lib/taurus/core/tango/sardana/macro.py
index 93ed27a..12dbc47 100644
--- a/lib/taurus/core/tango/sardana/macro.py
+++ b/lib/taurus/core/tango/sardana/macro.py
@@ -38,7 +38,10 @@ import copy
 import threading
 import PyTango
 
-from taurus.core.util import etree, USER_NAME, CodecFactory
+from lxml import etree
+
+from taurus.core.util.user import USER_NAME
+from taurus.core.util.codecs import CodecFactory
 
 class MacroRunException(Exception):
     pass
diff --git a/lib/taurus/core/tango/sardana/macroserver.py b/lib/taurus/core/tango/sardana/macroserver.py
index 2ae5d3c..906057f 100644
--- a/lib/taurus/core/tango/sardana/macroserver.py
+++ b/lib/taurus/core/tango/sardana/macroserver.py
@@ -39,17 +39,25 @@ import os.path as osp
 
 import PyTango
 
+from lxml import etree
+
 from taurus import Device, Factory
-from taurus.core import TaurusManager, TaurusEventType, TaurusSWDevState, \
+from taurus.core.taurusmanager import TaurusManager
+from taurus.core.taurusbasetypes import TaurusEventType, TaurusSWDevState, \
     TaurusSerializationMode
-from taurus.core.util import etree, CodecFactory, CaselessDict, Logger, \
-    EventGenerator, AttributeEventWait
+
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.util.event import EventGenerator, AttributeEventWait
 from taurus.core.tango import TangoDevice
 
-from macro import MacroInfo, Macro, MacroNode, ParamFactory, RepeatNode, \
+from .macro import MacroInfo, Macro, MacroNode, ParamFactory, RepeatNode, \
     RepeatParamNode, SingleParamNode, ParamNode
-from sardana import BaseSardanaElementContainer, BaseSardanaElement
-from pool import getChannelConfigs
+from .sardana import BaseSardanaElementContainer, BaseSardanaElement
+from .pool import getChannelConfigs
+
 CHANGE_EVT_TYPES = TaurusEventType.Change, TaurusEventType.Periodic
 
 
diff --git a/lib/taurus/core/tango/sardana/motion.py b/lib/taurus/core/tango/sardana/motion.py
index 25c472e..db8fb9c 100644
--- a/lib/taurus/core/tango/sardana/motion.py
+++ b/lib/taurus/core/tango/sardana/motion.py
@@ -31,7 +31,7 @@ __docformat__ = 'restructuredtext'
 
 import time
 
-from taurus.core.util import CaselessDict
+from taurus.core.util.containers import CaselessDict
 
 class Moveable:
     """ An item that can 'move'. In order to move it you need to provide a list
diff --git a/lib/taurus/core/tango/sardana/pool.py b/lib/taurus/core/tango/sardana/pool.py
index 5984683..7abd0a4 100644
--- a/lib/taurus/core/tango/sardana/pool.py
+++ b/lib/taurus/core/tango/sardana/pool.py
@@ -46,13 +46,19 @@ from PyTango import DevState, AttrDataFormat, AttrQuality, DevFailed, \
     DeviceProxy
 
 from taurus import Factory, Device
-from taurus.core import TaurusEventType, AttributeNameValidator
-from taurus.core.util import Logger, CaselessDict, CodecFactory, \
-    EventGenerator, AttributeEventWait, AttributeEventIterator
+from taurus.core.taurusbasetypes import TaurusEventType, TaurusSWDevState, \
+    TaurusSerializationMode
+from taurus.core.taurusvalidator import AttributeNameValidator
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.event import EventGenerator, AttributeEventWait, \
+    AttributeEventIterator
 from taurus.core.tango import TangoDevice, FROM_TANGO_TO_STR_TYPE
 
-from sardana import BaseSardanaElementContainer, BaseSardanaElement
-from motion import Moveable, MoveableSource
+from .sardana import BaseSardanaElementContainer, BaseSardanaElement
+from .motion import Moveable, MoveableSource
 
 Ready = Standby = DevState.ON
 Counting = Acquiring = Moving = DevState.MOVING
@@ -378,7 +384,7 @@ class PoolElement(BaseElement, TangoDevice):
         return self._attrEG.get(name)
 
     def getAttrObj(self, name):
-        """Returns the taurus.core.TangoAttribute object"""
+        """Returns the taurus.core.tangoattribute.TangoAttribute object"""
         attrEG = self._attrEG.get(name)
         if attrEG is None:
             return None
@@ -931,12 +937,7 @@ class MotorGroup(PoolElement, Moveable):
     #
 
     def _start(self, *args, **kwargs):
-        #+++ 25.2.2013, TK
-        new_pos = []
-        for elm in args[0]:
-            new_pos.append(elm)
-        #+++
-        # new_pos = args[0]
+        new_pos = args[0]
         try:
             self.write_attribute('position', new_pos)
         except DevFailed, df:
diff --git a/lib/taurus/core/tango/sardana/sardana.py b/lib/taurus/core/tango/sardana/sardana.py
index 2e2c576..86a644e 100644
--- a/lib/taurus/core/tango/sardana/sardana.py
+++ b/lib/taurus/core/tango/sardana/sardana.py
@@ -39,13 +39,13 @@ __all__ = ["BaseSardanaElement", "BaseSardanaElementContainer",
 
 __docformat__ = 'restructuredtext'
 
-import socket
-
 import PyTango
 
-import taurus
-from taurus.core.util import Enumeration, Singleton, Logger, CaselessDict, \
-    CodecFactory
+from taurus.core.util.enumeration import Enumeration
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.codecs import CodecFactory
 
 PoolElementType = Enumeration("PoolElementType",
     ("0D", "1D", "2D", "Communication", "CounterTimer", "IORegister",
@@ -665,6 +665,7 @@ class SardanaManager(Singleton, Logger):
 
     def _get_db_sardana(self, db=None):
         if db is None:
+            import taurus
             db = taurus.Database()
         db_sardana = self._db_sardanas.get(db)
         if db_sardana is None:
@@ -690,6 +691,7 @@ class SardanaManager(Singleton, Logger):
         return 1, 200
 
     def has_localhost_starter(self):
+        import socket
         return socket.gethostname() in self.get_hosts()
 
     @classmethod
diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py
index 61309aa..b6b35d1 100644
--- a/lib/taurus/core/tango/tangoattribute.py
+++ b/lib/taurus/core/tango/tangoattribute.py
@@ -34,15 +34,17 @@ import time
 import threading
 import PyTango
 
-import taurus.core
-from taurus.core import TaurusEventType, TaurusSerializationMode, \
-    SubscriptionState, WriteAttrOperation
-from taurus.core.util import EventListener
-from enums import EVENT_TO_POLLING_EXCEPTIONS
+from taurus import Factory, Manager
+from taurus.core.taurusattribute import TaurusAttribute, TaurusStateAttribute
+from taurus.core.taurusbasetypes import TaurusEventType, TaurusSerializationMode, \
+    SubscriptionState
+from taurus.core.taurusoperation import WriteAttrOperation
+from taurus.core.util.event import EventListener
+from .enums import EVENT_TO_POLLING_EXCEPTIONS
 
 DataType = PyTango.CmdArgType
 
-class TangoAttribute(taurus.core.TaurusAttribute):
+class TangoAttribute(TaurusAttribute):
 
     # helper class property that stores a reference to the corresponding factory
     _factory = None
@@ -68,7 +70,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
         self.__subscription_state = SubscriptionState.Unsubscribed
         self.__subscription_event = threading.Event()
 
-        self.call__init__(taurus.core.TaurusAttribute, name, parent, **kwargs)
+        self.call__init__(TaurusAttribute, name, parent, **kwargs)
 
     def __getattr__(self,name):
         return getattr(self._getRealConfig(), name)
@@ -88,7 +90,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
     @classmethod
     def factory(cls):
         if cls._factory is None:
-            cls._factory = taurus.Factory(scheme='tango')
+            cls._factory = Factory(scheme='tango')
         return cls._factory
 
     def getNewOperation(self, value):
@@ -332,7 +334,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
         listeners = self._listeners
         initial_subscription_state = self.__subscription_state
 
-        ret = taurus.core.TaurusAttribute.addListener(self, listener)
+        ret = TaurusAttribute.addListener(self, listener)
         if not ret:
             return ret
         
@@ -345,7 +347,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
         if len(listeners) > 1 and (initial_subscription_state == SubscriptionState.Subscribed or self.isPollingActive()):
             sm = self.getSerializationMode()
             if sm == TaurusSerializationMode.Concurrent:
-                taurus.Manager().addJob(self.__fireRegisterEvent, None, (listener,))
+                Manager().addJob(self.__fireRegisterEvent, None, (listener,))
             else:
                 self.__fireRegisterEvent((listener,))
         return ret
@@ -354,7 +356,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
         """ Remove a TaurusListener from the listeners list. If polling enabled 
             and it is the last element the stop the polling timer.
             If the listener is not registered nothing happens."""
-        ret = taurus.core.TaurusAttribute.removeListener(self, listener)
+        ret = TaurusAttribute.removeListener(self, listener)
 
         cfg = self._getRealConfig()
         cfg.removeListener(listener)
@@ -446,7 +448,7 @@ class TangoAttribute(taurus.core.TaurusAttribute):
            Default implementation propagates the event to all listeners."""
         
         curr_time = time.time()
-        manager = taurus.Manager()
+        manager = Manager()
         sm = self.getSerializationMode()
         if not event.err:
             self.__attr_value, self.__attr_err, self.__attr_timestamp = self.decode(event.attr_value), None, curr_time
@@ -483,10 +485,10 @@ class TangoAttribute(taurus.core.TaurusAttribute):
         return False
 
 
-class TangoStateAttribute(TangoAttribute, taurus.core.TaurusStateAttribute):
+class TangoStateAttribute(TangoAttribute, TaurusStateAttribute):
     def __init__(self, name, parent, **kwargs):
         self.call__init__(TangoAttribute, name, parent, **kwargs)
-        self.call__init__(taurus.core.TaurusStateAttribute, name, parent, **kwargs)
+        self.call__init__(TaurusStateAttribute, name, parent, **kwargs)
 
 
 class TangoAttributeEventListener(EventListener):
@@ -510,7 +512,8 @@ class TangoAttributeEventListener(EventListener):
 
 def test1():
     import numpy
-    a = taurus.Attribute('sys/tg_test/1/ulong64_scalar')
+    from taurus import Attribute
+    a = Attribute('sys/tg_test/1/ulong64_scalar')
     
     a.write(numpy.uint64(88))
 
diff --git a/lib/taurus/core/tango/tangoconfiguration.py b/lib/taurus/core/tango/tangoconfiguration.py
index b36671b..0e96b8a 100644
--- a/lib/taurus/core/tango/tangoconfiguration.py
+++ b/lib/taurus/core/tango/tangoconfiguration.py
@@ -30,20 +30,22 @@ __all__ = ["TangoConfiguration"]
 __docformat__ = "restructuredtext"
 
 # -*- coding: utf-8 -*-
-import taurus.core
 import threading
 import weakref
 import time
 
 import PyTango
 
-from enums import EVENT_TO_POLLING_EXCEPTIONS
+from taurus import Factory, Manager
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from .enums import EVENT_TO_POLLING_EXCEPTIONS
 
-class TangoConfiguration(taurus.core.TaurusConfiguration):
+class TangoConfiguration(TaurusConfiguration):
     
     def __init__(self, name, parent, storeCallback = None):
         self._events_working = False
-        self.call__init__(taurus.core.TaurusConfiguration, name, parent, storeCallback)
+        self.call__init__(TaurusConfiguration, name, parent, storeCallback)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel necessary overwrite
@@ -55,7 +57,7 @@ class TangoConfiguration(taurus.core.TaurusConfiguration):
     @classmethod
     def factory(cls):
         if cls._factory is None:
-            cls._factory = taurus.Factory("tango")
+            cls._factory = Factory("tango")
         return cls._factory
 
     def __getattr__(self, name):
@@ -129,18 +131,18 @@ class TangoConfiguration(taurus.core.TaurusConfiguration):
     def __fireRegisterEvent(self, listener):
         value = self.getValueObj()
         if value is not None:
-            self.fireEvent(taurus.core.TaurusEventType.Config, value, listener)
+            self.fireEvent(TaurusEventType.Config, value, listener)
 
     def addListener(self, listener):
         """ Add a TaurusListener object in the listeners list.
             If the listener is already registered nothing happens."""
-        ret = taurus.core.TaurusConfiguration.addListener(self, listener)
+        ret = TaurusConfiguration.addListener(self, listener)
         if not ret:
             return ret
         
         #fire a first configuration event
         #if len(self._listeners) > 1 or not self._events_working:
-        taurus.Manager().addJob(self.__fireRegisterEvent, None, (listener,))
+        Manager().addJob(self.__fireRegisterEvent, None, (listener,))
         return ret
     
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -234,12 +236,12 @@ class TangoConfiguration(taurus.core.TaurusConfiguration):
         self._attr_timestamp = time.time()
         self._attr_info = self.decode(event.attr_conf)
         listeners = tuple(self._listeners)
-        #taurus.Manager().addJob(self._push_event, None, event)
-        taurus.Manager().addJob(self.fireEvent, None, taurus.core.TaurusEventType.Config, self._attr_info, listeners=listeners)
+        #Manager().addJob(self._push_event, None, event)
+        Manager().addJob(self.fireEvent, None, TaurusEventType.Config, self._attr_info, listeners=listeners)
         
     #def _push_event(self, event):
     #    """ Notify listeners when event received"""
-    #    self.fireEvent(taurus.core.TaurusEventType.Config, self._attr_info)
+    #    self.fireEvent(TaurusEventType.Config, self._attr_info)
     
     #===========================================================================
     # Some methods reimplemented from TaurusConfiguration
diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py
index cfbd57a..a881040 100644
--- a/lib/taurus/core/tango/tangodatabase.py
+++ b/lib/taurus/core/tango/tangodatabase.py
@@ -34,13 +34,19 @@ import os
 
 import PyTango
 import PyTango.utils
-import taurus.core
-import taurus.core.util
+
+from taurus import Factory
+from taurus.core.taurusbasetypes import TaurusSWDevHealth
+from taurus.core.taurusdatabase import TaurusDatabaseCache, TaurusDevInfo, \
+    TaurusAttrInfo, TaurusServInfo, TaurusDevClassInfo, TaurusDevTree, \
+    TaurusServerTree
+from taurus.core.util.containers import CaselessDict
+from taurus.core.taurusdatabase import TaurusDatabase
 
 InvalidAlias = "nada"
 
 
-class TangoDevInfo(taurus.core.TaurusDevInfo):
+class TangoDevInfo(TaurusDevInfo):
     
     def __init__(self, container, name=None, full_name=None, alias=None, server=None, klass=None, exported=False, host=None):
         super(TangoDevInfo, self).__init__(container, name=name, full_name=full_name, alias=alias, server=server, klass=klass, exported=exported, host=host)
@@ -84,9 +90,9 @@ class TangoDevInfo(taurus.core.TaurusDevInfo):
             return self._health
         exported = self.exported()
         if exported:
-            self._health = taurus.core.TaurusSWDevHealth.Exported
+            self._health = TaurusSWDevHealth.Exported
         else:
-            self._health = taurus.core.TaurusSWDevHealth.NotExported
+            self._health = TaurusSWDevHealth.NotExported
         return self._health
     
     def refreshAttributes(self):
@@ -98,18 +104,18 @@ class TangoDevInfo(taurus.core.TaurusDevInfo):
             attr_info_list = dev.attribute_list_query_ex()
             for attr_info in attr_info_list:
                 full_name = "%s/%s" % (self.fullName(), attr_info.name)
-                attr_obj = taurus.core.TaurusAttrInfo(self.container(), 
+                attr_obj = TaurusAttrInfo(self.container(), 
                     name=attr_info.name.lower(), full_name=full_name.lower(),
                     device=self, info=attr_info)
                 attrs.append(attr_obj)
             attrs = sorted(attrs, key=lambda attr : attr.name())
-        except PyTango.DevFailed, df:
-            if self.health() == taurus.core.TaurusSWDevHealth.Exported:
-                self._health = taurus.core.TaurusSWDevHealth.ExportedNotAlive
+        except PyTango.DevFailed as df:
+            if self.health() == TaurusSWDevHealth.Exported:
+                self._health = TaurusSWDevHealth.ExportedNotAlive
         self.setAttributes(attrs)
 
 
-class TangoServInfo(taurus.core.TaurusServInfo):
+class TangoServInfo(TaurusServInfo):
     
     def __init__(self, container, name=None, full_name=None):
         super(TangoServInfo, self).__init__(container, name=name, full_name=full_name)
@@ -134,7 +140,7 @@ class TangoServInfo(taurus.core.TaurusServInfo):
         return self._alive
 
 
-class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
+class TangoDatabaseCache(TaurusDatabaseCache):
 
     def refresh(self):
         db = self.db
@@ -146,7 +152,7 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
         results, data = r[0][:-2], r[1]
         assert row_nb == len(data) / column_nb
         
-        CD = taurus.core.util.CaselessDict
+        CD = CaselessDict
         #CD = dict
         dev_dict, serv_dict, klass_dict, alias_dict = CD(), {}, {}, CD()
 
@@ -157,13 +163,13 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
             if not len(alias): alias = None
 
             serv_dict[server] = si = serv_dict.get(server, 
-                                                   TangoServInfo(self, name=server, 
+                                                   TangoServInfo(self, name=server,
                                                                  full_name=server))
             
             klass_dict[klass] = dc = klass_dict.get(klass,
-                                                    taurus.core.TaurusDevClassInfo(self, 
-                                                                                   name=klass, 
-                                                                                   full_name=klass))
+                                                    TaurusDevClassInfo(self,
+                                                                       name=klass,
+                                                                       full_name=klass))
             
             full_name = "tango://%s/%s" % (db.getFullName(), name) 
             dev_dict[name] = di = TangoDevInfo(self, name=name, full_name=full_name, 
@@ -176,8 +182,8 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
                 alias_dict[alias] = di
         
         self._devices = dev_dict
-        self._device_tree = taurus.core.TaurusDevTree(dev_dict)
-        self._server_tree = taurus.core.TaurusServerTree(serv_dict)
+        self._device_tree = TaurusDevTree(dev_dict)
+        self._server_tree = TaurusServerTree(serv_dict)
         self._servers = serv_dict
         self._klasses = klass_dict
         self._aliases = alias_dict
@@ -196,13 +202,12 @@ class TangoDatabaseCache(taurus.core.TaurusDatabaseCache):
             attr_info_list = dev.attribute_list_query_ex()
             for attr_info in attr_info_list:
                 full_attr_name = "%s/%s" % (full_name, attr_info.name)
-                attr_obj = taurus.core.TaurusAttrInfo(self, name=attr_info.name, 
-                                                      full_name=full_attr_name, 
-                                                      device=device, 
-                                                      info=attr_info) 
+                attr_obj = TaurusAttrInfo(self, name=attr_info.name,
+                                          full_name=full_attr_name,
+                                          device=device, info=attr_info) 
                 attrs.append(attr_obj)
             attrs = sorted(attrs, key=lambda attr : attr.name().lower())
-        except PyTango.DevFailed, df:
+        except PyTango.DevFailed as df:
             pass
         device.setAttributes(attrs)
 
@@ -278,7 +283,7 @@ def get_env_var(env_var_name):
             return val
 
 
-class TangoDatabase(taurus.core.TaurusDatabase):
+class TangoDatabase(TaurusDatabase):
 
     def __init__(self,host=None,port=None,parent=None):
         pars = ()
@@ -295,7 +300,7 @@ class TangoDatabase(taurus.core.TaurusDatabase):
         self._dbCache = None
         
         complete_name = "%s:%s" % (host, port)
-        self.call__init__(taurus.core.TaurusDatabase, complete_name, parent)
+        self.call__init__(TaurusDatabase, complete_name, parent)
 
         try:
             self.get_class_for_device(self.dev_name())
@@ -343,7 +348,7 @@ class TangoDatabase(taurus.core.TaurusDatabase):
     @classmethod
     def factory(cls):
         if cls._factory is None:
-            cls._factory = taurus.Factory(scheme='tango')
+            cls._factory = Factory(scheme='tango')
         return cls._factory
         
     def getValueObj(self,cache=True):
diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py
index a41e439..fc867c8 100644
--- a/lib/taurus/core/tango/tangodevice.py
+++ b/lib/taurus/core/tango/tangodevice.py
@@ -32,8 +32,9 @@ __docformat__ = "restructuredtext"
 import time
 import PyTango
 
-import taurus.core
-from taurus.core import TaurusSWDevState, TaurusLockInfo, LockStatus
+from taurus import Factory
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusbasetypes import TaurusSWDevState, TaurusLockInfo, LockStatus
 
 DFT_TANGO_DEVICE_DESCRIPTION = "A TANGO device"
 
@@ -46,10 +47,10 @@ class _TangoInfo(object):
         self.server_id = 'Unknown'
         self.server_version = 1
                 
-class TangoDevice(taurus.core.TaurusDevice):
+class TangoDevice(TaurusDevice):
     def __init__(self, name, **kw):
         """Object initialization."""
-        self.call__init__(taurus.core.TaurusDevice, name, **kw)
+        self.call__init__(TaurusDevice, name, **kw)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel necessary overwrite
@@ -60,7 +61,7 @@ class TangoDevice(taurus.core.TaurusDevice):
     @classmethod
     def factory(cls):
         if cls._factory is None:
-            cls._factory = taurus.Factory(scheme='tango')
+            cls._factory = Factory(scheme='tango')
         return cls._factory
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py
index 9f5c621..f4ff7e6 100644
--- a/lib/taurus/core/tango/tangofactory.py
+++ b/lib/taurus/core/tango/tangofactory.py
@@ -34,24 +34,28 @@ import os
 import threading
 import PyTango
 
-import taurus.core
-import taurus.core.util
-from taurus.core import OperationMode, MatchLevel, TaurusException
-
-import tangodatabase
-import tangoattribute
-import tangodevice
-import tangoconfiguration
-
-_Database = tangodatabase.TangoDatabase
-_Attribute = tangoattribute.TangoAttribute
-_StateAttribute = tangoattribute.TangoStateAttribute
-_Device = tangodevice.TangoDevice
-_Configuration = tangoconfiguration.TangoConfiguration
-
-from taurus.core import DoubleRegistration
-
-class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus.core.util.Logger):
+from taurus.core.taurusfactory import TaurusFactory
+from taurus.core.taurusbasetypes import OperationMode, MatchLevel
+from taurus.core.taurusexception import TaurusException, DoubleRegistration
+from taurus.core.tauruspollingtimer import TaurusPollingTimer
+from taurus.core.util.enumeration import Enumeration
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessWeakValueDict, CaselessDict
+
+from .tangodatabase import TangoDatabase, InvalidAlias
+from .tangoattribute import TangoAttribute, TangoStateAttribute
+from .tangodevice import TangoDevice
+from .tangoconfiguration import TangoConfiguration
+
+_Database = TangoDatabase
+_Attribute = TangoAttribute
+_StateAttribute = TangoStateAttribute
+_Device = TangoDevice
+_Configuration = TangoConfiguration
+
+
+class TangoFactory(Singleton, TaurusFactory, Logger):
     """A Singleton class designed to provide Tango related objects.
 
       The TangoFactory model containning the Factory for the Tango scheme
@@ -94,8 +98,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         """Singleton instance initialization.
            **For internal usage only**"""
         name = self.__class__.__name__
-        self.call__init__(taurus.core.util.Logger, name)
-        self.call__init__(taurus.core.TaurusFactory)
+        self.call__init__(Logger, name)
+        self.call__init__(TaurusFactory)
         self._polling_enabled = True
         self.reInit()
 
@@ -104,20 +108,20 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         self._default_tango_host = None
         self.operation_mode = OperationMode.ONLINE
         self.dft_db = None
-        self.tango_db = taurus.core.util.CaselessWeakValueDict()
-        self.tango_db_queries = taurus.core.util.CaselessWeakValueDict()
-        self.tango_configs = taurus.core.util.CaselessWeakValueDict()
-        self.tango_attrs = taurus.core.util.CaselessWeakValueDict()
-        self.tango_devs = taurus.core.util.CaselessWeakValueDict()
-        self.tango_dev_queries = taurus.core.util.CaselessWeakValueDict()
-        self.tango_alias_devs = taurus.core.util.CaselessWeakValueDict()
+        self.tango_db = CaselessWeakValueDict()
+        self.tango_db_queries = CaselessWeakValueDict()
+        self.tango_configs = CaselessWeakValueDict()
+        self.tango_attrs = CaselessWeakValueDict()
+        self.tango_devs = CaselessWeakValueDict()
+        self.tango_dev_queries = CaselessWeakValueDict()
+        self.tango_alias_devs = CaselessWeakValueDict()
         self.polling_timers = {}
         
         # Plugin device classes
         self.tango_dev_klasses = {}
         
         # Plugin attribute classes
-        self.tango_attr_klasses = taurus.core.util.CaselessDict()
+        self.tango_attr_klasses = CaselessDict()
         self.tango_attr_klasses["state"] = _StateAttribute
 
     def cleanUp(self):
@@ -212,8 +216,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
            
         :param absolute_name: (str) the object absolute name string
 
-        :return: (taurus.core.TaurusModel) a class object that should be a subclass of a taurus.core.TaurusModel
-        :raise: (taurus.core.TaurusException) if the given name is invalid.
+        :return: (taurus.core.taurusmodel.TaurusModel) a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
+        :raise: (taurus.core.taurusexception.TaurusException) if the given name is invalid.
         """
         objType = None
         try:
@@ -247,8 +251,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         :param db_name: (str) database name string alias. If None, the 
                         default database is used
                            
-        :return: (taurus.core.TangoDatabase) database object
-        :raise: (taurus.core.TaurusException) if the given alias is invalid.
+        :return: (taurus.core.tangodatabase.TangoDatabase) database object
+        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         ret = None
         if db_name is None:
@@ -300,7 +304,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
                             (_/_/_) or a device alias.
              
            :return: (taurus.core.tango.TangoDevice) a device object 
-           :raise: (taurus.core.TaurusException) if the given dev_name is invalid.
+           :raise: (taurus.core.taurusexception.TaurusException) if the given dev_name is invalid.
         """
         d = self.tango_devs.get(dev_name)
         if d is None:
@@ -333,7 +337,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         if dev_name:
             try:
                 alias = db.get_alias(dev_name)
-                if alias and alias.lower() == taurus.core.InvalidAlias:
+                if alias and alias.lower() == InvalidAlias:
                     alias = None 
             except:
                 alias = None
@@ -371,8 +375,8 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
 
            :param attr_name: (str) attribute name
                  
-           :return: (taurus.core.TangoAttribute) attribute object
-           :raise: (taurus.core.TaurusException) if the given alias is invalid.
+           :return: (taurus.core.tangoattribute.TangoAttribute) attribute object
+           :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         attr = self.tango_attrs.get(attr_name)
 
@@ -455,7 +459,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
            If the corresponding configuration already exists, the existing instance
            is returned. Otherwise a new instance is stored and returned.
 
-           :param param: (taurus.core.TaurusAttribute or str) attrubute object or full configuration name
+           :param param: (taurus.core.taurusattribute.TaurusAttribute or str) attrubute object or full configuration name
            
            :return: (taurus.core.tango.TangoConfiguration) configuration object
         """
@@ -490,7 +494,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         params = validator.getParams(cfg_name)
                 
         if params is None:
-            raise taurus.core.TaurusException("Invalid Tango configuration name %s" % cfg_name)
+            raise TaurusException("Invalid Tango configuration name %s" % cfg_name)
         
         host,port = params.get('host'),params.get('port')
         db = None
@@ -639,7 +643,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
         if dev_name:
             try:
                 alias = db.get_alias(dev_name)
-                if alias and alias.lower() == taurus.core.InvalidAlias:
+                if alias and alias.lower() == InvalidAlias:
                     alias = None 
             except:
                 alias = None
@@ -698,7 +702,7 @@ class TangoFactory(taurus.core.util.Singleton, taurus.core.TaurusFactory, taurus
            :param period: (float) polling period (in seconds)
            :param unsubscribe_evts: (bool) wheater or not to unsubscribe from events
         """
-        tmr = self.polling_timers.get(period,taurus.core.TaurusPollingTimer(period))
+        tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
         self.polling_timers[period] = tmr
         tmr.addAttribute(attribute, self.isPollingEnabled())
 
diff --git a/lib/taurus/core/taurusattribute.py b/lib/taurus/core/taurusattribute.py
index ebfde94..56e61d2 100644
--- a/lib/taurus/core/taurusattribute.py
+++ b/lib/taurus/core/taurusattribute.py
@@ -31,14 +31,14 @@ __docformat__ = "restructuredtext"
 
 import weakref
 
-import taurusmodel
-import taurusconfiguration
-#from enums import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusElementType
+from .taurusmodel import TaurusModel
+from .taurusconfiguration import TaurusConfigurationProxy
 
-class TaurusAttribute(taurusmodel.TaurusModel):
+class TaurusAttribute(TaurusModel):
     
     def __init__(self, name, parent, **kwargs):
-        self.call__init__(taurusmodel.TaurusModel, name, parent)
+        self.call__init__(TaurusModel, name, parent)
 
         self.__parentDevice = parent # just to keep it alive
         
@@ -65,22 +65,18 @@ class TaurusAttribute(taurusmodel.TaurusModel):
 
         self._dev_hw_obj = parent.getHWObj()
     
-    def __str__(self):
-        return self.getFullName()
-    
     def cleanUp(self):
         self.trace("[TaurusAttribute] cleanUp")
         self._unsubscribeEvents()
         self._dev_hw_obj = None
-        taurusmodel.TaurusModel.cleanUp(self)
+        TaurusModel.cleanUp(self)
         
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getTaurusElementType(self):
-        import taurus.core
-        return taurus.core.TaurusElementType.Attribute
+        return TaurusElementType.Attribute
             
     @classmethod
     def buildModelName(cls, parent_model, relative_name):
@@ -314,9 +310,10 @@ class TaurusAttribute(taurusmodel.TaurusModel):
            :param period: polling period (in miliseconds)
            :type period: int
         """
-        self.deprecated("use changePollingPeriod(). Not exactly the same functionality. Only activates polling if necessary")
-        self.changePollingPeriod(period, force=force)
-        self.enablePolling()
+        ## REENABLED, used to solve problems with ID GUI's and other systems where event independency is needed.
+        #self.deprecated("use changePollingPeriod(). Not exactly the same functionality. Only activates polling if necessary")
+        self.changePollingPeriod(period)
+        self.enablePolling(force=force)
 
     def deactivatePolling(self, maintain_enabled=False):
         """unregister attribute from polling"""
@@ -342,7 +339,7 @@ class TaurusAttribute(taurusmodel.TaurusModel):
         if ob is not None:
             return ob
 
-        ob = taurusconfiguration.TaurusConfigurationProxy(self)
+        ob = TaurusConfigurationProxy(self)
         self.__weakFakeConfigObj = weakref.ref(ob)
         return ob
     
@@ -371,4 +368,6 @@ class TaurusStateAttribute(TaurusAttribute):
     def isInformDeviceOfErrors(self):
         return True
 
-
+#del weakef
+#del TaurusModel
+#del TaurusConfigurationProxy
diff --git a/lib/taurus/core/taurusbasetypes.py b/lib/taurus/core/taurusbasetypes.py
index e7e7305..a94c348 100644
--- a/lib/taurus/core/taurusbasetypes.py
+++ b/lib/taurus/core/taurusbasetypes.py
@@ -26,10 +26,156 @@
 a misc collection of basic types
 '''
 
+__all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode",
+           "TaurusSerializationMode", "SubscriptionState", "TaurusEventType",
+           "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat",
+           "AttrQuality", "AttrAccess", "DisplayLevel", "ManagerState",
+           "TaurusTimeVal", "TaurusAttrValue", "TaurusConfigValue",
+           "TaurusLockInfo"]
+
+__docformat__ = "restructuredtext"
+
 import time
 import datetime
 
-from enums import AttrQuality, AttrAccess, DataFormat, LockStatus
+from .util.enumeration import Enumeration
+
+TaurusSWDevState = Enumeration(
+'TaurusSWDevState', (
+    'Uninitialized',
+    'Running', 
+    'Shutdown', 
+    'Crash', 
+    'EventSystemShutdown'
+))
+
+TaurusSWDevHealth = Enumeration(
+'TaurusSWDevHealth', (
+    'Exported',           # device reported exported
+    'ExportedAlive',      # device reported exported and confirmed connection
+    'ExportedNotAlive',   # device reported exported but connection failed!!
+    'NotExported',        # device didn't report exported
+    'NotExportedAlive',   # device didn't report exported but connection confirmed!
+    'NotExportedNotAlive' # device didn't report exported and connection failed
+))
+
+OperationMode = Enumeration(
+'OperationMode', (
+    'OFFLINE',
+    'ONLINE'
+))
+
+TaurusSerializationMode = Enumeration(
+'TaurusSerializationMode', (
+    'Serial',
+    'Concurrent'
+))
+
+TaurusEventType = Enumeration(
+'TaurusEventType', (
+    'Change',
+    'Config',
+    'Periodic',
+    'Error'
+))
+
+MatchLevel = Enumeration(
+'MatchLevel', (
+    'ANY', 
+    'SHORT', 
+    'NORMAL', 
+    'COMPLETE', 
+    'SHORT_NORMAL', 
+    'NORMAL_COMPLETE'
+))
+
+TaurusElementType = Enumeration(
+'TaurusElementType', (
+    'Unknown',
+    'Name',
+    'DeviceClass',
+    'Device',
+    'DeviceAlias',
+    'Domain',
+    'Family',
+    'Member',
+    'Server',
+    'ServerName',
+    'ServerInstance',
+    'Exported',
+    'Host',
+    'Attribute',
+    'AttributeAlias',
+    'Command',
+    'Property',
+    'Configuration',
+    'Database',
+))
+
+LockStatus = Enumeration(
+'LockStatus', (
+    'Unlocked',
+    'Locked',
+    'LockedMaster',
+    'Unknown',
+))
+
+DataFormat = Enumeration(
+'DataFormat', (
+    '_0D',
+    '_1D',
+    '_2D'
+))
+
+DataType = Enumeration(
+'DataType', (
+    'Integer',
+    'Float',
+    'String',
+    'Boolean',
+))
+
+SubscriptionState = Enumeration(
+"SubscriptionState", (
+    "Unsubscribed",
+    "Subscribing",
+    "Subscribed", 
+    "PendingSubscribe"
+))
+
+#################
+# Not in use yet:
+
+AttrQuality = Enumeration(
+'AttrQuality', (
+    'ATTR_VALID', 
+    'ATTR_INVALID', 
+    'ATTR_ALARM'
+))
+
+AttrAccess = Enumeration(
+'AttrAccess', (
+    'READ', 
+    'READ_WITH_WRITE', 
+    'WRITE', 
+    'READ_WRITE' 
+))
+
+DisplayLevel = Enumeration(
+'DisplayLevel', (
+    'OPERATOR', 
+    'EXPERT', 
+    'DEVELOPER'
+))
+
+ManagerState =  Enumeration(
+'ManagerState', (
+    'UNINITIALIZED', 
+    'INITED', 
+    'CLEANED'
+)) 
+
+
 
 class TaurusTimeVal(object):
     def __init__(self):
@@ -147,3 +293,8 @@ class TaurusLockInfo(object):
 
     def __repr__(self):
         return self.status_msg
+
+#del time
+#del datetime
+#del Enumeration
+#del AttrQuality, AttrAccess, DataFormat, LockStatus
\ No newline at end of file
diff --git a/lib/taurus/core/taurusconfiguration.py b/lib/taurus/core/taurusconfiguration.py
index 86392bf..301fe4a 100644
--- a/lib/taurus/core/taurusconfiguration.py
+++ b/lib/taurus/core/taurusconfiguration.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 #############################################################################
 ##
@@ -29,12 +30,9 @@ __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"]
 
 __docformat__ = "restructuredtext"
 
-# -*- coding: utf-8 -*-
-
-import numpy
+from .taurusbasetypes import AttrAccess, TaurusElementType
+from .taurusmodel import TaurusModel
 
-from enums import AttrAccess
-import taurusmodel
 
 class TaurusConfigurationProxy(object):
     """
@@ -53,7 +51,7 @@ class TaurusConfigurationProxy(object):
         return getattr(self.__parent._getRealConfig(), name)
 
 
-class TaurusConfiguration(taurusmodel.TaurusModel):
+class TaurusConfiguration(TaurusModel):
     
     no_cfg_value = '-----'
     no_unit = 'No unit'
@@ -82,7 +80,7 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
         # the configuration event identifier
         self._cfg_evt_id = None
 
-        self.call__init__(taurusmodel.TaurusModel, name, parent)
+        self.call__init__(TaurusModel, name, parent)
         
         # Everything went ok so now we are sure we can store the object
         if not storeCallback is None:
@@ -103,15 +101,14 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
         self._unsubscribeEvents()
         self._attr_info = None
         self._dev_hw_obj = None
-        taurusmodel.TaurusModel.cleanUp(self)        
+        TaurusModel.cleanUp(self)        
         
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
 
     def getTaurusElementType(self):
-        import taurus.core
-        return taurus.core.TaurusElementType.Configuration
+        return TaurusElementType.Configuration
 
     @classmethod
     def buildModelName(cls, parent_model, relative_name):
@@ -201,7 +198,7 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
 #    def addListener(self, listener):
 #        """ Add a TaurusListener object in the listeners list.
 #            If the listener is already registered nothing happens."""
-#        ret = taurusmodel.TaurusModel.addListener(self, listener)
+#        ret = TaurusModel.addListener(self, listener)
 #        if not ret:
 #            return ret
         
@@ -465,18 +462,21 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
         attr = self.getParentObj()
         if attr is None: return False
         v = attr.read(cache=cache)
+        import numpy
         return numpy.isscalar(v.value)
     
     def isSpectrum(self, cache=True):
         attr = self.getParentObj()
         if attr is None: return False
         v = attr.read(cache=cache)
+        import numpy
         return not numpy.isscalar(v.value) and numpy.array(v.value).ndim == 1
     
     def isImage(self, cache=True):
         attr = self.getParentObj()
         if attr is None: return False
         v = attr.read(cache=cache)
+        import numpy
         return not numpy.isscalar(v.value) and numpy.array(v.value).ndim == 2
     
     def isWrite(self, cache=True):
@@ -487,3 +487,6 @@ class TaurusConfiguration(taurusmodel.TaurusModel):
 
     def isReadWrite(self, cache=True):
         return self.getWritable(cache) == AttrAccess.READ_WRITE
+
+#del AttrAccess
+#del TaurusModel
diff --git a/lib/taurus/core/taurusdatabase.py b/lib/taurus/core/taurusdatabase.py
index be83cea..7c63b06 100644
--- a/lib/taurus/core/taurusdatabase.py
+++ b/lib/taurus/core/taurusdatabase.py
@@ -34,9 +34,9 @@ __docformat__ = "restructuredtext"
 import weakref
 import operator
 
-from enums import TaurusEventType, TaurusSWDevHealth
-import taurusmodel
-import util
+from .taurusbasetypes import TaurusEventType, TaurusSWDevHealth, TaurusElementType
+from .taurusmodel import TaurusModel
+from .util.containers import CaselessDict
 
 DFT_DATABASE_DESCRIPTION = "A database"
 
@@ -131,7 +131,7 @@ class TaurusDevInfo(TaurusInfo):
 class TaurusServInfo(TaurusInfo):
     def __init__(self, container, name=None, full_name=None):
         super(TaurusServInfo, self).__init__(container, name=name, full_name=full_name)
-        self._devices = util.CaselessDict()
+        self._devices = CaselessDict()
         self._exported = False
         self._alive = None
         self._host = ""
@@ -187,7 +187,7 @@ class TaurusServInfo(TaurusInfo):
 class TaurusDevClassInfo(TaurusInfo):
     def __init__(self, container, name=None, full_name=None):
         super(TaurusDevClassInfo, self).__init__(container, name=name, full_name=full_name)
-        self._devices = util.CaselessDict()
+        self._devices = CaselessDict()
     
     def devices(self):
         return self._devices
@@ -217,11 +217,11 @@ class TaurusAttrInfo(TaurusInfo):
         return getattr(self._info, name)
 
 
-class TaurusDevTree(util.CaselessDict):
+class TaurusDevTree(CaselessDict):
 
     def __init__(self, other=None):
         super(TaurusDevTree, self).__init__()
-        self._devices = util.CaselessDict()
+        self._devices = CaselessDict()
         if other is not None:
             self._update(other)
 
@@ -240,11 +240,11 @@ class TaurusDevTree(util.CaselessDict):
     def addDevice(self, dev_info):
         domain, family, member = dev_info.domain(), dev_info.family(), dev_info.member()
         
-        families = self[domain] = self.get(domain, util.CaselessDict())
-        devs = self._devices[domain] = self._devices.get(domain, util.CaselessDict())
+        families = self[domain] = self.get(domain, CaselessDict())
+        devs = self._devices[domain] = self._devices.get(domain, CaselessDict())
         devs[dev_info.name()] = dev_info
         
-        families[family] = members = families.get(family, util.CaselessDict())
+        families[family] = members = families.get(family, CaselessDict())
         
         members[member] = dev_info
 
@@ -321,7 +321,7 @@ class TaurusDatabaseCache(object):
         raise RuntimeError("Must be implemented in subclass")
     
     def getDevice(self, name):
-        """Returns a :class:`taurus.core.TaurusDevInfo` object with information 
+        """Returns a :class:`taurus.core.taurusdatabase.TaurusDevInfo` object with information 
         about the given device name
         
         :param name: (str) the device name
@@ -406,22 +406,22 @@ class TaurusDatabaseCache(object):
         return self.serverTree().getServerNameInstances(serverName)
 
 
-class TaurusDatabase(taurusmodel.TaurusModel):
+class TaurusDatabase(TaurusModel):
     
     def __init__(self, complete_name, parent=None):
         self._descr = None
-        self.call__init__(taurusmodel.TaurusModel, complete_name, parent)
+        self.call__init__(TaurusModel, complete_name, parent)
     
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
     def cleanUp(self):
         self.trace("[TaurusDatabase] cleanUp")
-        taurusmodel.TaurusModel.cleanUp(self)
+        TaurusModel.cleanUp(self)
 
     def getTaurusElementType(self):
-        import taurus.core
-        return taurus.core.TaurusElementType.Database
+        
+        return TaurusElementType.Database
     
     @classmethod
     def buildModelName(cls, parent_model, relative_name):
@@ -432,8 +432,8 @@ class TaurusDatabase(taurusmodel.TaurusModel):
     
     @classmethod
     def getNameValidator(cls):
-        import taurusvalidator
-        return taurusvalidator.DatabaseNameValidator()
+        from .taurusvalidator import DatabaseNameValidator
+        return DatabaseNameValidator()
     
     def getDescription(self,cache=True):
         if self._descr is None or not cache:
@@ -457,7 +457,7 @@ class TaurusDatabase(taurusmodel.TaurusModel):
         return obj
     
     def addListener(self, listener):
-        ret = taurusmodel.TaurusModel.addListener(self, listener)
+        ret = TaurusModel.addListener(self, listener)
         if not ret:
             return ret
         self.fireEvent(TaurusEventType.Change, self.getDisplayValue(), listener)
diff --git a/lib/taurus/core/taurusdevice.py b/lib/taurus/core/taurusdevice.py
index a15b112..ede5174 100644
--- a/lib/taurus/core/taurusdevice.py
+++ b/lib/taurus/core/taurusdevice.py
@@ -29,16 +29,14 @@ __all__ = ["TaurusDevice"]
 
 __docformat__ = "restructuredtext"
 
-import sys
-
-from enums import TaurusSWDevState, TaurusEventType
-from taurusbasetypes import TaurusLockInfo
-import taurusmodel
+from .taurusbasetypes import TaurusSWDevState, TaurusEventType, \
+    TaurusLockInfo, TaurusElementType
+from .taurusmodel import TaurusModel
 
 DFT_DEVICE_DESCRIPTION = "A device"
 
 
-class TaurusDevice(taurusmodel.TaurusModel):
+class TaurusDevice(TaurusModel):
 
     SHUTDOWNS = (TaurusSWDevState.Shutdown, TaurusSWDevState.Crash,
                  TaurusSWDevState.EventSystemShutdown)
@@ -51,7 +49,7 @@ class TaurusDevice(taurusmodel.TaurusModel):
         parent = kw.pop('parent', None)
         storeCallback = kw.pop('storeCallback', None)
         self.__dict__.update(kw)
-        self.call__init__(taurusmodel.TaurusModel, name, parent)
+        self.call__init__(TaurusModel, name, parent)
 
         self._deviceObj = self._createHWObject()
         self._deviceStateObj = None
@@ -70,7 +68,7 @@ class TaurusDevice(taurusmodel.TaurusModel):
         if not self._deviceStateObj is None:
             self._deviceStateObj.removeListener(self)
         self._deviceStateObj = None
-        taurusmodel.TaurusModel.cleanUp(self)
+        TaurusModel.cleanUp(self)
 
     # Export the DeviceProxy interface into this object.
     # This way we can call for example read_attribute on an object of this class
@@ -159,8 +157,7 @@ class TaurusDevice(taurusmodel.TaurusModel):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getTaurusElementType(self):
-        import taurus.core
-        return taurus.core.TaurusElementType.Device
+        return TaurusElementType.Device
 
     @classmethod
     def buildModelName(cls, parent_model, relative_name):
@@ -189,8 +186,8 @@ class TaurusDevice(taurusmodel.TaurusModel):
         if not self.hasListeners() or not cache:
             try:
                 v = self.getStateObj().read(cache=cache)
-            except Exception:
-                v = sys.exc_info()[1]
+            except Exception as e:
+                v = e
             self._deviceSwState = self.decode(v)
         return self._deviceSwState
 
@@ -216,22 +213,22 @@ class TaurusDevice(taurusmodel.TaurusModel):
         return self._descr
 
     def removeListener(self, listener):
-        ret = taurusmodel.TaurusModel.removeListener(self, listener)
+        ret = TaurusModel.removeListener(self, listener)
         if not ret or self.hasListeners():
             return ret # False, None or True
         return self.getStateObj().removeListener(self)
 
     def addListener(self, listener):
         weWereListening = self.hasListeners()
-        ret = taurusmodel.TaurusModel.addListener(self, listener)
+        ret = TaurusModel.addListener(self, listener)
         if not ret:
             return ret
 
         # We are only listening to State if someone is listening to us
         if weWereListening:
             # We were listening already, so we must fake an event to the new
-            # subscrived listener with the current value
-            self.fireEvent(taurusmodel.TaurusEventType.Change, self.getValueObj(), hasattr(listener,'__iter__') and listener or [listener])
+            # subscribed listener with the current value
+            self.fireEvent(TaurusEventType.Change, self.getValueObj(), hasattr(listener,'__iter__') and listener or [listener])
         else:
             # We were not listening to events, but now we have to
             self.getStateObj().addListener(self)
diff --git a/lib/taurus/core/taurusfactory.py b/lib/taurus/core/taurusfactory.py
index 801aac8..19b627f 100644
--- a/lib/taurus/core/taurusfactory.py
+++ b/lib/taurus/core/taurusfactory.py
@@ -41,11 +41,11 @@ __all__ = ["TaurusFactory"]
 
 __docformat__ = "restructuredtext"
 
-from enums import OperationMode
-import taurusdatabase
-import taurusdevice
-import taurusattribute
-import taurusconfiguration
+from .taurusbasetypes import OperationMode
+from .taurusdatabase import TaurusDatabase
+from .taurusdevice import TaurusDevice
+from .taurusattribute import TaurusAttribute
+from .taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy
 
 class TaurusFactory(object):
     """The base class for valid Factories in Taurus."""
@@ -85,20 +85,20 @@ class TaurusFactory(object):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-  
 
     def findObjectClass(self, absolute_name):
-        """findObjectClass(string absolute_name) -> taurus.core.TaurusModel subclass
+        """findObjectClass(string absolute_name) -> taurus.core.taurusmodel.TaurusModel subclass
            
         Obtain the class object corresponding to the given name.
            
         @param[in] absolute_name the object absolute name string
 
-        @return a class object that should be a subclass of a taurus.core.TaurusModel
+        @return a class object that should be a subclass of a taurus.core.taurusmodel.TaurusModel
         @throws TaurusException if the given name is invalid.
         """
         raise RuntimeError("findObjectClass cannot be called for abstract" \
                            " TaurusFactory")
 
     def getDatabase(self, db_name=None):
-        """getDatabase(string db_name) -> taurus.core.TaurusDatabase
+        """getDatabase(string db_name) -> taurus.core.taurusdatabase.TaurusDatabase
            
         Obtain the object corresponding to the given database name or the 
         default database if db_name is None.
@@ -106,37 +106,37 @@ class TaurusFactory(object):
         instance is returned. Otherwise a new instance is stored and returned.
            
         @param[in] db_name database name string. It should be formed like: 
-                           <schema>://<authority>. If <schema> is ommited then 
-                           it will use the default schema. if db_name is None, 
+                           <scheme>://<authority>. If <scheme> is ommited then 
+                           it will use the default scheme. if db_name is None, 
                            the default database is used
                            
-        @return a taurus.core.TaurusDatabase object 
+        @return a taurus.core.taurusdatabase.TaurusDatabase object 
         @throws TaurusException if the given name is invalid.
         """
         raise RuntimeError("getDatabase cannot be called for abstract" \
                            " TaurusFactory")
 
     def getDevice(self, dev_name, **kw):
-        """getDevice(string dev_name) -> taurus.core.TaurusDevice
+        """getDevice(string dev_name) -> taurus.core.taurusdevice.TaurusDevice
            
         Obtain the object corresponding to the given device name. If the 
         corresponding device already exists, the existing instance is returned. 
         Otherwise a new instance is stored and returned.
            
         @param[in] dev_name the device name string. It should be formed like:
-                            <schema>://<authority>/<device name>. If <schema> 
-                            is ommited then it will use the default schema. 
+                            <scheme>://<authority>/<device name>. If <scheme> 
+                            is ommited then it will use the default scheme. 
                             If authority is ommited then it will use the 
-                            default authority for the schema.
+                            default authority for the scheme.
         
-        @return a taurus.core.TaurusDevice object 
+        @return a taurus.core.taurusdevice.TaurusDevice object 
         @throws TaurusException if the given name is invalid.
         """
         raise RuntimeError("getDevice cannot be called for abstract" \
                            " TaurusFactory")
 
     def getAttribute(self, attr_name):
-        """getAttribute(string attr_name) -> taurus.core.TaurusAttribute
+        """getAttribute(string attr_name) -> taurus.core.taurusattribute.TaurusAttribute
 
         Obtain the object corresponding to the given attribute name.
         If the corresponding attribute already exists, the existing instance
@@ -144,22 +144,22 @@ class TaurusFactory(object):
 
         @param[in] attr_name string attribute name
              
-        @return a taurus.core.TaurusAttribute object 
+        @return a taurus.core.taurusattribute.TaurusAttribute object 
         @throws TaurusException if the given name is invalid.
         """
         raise RuntimeError("getAttribute cannot be called for abstract" \
                            " TaurusFactory")
 
     def getConfiguration(self, param):
-        """getConfiguration(param) -> taurus.core.TaurusConfiguration
+        """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
 
         Obtain the object corresponding to the given attribute or full name.
         If the corresponding configuration already exists, the existing instance
         is returned. Otherwise a new instance is stored and returned.
 
-        @param[in] param taurus.core.TaurusAttribute object or full configuration name
+        @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
            
-        @return a taurus.core.TaurusAttribute object
+        @return a taurus.core.taurusattribute.TaurusAttribute object
         @throws TaurusException if the given name is invalid.
         """
         raise RuntimeError("getConfiguration cannot be called for abstract" \
@@ -209,15 +209,15 @@ class TaurusFactory(object):
         return obj
 
     def getObject(self, cls, name):
-        if issubclass(cls, taurusdatabase.TaurusDatabase):
+        if issubclass(cls, TaurusDatabase):
             return self.getDatabase(name)
-        elif issubclass(cls, taurusdevice.TaurusDevice):
+        elif issubclass(cls, TaurusDevice):
             return self.getDevice(name)
-        elif issubclass(cls, taurusattribute.TaurusAttribute):
+        elif issubclass(cls, TaurusAttribute):
             return self.getAttribute(name)
-        elif issubclass(cls, taurusconfiguration.TaurusConfiguration):
+        elif issubclass(cls, TaurusConfiguration):
             return self.getConfiguration(name)
-        elif issubclass(cls, taurusconfiguration.TaurusConfigurationProxy):
+        elif issubclass(cls, TaurusConfigurationProxy):
             return self.getConfiguration(name)
         else:
             return None
@@ -271,3 +271,9 @@ class TaurusFactory(object):
         """
         raise RuntimeError("removeAttributeFromPolling cannot be called for abstract" \
                            " TaurusFactory")
+
+    def __str__(self):
+        return '{0}()'.format(self.__class__.__name__)
+
+    def __repr__(self):
+        return '{0}(schemes={1})'.format(self.__class__.__name__, ", ".join(self.schemes))
diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py
index 33da855..baaa86a 100644
--- a/lib/taurus/core/taurushelper.py
+++ b/lib/taurus/core/taurushelper.py
@@ -25,6 +25,16 @@
 
 """a list of helper methods"""
 
+__all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName',
+           'Manager', 'Factory', 'Device', 'Attribute', 'Configuration',
+           'Database', 'Object', 'Logger',
+           'Critical', 'Error', 'Warning', 'Info', 'Debug', 'Trace',
+           'setLogLevel', 'setLogFormat', 'getLogLevel', 'getLogFormat',
+           'resetLogLevel', 'resetLogFormat',
+           'enableLogOutput', 'disableLogOutput',
+           'log', 'trace', 'debug', 'info', 'warning', 'error', 'critical',
+           'changeDefaultPollingPeriod']
+
 __docformat__ = "restructuredtext"
 
 import sys
@@ -167,7 +177,7 @@ def check_dependencies():
         print m
 
 def log_dependencies():
-    from taurus.core.util import Logger
+    from taurus.core.util.log import Logger
     l = Logger("taurus")
     for msg in _check_dependencies(forlog=True):
         if msg[0] != -1:
@@ -295,32 +305,37 @@ def Manager():
     It is a shortcut to::
 
         import taurus.core
-        manager = taurus.core.TaurusManager()
+        manager = taurus.core.taurusmanager.TaurusManager()
     
     :return: the TaurusManager
-    :rtype: :class:`taurus.core.TaurusManager`
+    :rtype: :class:`taurus.core.taurusmanager.TaurusManager`
     
-    .. seealso:: :class:`taurus.core.TaurusManager`"""
-    import taurusmanager
-    return taurusmanager.TaurusManager()
+    .. seealso:: :class:`taurus.core.taurusmanager.TaurusManager`"""
+    from taurus.core.taurusmanager import TaurusManager
+    return TaurusManager()
 
 def Factory(scheme=None):
     """Returns the one and only Factory for the given scheme
     
     It is a shortcut to::
 
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory(scheme)
 
     :param scheme: a string representing the scheme. Default value is None meaning ``tango`` scheme
     :type scheme: str
     :return: a taurus factory
-    :rtype: :class:`taurus.core.TaurusFactory`"""
-    f = Manager().getFactory(scheme=scheme)
+    :rtype: :class:`taurus.core.taurusfactory.TaurusFactory`"""
+    manager = Manager()
+    f = manager.getFactory(scheme=scheme)
     if f is None:
-        import taurusexception
-        raise taurusexception.TaurusException('Cannot create Factory for scheme %s'%repr(scheme))
+        from taurus.core.taurusexception import TaurusException
+        if scheme is None:
+            scheme = "default scheme '" + manager.default_scheme + "'"
+        else:
+            scheme = "'" + scheme + "'"
+        raise TaurusException('Cannot create Factory for %s' % scheme)
     return f()
 
 def Device(device_name):
@@ -328,15 +343,15 @@ def Device(device_name):
 
     It is a shortcut to::
 
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         device  = factory.getDevice(device_name)
     
     :param device_name: the device name
     :type device_name: str
     :return: a taurus device
-    :rtype: :class:`taurus.core.TaurusDevice`"""
+    :rtype: :class:`taurus.core.taurusdevice.TaurusDevice`"""
     return Factory(scheme=getSchemeFromName(device_name)).getDevice(device_name)
 
 def Attribute(dev_or_attr_name, attr_name=None):
@@ -348,15 +363,15 @@ def Attribute(dev_or_attr_name, attr_name=None):
 
     It is a shortcut to::
 
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         attribute  = factory.getAttribute(full_attribute_name)
     
     or::
     
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         device  = factory.getDevice(device_name)
         attribute = device.getAttribute(attribute_name)
@@ -366,7 +381,7 @@ def Attribute(dev_or_attr_name, attr_name=None):
     :param attr_name: attribute name
     :type attr_name: str
     :return: a taurus attribute
-    :rtype: :class:`taurus.core.TaurusAttribute`"""
+    :rtype: :class:`taurus.core.taurusattribute.TaurusAttribute`"""
     import types
     
     if attr_name is None:
@@ -387,15 +402,15 @@ def Configuration(attr_or_conf_name, conf_name=None):
     
     It is a shortcut to::
 
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         conf  = factory.getConfiguration(attr_or_conf_name)
 
     or::
     
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         attribute  = factory.getAttribute(attribute_name)
         conf = attribute.getConfig(conf_name)
@@ -405,7 +420,7 @@ def Configuration(attr_or_conf_name, conf_name=None):
     :param conf_name: conf name
     :type conf_name: str or None
     :return: a taurus configuration
-    :rtype: :class:`taurus.core.TaurusConfiguration`"""
+    :rtype: :class:`taurus.core.taurusconfiguration.TaurusConfiguration`"""
     if conf_name is None:
         return Factory(scheme=getSchemeFromName(attr_or_conf_name)).getConfiguration(attr_or_conf_name)
     else:
@@ -416,15 +431,15 @@ def Database(db_name=None):
     
     It is a shortcut to::
 
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         db  = factory.getDatabase(db_name)
         
     :param db_name: database name. If None (default) it will use the TANGO_HOST value
     :type db_name: str or None
     :return: a taurus database
-    :rtype: :class:`taurus.core.TaurusDatabase`"""
+    :rtype: :class:`taurus.core.taurusdatabase.TaurusDatabase`"""
     return Factory(getSchemeFromName(db_name)).getDatabase(db_name)
 
 def Object(klass, name):
@@ -432,8 +447,8 @@ def Object(klass, name):
     
     It is a shortcut to::
 
-        import taurus.core
-        manager = taurus.core.TaurusManager()
+        import taurus.core.taurusmanager
+        manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         obj  = factory.getObject(klass, name)
 
@@ -442,36 +457,39 @@ def Object(klass, name):
     :param name: the full object name
     :type name: str
     :return: a taurus object
-    :rtype: :class:`taurus.core.TaurusModel`"""
+    :rtype: :class:`taurus.core.taurusmodel.TaurusModel`"""
     return Factory(getSchemeFromName(name)).getObject(klass, name)
 
-import util
-
-Critical = util.Logger.Critical
-Error    = util.Logger.Error
-Warning  = util.Logger.Warning
-Info     = util.Logger.Info
-Debug    = util.Logger.Debug
-Trace    = util.Logger.Trace
-    
-setLogLevel = util.Logger.setLogLevel
-setLogFormat = util.Logger.setLogFormat
-getLogLevel = util.Logger.getLogLevel
-getLogFormat = util.Logger.getLogFormat
-resetLogLevel = util.Logger.resetLogLevel
-resetLogFormat = util.Logger.resetLogFormat
-
-enableLogOutput = util.Logger.enableLogOutput
-disableLogOutput = util.Logger.disableLogOutput
-
-log = util._log
-trace = util.trace
-debug = util.debug
-info = util.info
-warning = util.warning
-error = util.error
-critical = util.critical
-
+from taurus.core.util import log as __log_mod
+
+Logger   = __log_mod.Logger
+Critical = Logger.Critical
+Error    = Logger.Error
+Warning  = Logger.Warning
+Info     = Logger.Info
+Debug    = Logger.Debug
+Trace    = Logger.Trace
+
+setLogLevel = Logger.setLogLevel
+setLogFormat = Logger.setLogFormat
+getLogLevel = Logger.getLogLevel
+getLogFormat = Logger.getLogFormat
+resetLogLevel = Logger.resetLogLevel
+resetLogFormat = Logger.resetLogFormat
+
+enableLogOutput = Logger.enableLogOutput
+disableLogOutput = Logger.disableLogOutput
+
+log = __log_mod._log
+trace = __log_mod.trace
+debug = __log_mod.debug
+info = __log_mod.info
+warning = __log_mod.warning
+error = __log_mod.error
+critical = __log_mod.critical
 
 def changeDefaultPollingPeriod(period):
     Manager().changeDefaultPollingPeriod(period)
+
+#del __log_mod
+#del __translate_version_str2int
\ No newline at end of file
diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py
index 60cbae8..f53baf1 100644
--- a/lib/taurus/core/tauruslistener.py
+++ b/lib/taurus/core/tauruslistener.py
@@ -29,15 +29,13 @@ __all__ = ["TaurusListener", "TaurusExceptionListener"]
 
 __docformat__ = "restructuredtext"
 
-import PyTango
+from .util.log import Logger
 
-import util
-
-class TaurusListener(util.Logger):
+class TaurusListener(Logger):
     """ TaurusListener Interface"""
     
     def __init__(self, name, parent=None):
-        self.call__init__(util.Logger, name, parent)
+        self.call__init__(Logger, name, parent)
     
     def eventReceived(self, src, type, evt_value):
         """ Method to implement the event notification"""
@@ -49,9 +47,7 @@ class TaurusListener(util.Logger):
 
 
 class TaurusExceptionListener(object):
-    """Class for handling ConnectionFailed, DevFailed and TaurusException exceptions.
-
-    The TaurusExceptionListeners are invoked when the """
+    """Class for handling ConnectionFailed, DevFailed and TaurusException exceptions."""
 
     def connectionFailed(self, ex):
         self._printException(ex)
@@ -60,6 +56,7 @@ class TaurusExceptionListener(object):
         self._printException(self)
 
     def exceptionReceived(self, exception):
+        import PyTango
         if isinstance(exception, PyTango.ConnectionFailed):
             self.connectionFailed(exception)
 
@@ -67,7 +64,7 @@ class TaurusExceptionListener(object):
             self.devFailed(exception)
 
         else:
-            self._printException(self, exception)
+            self._printException(exception)
 
     def _printException(self, exception):
         print self.__class__.__name__, "received", exception.__class__.__name__, str(exception)
diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py
index 5067f8d..8d67544 100644
--- a/lib/taurus/core/taurusmanager.py
+++ b/lib/taurus/core/taurusmanager.py
@@ -29,23 +29,32 @@ __all__ = ["TaurusManager"]
 
 __docformat__ = "restructuredtext"
 
-import os, imp, atexit
+import os
+import imp
+import atexit
 
-import util
-import taurus.core
-from enums import OperationMode, ManagerState, TaurusSerializationMode
-from taurus.core.taurusexception import TaurusException
+from .util.singleton import Singleton
+from .util.log import Logger
+from .util.threadpool import ThreadPool
 
-class TaurusManager(util.Singleton, util.Logger):
-    """A :class:`taurus.core.util.Singleton` class designed to provide Taurus management.
+from .taurusbasetypes import OperationMode, ManagerState, TaurusSerializationMode
+from .taurusdatabase import TaurusDatabase
+from .taurusdevice import TaurusDevice
+from .taurusconfiguration import TaurusConfiguration
+from .taurusexception import TaurusException
+from .taurusfactory import TaurusFactory
+
+class TaurusManager(Singleton, Logger):
+    """A :class:`taurus.core.util.singleton.Singleton` class designed to provide Taurus management.
     
        Example::
        
-           >>> import taurus.core
-           >>> manager = taurus.core.TaurusManager()
-           >>> print manager == taurus.core.TaurusManager()
+           >>> import taurus.core.taurusmanager
+           >>> manager = taurus.core.taurusmanager.TaurusManager()
+           >>> print manager == taurus.core.taurusmanager.TaurusManager()
            True
     """
+    PLUGIN_KEY = "__taurus_plugin__"
     
     DefaultSerializationMode = TaurusSerializationMode.Concurrent
     default_scheme = "tango"
@@ -58,7 +67,7 @@ class TaurusManager(util.Singleton, util.Logger):
         """Singleton instance initialization. 
            For internal usage only. Do **NOT** call this method directly"""
         self._state = ManagerState.UNINITIALIZED
-        self.call__init__(util.Logger)
+        self.call__init__(Logger)
         self.reInit()
         atexit.register(self.cleanUp)
 
@@ -73,16 +82,15 @@ class TaurusManager(util.Singleton, util.Logger):
         self._operation_mode = OperationMode.ONLINE
         self._serialization_mode = self.DefaultSerializationMode
         if self._serialization_mode == TaurusSerializationMode.Concurrent:
-            self._thread_pool = util.ThreadPool(name="TaurusTP",
-                                                parent=self,
-                                                Psize=5,
-                                                Qsize=1000)
+            self._thread_pool = ThreadPool(name="TaurusTP",
+                                           parent=self,
+                                           Psize=5,
+                                           Qsize=1000)
         else:
             self._thread_pool = None
-        self._plugins = self._build_plugins()
+        self._plugins = None
         
         self._initial_default_scheme = self.default_scheme
-        self._default_factory = self._plugins.get(self.default_scheme, None)
         
         self._state = ManagerState.INITED
 
@@ -95,7 +103,7 @@ class TaurusManager(util.Singleton, util.Logger):
         if self._plugins is None:
             return
         self.trace("[TaurusManager] cleanUp")
-        for f_schema, f in self._plugins.items():
+        for f_scheme, f in self._plugins.items():
             f().cleanUp()
         self._plugins = None
         
@@ -144,10 +152,9 @@ class TaurusManager(util.Singleton, util.Logger):
             self.default_scheme = "simulation"
         else:
             self.default_scheme = self._initial_default_scheme
-        self._default_factory = self._plugins.get(self.default_scheme, None)
             
         self._operation_mode = mode
-        for plugin in self._plugins.values():
+        for plugin in self.getPlugins().values():
             plugin().setOperationMode(mode)
         
     def getOperationMode(self):
@@ -159,34 +166,36 @@ class TaurusManager(util.Singleton, util.Logger):
     def getDefaultFactory(self):
         """Gives the default factory.
         
-        :return: (taurus.core.TaurusFactory) the default taurus factory
+        :return: (taurus.core.taurusfactory.TaurusFactory) the default taurus factory
         """
-        return self._default_factory
+        return self.getPlugins().get(self.default_scheme, None)
         
     def getPlugins(self):
         """Gives the information about the existing plugins
         
-        :return: (dict<str, class taurus.core.TaurusFactory>)the list of plugins
+        :return: (dict<str, class taurus.core.taurusfactory.TaurusFactory>)the list of plugins
         """
+        if self._plugins is None:
+            self._plugins = self._build_plugins()
         return self._plugins
         
     def getFactory(self, scheme=None):
         """Gives the factory class object supporting the given scheme
         
         :param scheme: (str or None) the scheme. If None the default scheme is used
-        :return: (taurus.core.TaurusFactory or None) the factory class object for the 
+        :return: (taurus.core.taurusfactory.TaurusFactory or None) the factory class object for the 
                  given scheme or None if a proper factory is not found
         """
         if scheme is None:
             return self.getDefaultFactory()
-        return self._plugins.get(scheme)
+        return self.getPlugins().get(scheme)
 
     def getObject(self, cls, name):
         """Gives the object for the given class with the given name
         
-        :param cls: (taurus.core.TaurusModel) object class
+        :param cls: (taurus.core.taurusmodel.TaurusModel) object class
         :param name: (str) the object name
-        :return: (taurus.core.TaurusModel or None) a taurus model object
+        :return: (taurus.core.taurusmodel.TaurusModel or None) a taurus model object
         """
         factory = self._get_factory(name)
         if factory is None: return
@@ -196,7 +205,7 @@ class TaurusManager(util.Singleton, util.Logger):
         """Finds the object with the given name
         
         :param absolute_name: (str) the object name
-        :return: (taurus.core.TaurusModel or None) the taurus model object or None if 
+        :return: (taurus.core.taurusmodel.TaurusModel or None) the taurus model object or None if 
                  no suitable name found
         """
         factory = self._get_factory(absolute_name)
@@ -207,7 +216,7 @@ class TaurusManager(util.Singleton, util.Logger):
         """Finds the object class for the given object name
         
         :param absolute_name: (str) the object name
-        :return: (class taurus.core.TaurusModel or None) the taurus model class object or 
+        :return: (class taurus.core.taurusmodel.TaurusModel or None) the taurus model class object or 
                  None if no suitable name found
         """
         factory = self._get_factory(absolute_name)
@@ -218,50 +227,50 @@ class TaurusManager(util.Singleton, util.Logger):
         """Returns a database object for the given name
         
         :param name: (str) database name
-        :return: (taurus.core.TaurusDatabase) the database for the given name
+        :return: (taurus.core.taurusdatabase.TaurusDatabase) the database for the given name
         """
-        return self.getObject(taurus.core.TaurusDatabase, name)
+        return self.getObject(TaurusDatabase, name)
 
     def getDevice(self, name):
         """Returns a device object for the given name
         
         :param name: (str) device name
-        :return: (taurus.core.TaurusDevice) the device for the given name
+        :return: (taurus.core.taurusdevice.TaurusDevice) the device for the given name
         """
-        return self.getObject(taurus.core.TaurusDevice, name)
+        return self.getObject(TaurusDevice, name)
     
     def getAttribute(self, name):
         """Returns a attribute object for the given name
         
         :param name: (str) attribute name
-        :return: (taurus.core.TaurusAttribute) the attribute for the given name
+        :return: (taurus.core.taurusattribute.TaurusAttribute) the attribute for the given name
         """
-        return self.getObject(taurus.core.TaurusAttribute, name)
+        return self.getObject(TaurusAttribute, name)
     
     def getConfiguration(self, name):
         """Returns a configuration object for the given name
         
         :param name: (str) configuration name
-        :return: (taurus.core.TaurusConfiguration) the configuration for the given name
+        :return: (taurus.core.taurusconfiguration.TaurusConfiguration) the configuration for the given name
         """
-        return self.getObject(taurus.core.TaurusConfiguration, name)
+        return self.getObject(TaurusConfiguration, name)
         
     def _get_factory(self, name):
-        scheme = self._get_schema(name)
+        scheme = self._get_scheme(name)
         if scheme is None: return
         try:
-            return self._plugins[scheme]()
+            return self.getPlugins()[scheme]()
         except:
             raise TaurusException('Invalid scheme "%s"'%scheme)
 
-    def _get_schema(self, name):
+    def _get_scheme(self, name):
         try:
             return name[:name.index('://')]
         except ValueError, e:
-            if self._default_factory is None:
-                self.warning("scheme not found for %s" % name)
-                return
             return self.default_scheme
+        
+    def _get_schema(self, name):
+        raise DeprecationWarning('_get_schema is deprecated. Use _get_scheme instead')
 
     def _build_plugins(self):
         plugin_classes = self._get_plugin_classes()
@@ -282,37 +291,43 @@ class TaurusManager(util.Singleton, util.Logger):
         import taurusfactory
         upgrade_classes = []
         
-        files = os.listdir(self._this_path)
+        elems = os.listdir(self._this_path)
         dirs = []
-        for f in files:
-            if f.startswith('.') or f == 'util':
+        for elem in elems:
+            if elem.startswith('.') or elem.startswith("_"):
                 continue
-            f = os.path.join(self._this_path, f)
-            if os.path.isdir(f):
-                elems = os.listdir(f)
-                if '__init__.py' in elems:
-                    dirs.append(f)
+            elem = os.path.join(self._this_path, elem)
+            if not os.path.isdir(elem):
+                continue
+            plugin_file = os.path.join(elem, self.PLUGIN_KEY)
+            if not os.path.exists(plugin_file):
+                continue
+            if not os.path.exists(os.path.join(elem, '__init__.py')):
+                continue
+            dirs.append(elem)
         
         plugins = []
         
-        for d in dirs:
-            package_name = d.split(os.path.sep)[-1]
+        full_module_names = ['taurus.core.%s'%d.split(os.path.sep)[-1] for d in dirs]
+        from taurus import tauruscustomsettings
+        full_module_names.extend(getattr(tauruscustomsettings,'EXTRA_SCHEME_MODULES',[]))
+        
+        for full_module_name in full_module_names:
             try:
-                full_module_name = 'taurus.core.%s' % package_name
                 m = __import__(full_module_name, fromlist=['*'], level=0)
             except Exception, imp1:
                 # just in case we are in python 2.4
                 try:
                     m = __import__(full_module_name, globals(), locals(), ['*'])
                 except:
-                    self.debug('Failed to inspect %s' % (package_name))
+                    self.debug('Failed to inspect %s' % (full_module_name))
                     self.debug('Details:', exc_info=1)
                     continue
             for s in m.__dict__.values():
                 plugin = None
                 try:
-                    if issubclass(s, taurus.core.TaurusFactory) and \
-                       issubclass(s, util.Singleton):
+                    if issubclass(s, TaurusFactory) and \
+                       issubclass(s, Singleton):
                         if hasattr(s, 'schemes') :
                             schemes = getattr(s, 'schemes')
                             if len(schemes):
@@ -327,7 +342,6 @@ class TaurusManager(util.Singleton, util.Logger):
                 if not plugin is None:
                     self.debug('Found plugin %s' % plugin.__name__)
                     plugins.append(plugin)
-                    
         return plugins
         
     def _find_scheme(self, factory_class):
@@ -340,7 +354,7 @@ class TaurusManager(util.Singleton, util.Logger):
         """Executes the given operations
         
         :param ops: the sequence of operations
-        :type ops: sequence<taurus.core.TaurusOperation>"""
+        :type ops: sequence<taurus.core.taurusoperation.TaurusOperation>"""
         for o in ops:
             o.execute()
             
@@ -348,7 +362,16 @@ class TaurusManager(util.Singleton, util.Logger):
         self.getFactory()().changeDefaultPollingPeriod(period)
         # todo: go through all known plugin factories and change their polling
         # period
+
+    def __str__name__(self, name):
+        return '{0}({1})'.format(self.__class__.__name__, name)
     
+    def __str__(self):
+        return self.__str__name__("")
+
+    def __repr__(self):
+        return self.__str__name__("")
+        
 if __name__ == '__main__':
     manager = TaurusManager()
     print manager.getPlugins()
diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py
index 0914a56..cc03427 100644
--- a/lib/taurus/core/taurusmodel.py
+++ b/lib/taurus/core/taurusmodel.py
@@ -33,10 +33,11 @@ import weakref
 import operator
 import threading
 
-import util
-from enums import TaurusEventType, MatchLevel
+from .util.log import Logger
+from .util.event import CallableRef, BoundMethodWeakref
+from .taurusbasetypes import TaurusEventType, MatchLevel
 
-class TaurusModel(util.Logger):
+class TaurusModel(Logger):
     
     RegularEvent = (TaurusEventType.Change, TaurusEventType.Config, TaurusEventType.Periodic)
 
@@ -48,7 +49,7 @@ class TaurusModel(util.Logger):
             self.trace("invalid name")
         
         name = self._simp_name or self._norm_name or self._full_name or 'TaurusModel'
-        self.call__init__(util.Logger, name, parent)
+        self.call__init__(Logger, name, parent)
         
         if serializationMode is None:
             s_obj = parent
@@ -63,18 +64,20 @@ class TaurusModel(util.Logger):
             self._parentObj = None
         self._listeners = []
 
+    def __str__name__(self, name):
+        return '{0}({1})'.format(self.__class__.__name__, name)
+    
     def __str__(self):
-        return '%s(%s)' % (self.__class__.__name__, self.getSimpleName())
+        return self.__str__name__(self.getNormalName())
 
     def __repr__(self):
-        return '%s(%s)' % (self.__class__.__name__, self.getFullName())
+        return self.__str__name__(self.getFullName())
     
-
     def cleanUp(self):
         self.trace("[TaurusModel] cleanUp")
         #self._parentObj = None
         self._listeners = None
-        util.Logger.cleanUp(self)
+        Logger.cleanUp(self)
         
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for Factory access
@@ -184,7 +187,7 @@ class TaurusModel(util.Logger):
         if meth is not None and operator.isCallable(meth):
             return weakref.ref(listener, cb)
         else:
-            return util.CallableRef(listener, cb)
+            return CallableRef(listener, cb)
     
     def addListener(self, listener):
         if self._listeners is None or listener is None: 
@@ -242,7 +245,7 @@ class TaurusModel(util.Logger):
             listeners = listeners,
             
         for listener in listeners:
-            if isinstance(listener, weakref.ref) or isinstance(listener, util.BoundMethodWeakref):
+            if isinstance(listener, weakref.ref) or isinstance(listener, BoundMethodWeakref):
                 l = listener()
             else:
                 l = listener
diff --git a/lib/taurus/core/taurusoperation.py b/lib/taurus/core/taurusoperation.py
index f5d8624..a4538d7 100644
--- a/lib/taurus/core/taurusoperation.py
+++ b/lib/taurus/core/taurusoperation.py
@@ -29,12 +29,12 @@ __all__ = ["TaurusOperation", "WriteAttrOperation"]
 
 __docformat__ = "restructuredtext"
 
-import util
+from .util.log import Logger
 
-class TaurusOperation(util.Logger):
+class TaurusOperation(Logger):
 
     def __init__(self, name='TaurusOperation', parent=None, callbacks = None):
-        self.call__init__(util.Logger, name, parent)
+        self.call__init__(Logger, name, parent)
         if callbacks is None: callbacks = []
         self._callbacks = callbacks
         self._dangerMessage = None
diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py
index c7fbd21..3a49638 100644
--- a/lib/taurus/core/tauruspollingtimer.py
+++ b/lib/taurus/core/tauruspollingtimer.py
@@ -32,10 +32,12 @@ __docformat__ = "restructuredtext"
 import time
 import threading
 
-import util
-from util import DebugIt
+from .util.log import Logger, DebugIt
+from .util.containers import CaselessDict
+from .util.timer import Timer
 
-class TaurusPollingTimer(util.Logger):
+
+class TaurusPollingTimer(Logger):
     """ Polling timer manages a list of attributes that have to be polled in
     the same period """
     
@@ -43,13 +45,13 @@ class TaurusPollingTimer(util.Logger):
         """Constructor
         
            :param period: (int) polling period (miliseconds)
-           :param parent: (util.Logger) parent object (default is None)
+           :param parent: (Logger) parent object (default is None)
         """
         name = "TaurusPollingTimer[%d]" % period
-        self.call__init__(util.Logger, name, parent)
+        self.call__init__(Logger, name, parent)
         self.dev_dict = {}
         self.attr_nb = 0
-        self.timer = util.Timer(period/1000.0, self._pollAttributes, self)
+        self.timer = Timer(period/1000.0, self._pollAttributes, self)
         self.lock = threading.RLock()
         
     def start(self):
@@ -63,7 +65,7 @@ class TaurusPollingTimer(util.Logger):
     def containsAttribute(self,attribute):
         """Determines if the polling timer already contains this attribute
         
-           :param attribute: (taurus.core.TaurusAttribute) the attribute
+           :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute
            
            :return: (bool) True if the attribute is registered for polling or
                     False otherwise
@@ -86,7 +88,7 @@ class TaurusPollingTimer(util.Logger):
     def addAttribute(self,attribute, auto_start=True):
         """Registers the attribute in this polling.
         
-           :param attribute: (taurus.core.TaurusAttribute) the attribute to be added
+           :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute to be added
            :param auto_start: (bool) if True (default) it tells the polling timer
                               that it should startup as soon as there is at least
                               one attribute registered.
@@ -96,7 +98,7 @@ class TaurusPollingTimer(util.Logger):
         try:
             attr_dict = self.dev_dict.get(dev)
             if attr_dict is None:
-                self.dev_dict[dev] = attr_dict = util.CaselessDict()
+                self.dev_dict[dev] = attr_dict = CaselessDict()
             if not attr_dict.has_key(attr_name):
                 attr_dict[attr_name] = attribute
                 self.attr_nb += 1
@@ -113,7 +115,7 @@ class TaurusPollingTimer(util.Logger):
            attributes decreses to 0 the polling is stopped automatically in order
            to save resources.
         
-           :param attribute: (taurus.core.TaurusAttribute) the attribute to be added
+           :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute to be added
         """
         dev, attr_name = attribute.getParentObj(), attribute.getSimpleName()
         self.lock.acquire()
diff --git a/lib/taurus/core/taurusvalidator.py b/lib/taurus/core/taurusvalidator.py
index bffcd7b..01a5baa 100644
--- a/lib/taurus/core/taurusvalidator.py
+++ b/lib/taurus/core/taurusvalidator.py
@@ -33,8 +33,8 @@ __docformat__ = "restructuredtext"
 
 import re
 
-import util
-from enums import MatchLevel
+from .taurusbasetypes import MatchLevel
+from .util.singleton import Singleton
 
 InvalidAlias = "nada"
 
@@ -89,7 +89,7 @@ class AbstractTangoValidator:
         return None
 
 
-class DatabaseNameValidator(util.Singleton, AbstractTangoValidator):
+class DatabaseNameValidator(Singleton, AbstractTangoValidator):
     
     protocol_prefix = '((?P<scheme>tango)://)?'
     
@@ -122,7 +122,7 @@ class DatabaseNameValidator(util.Singleton, AbstractTangoValidator):
         return 3*('%s:%s' % (host,port),)
 
 
-class DatabaseQueryValidator(util.Singleton, AbstractTangoValidator):
+class DatabaseQueryValidator(Singleton, AbstractTangoValidator):
     """Deprecated"""
     
     query = '\?query=(?P<query>[\w\-_]+)(?P<params>(\?param=[\w\*\?\%\-_]+)*)'
@@ -152,7 +152,7 @@ class DatabaseQueryValidator(util.Singleton, AbstractTangoValidator):
         return str, normal, short    
             
 
-class DeviceNameValidator(util.Singleton, AbstractTangoValidator):
+class DeviceNameValidator(Singleton, AbstractTangoValidator):
     
     w = AbstractTangoValidator.tango_word
     dev = '(?P<devicename>' + w + '/' + w + '/' + w + ')'
@@ -204,7 +204,7 @@ class DeviceNameValidator(util.Singleton, AbstractTangoValidator):
         return complete, dev_name, alias
 
 
-class DeviceQueryValidator(util.Singleton, AbstractTangoValidator):
+class DeviceQueryValidator(Singleton, AbstractTangoValidator):
     """Deprecated"""
     query = DatabaseQueryValidator.query
 
@@ -233,7 +233,7 @@ class DeviceQueryValidator(util.Singleton, AbstractTangoValidator):
         return str,short    
 
     
-class AttributeNameValidator(util.Singleton, AbstractTangoValidator):
+class AttributeNameValidator(Singleton, AbstractTangoValidator):
     
     w = AbstractTangoValidator.tango_word
     attr = '/(?P<attributename>' + w + ')'
@@ -270,7 +270,7 @@ class AttributeNameValidator(util.Singleton, AbstractTangoValidator):
         return str, normal_name, attr_name
     
     
-class ConfigurationNameValidator(util.Singleton, AbstractTangoValidator):
+class ConfigurationNameValidator(Singleton, AbstractTangoValidator):
     
     w = AbstractTangoValidator.tango_word
     conf = "\?(?i)configuration(=(?P<configparam>" + w + "))*"
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/__init__.py
index 69849d9..684c575 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/__init__.py
@@ -36,87 +36,11 @@ The json implementation follows the rule:
 
 __docformat__ = "restructuredtext"
 
-import sys
-import os.path
+import taurus.tauruscustomsettings
 
-try:
-    import json
-except:
-    json = None
+LIGHTWEIGHT_IMPORTS = getattr(taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False)
 
-from .codecs import *
-from .colors import *
-from .constant import *
-from .containers import *
-from .enumeration import *
-from .event import *
-from .log import *
-from .object import *
-from .timer import *
-from .singleton import *
-from .safeeval import *
-from .prop import *
-from .threadpool import *
-from .user import *
-
-import eventfilters
-
-from lxml import etree
-
-def str_DevFailed(df):
-    """Returns a string representation of a :class:`PyTango.DevFailed`.
-    
-    :param df: (PyTango.DevFailed) the PyTango exception object
-    :return: (str) a string representation of the given exception"""
-    
-    ret = ""
-    try:
-        desc = df.message.desc.rstrip('\n').replace('\n',"              \n")
-    
-        ret += "   Severity = %s\n" % df.message.severity
-        ret += "     Reason = %s\n" % df.message.reason
-        ret += "Description = %s\n" % desc
-        ret += "     Origin = %s\n" % df.message.origin
-    except:
-        ret = "Exception = %s" % str(df)
-    return ret
-
-def print_DevFailed(df):
-    """Prints the contents of the given :class:`PyTango.DevFailed`.
-    
-    :param df: (PyTango.DevFailed) the PyTango exception object"""
-    import PyTango
-    PyTango.Except.print_exception(df)
-
-def dictFromSequence(seq):
-    """Translates a sequence into a dictionary by converting each to elements of
-    the sequence (k,v) into a k:v pair in the dictionary
-    
-    :param seq: (sequence) any sequence object
-    :return: (dict) dictionary built from the given sequence"""
-    def _pairwise(iterable):
-        """Utility method used by dictFromSequence"""
-        itnext = iter(iterable).next
-        while True:
-            yield itnext(), itnext()
-    return dict(_pairwise(seq))
-
-if sys.version_info < (2,6):
-    def relpath(path, start=os.path.curdir):
-        """Return a relative version of a path"""
-
-        if not path:
-            raise ValueError("no path specified")
-
-        start_list = os.path.abspath(start).split(os.path.sep)
-        path_list = os.path.abspath(path).split(os.path.sep)
-
-        # Work out how much of the filepath is shared by start and path.
-        i = len(os.path.commonprefix([start_list, path_list]))
-
-        rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
-        if not rel_list:
-            return os.path.curdir
-        return os.path.join(*rel_list)
-    
-    os.path.relpath = relpath
+if LIGHTWEIGHT_IMPORTS:
+    from init_lightweight import *
+else:
+    from init_bkcomp import *
\ No newline at end of file
diff --git a/lib/taurus/core/util/argparse/taurusargparse.py b/lib/taurus/core/util/argparse/taurusargparse.py
index a1df355..c9ad402 100644
--- a/lib/taurus/core/util/argparse/taurusargparse.py
+++ b/lib/taurus/core/util/argparse/taurusargparse.py
@@ -175,10 +175,11 @@ def init_taurus_args(parser=None, args=None, values=None):
 
     # initialize taurus serialization mode
     if options.taurus_serialization_mode is not None:
-        import taurus.core
+        import taurus.core.taurusbasetypes
+        SerMode = taurus.core.taurusbasetypes.TaurusSerializationMode
         m = options.taurus_serialization_mode.capitalize()
-        if hasattr(taurus.core.TaurusSerializationMode, m):
-            m = getattr(taurus.core.TaurusSerializationMode, m)
+        if hasattr(SerMode, m):
+            m = getattr(SerMode, m)
             taurus.Manager().setSerializationMode(m)
 
     # initialize remote console port
diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py
index 91e447e..47bb4a1 100644
--- a/lib/taurus/core/util/codecs.py
+++ b/lib/taurus/core/util/codecs.py
@@ -38,7 +38,7 @@ sequence of codecs. This way you can have codecs 'inside' codecs.
 
 Example::
 
-    >>> from taurus.core.util import CodecFactory
+    >>> from taurus.core.util.codecs import CodecFactory
     >>> cf = CodecFactory()
     >>> json_codec = cf.getCodec('json')
     >>> bz2_json_codec = cf.getCodec('bz2_json')
@@ -55,7 +55,7 @@ A Taurus related example::
 
     >>> # this example shows how to automatically get the data from a DEV_ENCODED attribute
     >>> import taurus
-    >>> from taurus.core.util import CodecFactory
+    >>> from taurus.core.util.codecs import CodecFactory
     >>> cf = CodecFactory()
     >>> devenc_attr = taurus.Attribute('a/b/c/devenc_attr')
     >>> v = devenc_attr.read()
@@ -141,7 +141,7 @@ class ZIPCodec(Codec):
     
     Example::
     
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         
         >>> # first encode something
         >>> data = 100 * "Hello world\\n"
@@ -183,7 +183,7 @@ class BZ2Codec(Codec):
 
     Example::
     
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         
         >>> # first encode something
         >>> data = 100 * "Hello world\\n"
@@ -226,7 +226,7 @@ class PickleCodec(Codec):
     
     Example::
         
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         
         >>> cf = CodecFactory()
         >>> codec = cf.getCodec('pickle')
@@ -281,7 +281,7 @@ class JSONCodec(Codec):
     
     Example::
         
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         
         >>> cf = CodecFactory()
         >>> codec = cf.getCodec('json')
@@ -364,7 +364,7 @@ class BSONCodec(Codec):
     
     Example::
         
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         
         >>> cf = CodecFactory()
         >>> codec = cf.getCodec('bson')
@@ -463,7 +463,7 @@ class VideoImageCodec(Codec):
     
     Example::
     
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         >>> import PyTango
         
         >>> #first get an image from a LImA device to decode
@@ -621,7 +621,7 @@ class CodecPipeline(Codec, list):
 
     Example usage::
         
-        >>> from taurus.core.util import CodecPipeline
+        >>> from taurus.core.util.codecs import CodecPipeline
         
         >>> data = range(100000)
         >>> codec = CodecPipeline('bz2_json')
@@ -676,7 +676,7 @@ class CodecFactory(Singleton, Logger):
     
     To get the singleton object do::
     
-        from taurus.core.util import CodecFactory
+        from taurus.core.util.codecs import CodecFactory
         f = CodecFactory()
         
     The :class:`CodecFactory` class allows you to get a codec object for a given 
@@ -686,7 +686,7 @@ class CodecFactory(Singleton, Logger):
 
     Example::
 
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         >>> cf = CodecFactory()
         >>> json_codec = cf.getCodec('json')
         >>> bz2_json_codec = cf.getCodec('bz2_json')
@@ -703,7 +703,7 @@ class CodecFactory(Singleton, Logger):
 
         >>> # this example shows how to automatically get the data from a DEV_ENCODED attribute
         >>> import taurus
-        >>> from taurus.core.util import CodecFactory
+        >>> from taurus.core.util.codecs import CodecFactory
         >>> cf = CodecFactory()
         >>> devenc_attr = taurus.Attribute('a/b/c/devenc_attr')
         >>> v = devenc_attr.read()
diff --git a/lib/taurus/core/util/console.py b/lib/taurus/core/util/console.py
index 7aadf1e..4ae3db8 100644
--- a/lib/taurus/core/util/console.py
+++ b/lib/taurus/core/util/console.py
@@ -121,7 +121,7 @@ HTMLTangoColors = { PyTango.DevState.ON      : HTMLColors.Green,
                     PyTango.DevState.UNKNOWN : HTMLColors.LightGray,
                     None                     : HTMLColors.DarkGray }
                     
-from taurus.core import TaurusSWDevState
+from taurus.core.taurusbasetypes import TaurusSWDevState
 
 NoTaurusSWDevStateColors = {
     TaurusSWDevState.Uninitialized       : NoColors.LightGray,
diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py
index 98e398c..5a9ddf9 100644
--- a/lib/taurus/core/util/enumeration.py
+++ b/lib/taurus/core/util/enumeration.py
@@ -51,7 +51,7 @@ class Enumeration(object):
     as elements of a dictionary.
     Usage::
         
-        from taurus.core.util import Enumeration
+        from taurus.core.util.enumeration import Enumeration
         
         Volkswagen = Enumeration("Volkswagen",
             ["JETTA",
diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py
index 99c29f2..b30dae3 100644
--- a/lib/taurus/core/util/event.py
+++ b/lib/taurus/core/util/event.py
@@ -381,7 +381,7 @@ class EventListener(object):
         with this object's lock before calling this method and always unlock it 
         afterward, of course::
         
-            from taurus.core.util import EventListener
+            from taurus.core.util.event import EventListener
             
             class MyEvtListener(EventListener):
                 # Your specific listener code here
@@ -460,7 +460,7 @@ class ListEventGenerator(EventGenerator):
 
 
 class AttributeEventWait(object):
-    """Class designed to connect to a :class:`taurus.core.TaurusAttribute` and
+    """Class designed to connect to a :class:`taurus.core.taurusattribute.TaurusAttribute` and
     fire events or wait for a certain event."""
 
     def __init__(self, attr=None):
@@ -474,7 +474,7 @@ class AttributeEventWait(object):
     def connect(self, attr):
         """Connect to the given attribute
         :param attr: the attribute to connect to
-        :type  attr: taurus.core.TaurusAttribute"""
+        :type  attr: taurus.core.taurusattribute.TaurusAttribute"""
         needAdd = True
         if self._attr is not None:
             if attr == self._attr:
@@ -521,9 +521,9 @@ class AttributeEventWait(object):
         """Event listener method for the underlying attribute. Do not call this
         method. It will be called internally when the attribute generates
         an event."""
-        if t == taurus.core.TaurusEventType.Config:
+        if t == taurus.core.taurusbasetypes.TaurusEventType.Config:
             return
-        elif t == taurus.core.TaurusEventType.Error:
+        elif t == taurus.core.taurusbasetypes.TaurusEventType.Error:
             self.fireEvent(None)
         else:
             self.fireEvent(v.value)
@@ -662,7 +662,7 @@ class AttributeEventIterator(object):
                   "locked by thread %s" % (curr_th.name, th.name)
     
     def eventReceived(self, s, t, v):
-        if t not in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+        if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
             return
         self.fireEvent(s, v.value)
     
diff --git a/lib/taurus/core/util/eventfilters.py b/lib/taurus/core/util/eventfilters.py
index 7ac44d2..4414acd 100644
--- a/lib/taurus/core/util/eventfilters.py
+++ b/lib/taurus/core/util/eventfilters.py
@@ -34,32 +34,32 @@ def IGNORE_ALL(s, t, v):
 
 def ONLY_CHANGE(s, t, v):
     '''Only change events pass'''
-    if t == taurus.core.TaurusEventType.Change: return s,t,v
+    if t == taurus.core.taurusbasetypes.TaurusEventType.Change: return s,t,v
     else: return None
 
 def IGNORE_CHANGE(s, t, v):
     '''Config events are discarded'''
-    if t != taurus.core.TaurusEventType.Change: return s,t,v
+    if t != taurus.core.taurusbasetypes.TaurusEventType.Change: return s,t,v
     else: return None
 
 def ONLY_CHANGE_AND_PERIODIC(s, t, v):
     '''Only change events pass'''
-    if t in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]: return s,t,v
+    if t in [taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic]: return s,t,v
     else: return None
 
 def IGNORE_CHANGE_AND_PERIODIC(s, t, v):
     '''Config events are discarded'''
-    if t not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]: return s,t,v
+    if t not in [taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic]: return s,t,v
     else: return None
     
 def ONLY_CONFIG(s, t, v):
     '''Only config events pass'''
-    if t == taurus.core.TaurusEventType.Config: return s,t,v
+    if t == taurus.core.taurusbasetypes.TaurusEventType.Config: return s,t,v
     else: return None
     
 def IGNORE_CONFIG(s, t, v):
     '''Config events are discarded'''
-    if t != taurus.core.TaurusEventType.Config: return s,t,v
+    if t != taurus.core.taurusbasetypes.TaurusEventType.Config: return s,t,v
     else: return None
     
 def ONLY_VALID(s, t, v):
@@ -95,7 +95,7 @@ class EventValueMap(dict):
     }
 
     def __call__(self, s, t, v):
-        if not t in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+        if not t in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
             return s, t, v
         if v is None:
             return s, t, v
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/init_bkcomp.py
similarity index 60%
copy from lib/taurus/core/util/__init__.py
copy to lib/taurus/core/util/init_bkcomp.py
index 69849d9..dc56ecf 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/init_bkcomp.py
@@ -36,24 +36,26 @@ The json implementation follows the rule:
 
 __docformat__ = "restructuredtext"
 
-import sys
-import os.path
+# taurus cannot work properly without the following modules so 
+# they are promptly imported here has a facility (also for backward
+# compatibility)
+# However, new applications should in their code use the full import.
+# Example, use:
+#     from taurus.core.util.log import Logger
+# instead of:
+#     from taurus.core.util import Logger
 
-try:
-    import json
-except:
-    json = None
-
-from .codecs import *
-from .colors import *
-from .constant import *
 from .containers import *
 from .enumeration import *
 from .event import *
 from .log import *
 from .object import *
-from .timer import *
 from .singleton import *
+
+from .codecs import *
+from .colors import *
+from .constant import *
+from .timer import *
 from .safeeval import *
 from .prop import *
 from .threadpool import *
@@ -61,32 +63,10 @@ from .user import *
 
 import eventfilters
 
-from lxml import etree
-
-def str_DevFailed(df):
-    """Returns a string representation of a :class:`PyTango.DevFailed`.
-    
-    :param df: (PyTango.DevFailed) the PyTango exception object
-    :return: (str) a string representation of the given exception"""
-    
-    ret = ""
-    try:
-        desc = df.message.desc.rstrip('\n').replace('\n',"              \n")
-    
-        ret += "   Severity = %s\n" % df.message.severity
-        ret += "     Reason = %s\n" % df.message.reason
-        ret += "Description = %s\n" % desc
-        ret += "     Origin = %s\n" % df.message.origin
-    except:
-        ret = "Exception = %s" % str(df)
-    return ret
-
-def print_DevFailed(df):
-    """Prints the contents of the given :class:`PyTango.DevFailed`.
-    
-    :param df: (PyTango.DevFailed) the PyTango exception object"""
-    import PyTango
-    PyTango.Except.print_exception(df)
+try:
+    from lxml import etree
+except:
+    etree = None
 
 def dictFromSequence(seq):
     """Translates a sequence into a dictionary by converting each to elements of
@@ -100,23 +80,3 @@ def dictFromSequence(seq):
         while True:
             yield itnext(), itnext()
     return dict(_pairwise(seq))
-
-if sys.version_info < (2,6):
-    def relpath(path, start=os.path.curdir):
-        """Return a relative version of a path"""
-
-        if not path:
-            raise ValueError("no path specified")
-
-        start_list = os.path.abspath(start).split(os.path.sep)
-        path_list = os.path.abspath(path).split(os.path.sep)
-
-        # Work out how much of the filepath is shared by start and path.
-        i = len(os.path.commonprefix([start_list, path_list]))
-
-        rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
-        if not rel_list:
-            return os.path.curdir
-        return os.path.join(*rel_list)
-    
-    os.path.relpath = relpath
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/init_lightweight.py
similarity index 54%
copy from lib/taurus/core/util/__init__.py
copy to lib/taurus/core/util/init_lightweight.py
index 69849d9..e12c7c7 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/init_lightweight.py
@@ -36,57 +36,37 @@ The json implementation follows the rule:
 
 __docformat__ = "restructuredtext"
 
-import sys
-import os.path
+# taurus cannot work properly without the following modules so 
+# they are promptly imported here has a facility (also for backward
+# compatibility)
+# However, new applications should in their code use the full import.
+# Example, use:
+#     from taurus.core.util.log import Logger
+# instead of:
+#     from taurus.core.util import Logger
 
-try:
-    import json
-except:
-    json = None
-
-from .codecs import *
-from .colors import *
-from .constant import *
 from .containers import *
 from .enumeration import *
 from .event import *
 from .log import *
 from .object import *
-from .timer import *
 from .singleton import *
-from .safeeval import *
-from .prop import *
-from .threadpool import *
-from .user import *
-
-import eventfilters
 
-from lxml import etree
+# from .codecs import *
+# from .colors import *
+# from .constant import *
+# from .timer import *
+# from .safeeval import *
+# from .prop import *
+# from .threadpool import *
+# from .user import *
 
-def str_DevFailed(df):
-    """Returns a string representation of a :class:`PyTango.DevFailed`.
-    
-    :param df: (PyTango.DevFailed) the PyTango exception object
-    :return: (str) a string representation of the given exception"""
-    
-    ret = ""
-    try:
-        desc = df.message.desc.rstrip('\n').replace('\n',"              \n")
-    
-        ret += "   Severity = %s\n" % df.message.severity
-        ret += "     Reason = %s\n" % df.message.reason
-        ret += "Description = %s\n" % desc
-        ret += "     Origin = %s\n" % df.message.origin
-    except:
-        ret = "Exception = %s" % str(df)
-    return ret
+# import eventfilters
 
-def print_DevFailed(df):
-    """Prints the contents of the given :class:`PyTango.DevFailed`.
-    
-    :param df: (PyTango.DevFailed) the PyTango exception object"""
-    import PyTango
-    PyTango.Except.print_exception(df)
+# try:
+    # from lxml import etree
+# except:
+    # etree = None
 
 def dictFromSequence(seq):
     """Translates a sequence into a dictionary by converting each to elements of
@@ -100,23 +80,3 @@ def dictFromSequence(seq):
         while True:
             yield itnext(), itnext()
     return dict(_pairwise(seq))
-
-if sys.version_info < (2,6):
-    def relpath(path, start=os.path.curdir):
-        """Return a relative version of a path"""
-
-        if not path:
-            raise ValueError("no path specified")
-
-        start_list = os.path.abspath(start).split(os.path.sep)
-        path_list = os.path.abspath(path).split(os.path.sep)
-
-        # Work out how much of the filepath is shared by start and path.
-        i = len(os.path.commonprefix([start_list, path_list]))
-
-        rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
-        if not rel_list:
-            return os.path.curdir
-        return os.path.join(*rel_list)
-    
-    os.path.relpath = relpath
diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py
index 2f63302..1dbd2bd 100644
--- a/lib/taurus/core/util/log.py
+++ b/lib/taurus/core/util/log.py
@@ -79,7 +79,7 @@ class LogIt(object):
     subclass.
     Example::
 
-        from taurus.core.util import *
+        from taurus.core.util.log import Logger, LogIt
 
         class Example(Logger):
 
@@ -98,7 +98,7 @@ class LogIt(object):
     which are set to False by default. Enabling them will had verbose infomation
     about the parameters and return value. The following example::
 
-        from taurus.core.util import *
+        from taurus.core.uti.log import Logger, LogIt
 
         class Example(Logger):
 
@@ -172,7 +172,7 @@ class TraceIt(LogIt):
     """Specialization of LogIt for trace level messages.
     Example::
 
-        from taurus.core.util import TraceIt
+        from taurus.core.util.log import Logger, TraceIt
         class Example(Logger):
 
             @TraceIt()
@@ -188,7 +188,7 @@ class DebugIt(LogIt):
     """Specialization of LogIt for debug level messages.
     Example::
 
-        from taurus.core.util import DebugIt
+        from taurus.core.util.log import Logger, DebugIt
         class Example(Logger):
 
             @DebugIt()
@@ -204,7 +204,7 @@ class InfoIt(LogIt):
     """Specialization of LogIt for info level messages.
     Example::
 
-        from taurus.core.util import InfoIt
+        from taurus.core.util.log import Logger, InfoIt
         class Example(Logger):
 
             @InfoIt()
@@ -220,7 +220,7 @@ class WarnIt(LogIt):
     """Specialization of LogIt for warn level messages.
     Example::
 
-        from taurus.core.util import WarnIt
+        from taurus.core.util.log import Logger, WarnIt
         class Example(Logger):
 
             @WarnIt()
@@ -236,7 +236,7 @@ class ErrorIt(LogIt):
     """Specialization of LogIt for error level messages.
     Example::
 
-        from taurus.core.util import ErrorIt
+        from taurus.core.util.log import Logger, ErrorIt
         class Example(Logger):
 
             @ErrorIt()
@@ -252,7 +252,7 @@ class CriticalIt(LogIt):
     """Specialization of LogIt for critical level messages.
     Example::
 
-        from taurus.core.util import CriticalIt
+        from taurus.core.util.log import Logger, CriticalIt
         class Example(Logger):
 
             @CriticalIt()
diff --git a/lib/taurus/core/util/property_parser.py b/lib/taurus/core/util/property_parser.py
index e8e4ce9..591316e 100644
--- a/lib/taurus/core/util/property_parser.py
+++ b/lib/taurus/core/util/property_parser.py
@@ -30,7 +30,8 @@ import os
 import ply.lex as lex
 import ply.yacc as yacc
 
-from taurus.core.util import CaselessDict
+from .containers import CaselessDict
+from .log import Logger
 
 reserved = CaselessDict({
     'true'  : 'true',
@@ -171,13 +172,12 @@ def p_value_list_elems2(p):
     '''value_list : value'''
     p[0] = [p[1]]
 
-import taurus.core.util
 
-class PropertyParser(taurus.core.util.Logger):
+class PropertyParser(Logger):
     
     def __init__(self, parent=None):
         name = self.__class__.__name__
-        self.call__init__(taurus.core.util.Logger, name, parent)
+        self.call__init__(Logger, name, parent)
         self._last_filename = None
 
     def parse_file(self, f, logger=None, debug=0, optimize=1):
diff --git a/lib/taurus/core/util/singleton.py b/lib/taurus/core/util/singleton.py
index 43a12b9..c76800d 100644
--- a/lib/taurus/core/util/singleton.py
+++ b/lib/taurus/core/util/singleton.py
@@ -36,7 +36,7 @@ class Singleton(object):
     The Singleton is created for the lowest subclass.
     Usage::
     
-        from taurus.core.util import Singleton
+        from taurus.core.util.singleton import Singleton
         
         class MyManager(Singleton):
         
diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py
index 56a640a..0b83a3f 100644
--- a/lib/taurus/qt/qtcore/configuration/configuration.py
+++ b/lib/taurus/qt/qtcore/configuration/configuration.py
@@ -328,6 +328,9 @@ class BaseConfigurableClass:
         :param item: (object or str) The object that should be unregistered.
                      Alternatively, the name under which the object was registered
                      can be passed as a python string.
+        :param raiseOnError: (bool) If True (default), it raises a KeyError 
+                             exception if item was not registered. If False, it 
+                             just logs a debug message 
         
         .. seealso:: :meth:`registerConfigProperty`, :meth:`registerConfigDelegate`
         '''
@@ -340,7 +343,7 @@ class BaseConfigurableClass:
         elif raiseOnError:
             raise KeyError('"%s" was not registered.'%name)
         else:
-            self.info('"%s" was not registered. Skipping'%name)
+            self.debug('"%s" was not registered. Skipping'%name)
             return False
 
       
diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
index 710c63c..7cfbf0e 100644
--- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
+++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
@@ -39,13 +39,14 @@ __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem",
 __docformat__ = 'restructuredtext'
 
 from taurus.qt import Qt
-import taurus.core
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusSWDevHealth
+from taurus.core.taurusdatabase import TaurusInfo, TaurusDatabase
 import taurus.qt.qtcore.mimetypes
 
-from taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
+from .taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
 
-ElemType = taurus.core.TaurusElementType
-DevHealth = taurus.core.TaurusSWDevHealth
+ElemType = TaurusElementType
+DevHealth = TaurusSWDevHealth
 
 def getElementTypeIcon(*args, **kwargs):
     """Wrapper to prevent loading qtgui when this module is imported"""
@@ -74,7 +75,7 @@ def getSWDevHealthToolTip(*args, **kwargs):
 
 
 class TaurusTreeDbBaseItem(TaurusBaseTreeItem):
-    DisplayFunc = taurus.core.TaurusInfo.name
+    DisplayFunc = TaurusInfo.name
 
 
 class TaurusTreeDevicePartItem(TaurusTreeDbBaseItem):
@@ -448,7 +449,7 @@ class TaurusDbBaseModel(TaurusBaseModel):
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.cache()
         devices = data.devices()
 
@@ -477,7 +478,7 @@ class TaurusDbSimpleDeviceAliasModel(TaurusDbBaseModel):
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.cache()
         devices = data.devices()
 
@@ -499,7 +500,7 @@ class TaurusDbPlainDeviceModel(TaurusDbBaseModel):
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.cache()
         devices = data.devices()
 
@@ -522,7 +523,7 @@ class TaurusDbDeviceModel(TaurusDbBaseModel):
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.deviceTree()
 
         rootItem = self._rootItem
@@ -548,7 +549,7 @@ class TaurusDbPlainServerModel(TaurusDbBaseModel):
         if data is None:
             return
 
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.cache()
 
         servers = data.servers()
@@ -576,7 +577,7 @@ class TaurusDbServerModel(TaurusDbBaseModel):
         if data is None:
             return
 
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.cache()
 
         servers, klasses, devices = data.servers(), data.klasses(), data.devices()
@@ -624,7 +625,7 @@ class TaurusDbDeviceClassModel(TaurusDbBaseModel):
         if data is None:
             return
 
-        if isinstance(data, taurus.core.TaurusDatabase):
+        if isinstance(data, TaurusDatabase):
             data = data.cache()
 
         rootItem = self._rootItem
diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py
index 9216a4f..b4bcf79 100644
--- a/lib/taurus/qt/qtcore/model/taurusmodel.py
+++ b/lib/taurus/qt/qtcore/model/taurusmodel.py
@@ -29,9 +29,11 @@ __all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"]
 
 __docformat__ = 'restructuredtext'
 
-import taurus.core
 from taurus.qt import Qt
-from taurus.core.util import Logger
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.util.log import Logger
+
+QtQt = Qt.Qt
 
 class TaurusBaseTreeItem(object):
     """A generic node"""
@@ -152,13 +154,13 @@ class TaurusBaseTreeItem(object):
 
     def role(self):
         """Returns the prefered role for the item.
-        This implementation returns taurus.core.TaurusElementType.Unknown
+        This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
         
         This method should be able to return any kind of python object as long
         as the model that is used is compatible.
         
-        :return: (taurus.core.TaurusElementType) the role in form of element type"""
-        return taurus.core.TaurusElementType.Unknown
+        :return: (taurus.core.taurusbasetypes.TaurusElementType) the role in form of element type"""
+        return TaurusElementType.Unknown
 
     def __str__(self):
         return self.display()
@@ -248,35 +250,35 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
         s = self.roleSize(role)
         return s
     
-    def pyData(self, index, role=Qt.Qt.DisplayRole):
+    def pyData(self, index, role=QtQt.DisplayRole):
         if not index.isValid():
             return None
         
         item = index.internalPointer()
         
         ret = None
-        if role == Qt.Qt.DisplayRole or role == Qt.Qt.EditRole:
+        if role == QtQt.DisplayRole or role == QtQt.EditRole:
             ret = item.data(index)
-#        elif role == Qt.Qt.CheckStateRole:
+#        elif role == QtQt.CheckStateRole:
 #            data = item.data(index)
 #            if type(data) != bool:
 #                data = str(data).lower() == 'true'
-#            ret = Qt.Qt.Unchecked
+#            ret = QtQt.Unchecked
 #            if data == True:
-#                ret = Qt.Qt.Checked
-        elif role == Qt.Qt.DecorationRole:
+#                ret = QtQt.Checked
+        elif role == QtQt.DecorationRole:
             ret = item.icon(index)
-        elif role == Qt.Qt.ToolTipRole:
+        elif role == QtQt.ToolTipRole:
             ret = item.toolTip(index)
-        #elif role == Qt.Qt.SizeHintRole:
+        #elif role == QtQt.SizeHintRole:
         #    ret = self.columnSize(column)
-        elif role == Qt.Qt.FontRole:
+        elif role == QtQt.FontRole:
             ret = self.DftFont
-        elif role == Qt.Qt.UserRole:
+        elif role == QtQt.UserRole:
             ret = Qt.QVariant(item)
         return ret
     
-    def data(self, index, role=Qt.Qt.DisplayRole):
+    def data(self, index, role=QtQt.DisplayRole):
         ret = self.pyData(index, role)
         if ret is None:
             ret = Qt.QVariant()
@@ -284,7 +286,7 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
             ret = Qt.QVariant(ret)
         return ret
 
-    def _setData(self, index, qvalue, role=Qt.Qt.EditRole):
+    def _setData(self, index, qvalue, role=QtQt.EditRole):
         item = index.internalPointer()
         pyobj = Qt.from_qvariant(qvalue)
         if pyobj is NotImplemented:
@@ -296,29 +298,29 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
         if not index.isValid():
             return 0
         
-        ret = Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsDragEnabled
+        ret = QtQt.ItemIsEnabled | QtQt.ItemIsDragEnabled
         
         item = index.internalPointer()
         column, depth = index.column(), item.depth()
         taurus_role = self.role(column, depth)
         
         if taurus_role in self.selectables():
-            ret |= Qt.Qt.ItemIsSelectable
+            ret |= QtQt.ItemIsSelectable
         return ret
     
-    def headerData(self, section, orientation, role=Qt.Qt.DisplayRole):
+    def headerData(self, section, orientation, role=QtQt.DisplayRole):
         ret = None
-        if orientation == Qt.Qt.Horizontal:
-            if role == Qt.Qt.TextAlignmentRole:
-                ret = int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)
-            elif role == Qt.Qt.DisplayRole:
+        if orientation == QtQt.Horizontal:
+            if role == QtQt.TextAlignmentRole:
+                ret = int(QtQt.AlignLeft | QtQt.AlignVCenter)
+            elif role == QtQt.DisplayRole:
                 ret = self.ColumnNames[section]
-            elif role == Qt.Qt.SizeHintRole:
+            elif role == QtQt.SizeHintRole:
                 ret = Qt.QSize(self.columnSize(section))
                 ret.setHeight(24)
-            elif role == Qt.Qt.ToolTipRole:
+            elif role == QtQt.ToolTipRole:
                 ret = self.columnToolTip(section)
-            elif role == Qt.Qt.DecorationRole:
+            elif role == QtQt.DecorationRole:
                 ret = self.columnIcon(section)
                 
         return Qt.QVariant(ret)
@@ -379,16 +381,16 @@ class TaurusBaseProxyModel(Qt.QSortFilterProxyModel):
         Qt.QSortFilterProxyModel.__init__(self, parent)
         
         # filter configuration
-        self.setFilterCaseSensitivity(Qt.Qt.CaseInsensitive)
+        self.setFilterCaseSensitivity(QtQt.CaseInsensitive)
         self.setFilterKeyColumn(0)
-        self.setFilterRole(Qt.Qt.DisplayRole)
+        self.setFilterRole(QtQt.DisplayRole)
         
         # sort configuration
-        self.setSortCaseSensitivity(Qt.Qt.CaseInsensitive)
-        self.setSortRole(Qt.Qt.DisplayRole)
+        self.setSortCaseSensitivity(QtQt.CaseInsensitive)
+        self.setSortRole(QtQt.DisplayRole)
         
         # general configuration
-        self.sort(0, Qt.Qt.AscendingOrder)
+        self.sort(0, QtQt.AscendingOrder)
         
     def __getattr__(self, name):
         return getattr(self.sourceModel(), name)
diff --git a/lib/taurus/qt/qtcore/tango/sardana/macroserver.py b/lib/taurus/qt/qtcore/tango/sardana/macroserver.py
index 0fd4056..83c7a00 100644
--- a/lib/taurus/qt/qtcore/tango/sardana/macroserver.py
+++ b/lib/taurus/qt/qtcore/tango/sardana/macroserver.py
@@ -27,7 +27,7 @@
 
 __all__ = ["QDoor", "QMacroServer", "MacroServerMessageErrorHandler", "registerExtensions"]
 
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
 from taurus.core.tango.sardana.macroserver import BaseMacroServer, BaseDoor
 from taurus.qt import Qt
 
diff --git a/lib/taurus/qt/qtcore/tango/sardana/model.py b/lib/taurus/qt/qtcore/tango/sardana/model.py
index f8db520..a4812d3 100644
--- a/lib/taurus/qt/qtcore/tango/sardana/model.py
+++ b/lib/taurus/qt/qtcore/tango/sardana/model.py
@@ -42,9 +42,9 @@ try:
 except:
     pygments = None
 
-from taurus.core import TaurusDevice
+from taurus.core.taurusdevice import TaurusDevice
 from taurus.qt import Qt
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
 from taurus.qt.qtcore.model import TaurusBaseTreeItem, TaurusBaseModel, \
     TaurusBaseProxyModel
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, \
@@ -103,7 +103,7 @@ class SardanaBaseTreeItem(TaurusBaseTreeItem):
     
     def role(self):
         """Returns the prefered role for the item.
-        This implementation returns taurus.core.TaurusElementType.Unknown
+        This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
         
         This method should be able to return any kind of python object as long
         as the model that is used is compatible.
diff --git a/lib/taurus/qt/qtcore/tango/sardana/pool.py b/lib/taurus/qt/qtcore/tango/sardana/pool.py
index 01db156..b492169 100644
--- a/lib/taurus/qt/qtcore/tango/sardana/pool.py
+++ b/lib/taurus/qt/qtcore/tango/sardana/pool.py
@@ -32,7 +32,7 @@ import json
 
 from taurus.qt import Qt
 
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
 from taurus.core.tango import TangoDevice
 
 CHANGE_EVTS = TaurusEventType.Change, TaurusEventType.Periodic
diff --git a/lib/taurus/qt/qtcore/taurusqlistener.py b/lib/taurus/qt/qtcore/taurusqlistener.py
index 016dded..d412871 100644
--- a/lib/taurus/qt/qtcore/taurusqlistener.py
+++ b/lib/taurus/qt/qtcore/taurusqlistener.py
@@ -31,7 +31,7 @@ __all__ = ["QTaurusBaseListener", "QObjectTaurusListener"]
 
 __docformat__ = 'restructuredtext'
 
-from taurus.core import TaurusListener
+from taurus.core.tauruslistener import TaurusListener
 from taurus.qt import Qt
 
 
@@ -70,7 +70,7 @@ class QTaurusBaseListener(TaurusListener):
             (i.e. reimplementing :meth:`handleEvent`)
 
         :param evt_src: (object) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
         :param evt_value: (object) event value
         """
         self.fireEvent(evt_src, evt_type, evt_value)
@@ -83,7 +83,7 @@ class QTaurusBaseListener(TaurusListener):
         or Qt threads, respectively
 
         :param evt_src: (object or None) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType or None) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
         :param evt_value: (object or None) event value
         """
         try:
@@ -97,7 +97,7 @@ class QTaurusBaseListener(TaurusListener):
         unless one of them returns None (in which case the event is discarded)
 
         :param evt_src: (object) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
         :param evt_value: (object) event value
         """
         r = evt_src, evt_type, evt_value
@@ -122,7 +122,7 @@ class QTaurusBaseListener(TaurusListener):
         Reimplement as necessary
 
         :param evt_src: (object or None) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType or None) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
         :param evt_value: (object or None) event value
         """
         pass
@@ -179,11 +179,11 @@ class QObjectTaurusListener(Qt.QObject, QTaurusBaseListener):
 class ListenerDemo(QObjectTaurusListener):
 
     def eventReceived(self, evt_src, evt_type, evt_value):
-        self.info("New %s event from %s", taurus.core.TaurusEventType[evt_type], evt_src)
+        self.info("New %s event from %s", taurus.core.taurusbasetypes.TaurusEventType[evt_type], evt_src)
         return super(ListenerDemo, self).eventReceived(evt_src, evt_type, evt_value)
     
     def handleEvent(self, evt_src, evt_type, evt_value):
-        self.info("New %s event from %s", taurus.core.TaurusEventType[evt_type], evt_src)
+        self.info("New %s event from %s", taurus.core.taurusbasetypes.TaurusEventType[evt_type], evt_src)
 
 
 if __name__ == "__main__":
diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py
index e91e942..8f66fa4 100644
--- a/lib/taurus/qt/qtcore/util/emitter.py
+++ b/lib/taurus/qt/qtcore/util/emitter.py
@@ -1,4 +1,3 @@
-
 #!/usr/bin/env python
 
 #############################################################################
@@ -30,7 +29,8 @@ emitter.py: This module provides a task scheduler used by TaurusGrid and TaurusD
 from functools import partial
 import taurus
 from taurus.qt import Qt
-from taurus.core.util import Logger,Singleton
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
 import Queue,traceback
 
 ###############################################################################
@@ -141,7 +141,6 @@ class TaurusEmitterThread(Qt.QThread):
         self.name = name
         self.log = Logger('TaurusEmitterThread(%s)'%self.name)
         self.log.setLogLevel(self.log.Info)
-        self.log.info('At TaurusEmitterThread.__init__(%s)'%self.name)
         self.queue = queue or Queue.Queue()
         self.todo = Queue.Queue()
         self.method = method
diff --git a/lib/taurus/qt/qtcore/util/tauruslog.py b/lib/taurus/qt/qtcore/util/tauruslog.py
index 1cb3cb8..a4c9537 100644
--- a/lib/taurus/qt/qtcore/util/tauruslog.py
+++ b/lib/taurus/qt/qtcore/util/tauruslog.py
@@ -23,29 +23,29 @@
 ##
 #############################################################################
 
-"""This module sets the taurus.core.util.Logger to be the Qt message handler"""
+"""This module sets the taurus.core.util.log.Logger to be the Qt message handler"""
 
 __all__ = ['getQtLogger', 'initTaurusQtLogger']
 
 __docformat__ = 'restructuredtext'
 
 from taurus.qt import Qt
-import taurus.core.util
+from taurus import Logger
 
 qtLogger = None
 
 QT_LEVEL_MATCHER = {
-    Qt.QtDebugMsg    : taurus.core.util.Logger.debug,
-    Qt.QtWarningMsg  : taurus.core.util.Logger.warning,
-    Qt.QtCriticalMsg : taurus.core.util.Logger.error,
-    Qt.QtFatalMsg    : taurus.core.util.Logger.error,
-    Qt.QtSystemMsg   : taurus.core.util.Logger.info
+    Qt.QtDebugMsg    : Logger.debug,
+    Qt.QtWarningMsg  : Logger.warning,
+    Qt.QtCriticalMsg : Logger.error,
+    Qt.QtFatalMsg    : Logger.error,
+    Qt.QtSystemMsg   : Logger.info
 }
 
 def getQtLogger():
     global qtLogger
     if qtLogger is None:
-        qtLogger = taurus.core.util.Logger('QtLogger')
+        qtLogger = Logger('QtLogger')
     return qtLogger
     
 def qtTaurusMsgHandler(type, msg):
diff --git a/lib/taurus/qt/qtdesigner/containerplugin.py b/lib/taurus/qt/qtdesigner/containerplugin.py
new file mode 100644
index 0000000..ef9c2f7
--- /dev/null
+++ b/lib/taurus/qt/qtdesigner/containerplugin.py
@@ -0,0 +1,124 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+## 
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+## 
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+## 
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU Lesser General Public License for more details.
+## 
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+""" Every TaurusWidget should have the following Qt Designer extended capabilities:
+
+  - Task menu:
+    it means when you right click on the widget in the designer, it will have
+    the following additional items:
+    - 'Edit model...' - opens a customized dialog for editing the widget model
+    
+  - Property Sheet:
+    it means that in the Qt Designer property sheet it will have the following
+    properties customized:
+    - 'model' - will have a '...' button that will open a customized dialog for
+      editing the widget model (same has 'Edit model...' task menu item
+"""
+
+from taurus.core.util.log import Logger
+from taurus.qt import Qt
+from taurus.qt import QtDesigner
+
+from taurus.qt.qtgui.container.qcontainer import QGroupWidget
+
+#import sip
+
+Q_TYPEID = {'QPyDesignerContainerExtension':     'com.trolltech.Qt.Designer.Container',
+            'QPyDesignerPropertySheetExtension': 'com.trolltech.Qt.Designer.PropertySheet',
+            'QPyDesignerTaskMenuExtension':      'com.trolltech.Qt.Designer.TaskMenu',
+            'QPyDesignerMemberSheetExtension':   'com.trolltech.Qt.Designer.MemberSheet'}
+
+
+class QGroupWidgetContainerExtension(QtDesigner.QPyDesignerContainerExtension):
+    def __init__(self, widget, parent=None):
+        super(QGroupWidgetContainerExtension, self).__init__(parent)
+        self._widget = widget
+        self._page_widget = None
+            
+    def addWidget(self, widget):
+        if self.count() > 0:
+            raise Exception("Can only have at maximum one child")
+        self._layout().addWidget(widget)
+        self._page_widget = widget
+    
+    def _content(self):
+        return self._widget.content()
+    
+    def _layout(self):
+        return self._content().layout()
+    
+    def count(self):
+        return self._layout().count()
+    
+    def currentIndex(self):
+        if self.count() > 0:
+            return 0
+        return -1
+    
+    def insertWidget(self, index, widget):
+        self.addWidget(widget)
+    
+    def remove(self, index):
+        self._layout().removeWidget(self.widget(index))
+    
+    def setCurrentIndex(self, index):
+        pass
+    
+    def widget(self, index):
+        return self._page_widget
+
+
+class QGroupWidgetExtensionFactory(QtDesigner.QExtensionFactory):
+    def __init__(self, parent=None):
+        super(QGroupWidgetExtensionFactory, self).__init__(parent)
+
+    def createExtension(self, obj, iid, parent):
+        if iid != Q_TYPEID['QPyDesignerContainerExtension']:
+            return None
+        if isinstance(obj, QGroupWidget):
+            return QGroupWidgetContainerExtension(obj, parent)
+        return None
+
+def create_plugin():
+    from taurusplugin.taurusplugin import TaurusWidgetPlugin
+    
+    class QGroupWidgetPlugin(TaurusWidgetPlugin):
+        
+        WidgetClass = QGroupWidget
+        
+        def initialize(self, formEditor):
+            if self.isInitialized():
+                return
+            
+            manager = formEditor.extensionManager()
+            if manager:
+                self.factory = QGroupWidgetExtensionFactory(manager)
+                manager.registerExtensions(self.factory, Q_TYPEID['QPyDesignerContainerExtension'])
+            self.initialized = True
+    return QGroupWidgetPlugin
+        
+QGroupWidgetPlugin = create_plugin()
+    
+    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py b/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
index a20b79d..a4314eb 100644
--- a/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
+++ b/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
@@ -27,11 +27,13 @@
 guiqwt widgets plugins for Qt Designer
 """
 
-from guiqwt.qtdesigner import create_qtdesigner_plugin
-
-PlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
-                                  icon="curve.png")
-
-ImagePlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
-                                  icon="image.png")
+try:
+    from guiqwt.qtdesigner import create_qtdesigner_plugin
+    PlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
+                                      icon="curve.png")
 
+    ImagePlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
+                                      icon="image.png")
+except ImportError:
+    from taurus.core.util.log import debug
+    debug("failed to load guiqwt designer plugin")
diff --git a/lib/taurus/qt/qtdesigner/taurusdesigner.py b/lib/taurus/qt/qtdesigner/taurusdesigner.py
new file mode 100644
index 0000000..e373ea1
--- /dev/null
+++ b/lib/taurus/qt/qtdesigner/taurusdesigner.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+## 
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+## 
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+## 
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU Lesser General Public License for more details.
+## 
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+import sys
+import os.path
+import optparse 
+
+import taurus
+from taurus.qt import Qt
+
+def env_index(env, env_name):
+    env_name = str(env_name)
+    for i, e in enumerate(env):
+        e = str(e)
+        if e.startswith(env_name):
+            return i
+    return -1
+
+def has_env(env, env_name):
+    return env_index(env, env_name) != -1
+
+def get_env(env, env_name):
+    env_name = str(env_name)
+    for i, e in enumerate(env):
+        e = str(e)
+        if e.startswith(env_name):
+            return e.split("=")[1]
+    return None
+
+def append_or_create_env(env, env_name, env_value, is_path_like=True):
+    i = env_index(env, env_name)
+    if i == -1:
+        env.append(env_name + "=" + env_value)
+    else:
+        if is_path_like:
+            e_n, e_v = env[i].split("=")
+            paths = e_v.split(os.path.pathsep)
+            if not env_value in paths:
+                env_value += os.path.pathsep + e_v
+        env[i] = env_name + "=" + env_value
+
+def append_or_create_env_list(env, env_name, env_value):
+    env_value = os.path.pathsep.join(env_value)
+    append_or_create_env(env, env_name, env_value)
+
+def get_qtdesigner_bin():
+    designer_bin = str(Qt.QLibraryInfo.location(Qt.QLibraryInfo.BinariesPath))
+
+    plat = sys.platform
+    if plat == "darwin":
+        designer_bin = os.path.join(designer_bin, "Designer.app", "Contents", "MacOS")
+    elif plat in ("win32", "nt"):
+        import PyQt4
+        designer_bin = os.path.abspath(os.path.dirname(PyQt4.__file__))
+
+    designer_bin = os.path.join(designer_bin, "designer")
+    return designer_bin
+
+def get_taurus_designer_path():
+    """Returns a list of directories containing taurus designer plugins"""
+    # Set PYQTDESIGNERPATH to look inside taurus for designer plugins
+    taurus_path = os.path.dirname(os.path.abspath(taurus.__file__))
+    taurus_qt_designer_path = os.path.join(taurus_path, 'qt', 'qtdesigner')
+    return [taurus_qt_designer_path]
+
+def qtdesigner_prepare_taurus(env=None, taurus_extra_path=None):
+
+    # Tell Qt Designer where it can find the directory containing the plugins
+    if env is None:
+        env = Qt.QProcess.systemEnvironment()
+
+    # Set PYQTDESIGNERPATH to look inside taurus for designer plugins
+    taurus_designer_path = get_taurus_designer_path()
+
+    append_or_create_env_list(env, "PYQTDESIGNERPATH", taurus_designer_path)
+
+    # Set TAURUSQTDESIGNERPATH
+    if taurus_extra_path is not None:
+        append_or_create_env(env, "TAURUSQTDESIGNERPATH", taurus_extra_path)
+        append_or_create_env(env, "PYTHONPATH", taurus_extra_path)
+
+    #print "PYTHONPATH=%s" % get_env(env, "PYTHONPATH")
+    #print "PYQTDESIGNERPATH=%s" % get_env(env, "PYQTDESIGNERPATH")
+    return env
+
+def qtdesigner_start(args, env=None):
+    # Start Designer.
+    designer_bin = get_qtdesigner_bin()
+
+    designer = Qt.QProcess()
+    designer.setProcessChannelMode(Qt.QProcess.ForwardedChannels)
+    designer.setEnvironment(env)
+    designer.start(designer_bin, args)
+    designer.waitForFinished(-1)
+
+    return designer.exitCode()
+
+def main(env=None):
+    version = "taurusdesigner %s" % (taurus.Release.version)
+    usage = "Usage: %prog [options] <ui file(s)>"
+    description = "The Qt designer application customized for taurus"
+    parser = optparse.OptionParser(version=version, usage=usage, description=description)
+    parser.add_option("--taurus-path", dest="tauruspath", default="",
+                      help="additional directories to look for taurus widgets")
+    parser.add_option("--qt-designer-path", dest="pyqtdesignerpath", default="",
+                      help="additional directories to look for python qt widgets")
+
+    options, args = parser.parse_args()
+
+    taurus_extra_path = None
+    # Set TAURUSQTDESIGNERPATH
+    if len(options.tauruspath) > 0:
+        taurus_extra_path = options.tauruspath
+    
+    env = qtdesigner_prepare_taurus(env=env, taurus_extra_path=taurus_extra_path)
+
+    sys.exit(qtdesigner_start(args, env=env))
+
+if __name__ == "__main__":
+    main()
+
diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
index ddaf2e8..dbd05a0 100644
--- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
+++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
@@ -23,10 +23,6 @@
 ##
 #############################################################################
 
-"""
-taurusplugin.py: 
-"""
-
 """ Every TaurusWidget should have the following Qt Designer extended capabilities:
 
   - Task menu:
@@ -41,27 +37,23 @@ taurusplugin.py:
       editing the widget model (same has 'Edit model...' task menu item
 """
 
-import os
-
 from taurus.qt import Qt
-from PyQt4 import QtDesigner
+from taurus.qt import QtDesigner
 
-import taurus.core
-import taurus.core.util
-import logging
+from taurus.core.util.log import Logger
 
 def Q_TYPEID(class_name):
     """ Helper function to generate an IID for Qt. Returns a QString."""
     return Qt.QString("com.trolltech.Qt.Designer.%s" % class_name)
 
-designer_logger = taurus.core.util.Logger("QtDesigner")
+designer_logger = Logger("PyQtDesigner")
 
 class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
     """TaurusWidgetPlugin"""
     
     def __init__(self, parent = None):
         QtDesigner.QPyDesignerCustomWidgetPlugin.__init__(self)
-        self._log = taurus.core.util.Logger(self._getWidgetClassName(), designer_logger)
+        self._log = Logger(self._getWidgetClassName(), designer_logger)
         self.initialized = False
     
     def initialize(self, formEditor):
@@ -95,10 +87,10 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
             w = None
         return w
     
-    def getWidgetInfo(self, key):
+    def getWidgetInfo(self, key, dft=None):
         if not hasattr(self, '_widgetInfo'):
             self._widgetInfo = self.getWidgetClass().getQtDesignerPluginInfo()
-        return self._widgetInfo.get(key)
+        return self._widgetInfo.get(key, dft)
     
     # This method returns the name of the custom widget class that is provided
     # by this plugin.
@@ -109,10 +101,7 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
         """ Returns the name of the group in Qt Designer's widget box that this 
             widget belongs to.
             It returns 'Taurus Widgets'. Overwrite if want another group."""
-        group = self.getWidgetInfo('group')
-        if group is None:
-            group = 'Taurus Widgets'
-        return group
+        return self.getWidgetInfo('group', 'Taurus Widgets')
 
     def getIconName(self):
         return self.getWidgetInfo('icon')
@@ -149,9 +138,4 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
         return whatsthis
     
     def isContainer(self):
-        container = self.getWidgetInfo('container')
-        if container is None:
-            container = False
-        return container
-    
-    
+        return self.getWidgetInfo('container', False)
diff --git a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
index 374c2bb..61adff6 100644
--- a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
+++ b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
@@ -39,28 +39,29 @@ def build_qtdesigner_widget_plugin(klass):
     Plugin.__name__ = klass.__name__ + "QtDesignerPlugin"
     return Plugin
 
-_SKIP = ["QLogo"]
+_SKIP = ["QLogo", "QGroupWidget", "TaurusGroupWidget"]
 
 _plugins = {}
 
 def main():
-    import taurus
-    import taurus.core.util
-    import taurus.qt.qtgui.util
-    taurus.setLogLevel(taurus.Debug)
-    _log = taurus.core.util.Logger(__name__)
+    from taurus import Manager
+    from taurus.core.util.log import Logger
+    from taurus.core.taurusbasetypes import OperationMode
+    from taurus.qt.qtgui.util import TaurusWidgetFactory
+    Logger.setLogLevel(Logger.Debug)
+    _log = Logger(__name__)
     
-    taurus.Manager().setOperationMode(taurus.core.OperationMode.OFFLINE)
+    Manager().setOperationMode(OperationMode.OFFLINE)
     
     try:
-        wf = taurus.qt.qtgui.util.TaurusWidgetFactory()
+        wf = TaurusWidgetFactory()
         klasses = wf.getWidgetClasses()
         ok_nb, skipped_nb, e1_nb, e2_nb, e3_nb, e4_nb = 0, 0, 0, 0, 0, 0
         for widget_klass in klasses:
             name = widget_klass.__name__
-            _log.debug("Processing %s" % name)
+            #_log.debug("Processing %s" % name)
             if name in _SKIP:
-                _log.debug("Skipped %s" % name)
+                #_log.debug("Skipped %s" % name)
                 skipped_nb += 1
                 continue
             # if getQtDesignerPluginInfo does not exist, returns None or raises
@@ -69,24 +70,24 @@ def main():
             try:
                 qt_info = widget_klass.getQtDesignerPluginInfo()
                 if qt_info is None:
-                    _log.debug("E1: Canceled %s (getQtDesignerPluginInfo)" % name)
+                    #_log.debug("E1: Canceled %s (getQtDesignerPluginInfo)" % name)
                     e1_nb += 1
                     cont = True
             except AttributeError:
-                _log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name)
+                #_log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name)
                 e2_nb += 1
                 cont = True
             except Exception,e:
-                _log.debug("E3: Canceled %s (%s)" % (name, str(e)))
+                #_log.debug("E3: Canceled %s (%s)" % (name, str(e)))
                 e3_nb += 1
                 cont = True
             
             if cont: continue
             for k in ('module', ):
                 if not qt_info.has_key(k):
-                     _log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k))
-                     e4_nb += 1
-                     cont=True
+                    #_log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k))
+                    e4_nb += 1
+                    cont=True
             if cont: continue
             
             plugin_klass = build_qtdesigner_widget_plugin(widget_klass)
@@ -95,14 +96,16 @@ def main():
             _plugins[plugin_klass_name] = plugin_klass
             
             ok_nb += 1
-            _log.debug("DONE processing %s" % name)
+            #_log.debug("DONE processing %s" % name)
         _log.info("Inpected %d widgets. %d (OK), %d (Skipped), %d (E1), %d (E2), %d (E3), %d(E4)" % (len(klasses), ok_nb, skipped_nb, e1_nb, e2_nb, e3_nb, e4_nb))
         _log.info("E1: getQtDesignerPluginInfo() returns None")
         _log.info("E2: widget doesn't implement getQtDesignerPluginInfo()")
         _log.info("E3: getQtDesignerPluginInfo() throws exception")
         _log.info("E4: getQtDesignerPluginInfo() returns dictionary with missing key (probably 'module' key)")
-    except Exception, e:
-        print e
+    except Exception as e:
+        import traceback; traceback.print_exc()
+        #print e
+
 
 class TaurusWidgets(QtDesigner.QPyDesignerCustomWidgetCollectionPlugin):
     
diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py
index 056e651..e285159 100644
--- a/lib/taurus/qt/qtgui/base/taurusbase.py
+++ b/lib/taurus/qt/qtgui/base/taurusbase.py
@@ -37,8 +37,14 @@ import PyTango
 
 from taurus.qt import Qt
 
-import taurus.core
+import taurus
 from taurus.core.util import eventfilters
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from taurus.core.tauruslistener import TaurusListener, TaurusExceptionListener
+from taurus.core.taurusoperation import WriteAttrOperation
 from taurus.qt.qtcore.configuration import BaseConfigurableClass
 from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
 from taurus.qt.qtgui.util import ActionFactory
@@ -78,7 +84,7 @@ TTANGO_TO_TQT = {
     PyTango.ArgType.DevVarUShortArray  : 'QList',
 }
 
-class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
+class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
     """A generic Taurus component.
        
        .. note:: 
@@ -97,7 +103,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         self.modelName = ''
         self.noneValue = DefaultNoneValue
         self._designMode = designMode
-        self.call__init__(taurus.core.TaurusListener, name, parent)
+        self.call__init__(TaurusListener, name, parent)
         
         BaseConfigurableClass.__init__(self)
         
@@ -121,7 +127,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         if parent != None and hasattr(parent, "_exception_listener"):
             self._exception_listener = parent._exception_listener
         else:
-            self._exception_listener = set([taurus.core.TaurusExceptionListener()])
+            self._exception_listener = set([TaurusExceptionListener()])
         
         #register configurable properties
         self.registerConfigProperty(self.isModifiableByUser, self.setModifiableByUser, "modifiableByUser")
@@ -155,7 +161,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
             import taurus
             manager = taurus.Manager()
         
-        :return: (taurus.core.TaurusManager) the TaurusManager
+        :return: (taurus.core.taurusmanager.TaurusManager) the TaurusManager
         """
         return taurus.Manager()
     
@@ -168,7 +174,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         
         :param scheme: (str or None) the scheme. None defaults to 'tango'.
         
-        :return: (taurus.core.TaurusFactory) the TaurusFactory
+        :return: (taurus.core.taurusfactory.TaurusFactory) the TaurusFactory
         """
         return taurus.Factory(scheme)
     
@@ -199,7 +205,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
 
     def getParentTaurusComponent(self):
         """ Returns a parent Taurus component or None if no parent 
-        :class:`taurus.core.TaurusBaseComponent` is found.
+        :class:`taurus.qt.qtgui.base.TaurusBaseComponent` is found.
         
         :raises: RuntimeError
         """
@@ -227,7 +233,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
             (i.e. reimplementing :meth:`handleEvent`)
             
         :param evt_src: (object) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
         :param evt_value: (object) event value
         """
         self.fireEvent(evt_src, evt_type, evt_value)
@@ -240,7 +246,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         or Qt threads, respectively
 
         :param evt_src: (object or None) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType or None) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
         :param evt_value: (object or None) event value
         """
         try: self.getSignaller().emit(Qt.SIGNAL('taurusEvent'),  evt_src, evt_type, evt_value)
@@ -251,7 +257,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         unless one of them returns None (in which case the event is discarded)
         
         :param evt_src: (object) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
         :param evt_value: (object) event value
         """
         r = evt_src, evt_type, evt_value
@@ -276,7 +282,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         Reimplement as necessary
         
         :param evt_src: (object or None) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType or None) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
         :param evt_value: (object or None) event value
         """
         pass
@@ -298,7 +304,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         value to be filtered as well. This can be done as in this example::
         
             TaurusBaseComponent.fireEvent( TaurusBaseComponent.getModelObj(),
-                                        taurus.core.TaurusEventType.Periodic,
+                                        taurus.core.taurusbasetypes.TaurusEventType.Periodic,
                                         TaurusBaseComponent.getModelObj().getValueObj())
         
         See also: insertEventFilter
@@ -447,7 +453,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         """Returns the parent model object or None if the component has no 
         parent or if the parent's model is None
             
-        :return: (taurus.core.TaurusModel or None) the parent taurus model object
+        :return: (taurus.core.taurusmodel.TaurusModel or None) the parent taurus model object
         """
         try:
             p = self.getParentTaurusComponent()
@@ -461,19 +467,19 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         """Returns the taurus model obj associated with this component or None if 
         no taurus model is associated.
             
-        :return: (taurus.core.TaurusModel or None) the taurus model object
+        :return: (taurus.core.taurusmodel.TaurusModel or None) the taurus model object
         """
         return self.modelObj
 
     def getModelType(self):
         """Returns the taurus model type associated with this component or 
-        taurus.core.TaurusElementType.Unknown if no taurus model is associated.
+        taurus.core.taurusbasetypes.TaurusElementType.Unknown if no taurus model is associated.
             
-        :return: (taurus.core.TaurusElementType) the taurus model type
+        :return: (taurus.core.taurusbasetypes.TaurusElementType) the taurus model type
         """
         model_obj = self.getModelObj()
         if model_obj is None:
-            return taurus.core.TaurusElementType.Unknown
+            return TaurusElementType.Unknown
         return model_obj.getTaurusElementType()
 
     def getModelValueObj(self,cache=True):
@@ -677,7 +683,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
                 self.changeLogName(new_log_name)
             self.modelObj = None
             self._attached = False
-            self.fireEvent(m, taurus.core.TaurusEventType.Change, None)
+            self.fireEvent(m, TaurusEventType.Change, None)
 
         self.postDetach()
 
@@ -721,7 +727,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         Use :meth:`TaurusBaseWidget.safeApplyOperation` if you want to warn the
         user before applying
         
-        :param ops: (sequence<taurus.core.TaurusOperation> or None) list of operations to apply. 
+        :param ops: (sequence<taurus.core.taurusoperation.TaurusOperation> or None) list of operations to apply. 
                     If None is given (default) the component fetches the pending operations
         """
         self.debug("Apply changes")
@@ -747,7 +753,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
     def getPendingOperations(self):
         """Returns the sequence of pending operations
         
-        :return:  (sequence<taurus.core.TaurusOperation>) a list of pending operations
+        :return:  (sequence<taurus.core.taurusoperation.TaurusOperation>) a list of pending operations
         """
         return self._operations
     
@@ -835,8 +841,8 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         self._localModelName = model
         
 #        # if in offline mode don't bother trying to register
-#        opMode = taurus.core.TaurusManager().getOperationMode()
-#        if opMode == taurus.core.OperationMode.OFFLINE:
+#        opMode = taurus.core.taurusmanager.TaurusManager().getOperationMode()
+#        if opMode == taurus.core.taurusbasetypes.OperationMode.OFFLINE:
 #            return
 
         parent_widget = None
@@ -852,7 +858,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
             if self.getUseParentModel():
                 parent_widget = self.getParentTaurusComponent()
         self.setModelName(model, parent_widget)
-        #self.fireEvent(self.getModelObj(), taurus.core.TaurusEventType.Change, self.getModelValueObj())
+        #self.fireEvent(self.getModelObj(), taurus.core.taurusbasetypes.TaurusEventType.Change, self.getModelValueObj())
     
     def resetModel(self):
         """Sets the model name to the empty string"""
@@ -913,7 +919,7 @@ class TaurusBaseComponent(taurus.core.TaurusListener, BaseConfigurableClass):
         if showText == self._showText:
             return
         self._showText = showText
-        self.fireEvent(self.getModelObj(),taurus.core.TaurusEventType.Change, self.getModelValueObj())
+        self.fireEvent(self.getModelObj(), TaurusEventType.Change, self.getModelValueObj())
         self.updateStyle()
 
     def getShowText(self):
@@ -1147,19 +1153,19 @@ class TaurusBaseWidget(TaurusBaseComponent):
         Override when necessary.
         
         :param evt_src: (object or None) object that triggered the event
-        :param evt_type: (taurus.core.TaurusEventType or None) type of event
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
         :param evt_value: (object or None) event value
         """
         #Update the text shown by the widget
         if self._setText:
             text = ''
             if self.getShowText():
-                if isinstance(evt_src, taurus.core.TaurusAttribute):
-                    if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+                if isinstance(evt_src, TaurusAttribute):
+                    if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
                         text = self.displayValue(evt_value.value)
-                    elif evt_type == taurus.core.TaurusEventType.Error:
+                    elif evt_type == TaurusEventType.Error:
                         text = self.getNoneValue()
-                    elif evt_type == taurus.core.TaurusEventType.Config:
+                    elif evt_type == TaurusEventType.Config:
                         text = self.getDisplayValue() 
                 else:
                     text = self.getDisplayValue()
@@ -1316,9 +1322,9 @@ class TaurusBaseWidget(TaurusBaseComponent):
             modelclass = self.getModelClass()
         except:
             return []
-        if modelclass == taurus.core.TaurusDevice:
+        if modelclass == TaurusDevice:
             return [TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE]
-        elif modelclass == taurus.core.TaurusAttribute:
+        elif modelclass == TaurusAttribute:
             return [TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE]
         else:
             return [TAURUS_MODEL_MIME_TYPE]
@@ -1400,9 +1406,9 @@ class TaurusBaseWidget(TaurusBaseComponent):
             modelclass = self.getModelClass()
         except:
             modelclass = None 
-        if issubclass(modelclass, taurus.core.TaurusDevice):
+        if issubclass(modelclass, TaurusDevice):
             mimeData.setData(TAURUS_DEV_MIME_TYPE, modelname)
-        elif issubclass(modelclass, taurus.core.TaurusAttribute):
+        elif issubclass(modelclass, TaurusAttribute):
             mimeData.setData(TAURUS_ATTR_MIME_TYPE, modelname)
         return mimeData        
     
@@ -1463,7 +1469,7 @@ class TaurusBaseWidget(TaurusBaseComponent):
     def safeApplyOperations(self, ops = None):
         """Applies the given operations (or the pending operations if None passed)
         
-        :param ops: (sequence<taurus.core.TaurusOperation> or None) list of operations to apply. 
+        :param ops: (sequence<taurus.core.taurusoperation.TaurusOperation> or None) list of operations to apply. 
                     If None is given (default) the component fetches the pending operations
         """
         
@@ -1557,7 +1563,7 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     
     def getModelClass(self):
-        return taurus.core.TaurusAttribute
+        return TaurusAttribute
 
     def isReadOnly(self):
         return False
@@ -1613,8 +1619,8 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
         that pending operations are properly created, not calling this method'''
         try:
             v = self.getValue()
-            op = taurus.core.WriteAttrOperation(self.getModelObj(), v, 
-                                            self.getOperationCallbacks())
+            op = WriteAttrOperation(self.getModelObj(), v, 
+                                    self.getOperationCallbacks())
             op.setDangerMessage(self.getDangerMessage())
             self.safeApplyOperations([op])
             self.info('Force-Applied value = %s'%str(v))
@@ -1623,7 +1629,7 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
             self.traceback()
         
     def handleEvent(self, src, evt_type, evt_value):
-        if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+        if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
             self.emitValueChanged()
     
     def postAttach(self):
@@ -1657,8 +1663,8 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
             if model.areStrValuesEqual(model_value, wigdet_value):
                 self._operations = []
             else:
-                operation = taurus.core.WriteAttrOperation(model, wigdet_value, 
-                                                            self.getOperationCallbacks())
+                operation = WriteAttrOperation(model, wigdet_value, 
+                                               self.getOperationCallbacks())
                 operation.setDangerMessage(self.getDangerMessage())
                 self._operations = [operation]
         except:
@@ -1690,15 +1696,15 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
         if isinstance(v, Qt.QIntValidator):
             bottom = evt_value.min_value
             top = evt_value.max_value
-            bottom = int(bottom) if bottom != taurus.core.TaurusConfiguration.no_min_value else -sys.maxint
-            top = int(top) if top != taurus.core.TaurusConfiguration.no_max_value else sys.maxint
+            bottom = int(bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint
+            top = int(top) if top != TaurusConfiguration.no_max_value else sys.maxint
             v.setRange(bottom, top)
             self.debug("Validator range set to %i-%i"%(bottom,top))
         elif isinstance(v, Qt.QDoubleValidator):
             bottom = evt_value.min_value
             top = evt_value.max_value
-            bottom = float(bottom) if bottom != taurus.core.TaurusConfiguration.no_min_value else -float("inf") 
-            top = float(top) if top != taurus.core.TaurusConfiguration.no_max_value else float("inf")
+            bottom = float(bottom) if bottom != TaurusConfiguration.no_min_value else -float("inf") 
+            top = float(top) if top != TaurusConfiguration.no_max_value else float("inf")
             v.setBottom(bottom)
             v.setTop(top)
             self.debug("Validator range set to %f-%f"%(bottom,top))
diff --git a/lib/taurus/qt/qtgui/base/tauruscontroller.py b/lib/taurus/qt/qtgui/base/tauruscontroller.py
index 7807d1f..7d5316d 100644
--- a/lib/taurus/qt/qtgui/base/tauruscontroller.py
+++ b/lib/taurus/qt/qtgui/base/tauruscontroller.py
@@ -37,7 +37,7 @@ import weakref
 
 from taurus.qt import Qt
 
-from taurus.core import DataFormat, TaurusEventType
+from taurus.core.taurusbasetypes import DataFormat, TaurusEventType
 
 from taurus.qt.qtgui.util import QT_ATTRIBUTE_QUALITY_PALETTE
 from taurus.qt.qtgui.util import QT_DEVICE_STATE_PALETTE
@@ -105,17 +105,18 @@ class TaurusBaseController(object):
         return self.widget().getDisplayValue()
     
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_type == TaurusEventType.Change or evt_type == TaurusEventType.Periodic:
-            self._last_value = evt_value
-        elif evt_type == TaurusEventType.Config:
-            self._last_config_value = evt_value
-        else:
-            self._last_error_value = evt_value
-            #In case of error, modify the last_value as well
-            try:
-                self._last_value = self.modelObj().getValueObj()
-            except:
-                pass
+        if evt_src == self.modelObj(): #update the "_last" values only if the event source is the model (it could be the background...) 
+            if evt_type == TaurusEventType.Change or evt_type == TaurusEventType.Periodic:
+                self._last_value = evt_value
+            elif evt_type == TaurusEventType.Config:
+                self._last_config_value = evt_value
+            else:
+                self._last_error_value = evt_value
+                #In case of error, modify the last_value as well
+                try:
+                    self._last_value = self.modelObj().getValueObj()
+                except:
+                    pass
         self.update()
 
     def eventReceived(self, evt_src, evt_type, evt_value):
diff --git a/lib/taurus/qt/qtgui/base/taurusqattribute.py b/lib/taurus/qt/qtgui/base/taurusqattribute.py
index f94d5f3..6b839a2 100644
--- a/lib/taurus/qt/qtgui/base/taurusqattribute.py
+++ b/lib/taurus/qt/qtgui/base/taurusqattribute.py
@@ -30,10 +30,10 @@ import weakref
 import re
 import PyTango
 
-import taurus.core
+from taurus.core.taurusvalidator import AttributeNameValidator
 from taurus.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseComponent
-from taurus.core.util import SafeEvaluator
+from taurus.core.util.safeeval import SafeEvaluator
 
 class TaurusQAttributeFactory(object): #@this probably needs to be ported to a proper TaurusFactory
     '''A factory for TaurusQAttributes that ensures that only one 
@@ -58,7 +58,7 @@ class TaurusQAttributeFactory(object): #@this probably needs to be ported to a p
     
     
 taurusQAttributeFactory = TaurusQAttributeFactory()
-ATTRNAMEVALIDATOR = taurus.core.AttributeNameValidator()
+ATTRNAMEVALIDATOR = AttributeNameValidator()
 
 class TaurusQAttribute(Qt.QObject, TaurusBaseComponent):
     '''A listener for taurus attributes.
diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py
index 0343c03..6b49e56 100644
--- a/lib/taurus/qt/qtgui/button/taurusbutton.py
+++ b/lib/taurus/qt/qtgui/button/taurusbutton.py
@@ -33,10 +33,11 @@ __docformat__ = 'restructuredtext'
 import PyTango
 
 from taurus.qt import Qt
-from taurus.core import TaurusDevice, LockStatus, TaurusLockInfo
+from taurus.core.taurusbasetypes import LockStatus, TaurusLockInfo
+from taurus.core.taurusdevice import TaurusDevice
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.core.util import eventfilters
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
 from taurus.qt.qtgui.resource import getIcon
 from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
 
@@ -340,7 +341,7 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
                            passed, the currently set parameters are used.
         :param command: (str) the command name. If None is passed, the currently
                         set command is used.
-        :param dev: (taurus.core.TaurusDevice) the device on which the command is
+        :param dev: (taurus.core.taurusdevice.TaurusDevice) the device on which the command is
                     executed. If None is passed, the current model is used.
         
         :return: (sequence or scalar) a sequence of parameters (or a scalar if only one parameter)
diff --git a/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py b/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
index a3308bd..f10edbd 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
@@ -30,7 +30,7 @@ __docformat__ = 'restructuredtext'
 import weakref
 
 from taurus import Device
-from taurus.core.util import Enumeration 
+from taurus.core.util.enumeration import Enumeration 
 from taurus.qt import Qt
 
 from IPython.config.loader import Config
diff --git a/lib/taurus/qt/qtgui/console/taurusconsolefactory.py b/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
index 4f8c635..38b427c 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
@@ -33,7 +33,7 @@ __all__ = ["TaurusConsoleFactory"]
 
 __docformat__ = 'restructuredtext'
 
-from taurus.core.util import Singleton
+from taurus.core.util.singleton import Singleton
 from taurus.qt import Qt
 
 from taurusconsolewidget import TaurusConsoleWidget
diff --git a/lib/taurus/qt/qtgui/container/qcontainer.py b/lib/taurus/qt/qtgui/container/qcontainer.py
index 7298323..daee76d 100644
--- a/lib/taurus/qt/qtgui/container/qcontainer.py
+++ b/lib/taurus/qt/qtgui/container/qcontainer.py
@@ -29,8 +29,8 @@ __all__ = ["QGroupWidget"]
 
 __docformat__ = 'restructuredtext'
 
-import copy
 import sys
+import json
 
 from taurus.qt import Qt
 from taurus.qt.qtgui.resource import getThemePixmap, getThemeIcon, getStandardIcon
@@ -61,7 +61,7 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
 
 _TitleLabelStyle = """.QLabel {{ color : {font_color}; }}"""
 
-_ContentBarStyleWithTitle = """.QFrame {{
+_ContentBarStyleWithTitle = """ContentFrame {{
 border-top-width: 0px;
 border-left-width: 1px;
 border-right-width: 1px;
@@ -79,7 +79,7 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0,
 */
 }}"""
 
-_ContentBarStyleWithoutTitle = """.QFrame {{
+_ContentBarStyleWithoutTitle = """ContentFrame {{
 border-width: 1px;
 border-style: solid;
 border-color: {border_color};
@@ -94,6 +94,10 @@ background-color: qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0,
 */
 }}"""
 
+# Empty content QFrame to avoid frame style to be propagated
+# to child QFrame widgets
+class ContentFrame(Qt.QFrame):
+    pass
 
 class QGroupWidget(Qt.QWidget):
     """An expandable/collapsible composite widget"""
@@ -104,7 +108,7 @@ class QGroupWidget(Qt.QWidget):
         'start_color'  : 'rgb(60, 150, 255)',
         'stop_color'   : 'rgb(0, 65, 200)',
         'font_color'   : 'white',
-        'border_radius': '4px',
+        'border_radius': '5px',
     }
 
     DefaultContentVisible = True
@@ -112,7 +116,7 @@ class QGroupWidget(Qt.QWidget):
         'start_color' : 'rgb(224, 224, 224)',
         'stop_color'  : 'rgb(255, 255, 255)',
         'border_color' : 'rgb(0, 85, 227)',
-        'border_radius': '4px',
+        'border_radius': '5px',
     }
 
     def __init__(self, parent=None, designMode=False):
@@ -126,7 +130,7 @@ class QGroupWidget(Qt.QWidget):
         self.resetContentVisible()
         self.resetTitleHeight()
         self.resetTitleVisible()
-        
+    
     def __init(self):
         panelLayout = Qt.QVBoxLayout()
         panelLayout.setSpacing(0)
@@ -156,7 +160,10 @@ class QGroupWidget(Qt.QWidget):
         l.addWidget(self._titleLabel, 1)
         l.addWidget(self._upDownButton, 0)
         
-        self._content = content = Qt.QFrame()
+        self._content = content = ContentFrame()
+        l = Qt.QHBoxLayout()
+        l.setContentsMargins(0, 0, 0, 0)
+        content.setLayout(l)
         panelLayout.addWidget(content, 1)
     
     def _updateStyle(self):
@@ -186,11 +193,6 @@ class QGroupWidget(Qt.QWidget):
                  'icon'      : ":/designer/groupwidget.png",
                  'container' : True }
         
-        ret = TaurusBaseContainer.getQtDesignerPluginInfo()
-        ret['icon'] = ":/designer/groupwidget.png"
-        ret['container'] = cls is QGroupWidget
-        return ret
-        
     def content(self):
         """Returns the contents widget
         
@@ -332,6 +334,28 @@ class QGroupWidget(Qt.QWidget):
         """Resets this widget's title style"""
         self.setTitleStyle({})
 
+    def getTitleStyleStr(self):
+        """Returns this widget's title style
+        
+        :return: (dict) this widget's title style"""
+        return json.dumps(self._titleBarStyle)
+
+    def setTitleStyleStr(self, style_map):
+        """Sets this widget's title style
+        Used key/values for style_map:
+        - 'start_color'  : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+        - 'stop_color'   : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+        - 'font_color'   : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+        - 'border_radius': radius (Ex.: '5px', '5px,2px')
+            
+        :param style_map: (dict) the new widget title style"""
+        style_map = json.loads(str(style_map))
+        self.setTitleStyle(style_map)
+
+    def resetTitleStyleStr(self):
+        """Resets this widget's title style"""
+        self.resetTitleStyle()
+
     def getContentStyle(self):
         """Returns this widget's content style
         
@@ -353,6 +377,27 @@ class QGroupWidget(Qt.QWidget):
     def resetContentStyle(self):
         """Resets this widget's content style"""
         self.setContentStyle({})
+
+    def getContentStyleStr(self):
+        """Returns this widget's content style
+        
+        :return: (dict) this widget's content style"""
+        return json.dumps(self._contentStyle)
+
+    def setContentStyleStr(self, style_map):
+        """Sets this widget's content style
+        Used key/values for style_map:
+        - 'start_color'  : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+        - 'stop_color'   : brush (Ex.: '#E0E0E0', 'rgb(0,0,0)', 'white')
+        
+        :param style_map: (dict) the new widget content style"""
+        style_map = json.loads(str(style_map))
+        self.setContentStyle(style_map)
+        
+    def resetContentStyleStr(self):
+        """Resets this widget's content style"""
+        self.resetContentStyle()
+
         
     #: This property contains the widget's title
     #:
@@ -387,15 +432,6 @@ class QGroupWidget(Qt.QWidget):
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleVisible`
     titleVisible = Qt.pyqtProperty("bool", isTitleVisible, setTitleVisible)
 
-    ##: This property contains the widget's title style
-    ##:
-    ##: **Access functions:**
-    ##:
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.getTitleStyle`
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleStyle`
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetTitleStyle`
-    #titleStyle = Qt.pyqtProperty("QMap", getTitleStyle, setTitleStyle, resetTitleStyle)
-
     #: This property contains the widget's content's visibility
     #:
     #: **Access functions:**
@@ -406,14 +442,26 @@ class QGroupWidget(Qt.QWidget):
     contentVisible = Qt.pyqtProperty("bool", isContentVisible, setContentVisible, resetContentVisible)
    
     ##: This property contains the widget's content style
-    ##:
+    ##: The style must be a json dictionary
+    ##: 
     ##: **Access functions:**
     ##:
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.getContentStyle`
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setContentStyle`
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetContentStyle`
-    #contentStyle = Qt.pyqtProperty("QMap", getContentStyle, setContentStyle, resetContentStyle)
+    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.getContentStyleStr`
+    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setContentStyleStr`
+    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetContentStyleStr`
+    contentStyle = Qt.pyqtProperty("QString", getContentStyleStr, setContentStyleStr,
+                                   resetContentStyleStr, doc="The style must be a json dictionary")
 
+    ##: This property contains the widget's title style
+    ##: The style must be a json dictionary
+    ##: 
+    ##: **Access functions:**
+    ##:
+    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.getTitleStyleStr`
+    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleStyleStr`
+    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetTitleStyleStr`
+    titleStyle = Qt.pyqtProperty("QString", getTitleStyleStr, setTitleStyleStr,
+                                 resetTitleStyleStr, doc="The style must be a json dictionary")
 
 def demo():
     "QGroup Widget"
diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py
index bf0df7d..02f5558 100644
--- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py
+++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py
@@ -97,7 +97,7 @@ class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer):
     def setPrefixText(self,prefix):
         self._prefix = prefix
         import taurus.core
-        self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
 
     def getSuffixText(self):
         return self._suffix
@@ -106,7 +106,7 @@ class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer):
     def setSuffixText(self,suffix):
         self._suffix = suffix
         import taurus.core
-        self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py
index dfec696..69bf285 100644
--- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py
+++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py
@@ -679,9 +679,9 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         :param fname: (str) name of output file. If None given, a file dialog will be shown.
         '''
         if fname is None:
-            fname = Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', 
-                                                   '', "Ini files (*.ini);;All files (*)")
-            if fname.isNull():
+            fname = unicode(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', 
+                                                   '', "Ini files (*.ini);;All files (*)"))
+            if not fname:
                 return
         self.saveSettings()
         ok = Qt.QFile.copy(self.getQSettings().fileName(), fname)
@@ -699,9 +699,9 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         :param fname: (str) name of ini file. If None given, a file dialog will be shown.
         '''
         if fname is None:
-            fname = Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file',
-                                                   '', "Ini files (*.ini);;All files (*)")
-            if fname.isNull():
+            fname = unicode(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file',
+                                                   '', "Ini files (*.ini);;All files (*)"))
+            if not fname:
                 return
         s = Qt.QSettings(fname, Qt.QSettings.IniFormat)
         #clone the perspectives found in the "factory" settings
@@ -813,15 +813,15 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         return self.__helpManualURI
     
     def resetHelpManualURI(self):
-        from taurus.core import Release
-        uri = getattr(self, 'MANUAL_URI',Release.url)
+        from taurus.core import release
+        uri = getattr(self, 'MANUAL_URI', release.url)
         self.setHelpManualURI(uri)
     
     def showHelpAbout(self):
         appname = unicode(Qt.qApp.applicationName())
         appversion = unicode(Qt.qApp.applicationVersion())
-        from taurus.core import Release
-        abouttext = "%s %s\n\nUsing %s %s"%(appname, appversion, Release.name, Release.version)
+        from taurus.core import release
+        abouttext = "%s %s\n\nUsing %s %s"%(appname, appversion, release.name, release.version)
         Qt.QMessageBox.about(self, 'About', abouttext)
             
     def onShowManual(self, anchor=None):
@@ -841,7 +841,7 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         it means that this application is not the only one
         '''
         if key is None:
-            from taurus.core.util import getSystemUserName
+            from taurus.core.util.user import getSystemUserName
             username = getSystemUserName()
             appname = unicode(Qt.QApplication.applicationName())
             key = "__socket_%s-%s__"%(username,appname)
diff --git a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
index 34fd64e..f6eace6 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
@@ -70,13 +70,11 @@ def get_input(input_data, parent=None, input_panel_klass=None):
           allow more than one value to be selected (makes sence when data_type
           is a sequence of possibilities)
 
-    :param input_data:
-        a dictionary with information on how to build the input dialog
+    :param input_data: a dictionary with information on how to build the input dialog
     :type input_data: :py:obj:`dict`
     :param parent: parent widget
     :type parent: PyQt4.QtGui.QWidget
-    :param input_panel_klass:
-        python class to be used as input panel [default: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`]
+    :param input_panel_klass: python class to be used as input panel [default: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`]
     :type input_panel_klass: :class:`~taurus.qt.qtgui.panel.TaurusInputPanel`
                         
     :return: a tuple containing value selected and boolean which is true if
@@ -101,11 +99,12 @@ def get_input(input_data, parent=None, input_panel_klass=None):
         d7 = dict(prompt="Do you like bears?",
                   data_type='Boolean', key="Yes/No", default_value=True)
         d8 = dict(prompt="Please write your memo",
-                  data_type='Text', key="Memo", default_value="By default a memo is\na long thing")
-
+                  data_type='Text', key="Memo", default_value="By default a memo is a long thing")
         for d in [d1, d2, d3, d4, d5, d6, d7, d8]:
-            get_input(input_data=d, title=d['prompt'])    
+            get_input(input_data=d, title=d['prompt'])
+           
     """
+            
     if input_panel_klass is None:
         from taurus.qt.qtgui.panel import TaurusInputPanel
         input_panel_klass = TaurusInputPanel
diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
index b2c20b1..b90c37f 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
@@ -33,9 +33,12 @@ __docformat__ = 'restructuredtext'
 import sys
 
 from taurus.qt import Qt
+
 from taurus.core.util.excepthook import BaseExceptHook
+from taurus.core.util.log import LogExceptHook
 from taurus.core.util.wrap import wraps
 
+
 class TaurusMessageBox(Qt.QDialog):
     """A panel intended to display a taurus error.
     Example::
@@ -264,7 +267,7 @@ class TaurusExceptHookMessageBox(BaseExceptHook):
         app = Qt.QApplication.instance()
         if app is None:
             import taurus.core.util
-            taurus.core.util.LogExceptHook().report(*exc_info)
+            LogExceptHook().report(*exc_info)
             return
         msgbox = self._getMessageBox(*exc_info)
         if msgbox is None:
diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py
index f0c8c05..0190b30 100644
--- a/lib/taurus/qt/qtgui/display/qled.py
+++ b/lib/taurus/qt/qtgui/display/qled.py
@@ -32,18 +32,16 @@ __docformat__ = 'restructuredtext'
 import sys
 
 from taurus.qt import Qt
-import taurus.core.util
-import taurus.qt.qtgui.resource
-import qpixmapwidget
+from taurus.core.util.enumeration import Enumeration
+from taurus.qt.qtgui.resource import getPixmap
+from .qpixmapwidget import QPixmapWidget
 
-getPixmap = taurus.qt.qtgui.resource.getPixmap
-
-LedColor  = taurus.core.util.Enumeration("LedColor",  ["BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "MAGENTA", "GRENOBLE", "BLACK", "WHITE"])
-LedStatus = taurus.core.util.Enumeration("LedStatus", ["ON", "OFF"])
-LedSize   = taurus.core.util.Enumeration("LedSize",   [("SMALL", 24), ("LARGE", 48)])
+LedColor  = Enumeration("LedColor",  ["BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "MAGENTA", "GRENOBLE", "BLACK", "WHITE"])
+LedStatus = Enumeration("LedStatus", ["ON", "OFF"])
+LedSize   = Enumeration("LedSize",   [("SMALL", 24), ("LARGE", 48)])
 
     
-class QLed(qpixmapwidget.QPixmapWidget):
+class QLed(QPixmapWidget):
     """A Led"""
     
     DefaultLedPattern = ":leds/images256/led_{color}_{status}.png"
@@ -59,13 +57,13 @@ class QLed(qpixmapwidget.QPixmapWidget):
         self._ledInverted = self.DefaultLedInverted
         self._ledName = self.toLedName()
         self._timer = None
-        qpixmapwidget.QPixmapWidget.__init__(self, parent)
+        QPixmapWidget.__init__(self, parent)
         self._refresh()
     
     def sizeHint(self):
         if self.layout() is None:
             return Qt.QSize(24, 24)
-        return qpixmapwidget.QPixmapWidget.sizeHint(self)
+        return QPixmapWidget.sizeHint(self)
     
     def minimumSizeHint(self):
         """Overwrite the default minimum size hint (0,0) to be (16,16)
diff --git a/lib/taurus/qt/qtgui/display/taurusboolled.py b/lib/taurus/qt/qtgui/display/taurusboolled.py
index 3d3b350..944109d 100644
--- a/lib/taurus/qt/qtgui/display/taurusboolled.py
+++ b/lib/taurus/qt/qtgui/display/taurusboolled.py
@@ -74,7 +74,7 @@ class TaurusBoolLed(QLed, TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def isReadOnly(self):
         return True
@@ -188,7 +188,7 @@ class TaurusBoolLed(QLed, TaurusBaseWidget):
     def handleEvent(self, evt_src, evt_type, evt_value):
         if evt_value is None:
             return
-        if evt_type == taurus.core.TaurusEventType.Error:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
             self._setProblemsBackground(True)
             self.updateStyle()
             return
diff --git a/lib/taurus/qt/qtgui/display/taurusconfiglabel.py b/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
index dd728c3..0fcfc5b 100644
--- a/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
+++ b/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
@@ -94,7 +94,7 @@ class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     
     def getModelClass(self):
-        return taurus.core.TaurusConfiguration
+        return taurus.core.taurusconfiguration.TaurusConfiguration
 
     def getDisplayValue(self):
         cfg_value = self.getConfigurationAttributeValue()
@@ -152,7 +152,7 @@ class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
     @Qt.pyqtSignature("setPrefixText(QString)")
     def setPrefixText(self,prefix):
         self._prefix = prefix
-        self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
 
     def resetPrefixText(self):
         self.setPrefixText('')
@@ -163,7 +163,7 @@ class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
     @Qt.pyqtSignature("setSuffixText(QString)")
     def setSuffixText(self,suffix):
         self._suffix = suffix
-        self.fireEvent(evt_type = taurus.core.TaurusEventType.Change)
+        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
     
     def resetSuffixText(self):
         self.setSuffixText('')
diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py
index 7602f85..365a78a 100644
--- a/lib/taurus/qt/qtgui/display/tauruslabel.py
+++ b/lib/taurus/qt/qtgui/display/tauruslabel.py
@@ -34,7 +34,7 @@ import operator
 # shame of me for importing PyTango!
 import PyTango
 
-from taurus.core import TaurusElementType, TaurusEventType
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType
 from taurus.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtgui.base import TaurusBaseController
diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py
index 491fdee..3f6e90d 100644
--- a/lib/taurus/qt/qtgui/display/tauruslcd.py
+++ b/lib/taurus/qt/qtgui/display/tauruslcd.py
@@ -34,7 +34,7 @@ import operator
 # shame of me for importing PyTango!
 import PyTango
 
-from taurus.core import TaurusElementType, TaurusEventType
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType
 from taurus.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtgui.base import TaurusBaseController
diff --git a/lib/taurus/qt/qtgui/display/tauruslcdvalue.py b/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
index e674b34..44caa62 100644
--- a/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
+++ b/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
@@ -74,7 +74,7 @@ class TaurusLCDValue(Qt.QLCDNumber, TaurusBaseWidget):
     
     def getModelClass(self):
         import taurus.core
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
         
     def isReadOnly(self):
         return True
diff --git a/lib/taurus/qt/qtgui/display/taurusstateled.py b/lib/taurus/qt/qtgui/display/taurusstateled.py
index 604c9a7..7d46f25 100644
--- a/lib/taurus/qt/qtgui/display/taurusstateled.py
+++ b/lib/taurus/qt/qtgui/display/taurusstateled.py
@@ -33,7 +33,7 @@ __docformat__ = 'restructuredtext'
 # ugly
 import PyTango
 
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
 from taurus.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from qled import LedStatus, LedColor
@@ -83,7 +83,7 @@ class TaurusStateLed(QLed, TaurusBaseWidget):
 
     def getModelClass(self):
         import taurus.core
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def isReadOnly(self):
         return True
diff --git a/lib/taurus/qt/qtgui/display/taurusvaluelabel.py b/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
index b37f68b..5bf8ef2 100644
--- a/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
+++ b/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
@@ -168,7 +168,7 @@ class TaurusValueLabel(Qt.QLabel, TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     
     def getModelClass(self):
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def isReadOnly(self):
         return True
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
index 8155726..e84ecba 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
@@ -33,7 +33,7 @@ import taurus
 from guiqwt.curve import CurveItem
 from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam, TaurusTrendParam
 
-from taurus.core.util import ArrayBuffer
+from taurus.core.util.containers import ArrayBuffer
 import numpy
 
         
@@ -168,7 +168,7 @@ class TaurusTrendItem(CurveItem, TaurusBaseComponent):
         #... and fire a fake event for initialization
         try:
             value = self.getModelObj().read()
-            self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
index cb54333..e2b444d 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
@@ -31,16 +31,15 @@ __all__=['TaurusCurveItemTableModel','CurveItemConf', 'CurveItemConfDlg']
 
 import copy
 
-from taurus.qt import Qt,Qwt5
+from taurus.qt import Qt, Qwt5
+from guiqwt.styles import CurveParam, AxesParam, update_style_attr
+from guiqwt.builder import make
+
 import taurus
-from taurus.core import TaurusException
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
 from taurus.qt.qtgui.resource import getThemeIcon, getIcon
-from ui.ui_CurveItemConfDlg import Ui_CurveItemConfDlg    
-from guiqwt.styles import CurveParam, AxesParam, update_style_attr
+from .ui.ui_CurveItemConfDlg import Ui_CurveItemConfDlg    
 from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam
-from guiqwt.builder import make
-
 
 AXIS_ID2NAME = {Qwt5.QwtPlot.yLeft:'left', Qwt5.QwtPlot.yRight:'right',
                 Qwt5.QwtPlot.xBottom:'bottom', Qwt5.QwtPlot.xTop:'top'}
@@ -51,6 +50,7 @@ NUMCOLS = 3
 X, Y, TITLE = range(NUMCOLS)
 SRC_ROLE =  Qt.Qt.UserRole + 1
 
+
 class Component(object):
     def __init__(self, src):
         self.display = ''
@@ -314,8 +314,8 @@ class CurveItemConfDlg(Qt.QWidget):
             nexusWidget = TaurusNeXusBrowser()
             self.ui.tabWidget.addTab(nexusWidget,'NeXus')
         except:
-            import taurus.core.util
-            _logger = taurus.core.util.Logger('CurveItemConfDlg')
+            import taurus.core.util.log
+            _logger = taurus.core.util.log.Logger('CurveItemConfDlg')
             _logger.warning('TaurusNeXusBrowser not available')
             self.traceback()
         
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/image.py b/lib/taurus/qt/qtgui/extra_guiqwt/image.py
index cd18132..3f2c7ad 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/image.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/image.py
@@ -32,7 +32,7 @@ __all__=["TaurusImageItem","TaurusRGBImageItem","TaurusTrend2DItem",
 from taurus.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseComponent
 import taurus.core
-from taurus.core.util import ArrayBuffer
+from taurus.core.util.containers import ArrayBuffer
 
 from guiqwt.image import ImageItem, RGBImageItem, XYImageItem, INTERP_NEAREST, INTERP_LINEAR
 
@@ -56,7 +56,7 @@ class TaurusBaseImageItem(TaurusBaseComponent):
         #... and fire a fake event for initialization
         try:
             value = self.getModelObj().read()
-            self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
@@ -106,7 +106,7 @@ class TaurusEncodedImageItem(TaurusImageItem):
         #... and fire a fake event for initialization
         try:
             format,value = self.codec.decode(self.getModelObj().read())
-            self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
@@ -114,7 +114,7 @@ class TaurusEncodedImageItem(TaurusImageItem):
         '''reimplementation to decode data before passing it to 
            TaurusImageItem implementation'''
         if type(data) == tuple:
-            from taurus.core.util import CodecFactory
+            from taurus.core.util.codecs import CodecFactory
             codec = CodecFactory().getCodec(data[0])
             format,decoded_data = codec.decode(data)
             TaurusImageItem.set_data(self, decoded_data, lut_range=lut_range)
@@ -179,7 +179,7 @@ class TaurusTrend2DItem(XYImageItem, TaurusBaseComponent):
         #... and fire a fake event for initialization
         try:
             value = self.getModelObj().read()
-            self.fireEvent(self, taurus.core.TaurusEventType.Change, value)
+            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
index 10df1e9..b40ef50 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
@@ -35,7 +35,7 @@ from guiqwt.plot import ImageDialog, CurveDialog
 import taurus.core
 from taurus.qt import Qt
 
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
 from taurus.qt.qtgui.extra_guiqwt.builder import make
@@ -72,7 +72,7 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
   
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
     
     def _splitModel(self, modelNames):
         '''convert str to list if needed (commas and whitespace are considered as separators)'''
@@ -212,7 +212,7 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
         
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
     
     def getTaurusTrendItems(self):
         return [item for item in self.get_plot().get_public_items() if isinstance(item, TaurusTrendItem)]
@@ -439,7 +439,7 @@ class TaurusImageDialog(ImageDialog, TaurusBaseWidget):
     
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
         
     def setModel(self, model):
         '''reimplemented from :class:`TaurusBaseWidget`'''
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
index 0ce8b3c..1be1808 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
@@ -111,7 +111,7 @@ class TaurusTrend2DDialog(ImageDialog, TaurusBaseWidget):
     
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
         
     def setModel(self, model):
         '''reimplemented from :class:`TaurusBaseWidget`'''
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
index a6bb23b..1e6088b 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
@@ -34,15 +34,16 @@ from taurus.qt import Qt
 from guiqwt.tools import CommandTool, ToggleTool, DefaultToolbarID, QActionGroup, add_actions
 from guiqwt.signals import SIG_ITEMS_CHANGED
 
+from taurus.core.taurusbasetypes import TaurusElementType
 from taurus.qt.qtgui.resource import getIcon
 from taurus.qt.qtgui.extra_guiqwt.builder import make
 from taurus.qt.qtgui.extra_guiqwt.curve import TaurusCurveItem,TaurusTrendItem
 from taurus.qt.qtgui.extra_guiqwt.image import TaurusTrend2DItem
 from taurus.qt.qtgui.extra_guiqwt.curvesmodel import CurveItemConfDlg
 from taurus.qt.qtgui.panel import TaurusModelChooser
-from taurus.core import TaurusElementType
 from taurus.qt.qtgui.plot import DateTimeScaleEngine
 
+
 class TaurusCurveChooserTool(CommandTool):
     """
     A tool that shows the Taurus Model Chooser to create/edit the taurus curves of a plot
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/common.py b/lib/taurus/qt/qtgui/extra_macroexecutor/common.py
index 51fbcc2..18aac7c 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/common.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/common.py
@@ -27,7 +27,7 @@ import PyTango
 import taurus
 
 from taurus.qt.qtgui.base import TaurusBaseWidget
-from taurus.core import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
 from taurus.qt import Qt
 from taurus.qt.qtgui.input import TaurusAttrListComboBox
 from taurus.qt.qtgui.container import TaurusMainWindow
@@ -202,7 +202,7 @@ class TaurusMacroConfigurationDialog(Qt.QDialog):
     
     def onMacroServerComboBoxChanged(self, macroServerName):
         self.doorComboBox.setModel(macroServerName + "/doorList")
-        self.doorComboBox.fireEvent(self.doorComboBox, taurus.core.TaurusEventType.Change, self.doorComboBox.getModelValueObj())#fake event
+        self.doorComboBox.fireEvent(self.doorComboBox, taurus.core.taurusbasetypes.TaurusEventType.Change, self.doorComboBox.getModelValueObj())#fake event
         
     def onMacroServerNameChanged(self, macroServerName):
         self.__selectMacroServer(macroServerName)
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py b/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py
index 42955da..a3b0aca 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/dooroutput.py
@@ -187,8 +187,8 @@ class DoorAttrListener(Qt.QObject):
         self.attrObj.addListener(self)
 
     def eventReceived(self, src, type, value):
-        if (type == taurus.core.TaurusEventType.Error or
-            type == taurus.core.TaurusEventType.Config):
+        if (type == taurus.core.taurusbasetypes.TaurusEventType.Error or
+            type == taurus.core.taurusbasetypes.TaurusEventType.Config):
             return
         self.emit(Qt.SIGNAL('door%sChanged' % self.attrName), value.value)
         
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py b/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py
index 1219cdc..fc45642 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/favouriteseditor/model.py
@@ -28,7 +28,7 @@ model.py:
 """
 
 from taurus.qt import Qt
-from taurus.core.util import etree
+from lxml import etree
 
 from taurus.core.tango.sardana import macro
         
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py b/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py
index bd7646c..5736955 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/globals.py
@@ -98,6 +98,7 @@ ALLOWS_HOOKS_FILTER = 'allowsHooks'
 
 PARAM_REPEAT           = "ParamRepeat"
 
+PARAM_OBJECT                = "Object"
 PARAM_MOTOR                 = "Moveable"
 PARAM_CONTROLLER_CLASS      = "ControllerClass"
 PARAM_CONTROLLER            = "Controller"
@@ -106,7 +107,11 @@ PARAM_MEASUREMENT_GROUP     = "MeasurementGroup"
 PARAM_IO_REGISTER           = "IORegister"
 PARAM_COMMUNICATION_CHANNEL = "ComChannel"
 PARAM_EXPERIMENTAL_CHANNEL  = "ExpChannel"
-PARAM_MACRO                 = "Macro"
+PARAM_MACRO_CODE            = "MacroCode"
+PARAM_MACRO_CLASS           = "MacroClass"
+PARAM_MACRO_FUNCTION        = "MacroFunction"
+PARAM_MACRO_LIBRARY         = "MacroLibrary"
+
 
 PARAM_STRING                = "String"
 
@@ -127,7 +132,8 @@ PARAM_BOOLEAN               = "Boolean"
 MAX_REPEATS =   "max"
 MIN_REPEATS =   "min"   
 
-EDITOR_COMBOBOX_PARAMS = [PARAM_MOTOR,
+EDITOR_COMBOBOX_PARAMS = [PARAM_OBJECT,
+                          PARAM_MOTOR,
                           PARAM_CONTROLLER_CLASS,
                           PARAM_CONTROLLER,
                           PARAM_MOTOR_PARAM, 
@@ -135,7 +141,10 @@ EDITOR_COMBOBOX_PARAMS = [PARAM_MOTOR,
                           PARAM_IO_REGISTER, 
                           PARAM_COMMUNICATION_CHANNEL, 
                           PARAM_EXPERIMENTAL_CHANNEL, 
-                          PARAM_MACRO]
+                          PARAM_MACRO_CODE,
+                          PARAM_MACRO_CLASS,
+                          PARAM_MACRO_FUNCTION,
+                          PARAM_MACRO_LIBRARY]
 
 EDITOR_LINEEDIT_PARAMS = [PARAM_STRING, 
                           PARAM_FILENAME, 
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py
index d41d916..3ca8e8c 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macrobutton.py
@@ -35,7 +35,7 @@ from taurus.qt import Qt
 import taurus
 from taurus.qt.qtgui.container import TaurusWidget
 from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
-from taurus.core.util import DEVICE_STATE_PALETTE
+from taurus.core.util.colors import DEVICE_STATE_PALETTE
 
 import functools
 
@@ -46,7 +46,7 @@ class DoorStateListener(Qt.QObject):
     __pyqtSignals__ = ["doorStateChanged"]
 
     def eventReceived(self, evt_src, evt_type, evt_value):
-        if evt_type not in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+        if evt_type not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
             return
         door_state = evt_value.value
         self.emit(Qt.SIGNAL('doorStateChanged'), door_state)
@@ -222,6 +222,13 @@ class MacroButton(TaurusWidget):
         else:
             self.ui.button.setChecked(True)
             self.door.ResumeMacro()
+            
+    @classmethod
+    def getQtDesignerPluginInfo(cls):
+        return {'container': False, 
+                'group': 'Taurus Sardana', 
+                'module': 'taurus.qt.qtgui.extra_macroexecutor', 
+                'icon': ':/designer/pushbutton.png'}
 
 
 
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py
index 7ed246e..c03bcf5 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macrodescriptionviewer.py
@@ -47,7 +47,7 @@ class TaurusMacroDescriptionViewer(Qt.QTextEdit, TaurusBaseWidget):
         self.updateStyle()
 
     def getModelClass(self):
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
 
     def updateStyle(self):
         self.update()
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py
index 2104b47..9a821e4 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroexecutor.py
@@ -854,6 +854,7 @@ class TaurusMacroExecutorWidget(TaurusWidget):
         if macro is None: return        
         data = data[1][0]
         state, range, step, id = data["state"], data["range"], data["step"], data["id"]
+        if id is None: return
         id = int(id)
         if id != self.macroId(): return
         macroName = macro.name
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py
index e9d396d..d2fed9e 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/customeditors/senv.py
@@ -24,10 +24,11 @@
 #############################################################################
 
 from taurus.qt import Qt
+from taurus import Database
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusdatabase import TaurusAttrInfo
 from taurus.qt.qtgui.input import TaurusAttrListComboBox
 from taurus.qt.qtgui.tree import TaurusDbTreeWidget
-from taurus import Database
-from taurus.core import TaurusElementType, TaurusAttrInfo
 from taurus.qt.qtgui.resource import getThemeIcon
 from taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.macroparameterseditor import MacroParametersEditor
 from taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.parameditors import LineEditParam, ParamBase, ComboBoxParam, CheckBoxParam, DirPathParam, MSAttrListComboBoxParam
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py
index a711af5..527afba 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/macroparameterseditor.py
@@ -29,7 +29,7 @@ macroparameterseditor.py:
 import sys, inspect, glob
 
 from taurus.qt import Qt
-from taurus.core.util import Singleton
+from taurus.core.util.singleton import Singleton
 from taurus.core.tango.sardana import macro
 from taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.delegate import ParamEditorDelegate
 
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py
index 3fb375c..2728334 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/model.py
@@ -27,7 +27,7 @@
 model.py:
 """
 from taurus.qt import Qt
-from taurus.core.util import etree
+from lxml import etree
 from taurus.core.tango.sardana import macro
 from taurus.qt.qtgui.extra_macroexecutor import globals
 
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py
index c132aa5..30cd17a 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/macroparameterseditor/parameditors.py
@@ -207,7 +207,7 @@ class SpinBoxParam(ParamBase, Qt.QSpinBox):
     def __init__(self, parent=None, paramModel=None):
         ParamBase.__init__(self, paramModel)
         Qt.QSpinBox.__init__(self,parent)
-        self.setRange(-999999,999999)
+        self.setRange(-999999999,999999999)
         self.setAccelerated(True)
 #        self.setToolTip(self.paramModel().description())
     
@@ -225,10 +225,10 @@ class DoubleSpinBoxParam(ParamBase, Qt.QDoubleSpinBox):
     def __init__(self, parent=None, paramModel=None):
         ParamBase.__init__(self, paramModel)
         Qt.QDoubleSpinBox.__init__(self,parent)
-        self.setRange(-999999.999,999999.999)
+        self.setRange(-999999999.999999,999999999.999999)
         self.setAccelerated(True)
-        self.setDecimals(3)
-        self.setSingleStep(0.01)
+        self.setDecimals(6)
+        self.setSingleStep(0.000001)
 #        self.setToolTip(self.paramModel().description())
         
     def getValue(self):
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py b/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py
index d644f97..c958b5b 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/scanplotter.py
@@ -38,10 +38,11 @@ import taurus.core
 from taurus.qt import QtGui, Qwt5
 from taurus.qt.Qt import *
 
+from taurus.core.util import dictFromSequence
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.event import eventfilters
 from taurus.qt.qtgui.plot import TaurusTrend
 
-from taurus.core.util import dictFromSequence, CaselessDict, eventfilters
-    
 class ScanPlotter(TaurusTrend):
             
     def __init__(self, parent = None, designMode = False):
@@ -143,7 +144,7 @@ class ScanPlotter(TaurusTrend):
         try:
             for name in self.getTrendSetNames():
                 ts = self.getTrendSet(name)
-                ts.fireEvent(None, taurus.core.TaurusEventType.Change, None)
+                ts.fireEvent(None, taurus.core.taurusbasetypes.TaurusEventType.Change, None)
         finally:
             self.curves_lock.release()
         self.setEventFilters([eventfilters.ONLY_VALID], plotables)
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py
index 326acd6..dcb0d85 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/model.py
@@ -28,7 +28,7 @@ model.py:
 """
 
 from taurus.qt import Qt
-from taurus.core.util import etree
+from lxml import etree
 from taurus.core.tango.sardana import macro
 
 class MacroSequenceTreeModel(Qt.QAbstractItemModel):
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py
index 2a77bd8..ee24cfd 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/sequenceeditor/sequenceeditor.py
@@ -31,7 +31,7 @@ import os, sys
 from taurus.qt import Qt
 import PyTango
 
-from taurus.core.util import etree
+from lxml import etree
 from taurus.qt.qtgui.extra_macroexecutor.common import MacroExecutionWindow, MacroComboBox, standardPlotablesFilter
 from taurus import Device
 
@@ -637,6 +637,7 @@ class TaurusSequencerWidget(TaurusWidget):
         if macro is None: return
         data = data[1][0]
         state, range, step, id = str(data["state"]), data["range"], data["step"], data["id"]
+        if id is None: return
         id = int(id)
         if not id in self.macroIds(): return
         macroName = macro.name
diff --git a/lib/taurus/qt/qtgui/extra_pool/poolmotor.py b/lib/taurus/qt/qtgui/extra_pool/poolmotor.py
index 318bca5..6263376 100644
--- a/lib/taurus/qt/qtgui/extra_pool/poolmotor.py
+++ b/lib/taurus/qt/qtgui/extra_pool/poolmotor.py
@@ -31,6 +31,9 @@ import numpy
 from taurus.qt import Qt
 
 import taurus
+from taurus.core.util.colors import DEVICE_STATE_PALETTE
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.taurusvalidator import DeviceNameValidator
 import taurus.qt.qtcore.mimetypes
 from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
 from taurus.qt.qtgui.base import TaurusBaseWidget
@@ -42,6 +45,8 @@ from taurus.qt.qtgui.input import TaurusValueSpinBox
 from taurus.qt.qtgui.panel import DefaultLabelWidget
 from taurus.qt.qtgui.panel import DefaultUnitsWidget
 from taurus.qt.qtgui.panel import TaurusValue, TaurusAttrForm
+from taurus.qt.qtcore.mimetypes import TAURUS_DEV_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
+from taurus.qt.qtgui.resource import getIcon
 from ui_poolmotorslim import Ui_PoolMotorSlim
 
 
@@ -55,7 +60,7 @@ class LimitsListener(Qt.QObject):
         Qt.QObject.__init__(self)
 
     def eventReceived(self, evt_src, evt_type, evt_value):
-        if evt_type not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]:
+        if evt_type not in [TaurusEventType.Change, TaurusEventType.Periodic]:
             return
         limits = evt_value.value
         self.emit(Qt.SIGNAL('updateLimits(PyQt_PyObject)'), limits.tolist())
@@ -78,7 +83,7 @@ class PoolMotorClient():
             self.has_limits = hasattr(self.motor_dev, 'Limit_Switches')
             self.has_encoder = hasattr(self.motor_dev, 'Encoder')
         except Exception,e:
-            print 'EXCEPTION CREATING MOTOR DEVICE...\n'+str(e)
+            taurus.warning('Exception Creating Motor Device %s', str(e))
 
     def moveMotor(self, pos):
         #self.motor_dev['position'] = pos
@@ -128,8 +133,8 @@ class LabelWidgetDragsDeviceAndAttribute(DefaultLabelWidget):
         mimeData.setText(self.text())
         attr_name = model
         dev_name = model.rpartition('/')[0]
-        mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE, dev_name)
-        mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE, attr_name)
+        mimeData.setData(TAURUS_DEV_MIME_TYPE, dev_name)
+        mimeData.setData(TAURUS_ATTR_MIME_TYPE, attr_name)
 
         drag = Qt.QDrag(self)
         drag.setMimeData(mimeData)
@@ -296,6 +301,10 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
 
         self.ui = Ui_PoolMotorSlim()
         self.ui.setupUi(self)
+        
+        if designMode:
+            self.__setTaurusIcons()
+            return
 
         # CREATE THE TaurusValue that can not be configured in the Designer
         self.taurus_value = TaurusValue(self.ui.taurusValueContainer)
@@ -321,7 +330,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
 
         # ADD AN EVENT FILTER FOR THE STATUS LABEL IN ORDER TO PROVIDE JUST THE STRING FROM THE CONTROLLER (LAST LINE)
         def just_ctrl_status_line(evt_src, evt_type, evt_value):
-            if evt_type not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]:
+            if evt_type not in [TaurusEventType.Change, TaurusEventType.Periodic]:
                 return evt_src, evt_type, evt_value
             try:
                 status = evt_value.value
@@ -345,36 +354,9 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
         self.toggleMoveAbsolute(True)
         self.toggleStopMove(True)
 
-        #################################################################################################################
-        ################
         # SET TAURUS ICONS 
-        ################
-        self.ui.btnMin.setText('')
-        self.ui.btnMin.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-remove.svg'))
-        self.ui.btnMax.setText('')
-        self.ui.btnMax.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-add.svg'))
-
-        self.ui.btnGoToNeg.setText('')
-        self.ui.btnGoToNeg.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_backward.svg'))
-        self.ui.btnGoToNegPress.setText('')
-        self.ui.btnGoToNegPress.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_backward.svg'))
-        self.ui.btnGoToNegInc.setText('')
-        self.ui.btnGoToNegInc.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_backward.svg'))
-        self.ui.btnGoToPos.setText('')
-        self.ui.btnGoToPos.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_forward.svg'))
-        self.ui.btnGoToPosPress.setText('')
-        self.ui.btnGoToPosPress.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_forward.svg'))
-        self.ui.btnGoToPosInc.setText('')
-        self.ui.btnGoToPosInc.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_start.svg'))
-        self.ui.btnStop.setText('')
-        self.ui.btnStop.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_stop.svg'))
-        self.ui.btnHome.setText('')
-        self.ui.btnHome.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/go-home.svg'))
-        self.ui.btnCfg.setText('')
-        self.ui.btnCfg.setIcon(taurus.qt.qtgui.resource.getIcon(':/categories/preferences-system.svg'))
-        #################################################################################################################
-
-
+        self.__setTaurusIcons()
+        
         self.ui.motorGroupBox.setContextMenuPolicy(Qt.Qt.CustomContextMenu)
         self.connect(self.ui.motorGroupBox, Qt.SIGNAL('customContextMenuRequested(QPoint)'), self.buildContextMenu)
 
@@ -407,6 +389,34 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
         self.registerConfigProperty(self.ui.lblStatus.isVisible, self.toggleStatus, 'Status')
         #################################################################################################################
 
+    def __setTaurusIcons(self):
+        self.ui.btnMin.setText('')
+        self.ui.btnMin.setIcon(getIcon(':/actions/list-remove.svg'))
+        self.ui.btnMax.setText('')
+        self.ui.btnMax.setIcon(getIcon(':/actions/list-add.svg'))
+
+        self.ui.btnGoToNeg.setText('')
+        self.ui.btnGoToNeg.setIcon(getIcon(':/actions/media_skip_backward.svg'))
+        self.ui.btnGoToNegPress.setText('')
+        self.ui.btnGoToNegPress.setIcon(getIcon(':/actions/media_seek_backward.svg'))
+        self.ui.btnGoToNegInc.setText('')
+        self.ui.btnGoToNegInc.setIcon(getIcon(':/actions/media_playback_backward.svg'))
+        self.ui.btnGoToPos.setText('')
+        self.ui.btnGoToPos.setIcon(getIcon(':/actions/media_skip_forward.svg'))
+        self.ui.btnGoToPosPress.setText('')
+        self.ui.btnGoToPosPress.setIcon(getIcon(':/actions/media_seek_forward.svg'))
+        self.ui.btnGoToPosInc.setText('')
+        self.ui.btnGoToPosInc.setIcon(getIcon(':/actions/media_playback_start.svg'))
+        self.ui.btnStop.setText('')
+        self.ui.btnStop.setIcon(getIcon(':/actions/media_playback_stop.svg'))
+        self.ui.btnHome.setText('')
+        self.ui.btnHome.setIcon(getIcon(':/actions/go-home.svg'))
+        self.ui.btnCfg.setText('')
+        self.ui.btnCfg.setIcon(getIcon(':/categories/preferences-system.svg'))
+        #################################################################################################################
+
+
+
     #@Qt.pyqtSlot(list)
     def updateLimits(self, limits):
         if isinstance(limits, dict): limits = limits["limits"]
@@ -414,7 +424,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
         pos_btnstylesheet = ''
         enabled = True
         if pos_lim:
-            pos_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+            pos_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
             enabled = False
         self.ui.btnMax.setStyleSheet(pos_btnstylesheet)
         self.ui.btnGoToPos.setEnabled(enabled)
@@ -426,7 +436,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
         neg_btnstylesheet = ''
         enabled = True
         if neg_lim:
-            neg_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+            neg_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
             enabled = False
         self.ui.btnMin.setStyleSheet(neg_btnstylesheet)
         self.ui.btnGoToNeg.setEnabled(enabled)
@@ -578,10 +588,10 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
 
     def dropEvent(self, event):
         mimeData = event.mimeData()
-        if mimeData.hasFormat(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE):
-            model = str(mimeData.data(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE))
-        elif mimeData.hasFormat(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE):
-            model = str(mimeData.data(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE))
+        if mimeData.hasFormat(TAURUS_DEV_MIME_TYPE):
+            model = str(mimeData.data(TAURUS_DEV_MIME_TYPE))
+        elif mimeData.hasFormat(TAURUS_ATTR_MIME_TYPE):
+            model = str(mimeData.data(TAURUS_ATTR_MIME_TYPE))
         else:
             model = str(mimeData.text())
         self.setModel(model)
@@ -600,21 +610,27 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['module'] = 'taurus.qt.qtgui.extra_pool'
-#        ret['group'] = 'Taurus Sardana'
-#        ret['icon'] = ':/designer/extra_pool.png'
-#        ret['container'] = False
-#        return ret
+        ret = TaurusWidget.getQtDesignerPluginInfo()
+        ret['module'] = 'taurus.qt.qtgui.extra_pool'
+        ret['group'] = 'Taurus Sardana'
+        ret['icon'] = ':/designer/extra_motor.png'
+        ret['container'] = False
+        return ret
 
     def showEvent(self, event):
         TaurusWidget.showEvent(self, event)
-        self.motor_dev.getAttribute('Position').enablePolling(force=True)
+        try:
+            self.motor_dev.getAttribute('Position').enablePolling(force=True)
+        except AttributeError, e:
+            self.debug('Error in showEvent: %s', repr(e))
+            
 
     def hideEvent(self, event):
         TaurusWidget.hideEvent(self, event)
-        self.motor_dev.getAttribute('Position').disablePolling()
+        try:
+            self.motor_dev.getAttribute('Position').disablePolling()
+        except AttributeError, e:
+            self.debug('Error in hideEvent: %s', repr(e))
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT properties 
@@ -628,7 +644,7 @@ class PoolMotorSlim(TaurusWidget, PoolMotorClient):
         # DUE TO A BUG IN TAUGROUPBOX, WE NEED THE FULL MODEL NAME
         try:
             # In case the model is an attribute of a motor, get the device name
-            if not taurus.core.DeviceNameValidator().isValid(model):
+            if not DeviceNameValidator().isValid(model):
                 model = model.rpartition('/')[0]
             model = taurus.Factory().getDevice(model).getFullName()
             self.setMotor(model)
@@ -744,7 +760,7 @@ class TaurusAttributeListener(Qt.QObject):
         Qt.QObject.__init__(self)
 
     def eventReceived(self, evt_src, evt_type, evt_value):
-        if evt_type not in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic]:
+        if evt_type not in [TaurusEventType.Change, TaurusEventType.Periodic]:
             return
         value = evt_value.value
         self.emit(Qt.SIGNAL('eventReceived'), value)
@@ -840,7 +856,7 @@ class PoolMotorTVLabelWidget(TaurusWidget):
         self.connect(action_expert_view, Qt.SIGNAL('toggled(bool)'), self.taurusValueBuddy().setExpertView)
 
         action_tango_attributes = Qt.QAction(self)
-        action_tango_attributes.setIcon(taurus.qt.qtgui.resource.getIcon(':/categories/preferences-system.svg'))
+        action_tango_attributes.setIcon(getIcon(':/categories/preferences-system.svg'))
         action_tango_attributes.setText('Tango Attributes')
         menu.addAction(action_tango_attributes)
         self.connect(action_tango_attributes, Qt.SIGNAL('triggered()'), self.taurusValueBuddy().showTangoAttributes)
@@ -854,8 +870,8 @@ class PoolMotorTVLabelWidget(TaurusWidget):
         mimeData.setText(self.lbl_alias.text())
         dev_name = model.rpartition('/')[0]
         attr_name = dev_name+'/Position'
-        mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_DEV_MIME_TYPE, dev_name)
-        mimeData.setData(taurus.qt.qtcore.mimetypes.TAURUS_ATTR_MIME_TYPE, attr_name)
+        mimeData.setData(TAURUS_DEV_MIME_TYPE, dev_name)
+        mimeData.setData(TAURUS_ATTR_MIME_TYPE, attr_name)
     
         drag = Qt.QDrag(self)
         drag.setMimeData(mimeData)
@@ -884,14 +900,14 @@ class PoolMotorTVReadWidget(TaurusWidget):
         self.btn_lim_neg.setToolTip('Negative Limit')
         #self.btn_lim_neg.setEnabled(False)
         self.prepare_button(self.btn_lim_neg)
-        self.btn_lim_neg.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-remove.svg'))
+        self.btn_lim_neg.setIcon(getIcon(':/actions/list-remove.svg'))
         limits_layout.addWidget(self.btn_lim_neg)
 
         self.btn_lim_pos = Qt.QPushButton()
         self.btn_lim_pos.setToolTip('Positive Limit')
         #self.btn_lim_pos.setEnabled(False)
         self.prepare_button(self.btn_lim_pos)
-        self.btn_lim_pos.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/list-add.svg'))
+        self.btn_lim_pos.setIcon(getIcon(':/actions/list-add.svg'))
         limits_layout.addWidget(self.btn_lim_pos)
 
         self.layout().addLayout(limits_layout,0, 0)
@@ -976,13 +992,13 @@ class PoolMotorTVWriteWidget(TaurusWidget):
         self.btn_step_down = Qt.QPushButton()
         self.btn_step_down.setToolTip('Decrements motor position')
         self.prepare_button(self.btn_step_down)
-        self.btn_step_down.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_backward.svg'))
+        self.btn_step_down.setIcon(getIcon(':/actions/media_playback_backward.svg'))
         self.qw_write_relative.layout().addWidget(self.btn_step_down)
 
         self.btn_step_up = Qt.QPushButton()
         self.btn_step_up.setToolTip('Increments motor position')
         self.prepare_button(self.btn_step_up)
-        self.btn_step_up.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_start.svg'))
+        self.btn_step_up.setIcon(getIcon(':/actions/media_playback_start.svg'))
         self.qw_write_relative.layout().addWidget(self.btn_step_up)
 
         self.layout().addWidget(self.qw_write_relative, 0, 0)
@@ -995,7 +1011,7 @@ class PoolMotorTVWriteWidget(TaurusWidget):
         self.btn_stop = Qt.QPushButton()
         self.btn_stop.setToolTip('Stops the motor')
         self.prepare_button(self.btn_stop)
-        self.btn_stop.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_playback_stop.svg'))
+        self.btn_stop.setIcon(getIcon(':/actions/media_playback_stop.svg'))
         self.layout().addWidget(self.btn_stop, 0, 2)
 
         btns_layout = Qt.QHBoxLayout()
@@ -1007,25 +1023,25 @@ class PoolMotorTVWriteWidget(TaurusWidget):
         self.btn_to_neg = Qt.QPushButton()
         self.btn_to_neg.setToolTip('Moves the motor towards the Negative Software Limit')
         self.prepare_button(self.btn_to_neg)
-        self.btn_to_neg.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_backward.svg'))
+        self.btn_to_neg.setIcon(getIcon(':/actions/media_skip_backward.svg'))
         btns_layout.addWidget(self.btn_to_neg)
 
         self.btn_to_neg_press = Qt.QPushButton()
         self.btn_to_neg_press.setToolTip('Moves the motor (while pressed) towards the Negative Software Limit')
         self.prepare_button(self.btn_to_neg_press)
-        self.btn_to_neg_press.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_backward.svg'))
+        self.btn_to_neg_press.setIcon(getIcon(':/actions/media_seek_backward.svg'))
         btns_layout.addWidget(self.btn_to_neg_press)
 
         self.btn_to_pos_press = Qt.QPushButton()
         self.prepare_button(self.btn_to_pos_press)
         self.btn_to_pos_press.setToolTip('Moves the motor (while pressed) towards the Positive Software Limit')
-        self.btn_to_pos_press.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_seek_forward.svg'))
+        self.btn_to_pos_press.setIcon(getIcon(':/actions/media_seek_forward.svg'))
         btns_layout.addWidget(self.btn_to_pos_press)
 
         self.btn_to_pos = Qt.QPushButton()
         self.btn_to_pos.setToolTip('Moves the motor towards the Positive Software Limit')
         self.prepare_button(self.btn_to_pos)
-        self.btn_to_pos.setIcon(taurus.qt.qtgui.resource.getIcon(':/actions/media_skip_forward.svg'))
+        self.btn_to_pos.setIcon(getIcon(':/actions/media_skip_forward.svg'))
         btns_layout.addWidget(self.btn_to_pos)
 
         btns_layout.addItem(Qt.QSpacerItem(1, 1, Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Minimum))
@@ -1283,7 +1299,7 @@ class PoolMotorTV(TaurusValue):
         pos_btnstylesheet = ''
         enabled = True
         if pos_lim:
-            pos_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+            pos_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
             enabled = False
         self.readWidget().btn_lim_pos.setStyleSheet(pos_btnstylesheet)
 
@@ -1296,7 +1312,7 @@ class PoolMotorTV(TaurusValue):
         neg_btnstylesheet = ''
         enabled = True
         if neg_lim:
-            neg_btnstylesheet = 'QPushButton{%s}'%taurus.core.util.DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
+            neg_btnstylesheet = 'QPushButton{%s}'%DEVICE_STATE_PALETTE.qtStyleSheet(PyTango.DevState.ALARM)
             enabled = False
         self.readWidget().btn_lim_neg.setStyleSheet(neg_btnstylesheet)
 
@@ -1327,6 +1343,7 @@ class PoolMotorTV(TaurusValue):
             limit_switches = [False, False, False]
             if self.hasHwLimits():
                 limit_switches = self.motor_dev.getAttribute('Limit_switches').read().value
+                #print "update limits", limit_switches
             self.updateLimits(limit_switches, position=position)
         
     def hasEncoder(self):
@@ -1387,7 +1404,9 @@ def main():
     app = taurus.qt.qtgui.application.TaurusApplication(cmd_line_parser=parser)
     args = app.get_command_line_args()
 
-    models = ['tango://controls02:10000/motor/gcipap10ctrl/8']
+    #models = ['tango://controls02:10000/motor/gcipap10ctrl/8']
+    models = ['motor/motctrl06/3']
+    
     if len(args)>0:
         models = args
 
diff --git a/lib/taurus/qt/qtgui/extra_sardana/controllertree.py b/lib/taurus/qt/qtgui/extra_sardana/controllertree.py
index b760761..9a12ff7 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/controllertree.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/controllertree.py
@@ -36,7 +36,7 @@ from taurus.qt import Qt
 
 import taurus.core
 
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
 
 from taurus.qt.qtcore.model import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
 from taurus.qt.qtgui.tree import TaurusBaseTreeWidget
@@ -74,7 +74,7 @@ class ControllerBaseTreeItem(TaurusBaseTreeItem):
     
     def role(self):
         """Returns the prefered role for the item.
-        This implementation returns taurus.core.TaurusElementType.Unknown
+        This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
         
         This method should be able to return any kind of python object as long
         as the model that is used is compatible.
@@ -266,7 +266,7 @@ class ControllerClassTreeWidget(TaurusBaseTreeWidget):
     DftPerspective = PoolControllerView.ControllerModule
         
     def getModelClass(self):
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
 
 
 class ControllerClassSelectionDialog(Qt.QDialog):
diff --git a/lib/taurus/qt/qtgui/extra_sardana/elementtree.py b/lib/taurus/qt/qtgui/extra_sardana/elementtree.py
index 2759750..763651e 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/elementtree.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/elementtree.py
@@ -29,7 +29,7 @@ __all__ = ["SardanaElementTreeWidget"]
 
 __docformat__ = 'restructuredtext'
 
-from taurus.core import TaurusDevice
+from taurus.core.taurusdevice import TaurusDevice
 from taurus.qt.qtcore.tango.sardana.model import SardanaBaseProxyModel, \
     SardanaElementTypeModel
 from taurus.qt.qtgui.tree import TaurusBaseTreeWidget
diff --git a/lib/taurus/qt/qtgui/extra_sardana/environment.py b/lib/taurus/qt/qtgui/extra_sardana/environment.py
index 9550565..d5bf8dd 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/environment.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/environment.py
@@ -29,7 +29,7 @@ __all__ = ["SardanaEnvironmentTreeWidget"]
 
 __docformat__ = 'restructuredtext'
 
-from taurus.core import TaurusDevice
+from taurus.core.taurusdevice import TaurusDevice
 from taurus.qt import Qt
 from taurus.qt.qtcore.tango.sardana.model import SardanaEnvironmentModel
 from taurus.qt.qtgui.tree import TaurusBaseTreeWidget
diff --git a/lib/taurus/qt/qtgui/extra_sardana/expdescription.py b/lib/taurus/qt/qtgui/extra_sardana/expdescription.py
index c369964..21a4de3 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/expdescription.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/expdescription.py
@@ -30,6 +30,7 @@ __all__ = ["ExpDescriptionEditor"]
 from taurus.qt import Qt
 import copy
 import taurus
+import taurus.core
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtcore.tango.sardana.model import SardanaBaseProxyModel, SardanaTypeTreeItem
 
@@ -45,8 +46,13 @@ class SardanaAcquirableProxyModel(SardanaBaseProxyModel):
 #        item = idx.internalPointer()
 #        return 'Acquirable' in item.itemData().interfaces
 
-    ALLOWED_TYPES = ('Motor', 'CTExpChannel') #@todo: add IORegisters too!
-    
+#    ALLOWED_TYPES = ['Motor', 'CTExpChannel', 'ZeroDExpChannel', 'OneDExpChannel',
+#                     'TwoDExpChannel', 'ComChannel', 'IORegister', 'PseudoMotor',
+#                     'PseudoCounter']
+
+    from sardana.sardanadefs import ElementType, TYPE_ACQUIRABLE_ELEMENTS
+    ALLOWED_TYPES = [ElementType[t] for t in TYPE_ACQUIRABLE_ELEMENTS]
+
     def filterAcceptsRow(self, sourceRow, sourceParent):
         sourceModel = self.sourceModel()
         idx = sourceModel.index(sourceRow, 0, sourceParent)
@@ -101,7 +107,7 @@ class ExpDescriptionEditor(Qt.QWidget, TaurusBaseWidget):
              
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
         
     def onChooseScanDirButtonClicked(self):
         ret = Qt.QFileDialog.getExistingDirectory ( self, 'Choose directory for saving files', self.ui.pathLE.text())
diff --git a/lib/taurus/qt/qtgui/extra_sardana/macrotree.py b/lib/taurus/qt/qtgui/extra_sardana/macrotree.py
index d6def91..4f6e6eb 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/macrotree.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/macrotree.py
@@ -36,7 +36,7 @@ from taurus.qt import Qt
 
 import taurus.core
 
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
 from taurus.core.tango.sardana.macro import MacroInfo
 
 from taurus.qt.qtcore.model import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
@@ -76,7 +76,7 @@ class MacroTreeBaseItem(TaurusBaseTreeItem):
     
     def role(self):
         """Returns the prefered role for the item.
-        This implementation returns taurus.core.TaurusElementType.Unknown
+        This implementation returns taurus.core.taurusbasetypes.TaurusElementType.Unknown
         
         This method should be able to return any kind of python object as long
         as the model that is used is compatible.
@@ -247,7 +247,7 @@ class MacroTreeWidget(TaurusBaseTreeWidget):
     DftPerspective = MacroView.MacroModule
         
     def getModelClass(self):
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
 
 
 class MacroSelectionDialog(Qt.QDialog):
diff --git a/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py b/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py
index d480bc3..3b93cbf 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/measurementgroup.py
@@ -41,7 +41,7 @@ from taurus.qt.qtgui.table import TaurusBaseTableWidget
 from taurus.qt.qtgui.panel import TaurusModelChooser
 from taurus.core.tango.sardana import ChannelView, PlotType, Normalization, AcqTriggerType
 from taurus.core.tango.sardana.pool import getChannelConfigs
-from taurus.core import TaurusElementType
+from taurus.core.taurusbasetypes import TaurusElementType
 
 #===============================================================================
 # some dummydict for developing the "Experimental Configuration widget"
@@ -326,7 +326,7 @@ class MntGrpChannelItem(BaseMntGrpChannelItem):
                 if not isinstance(data,(tuple,list)):
                     raise ValueError
             except:
-                from taurus.core.util import Logger
+                from taurus.core.util.log import Logger
                 Logger(self.__class__.__name__).error('Invalid shape %s',s )
                 data = ()
         else:
@@ -900,7 +900,7 @@ class MntGrpChannelEditor(TaurusBaseTableWidget):
         return ta
 
     def getModelClass(self):
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
 
     def addChannel(self, channel=None):
         qmodel = self.getQModel()
diff --git a/lib/taurus/qt/qtgui/gauge/__init__.py b/lib/taurus/qt/qtgui/gauge/__init__.py
index 3b389a3..c5b4855 100644
--- a/lib/taurus/qt/qtgui/gauge/__init__.py
+++ b/lib/taurus/qt/qtgui/gauge/__init__.py
@@ -30,9 +30,8 @@ __docformat__ = 'restructuredtext'
 try:
     from .taurusgauge import *
 except:
-    import taurus.core.util
-    _logger = taurus.core.util.Logger(__name__)
-    _logger.debug("Gauge widgets could not be initialized")
+    from taurus.core.util.log import debug
+    debug("Gauge widgets could not be initialized")
     from taurus.qt.qtgui.display import create_taurus_fallback as __create
     TaurusLinearGauge = __create("TaurusLinearGauge")
     TaurusCircularGauge = __create("TaurusCircularGauge")
diff --git a/lib/taurus/qt/qtgui/gauge/taurusgauge.py b/lib/taurus/qt/qtgui/gauge/taurusgauge.py
index c226c3a..df141f0 100644
--- a/lib/taurus/qt/qtgui/gauge/taurusgauge.py
+++ b/lib/taurus/qt/qtgui/gauge/taurusgauge.py
@@ -55,7 +55,7 @@ class TaurusLinearGauge(qtcontrols.ELinearGauge, TaurusBaseWidget):
     
     def getModelClass(self):
         import taurus.core
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def handleEvent(self, evt_src, evt_type, evt_value):
         v, v_ref = None, None
@@ -147,7 +147,7 @@ class TaurusCircularGauge(qtcontrols.ECircularGauge, TaurusBaseWidget):
     
     def getModelClass(self):
         import taurus.core
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def handleEvent(self, evt_src, evt_type, evt_value):
         v, v_ref = None, None
diff --git a/lib/taurus/qt/qtgui/graphic/__init__.py b/lib/taurus/qt/qtgui/graphic/__init__.py
index 7ae56db..a15f26b 100644
--- a/lib/taurus/qt/qtgui/graphic/__init__.py
+++ b/lib/taurus/qt/qtgui/graphic/__init__.py
@@ -33,7 +33,7 @@ from .taurusgraphicview import *
 try:
     from .jdraw import *
 except:
-    import taurus.core.util
-    _logger = taurus.core.util.Logger(__name__)
+    import taurus.core.util.log
+    _logger = taurus.core.util.log.Logger(__name__)
     _logger.debug("jdraw widgets could not be initialized")
     _logger.traceback()
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
index 84d8707..b15984e 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
@@ -33,10 +33,12 @@ import os
 import traceback
 
 from taurus.qt import Qt
-
-import taurus.core
-import taurus.core.util
-from taurus.qt.qtgui.graphic import TaurusBaseGraphicsFactory, TaurusGraphicsScene, TaurusGraphicsItem, parseTangoUri,TaurusTextAttributeItem,TaurusTextStateItem
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
+from taurus.core.util.containers import CaselessDict
+from taurus.qt.qtgui.graphic import TaurusBaseGraphicsFactory, \
+    TaurusGraphicsScene, TaurusGraphicsItem, parseTangoUri, \
+    TaurusTextAttributeItem,TaurusTextStateItem
 
 
 LINESTYLE_JDW2QT = { 0: Qt.Qt.SolidLine,
@@ -58,7 +60,7 @@ FILLSTYLE_JDW2QT = { 0: Qt.Qt.NoBrush,
                      10:Qt.Qt.Dense4Pattern,
                      11:Qt.Qt.RadialGradientPattern }
 
-TEXTHINT_JDW2QT = taurus.core.util.CaselessDict({ 
+TEXTHINT_JDW2QT = CaselessDict({ 
     'helvetica'  : Qt.QFont.Helvetica,
     'serif'      : Qt.QFont.Serif,
     'sansserif'  : Qt.QFont.SansSerif,
@@ -68,7 +70,7 @@ TEXTHINT_JDW2QT = taurus.core.util.CaselessDict({
     ''           : Qt.QFont.AnyStyle,})
 
 
-class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsFactory, taurus.core.util.Logger):
+class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
     
     def __init__(self,parent,alias = None, delayed = False):
         """ Initialization. Nothing to be done here for now."""
@@ -80,7 +82,7 @@ class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsF
 
     def init(self, *args, **kwargs):
         """Singleton instance initialization."""
-        self.call__init__(taurus.core.util.Logger, self.__class__.__name__) 
+        self.call__init__(Logger, self.__class__.__name__) 
         self.call__init__(TaurusBaseGraphicsFactory)
         
     def getZBufferLevel(self):
@@ -106,7 +108,7 @@ class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsF
                     scene.addItem(item)
             except:
                 self.warning("Unable to add item %s to scene" % str(item))
-                self.warning(traceback.format_exc()) #self.traceback()
+                self.debug("Details:", exc_info=1)
         return scene
     
     def getObj(self,name,params):
@@ -117,7 +119,8 @@ class TaurusJDrawGraphicsFactory(taurus.core.util.Singleton, TaurusBaseGraphicsF
             obj.setZValue(self.incZBufferLevel())
             return obj
         except:
-            self.warning(traceback.format_exc())
+            self.warning("Error fetching object")
+            self.debug("Details:", exc_info=1)
             pass
         return None
     
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
index 95ff5ac..b7cc72a 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
@@ -33,7 +33,7 @@ import ply.lex as lex
 import ply.yacc as yacc
 
 from jdraw import *
-from taurus.core.util import Logger
+from taurus.core.util.log import Logger
 
 tokens = ( 'NUMBER', 'SYMBOL', 'LBRACKET', 'RBRACKET', 'TWOP', 'COMMA',
 'JDFILE', 'GLOBAL', 'JDLINE', 'JDRECTANGLE', 'JDROUNDRECTANGLE',
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
index f735d85..529b96f 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
@@ -34,8 +34,8 @@ import traceback
 import subprocess
 import taurus
 from taurus.qt import Qt
-from taurus.core import DeviceNameValidator,AttributeNameValidator
-from taurus.qt.qtgui.graphic.taurusgraphic import parseTangoUri
+from taurus.core.taurusvalidator import DeviceNameValidator, AttributeNameValidator
+from taurus.qt.qtgui.graphic.taurusgraphic import parseTangoUri, TaurusGraphicsItem
 from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
 from taurus.qt.qtgui.base import TaurusBaseWidget
 import jdraw_parser
@@ -143,7 +143,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
     
     @Qt.pyqtSignature("graphicItemSelected(QString)")
     def graphicItemSelected(self,item_name):
-        self.info(' => graphicItemSelected(QString)(%s)'%item_name)
+        self.debug(' => graphicItemSelected(QString)(%s)'%item_name)
         self.emit(Qt.SIGNAL("graphicItemSelected(QString)"),item_name)
         
     @Qt.pyqtSignature("graphicSceneClicked(QPoint)")
@@ -306,7 +306,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
         if alias is not None: self.setAlias(alias)
         ll = taurus.getLogLevel()
         if trace: taurus.setLogLevel(taurus.Debug)
-        self.info('setModel("%s")'%model)
+        #self.debug('setModel("%s")'%model)
         if self._currF:
             #filename = str(self._currFile.absoluteFilePath())
             filename = self._currF
@@ -334,7 +334,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
                 self.fitting(True)
             else:
                 self.setScene(None)
-        self.info('out of setModel()')
+        #self.debug('out of setModel()')
         taurus.setLogLevel(ll)
             
     #def destroy(destroyWindow=True,destroySubWindows=True):
@@ -347,7 +347,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
     def setModels(self):
         """ This method triggers item.setModel(item._name) in all internal items. """
         for item in self.scene().items():
-            if item._name and isinstance(item, taurus.qt.qtgui.graphic.TaurusGraphicsItem):
+            if item._name and isinstance(item, TaurusGraphicsItem):
                 self.debug('TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)'%(item._name))
                 item.setModel(item._name)
 
diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
index 2724cea..1092e35 100644
--- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
+++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
@@ -30,11 +30,7 @@ taurusgraphic.py:
 
 __docformat__ = 'restructuredtext'
 
-import time
-import sys
-import signal
 import re
-from threading import Thread 
 import os
 import subprocess
 import traceback
@@ -43,17 +39,22 @@ import types
 
 import Queue
 
+from taurus import Manager
+from taurus.core.util.containers import CaselessDefaultDict
+from taurus.core.util.log import Logger
+from taurus.core.taurusvalidator import DeviceNameValidator, AttributeNameValidator
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusattribute import TaurusAttribute
 from taurus.qt import Qt
-import taurus.core
-from taurus.core import DeviceNameValidator,AttributeNameValidator
-import taurus.core.util
-
 from taurus.qt.qtgui.base import TaurusBaseComponent
-from taurus.qt.qtgui.util import QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE
+from taurus.qt.qtgui.util import (QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE,
+                                  ExternalAppAction, TaurusWidgetFactory)
+
 
 def parseTangoUri(name):
-    from taurus.core import tango,AttributeNameValidator,DeviceNameValidator
-    validator = {tango.TangoDevice:DeviceNameValidator,tango.TangoAttribute:AttributeNameValidator}
+    from taurus.core import tango
+    validator = {tango.TangoDevice    : DeviceNameValidator,
+                 tango.TangoAttribute : AttributeNameValidator }
     try: 
         params = validator[tango.TangoFactory().findObjectClass(name)]().getParams(name)
         return (params if 'devicename' in params else None)
@@ -68,7 +69,7 @@ class TaurusGraphicsUpdateThread(Qt.QThread):
             raise RuntimeError("Illegal parent for TaurusGraphicsUpdateThread")
         Qt.QThread.__init__(self, parent)
         self.period = period
-        self.log = taurus.core.util.Logger('TaurusGraphicsUpdateThread')
+        self.log = Logger('TaurusGraphicsUpdateThread')
 
     def _updateView(self,v):
         # The first one is the prefered one because it improves performance
@@ -104,7 +105,7 @@ class TaurusGraphicsUpdateThread(Qt.QThread):
             item_rects = [ i.boundingRect() for i in item ]
             
             for v in p.views():
-                #p.info("emit('updateView')")
+                #p.debug("emit('updateView')")
                 emitter.emit(Qt.SIGNAL("updateView"), v)
             self.sleep(self.period) #This sleep is needed to reduce CPU usage of the application!
             #End of while
@@ -181,19 +182,19 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
     
     def __init__(self, parent = None, strt = True):
         name = self.__class__.__name__
-        #self.call__init__(taurus.core.util.Logger, name, parent) #Inheriting from Logger caused exceptions in CONNECT
+        #self.call__init__(Logger, name, parent) #Inheriting from Logger caused exceptions in CONNECT
         Qt.QGraphicsScene.__init__(self, parent)
         self.updateQueue = None
         self.updateThread = None
-        self._itemnames = taurus.core.util.CaselessDefaultDict(lambda k:set())
+        self._itemnames = CaselessDefaultDict(lambda k:set())
         self._selection = []
         self._selectedItems = []
         self.threads = []
         self.pids = []
-        self.panel_launcher = taurus.qt.qtgui.util.ExternalAppAction(parent.defaultPanelClass().split() if parent else ['taurusdevicepanel'])
+        self.panel_launcher = ExternalAppAction(parent.defaultPanelClass().split() if parent else ['taurusdevicepanel'])
         
         try:
-            self.logger = taurus.core.util.Logger(name)
+            self.logger = Logger(name)
             #self.logger.setLogLevel(self.logger.Info)
             if not self.TRACE_ALL:
                 self.debug = lambda l: self.logger.debug(l)
@@ -233,7 +234,10 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
     def getItemByName(self,item_name,strict=None):
         """
         Returns a list with all items matching a given name.
-        :param: strict, controls wheter full_name (strict=True) or only device name (False) must match
+        
+        :param strict: (bool or None) controls whether full_name (strict=True) or only device name (False) must match
+        
+        :return: (list) items
         """
         strict = (not self.ANY_ATTRIBUTE_SELECTS_DEVICE) if strict is None else strict
         alnum = '(?:[a-zA-Z0-9-_\*]|(?:\.\*))(?:[a-zA-Z0-9-_\*]|(?:\.\*))*'
@@ -248,7 +252,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         result = []
         for k in self._itemnames.keys():
             if re.match(target.lower(),k.lower()):
-                #self.info('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k]))
+                #self.debug('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k]))
                 result.extend(self._itemnames[k])
         return result
             
@@ -277,11 +281,11 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         x,y = pos.x(),pos.y()
         self.emit(Qt.SIGNAL("graphicSceneClicked(QPoint)"),Qt.QPoint(x,y))
         obj = self.getItemByPosition(x,y)
-        self.info('mouse clicked on %s(%s) at (%s,%s)'%(type(obj).__name__,getattr(obj,'_name',''),x,y))
+        #self.debug('mouse clicked on %s(%s) at (%s,%s)'%(type(obj).__name__,getattr(obj,'_name',''),x,y))
         return obj
 
     def mousePressEvent(self,mouseEvent):
-        self.info('In TaurusGraphicsScene.mousePressEvent(%s,%s))'%(str(type(mouseEvent)),str(mouseEvent.button())))
+        #self.debug('In TaurusGraphicsScene.mousePressEvent(%s,%s))'%(str(type(mouseEvent)),str(mouseEvent.button())))
         try: 
             obj = self.getItemClicked(mouseEvent)
             obj_name = getattr(obj,'_name', '')
@@ -366,19 +370,19 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         A blue circle is drawn around the matching item name.
         If the item_name is empty, or it is a reserved keyword, or it has the "noSelect" extension, then the blue circle is removed from the synoptic.
         """      
-        self.debug('In TaurusGraphicsScene.selectGraphicItem(%s))'%item_name)
+        #self.debug('In TaurusGraphicsScene.selectGraphicItem(%s))'%item_name)
         retval = False
         selected = [str(getattr(item,'_name',item)) for item in self._selectedItems if item]
         if selected:
             iname = str(getattr(item_name,'_name',item_name))
-            #self.info('In TauGraphicsScene.selectGraphicItem(%s): already selected: %s'%(iname,selected))
+            #self.debug('In TauGraphicsScene.selectGraphicItem(%s): already selected: %s'%(iname,selected))
             if not iname.strip():
                 self.clearSelection()
                 return False
             elif any(iname not in i for i in selected): 
                 self.clearSelection()
             else: 
-                self.info('In TauGraphicsScene.selectGraphicItem(%s): already selected!'%item_name)
+                self.debug('In TauGraphicsScene.selectGraphicItem(%s): already selected!'%item_name)
                 return True
         if any(isinstance(item_name,t) for t in (TaurusGraphicsItem,Qt.QGraphicsItem)):
             if not getattr(item_name,'_name', ''): 
@@ -425,7 +429,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         return retval
 
     def clearSelection(self):
-        self.debug('In clearSelection([%d])'%len(self._selectedItems))
+        #self.debug('In clearSelection([%d])'%len(self._selectedItems))
         for i in self._selection:
             i.hide()
             self.removeItem(i)
@@ -441,7 +445,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         If no picture is provided, a blue ellipse will be drawn around the selected object.
         h/w will be used for height/width of the drawn object.
         """
-        self.debug('In setSelectionMark(%s,%d,%d)'%(picture,w,h))
+        #self.debug('In setSelectionMark(%s,%d,%d)'%(picture,w,h))
         if picture is None: self.SelectionMark = None #Reset of previous icon generators
         else: self.SelectionMark = (lambda p=picture,x=w,y=h:self.getSelectionMark(p,x,y))
         return self.SelectionMark
@@ -488,7 +492,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         If h or w has a value the mark is drawn in the center of the region ((x,y)(x+w,y+h))
         """        
         #self.debug('%s has parent %s' % (item_name,getattr(item.parentItem(),'_name','ung')  if item.parentItem() else 'None'))
-        self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
+        #self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
 
         mark = self.getSelectionMark()
         self._selection.append(mark)
@@ -514,7 +518,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
                     x,y = x-.5*w,y-.5*h
             else: 
                 w,h = [.5*t for t in MAX_CIRCLE_SIZE]
-                self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
+                #self.debug('drawSelectionMark(): center and width,height are: (%d,%d),(%d,%d)' % (x,y,w,h))
             mark.setRect(*bound((x,y,w*2,h*2)))
             #mark.setRect(x,y,w*2,h*2)
         elif isinstance(mark,Qt.QGraphicsPixmapItem):
@@ -561,7 +565,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         return
 
     def getClass(self,clName,clParam,objName,standAlone=False):
-        #self.info('getClass(%s,%s,%s)'%(clName,clParam,objName))
+        #self.debug('getClass(%s,%s,%s)'%(clName,clParam,objName))
         if clName in globals():
             myclass = globals()[clName]
         elif clName in locals():
@@ -571,7 +575,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
                 myclass = getattr(Qt,clName)
             except:
                 try:
-                    wf = taurus.qt.qtgui.util.TaurusWidgetFactory()
+                    wf = TaurusWidgetFactory()
                     myclass = wf.getTaurusWidgetClass(clName)
                 except:
                     self.warning( "The class ",clName, "can not be found!\n" + '-'*80)
@@ -726,9 +730,10 @@ class TaurusGraphicsItem(TaurusBaseComponent):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def setModel(self,model):
-        #self.info('In %s.setModel(%s)'%(type(self).__name__,model))
+        #self.debug('In %s.setModel(%s)'%(type(self).__name__,model))
         self.setName(model)
-        if taurus.core.TaurusManager().findObjectClass(self._name) == taurus.core.tango.TangoDevice:
+        
+        if issubclass(Manager().findObjectClass(self._name), TaurusDevice):
             model = self._name+'/state'
         TaurusBaseComponent.setModel(self, model)        
         
@@ -765,7 +770,7 @@ class TaurusGraphicsItem(TaurusBaseComponent):
         return self.log_name + "(" + self.modelName + ")"
 
     def getModelClass(self):
-        return taurus.core.TaurusAttribute
+        return TaurusAttribute
 
 class TaurusGraphicsAttributeItem(TaurusGraphicsItem):
     """
@@ -861,7 +866,7 @@ class TaurusGraphicsStateItem(TaurusGraphicsItem):
             }
         #Parsing _map to manage visibility (a list of values for which the item is visible or not)
         if v and not self._map is None and self._currText in states:
-            #self.info('In TaurusGraphicsStateItem.updateStyle(): mapping %s'%self._currText)
+            #self.debug('In TaurusGraphicsStateItem.updateStyle(): mapping %s'%self._currText)
             if states[self._currText] == self._map[1]:
                 self.setVisible(self._map[2])
                 self._visible = self._map[2]
@@ -962,7 +967,7 @@ class TaurusTextAttributeItem(Qt.QGraphicsTextItem, TaurusGraphicsAttributeItem,
         self.call__init__(TaurusGraphicsAttributeItem, name, parent)
         
     def paint(self,painter,option,widget):
-        self.debug('TaurusTextAttributeItem(%s,%s,%s)'%(self.getName(),self._currText,self._currHtmlText))
+        #self.debug('TaurusTextAttributeItem(%s,%s,%s)'%(self.getName(),self._currText,self._currHtmlText))
         if self._currHtmlText:
             self.setHtml(self._currHtmlText)
         else:
@@ -970,8 +975,6 @@ class TaurusTextAttributeItem(Qt.QGraphicsTextItem, TaurusGraphicsAttributeItem,
         Qt.QGraphicsTextItem.paint(self,painter,option,widget)
 
 
-import taurus.core
-
 TYPE_TO_GRAPHICS = { 
     None : { "Rectangle"      : Qt.QGraphicsRectItem,
              "RoundRectangle" : Qt.QGraphicsRectItem,
@@ -983,7 +986,7 @@ TYPE_TO_GRAPHICS = {
              "SwingObject"    : Qt.QGraphicsRectItem, 
              "Image"          : Qt.QGraphicsPixmapItem, },
              
-    taurus.core.TaurusDevice : { "Rectangle"      : TaurusRectStateItem,
+    TaurusDevice : { "Rectangle"      : TaurusRectStateItem,
                            "RoundRectangle" : TaurusRectStateItem,
                            "Ellipse"        : TaurusEllipseStateItem,
                            "Polyline"       : TaurusPolygonStateItem, 
@@ -993,7 +996,7 @@ TYPE_TO_GRAPHICS = {
                            "SwingObject"    : TaurusTextAttributeItem,
                            "Image"          : Qt.QGraphicsPixmapItem, },
 
-    taurus.core.TaurusAttribute : { "Rectangle"      : TaurusRectStateItem,
+    TaurusAttribute : { "Rectangle"      : TaurusRectStateItem,
                            "RoundRectangle" : TaurusRectStateItem,
                            "Ellipse"        : TaurusEllipseStateItem,
                            "Polyline"       : TaurusPolygonStateItem, 
@@ -1046,8 +1049,8 @@ class TaurusBaseGraphicsFactory:
     def getGraphicsClassItem(self,cls,type_):
         ncls = cls
         try:
-            if   issubclass(cls, taurus.core.TaurusDevice):    ncls = taurus.core.TaurusDevice
-            elif issubclass(cls, taurus.core.TaurusAttribute): ncls = taurus.core.TaurusAttribute
+            if   issubclass(cls, TaurusDevice):    ncls = TaurusDevice
+            elif issubclass(cls, TaurusAttribute): ncls = TaurusAttribute
         except:
             pass
         ncls = TYPE_TO_GRAPHICS.get(ncls,TYPE_TO_GRAPHICS.get(None)).get(type_)
@@ -1067,7 +1070,7 @@ class TaurusBaseGraphicsFactory:
                 nname = name.split(':',1)[-1]
                 params[self.getNameParam()] = name = nname
             if name.lower().endswith('/state'): name = name.rsplit('/',1)[0]
-            cls = taurus.core.TaurusManager().findObjectClass(name)
+            cls = Manager().findObjectClass(name)
         else: 
             if name: self.debug('%s does not match a tango name'%name)
         klass = self.getGraphicsClassItem(cls, type_)
diff --git a/lib/taurus/qt/qtgui/image/__init__.py b/lib/taurus/qt/qtgui/image/__init__.py
index 12d5763..b0e9035 100644
--- a/lib/taurus/qt/qtgui/image/__init__.py
+++ b/lib/taurus/qt/qtgui/image/__init__.py
@@ -32,6 +32,6 @@ try:
 except:
     from taurus.qt.qtgui.display import create_fallback as __create
     TaurusQubDataImageDisplay = __create("TaurusQubDataImageDisplay")
-    import taurus.core.util
-    _logger = taurus.core.util.Logger(__name__)
+    import taurus.core.util.log
+    _logger = taurus.core.util.log.Logger(__name__)
     _logger.debug("Qub widgets could not be initialized", exc_info=1)
diff --git a/lib/taurus/qt/qtgui/image/taurusqub.py b/lib/taurus/qt/qtgui/image/taurusqub.py
index 01384e8..ca33f92 100644
--- a/lib/taurus/qt/qtgui/image/taurusqub.py
+++ b/lib/taurus/qt/qtgui/image/taurusqub.py
@@ -119,11 +119,11 @@ class TaurusQubDataImageDisplay(QubDataImageDisplay, TaurusBaseWidget):
         return True
     
     def getModelClass(self):
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
     
     def handleEvent(self, evt_src, evt_type, evt_value):
         if self._updateAction.state():
-            if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic):
+            if evt_type in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
                 data = self.getModelObj().getImageData()
                 if data:
                     data = data[self._image_attr_name][1]
@@ -190,7 +190,7 @@ def main():
     panel.setLayout(l)
     if not models:
         from taurus.qt.qtgui.panel import TaurusModelChooser
-        models, ok = TaurusModelChooser.modelChooserDlg(panel, [taurus.core.TaurusElementType.Attribute])
+        models, ok = TaurusModelChooser.modelChooserDlg(panel, [taurus.core.taurusbasetypes.TaurusElementType.Attribute])
         if not ok:
             models = []
     for model in models:
diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py
index d393876..f7dbe31 100644
--- a/lib/taurus/qt/qtgui/input/tauruscombobox.py
+++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py
@@ -197,7 +197,7 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
         model = widget.getModelObj()
         if model:
             widget.fireEvent( model,
-                             taurus.core.TaurusEventType.Periodic,
+                             taurus.core.taurusbasetypes.TaurusEventType.Periodic,
                              model.getValueObj()
             )
 
@@ -262,11 +262,11 @@ class TaurusAttrListComboBox(Qt.QComboBox, TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     
     def getModelClass(self):
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
             
     def handleEvent(self, evt_src, evt_type, evt_value):
         self.clear()
-        if evt_type == taurus.core.TaurusEventType.Error:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
             return
         if not (evt_src is None or evt_value is None) :
             attrList = list(evt_value.value)
diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py
index 4509a0e..5a40862 100644
--- a/lib/taurus/qt/qtgui/input/tauruslineedit.py
+++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py
@@ -110,20 +110,20 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
         self.emitValueChanged()
 
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_type == taurus.core.TaurusEventType.Config:
-            if evt_value.min_alarm != taurus.core.TaurusConfiguration.no_min_alarm:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
+            if evt_value.min_alarm != taurus.core.taurusconfiguration.TaurusConfiguration.no_min_alarm:
                 self.__minAlarm = float(evt_value.min_alarm)
             else:
                 self.__minAlarm = -float("inf")
-            if evt_value.max_alarm != taurus.core.TaurusConfiguration.no_max_alarm:
+            if evt_value.max_alarm != taurus.core.taurusconfiguration.TaurusConfiguration.no_max_alarm:
                 self.__maxAlarm = float(evt_value.max_alarm)
             else:
                 self.__maxAlarm = float("inf")
-            if evt_value.min_value != taurus.core.TaurusConfiguration.no_min_value:
+            if evt_value.min_value != taurus.core.taurusconfiguration.TaurusConfiguration.no_min_value:
                 self.__minLimit = float(evt_value.min_value)
             else:
                 self.__minLimit = -float("inf")
-            if evt_value.max_value != taurus.core.TaurusConfiguration.no_max_value:
+            if evt_value.max_value != taurus.core.taurusconfiguration.TaurusConfiguration.no_max_value:
                 self.__maxLimit = float(evt_value.max_value)
             else:
                 self.__maxLimit = float("inf")
@@ -276,7 +276,7 @@ class TaurusConfigLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
         self.valueChanged()
 
     def getModelClass(self):
-        return taurus.core.TaurusConfiguration
+        return taurus.core.taurusconfiguration.TaurusConfiguration
 
     def setValue(self, v):
         model = self.getModelObj()
diff --git a/lib/taurus/qt/qtgui/input/tauruswheel.py b/lib/taurus/qt/qtgui/input/tauruswheel.py
index b3acab0..326e7d0 100644
--- a/lib/taurus/qt/qtgui/input/tauruswheel.py
+++ b/lib/taurus/qt/qtgui/input/tauruswheel.py
@@ -51,7 +51,7 @@ class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
         
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_type == taurus.core.TaurusEventType.Config and not evt_value is None:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config and not evt_value is None:
             f = evt_value.format.lower()
             if f[-1] not in ('d', 'f', 'g'):
                 raise ValueError("'%s' format unsupported" % f)
diff --git a/lib/taurus/qt/qtgui/model/qbasemodel.py b/lib/taurus/qt/qtgui/model/qbasemodel.py
index eee5cef..3b17192 100644
--- a/lib/taurus/qt/qtgui/model/qbasemodel.py
+++ b/lib/taurus/qt/qtgui/model/qbasemodel.py
@@ -293,7 +293,7 @@ class QBaseModelWidget(Qt.QMainWindow):
         statusbar = self.createStatusBar()
 
         for toolBar in toolBars:
-            toolBar.addSeparator()
+            #toolBar.addSeparator()
             self.addToolBar(toolBar)
         self.setContentsMargins(0, 0, 0, 0)
         self.setCentralWidget(self._viewWidget)
diff --git a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
index 2975e54..8714f26 100644
--- a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
+++ b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
@@ -27,14 +27,13 @@
 RawDataChooser.py:  widget for importing RawData (from file or from a function)
 """
 
-import sys
 import numpy
 
 from taurus.qt import Qt
+from taurus.core.util.safeeval import SafeEvaluator
 
-from taurus.core.util import SafeEvaluator
+from .ui import ui_RawDataChooser
 
-from ui import ui_RawDataChooser
 
 class QRawDataWidget(Qt.QWidget, ui_RawDataChooser.Ui_RawDataChooser):
     
diff --git a/lib/taurus/qt/qtgui/panel/taurusattributechooser.py b/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
index 0c8d288..96e67f8 100644
--- a/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
+++ b/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
@@ -31,13 +31,12 @@ __all__ = ["TaurusAttributeChooser"]
 
 __docformat__ = 'restructuredtext'
 
-import sys
 from taurus.qt import Qt
 
 from taurus.qt.qtgui.base import TaurusBaseWidget
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
 
-from ui.ui_AttributeChooser import *
+from .ui.ui_AttributeChooser import *
 
 class TaurusAttributeChooser(Qt.QWidget, TaurusBaseWidget):
     
@@ -209,7 +208,8 @@ def main(args):
     win.show()
     app.connect(app, Qt.SIGNAL("lastWindowClosed()"),app,Qt.SLOT("quit()"))
 
-    sys.exit(app.exec_())
+    return app.exec_()
 
 if __name__=="__main__":
-    main(sys.argv)
+    import sys
+    sys.exit(main(sys.argv))
diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
index 8cc3c48..a545c3f 100644
--- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
@@ -34,11 +34,11 @@ __docformat__ = 'restructuredtext'
 import re,traceback
 from taurus.qt import Qt
 
-import taurus.core
-#from taurus.qt.qtgui.container import TaurusMainWindow
-
 import taurus.qt.qtgui.resource
-                    
+from taurus.core.taurusbasetypes import TaurusSWDevState, TaurusElementType
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusdatabase import TaurusDevInfo
 from taurus.qt.qtgui.container import TaurusWidget, TaurusMainWindow
 from taurus.qt.qtgui.display import TaurusValueLabel as LABEL_CLASS #@todo: TaurusValueLabel is deprecated. Use TaurusLabel instead
 from taurus.qt.qtgui.display import TaurusStateLed as LED_CLASS #@todo: TaurusStateLed is deprecated. Use TaurusLed instead
@@ -151,11 +151,14 @@ class TaurusDevicePanel(TaurusWidget):
         """ 
         It will set the command filters
         filters will be like: {device_regexp:[command_regexps]}
-        example:  {'.*/IPCT-.*': (
-                    ('setmode',('SERIAL','LOCAL','STEP','FIXED','START','PROTECT')), 
-                    ('onhv1',()), ('offhv1',()), ('onhv2',()), ('offhv2',()), 
-                    ('sendcommand',())
-                ),}
+        example::
+        
+          {'.*/IPCT-.*': (
+                           ('setmode',('SERIAL','LOCAL','STEP','FIXED','START','PROTECT')), 
+                           ('onhv1',()), ('offhv1',()), ('onhv2',()), ('offhv2',()), 
+                           ('sendcommand',())
+                         ),}
+                         
         """
         klass._command_filter.update(filters)        
         
@@ -264,10 +267,10 @@ class TaurusDevicePanel(TaurusWidget):
         elif raw is None or not model or not modelclass: 
             if self.getModel(): self.detach()
             return
-        elif issubclass(modelclass,taurus.core.TaurusAttribute):
+        elif issubclass(modelclass, TaurusAttribute):
             #if model.lower().endswith('/state'): 
             model = model.rsplit('/',1)[0]
-        elif not issubclass(modelclass,taurus.core.TaurusDevice):
+        elif not issubclass(modelclass, TaurusDevice):
             self.warning('TaurusDevicePanel accepts only Device models')
             return
         try:
@@ -396,7 +399,7 @@ class TaurusDevicePanel(TaurusWidget):
 
 
 def filterNonExported(obj):
-    if not isinstance(obj,taurus.core.TaurusDevInfo) or obj.exported():
+    if not isinstance(obj, TaurusDevInfo) or obj.exported():
         return obj
     return None
 
@@ -420,8 +423,8 @@ class TaurusDevPanel(TaurusMainWindow):
         import taurus.qt.qtgui.tree
         TaurusDbTreeWidget = taurus.qt.qtgui.tree.TaurusDbTreeWidget
 
-        self.deviceTree = TaurusDbTreeWidget(perspective=taurus.core.TaurusElementType.Device)
-        self.deviceTree.getQModel().setSelectables([taurus.core.TaurusElementType.Member])
+        self.deviceTree = TaurusDbTreeWidget(perspective=TaurusElementType.Device)
+        self.deviceTree.getQModel().setSelectables([TaurusElementType.Member])
         #self.deviceTree.insertFilter(filterNonExported)
         self.setCentralWidget(self.deviceTree)        
         
@@ -467,7 +470,7 @@ class TaurusDevPanel(TaurusMainWindow):
         
     def onItemSelectionChanged(self, current, previous):
         itemData = current.itemData()
-        if isinstance(itemData, taurus.core.TaurusDevInfo):
+        if isinstance(itemData, TaurusDevInfo):
             self.onDeviceSelected(itemData)
         
     def onDeviceSelected(self, devinfo):
@@ -491,14 +494,14 @@ class TaurusDevPanel(TaurusMainWindow):
         dev.state()
         state = dev.getSWState()
         #test the connection
-        if state == taurus.core.TaurusSWDevState.Running:
+        if state == TaurusSWDevState.Running:
             msg = 'Connected to "%s"'%devname
             self.statusBar().showMessage(msg)
             self._ui.attrDW.setWindowTitle('Attributes - %s'%devname)
             self._ui.commandsDW.setWindowTitle('Commands - %s'%devname)
         else:
             #reset the model if the connection failed
-            msg = 'Connection to "%s" failed (state = %s)'%(devname, taurus.core.TaurusSWDevState.whatis(state))
+            msg = 'Connection to "%s" failed (state = %s)' % (devname, TaurusSWDevState.whatis(state))
             self.statusBar().showMessage(msg)
             self.info(msg)
             Qt.QMessageBox.warning(self, "Device unreachable", msg)
diff --git a/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py b/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
index b45e99d..9fcc877 100644
--- a/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
@@ -36,7 +36,7 @@ import taurus.core.util
 import taurus.qt.qtgui.base
 import taurus.qt.qtgui.resource
 
-ElemType = taurus.core.TaurusElementType
+ElemType = taurus.core.taurusbasetypes.TaurusElementType
 getElementTypeIcon = taurus.qt.qtgui.resource.getElementTypeIcon
 getPixmap = taurus.qt.qtgui.resource.getPixmap
 getThemeIcon = taurus.qt.qtgui.resource.getThemeIcon
@@ -73,25 +73,25 @@ class BaseElementFilter(BaseFilter):
 
 class DeviceFilter(BaseElementFilter):
     
-    def __init__(self, re_expr, func=taurus.core.TaurusDevInfo.name):
+    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusDevInfo.name):
         super(DeviceFilter, self).__init__(re_expr, func=func)
 
 
 class DeviceClassFilter(BaseElementFilter):
     
-    def __init__(self, re_expr, func=taurus.core.TaurusDevClassInfo.name):
+    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusDevInfo.name):
         super(DeviceClassFilter, self).__init__(re_expr, func=func)
 
 
 class ServerFilter(BaseElementFilter):
 
-    def __init__(self, re_expr, func=taurus.core.TaurusServInfo.name):
+    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusServInfo.name):
         super(ServerFilter, self).__init__(re_expr, func=func)
 
 
 class AttributeFilter(BaseElementFilter):
     
-    def __init__(self, re_expr, func=taurus.core.TaurusAttrInfo.name):
+    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusAttrInfo.name):
         super(AttributeFilter, self).__init__(re_expr, func=func)
 
 
@@ -110,27 +110,27 @@ class KlassFilter(BaseFilter):
 def getFilter(type, re_expr=None):
     if re_expr is None:
         if type == ElemType.Device:
-            return KlassFilter(taurus.core.TaurusDevInfo)
+            return KlassFilter(taurus.core.taurusdatabase.TaurusDevInfo)
         elif type == ElemType.Server:
-            return KlassFilter(taurus.core.TaurusServInfo)
+            return KlassFilter(taurus.core.taurusdatabase.TaurusServInfo)
         elif type == ElemType.DeviceClass:
-            return KlassFilter(taurus.core.TaurusDevClassInfo)
+            return KlassFilter(taurus.core.taurusdatabase.TaurusDevInfo)
         return None
 
     if type == ElemType.Device:
         return DeviceFilter(re_expr)
     elif type == ElemType.Domain:
-        return DeviceFilter(re_expr, taurus.core.TaurusDevInfo.domain)
+        return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.domain)
     elif type == ElemType.Family:
-        return DeviceFilter(re_expr, taurus.core.TaurusDevInfo.family)
+        return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.family)
     elif type == ElemType.Member:
-        return DeviceFilter(re_expr, taurus.core.TaurusDevInfo.member)
+        return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.member)
     elif type == ElemType.Server:
         return ServerFilter(re_expr)
     elif type == ElemType.ServerName:
-        return ServerFilter(re_expr, taurus.core.TaurusServInfo.serverName)
+        return ServerFilter(re_expr, taurus.core.taurusdatabase.TaurusServInfo.serverName)
     elif type == ElemType.ServerInstance:
-        return ServerFilter(re_expr, taurus.core.TaurusServInfo.serverInstance)
+        return ServerFilter(re_expr, taurus.core.taurusdatabase.TaurusServInfo.serverInstance)
     elif type == ElemType.DeviceClass:
         return DeviceClassFilter(re_expr)
     elif type == ElemType.Attribute:
@@ -284,7 +284,7 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.TaurusDatabase
+        return taurus.core.taurusdatabase.TaurusDatabase
 
     #: This property holds the unique URI string representing the model name 
     #: with which this widget will get its data from. The convention used for 
@@ -367,7 +367,7 @@ class TaurusFilterPanelOld2(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.TaurusDatabase
+        return taurus.core.taurusdatabase.TaurusDatabase
 
     def setModel(self, m):
         taurus.qt.qtgui.base.TaurusBaseWidget.setModel(self, m)
@@ -655,7 +655,7 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.TaurusDatabase
+        return taurus.core.taurusdatabase.TaurusDatabase
 
     def setModel(self, m):
         taurus.qt.qtgui.base.TaurusBaseWidget.setModel(self, m)
diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py
index 16f1e38..8cd7bb0 100644
--- a/lib/taurus/qt/qtgui/panel/taurusform.py
+++ b/lib/taurus/qt/qtgui/panel/taurusform.py
@@ -554,7 +554,7 @@ class TaurusCommandsForm(TaurusWidget):
         
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
         
     def _updateCommandWidgets(self, *args):
         '''
@@ -563,7 +563,7 @@ class TaurusCommandsForm(TaurusWidget):
         '''
         #self.debug('In TaurusCommandsForm._updateCommandWidgets())')
         dev = self.getModelObj()
-        if dev is None or dev.getSWState() != taurus.core.TaurusSWDevState.Running:
+        if dev is None or dev.getSWState() != taurus.core.taurusbasetypes.TaurusSWDevState.Running:
             self.debug('Cannot connect to device')
             self._clearFrame()
             return
@@ -732,13 +732,13 @@ class TaurusAttrForm(TaurusWidget):
         
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
     
     def _updateAttrWidgets(self):
         '''Populates the form with an item for each of the attributes shown
         '''
         dev = self.getModelObj()
-        if dev is None or dev.getSWState() != taurus.core.TaurusSWDevState.Running:
+        if dev is None or dev.getSWState() != taurus.core.taurusbasetypes.TaurusSWDevState.Running:
             self.debug('Cannot connect to device')
             self._form.setModel([])
             return
@@ -934,8 +934,8 @@ def taurusFormMain():
     dialog.addActions ((saveConfigAction, loadConfigAction, quitApplicationAction) )
     
     #set the default map for this installation
-    from taurus.TaurusCustomSettings import T_FORM_CUSTOM_WIDGET_MAP
-    dialog.setCustomWidgetMap(T_FORM_CUSTOM_WIDGET_MAP)
+    from taurus import tauruscustomsettings
+    dialog.setCustomWidgetMap(getattr(tauruscustomsettings,'T_FORM_CUSTOM_WIDGET_MAP',{}))
     
     #set a model list from the command line or launch the chooser  
     if options.config_file is not None: 
diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
index 50008d6..dc6d898 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
@@ -33,7 +33,7 @@ from taurus.qt import Qt
 import taurus.core
 from taurus.qt.qtgui.container import TaurusWidget
 from taurus.qt.qtgui.tree import TaurusDbTreeWidget
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
 from taurusmodellist import TaurusModelList
 import taurus.qt.qtgui.resource
 
@@ -41,12 +41,12 @@ import taurus.qt.qtgui.resource
 class TaurusModelSelectorTree(TaurusWidget):
     def __init__(self, parent = None, selectables=None, buttonsPos=None, designMode = None):
         TaurusWidget.__init__(self, parent)
-        if selectables is None: selectables = [taurus.core.TaurusElementType.Attribute, taurus.core.TaurusElementType.Member, 
-                                               taurus.core.TaurusElementType.Device]
+        if selectables is None: selectables = [taurus.core.taurusbasetypes.TaurusElementType.Attribute, taurus.core.taurusbasetypes.TaurusElementType.Member, 
+                                               taurus.core.taurusbasetypes.TaurusElementType.Device]
         self._selectables = selectables
                         
         #tree
-        self._deviceTree = TaurusDbTreeWidget(perspective=taurus.core.TaurusElementType.Device)
+        self._deviceTree = TaurusDbTreeWidget(perspective=taurus.core.taurusbasetypes.TaurusElementType.Device)
         self._deviceTree.getQModel().setSelectables(self._selectables)
         self._deviceTree.setUseParentModel(True)
         
@@ -99,9 +99,9 @@ class TaurusModelSelectorTree(TaurusWidget):
         selected = []
         for item in self._deviceTree.selectedItems():
             nfo = item.itemData()
-            if isinstance(nfo, taurus.core.TaurusDevInfo):
+            if isinstance(nfo, taurus.core.taurusdatabase.TaurusDevInfo):
                 selected.append(nfo.fullName())
-            elif isinstance(nfo, taurus.core.TaurusAttrInfo):
+            elif isinstance(nfo, taurus.core.taurusdatabase.TaurusAttrInfo):
                 selected.append( "%s/%s"%(nfo.device().fullName(),nfo.name()) )
             else: 
                 self.info("Unknown item '%s' in selection"%repr(nfo))
@@ -248,7 +248,7 @@ class TaurusModelChooser(TaurusWidget):
     def _onUpdateModels(self):
         models = self.getListedModels()
         self.emit(Qt.SIGNAL("updateModels"), models)
-        if taurus.core.TaurusElementType.Attribute in self.tree._selectables:
+        if taurus.core.taurusbasetypes.TaurusElementType.Attribute in self.tree._selectables:
             self.emit(Qt.SIGNAL("UpdateAttrs"), models) #for backwards compatibility with the old AttributeChooser
     
     def setSingleModelMode(self, single):
diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py
index 1a3b4a8..9780691 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py
@@ -33,7 +33,8 @@ import copy
 
 from taurus.qt import Qt
 import taurus
-from taurus.core import TaurusException, TaurusElementType
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusexception import TaurusException
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
 from taurus.qt.qtgui.resource import getThemeIcon, getElementTypeIcon, getIcon
 
diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py
index 47ef841..f29c30a 100644
--- a/lib/taurus/qt/qtgui/panel/taurusvalue.py
+++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py
@@ -64,8 +64,8 @@ class DefaultLabelWidget(TaurusLabel):
     The base class used by default for showing the label of a TaurusValue. 
         
     .. note:: It only makes sense to use this class as a part of a TaurusValue,
-              since it assumes that it can get a reference to a TaurusValue via the
-              :meth:`getTaurusValueBuddy` member
+              since it assumes that it can get a reference to a TaurusValue via 
+              the :meth:`getTaurusValueBuddy` member
     '''
     
     _dragEnabled=True
@@ -83,10 +83,10 @@ class DefaultLabelWidget(TaurusLabel):
             return TaurusLabel.setModel(self, None)
         try: config = self.taurusValueBuddy().getLabelConfig()
         except Exception: config = 'label'
-        if self.taurusValueBuddy().getModelClass() == taurus.core.TaurusAttribute:
+        if self.taurusValueBuddy().getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
             config = self.taurusValueBuddy().getLabelConfig()
             TaurusLabel.setModel(self, model + "?configuration=%s"%config)
-        elif self.taurusValueBuddy().getModelClass() == taurus.core.TaurusDevice:
+        elif self.taurusValueBuddy().getModelClass() == taurus.core.taurusdevice.TaurusDevice:
             TaurusLabel.setModel(self, model + "/state?configuration=dev_alias")
     
     def sizeHint(self):
@@ -114,9 +114,9 @@ class DefaultLabelWidget(TaurusLabel):
         '''reimplemented to use the taurusValueBuddy model instead of its own model'''
         mimeData = TaurusLabel.getModelMimeData(self)
         mimeData.setData(TAURUS_MODEL_MIME_TYPE, self.taurusValueBuddy().getModelName())
-        if self.taurusValueBuddy().getModelClass() == taurus.core.TaurusDevice:
+        if self.taurusValueBuddy().getModelClass() == taurus.core.taurusdevice.TaurusDevice:
             mimeData.setData(TAURUS_DEV_MIME_TYPE, self.taurusValueBuddy().getModelName())
-        elif self.taurusValueBuddy().getModelClass() == taurus.core.TaurusAttribute:
+        elif self.taurusValueBuddy().getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
             mimeData.setData(TAURUS_ATTR_MIME_TYPE, self.taurusValueBuddy().getModelName())
         return mimeData
     
@@ -387,7 +387,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
             if returnAll: return [ExpandingLabel]
             else: return ExpandingLabel
         
-        if self.getModelClass() == taurus.core.TaurusAttribute:
+        if self.getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
             ##The model is an attribute
             config = modelobj.getConfig()
             #print "---------ATTRIBUTE OBJECT:----------\n",modelobj.read()
@@ -446,7 +446,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
                  default one.
         '''
 #        if self._customWidget is not None: return None
-        if self.isReadOnly() or self.getModelClass() != taurus.core.TaurusAttribute: 
+        if self.isReadOnly() or self.getModelClass() != taurus.core.taurusattribute.TaurusAttribute: 
             if returnAll: return []
             else: return None
         modelobj = self.getModelObj()
@@ -483,12 +483,12 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
     
     def getDefaultUnitsWidgetClass(self):
 ##        if self._customWidget is not None: return None
-#        if self.getModelClass() != taurus.core.TaurusAttribute:
+#        if self.getModelClass() != taurus.core.taurusattribute.TaurusAttribute:
 #            return DefaultUnitsWidget
         return DefaultUnitsWidget
     
     def getDefaultCustomWidgetClass(self):
-        if self.getModelClass() == taurus.core.TaurusAttribute:
+        if self.getModelClass() == taurus.core.taurusattribute.TaurusAttribute:
             return None
         try:
             key = self.getModelObj().getHWObj().info().dev_class
@@ -572,41 +572,41 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
 
     def labelWidgetClassFactory(self, classID):
         if self._customWidget is not None: return None
-        if classID is None or classID is 'None': return None
+        if classID is None or classID == 'None': return None
         if isinstance(classID, type): return classID
         elif str(classID) == 'Auto': return self.getDefaultLabelWidgetClass()
         else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
 
     def readWidgetClassFactory(self, classID):
         if self._customWidget is not None: return None
-        if classID is None or classID is 'None': return None
+        if classID is None or classID == 'None': return None
         if isinstance(classID, type): return classID
         elif str(classID) == 'Auto': return self.getDefaultReadWidgetClass()
         else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
     
     def writeWidgetClassFactory(self, classID):
         if self._customWidget is not None: return None
-        if classID is None or classID is 'None': return None
+        if classID is None or classID == 'None': return None
         if isinstance(classID, type): return classID
         elif str(classID) == 'Auto': return self.getDefaultWriteWidgetClass()
         else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
         
     def unitsWidgetClassFactory(self, classID):
         if self._customWidget is not None: return None
-        if classID is None or classID is 'None': return None
+        if classID is None or classID == 'None': return None
         if isinstance(classID, type): return classID
         elif str(classID) == 'Auto': return self.getDefaultUnitsWidgetClass()
         else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
         
     def customWidgetClassFactory(self, classID):
-        if classID is None or classID is 'None': return None
+        if classID is None or classID == 'None': return None
         if isinstance(classID, type): return classID
         elif str(classID) == 'Auto': return self.getDefaultCustomWidgetClass()
         else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
         
     def extraWidgetClassFactory(self, classID):
         if self._customWidget is not None: return None
-        if classID is None or classID is 'None': return None
+        if classID is None or classID == 'None': return None
         if isinstance(classID, type): return classID
         elif str(classID) == 'Auto': return self.getDefaultExtraWidgetClass()
         else: return TaurusWidgetFactory().getTaurusWidgetClass(classID)
@@ -920,9 +920,9 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
     def setModel(self, model):
         try:
             taurus.Attribute(model)
-            self.__modelClass = taurus.core.TaurusAttribute
+            self.__modelClass = taurus.core.taurusattribute.TaurusAttribute
         except:
-            self.__modelClass = taurus.core.TaurusDevice
+            self.__modelClass = taurus.core.taurusdevice.TaurusDevice
         TaurusBaseWidget.setModel(self,model)
         if not self._designMode:     #in design mode, no subwidgets are created
             self.updateCustomWidget()
@@ -936,7 +936,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
         """Reimplemented from :meth:`TaurusBaseWidget.handleEvent` 
         to update subwidgets on config events
         """
-        if evt_type == taurus.core.TaurusEventType.Config and not self._designMode:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config and not self._designMode:
             self.updateCustomWidget()
             self.updateLabelWidget()
             self.updateReadWidget()
@@ -1100,13 +1100,14 @@ if __name__ == "__main__":
     #models=['bl97/pc/dummy-01/CurrentSetpoint','bl97/pc/dummy-02/RemoteMode']
     #models=['sys/tg_test/1/state','sys/tg_test/1/status','sys/tg_test/1/short_scalar','sys/tg_test/1']
     #models =  ['sys/tg_test/1']+['sys/tg_test/1/%s_scalar'%s for s in ('float','short','string','long','boolean') ]
-    #models =  ['sys/tg_test/1/float_scalar','sys/tg_test/1/double_scalar']
+    #models =  ['sys/tg_test/1/float_scalar','sys/tg#_test/1/double_scalar']
     
     container.setModel(models)
     
-    #container.getTaurusValueByIndex(0).writeWidget().setDangerMessage('BOOO') #uncomment to test the dangerous operation support
-    #container.getTaurusValueByIndex(0).readWidget().setShowState(True)
-    #container.getTaurusValueByIndex(0).setWriteWidgetClass(TaurusValueLineEdit)
+    #container.getItemByIndex(0).writeWidget().setDangerMessage('BOOO') #uncomment to test the dangerous operation support
+    #container.getItemByIndex(0).readWidget().setShowState(True)
+    #container.getItemByIndex(0).setWriteWidgetClass(TaurusValueLineEdit)
+    #container[0].setWriteWidgetClass('None')
     #container.setModel(models)
     
     container.setModifiableByUser(True)
diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py
index 14d5183..6211e2a 100644
--- a/lib/taurus/qt/qtgui/plot/curveprops.py
+++ b/lib/taurus/qt/qtgui/plot/curveprops.py
@@ -69,7 +69,7 @@ X, Y, TITLE, VIS = range(NUMCOLS)
 SRC_ROLE =  Qt.Qt.UserRole + 1
 PROPS_ROLE = Qt.Qt.UserRole + 2
 
-ATTRNAMEVALIDATOR = taurus.core.AttributeNameValidator()
+ATTRNAMEVALIDATOR = taurus.core.taurusvalidator.AttributeNameValidator()
 
 class Component(object):
     def __init__(self, src):
diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
index 40f58b1..f37d063 100644
--- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
+++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
@@ -32,7 +32,7 @@ curvesAppearanceChooserDlg.py:
 from taurus.qt import Qt, Qwt5
 from ui import ui_curvesAppearanceChooser
 from taurus.qt.qtgui.resource import getIcon
-from taurus.core.util import CaselessDict
+from taurus.core.util.containers import CaselessDict
 import copy
 
 NamedLineStyles={None:"",
diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py
index 6c7ba0b..95023d3 100644
--- a/lib/taurus/qt/qtgui/plot/taurusplot.py
+++ b/lib/taurus/qt/qtgui/plot/taurusplot.py
@@ -38,7 +38,8 @@ from taurus.qt import Qt, Qwt5
 import PyTango
 
 import taurus.core
-from taurus.core.util import SafeEvaluator, LoopList, CaselessDict, CaselessList
+from taurus.core.util.containers import LoopList, CaselessDict, CaselessList
+from taurus.core.util.safeeval import SafeEvaluator
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
 from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
 from taurus.qt.qtgui.plot import TaurusPlotConfigDialog, FancyScaleDraw,\
@@ -63,7 +64,7 @@ class DummyLock(object):
         pass
 
 ##for debugging. Comment out in production
-#from taurus.core.util import TraceIt, DebugIt, InfoIt, WarnIt
+#from taurus.core.util.log import TraceIt, DebugIt, InfoIt, WarnIt
 
 
 DFT_CURVE_PENS = [Qt.QPen(Qt.Qt.red, 2),
@@ -152,7 +153,7 @@ class TaurusXValues(TaurusBaseComponent):
 
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def eventHandle(self, src, evt_type, val):
         '''see :meth:`TaurusBaseComponent.eventHandle`'''
@@ -236,7 +237,8 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
     information about which TaurusCurves are attached. Therefore the programmer
     should never attach/detach a TaurusCurve manually.
     '''
-    droppedEventsWarning = 3 #number of dropped events before issuing a warning
+    consecutiveDroppedEventsWarning = 3 #number consecutive of dropped events before issuing a warning (-1 for disabling)
+    droppedEventsWarning = -1 #absolute number of dropped events before issuing a warning (-1 for disabling)
     def __init__(self, name, xname=None, parent = None, rawData=None, optimized=False):
 
         Qwt5.QwtPlotCurve.__init__(self)
@@ -257,6 +259,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         self.__curveName = name
         self.isRawData= not(rawData is None)
         self.droppedEventsCount = 0
+        self.consecutiveDroppedEventsCount = 0
         if optimized:
             self.setPaintAttribute(self.PaintFiltered, True)
             self.setPaintAttribute(self.ClipPolygons, True)
@@ -479,7 +482,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
 
     def getModelClass(self):
         '''See :meth:`TaurusBaseComponent.getModelClass`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def getRawData(self):
         '''Returns the rawData
@@ -546,7 +549,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
             self._signalGen.emit(Qt.SIGNAL("dataChanged(const QString &)"), str(self.getModel()))
             return
 
-        if evt_type == taurus.core.TaurusEventType.Config:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
             self.updateTitle()
 
         value = val if isinstance(val, (PyTango.DeviceAttribute, taurus.core.taurusbasetypes.TaurusAttrValue)) else self.getModelValueObj()
@@ -568,13 +571,39 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         '''
         self.debug("Droping event. Reason %s", reason)
         self.droppedEventsCount += 1
+        self.consecutiveDroppedEventsCount += 1
+        mustwarn = False
         if self.droppedEventsCount == self.droppedEventsWarning:
+            mustwarn = True
             msg = ('At least %i events from model "%s" have being dropped. This attribute may have problems\n' + 
                    'Future occurrences will be silently ignored')%(self.droppedEventsWarning, self.modelName)
+            self.consecutiveDroppedEventsWarning = -1 #disable the consecutive Dropped events warning (we do not want it if we got this one)
+        if self.consecutiveDroppedEventsCount == self.consecutiveDroppedEventsWarning:
+            mustwarn = True
+            msg = ('At least %i consecutive events from model "%s" have being dropped. This attribute may have problems\n' + 
+                   'Future occurrences will be silently ignored')%(self.consecutiveDroppedEventsWarning, self.modelName)
+            self.consecutiveDroppedEventsWarning = -1 #disable the consecutive Dropped events warning 
+        if mustwarn:        
             self.warning(msg)
-            p = self.plot()
+            p = self.plot() 
             if p:
-                Qt.QMessageBox.warning(p, "Errors in curve %s"%self.titleText(compiled=True), msg, Qt.QMessageBox.Ok)
+                c = p.canvas()
+                msg2 = "Errors reading %s (%s)"%(self.titleText(compiled=True), self.modelName)
+                Qt.QToolTip.showText(c.mapToGlobal(c.pos()), msg2, c)
+                #Qt.QMessageBox.warning(p, "Errors in curve %s"%self.titleText(compiled=True), msg, Qt.QMessageBox.Ok)
+            
+
+        if self.droppedEventsCount == self.droppedEventsWarning:
+            mustwarn = True
+            msg = ('At least %i events from model "%s" have being dropped. This attribute may have problems\n' + 
+                   'Future occurrences will be silently ignored')%(self.droppedEventsWarning, self.modelName)
+            self.warning(msg)
+            p = self.plot() 
+            if p:
+                c = p.canvas()
+                msg = ''
+                Qt.QToolTip.showText(c.pos(), msg, c)
+                #Qt.QMessageBox.warning(p, "Errors in curve %s"%self.titleText(compiled=True), msg, Qt.QMessageBox.Ok)
             
     def _updateMarkers(self):
         '''updates min & max markers if needed'''
@@ -788,7 +817,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         '''see :meth:`TaurusBaseComponent.isReadOnly`'''
         return True
 
-    def getStats(self, limits=None, inclusive=(True,True), imin=None, imax=None):
+    def getStats(self, limits=None, inclusive=(True,True), imin=None, imax=None, ignorenans=True):
         '''
         returns a dict containing several descriptive statistics of a region of
         the curve defined by the limits given by the keyword arguments. It also
@@ -806,6 +835,8 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
                  
         Note that some of the values may be None if that cannot be computed.
         
+        Also, 
+        
         :param limits: (None or tuple<float,float>) tuple containing (min,max) limits. 
                         Points of the curve whose abscisa value is outside of 
                         these limits are ignored. If None is passed, the limit is not enforced
@@ -816,6 +847,8 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
                      the limit is not enforced 
         :param imax: (int) higest index to be considered. If None is given,
                      the limit is not enforced
+        :param ignorenans: (bool) if True (defaul), the points with NaN values are stripped 
+                     before calculating the stats
                      
         :return: (dict) A dict containing the stats.
         '''
@@ -833,10 +866,15 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
             if inclusive:
                 mask = (x>=xmin) * (x<=xmax)
             else:
-                mask = (x>xmin) * (x<xmax)
+                mask = (x>xmin) * (x<xmax)                
             x = x[mask]
-            y = y[mask]
+            y = y[mask]    
         
+        if ignorenans: 
+            mask = numpy.invert(numpy.isnan(x+y)) #we remove points where either x or y are Nan
+            x = x[mask]
+            y = y[mask]
+            
         ret = {'x'    : x, 
                'y'    : y,
                'points': x.size,
@@ -866,7 +904,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         :param show: (bool)
         """
         self._showMaxPeak = show
-        #self.fireEvent(taurus.core.TaurusEventType.Change) #force re-reading attribute to update peak values
+        #self.fireEvent(taurus.core.taurusbasetypes.TaurusEventType.Change) #force re-reading attribute to update peak values
 
     def showMinPeak(self,show):
         """Specififes if we want to show or not the min peak of the curve.
@@ -874,7 +912,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         :param show: (bool)
         """
         self._showMinPeak = show
-        #self.fireEvent(taurus.core.TaurusEventType.Change) #force re-reading attribute to update peak values
+        #self.fireEvent(taurus.core.taurusbasetypes.TaurusEventType.Change) #force re-reading attribute to update peak values
 
     def getYAxisStatus(self):
         '''returns either None (if the curve is not visible) or its yAxis (if it
@@ -1057,6 +1095,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def __initActions(self):
         '''Create and attach TaurusPlot actions'''
+        
+        #=======================================================================
+        ## This action is for debug only. Comment out when not debugging
+        #self._debugAction = Qt.QAction("Calculate statistics", None)
+        #self._debugAction.setShortcut(Qt.Qt.Key_D)
+        #self.connect(self._debugAction, Qt.SIGNAL("triggered()"), self.__debug)
+        #self.canvas().addAction(self._debugAction)
+        #=======================================================================
 
         self._dataInspectorAction = Qt.QAction("Data &Inspector mode", None)
         self._dataInspectorAction.setShortcut(Qt.Qt.Key_I)
@@ -1293,13 +1339,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def __debug(self, *args, **kwargs):
         '''put code here that you want to debug'''
-        #print '--------------'
-        ##self.setAxisCustomLabels(Qwt5.QwtPlot.xBottom , [[-2.4,"one position"],[-2.,"another"],[-1,"yet another"]], rotation = -45)
-        ##self.setAxisCustomLabels(Qwt5.QwtPlot.yLeft , [[0.5,"shorty"],[2.,"normalLbl"],[3,"looooooong Label"]])
-        #for i,z in enumerate((self._zoomer1,self._zoomer2)):
-        #    print i,'STACK:',z.zoomStack()
-        #    print i,'BRECT:',z.zoomRect()
-        #print '--------------'
+        print "!!!!!!!!!!!!!!!1",self.pos()
+        Qt.QToolTip.showText(self.mapToGlobal(self.pos()), "ASDASDASDASD DASDAS ASDA", self)
+        
         return
 
     def getDefaultAxisLabelsAlignment(self, axis, rotation):
@@ -2545,7 +2587,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             from taurus.qt.qtgui.panel import TaurusModelChooser
             self.DataImportDlg = Qt.QDialog(self)
             self.DataImportDlg.setWindowTitle("%s - Import Data"%(str(self.windowTitle())))
-            self.DataImportDlg.modelChooser = TaurusModelChooser(selectables=[taurus.core.TaurusElementType.Attribute])
+            self.DataImportDlg.modelChooser = TaurusModelChooser(selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute])
             from taurus.qt.qtgui.panel import QRawDataWidget
             self.DataImportDlg.rawDataChooser = QRawDataWidget()
 
@@ -3421,6 +3463,7 @@ def main():
     #if no models are passed, show the data import dialog
     if len(models) == 0 and options.config_file is None:
         w.showDataImportDlg()
+        
     sys.exit(app.exec_())
 
     
diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/plot/taurusplotconf.py
index 1c8b549..f849a71 100644
--- a/lib/taurus/qt/qtgui/plot/taurusplotconf.py
+++ b/lib/taurus/qt/qtgui/plot/taurusplotconf.py
@@ -73,7 +73,7 @@ class TaurusPlotConfDlg(Qt.QWidget):
         self.ui.propView = self.__replaceWidget(curveprops.CurvePropertiesView(), self.ui.propView)
         from taurus.qt.qtgui.panel import TaurusModelSelectorTree
         tangoTree =  TaurusModelSelectorTree(parent = None,
-                                            selectables=[taurus.core.TaurusElementType.Attribute], 
+                                            selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute], 
                                             buttonsPos=Qt.Qt.RightToolBarArea)
         self.ui.tangoTree = self.__replaceWidget(tangoTree, self.ui.tangoTree)
 #        l=self.ui.propView.parent().layout()
@@ -82,7 +82,7 @@ class TaurusPlotConfDlg(Qt.QWidget):
 #        l=self.ui.tangoTree.parent().layout()
 #        from taurus.qt.qtgui.panel import TaurusModelSelectorTree
 #        self.ui.tangoTree = TaurusModelSelectorTree(parent = None,
-#                                                     selectables=[taurus.core.TaurusElementType.Attribute], 
+#                                                     selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute], 
 #                                                     buttonsPos=Qt.Qt.RightToolBarArea)
 #        l.insertWidget(0, self.ui.tangoTree)
         ####################################
diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py
index 591f81e..7e5b651 100644
--- a/lib/taurus/qt/qtgui/plot/taurustrend.py
+++ b/lib/taurus/qt/qtgui/plot/taurustrend.py
@@ -36,7 +36,7 @@ import gc
 from taurus.qt import Qt, Qwt5
 
 import taurus.core
-from taurus.core.util import CaselessDict, CaselessList, ArrayBuffer
+from taurus.core.util.containers import CaselessDict, CaselessList, ArrayBuffer
 from taurus.qt.qtgui.base import TaurusBaseComponent
 from taurus.qt.qtgui.plot import TaurusPlot
 import PyTango
@@ -204,7 +204,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         attr = self.getModelObj()
         basetitle = basetitle.replace('<current_title>',self._titleText)
         basetitle = basetitle.replace('<model>',self.getModel())
-        if isinstance(attr, taurus.core.TaurusAttribute):
+        if isinstance(attr, taurus.core.taurusattribute.TaurusAttribute):
             basetitle = basetitle.replace('<label>',attr.label or '---')
             basetitle = basetitle.replace('<attr_name>',attr.name or '---')
             basetitle = basetitle.replace('<attr_fullname>',attr.getFullName() or '---')
@@ -252,7 +252,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def registerDataChanged(self,listener,meth):
         '''see :meth:`TaurusBaseComponent.registerDataChanged`'''
@@ -290,8 +290,15 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
                     v = float(v)
                     ntrends = 1
                 except:
-                    ntrends = len(v)
-        else: ntrends = len(self._curves)
+                    try:
+                        #Trying with spectrums
+                        ntrends = len(v)
+                    except:
+                        #Simply unreadable
+                        value = None
+                        ntrends = len(self._curves)
+        else: 
+            ntrends = len(self._curves)
         
         if self._xBuffer is None:
             self._xBuffer = ArrayBuffer(numpy.zeros(min(128,self._maxBufferSize), dtype='d'), maxSize=self._maxBufferSize )
@@ -350,12 +357,12 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         For documentation about the parameters of this method, see
         :meth:`TaurusBaseComponent.handleEvent`
         '''
-        if evt_type == taurus.core.TaurusEventType.Config:
+        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
             #self.setTitleText(self._titleText or self.parent().getDefaultCurvesTitle()) #this did not work well (it overwrites custom titles!)
             return
         else:
             model = evt_src if evt_src is not None else self.getModelObj()
-            if evt_type == taurus.core.TaurusEventType.Error:
+            if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
                 self._onDroppedEvent(reason='Error event')
                 if not self.parent().getUseArchiving(): return
                 else: value = None
@@ -364,7 +371,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
                 if not self.parent().getUseArchiving(): return
                 else: value = None
             else:
-                value = evt_value if isinstance(evt_value, (taurus.core.TaurusAttrValue, PyTango.DeviceAttribute)) else self.getModelValueObj()
+                value = evt_value if isinstance(evt_value, (taurus.core.taurusbasetypes.TaurusAttrValue, PyTango.DeviceAttribute)) else self.getModelValueObj()
                 if value is None or value.value is None: 
                     self._onDroppedEvent(reason='invalid value')
                     if not self.parent().getUseArchiving(): return
@@ -436,7 +443,10 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
             self.warning(msg)
             p = self.parent()
             if p:
-                Qt.QMessageBox.warning(p, "Errors in %s"%self._titleText, msg, Qt.QMessageBox.Ok)     
+                c = p.canvas()
+                msg2 = "Errors reading %s (%s)"%(self._titleText, self.modelName)
+                Qt.QToolTip.showText(c.mapToGlobal(c.pos()), msg2, c)
+                #Qt.QMessageBox.warning(p, "Errors in %s"%self._titleText, msg, Qt.QMessageBox.Ok)
 
     def isReadOnly(self):
         return True
@@ -508,7 +518,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         :param cache: (bool) set to True to do cache'd reading (by default is False)
         '''
         vobj=self.getModelValueObj(cache=False)
-        self.fireEvent(self, taurus.core.TaurusEventType.Periodic, vobj)
+        self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Periodic, vobj)
 
 
 class ScanTrendsSet(TaurusTrendsSet):
@@ -758,6 +768,15 @@ class ScanTrendsSet(TaurusTrendsSet):
         '''
         if not isinstance(qdoor, QDoor): qdoor = taurus.Device(qdoor)
         self.connect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
+        
+            
+    def disconnectQDoor(self, qdoor):
+        '''connects this ScanTrendsSet to a QDoor
+        
+        :param qdoor: (QDoor or str) either a QDoor instance or the QDoor name
+        '''
+        if not isinstance(qdoor, QDoor): qdoor = taurus.Device(qdoor)
+        self.disconnect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
     
     def getModel(self):
         return self.__model 
@@ -1078,6 +1097,10 @@ class TaurusTrend(TaurusPlot):
                 tset.unregisterDataChanged(self, self.curveDataChanged)
                 tset.forcedReadingTimer = None
                 tset.clearTrends(replot=False)
+                matchScan = re.search(r"scan:\/\/(.*)", name)
+                if matchScan:
+                    olddoorname = matchScan.group(1)
+                    tset.disconnectQDoor(olddoorname)
             if del_sets:        
                 self.autoShowYAxes()
                 
@@ -1363,7 +1386,7 @@ class TaurusTrend(TaurusPlot):
         self.addModels(models)
         for m in models:
             tset = self.trendSets[m]
-            tset.fireEvent(None, taurus.core.TaurusEventType.Change, None) #a fake event to force generating the curves
+            tset.fireEvent(None, taurus.core.taurusbasetypes.TaurusEventType.Change, None) #a fake event to force generating the curves
         #set curve properties
         self.setCurveAppearanceProperties(configdict["CurveProp"])
         self.updateLegend(force=True)
diff --git a/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py b/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
index 475af31..5aad067 100644
--- a/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
+++ b/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
@@ -37,13 +37,13 @@ import os
 
 from taurus.qt import Qt
 
-import taurus.core
-import taurus.core.util
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusSWDevHealth
+from taurus.core.util.log import Logger
 
-__LOGGER = taurus.core.util.Logger(__name__)
+__LOGGER = Logger(__name__)
 
-ElemType = taurus.core.TaurusElementType
-DevHealth = taurus.core.TaurusSWDevHealth
+ElemType = TaurusElementType
+DevHealth = TaurusSWDevHealth
 Size = Qt.QSize
 
 __INITIALIZED = False
@@ -243,15 +243,15 @@ def getElementTypeSize(elemType):
     return data[__IDX_ELEM_TYPE_SIZE]
 
 def getElementTypeIconName(elemType):
-    """Gets an icon name string for the given :class:`taurus.core.TaurusElementType`.
+    """Gets an icon name string for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`.
     
-    If an icon name cannot be found for the given :class:`taurus.core.TaurusElementType`,
+    If an icon name cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`,
     None is returned.
     
     :param elemType: (TaurusElementType) the taurus element type
     
     :return: (str) a string representing the icon name for the given 
-             :class:`taurus.core.TaurusElementType`"""
+             :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
     if elemType is None:
         return
     data = _ELEM_TYPE_MAP.get(elemType)
@@ -260,15 +260,15 @@ def getElementTypeIconName(elemType):
     return data[__IDX_ELEM_TYPE_ICON]
 
 def getElementTypeIcon(elemType, fallback=None):
-    """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.TaurusElementType`.
+    """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`.
     
-    If an icon cannot be found for the given :class:`taurus.core.TaurusElementType`,
+    If an icon cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`,
     fallback is returned.
     
     :param elemType: (TaurusElementType) the taurus element type
     :param fallback: (PyQt4.QtGui.QIcon) the fallback icon. Default is None.
     
-    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.TaurusElementType`"""
+    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
 
     themeIconName = getElementTypeIconName(elemType)
     icon = getThemeIcon(themeIconName)
@@ -277,15 +277,15 @@ def getElementTypeIcon(elemType, fallback=None):
     return icon
 
 def getElementTypePixmap(elemType, size=None):
-    """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.TaurusElementType`.
+    """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`.
     
-    If a pixmap cannot be found for the given :class:`taurus.core.TaurusElementType`,
+    If a pixmap cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`,
     fallback is returned.
     
     :param elemType: (TaurusElementType) the taurus element type
     :param fallback: (PyQt4.QtGui.QPixmap) the fallback pixmap. Default is None.
     
-    :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.TaurusElementType`"""
+    :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
 
     if elemType is None:
         return
@@ -312,15 +312,15 @@ def getSWDevHealthToolTip(elemHealth):
     return data[__IDX_HEALTH_TOOLTIP]
 
 def getSWDevHealthIcon(elemHealth, fallback=None):
-    """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.TaurusSWDevHealth`.
+    """Gets a PyQt4.QtGui.QIcon object for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`.
     
-    If an icon cannot be found for the given :class:`taurus.core.TaurusSWDevHealth`,
+    If an icon cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`,
     fallback is returned.
     
     :param elemHealth: (TaurusSWDevHealth) the taurus software device health status
     :param fallback: (PyQt4.QtGui.QIcon) the fallback icon. Default is None.
     
-    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.TaurusSWDevHealth`"""
+    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`"""
     if elemHealth is None:
         return
     data = _HEALTH_MAP.get(elemHealth)
@@ -334,15 +334,15 @@ def getSWDevHealthIcon(elemHealth, fallback=None):
     return icon
 
 def getSWDevHealthPixmap(elemHealth, size=None):
-    """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.TaurusSWDevHealth`.
+    """Gets a PyQt4.QtGui.QPixmap object for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`.
     
-    If a pixmap cannot be found for the given :class:`taurus.core.TaurusSWDevHealth`,
+    If a pixmap cannot be found for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`,
     fallback is returned.
     
     :param elemHealth: (TaurusSWDevHealth) the taurus software device health status
     :param fallback: (PyQt4.QtGui.QPixmap) the fallback icon. Default is None.
     
-    :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.TaurusSWDevHealth`"""
+    :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given :class:`taurus.core.taurusbasetypes.TaurusSWDevHealth`"""
     if elemHealth is None:
         return
     data = _HEALTH_MAP.get(elemHealth)
diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py
index e940136..2dd9eb8 100644
--- a/lib/taurus/qt/qtgui/table/qlogtable.py
+++ b/lib/taurus/qt/qtgui/table/qlogtable.py
@@ -36,9 +36,8 @@ import datetime
 import threading
 import socket
 
-
 import taurus
-from taurus.core.util import Logger
+from taurus.core.util.log import Logger
 from taurus.core.util.remotelogmonitor import LogRecordStreamHandler, \
     LogRecordSocketReceiver
 from taurus.core.util.decorator.memoize import memoized
@@ -54,12 +53,12 @@ LEVEL, TIME, MSG, NAME, ORIGIN = range(5)
 HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin'
 
 __LEVEL_BRUSH = {
-    taurus.Trace    : (Qt.QBrush(Qt.Qt.lightGray), Qt.QBrush(Qt.Qt.black)),
-    taurus.Debug    : (Qt.QBrush(Qt.Qt.green), Qt.QBrush(Qt.Qt.black)),
-    taurus.Info     : (Qt.QBrush(Qt.Qt.blue), Qt.QBrush(Qt.Qt.white)),
-    taurus.Warning  : (Qt.QBrush(Qt.QColor(255,165,0)), Qt.QBrush(Qt.Qt.black)),
-    taurus.Error    : (Qt.QBrush(Qt.Qt.red), Qt.QBrush(Qt.Qt.black)),
-    taurus.Critical : (Qt.QBrush(Qt.QColor(160,32,240)), Qt.QBrush(Qt.Qt.white)),
+    taurus.Trace    : (Qt.Qt.lightGray, Qt.Qt.black),
+    taurus.Debug    : (Qt.Qt.green, Qt.Qt.black),
+    taurus.Info     : (Qt.Qt.blue, Qt.Qt.white),
+    taurus.Warning  : (Qt.QColor(255,165,0), Qt.Qt.black),
+    taurus.Error    : (Qt.Qt.red, Qt.Qt.black),
+    taurus.Critical : (Qt.QColor(160,32,240), Qt.Qt.white),
 }
 
 def getBrushForLevel(level):
@@ -76,7 +75,8 @@ def getBrushForLevel(level):
         elevel = taurus.Error
     elif level <= taurus.Critical:
         elevel = taurus.Critical
-    return __LEVEL_BRUSH[elevel]
+    f, g  = map(Qt.QBrush, __LEVEL_BRUSH[elevel])
+    return f, g
 
 
 def _origin_cmp(rec1, rec2):
diff --git a/lib/taurus/qt/qtgui/table/taurusdbtable.py b/lib/taurus/qt/qtgui/table/taurusdbtable.py
index 8996e31..a19c31e 100644
--- a/lib/taurus/qt/qtgui/table/taurusdbtable.py
+++ b/lib/taurus/qt/qtgui/table/taurusdbtable.py
@@ -31,7 +31,8 @@ __all__ = ["TaurusDbTableWidget"]
 __docformat__ = 'restructuredtext'
 
 from taurus.qt import Qt
-from taurus.core import TaurusElementType, TaurusDatabase
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusdatabase import TaurusDatabase
 from taurus.qt.qtcore.model import *
 from taurus.qt.qtgui.resource import getElementTypeIcon, getElementTypeIconName
 from taurustable import TaurusBaseTableWidget
@@ -39,7 +40,7 @@ from taurustable import TaurusBaseTableWidget
 
 class TaurusDbTableWidget(TaurusBaseTableWidget):
     """A class:`taurus.qt.qtgui.tree.TaurusBaseTableWidget` that connects to a
-    :class:`taurus.core.TaurusDatabase` model. It can show the list of database
+    :class:`taurus.core.taurusdatabase.TaurusDatabase` model. It can show the list of database
     elements in two different perspectives:
     
     - device : a device list based perspective
diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
index ff71316..2e294a4 100644
--- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
+++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
@@ -67,7 +67,7 @@ class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget):
         return QtGui.QTableWidget.minimumSizeHint(self)
 
     def getModelClass(self):
-        return taurus.core.TaurusDatabase
+        return taurus.core.taurusdatabase.TaurusDatabase
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py
index 67432e1..1c47713 100644
--- a/lib/taurus/qt/qtgui/table/taurusgrid.py
+++ b/lib/taurus/qt/qtgui/table/taurusgrid.py
@@ -44,8 +44,8 @@ from taurus.qt import Qt, QtGui, QtCore
 
 import taurus
 from taurus.qt.qtcore.util.emitter import modelSetter,TaurusEmitterThread,SingletonWorker,MethodModel
-from taurus.core import TaurusManager
-from taurus.core.util import Logger
+from taurus.core.taurusmanager import TaurusManager
+from taurus.core.util.log import Logger
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtgui.panel import TaurusValue
 from taurus.qt.qtgui.display import TaurusValueLabel,TaurusStateLabel
@@ -64,7 +64,7 @@ def get_all_models(expressions,limit=1000):
     It practically equals to fandango.get_matching_attributes; check which is better!
     Move this method to taurus.core.tango.search 
     '''
-    print( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
+    #print( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
     if isinstance(expressions,str):
         #if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')):
             ##self.debug( 'evaluating expressions ....')
@@ -78,16 +78,16 @@ def get_all_models(expressions,limit=1000):
         expressions = list(str(e) for e in expressions)
         
     #self.debug( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
-    taurus_db = taurus.core.TaurusManager().getFactory()().getDatabase()
+    taurus_db = taurus.core.taurusmanager.TaurusManager().getFactory()().getDatabase()
     #taurus_db = taurus.Database(os.environ['TANGO_HOST'])
     if 'SimulationDatabase' in str(type(taurus_db)):
-        #self.info( 'Using a simulated database ...')
+        #self.trace( 'Using a simulated database ...')
         models = expressions
     else:
         all_devs = taurus_db.get_device_exported('*')
         models = []
         for exp in expressions:
-            #self.info( 'evaluating exp = "%s"' % exp)
+            #self.trace( 'evaluating exp = "%s"' % exp)
             exp = str(exp)
             devs = []
             targets = []
@@ -100,14 +100,14 @@ def get_all_models(expressions,limit=1000):
             else:
                 devs = [device]
                 
-            #self.info( 'TaurusGrid.get_all_models(): devices matched by %s / %s are %d:' % (device,attribute,len(devs)))
+            #self.trace( 'TaurusGrid.get_all_models(): devices matched by %s / %s are %d:' % (device,attribute,len(devs)))
             #self.debug( '%s' % (devs))
             for dev in devs:
                 if any(c in attribute for c in '.*[]()+?'):
                     if '*' in attribute and '.*' not in attribute: attribute = attribute.replace('*','.*')
                     try:
-                        #taurus_dp = taurus.core.TaurusDevice(dev)
-                        taurus_dp = taurus.core.TaurusManager().getFactory()().getDevice(dev)
+                        #taurus_dp = taurus.core.taurusdevice.TaurusDevice(dev)
+                        taurus_dp = taurus.core.taurusmanager.TaurusManager().getFactory()().getDevice(dev)
                         #self.debug( "taurus_dp = %s"%taurus_dp.getFullName())
                         attrs = [att.name for att in taurus_dp.attribute_list_query() if re_match_low(attribute,att.name)]
                         targets.extend(dev+'/'+att for att in attrs)
@@ -118,7 +118,7 @@ def get_all_models(expressions,limit=1000):
             #print 'TaurusGrid.get_all_models(): targets added by %s are: %s' % (exp,targets)
             models.extend(targets)
     models = models[:limit]
-    print( 'Out of TaurusGrid.get_all_models(...)')
+    #print( 'Out of TaurusGrid.get_all_models(...)')
     return models   
                     
 def get_readwrite_models(expressions,limit=1000):
@@ -129,16 +129,16 @@ def get_readwrite_models(expressions,limit=1000):
     #self.debug( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
     if isinstance(expressions,str):
         if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')):
-            #self.debug( 'evaluating expressions ....')
+            #self.trace( 'evaluating expressions ....')
             expressions = list(eval(expressions))
         else:
-            #self.debug( 'expressions as string separated by commas ...')
+            #self.trace( 'expressions as string separated by commas ...')
             expressions = expressions.split(',')
             
     elif any(isinstance(expressions,klass) for klass in (QtCore.QStringList,list,tuple,dict)):
         expressions = list(str(e) for e in expressions)
         
-    taurus_db = taurus.core.TaurusManager().getFactory()().getDatabase()
+    taurus_db = taurus.core.taurusmanager.TaurusManager().getFactory()().getDatabase()
     if 'SimulationDatabase' in str(type(taurus_db)):
       models = expressions
     else:
@@ -161,7 +161,7 @@ def get_readwrite_models(expressions,limit=1000):
               if any(c in attribute for c in '.*[]()+?'):
                   if '*' in attribute and '.*' not in attribute: attribute = attribute.replace('*','.*')
                   try: 
-                      taurus_dp = taurus.core.TaurusManager().getFactory()().getDevice(dev)
+                      taurus_dp = taurus.core.taurusmanager.TaurusManager().getFactory()().getDevice(dev)
                       attrs = [att.name for att in taurus_dp.attribute_list_query() if re_match_low(attribute,att.name) and att.isReadOnly()]
                       targets.extend(dev+'/'+att for att in attrs)
                   except Exception,e: 
@@ -236,7 +236,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         f.close()
         
     def load(self,filename,delayed=False):
-        self.info('In TauGrid.load(%s,%s)'%(filename,delayed))
+        self.trace('In TauGrid.load(%s,%s)'%(filename,delayed))
         if not isinstance(filename,dict):
             import pickle
             f = open(filename)
@@ -283,7 +283,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         #-----------------------------------------------------------------------
         # [MANDATORY]
         # Replace your own code here
-        # ex.: return taurus.core.Attribute
+        # ex.: return taurus.core.taurusattribute.Attribute
         raise RuntimeError("Forgot to overwrite %s.getModelClass" % str(self)) 
         return list
     
@@ -337,9 +337,9 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
     def updateStyle(self):
         #-----------------------------------------------------------------------
         # Write your own code here to update your widget style
-        self.debug('@'*80)
-        self.debug('In TaurusGrid.updateStyle() ....... It seems never called!!!!')
-        self.debug('@'*80)
+        self.trace('@'*80)
+        self.trace('In TaurusGrid.updateStyle() ....... It seems never called!!!!')
+        self.trace('@'*80)
         
         #It was showing an annoying "True" in the widget
         #value = self.getShowText() or ''
@@ -366,8 +366,8 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
             self.load(model)
         else:
             model = isinstance(model,(str,QtCore.QString)) and [model] or list(model)
-            self.debug('#'*80)
-            self.debug('In TaurusGrid.setModel(%s)'%str(model)[:100])
+            self.trace('#'*80)
+            self.trace('In TaurusGrid.setModel(%s)'%str(model)[:100])
     
             self.delayed = delayed
             self.filter = model
@@ -386,7 +386,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
             self.debug(('In TaurusGrid.setModel(...): modelNames are %s'%(self._modelNames))[:100]+'...')
             
             if load:
-                self.info('In TaurusGrid.setModel(%s,load=True): modelNames are %d'%(str(model)[:100]+'...',len(self._modelNames)))#,self._modelNames)) 
+                self.trace('In TaurusGrid.setModel(%s,load=True): modelNames are %d'%(str(model)[:100]+'...',len(self._modelNames)))#,self._modelNames)) 
                 if devsInRows:
                     self.setRowLabels(','.join(set(d.rsplit('/',1)[0] for d in self._modelNames)))
                 self.create_widgets_table(self._modelNames)
@@ -398,19 +398,19 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
                 self.updateStyle()        
                         
                 if not self.delayed:
-                    self.info('In setModel(): not delayed loading of models')
+                    self.trace('In setModel(): not delayed loading of models')
                     if not self.modelsThread.isRunning(): 
-                        print 'In setModel(): Starting Thread! (%d objs in queue)'%(self.modelsThread.queue.qsize())
-                        self.debug('<'*80)
+                        #print 'In setModel(): Starting Thread! (%d objs in queue)'%(self.modelsThread.queue.qsize())
+                        self.trace('<'*80)
                         self.modelsThread.start()#self.modelsThread.IdlePriority)        
                     else:
-                        print 'In setModel(): Thread already started! (%d objs in queue)'%(self.modelsThread.queue.qsize())
+                        #print 'In setModel(): Thread already started! (%d objs in queue)'%(self.modelsThread.queue.qsize())
                         self.modelsThread.next()
                 else: 
-                    self.info('In setModel(): models loading delayed!')
+                    self.trace('In setModel(): models loading delayed!')
                     pass
                     
-            self.debug('Out of TaurusGrid.setModel(%s)'%str(model)[:100])
+            self.trace('Out of TaurusGrid.setModel(%s)'%str(model)[:100])
             self.updateStyle()
         return
     
@@ -503,7 +503,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
                 self.columns_frame.hide()
                 
     def showAttributeLabels(self,boolean):
-        self.info('In showAttributeLabels(%s)'%boolean)
+        self.trace('In showAttributeLabels(%s)'%boolean)
         self._show_attr_labels = boolean
         for tv in self._widgets_list:
             try:
@@ -514,7 +514,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         return self._show_attr_labels
         
     def showAttributeUnits(self,boolean):
-        self.info('In showAttributeUnits(%s)'%boolean)
+        self.trace('In showAttributeUnits(%s)'%boolean)
         self._show_attr_units = boolean
         for tv in self._widgets_list:
             try:
@@ -751,7 +751,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         This is a builder. For all the elements in widgets matrix,
         just set the corresponding cells of the QTableWidget.
         """
-        self.debug('In TaurusGrid.build_table(%s)'%values)
+        self.trace('In TaurusGrid.build_table(%s)'%values)
         widgets_matrix = self.build_widgets(values,self.showLabels)
         rows = len(widgets_matrix)
         cols = rows and len(widgets_matrix[0]) or 0
@@ -804,7 +804,7 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
                     
                 #Done in this way as TauValue.mousePressEvent are never called
                 def mousePressEvent(event,obj):
-                    print 'In cell clicked'
+                    #print 'In cell clicked'
                     targets = set(str(child.getModelName()) for child in obj.children() 
                         if hasattr(child,'underMouse') and child.underMouse() and hasattr(child,'getModelName'))
                     [obj.emit(Qt.SIGNAL("itemClicked(QString)"),t) for t in targets]
@@ -817,17 +817,17 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         return widgets_matrix
         
     def itemClicked(self,item_name):
-        self.info('In TaurusGrid.itemClicked(%s)'%item_name)
+        self.trace('In TaurusGrid.itemClicked(%s)'%item_name)
         self.setItemSelected(item_name)
         self.emit(QtCore.SIGNAL("itemClicked(QString)"),str(item_name))
         
     def setItemSelected(self,item_name='',selected=True):
         """ it adds a blue frame around a clicked item. """
         if isinstance(item_name,TaurusValue): 
-            self.info('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name.getModel()),selected))
+            self.trace('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name.getModel()),selected))
             item = item_name
         else: 
-            self.info('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name),selected))
+            self.trace('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name),selected))
             if item_name: item = self.getItemByModel(item_name)
             else: item = self._last_selected
         if item:
diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py
index cf8af4a..eb23442 100644
--- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py
+++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py
@@ -33,11 +33,12 @@ import numpy
 import sys
 
 import taurus.core
+from taurus.core.taurusbasetypes import DataFormat
 from taurus.qt.qtgui.base import TaurusBaseWidget, TaurusBaseWritableWidget
 from taurus.qt.qtgui.display import TaurusLabel
 from taurus.qt.qtgui.resource import getThemeIcon, getThemePixmap
 from taurus.qt.qtgui.container import TaurusWidget
-from taurus.core.util import Enumeration
+from taurus.core.util.enumeration import Enumeration
 
 TableRWState = Enumeration("TableRWState", ("Read", "Write"))
 
@@ -145,9 +146,9 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
         values = numpy.array(attr.value)
         wvalues = numpy.array(attr.w_value)
         #reshape the table
-        if attr.data_format == taurus.core.DataFormat._1D:
+        if attr.data_format == DataFormat._1D:
             rows, columns = values.size, 1
-        elif attr.data_format == taurus.core.DataFormat._2D:
+        elif attr.data_format == DataFormat._2D:
             rows, columns = values.shape
         else:
             raise TypeError('Unsupported data format "%s"'%repr(attr.data_format))
@@ -174,7 +175,7 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
         '''
         Returns the configuration object for the data
         
-        :returns:  (TaurusConfiguration)
+        :returns:  (taurus.core.taurusconfiguration.TaurusConfiguration)
         '''
         return self._attrConfig
     
@@ -182,7 +183,7 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
         '''
         Returns Status of the variable
         
-        :returns:  (taurus.core.AttrQuality) 
+        :returns:  (taurus.core.taurusbasetypes.AttrQuality) 
         '''
         return self._attr.quality
     
@@ -244,7 +245,7 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
                 else:
                     raise TypeError('Unknown data type "%s"'%kind)
         #reshape if needed
-        if self._attr.data_format == taurus.core.DataFormat._1D:
+        if self._attr.data_format == DataFormat._1D:
             table = table.flatten()
         return table    
      
@@ -295,9 +296,9 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
             #refresh the write data (unless it is dirty)
             wvalues=numpy.array(self._attr.w_value)
             #reshape the table
-            if self._attr.data_format == taurus.core.DataFormat._1D:
+            if self._attr.data_format == DataFormat._1D:
                 rows, columns = wvalues.size, 1
-            elif self._attr.data_format == taurus.core.DataFormat._2D:
+            elif self._attr.data_format == DataFormat._2D:
                 rows, columns = wvalues.shape
             else:
                 self.warning('unsupported data format %s'%str(val.data_format))
@@ -571,7 +572,7 @@ class TaurusValuesTable(TaurusWidget):
     
     def getModelClass(self):
         '''see :meth:`TaurusWidget.getModelClass`'''
-        return taurus.core.TaurusAttribute    
+        return taurus.core.taurusattribute.TaurusAttribute    
     
     def setModel(self, model):
         '''Reimplemented from :meth:`TaurusWidget.setModel`'''
@@ -598,10 +599,10 @@ class TaurusValuesTable(TaurusWidget):
         model = self._tableView.model()
         if model is None:
             return
-        if evt_type in (taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic) and evt_value is not None:            
+        if evt_type in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic) and evt_value is not None:            
             model.setAttr(evt_value)
             self._tableView.resizeColumnsToContents()
-        elif evt_type == taurus.core.TaurusEventType.Config:
+        elif evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
             #force a read to set an attr
             model.setAttr(self.getModelValueObj())
             model.setConfig(evt_src)
@@ -721,7 +722,7 @@ class TaurusValuesTable(TaurusWidget):
     def chooseModel(self):
         '''shows a model chooser'''
         from taurus.qt.qtgui.panel import  TaurusModelChooser
-        selectables=[taurus.core.TaurusElementType.Attribute]
+        selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute]
         models, ok = TaurusModelChooser.modelChooserDlg(selectables=selectables, singleModel=True)
         if ok and len(models)==1:
             self.setModel(models[0])
diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py b/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
index e33b924..27e7a3a 100644
--- a/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
+++ b/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
@@ -38,7 +38,7 @@ from taurus.qt import Qt
 import PyTango
 
 import taurus.core
-from taurus.core.util import ATTRIBUTE_QUALITY_PALETTE
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
 from taurus.qt.qtgui.base import TaurusBaseWidget
 
 class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
@@ -66,13 +66,13 @@ class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     
     def getModelClass(self):
-        return taurus.core.TaurusAttribute
+        return taurus.core.taurusattribute.TaurusAttribute
 
     def isReadOnly(self):
         return True
         
     def handleEvent(self, src, evt_type, val):
-        if evt_type in [taurus.core.TaurusEventType.Change, taurus.core.TaurusEventType.Periodic] and val is not None:            
+        if evt_type in [taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic] and val is not None:            
             values=numpy.array(val.value)
             #reshape the table
             if val.data_format == PyTango.AttrDataFormat.SPECTRUM:
@@ -97,7 +97,7 @@ class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
         self.info('using deprecated event handling methods.')
         model = self.getModelObj()
         val = model.getValueObj()
-        self.handleEvent(model, taurus.core.TaurusEventType.Change, val)
+        self.handleEvent(model, taurus.core.taurusbasetypes.TaurusEventType.Change, val)
         
     def updateStyle(self):
         if self.getShowQuality():
diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
index 6554f5d..6f7c830 100644
--- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
+++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
@@ -44,7 +44,7 @@ import taurus.qt.qtgui.panel
 import taurus.qt.qtgui.taurusgui.paneldescriptionwizard
 import taurus.qt.qtgui.input
 import copy
-from taurus.core.util import etree
+from lxml import etree
 from taurus.core.util import Enumeration
 from taurus.qt.qtgui.util import ExternalAppAction
         
@@ -223,8 +223,8 @@ class ProjectPage(BasePage):
         Qt.QObject.connect(self._projectDirBT, Qt.SIGNAL("clicked()"), self.onSelectDir)       
         
     def onSelectDir(self):
-        dirname = Qt.QFileDialog.getExistingDirectory(self, 'Choose the project directory', self._projectDirLE.text())
-        if dirname.isNull(): return
+        dirname = unicode(Qt.QFileDialog.getExistingDirectory(self, 'Choose the project directory', self._projectDirLE.text()))
+        if not dirname: return
         self._projectDirLE.setText(dirname)
         
     def validatePage(self):
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
index 88f8944..9d58953 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
@@ -142,15 +142,16 @@ pymca = ExternalApp(['pymca'])
 
 #===============================================================================
 # Macro execution configuration
-# (comment out or make MACRO_SERVER=None to skip creating a macro execution 
-# infrastructure)
+# Comment out or make MACRO_SERVER=None or set MACRO_PANELS=False to skip 
+# creating a macro execution infrastructure.
+# Give empty strings if you want to select the values manually in the GUI
 #===============================================================================
 #MACROSERVER_NAME = 
 #DOOR_NAME = 
 #MACROEDITORS_PATH = 
 
 #===============================================================================
-# Monitor widget (This is obsolete now, you can get the same result defining a
+# Monitor widget (This is *obsolete* now, you can get the same result defining a
 # custom applet with classname='TaurusMonitorTiny')
 #===============================================================================
 # MONITOR = ['sys/tg_test/1/double_scalar_rww']
@@ -165,4 +166,11 @@ pymca = ExternalApp(['pymca'])
 EXTRA_CATALOG_WIDGETS = [('PyQt4.Qt.QLineEdit',':/taurus.png'),
                         ('PyQt4.Qt.QSpinBox','images/syn2.jpg'),
                         ('PyQt4.Qt.QTextEdit','/tmp/kk.png'),
-                        ('PyQt4.Qt.QLabel',None)]
\ No newline at end of file
+                        ('PyQt4.Qt.QLabel',None)]
+
+#===============================================================================
+# Define one or more embedded consoles in the GUI.
+# Possible items for console are 'ipython', 'tango', 'spock'
+# Note: This is still experimental
+#===============================================================================
+#CONSOLE = ['tango']
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
index d1f25e1..006c81e 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
@@ -80,8 +80,8 @@ pymca = ExternalApp(['pymca'])
 
 #===============================================================================
 # Macro execution configuration
-# (comment out or make MACRO_SERVER=None to skip creating a macro execution 
-# infrastructure)
+# Comment out or make MACRO_SERVER=None or set MACRO_PANELS=False to skip 
+# creating a macro execution infrastructure.
 # Give empty strings if you want to select the values manually in the GUI
 #===============================================================================
 MACROSERVER_NAME = ''
diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
index 03dff88..c0a4b47 100644
--- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
+++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
@@ -44,7 +44,7 @@ from taurus.qt.qtgui.resource import getThemeIcon, getIcon
 #from taurus.qt.qtgui.taurusgui.utils import PanelDescription
 from taurus.core.tango.sardana import PlotType
 from taurus.core.tango.sardana.pool import getChannelConfigs
-from taurus.core.util import CaselessList
+from taurus.core.util.containers import CaselessList
 
 class ChannelFilter(object):
     def __init__(self,chlist):
@@ -276,13 +276,26 @@ class MacroBroker(Qt.QObject, TaurusBaseComponent):
                 else:
                     self.warning('Cannot create plot for %s', chname)
                     
-        self._updateTemporaryTrends1D(trends1d)
+        new1d,removed1d = self._updateTemporaryTrends1D(trends1d)
+        self.emit(Qt.SIGNAL("newShortMessage"),"Changed panels (%i new, %i removed)"%(len(new1d),len(removed1d)))
 #        self._updateTemporaryTrends2D(trends2d)
         
     def _updateTemporaryTrends1D(self, trends1d):
+        '''adds necessary trend1D panels and removes no longer needed ones
+        
+        :param trends1d: (dict) A dict whose keys are tuples of axes and 
+                         whose values are list of model names to plot
+        
+        :returns: (tuple) two lists new,rm:new contains the names of the new
+                  panels and rm contains the names of the removed panels  
+        '''
+        
         from taurus.qt.qtgui.plot import TaurusTrend
-        mainwindow = self.parent()                
+        mainwindow = self.parent()
+        newpanels = []                
         for axes,plotables in trends1d.items():
+            if not axes:
+                continue
             if axes not in self._trends1d:     
                 w = TaurusTrend()
                 w.setXIsTime(False)
@@ -292,10 +305,17 @@ class MacroBroker(Qt.QObject, TaurusBaseComponent):
                 panel = mainwindow.createPanel(w, pname, registerconfig=False, permanent=False)
                 panel.raise_()
                 self._trends1d[axes] = pname
+                newpanels.append(pname)
             else:
                 panel = mainwindow.getPanel(self._trends1d[axes])
             flt = ChannelFilter(plotables)
             panel.widget().onScanPlotablesFilterChanged(flt)
+        
+        #remove trends that aren no longer configured 
+        removedpanels = [name for axes,name in self._trends1d.items() if axes not in trends1d]
+        self.removeTemporaryPanels(removedpanels)
+        return newpanels,removedpanels
+         
             
     def _updateTemporaryTrends2D(self, trends2d):
         try:
diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
index d888c94..03b4849 100644
--- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
+++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
@@ -42,7 +42,7 @@ from taurus.qt.qtgui.container import TaurusMainWindow
 from taurus.qt.qtgui.taurusgui.utils import ExternalApp, PanelDescription, ToolBarDescription, AppletDescription
 from taurus.qt.qtgui.panel import QDoubleListDlg
 import taurus.qt.qtgui.resource
-from taurus.core.util import etree
+from lxml import etree
 
 
 class AssociationDialog(Qt.QDialog):
@@ -221,9 +221,9 @@ class TaurusGui(TaurusMainWindow):
         
         self.registerConfigProperty(self._getPermanentCustomPanels, self._setPermanentCustomPanels, 'permanentCustomPanels')
         self.registerConfigProperty(self.getAllInstrumentAssociations, self.setAllInstrumentAssociations, 'instrumentAssociation')
-        
-        from taurus.TaurusCustomSettings import T_FORM_CUSTOM_WIDGET_MAP
-        self.setCustomWidgetMap(T_FORM_CUSTOM_WIDGET_MAP)
+                
+        from taurus import tauruscustomsettings
+        self.setCustomWidgetMap(getattr(tauruscustomsettings,'T_FORM_CUSTOM_WIDGET_MAP',{}))
         
         #Create a global SharedDataManager
         Qt.qApp.SDM =  SharedDataManager(self)
@@ -382,9 +382,9 @@ class TaurusGui(TaurusMainWindow):
                      If None given, the user will be prompted
         '''
         if name is None:
-            items = sorted(self.getPanelNames())
+            items = sorted([n for n,p in self.__panels.iteritems() if p.isCustom()])
             name,ok = Qt.QInputDialog.getItem (self, "Remove Panel", 
-                                               "Panel to be removed.\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False)
+                                               "Panel to be removed (only custom panels can be removed).\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False)
             if not ok:
                 return
         name = unicode(name)
@@ -392,11 +392,17 @@ class TaurusGui(TaurusMainWindow):
             self.debug('Cannot remove panel "%s" (not found)'%name)
             return
         panel = self.__panels.pop(name)
+        try:
+            panel.widget().setModel(None) #in case the widget is a Taurus one and does some cleaning when setting model to None
+        except:
+            pass
+        
         self.unregisterConfigurableItem(name, raiseOnError=False)
         self.removeDockWidget(panel)
         panel.setParent(None)
         panel.setAttribute(Qt.Qt.WA_DeleteOnClose)
         panel.close()
+        self.debug('Panel "%s" removed'%name)
         
     def createPanel(self, widget, name, floating=False, registerconfig=True, custom=False, 
                     permanent=False, icon=None, instrumentkey=None):
@@ -780,7 +786,8 @@ class TaurusGui(TaurusMainWindow):
                     
         #configure the macro infrastructure       
         MACROSERVER_NAME = getattr(conf,'MACROSERVER_NAME', self.__getVarFromXML(xmlroot,"MACROSERVER_NAME", None))
-        if MACROSERVER_NAME is not None:
+        MACRO_PANELS = getattr(conf,'MACRO_PANELS', self.__getVarFromXML(xmlroot,"MACRO_PANELS", True))
+        if MACRO_PANELS and MACROSERVER_NAME is not None:# macro infrastructure will only be created if MACROSERVER_NAME is set
             from taurus.qt.qtgui.taurusgui import MacroBroker
             self.__macroBroker =  MacroBroker(self)
         if MACROSERVER_NAME: 
@@ -1251,9 +1258,6 @@ def main():
 
     if options.new_gui: #launch app settings wizard instead of taurusgui
         from taurus.qt.qtgui.taurusgui import AppSettingsWizard
-        Qt.QMessageBox.information(None, 'Alpha-quality warning', 
-                                   'The Applications settings wizard is still under heavy development.\n Use it at your own risk and report any problems',
-                                   Qt.QMessageBox.Ok)
         wizard = AppSettingsWizard()
         wizard.show()
         sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py
index 4719e00..2a95f21 100644
--- a/lib/taurus/qt/qtgui/taurusgui/utils.py
+++ b/lib/taurus/qt/qtgui/taurusgui/utils.py
@@ -30,7 +30,7 @@ __docformat__ = 'restructuredtext'
 
 from taurus.qt.qtgui.util import ExternalAppAction
 from taurus.qt.qtgui.util import TaurusWidgetFactory
-from taurus.core.util import etree
+from lxml import etree
 import os,sys
 
 #this is here only for backwards compatibility. It should not be used at all
diff --git a/lib/taurus/qt/qtgui/tree/qtree.py b/lib/taurus/qt/qtgui/tree/qtree.py
index c0e635b..14cf443 100644
--- a/lib/taurus/qt/qtgui/tree/qtree.py
+++ b/lib/taurus/qt/qtgui/tree/qtree.py
@@ -35,32 +35,6 @@ from taurus.qt.qtgui.util import ActionFactory
 from taurus.qt.qtgui.resource import getIcon, getThemeIcon
 
 
-class _NavigationLabel(Qt.QWidget):
-    """Internal widget providing a navigation label & icon"""
-
-    def __init__(self, pixmap, text, cont, index, parent=None):
-        super(_NavigationLabel, self).__init__(parent)
-        self._index = index
-
-        l = Qt.QHBoxLayout()
-        l.setContentsMargins(0,0,0,0)
-        self.setLayout(l)
-        if pixmap is not None:
-            p = Qt.QLabel()
-            p.setPixmap(pixmap)
-            l.addWidget(p)
-        self._label = Qt.QLabel(text)
-        l.addWidget(self._label)
-        if cont:
-            l.addWidget(Qt.QLabel(u" \u00bb "))
-
-    def label(self):
-        return self._label
-
-    def index(self):
-        return self._index
-
-
 class _NavigationWidget(Qt.QFrame):
     """Internal widget that provides a navigation path to be placed in a toolbar"""
 
@@ -68,9 +42,12 @@ class _NavigationWidget(Qt.QFrame):
         super(_NavigationWidget, self).__init__(parent)
         self._tree = treeWidget
         self._toolbar = toolBarWidget
+        self._label = Qt.QLabel()
         l = Qt.QHBoxLayout()
         l.setContentsMargins(4, 0, 4, 0)
         self.setLayout(l)
+        l.addWidget(self._label)
+        
 
     def treeWidget(self):
         return self._tree
@@ -81,49 +58,19 @@ class _NavigationWidget(Qt.QFrame):
     def toolBarWidget(self):
         return self._toolbar
 
-    def clean(self):
-        l = self.layout()
-        w = l.takeAt(0)
-        while w is not None:
-            w = w.widget()
-            Qt.QObject.disconnect(w, Qt.SIGNAL("clicked()"), self.onGotoNode)
-            w.setParent(None)
-            w = l.takeAt(0)
-
     def updateSelection(self, index):
-        self.clean()
         treeWidget = self.treeWidget()
-        viewWidget = treeWidget.viewWidget()
-        model = viewWidget.model()
         src_model = treeWidget.getBaseQModel()
         toolbar = self.toolBarWidget()
-        rootPixmap = getThemeIcon("go-home").pixmap(toolbar.iconSize())
-        rootText = u"Top"
-
-        l = self.layout()
-        n = 0
+        txt = u""
+        
         while index.isValid():
             src_index = treeWidget._mapToSource(index)
             name = src_model.pyData(src_index, Qt.Qt.DisplayRole)
-            font = src_model.pyData(src_index, Qt.Qt.FontRole)
-            tooltip = src_model.pyData(src_index, Qt.Qt.ToolTipRole)
-            decoration = src_model.pyData(src_index, Qt.Qt.DecorationRole)
-            pixmap = None
-            if isinstance(decoration, Qt.QIcon):
-                pixmap = decoration.pixmap(toolbar.iconSize())
-            elif isinstance(decoration, Qt.QPixmap):
-                pixmap = decoration
-            button = _NavigationLabel(pixmap, name, n>0, Qt.QPersistentModelIndex(index))
-            font = font or model.DftFont
-            button.setFont(font)
-            button.setToolTip(tooltip)
-            Qt.QObject.connect(button.label(), Qt.SIGNAL("linkActivated(const QString &)"), self.onGotoNode)
-            l.insertWidget(0, button)
+            txt = u" \u00bb " + name + txt
             index = index.parent()
-            n += 1
-        rootButton = _NavigationLabel(rootPixmap, rootText, n>0, Qt.QPersistentModelIndex(index))
-        rootButton.setFont(model.DftFont)
-        l.insertWidget(0, rootButton)
+        txt = u"Root" + txt
+        self._label.setText(txt)
 
     def onGotoNode(self, *args):
         label = self.sender()
diff --git a/lib/taurus/qt/qtgui/tree/taurusdbtree.py b/lib/taurus/qt/qtgui/tree/taurusdbtree.py
index 76cfb3b..0667b44 100644
--- a/lib/taurus/qt/qtgui/tree/taurusdbtree.py
+++ b/lib/taurus/qt/qtgui/tree/taurusdbtree.py
@@ -30,7 +30,8 @@ __all__ = ["TaurusDbTreeWidget"]
 __docformat__ = 'restructuredtext'
 
 from taurus.qt import Qt
-from taurus.core import TaurusElementType, TaurusDatabase
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core.taurusdatabase import TaurusDatabase
 from taurus.qt.qtcore.model import *
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtgui.resource import getThemeIcon, getElementTypeIcon, getElementTypeIconName
@@ -38,7 +39,7 @@ from taurustree import TaurusBaseTreeWidget
 
 class TaurusDbTreeWidget(TaurusBaseTreeWidget):
     """A class:`taurus.qt.qtgui.tree.TaurusBaseTreeWidget` that connects to a
-    :class:`taurus.core.TaurusDatabase` model. It can show the list of database
+    :class:`taurus.core.taurusdatabase.TaurusDatabase` model. It can show the list of database
     elements in four different perspectives:
     
     - device : a three level hierarchy of devices (domain/family/name)
diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
index 28bad87..781be60 100755
--- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
+++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
@@ -39,15 +39,15 @@ except:icons_dev_tree = None
 from taurus.qt import Qt
 
 import taurus.core
-from taurus.core.util import DEVICE_STATE_PALETTE,ATTRIBUTE_QUALITY_PALETTE
-from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
-from taurus.qt.qtgui.container import TaurusWidget
+from taurus.core.util.colors import DEVICE_STATE_PALETTE,ATTRIBUTE_QUALITY_PALETTE
+from taurus.core.util.containers import CaselessDict
+from taurus.core.tango.search import * #@TODO: Avoid implicit imports
 from taurus.qt.qtcore.util.emitter import SingletonWorker
-from taurus.core.util import CaselessDict
 from taurus.qt.qtcore.mimetypes import *  #@TODO: Avoid implicit imports
 from taurus.qt.qtcore.util import properties
 from taurus.qt.qtcore.util.properties import djoin
-from taurus.core.tango.search import * #@TODO: Avoid implicit imports
+from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
+from taurus.qt.qtgui.container import TaurusWidget
 
 TREE_ITEM_MIME_TYPE = 'application/x-qabstractitemmodeldatalist'
 
@@ -349,8 +349,14 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
     def initConfig(self):
         """
         Initializing the attributes that will be kept persitent as Qt settings.
-        e.g.; for Filters property are created:
-            self.filters / self._filters / self.setFilters / self.getFilters / self.resetFilters
+        e.g. for Filters property, the following attributes are created:
+        
+            - self.filters
+            - self._filters
+            - self.setFilters
+            - self.getFilters
+            - self.resetFilters
+            
         """
         properties.set_property_methods(self,'Filters','QStringList',default='',
             #setter = self.setFilters,
@@ -440,7 +446,7 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         return self._filters    
     
     def getModelClass(self):
-        return list #taurus.core.TaurusDatabase
+        return list #taurus.core.taurusdatabase.TaurusDatabase
     
     def setFilters(self,filters):
         filters = split_model_list(filters)
@@ -1136,7 +1142,7 @@ class TaurusTreeNode(Qt.QTreeWidgetItem, TaurusBaseComponent):
         return self.log_name + "(" + self.modelName + ")"
 
     def getModelClass(self):
-        return taurus.core.TaurusDevice
+        return taurus.core.taurusdevice.TaurusDevice
     
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseComponent over writing
@@ -1234,7 +1240,7 @@ SearchEdit = TaurusDevTreeOptions
 #####################################################################################
     
 class ServerBrowser(TaurusDevTree):
-    """ This class is used only when browsing by Server/Instance instead of Domain/Family/Member schema """
+    """ This class is used only when browsing by Server/Instance instead of Domain/Family/Member scheme """
     
     def getDeviceDict(self,filters):
         '''
diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py
index 8ad22cc..88e35e1 100644
--- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py
+++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py
@@ -29,15 +29,15 @@ __all__ = ["ActionFactory"]
 
 __docformat__ = 'restructuredtext'
 
-import os
-import xml.dom.minidom
-
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
 from taurus.qt import Qt
-import taurus.core.util
-import taurus.qt.qtgui.resource
+from taurus.qt.qtgui.resource import getThemeIcon
+
 import taurusaction
 
-class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
+
+class ActionFactory(Singleton, Logger):
     """A Singleton class designed to provide Action related objects."""
 
     def __init__(self):
@@ -46,7 +46,7 @@ class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
 
     def init(self, *args):
         """Singleton instance initialization."""
-        self.call__init__(taurus.core.util.Logger,'ActionFactory')
+        self.call__init__(Logger, 'ActionFactory')
         self.actions = self.__getActions()
         self.menus = self.__getMenus()
     
@@ -82,6 +82,7 @@ class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
         return klass(widget)
 
     def getNewMenu(self, widget, data):
+        import xml.dom.minidom
         doc = xml.dom.minidom.parseString(data)
         m_node = doc.childNodes[0]
         return self.buildMenu(widget, m_node)
@@ -130,7 +131,7 @@ class ActionFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
             action.setCheckable(True)
         if icon is not None:
             if isinstance(icon, (str, unicode)):
-                icon = taurus.qt.qtgui.resource.getThemeIcon(icon)
+                icon = getThemeIcon(icon)
             action.setIcon( icon )
         if shortcut is not None:
             action.setShortcut(shortcut)
diff --git a/lib/taurus/qt/qtgui/util/tauruscolor.py b/lib/taurus/qt/qtgui/util/tauruscolor.py
index 0ae148c..13f8b6b 100644
--- a/lib/taurus/qt/qtgui/util/tauruscolor.py
+++ b/lib/taurus/qt/qtgui/util/tauruscolor.py
@@ -29,12 +29,13 @@ __docformat__ = 'restructuredtext'
 
 from taurus.qt import Qt
 
-import taurus.core.util
+from taurus.core.util.colors import ColorPalette, \
+    DEVICE_STATE_DATA, ATTRIBUTE_QUALITY_DATA
 
-class QtColorPalette(taurus.core.util.ColorPalette):
+class QtColorPalette(ColorPalette):
 
     def __init__(self, dat, int_decoder_dict):
-        taurus.core.util.ColorPalette.__init__(self, dat, int_decoder_dict)
+        ColorPalette.__init__(self, dat, int_decoder_dict)
         self._qcolor_cache_fg = dict()
         self._qcolor_cache_bg = dict()
         self._qbrush_cache_fg = dict()
@@ -88,5 +89,5 @@ class QtColorPalette(taurus.core.util.ColorPalette):
 
 import PyTango
 
-QT_DEVICE_STATE_PALETTE = QtColorPalette(taurus.core.util.DEVICE_STATE_DATA, PyTango.DevState)
-QT_ATTRIBUTE_QUALITY_PALETTE = QtColorPalette(taurus.core.util.ATTRIBUTE_QUALITY_DATA, PyTango.AttrQuality)
+QT_DEVICE_STATE_PALETTE = QtColorPalette(DEVICE_STATE_DATA, PyTango.DevState)
+QT_ATTRIBUTE_QUALITY_PALETTE = QtColorPalette(ATTRIBUTE_QUALITY_DATA, PyTango.AttrQuality)
diff --git a/lib/taurus/qt/qtgui/util/taurusscreenshot.py b/lib/taurus/qt/qtgui/util/taurusscreenshot.py
index 051fb5a..7f1ba02 100644
--- a/lib/taurus/qt/qtgui/util/taurusscreenshot.py
+++ b/lib/taurus/qt/qtgui/util/taurusscreenshot.py
@@ -32,9 +32,9 @@ __docformat__ = 'restructuredtext'
 import time
 import threading
 import os.path
-from taurus.core.util import Logger
-from taurus.qt import Qt
 
+from taurus.qt import Qt
+from taurus.core.util.log import Logger
 
 _LOGGER = None
 
@@ -44,6 +44,7 @@ def _getLogger():
         _LOGGER = Logger('Grabber')
     return _LOGGER
 
+
 class GrabberThread(threading.Thread):
     
     def __init__(self, widget, fileName, period):
diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
index 39a5886..20520e0 100644
--- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
+++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
@@ -36,8 +36,8 @@ import os.path
 
 from taurus.qt import Qt
 
-import taurus.core.util
-import taurus.qt.qtgui.base
+from taurus.core.util.log import Logger
+from taurus.core.util.singleton import Singleton
 
 
 def _getWidgetsOfType(widget, widgets, class_or_type_or_tuple):
@@ -64,7 +64,7 @@ def getWidgetsOfType(widget, class_or_type_or_tuple):
     return widgets
 
 
-class TaurusWidgetFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
+class TaurusWidgetFactory(Singleton, Logger):
     """The TaurusWidgetFactory is a utility class that provides information
     about all Qt widgets (Taurus and non Taurus) that are found in the
     current taurus distribution.
@@ -85,7 +85,7 @@ class TaurusWidgetFactory(taurus.core.util.Singleton, taurus.core.util.Logger):
     def init(self, *args):
         """Singleton instance initialization."""
         name = self.__class__.__name__
-        self.call__init__(taurus.core.util.Logger, name)
+        self.call__init__(Logger, name)
         
         path = os.path.dirname(os.path.abspath(__file__))
         path, tail = os.path.split(path)
diff --git a/lib/taurus/qt/qtgui/util/tauruswidgettree.py b/lib/taurus/qt/qtgui/util/tauruswidgettree.py
new file mode 100644
index 0000000..d963451
--- /dev/null
+++ b/lib/taurus/qt/qtgui/util/tauruswidgettree.py
@@ -0,0 +1,229 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+## 
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+## 
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+## 
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU Lesser General Public License for more details.
+## 
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+"""
+"""
+
+__all__ = ["QObjectRepresentation", "get_qobject_tree", "get_qobject_tree_str",
+           "TreeQObjectModel", "TreeQObjectWidget"]
+
+__docformat__ = 'restructuredtext'
+
+import weakref
+
+from taurus.qt import Qt
+
+from taurus.core.util.enumeration import Enumeration
+
+QObjectRepresentation = Enumeration('QObjectRepresentation',
+                                    ('ClassName', 'ObjectName', 'FullName'))
+
+def _build_qobjects_as_dict(qobject, container):
+    
+    container[qobject] = childs = {}
+    for child in qobject.children():
+        if isinstance(child, Qt.QWidget):
+            _build_qobjects_as_dict(child, childs) 
+
+def get_qobject_tree_as_dict(qobject=None):
+    
+    if qobject is None:    
+        app = Qt.QApplication.instance()
+        qobjects = app.topLevelWidgets()
+    else:
+        qobjects = [qobject]
+
+    tree = {}
+    for qobject in qobjects:
+        _build_qobjects_as_dict(qobject, tree)
+
+    return tree
+
+def _build_qobjects_as_list(qobject, container):
+    
+    children = qobject.children()
+    node = qobject, []
+    container.append(node)
+    for child in children:
+        if isinstance(child, Qt.QWidget):
+            _build_qobjects_as_list(child, node[1]) 
+
+def get_qobject_tree_as_list(qobject=None):
+    
+    if qobject is None:    
+        app = Qt.QApplication.instance()
+        qobjects = app.topLevelWidgets()
+    else:
+        qobjects = [qobject]
+
+    tree = []
+    for qobject in qobjects:
+        _build_qobjects_as_list(qobject, tree)
+
+    return tree
+
+get_qobject_tree = get_qobject_tree_as_list
+
+def _get_qobject_str(qobject, representation):
+    if representation == QObjectRepresentation.ClassName:
+        return qobject.__class__.__name__
+    elif representation == QObjectRepresentation.ObjectName:
+        return str(qobject.objectName())
+    elif representation == QObjectRepresentation.FullName:
+        return '{0}("{1}")'.format(qobject.__class__.__name__, str(qobject.objectName()))
+    return str(qobject)
+
+def _build_qobject_str(node, str_tree, representation=QObjectRepresentation.ClassName):
+
+    qobject, children = node
+    str_node = _get_qobject_str(qobject, representation)
+    str_children = []
+    str_tree.append((str_node, str_children))        
+    for child in children:
+        _build_qobject_str(child, str_children, representation=representation)
+            
+def get_qobject_tree_str(qobject=None, representation=QObjectRepresentation.ClassName):
+    
+    tree, str_tree = get_qobject_tree(qobject=qobject), []
+    for e in tree:
+        _build_qobject_str(e, str_tree, representation=representation)
+    return str_tree
+
+
+from taurus.qt.qtgui.tree.qtree import QBaseTreeWidget
+from taurus.qt.qtcore.model import TaurusBaseModel, TaurusBaseTreeItem
+
+QR = QObjectRepresentation
+
+
+class TreeQObjecttItem(TaurusBaseTreeItem):
+
+    def __init__(self, model, data, parent = None):
+        TaurusBaseTreeItem.__init__(self, model, data, parent=parent)
+        if data is not None:
+            self.qobject = weakref.ref(data)
+            dat = _get_qobject_str(data, QR.ClassName), \
+                  _get_qobject_str(data, QR.ObjectName)
+            self.setData(0, dat)  
+
+
+class TreeQObjectModel(TaurusBaseModel):
+
+    ColumnNames = "Class", "Object name"
+    ColumnRoles = (QR.ClassName,), QR.ObjectName
+
+    def __init__(self, parent=None, data=None):
+        TaurusBaseModel.__init__(self, parent=parent, data=data)
+
+#    def createNewRootItem(self):
+#        return TreeQObjecttItem(self, self.ColumnNames)
+
+    def role(self, column, depth=0):
+        if column == 0:
+            return self.ColumnRoles[column][0]
+        return self.ColumnRoles[column]
+
+    def roleIcon(self, taurus_role):
+        return Qt.QIcon()
+
+    def roleSize(self, taurus_role):
+        return Qt.QSize(300, 70)
+    
+    def roleToolTip(self, role):
+        return "widget information"
+
+    @staticmethod
+    def _build_qobject_item(model, parent, node):
+        qobject, children = node
+        item = TreeQObjecttItem(model, qobject, parent)
+        parent.appendChild(item)
+        for child in children:
+            TreeQObjectModel._build_qobject_item(model, item, child)
+
+    def setupModelData(self, data):
+        if data is None:
+            return
+        rootItem = self._rootItem
+        for node in data:
+            TreeQObjectModel._build_qobject_item(self, rootItem, node)
+    
+
+class TreeQObjectWidget(QBaseTreeWidget):
+
+    KnownPerspectives = {
+        "Default" : {
+            "label"   : "Default perspecive",
+            "tooltip" : "QObject tree view",
+            "icon"    : "",
+            "model"   : [TreeQObjectModel],
+        },
+    }
+
+    DftPerspective = "Default"
+
+
+    def __init__(self, parent=None, designMode=False, with_navigation_bar=True,
+                 with_filter_widget=True, perspective=None, proxy=None,
+                 qobject_root=None):
+        QBaseTreeWidget.__init__(self, parent, designMode=designMode, 
+                                 with_navigation_bar=with_navigation_bar,
+                                 with_filter_widget=with_filter_widget,
+                                 perspective=perspective, proxy=proxy)
+        qmodel = self.getQModel()
+        qmodel.setDataSource(get_qobject_tree(qobject=qobject_root))
+
+
+def build_gui():
+    mw = Qt.QMainWindow()
+    mw.setObjectName("main window")
+    w = Qt.QWidget()
+    w.setObjectName("central widget")
+    mw.setCentralWidget(w)
+    l = Qt.QVBoxLayout()
+    w.setLayout(l)
+    l1 = Qt.QLabel("H1")
+    l1.setObjectName("label 1")
+    l.addWidget(l1)
+    l2 = Qt.QLabel("H2")
+    l2.setObjectName("label 2")
+    l.addWidget(l2)
+    mw.show()
+    return mw
+
+
+def main():
+    from taurus.qt.qtgui.application import TaurusApplication
+    app = TaurusApplication()
+
+    w = build_gui()
+    tree = TreeQObjectWidget(qobject_root=w)    
+    tree.show()
+    #import pprint
+    #pprint.pprint(get_qobject_tree_str())
+    w.dumpObjectTree()
+    app.exec_()
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/qt/taurusqtoptions.py b/lib/taurus/qt/taurusqtoptions.py
index 2155d8d..e1cee64 100644
--- a/lib/taurus/qt/taurusqtoptions.py
+++ b/lib/taurus/qt/taurusqtoptions.py
@@ -38,8 +38,8 @@ QT_USE_API2 = True
 
 
 def get_logger():
-    import taurus.core.util
-    return taurus.core.util.Logger('TaurusQt')
+    import taurus.core.util.log
+    return taurus.core.util.log.Logger('TaurusQt')
 
 
 def prepare_pyqt():
diff --git a/lib/taurus/TaurusCustomSettings.py b/lib/taurus/tauruscustomsettings.py
similarity index 86%
copy from lib/taurus/TaurusCustomSettings.py
copy to lib/taurus/tauruscustomsettings.py
index d22dfdb..9c3686b 100644
--- a/lib/taurus/TaurusCustomSettings.py
+++ b/lib/taurus/tauruscustomsettings.py
@@ -45,4 +45,12 @@ T_FORM_CUSTOM_WIDGET_MAP = \
      'TwoDExpChannel':('taurus.qt.qtgui.extra_pool.PoolChannelTV',(),{}),
      'IORegister':('taurus.qt.qtgui.extra_pool.PoolIORegisterTV',(),{})
     }
-    
+
+# Lightweight imports:
+# True enables delayed imports (may break older code). 
+# False (or commented out) for backwards compatibility
+LIGHTWEIGHT_IMPORTS = False     
+
+# Extra Taurus schemes. You can add a list of modules to be loaded for 
+# providing support to new schemes
+# EXTRA_SCHEME_MODULES = ['myownschememodule']
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/panel/ui/__init__.py b/lib/taurus/web/__init__.py
similarity index 96%
copy from lib/taurus/qt/qtgui/panel/ui/__init__.py
copy to lib/taurus/web/__init__.py
index 208f8eb..836f149 100644
--- a/lib/taurus/qt/qtgui/panel/ui/__init__.py
+++ b/lib/taurus/web/__init__.py
@@ -24,6 +24,6 @@
 #############################################################################
 
 """
-__init__.py: 
 """
 
+__docformat__ = "restructuredtext"
\ No newline at end of file
diff --git a/lib/taurus/web/examples/tornado/countclient.html b/lib/taurus/web/examples/tornado/countclient.html
new file mode 100644
index 0000000..ecccf2f
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/countclient.html
@@ -0,0 +1,130 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus</title>
+  <link rel="shortcut icon" href="static/favicon.ico" type="image/x-icon">
+
+  <!-- JQuery (local) -->
+  <script type="text/javascript" src="static/js/jquery.js"></script>
+  <script type="text/javascript" src="static/js/jquery-ui.js"></script>
+  <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link>
+  <!-- JQuery (remote: google CDN) -->
+  <!--
+    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
+    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
+  -->
+  
+  <!-- JSXGraph (local) -->
+  <script type="text/javascript" src="static/js/jsxgraphcore.js"></script>
+  <script type="text/javascript" src="static/js/GeonextReader.js"></script>
+  <link type="text/css" href="static/css/jsxgraph.css" rel="stylesheet"></link>
+  <!-- JSXGraph (Remote) -->
+  <!--
+    <link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css" />
+    <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script>
+    <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/GeonextReader.js"></script>
+  -->
+
+  <!-- Dojo (local) -->
+  <script src="static/js/dojo/dojo.js" data-dojo-config="parseOnLoad: true, async: true"></script>
+
+  <!-- Dojo (remote: google CDN) -->
+  <!--<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.js" data-dojo-config="parseOnLoad: true, async: true"></script>-->
+  
+  <!-- taurus (local) -->
+  <link type="text/css" href="static/css/taurus.css" rel="stylesheet"></link>
+  
+  
+  <!-- Application -->
+  <script type="text/javascript" src="static/js/countclient.js"></script>
+  <style>
+    body {
+	    font-size: 62.5%;
+    }
+
+    div.taurus-demo {
+	    padding:12px;
+	    font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif";
+    }
+    div.taurus-demo h3.docs { clear:left; font-size:12px; font-weight:normal; padding:0 0 1em; margin:0; }
+
+    .toggler { width: 400px; height: 200px; }
+	#tangotest-attributes { width: 240px; height: 135px; padding: 0.4em; position: relative; }
+	#tangotest-attributes h3 { margin: 0; padding: 0.4em; text-align: center; }
+
+    div.motor-attributes {
+	    clear:both;
+	    padding:12px;
+	    font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif";
+	    font-size: 1.3em;
+	    line-height: 1.4em;
+	    width: 520px;
+    }
+  </style>
+</head>
+
+<body>
+  <h1>Taurus</h1>
+  <p>
+    <table border="0">
+      <tr>
+        <td><div id="plot" class="jxgbox" style="width:380px; height:380px;"></div></td>
+        <td>
+          <div id="gauge01" 
+               data-taurus-model="motor/motctrl01/1/position"
+               data-taurus-controller="Gauge"
+               style="width:260px; height:260px"></div>
+          </script>
+        </td>
+        <td><div id="geonext" class="jxgbox" style="width:380px; height:380px;"></div></td>
+      </tr>
+    </table>
+  </p>
+  <div class="taurus-demo">
+    <p>
+      <button id="show-tangotest">Show TangoTest</button>
+    </p>
+  
+    <div id="motor-attributes" title="Mot01" class="motor-attributes">
+      <table  border="0" cellpadding="2" cellspacing="0">
+      <tr>
+        <td data-taurus-model="motor/motctrl01/1/position?configuration=label"></td>
+        <td><div data-taurus-model="motor/motctrl01/1/position"></div></td>
+        <td><input type="number" data-taurus-model="motor/motctrl01/1/position" style="background-color:white;"></input></td>
+        <td><div data-taurus-model="motor/motctrl01/1/position?configuration=unit"></div></td>
+      </tr>
+      <tr>
+        <td><div data-taurus-model="motor/motctrl01/2/velocity?configuration=label"></div></td>
+        <td><div data-taurus-model="motor/motctrl01/2/velocity"></div></td>
+        <td><div data-taurus-model="motor/motctrl01/2/velocity?configuration=unit"></div></td>
+      </tr>
+      <tr>
+        <td><div data-taurus-model="motor/motctrl01/3/backlash?configuration=label"></div></td>
+        <td><div data-taurus-model="motor/motctrl01/3/backlash"></div></td>
+        <td><div data-taurus-model="motor/motctrl01/3/backlash?configuration=unit"></div></td>
+      </tr>
+      </table>
+    </div>
+
+    <div class="toggler">
+      <div id="tangotest-attributes" class="ui-widget-content ui-corner-all">
+        <h3 class="ui-widget-header ui-corner-all">TangoTest</h3>
+        <table  border="0" cellpadding="2" cellspacing="0">
+          <tr>
+            <td><div data-taurus-model="sys/tg_test/1/double_scalar?configuration=label"></div></td>
+            <td><div data-taurus-model="sys/tg_test/1/double_scalar"></div></td>
+            <td><div data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit"></div></td>
+          </tr>
+          <tr>
+            <td><div data-taurus-model="sys/tg_test/1/short_scalar?configuration=label"></div></td>
+            <td><div data-taurus-model="sys/tg_test/1/short_scalar"></div></td>
+            <td><div data-taurus-model="sys/tg_test/1/short_scalar?configuration=unit"></div></td>
+          </tr>
+        </table>
+      </div>
+    </div>
+  </div>
+
+
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/countserver.py b/lib/taurus/web/examples/tornado/countserver.py
new file mode 100644
index 0000000..0058bd3
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/countserver.py
@@ -0,0 +1,148 @@
+import os.path
+
+from tornado.web import Application, RequestHandler
+from tornado.websocket import WebSocketHandler
+from tornado.escape import json_encode, json_decode
+
+from taurus import Database, Device, Attribute, Configuration, Object
+from taurus.core import TaurusDatabase, TaurusDevice, TaurusAttribute, TaurusConfiguration
+from taurus.core import AttrQuality, TaurusEventType
+from taurus.core import AttributeNameValidator, ConfigurationNameValidator
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
+
+class MainHandler(RequestHandler):
+    def get(self):
+        self.render("countclient.html")
+
+
+class TestHandler(RequestHandler):
+    def get(self):
+        self.render("test.html")
+
+
+class TaurusWebAttribute(object):
+
+    TemplateDiv = """<div style="font-size: 24pt;{style}">{value}</div>"""
+    
+    def __init__(self, ws, name):
+        self.name = name
+        self.ws = ws
+        self.attribute.addListener(self)
+    
+    @property
+    def attribute(self):
+        return Attribute(self.name)
+    
+    def eventReceived(self, evt_src, evt_type, evt_value):
+        modelObj = evt_src
+        data = {}
+        if evt_type == TaurusEventType.Error:
+            data['css'] = {'color':'white', 'background-color' : 'red'}
+            data['html'] = str(evt_value)
+        else:
+            if evt_type == TaurusEventType.Config:
+                modelObj = evt_src.getParentObj()
+                data['title'] = evt_src.description
+            valueObj = modelObj.getValueObj()
+            value = valueObj.value
+            quality = valueObj.quality
+            bg, fg = ATTRIBUTE_QUALITY_PALETTE.rgb_pair(quality)
+            bg, fg = "rgb{0}".format(bg), "rgb{0}".format(fg)
+            data['css'] = {'color': fg, 'background-color' : bg}
+            data['html'] = modelObj.displayValue(value)
+            data['value'] = value
+#        data['css']['font-size'] = "24pt";  
+        data['model'] = modelObj.getNormalName()
+        json_data = json_encode(data)
+        self.write_message(json_data)
+
+    def write_message(self, message):
+        return self.ws.write_message(message)
+
+    def clear(self):
+        self.attribute.removeListener(self)
+
+
+class TaurusWebConfiguration(object):
+
+    TemplateDiv = """<div style="font-size: 24pt;{style}">{value}</div>"""
+    
+    def __init__(self, ws, name):
+        self.name = name
+        self.param = ConfigurationNameValidator().getParams(name)['configparam']
+        self.ws = ws
+        self.configuration.addListener(self)
+    
+    @property
+    def configuration(self):
+        return Configuration(self.name)
+    
+    def eventReceived(self, evt_src, evt_type, evt_value):
+        modelObj = evt_src
+        data = {}
+        if evt_type == TaurusEventType.Error:
+            data['css'] = {'color':'white', 'background-color' : 'red'}
+            data['html'] = str(evt_value)
+        else:
+            data['css'] = {}
+            data['html'] = getattr(modelObj, self.param)
+            data['title'] = modelObj.description
+            
+ #       data['css']['font-size'] = "24pt";  
+        data['model'] = self.name
+        json_data = json_encode(data)
+        self.write_message(json_data)
+
+    def write_message(self, message):
+        return self.ws.write_message(message)
+    
+    def clear(self):
+        self.configuration.removeListener(self)
+
+        
+class TaurusSocket(WebSocketHandler):
+
+    def open(self):
+        self.models = set()
+        
+    def on_message(self, json_data):
+        data = json_decode(json_data)
+        if 'models' in data:
+            self.clear_models()
+            model_names = set(data['models'])
+            for model_name in model_names:
+                model_name = str(model_name)
+                if AttributeNameValidator().isValid(model_name):
+                    web_model = TaurusWebAttribute(self, model_name)
+                elif ConfigurationNameValidator().isValid(model_name):
+                    web_model = TaurusWebConfiguration(self, model_name)
+                else:
+                    continue
+                self.models.add(web_model)
+            
+    def on_close(self):
+        self.clear_models()
+
+    def clear_models(self):
+        for model in self.models:
+            model.clear()
+        self.models.clear()
+        
+def main():
+    local_path = os.path.dirname(__file__)
+    static_path= os.path.join(local_path, 'static')
+    handlers = [ (r"/", MainHandler), 
+                 (r"/test", TestHandler), 
+                 (r"/taurus", TaurusSocket), ]
+    application = Application(handlers, static_path=static_path)
+    application.listen(8888)
+    print "Starting..."
+    try:
+        import tornado.ioloop
+        tornado.ioloop.IOLoop.instance().start()
+        print "Finished"
+    except KeyboardInterrupt:
+        print "Finished by Keyboard interrupt (Ctrl+C)"
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/web/examples/tornado/demo.html b/lib/taurus/web/examples/tornado/demo.html
new file mode 100644
index 0000000..a2c5cde
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus WEB demo</title>
+  <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+  <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+</head>
+<body>
+    <ul>
+        <li><a href="demo1.html">Demo 1</a></li>
+        <li><a href="demo2.html">Demo 2</a></li>
+        <li><a href="demo3.html">Demo 3</a></li>
+        <li><a href="demo4.html">Demo 4</a></li>
+    </ul>
+</body>
+</html>
diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/web/examples/tornado/demo.py
similarity index 62%
copy from lib/taurus/core/taurusexception.py
copy to lib/taurus/web/examples/tornado/demo.py
index ad3e9ae..04d265b 100644
--- a/lib/taurus/core/taurusexception.py
+++ b/lib/taurus/web/examples/tornado/demo.py
@@ -23,21 +23,32 @@
 ##
 #############################################################################
 
-"""This module contains the taurus base exception classes"""
-
-__all__ = ["TaurusException", "DoubleRegistration"]
+"""
+"""
 
 __docformat__ = "restructuredtext"
 
-class TaurusException(Exception):
+import os.path
+
+from taurus.web.taurustornado import RequestHandler
+from taurus.web.taurustornado import start, get_default_handlers
+
+class MainPageHandler(RequestHandler):
+    def get(self):
+        self.render("demo.html")
 
-    def __init__(self, description, code = None):
-        #Exception.__init__(self, description, code)
-        self.code = code
-        self.description = description
+class DemoPageHandler(RequestHandler):
     
-    def __str__(self):
-        return str(self.description)
+    def get(self, page):
+        self.render(page)
+
+
+def main():
+    local_path = os.path.dirname(__file__)
+    static_path = os.path.join(local_path, 'static')
+    handlers = [ (r"/", MainPageHandler),  (r"/(demo.*)", DemoPageHandler)] + get_default_handlers() 
     
-class DoubleRegistration(TaurusException):
-    pass
+    start(handlers=handlers, port=8888, static_path=static_path, debug=True)
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/web/examples/tornado/demo1.html b/lib/taurus/web/examples/tornado/demo1.html
new file mode 100644
index 0000000..5c1edf8
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo1.html
@@ -0,0 +1,189 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus WEB demo 1</title>
+  <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+  
+  <!-- JQuery -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+    <!-- Google CDN -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+  <!-- So far I don't need JQuery UI in this example so keep it commented -->
+  <!-- JQuery UI -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+    <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+    <!-- Google CDN -->
+    <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+    <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+  
+  <!-- So far I don't need Highcharts in this example so keep it commented -->
+  <!-- Highcharts -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+    
+  <!-- taurus -->
+    <!-- local -->
+    <script type="text/javascript" src="taurus/js/taurus.js"></script>
+    <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+    
+  <!-- Application -->
+    <script type="text/javascript" src="static/js/demo.js"></script>
+    <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+    <script type="text/javascript" src="static/js/demo1.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 1 - simple Tango attributes</div>
+<br/>
+<table class="MS Panel">
+  <tr>
+    <!-- left column -->
+    <td>
+      <p><table class="Form">
+        <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Sardana motor 01</td></tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/position" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/velocity" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/acceleration" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/state" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/status" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=unit" /></td>
+        </tr>
+      </table></p>
+      <p><table class="Form">
+        <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td></tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+        </tr>
+      </table></p>
+    </td>
+    
+    <!-- right column -->
+    <td> 
+      <table class="Panel">
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">MSPD</td>
+          <td class="MSFETitle">FE04</td>
+          <td class="MSIDTitle">SCW30</td>
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">MISTRAL</td>
+          <td class="MSFETitle">FE09</td>
+          <td class="MSIDTitle">BEND</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">NCD</td>
+          <td class="MSFETitle">FE11</td>
+          <td class="MSIDTitle">IVU21</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/short_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">XALOC</td>
+          <td class="MSFETitle">FE13</td>
+          <td class="MSIDTitle">IVU21</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">CLAESS</td>
+          <td class="MSFETitle">FE22</td>
+          <td class="MSIDTitle">MPW80</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/float_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">CIRCE</td>
+          <td class="MSFETitle">FE24</td>
+          <td class="MSIDTitle">EU62</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/ulong_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">BOREAS</td>
+          <td class="MSFETitle">FE29</td>
+          <td class="MSIDTitle">EU71</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+        </tr>
+
+      </table>
+    </td>
+  </tr>
+</table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/demo2.html b/lib/taurus/web/examples/tornado/demo2.html
new file mode 100644
index 0000000..277ae89
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo2.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus WEB demo 2</title>
+  <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+  
+  <!-- JQuery -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+    <!-- Google CDN -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+  <!-- So far I don't need JQuery UI in this example so keep it commented -->
+  <!-- JQuery UI -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+    <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+    <!-- Google CDN -->
+    <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+    <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+  
+  <!-- So far I don't need Highcharts in this example so keep it commented -->
+  <!-- Highcharts -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+    <!-- Highcharts.com -->
+    <script src="http://code.highcharts.com/highcharts.js"></script>
+
+  <!-- Necessary style (font) for gauge -->
+    <link href='http://fonts.googleapis.com/css?family=Squada+One' rel='stylesheet' type='text/css'> 
+    
+  <!-- taurus -->
+    <!-- local -->
+    <script type="text/javascript" src="taurus/js/taurus.js"></script>
+    <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+    
+  <!-- Application -->
+    <script type="text/javascript" src="static/js/demo.js"></script>
+    <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+    <script type="text/javascript" src="static/js/demo2.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 2 - simple highcharts</div>
+<br/>
+<table><tr>
+    <td>
+    <table class="Form">
+        <tr>
+            <td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+        </tr>
+    </table>
+    </td>
+    <td>
+        <div id="highcharts-canvas" style="display:inline; width:600px; height: 300px; margin: 0 auto;"></div>
+    </td>
+</tr></table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/demo3.html b/lib/taurus/web/examples/tornado/demo3.html
new file mode 100644
index 0000000..c6e5339
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo3.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus WEB demo 2</title>
+  <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+  
+  <!-- JQuery -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+    <!-- Google CDN -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+  <!-- So far I don't need JQuery UI in this example so keep it commented -->
+  <!-- JQuery UI -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+    <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+    <!-- Google CDN -->
+    <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+    <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+  
+  <!-- So far I don't need Highcharts in this example so keep it commented -->
+  <!-- Highcharts -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+    <!-- Highcharts.com -->
+    <script src="http://code.highcharts.com/highcharts.js"></script>
+
+  <!-- Necessary style (font) for gauge -->
+    <link href='http://fonts.googleapis.com/css?family=Squada+One' rel='stylesheet' type='text/css'> 
+    
+  <!-- taurus -->
+    <!-- local -->
+    <script type="text/javascript" src="taurus/js/taurus.js"></script>
+    <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+    
+  <!-- Application -->
+    <script type="text/javascript" src="static/js/demo.js"></script>
+    <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+    <script type="text/javascript" src="static/js/demo3.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 2 - simple highcharts</div>
+<br/>
+<table><tr>
+    <td>
+    <table class="Form">
+        <tr>
+            <td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+            <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+            <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+        </tr>
+    </table>
+    </td>
+    <td>
+        <div id="highcharts-canvas" style="display:inline; width:600px; height: 300px; margin: 0 auto;"></div>
+    </td>
+</tr></table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/demo4.html b/lib/taurus/web/examples/tornado/demo4.html
new file mode 100644
index 0000000..4b55b24
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/demo4.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus WEB demo 1</title>
+  <link rel="shortcut icon" href="taurus/favicon.ico" type="image/x-icon">
+  
+  <!-- JQuery -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+    <!-- Google CDN -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+  <!-- So far I don't need JQuery UI in this example so keep it commented -->
+  <!-- JQuery UI -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+    <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+    <!-- Google CDN -->
+    <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+    <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+  
+  <!-- So far I don't need Highcharts in this example so keep it commented -->
+  <!-- Highcharts -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+    
+  <!-- taurus -->
+    <!-- local -->
+    <script type="text/javascript" src="taurus/js/taurus.js"></script>
+    <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+    
+  <!-- Application -->
+    <script type="text/javascript" src="static/js/demo.js"></script>
+    <link type="text/css" href="static/css/demo.css" rel="stylesheet"></link>
+
+    <script type="text/javascript" src="static/js/demo4.js"></script>
+
+</head>
+
+<body class="MS">
+<div class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Taurus WEB demo 4 - Tango attribute arrays</div>
+<br/>
+<table class="Form">
+    <tr>
+        <td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td>
+    </tr>
+    <tr>
+        <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_spectrum_ro?configuration=label" /></td>
+        <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_spectrum_ro" /></td>
+        <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_spectrum_ro?configuration=unit" /></td>
+    </tr>
+</table>
+</body>
+</html>
diff --git a/lib/taurus/web/examples/tornado/machinestatus.html b/lib/taurus/web/examples/tornado/machinestatus.html
new file mode 100644
index 0000000..03201df
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/machinestatus.html
@@ -0,0 +1,184 @@
+<!doctype html>
+<html>
+<head>
+  <title>Taurus WEB demo</title>
+  <link rel="shortcut icon" href="static/favicon.ico" type="image/x-icon">
+  
+  <!-- JQuery -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery/jquery.js"></script> -->
+    <!-- Google CDN -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
+
+  <!-- So far I don't need JQuery UI in this example so keep it commented -->
+  <!-- JQuery UI -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="thirdparty/jquery-ui-1.10.2/ui/jquery-ui.js"></script> -->
+    <!-- <link type="text/css" href="thirdparty/jquery-ui-1.10.2/themes/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+    <!-- Google CDN -->
+    <!-- <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script> -->
+    <!-- MediaTemple CDN -->
+    <!-- <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" /></script> -->
+    <!-- <link type="text/css" href="static/css/jquery-ui/ui-lightness/jquery-ui.css" rel="stylesheet"></link> -->
+  
+  <!-- So far I don't need Highcharts in this example so keep it commented -->
+  <!-- Highcharts -->
+    <!-- local -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/highcharts.js"></script> -->
+    <!-- <script type="text/javascript" src="static/thirdparty/highcharts/js/modules/exporting.js"></script> -->
+    
+  <!-- taurus -->
+    <!-- local -->
+    <script type="text/javascript" src="taurus/js/taurus.js"></script>
+    <link type="text/css" href="taurus/css/taurus.css" rel="stylesheet"></link>
+    
+  <!-- Application -->
+    <script type="text/javascript" src="static/js/machinestatus.js"></script>
+    <link type="text/css" href="static/css/machinestatus.css" rel="stylesheet"></link>
+
+</head>
+
+<body class="MS">
+<table class="MS Panel">
+  <tr>
+    <!-- left column -->
+    <td>
+      <p><table class="Form">
+        <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Sardana motor 01</td></tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/positions" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/position?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/velocity" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/velocity?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/acceleration" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/acceleration?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/state" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/state?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="motor/motctrl01/1/status" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="motor/motctrl01/1/status?configuration=unit" /></td>
+        </tr>
+      </table></p>
+      <p><table class="Form">
+        <tr><td colspan="3" class="Panel" style="text-align: center; background-color: rgb(180,0,0);">Tango test</td></tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/state" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/state?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/status" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/status?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/double_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/long_scalar?configuration=unit" /></td>
+        </tr>
+        <tr>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=label" /></td>
+          <td><div class="Label BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="XTLabelValue" data-taurus-model="sys/tg_test/1/string_scalar?configuration=unit" /></td>
+        </tr>
+      </table></p>
+    </td>
+    
+    <!-- right column -->
+    <td> 
+      <table class="Panel">
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">MSPD</td>
+          <td class="MSFETitle">FE04</td>
+          <td class="MSIDTitle">SCW30</td>
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">MISTRAL</td>
+          <td class="MSFETitle">FE09</td>
+          <td class="MSIDTitle">BEND</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">NCD</td>
+          <td class="MSFETitle">FE11</td>
+          <td class="MSIDTitle">IVU21</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/short_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">XALOC</td>
+          <td class="MSFETitle">FE13</td>
+          <td class="MSIDTitle">IVU21</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/long_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">CLAESS</td>
+          <td class="MSFETitle">FE22</td>
+          <td class="MSIDTitle">MPW80</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/float_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">CIRCE</td>
+          <td class="MSFETitle">FE24</td>
+          <td class="MSIDTitle">EU62</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/ulong_scalar" /></td>
+        </tr>
+
+        <tr>
+          <td class="MSBLTitle" rowspan="2">BOREAS</td>
+          <td class="MSFETitle">FE29</td>
+          <td class="MSIDTitle">EU71</td>            
+        </tr>
+        <tr>
+          <td><div class="FELabel BorderLabel" data-taurus-model="sys/tg_test/1/string_scalar" /></td>
+          <td><div class="IDLabel BorderLabel" data-taurus-model="sys/tg_test/1/double_scalar" /></td>
+        </tr>
+
+      </table>
+    </td>
+  </table>
+</body>
+</html>
diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/web/examples/tornado/machinestatus.py
similarity index 67%
copy from lib/taurus/core/taurusexception.py
copy to lib/taurus/web/examples/tornado/machinestatus.py
index ad3e9ae..161ef5c 100644
--- a/lib/taurus/core/taurusexception.py
+++ b/lib/taurus/web/examples/tornado/machinestatus.py
@@ -23,21 +23,26 @@
 ##
 #############################################################################
 
-"""This module contains the taurus base exception classes"""
-
-__all__ = ["TaurusException", "DoubleRegistration"]
+"""
+"""
 
 __docformat__ = "restructuredtext"
 
-class TaurusException(Exception):
+import os.path
 
-    def __init__(self, description, code = None):
-        #Exception.__init__(self, description, code)
-        self.code = code
-        self.description = description
-    
-    def __str__(self):
-        return str(self.description)
+from taurus.web.taurustornado import RequestHandler
+from taurus.web.taurustornado import start, get_default_handlers
+
+class MainHandler(RequestHandler):
+    def get(self):
+        self.render("machinestatus.html")
+
+def main():
+    local_path = os.path.dirname(__file__)
+    static_path = os.path.join(local_path, 'static')
+    handlers = [ (r"/", MainHandler) ] + get_default_handlers() 
     
-class DoubleRegistration(TaurusException):
-    pass
+    start(handlers=handlers, static_path=static_path, debug=True)
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/web/examples/tornado/static/css/demo.css b/lib/taurus/web/examples/tornado/static/css/demo.css
new file mode 100644
index 0000000..a0056bf
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/css/demo.css
@@ -0,0 +1,83 @@
+
+.MS { color: #FFFFFF; 
+      font-family: Sans-serif; }
+
+body.MS { background-color: #444444; }
+
+table.MS { }
+
+.Panel { width: 100%;
+         border-width: 1px;
+         border-style: solid;
+         border-radius: 5px;
+         border-color: white;
+         padding: 4px; }
+
+.PanelMin {
+         border-width: 1px;
+         border-style: solid;
+         border-radius: 5px;
+         border-color: white;
+         padding: 4px; }
+
+.Form {
+         border-width: 1px;
+         border-style: solid;
+         border-radius: 5px;
+         border-color: white;
+         padding: 4px; 
+         background-image: linear-gradient(to bottom right, #CCCCCC 0%, #008BCC 100%);
+}
+
+.PanelUp { border-top-width: 1px;
+            border-left-width: 1px;
+            border-right-width: 1px;
+            border-top-style :solid;
+            border-left-style: solid;
+            border-right-style: solid;
+            border-bottom-style: none;
+            border-top-left-radius: 5px;
+            border-top-right-radius: 5px;
+            border-color: whitesmoke; 
+            margin: 2px;
+            padding: 4px; }
+            
+.MSBLTitle { font-family: arial, serif;
+             font-size : xx-large;
+             font-weight : bold;
+             text-align  : left; }
+
+.MSFETitle { font-family: arial, serif;
+             font-size : x-large;
+             font-weight : normal;
+             text-align  : left; }
+
+.MSIDTitle { font-family: arial, serif;
+             font-size : x-large;
+             font-weight : normal;
+             text-align  : left;  }
+
+.Label { 
+         font-weight : normal;
+         font-family : monospace;
+         text-align  : right;
+         vertical-align: middle; }
+             
+.FELabel { font-size   : large;
+           font-weight : normal;
+           font-family : monospace;
+           text-align  : center; 
+           vertical-align: middle; }
+
+.IDLabel { font-size   : large;
+           font-weight : normal;
+           font-family : monospace;
+           text-align  : right;
+           vertical-align: middle; }
+
+.BorderLabel { border-width:0px;
+          border-style:solid;
+          border-radius: 2px;
+          margin: auto;
+          padding: 4px; }
+          
diff --git a/lib/taurus/web/examples/tornado/static/css/machinestatus.css b/lib/taurus/web/examples/tornado/static/css/machinestatus.css
new file mode 100644
index 0000000..1a91ea5
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/css/machinestatus.css
@@ -0,0 +1,76 @@
+
+.MS { color: #FFFFFF; 
+      font-family: Sans-serif; }
+
+body.MS { background-color: #444444; }
+
+table.MS { }
+
+.Panel { width: 100%;
+         border-width: 1px;
+         border-style: solid;
+         border-radius: 5px;
+         border-color: white;
+         padding: 4px; }
+
+.Form {
+         border-width: 1px;
+         border-style: solid;
+         border-radius: 5px;
+         border-color: white;
+         padding: 4px; 
+         background-image: linear-gradient(to bottom right, #CCCCCC 0%, #008BCC 100%);
+}
+
+.PanelUp { border-top-width: 1px;
+            border-left-width: 1px;
+            border-right-width: 1px;
+            border-top-style :solid;
+            border-left-style: solid;
+            border-right-style: solid;
+            border-bottom-style: none;
+            border-top-left-radius: 5px;
+            border-top-right-radius: 5px;
+            border-color: whitesmoke; 
+            margin: 2px;
+            padding: 4px; }
+            
+.MSBLTitle { font-family: arial, serif;
+             font-size : xx-large;
+             font-weight : bold;
+             text-align  : left; }
+
+.MSFETitle { font-family: arial, serif;
+             font-size : x-large;
+             font-weight : normal;
+             text-align  : left; }
+
+.MSIDTitle { font-family: arial, serif;
+             font-size : x-large;
+             font-weight : normal;
+             text-align  : left;  }
+
+.Label { 
+         font-weight : normal;
+         font-family : monospace;
+         text-align  : right;
+         vertical-align: middle; }
+             
+.FELabel { font-size   : large;
+           font-weight : normal;
+           font-family : monospace;
+           text-align  : center; 
+           vertical-align: middle; }
+
+.IDLabel { font-size   : large;
+           font-weight : normal;
+           font-family : monospace;
+           text-align  : right;
+           vertical-align: middle; }
+
+.BorderLabel { border-width:0px;
+          border-style:solid;
+          border-radius: 2px;
+          margin: auto;
+          padding: 4px; }
+          
diff --git a/lib/taurus/web/examples/tornado/static/js/countclient.coffee b/lib/taurus/web/examples/tornado/static/js/countclient.coffee
new file mode 100644
index 0000000..bb11f5c
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/countclient.coffee
@@ -0,0 +1,75 @@
+taurus_websocket = null
+
+taurus_models = ->
+    ( elem.dataset['taurusModel'] for elem in $('[data-taurus-model]') )
+
+taurus_element = (model) ->
+    $('[data-taurus-model="' + model + '"]')
+
+initialize = ->
+
+    console.log("Initializing page...")
+
+    $('title').html(':: Taurus ::')
+
+    gauge_props = 
+        interactionArea: "none"
+        minimum: -140
+        maximum: 150
+
+    dom = require("dojo/dom")
+    CircularLinearGauge = require("dojox/dgauges/components/default/CircularLinearGauge")
+    gauge = new CircularLinearGauge(gauge_props, dom.byId("gauge01"))
+    gauge.set('value', 44)
+    
+    taurus_websocket = new WebSocket("ws://pc151.cells.es:8888/taurus")
+
+    taurus_websocket.onopen = ->
+        $('title').html(':: Taurus :: Connected')
+        initialize_taurus()
+        
+    taurus_websocket.onmessage = (event) ->
+        event_data = JSON.parse(event.data)
+        elements = taurus_element(event_data.model)
+        elements.filter(":not([data-taurus-controller = 'Gauge'])").css(event_data.css).html(event_data.html)
+        elements.filter("input").css('background-color','').css('color','')
+        g = elements.filter("#gauge01")
+        if g.length and gauge
+            indicatorText = gauge.getElement("indicatorText")
+            indicatorText.set('value', event_data.html)
+            indicatorText.indicator.set('value', event_data.html)
+        
+    taurus_websocket.onerror = (event) ->
+        $('body').append('<div>Error:' + event + ' ' + '</div>')
+
+    taurus_websocket.onclose = (event) ->
+        $('title').html(':: Taurus :: Disconnected')
+
+    plot = JXG.JSXGraph.initBoard('plot', {boundingbox: [-10, 10, 10, -10], axis:true, grid:true})
+    geonext = JXG.JSXGraph.loadBoardFromFile('geonext', 'static/geonext/triangle.gxt', 'Geonext')    
+
+    props = 
+        position : ["right", "bottom"]
+        width : 460
+#        buttons : 
+#            Ok : -> $(this).dialog("close")
+    
+    $('#motor-attributes').dialog(props)
+    
+    $("#tangotest-attributes" ).hide()
+    $('#show-tangotest').button().click(-> $('#tangotest-attributes').show('bounce', {}, 500, ->))
+
+    console.log("Finished initializing page")
+     
+initialize_taurus = ->
+    console.log("Initializing taurus...")
+    models = taurus_models()
+    json_models = JSON.stringify({models : models})
+    taurus_websocket.send(json_models)
+    console.log("Finished initializing taurus")
+    
+$ ->
+    dojo_requirements = ["dojo/_base/kernel", "dojo/parser", "dojo/dom",
+                         "dojox/dgauges/components/default/CircularLinearGauge"]
+
+    require(dojo_requirements, initialize)  
diff --git a/lib/taurus/web/examples/tornado/static/js/countclient.js b/lib/taurus/web/examples/tornado/static/js/countclient.js
new file mode 100644
index 0000000..106978d
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/countclient.js
@@ -0,0 +1,94 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+  var initialize, initialize_taurus, taurus_element, taurus_models, taurus_websocket;
+
+  taurus_websocket = null;
+
+  taurus_models = function() {
+    var elem, _i, _len, _ref, _results;
+    _ref = $('[data-taurus-model]');
+    _results = [];
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      elem = _ref[_i];
+      _results.push(elem.dataset['taurusModel']);
+    }
+    return _results;
+  };
+
+  taurus_element = function(model) {
+    return $('[data-taurus-model="' + model + '"]');
+  };
+
+  initialize = function() {
+    var CircularLinearGauge, dom, gauge, gauge_props, geonext, plot, props;
+    console.log("Initializing page...");
+    $('title').html(':: Taurus ::');
+    gauge_props = {
+      interactionArea: "none",
+      minimum: -140,
+      maximum: 150
+    };
+    dom = require("dojo/dom");
+    CircularLinearGauge = require("dojox/dgauges/components/default/CircularLinearGauge");
+    gauge = new CircularLinearGauge(gauge_props, dom.byId("gauge01"));
+    gauge.set('value', 44);
+    taurus_websocket = new WebSocket("ws://pc151.cells.es:8888/taurus");
+    taurus_websocket.onopen = function() {
+      $('title').html(':: Taurus :: Connected');
+      return initialize_taurus();
+    };
+    taurus_websocket.onmessage = function(event) {
+      var elements, event_data, g, indicatorText;
+      event_data = JSON.parse(event.data);
+      elements = taurus_element(event_data.model);
+      elements.filter(":not([data-taurus-controller = 'Gauge'])").css(event_data.css).html(event_data.html);
+      elements.filter("input").css('background-color', '').css('color', '');
+      g = elements.filter("#gauge01");
+      if (g.length && gauge) {
+        indicatorText = gauge.getElement("indicatorText");
+        indicatorText.set('value', event_data.html);
+        return indicatorText.indicator.set('value', event_data.html);
+      }
+    };
+    taurus_websocket.onerror = function(event) {
+      return $('body').append('<div>Error:' + event + ' ' + '</div>');
+    };
+    taurus_websocket.onclose = function(event) {
+      return $('title').html(':: Taurus :: Disconnected');
+    };
+    plot = JXG.JSXGraph.initBoard('plot', {
+      boundingbox: [-10, 10, 10, -10],
+      axis: true,
+      grid: true
+    });
+    geonext = JXG.JSXGraph.loadBoardFromFile('geonext', 'static/geonext/triangle.gxt', 'Geonext');
+    props = {
+      position: ["right", "bottom"],
+      width: 460
+    };
+    $('#motor-attributes').dialog(props);
+    $("#tangotest-attributes").hide();
+    $('#show-tangotest').button().click(function() {
+      return $('#tangotest-attributes').show('bounce', {}, 500, function() {});
+    });
+    return console.log("Finished initializing page");
+  };
+
+  initialize_taurus = function() {
+    var json_models, models;
+    console.log("Initializing taurus...");
+    models = taurus_models();
+    json_models = JSON.stringify({
+      models: models
+    });
+    taurus_websocket.send(json_models);
+    return console.log("Finished initializing taurus");
+  };
+
+  $(function() {
+    var dojo_requirements;
+    dojo_requirements = ["dojo/_base/kernel", "dojo/parser", "dojo/dom", "dojox/dgauges/components/default/CircularLinearGauge"];
+    return require(dojo_requirements, initialize);
+  });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo.js b/lib/taurus/web/examples/tornado/static/js/demo.js
new file mode 100644
index 0000000..a1ed2b6
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo.js
@@ -0,0 +1,14 @@
+
+(function() {
+  var initialize_demo;
+
+  initialize_demo = function() {
+    console.log("Initializing taurus WEB generic demo application...");
+    return console.log("Finished initializing taurus WEB generic demo application");
+  };
+
+  $(function() {
+    return initialize_demo();
+  });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo1.js b/lib/taurus/web/examples/tornado/static/js/demo1.js
new file mode 100644
index 0000000..ebca6a1
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo1.js
@@ -0,0 +1,14 @@
+
+(function() {
+  var initialize_demo1;
+
+  initialize_demo1 = function() {
+    console.log("Initializing taurus WEB demo 1 application...");
+    return console.log("Finished initializing taurus WEB demo 1 application");
+  };
+
+  $(function() {
+    return initialize_demo1();
+  });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo2.js b/lib/taurus/web/examples/tornado/static/js/demo2.js
new file mode 100644
index 0000000..9f8fa5a
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo2.js
@@ -0,0 +1,41 @@
+
+(function() {
+  var initialize_demo2;
+
+  initialize_demo2 = function() {
+    console.log("Initializing taurus WEB demo 2 application...");
+    init_highcharts();
+    return console.log("Finished initializing taurus WEB demo 2 application");
+  };
+
+  $(function() {
+    return initialize_demo2();
+  });
+
+  init_highcharts = function () {
+    $('#highcharts-canvas').highcharts({
+        chart: {
+            type: 'bar'
+        },
+        title: {
+            text: 'Fruit Consumption'
+        },
+        xAxis: {
+            categories: ['Apples', 'Bananas', 'Oranges']
+        },
+        yAxis: {
+            title: {
+                text: 'Fruit eaten'
+            }
+        },
+        series: [{
+            name: 'Jane',
+            data: [1, 0, 4]
+        }, {
+            name: 'John',
+            data: [5, 7, 3]
+        }]
+    });
+  };
+    
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo3.js b/lib/taurus/web/examples/tornado/static/js/demo3.js
new file mode 100644
index 0000000..0bc6e8e
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo3.js
@@ -0,0 +1,44 @@
+
+(function() {
+  var initialize_demo3;
+
+  initialize_demo3 = function() {
+    console.log("Initializing taurus WEB demo 3 application...");
+    init_highcharts();
+    return console.log("Finished initializing taurus WEB demo 3 application");
+  };
+
+  $(function() {
+    return initialize_demo3();
+  });
+
+  init_highcharts = function () {
+    var chart = new Highcharts.Chart({
+        chart: {
+            renderTo: 'highcharts-canvas',
+            //type: 'line'
+        },
+        title: {
+            text: 'Fruit Consumption'
+        },
+        series: [{
+            name: 'Jane',
+            data: []
+        }],
+        
+        taurus_model : "sys/tg_test/1/double_scalar"
+    });
+    
+    taurus_listener = function (event_data) {
+        if (event_data.model == chart.options.taurus_model) {
+            console.log(event_data.value);
+            data = chart.series.data
+            data.push([data.length,event_data.value]);
+            console.log(chart.series[0].data);
+            chart.redraw();
+        }
+    };
+    
+    taurus_onmessage_callbacks.add(taurus_listener);
+};
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/demo4.js b/lib/taurus/web/examples/tornado/static/js/demo4.js
new file mode 100644
index 0000000..4a35cf6
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/demo4.js
@@ -0,0 +1,14 @@
+
+(function() {
+  var initialize_demo4;
+
+  initialize_demo4 = function() {
+    console.log("Initializing taurus WEB demo 4 application...");
+    return console.log("Finished initializing taurus WEB demo 4 application");
+  };
+
+  $(function() {
+    return initialize_demo4();
+  });
+
+}).call(this);
diff --git a/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee b/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee
new file mode 100644
index 0000000..4164093
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee
@@ -0,0 +1,9 @@
+
+initialize = ->
+
+    console.log("Initializing taurus WEB demo application...")
+    console.log("Finished initializing taurus WEB demo application")
+
+$ ->
+    initialize()
+
diff --git a/lib/taurus/web/examples/tornado/static/js/machinestatus.js b/lib/taurus/web/examples/tornado/static/js/machinestatus.js
new file mode 100644
index 0000000..95dca01
--- /dev/null
+++ b/lib/taurus/web/examples/tornado/static/js/machinestatus.js
@@ -0,0 +1,14 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+  var initialize;
+
+  initialize = function() {
+    console.log("Initializing taurus WEB machine status application...");
+    return console.log("Finished initializing taurus WEB machine status application");
+  };
+
+  $(function() {
+    return initialize();
+  });
+
+}).call(this);
diff --git a/lib/taurus/web/static/css/digital.ttf b/lib/taurus/web/static/css/digital.ttf
new file mode 100644
index 0000000..16b2f6c
Binary files /dev/null and b/lib/taurus/web/static/css/digital.ttf differ
diff --git a/lib/taurus/web/static/css/taurus.css b/lib/taurus/web/static/css/taurus.css
new file mode 100644
index 0000000..93d9456
--- /dev/null
+++ b/lib/taurus/web/static/css/taurus.css
@@ -0,0 +1,5 @@
+
+ at font-face {
+    font-family: "digital";
+    src: url("digital.ttf") format("truetype");
+}
diff --git a/lib/taurus/web/static/favicon.ico b/lib/taurus/web/static/favicon.ico
new file mode 100644
index 0000000..7793294
Binary files /dev/null and b/lib/taurus/web/static/favicon.ico differ
diff --git a/lib/taurus/web/static/js/taurus.coffee b/lib/taurus/web/static/js/taurus.coffee
new file mode 100644
index 0000000..0cb0a96
--- /dev/null
+++ b/lib/taurus/web/static/js/taurus.coffee
@@ -0,0 +1,42 @@
+taurus_websocket = null
+
+taurus_models = ->
+    ( elem.dataset['taurusModel'] for elem in $('[data-taurus-model]') )
+
+taurus_element = (model) ->
+    $('[data-taurus-model="' + model + '"]')
+
+initialize = ->
+
+    console.log("Initializing page...")
+
+    taurus_websocket = new WebSocket("ws://160.103.207.112:8888/taurus")
+
+    taurus_websocket.onopen = ->
+        console.log("Websocket connected")
+        # $('title').html(':: ALBA Machine Status :: Connected')
+        initialize_taurus()
+        
+    taurus_websocket.onmessage = (event) ->
+        event_data = JSON.parse(event.data)
+        elements = taurus_element(event_data.model)
+        elements.css(event_data.css).html(event_data.html)
+        
+    taurus_websocket.onerror = (event) ->
+        $('body').append('<div>Error:' + event + ' ' + '</div>')
+
+    taurus_websocket.onclose = (event) ->
+        console.log("Websocket DISCONNECTED")
+
+    console.log("Finished initializing page")
+     
+initialize_taurus = ->
+    console.log("Initializing taurus...")
+    models = taurus_models()
+    json_models = JSON.stringify({models : models})
+    taurus_websocket.send(json_models)
+    console.log("Finished initializing taurus")
+    
+$ ->
+    initialize()
+
diff --git a/lib/taurus/web/static/js/taurus.js b/lib/taurus/web/static/js/taurus.js
new file mode 100644
index 0000000..32d134f
--- /dev/null
+++ b/lib/taurus/web/static/js/taurus.js
@@ -0,0 +1,95 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+    var initialize, initialize_taurus, taurus_element, taurus_models, taurus_websocket;
+
+    taurus_websocket = null;
+
+    taurus_models = function() {
+        var elem, _i, _len, _ref, _results;
+        _ref = $('[data-taurus-model]');
+        _results = [];
+
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            elem = _ref[_i];
+            _results.push(elem.dataset['taurusModel']);
+        }
+        console.log(_results);
+        return _results;
+    };
+
+    taurus_element = function(model) {
+
+        return $('[data-taurus-model="' + model + '"]');
+    };
+
+    initialize = function() {
+        console.log("Initializing page...");
+        host = "pcvdimper.esrf.fr";
+        port = 8888;
+        ws_id = "/taurus";
+        console.log(host);
+        taurus_websocket = new WebSocket("ws://" + host + ":" + port + ws_id);
+        taurus_websocket.onopen = function() {
+            console.log("Websocket connected");
+            return initialize_taurus();
+        };
+        taurus_websocket.onmessage = function(event) {
+            var elements, event_data;
+            var reg = new RegExp("[^a-zA-Z0-9_]", "g");
+            event_data = JSON.parse(event.data);
+
+            elements = taurus_element(event_data.model);
+            elements.each(function(index, elem) {
+                //test if the attribute exist and if the string contains only authorized characters
+                if ($(elem).attr('data-taurus-function') !== undefined && reg.test($(elem).attr('function')) === false)
+                {
+                    console.log("window." + $(elem).attr('data-taurus-function') + "()");
+                    eval("window." + $(elem).attr('data-taurus-function') + "(event_data,elem)");
+                }
+                else
+                {
+                    elements.css(event_data.css).html(event_data.html);
+                }
+            });
+            return;
+        };
+        taurus_websocket.onerror = function(event) {
+            return $('body').append('<div>Error:' + event + ' ' + '</div>');
+        };
+        taurus_websocket.onclose = function(event) {
+            var reg = new RegExp("[^a-zA-Z0-9_]", "g");
+            var elements = $('[data-taurus-model]');
+            elements.each(function(index, elem) {
+                //test if the attribute exist and if the string contains only authorized characters
+                if ($(elem).attr('data-taurus-onclose') !== undefined && reg.test($(elem).attr('function')) === false)
+                {
+                    console.log("window." + $(elem).attr('data-taurus-onclose') + "()");
+                    eval("window." + $(elem).attr('data-taurus-onclose') + "(event_data,elem)");
+                }
+                else
+                {
+                    elements.html("-");
+                }
+            });
+            console.log("Websocket DISCONNECTED");
+        };
+        return console.log("Finished initializing page");
+    };
+
+    initialize_taurus = function() {
+
+        var json_models, models;
+        console.log("Initializing taurus...");
+        models = taurus_models();
+        json_models = JSON.stringify({
+            models: models
+        });
+        taurus_websocket.send(json_models);
+        return console.log("Finished initializing taurus");
+    };
+
+    $(function() {
+        return initialize();
+    });
+
+}).call(this);
diff --git a/lib/taurus/web/taurustornado.py b/lib/taurus/web/taurustornado.py
new file mode 100644
index 0000000..5e63ad6
--- /dev/null
+++ b/lib/taurus/web/taurustornado.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+## 
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+## 
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+## 
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU Lesser General Public License for more details.
+## 
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+"""
+"""
+
+from __future__ import print_function
+
+__docformat__ = "restructuredtext"
+
+import os.path
+
+from tornado.web import Application, RequestHandler, StaticFileHandler
+from tornado.websocket import WebSocketHandler
+from tornado.escape import json_encode, json_decode
+
+from taurus import Database, Device, Attribute, Configuration, Object
+from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusconfiguration import TaurusConfiguration
+from taurus.core.taurusbasetypes import AttrQuality, TaurusEventType, DataFormat
+from taurus.core.taurusvalidator import AttributeNameValidator, ConfigurationNameValidator
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
+
+# ugly import to properly manage Tango exceptions
+import PyTango
+
+def error_str(err):
+    if isinstance(err, PyTango.DevFailed):
+        err = err[0]
+        return "[{0}] {1}".format(err.reason, err.desc)
+    return str(err)
+
+class TaurusWebAttribute(object):
+    """This object is a listener for the taurus attribute value.
+    When a attribute changes it sends an event. The event
+    triggers a call to *eventReceived*. *eventReceived* will transform
+    the change event into a JSON encoded string and sends this
+    string through the web socket to the client"""
+
+    def __init__(self, ws, name):
+        self.name = name
+        self.ws = ws
+        self.attribute.addListener(self)
+    
+    @property
+    def attribute(self):
+        return Attribute(self.name)
+    
+    def eventReceived(self, evt_src, evt_type, evt_value):
+        """Transforms the event into a JSON encoded string and sends this
+        string into the web socket
+        
+        The JSON encoded string is a JSON object which contains the members:
+            - model : a string identification of the attribute which changed
+            - html : the new attribute value
+            - css : a hint on the style that should be applied (background color
+                    according to the attribute quality)
+        
+        In case of an error the html member will contain the exception information.
+        The stylesheet will be white font with violet background."""
+        modelObj = evt_src
+        data = {}
+        if evt_type == TaurusEventType.Error:
+            data['css'] = {'color':'white', 'background-color' : 'violet'}
+            html = value = error_str(evt_value)
+        else:
+            if evt_type == TaurusEventType.Config:
+                modelObj = evt_src.getParentObj()
+                data['title'] = evt_src.description
+            valueObj = modelObj.getValueObj()
+            value = valueObj.value
+            quality = valueObj.quality
+            bg, fg = ATTRIBUTE_QUALITY_PALETTE.rgb_pair(quality)
+            bg, fg = "rgb{0}".format(bg), "rgb{0}".format(fg)
+            data['css'] = {'color': fg, 'background-color' : bg}
+            fmt = valueObj.data_format
+            if fmt == DataFormat._0D:
+                html = modelObj.displayValue(value)
+                if isinstance(value, PyTango._PyTango.DevState):
+                    value = int(value)
+            elif fmt in (DataFormat._1D, DataFormat._2D):
+                # bad, very bad performance! Don't worry for now
+                value = value.tolist() 
+                html = "[...]"
+                # html = str(value)
+        data['value'] = value
+        data['html'] = html
+        data['model'] = modelObj.getNormalName()
+        try:
+            json_data = json_encode(data)
+        except TypeError as te:
+            data['css'] = {'color':'white', 'background-color' : 'violet'}
+            data['html'] = data['value'] = str(te)
+            json_data = json_encode(data)
+        self.write_message(json_data)
+
+    def write_message(self, message):
+        return self.ws.write_message(message)
+
+    def clear(self):
+        self.attribute.removeListener(self)
+
+
+class TaurusWebConfiguration(object):
+    """This object is a listener for the taurus attribute configuration.
+    When a attribute configuration changes it sends an event. The event
+    triggers a call to *eventReceived*. *eventReceived* will transform 
+    the configuration event into a JSON encoded string and sends this
+    string through the web socket to the client"""
+    
+    def __init__(self, ws, name):
+        self.name = name
+        self.param = ConfigurationNameValidator().getParams(name)['configparam']
+        self.ws = ws
+        self.configuration = Configuration(self.name)
+        self.configuration.addListener(self)
+    
+    def eventReceived(self, evt_src, evt_type, evt_value):
+        """Transforms the event into a JSON encoded string and sends this
+        string into the web socket
+        
+        The JSON encoded string is a JSON object which contains the members:
+            - model : a string identification of the attribute configuration
+                      which as changed
+            - html : the new attribute configuration value
+            - css : a hint on the style that should be applied (none for now)
+        
+        In case of an error the html member will contain the exception information.
+        The stylesheet will be white font with violet background."""
+
+        modelObj = evt_src
+        data = {}
+        if evt_type == TaurusEventType.Error:
+            data['css'] = {'color':'white', 'background-color' : 'violet'}
+            data['html'] = error_str(evt_value)
+        else:
+            data['css'] = {}
+            data['html'] = getattr(modelObj, self.param)
+            data['title'] = modelObj.description
+            
+ #       data['css']['font-size'] = "24pt";  
+        data['model'] = self.name
+        json_data = json_encode(data)
+        self.write_message(json_data)
+
+    def write_message(self, message):
+        return self.ws.write_message(message)
+    
+    def clear(self):
+        self.configuration.removeListener(self)
+
+
+class TaurusSocket(WebSocketHandler):
+
+    def open(self):
+        self.models = set()
+        
+    def on_message(self, json_data):
+        """Executed when a message comes from the client through the websocket.
+        
+        It expected that json_data is a JSON encoded string.
+        It should be a JSON object with *models* member. the value of *models*
+        should be an array of strings, each representing a model name.
+        Example:
+            { models : [ "BO/S05/Pump5/Pressure", 
+                         "BO/S05/Pump5/Pressure?configuration=unit",
+                         "sys/tg_test/1/double_scalar" ]
+            }
+            So far, only attributes and configuration parameters are supported.
+            
+            A TaurusWebXXX object will be created for each different model.
+            This object subscribes itself to taurus events. The callback usually
+            transforms such an event into a JSON encoded string which is sent
+            back to the client through this same web socket.
+        """
+        data = json_decode(json_data)
+        if 'models' in data:
+            self.clear_models()
+            model_names = set(data['models'])
+            for model_name in model_names:
+                model_name = str(model_name)
+                if AttributeNameValidator().isValid(model_name):
+                    web_model = TaurusWebAttribute(self, model_name)
+                elif ConfigurationNameValidator().isValid(model_name):
+                    web_model = TaurusWebConfiguration(self, model_name)
+                else:
+                    continue
+                self.models.add(web_model)
+            
+    def on_close(self):
+        self.clear_models()
+
+    def clear_models(self):
+        for model in self.models:
+            model.clear()
+        self.models.clear()
+
+def get_taurus_tornado_static_path():
+    local_path = os.path.dirname(__file__)
+    static_path = os.path.join(local_path, 'static')
+    return static_path
+
+def get_default_handlers():
+    return [
+        (r"/taurus", TaurusSocket),
+        (r"/taurus/(.*)", StaticFileHandler, {"path": get_taurus_tornado_static_path() }),
+    ]
+
+def start(handlers=None, static_path=None, port=8888, **kwargs):
+    if static_path is None:
+        local_path = os.path.dirname(__file__)
+        static_path= os.path.join(local_path, 'static')
+    if handlers is None:
+        handlers = [ (r"/", MainHandler), 
+                     (r"/taurus", TaurusSocket), ]
+    
+    application = Application(handlers, static_path=static_path, **kwargs)
+    application.listen(port)
+    
+    print("Starting...")
+    try:
+        import tornado.ioloop
+        tornado.ioloop.IOLoop.instance().start()
+        print("Finished")
+    except KeyboardInterrupt:
+        print("Finished by Keyboard interrupt (Ctrl+C)")
+
+if __name__ == "__main__":
+    start()
diff --git a/lib/taurus/web/template/index.html b/lib/taurus/web/template/index.html
new file mode 100644
index 0000000..63cf184
--- /dev/null
+++ b/lib/taurus/web/template/index.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<html>
+    <head>
+    <title>Taurus template page</title>
+    <script type="text/javascript" src="js/jquery.js"></script>
+    <script type="text/javascript" src="js/grid.js"></script>
+    </head>
+    <body>
+    <div id="board"/>
+    </body>
+</html>
diff --git a/scripts/taurusdesigner b/scripts/taurusdesigner
index 1395e56..01a9493 100755
--- a/scripts/taurusdesigner
+++ b/scripts/taurusdesigner
@@ -29,78 +29,7 @@ import optparse
 
 import taurus
 from taurus.qt import Qt
+from taurus.qt.qtdesigner.taurusdesigner import main
 
-def env_index(env, env_name):
-    env_name = str(env_name)
-    for i, e in enumerate(env):
-        e = str(e)
-        if e.startswith(env_name):
-            return i
-    return -1
-
-def has_env(env, env_name):
-    return env_index(env, env_name) != -1
-
-def get_env(env, env_name):
-    env_name = str(env_name)
-    for i, e in enumerate(env):
-        e = str(e)
-        if e.startswith(env_name):
-            return e.split("=")[1]
-    return None
-
-def append_or_replace_env(env, env_name, env_value, is_path_like=True):
-    i = env_index(env, env_name)
-    if i == -1:
-        env.append(env_name + "=" + env_value)
-    else:
-        if is_path_like:
-            e_n, e_v = env[i].split("=")
-            paths = e_v.split(":")
-            if not env_value in paths:
-                env_value += ":" + e_v
-        env[i] = env_name + "=" + env_value
-
-version = "taurusdesigner %s" % (taurus.Release.version)
-usage = "Usage: %prog [options] <ui file(s)>"
-description = "The Qt designer application customized for taurus"
-parser = optparse.OptionParser(version=version, usage=usage, description=description)
-parser.add_option("--taurus-path", dest="tauruspath", default="",
-                  help="additional directories to look for taurus widgets")
-parser.add_option("--qt-designer-path", dest="pyqtdesignerpath", default="",
-                  help="additional directories to look for python qt widgets")
-
-options, args = parser.parse_args()
-
-# Tell Qt Designer where it can find the directory containing the plugins
-env = Qt.QProcess.systemEnvironment()
-
-# Set PYQTDESIGNERPATH to look inside taurus for designer plugins
-taurus_path = os.path.dirname(os.path.abspath(taurus.__file__))
-taurus_qt_designer_path = os.path.join(taurus_path, 'qt', 'qtdesigner')
-
-append_or_replace_env(env, "PYQTDESIGNERPATH", taurus_qt_designer_path)
-
-# Set TAURUSQTDESIGNERPATH
-if len(options.tauruspath) > 0:
-    append_or_replace_env(env, "TAURUSQTDESIGNERPATH", options.tauruspath)
-    append_or_replace_env(env, "PYTHONPATH", options.tauruspath)
-
-#print "PYTHONPATH=%s" % get_env(env, "PYTHONPATH")
-#print "PYQTDESIGNERPATH=%s" % get_env(env, "PYQTDESIGNERPATH")
-
-# Start Designer.
-designer_bin = str(Qt.QLibraryInfo.location(Qt.QLibraryInfo.BinariesPath))
-
-if sys.platform == "darwin":
-    designer_bin += "/Designer.app/Contents/MacOS/Designer"
-else:
-    designer_bin += "/designer"
-
-designer = Qt.QProcess()
-designer.setProcessChannelMode(Qt.QProcess.ForwardedChannels)
-designer.setEnvironment(env)
-designer.start(designer_bin, args)
-designer.waitForFinished(-1)
-
-sys.exit(designer.exitCode())
+if __name__ == "__main__":
+    main()
diff --git a/setup.py b/setup.py
index ce99fea..18eb88f 100644
--- a/setup.py
+++ b/setup.py
@@ -59,6 +59,7 @@ def get_release_info():
 Release = get_release_info()
 
 author = Release.authors['Tiago']
+maintainer = Release.authors['Pascual-Izarra']
 
 package_dir = { 'taurus' : abspath('lib', 'taurus') }
 
@@ -173,6 +174,12 @@ requires = [
 ]
 
 package_data = { 
+    'taurus.core.epics'        : ['__taurus_plugin__'],
+    'taurus.core.evaluation'   : ['__taurus_plugin__'],
+    'taurus.core.resource'     : ['__taurus_plugin__'],
+    'taurus.core.simulation'   : ['__taurus_plugin__'],
+    'taurus.core.tango'        : ['__taurus_plugin__'],
+
     'taurus.qt.qtgui.resource' : ['*.rcc'],
     'taurus.qt.qtgui.util'     : ['tauruswidget_template', 
                                   'tauruswidget_qtdesignerplugin_template'],
@@ -239,6 +246,15 @@ class build_resources(Command):
             self.out = sys.stdout
         else:
             self.out = StringIO.StringIO()
+        if os.name == 'nt':
+            try:
+                self.QTDIR = os.environ["QTDIR"]
+                self.rcc_exec = self.rcc_exec = os.path.join(self.QTDIR, 'bin', 'rcc')
+            except KeyError:
+                raise Exception("You must set the env. variable QTDIR " \
+                    "pointing to the Qt C++ installation directory")
+        else:
+            self.rcc_exec = 'rcc'
 
     def finalize_options (self):
         if self.logo is None:
@@ -290,7 +306,7 @@ class build_resources(Command):
         # Generate binary rcc file
         print("Generating %s... " % rcc_filename, file=out, end='')
         out.flush()
-        cmd = 'rcc -binary %s -o %s' % (qrc_filename, rcc_filename)
+        cmd = '%s -binary %s -o %s' % (self.rcc_exec, qrc_filename, rcc_filename)
         if os.system(cmd):
             print("[FAILED]", file=out)
         else:
@@ -354,7 +370,7 @@ class build_resources(Command):
             # Generate binary rcc file
             print("Generating %s... " % rcc_filename, file=out, end='')
             out.flush()
-            cmd = 'rcc -binary %s -o %s' % (qrc_filename, rcc_filename)
+            cmd = '%s -binary %s -o %s' % (self.rcc_exec, qrc_filename, rcc_filename)
             if os.system(cmd):
                 print("[FAILED]", file=out)
             else:
@@ -798,26 +814,33 @@ def svg_to_png(arg, dirname, fnames):
                     ok = pix.save(full_target_fname)
                 print(ok and "[OK]" or "[FAIL]", full_source_fname,'->',full_target_fname)
                 
-                
-
-setup(name             = 'taurus',
-      version          = Release.version,
-      description      = Release.description,
-      long_description = Release.long_description,
-      author           = author[0],
-      author_email     = author[1],
-      url              = Release.url,
-      download_url     = Release.download_url,
-      platforms        = Release.platforms,
-      license          = Release.license,
-      packages         = packages,
-      package_dir      = package_dir,
-      classifiers      = classifiers,
-      package_data     = package_data,
-      data_files       = data_files,
-      scripts          = scripts,
-      provides         = provides,
-      keywords         = Release.keywords,
-      requires         = requires,
-      cmdclass         = cmdclass)
-
+def main():
+    setup(name             = 'taurus',
+          version          = Release.version,
+          description      = Release.description,
+          long_description = Release.long_description,
+          author           = author[0],
+          author_email     = author[1],
+          maintainer       = maintainer[0],
+          maintainer_email = maintainer[1],
+          url              = Release.url,
+          download_url     = Release.download_url,
+          platforms        = Release.platforms,
+          license          = Release.license,
+          packages         = packages,
+          package_dir      = package_dir,
+          classifiers      = classifiers,
+          package_data     = package_data,
+          data_files       = data_files,
+          scripts          = scripts,
+          provides         = provides,
+          keywords         = Release.keywords,
+          requires         = requires,
+          cmdclass         = cmdclass)
+
+if __name__ == "__main__":
+    try:
+        main()
+        print("Setup finished")
+    except Exception as e:
+        print("A error occured: %s\n\nSetup aborted" % str(e))
diff --git a/taurus.bmp b/taurus.bmp
new file mode 100644
index 0000000..bc46819
Binary files /dev/null and b/taurus.bmp differ
diff --git a/taurus.png b/taurus.png
new file mode 100644
index 0000000..03e8d22
Binary files /dev/null and b/taurus.png differ
diff --git a/taurus.svg b/taurus.svg
new file mode 100644
index 0000000..23c140e
--- /dev/null
+++ b/taurus.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:odm="http://product.corel.com/CGS/11/cddns/"
+   xml:space="preserve"
+   width="180pt"
+   height="188pt"
+   style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd"
+   viewBox="0 0 8268 11692"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   id="svg614"
+   sodipodi:version="0.34"
+   sodipodi:docname="D:\Dokumenty\Wikipedie\images\svg\Astro\taurus.svg"><sodipodi:namedview
+   id="base" /><defs
+   id="defs615"><style
+   type="text/css"
+   id="style616"><![CDATA[
+    .fil0 {fill:#000000}
+   ]]></style></defs><g
+   id="Layer 1"
+   transform="matrix(4.552447,0,0,4.540583,-8401.163,-13199.48)"><path
+   class="fil0"
+   d="M2373 3861c-89,-35 -160,-80 -216,-134 -55,-54 -116,-141 -183,-262l-80 -144c-98,-176 -210,-264 -334,-264l-36 0 0 -150 99 0c176,0 336,124 479,371l109 192c74,126 150,214 230,264 80,51 184,76 313,76 129,0 233,-25 313,-76 80,-50 156,-138 229,-264l111 -192c142,-247 302,-371 477,-371l99 0 0 150 -35 0c-125,0 -237,88 -335,264l-80 144c-67,121 -128,208 -183,262 -56,54 -128,99 -216,134 154,85 272,195 356,328 84,133 125,280 125,438 0,230 -85,430 -256,600 -172,170 -373,255 -605,255 -232,0 -433,-85 -605,-255 -172,-170 -258,-370 -258,-600 0,-158 42,-305 126,-438 84,-133 202,-243 356,-328zm381 1420c182,0 337,-63 467,-191 129,-126 194,-279 194,-458 0,-182 -65,-337 -193,-464 -128,-128 -284,-191 -468,-191 -183,0 -339,63 -469,191 -128,127 -193,282 -193,464 0,179 65,332 194,458 129,128 285,191 468,191z"
+   id="path618" /></g></svg>
diff --git a/tests/moduleexplorer.py b/tests/moduleexplorer.py
new file mode 100644
index 0000000..fb341d5
--- /dev/null
+++ b/tests/moduleexplorer.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+## 
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+## 
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+## 
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU Lesser General Public License for more details.
+## 
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
+##
+###########################################################################
+
+''' Returns info about a module'''
+
+import sys, os, inspect, glob, re
+
+class ModuleExplorer(object):
+    
+    def __init__(self, exclude_patterns=(), verbose=True):
+        '''
+        :param exclude_patterns: (seq<str>) sequence of strings containing regexp
+                                 patterns. Each candidate to be explored will be 
+                                 matched against these patterns and will be excluded
+                                 if it matches any of them.
+        :param verbose: (bool) If True (default) status messages will be printed to stdout
+        '''
+        self.exclude_patterns = [re.compile(p) for p in exclude_patterns]
+        self.verbose = verbose
+    
+    def _matchesAnyPattern(self, name, paterns):
+        for p in paterns:
+            if re.match(p,name) is not None:
+                if self.verbose: print 'excluding "%s"'%name
+                return True
+        return False
+    
+    def _getlocalmembernames(self, module, predicate=None):
+        ret =[]
+        modulepath, tail = os.path.split(inspect.getabsfile(module))
+        for n,v in inspect.getmembers(module, predicate):
+            if inspect.isbuiltin(v): 
+                continue #ignore builtin functions
+            try: 
+                memberpath, tail = os.path.split(inspect.getabsfile(v))
+            except TypeError: 
+                continue #ignore builtin modules
+            if memberpath == modulepath: 
+                ret.append(n)
+        return ret
+    
+    def _getSubmodulesFromPath(self, modulepath):
+        g = glob.glob(os.path.join(modulepath,'*','__init__.py'))
+        ret = [re.findall(r".+\/(.*)\/__init__.py", s)[0] for s in g]
+        return ret
+    
+    def _isclass_with_init(self, obj):
+        return inspect.isclass(obj) and hasattr(obj,'__init__')
+    
+    def _isenumeration(self, obj):
+#        return isinstance(obj, taurus.core.util)
+        return False #@todo
+            
+    def exploreModule(self, modulename):
+        '''Recursive function that gathers info on a module and all its submodules.
+        
+        :param modulename: the name of the module to explore
+        
+        :return: (dict<str,object>) a dictionary containing submodulenames, 
+                 localclassnames, localfunctionnames, localenumerationnames,
+                 externalmembernames, submodules, warnings
+        '''
+        if self.verbose: print "Exploring %s..."%modulename  
+        warnings = []
+        try:
+          module = __import__(modulename, fromlist = [''])
+        except Exception,e:
+          msg = 'exploreModule: WARNING: Cannot import %s. Reason: %s'%(modulename,repr(e))
+          warnings.append(msg)
+          if self.verbose: print msg
+          return dict(modulename = modulename,
+                    basemodulename = modulename.split('.')[-1],
+                    modulepath = None,
+                    submodulenames = [], 
+                    localclassnames = [], 
+                    localfunctionnames = [],
+                    localenumerationnames = [],
+                    externalmembernames = [],
+                    submodules = {},
+                    warnings = warnings)
+        modulepath, tail = os.path.split(inspect.getabsfile(module))
+        
+        submodulenames = sorted(self._getSubmodulesFromPath(modulepath))
+        localclassnames =  sorted(self._getlocalmembernames(module, self._isclass_with_init)) 
+        localfunctionnames = sorted(self._getlocalmembernames(module, inspect.isfunction))
+        localenumerationnames = sorted([])#@todo
+        externalmembernames = sorted([]) #@todo
+#        localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
+#        externalmembers = [n for n,v in inspect.getmembers(object) if (n not in localmembers and not n.startswith('_'))]
+        
+        #filter out excluded members
+        submodulenames = [n for n in submodulenames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+        localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+        localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+        localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+        externalmembernames = [n for n in externalmembernames if not self._matchesAnyPattern(os.path.join(modulename,n), self.exclude_patterns)]
+        
+        #recurse
+        submodules = {}
+        for n in submodulenames:
+            sm_name = '.'.join((modulename, n))
+            submodules[n] = self.exploreModule(sm_name)
+        
+        return dict(modulename = modulename,
+                    basemodulename = modulename.split('.')[-1],
+                    modulepath = modulepath,
+                    submodulenames = submodulenames, 
+                    localclassnames = localclassnames, 
+                    localfunctionnames = localfunctionnames,
+                    localenumerationnames = localenumerationnames,
+                    externalmembernames = externalmembernames,
+                    submodules = submodules,
+                    warnings = warnings)
+        
+    @staticmethod
+    def getAll(info, key):
+        '''
+        append all values for a given key in a nested "moduleinfo" dictionary
+        
+        :param info: (dict) a moduleinfo dictionary like the one returned by :meth:`exploreModule`
+        :param key: (str) a key of a moduleinfo dictionary
+        
+        :return: (list<tuple>) a list that concatenates tuples where the first element is  the (sub)module name
+                 and the second element is the value for the given key. 
+                 If for a certain submodule, the value is empty, it is not included in the list at all.
+        '''
+        mname = info['modulename']
+        try:
+            ret = [(mname,el) for el in info[key]]
+        except KeyError:
+            return []
+        for sminfo in info['submodules'].itervalues():
+            ret += ModuleExplorer.getAll(sminfo,key)
+        return ret
+        
+    @staticmethod
+    def explore(modulename, exclude_patterns=(), verbose=True):
+        '''convenience to explore a module
+        
+        :param modulename: the name of the module to explore
+        :param exclude_patterns: (seq<str>) sequence of strings containing regexp
+                                 patterns. Each candidate to be explored will be 
+                                 matched against these patterns and will be excluded
+                                 if it matches any of them.
+        :param verbose: (bool) If True (default) status messages will be printed to stdout
+        
+        :return: (dict<str,object>, allwarnings) a tuple whose first member is a dictionary
+                 containing submodulenames, localclassnames, localfunctionnames, localenumerationnames,
+                 externalmembernames, submodules, warnings. The second member of the tuple is a list
+                 containing all the warnings accummulated.
+        '''
+        explorer = ModuleExplorer(exclude_patterns=exclude_patterns, verbose=verbose)
+        minfo = explorer.exploreModule(modulename)
+        return minfo, ModuleExplorer.getAll(minfo, 'warnings')
+
+
+        
+def main(modulename='taurus', exclude_patterns = ('.*/ui',)):
+    moduleinfo, allw = ModuleExplorer.explore(modulename, exclude_patterns=exclude_patterns, verbose=True)
+    print '\n\n'+'*'*50
+    print "Exploration finished with %i warnings:"%(len(allw))
+    for m,w in allw: print w
+    print '*'*50+'\n'
+    print 
+    assert len(allw) == 0
+ 
+    
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/lib/taurus/core/util/report/report.py b/tests/taurustest.py
similarity index 64%
copy from lib/taurus/core/util/report/report.py
copy to tests/taurustest.py
index ca11e0e..cc0b8fe 100644
--- a/lib/taurus/core/util/report/report.py
+++ b/tests/taurustest.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python
-
 #############################################################################
 ##
 ## This file is part of Taurus, a Tango User Interface Library
@@ -23,20 +22,25 @@
 ##
 #############################################################################
 
-"""This module provides a panel to display taurus messages"""
-
-__all__ = ["TaurusMessageReportHandler"]
 
-__docformat__ = 'restructuredtext'
+"""Unit tests for Taurus"""
 
+import unittest
 
-class TaurusMessageReportHandler(object):
-    
-    Label = "Default report handler"
+class TaurusImportTestCase(unittest.TestCase):
+    def setUp(self):
+        from moduleexplorer import ModuleExplorer
+        self.explore = ModuleExplorer.explore
     
-    def __init__(self, parent):
-        self.parent = parent
-    
-    def report(self, message):
-        pass
-
+    def testImportSubmodules(self):
+        """All submodules should import without problems"""
+        moduleinfo, wrn = self.explore('taurus', verbose=False)
+        msg = None
+        if wrn:
+            msg = '\n%s'%'\n'.join(zip(*wrn)[1]) 
+        self.assertEqual(len(wrn),0, msg=msg)
+        
+        
+       
+if __name__ == "__main__":
+    unittest.main()

-- 
framework for TANGO control system client applications



More information about the debian-science-commits mailing list